@cleanslate/sdk 0.1.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 (581) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE +48 -0
  3. package/README.md +103 -0
  4. package/VENDOR.md +60 -0
  5. package/dist/agent/cleanSlateAgentExecutionPhase.d.ts +55 -0
  6. package/dist/agent/cleanSlateAgentExecutionPhase.d.ts.map +1 -0
  7. package/dist/agent/cleanSlateAgentExecutionPhase.js +474 -0
  8. package/dist/agent/cleanSlateAgentExecutionPhase.js.map +1 -0
  9. package/dist/agent/cleanSlateAgentExecutionSupport.d.ts +22 -0
  10. package/dist/agent/cleanSlateAgentExecutionSupport.d.ts.map +1 -0
  11. package/dist/agent/cleanSlateAgentExecutionSupport.js +205 -0
  12. package/dist/agent/cleanSlateAgentExecutionSupport.js.map +1 -0
  13. package/dist/agent/cleanSlateAgentParsing.d.ts +21 -0
  14. package/dist/agent/cleanSlateAgentParsing.d.ts.map +1 -0
  15. package/dist/agent/cleanSlateAgentParsing.js +106 -0
  16. package/dist/agent/cleanSlateAgentParsing.js.map +1 -0
  17. package/dist/agent/cleanSlateAgentSession.d.ts +44 -0
  18. package/dist/agent/cleanSlateAgentSession.d.ts.map +1 -0
  19. package/dist/agent/cleanSlateAgentSession.js +205 -0
  20. package/dist/agent/cleanSlateAgentSession.js.map +1 -0
  21. package/dist/agent/cleanSlateAgentTypes.d.ts +91 -0
  22. package/dist/agent/cleanSlateAgentTypes.d.ts.map +1 -0
  23. package/dist/agent/cleanSlateAgentTypes.js +27 -0
  24. package/dist/agent/cleanSlateAgentTypes.js.map +1 -0
  25. package/dist/agent/cleanSlateCommandPolicy.d.ts +12 -0
  26. package/dist/agent/cleanSlateCommandPolicy.d.ts.map +1 -0
  27. package/dist/agent/cleanSlateCommandPolicy.js +30 -0
  28. package/dist/agent/cleanSlateCommandPolicy.js.map +1 -0
  29. package/dist/agent/cleanSlateContextBudgetManager.d.ts +82 -0
  30. package/dist/agent/cleanSlateContextBudgetManager.d.ts.map +1 -0
  31. package/dist/agent/cleanSlateContextBudgetManager.js +419 -0
  32. package/dist/agent/cleanSlateContextBudgetManager.js.map +1 -0
  33. package/dist/agent/cleanSlateDomainProfile.d.ts +71 -0
  34. package/dist/agent/cleanSlateDomainProfile.d.ts.map +1 -0
  35. package/dist/agent/cleanSlateDomainProfile.js +124 -0
  36. package/dist/agent/cleanSlateDomainProfile.js.map +1 -0
  37. package/dist/agent/cleanSlateExecutionBudget.d.ts +19 -0
  38. package/dist/agent/cleanSlateExecutionBudget.d.ts.map +1 -0
  39. package/dist/agent/cleanSlateExecutionBudget.js +28 -0
  40. package/dist/agent/cleanSlateExecutionBudget.js.map +1 -0
  41. package/dist/agent/cleanSlateExecutionEditPolicy.d.ts +15 -0
  42. package/dist/agent/cleanSlateExecutionEditPolicy.d.ts.map +1 -0
  43. package/dist/agent/cleanSlateExecutionEditPolicy.js +148 -0
  44. package/dist/agent/cleanSlateExecutionEditPolicy.js.map +1 -0
  45. package/dist/agent/cleanSlateExecutionEvidenceLedger.d.ts +23 -0
  46. package/dist/agent/cleanSlateExecutionEvidenceLedger.d.ts.map +1 -0
  47. package/dist/agent/cleanSlateExecutionEvidenceLedger.js +121 -0
  48. package/dist/agent/cleanSlateExecutionEvidenceLedger.js.map +1 -0
  49. package/dist/agent/cleanSlateExecutionLoopPrompts.d.ts +5 -0
  50. package/dist/agent/cleanSlateExecutionLoopPrompts.d.ts.map +1 -0
  51. package/dist/agent/cleanSlateExecutionLoopPrompts.js +41 -0
  52. package/dist/agent/cleanSlateExecutionLoopPrompts.js.map +1 -0
  53. package/dist/agent/cleanSlateExecutionQuery.d.ts +162 -0
  54. package/dist/agent/cleanSlateExecutionQuery.d.ts.map +1 -0
  55. package/dist/agent/cleanSlateExecutionQuery.js +1448 -0
  56. package/dist/agent/cleanSlateExecutionQuery.js.map +1 -0
  57. package/dist/agent/cleanSlateFilesModifiedService.d.ts +96 -0
  58. package/dist/agent/cleanSlateFilesModifiedService.d.ts.map +1 -0
  59. package/dist/agent/cleanSlateFilesModifiedService.js +581 -0
  60. package/dist/agent/cleanSlateFilesModifiedService.js.map +1 -0
  61. package/dist/agent/cleanSlateNativeToolTranscript.d.ts +22 -0
  62. package/dist/agent/cleanSlateNativeToolTranscript.d.ts.map +1 -0
  63. package/dist/agent/cleanSlateNativeToolTranscript.js +77 -0
  64. package/dist/agent/cleanSlateNativeToolTranscript.js.map +1 -0
  65. package/dist/agent/cleanSlatePrompts.d.ts +30 -0
  66. package/dist/agent/cleanSlatePrompts.d.ts.map +1 -0
  67. package/dist/agent/cleanSlatePrompts.js +65 -0
  68. package/dist/agent/cleanSlatePrompts.js.map +1 -0
  69. package/dist/agent/cleanSlateQueryRunner.d.ts +56 -0
  70. package/dist/agent/cleanSlateQueryRunner.d.ts.map +1 -0
  71. package/dist/agent/cleanSlateQueryRunner.js +69 -0
  72. package/dist/agent/cleanSlateQueryRunner.js.map +1 -0
  73. package/dist/agent/cleanSlateRuntimePromptBuilder.d.ts +30 -0
  74. package/dist/agent/cleanSlateRuntimePromptBuilder.d.ts.map +1 -0
  75. package/dist/agent/cleanSlateRuntimePromptBuilder.js +99 -0
  76. package/dist/agent/cleanSlateRuntimePromptBuilder.js.map +1 -0
  77. package/dist/agent/cleanSlateStreamingToolExecutor.d.ts +55 -0
  78. package/dist/agent/cleanSlateStreamingToolExecutor.d.ts.map +1 -0
  79. package/dist/agent/cleanSlateStreamingToolExecutor.js +214 -0
  80. package/dist/agent/cleanSlateStreamingToolExecutor.js.map +1 -0
  81. package/dist/agent/cleanSlateToolCallLedger.d.ts +32 -0
  82. package/dist/agent/cleanSlateToolCallLedger.d.ts.map +1 -0
  83. package/dist/agent/cleanSlateToolCallLedger.js +164 -0
  84. package/dist/agent/cleanSlateToolCallLedger.js.map +1 -0
  85. package/dist/agent/cleanSlateToolResultPromptSerializer.d.ts +9 -0
  86. package/dist/agent/cleanSlateToolResultPromptSerializer.d.ts.map +1 -0
  87. package/dist/agent/cleanSlateToolResultPromptSerializer.js +184 -0
  88. package/dist/agent/cleanSlateToolResultPromptSerializer.js.map +1 -0
  89. package/dist/composer/commands/slashCommands.d.ts +8 -0
  90. package/dist/composer/commands/slashCommands.d.ts.map +1 -0
  91. package/dist/composer/commands/slashCommands.js +46 -0
  92. package/dist/composer/commands/slashCommands.js.map +1 -0
  93. package/dist/composer/instructions/baseInstructions.d.ts +3 -0
  94. package/dist/composer/instructions/baseInstructions.d.ts.map +1 -0
  95. package/dist/composer/instructions/baseInstructions.js +35 -0
  96. package/dist/composer/instructions/baseInstructions.js.map +1 -0
  97. package/dist/composer/instructions/runtimeInstructions.d.ts +11 -0
  98. package/dist/composer/instructions/runtimeInstructions.d.ts.map +1 -0
  99. package/dist/composer/instructions/runtimeInstructions.js +31 -0
  100. package/dist/composer/instructions/runtimeInstructions.js.map +1 -0
  101. package/dist/composer/kernel/coreKernel.d.ts +3 -0
  102. package/dist/composer/kernel/coreKernel.d.ts.map +1 -0
  103. package/dist/composer/kernel/coreKernel.js +11 -0
  104. package/dist/composer/kernel/coreKernel.js.map +1 -0
  105. package/dist/composer/kernel/editingRules.d.ts +3 -0
  106. package/dist/composer/kernel/editingRules.d.ts.map +1 -0
  107. package/dist/composer/kernel/editingRules.js +24 -0
  108. package/dist/composer/kernel/editingRules.js.map +1 -0
  109. package/dist/composer/kernel/toolProtocols.d.ts +2 -0
  110. package/dist/composer/kernel/toolProtocols.d.ts.map +1 -0
  111. package/dist/composer/kernel/toolProtocols.js +32 -0
  112. package/dist/composer/kernel/toolProtocols.js.map +1 -0
  113. package/dist/composer/modes/execution.mode.d.ts +2 -0
  114. package/dist/composer/modes/execution.mode.d.ts.map +1 -0
  115. package/dist/composer/modes/execution.mode.js +21 -0
  116. package/dist/composer/modes/execution.mode.js.map +1 -0
  117. package/dist/composer/modes/planning.mode.d.ts +2 -0
  118. package/dist/composer/modes/planning.mode.d.ts.map +1 -0
  119. package/dist/composer/modes/planning.mode.js +23 -0
  120. package/dist/composer/modes/planning.mode.js.map +1 -0
  121. package/dist/composer/promptComposer.d.ts +22 -0
  122. package/dist/composer/promptComposer.d.ts.map +1 -0
  123. package/dist/composer/promptComposer.js +62 -0
  124. package/dist/composer/promptComposer.js.map +1 -0
  125. package/dist/composer/registry/agentSchema.d.ts +16 -0
  126. package/dist/composer/registry/agentSchema.d.ts.map +1 -0
  127. package/dist/composer/registry/agentSchema.js +6 -0
  128. package/dist/composer/registry/agentSchema.js.map +1 -0
  129. package/dist/core/arrays.d.ts +311 -0
  130. package/dist/core/arrays.d.ts.map +1 -0
  131. package/dist/core/arrays.js +811 -0
  132. package/dist/core/arrays.js.map +1 -0
  133. package/dist/core/arraysFind.d.ts +72 -0
  134. package/dist/core/arraysFind.d.ts.map +1 -0
  135. package/dist/core/arraysFind.js +200 -0
  136. package/dist/core/arraysFind.js.map +1 -0
  137. package/dist/core/assert.d.ts +36 -0
  138. package/dist/core/assert.d.ts.map +1 -0
  139. package/dist/core/assert.js +84 -0
  140. package/dist/core/assert.js.map +1 -0
  141. package/dist/core/async.d.ts +11 -0
  142. package/dist/core/async.d.ts.map +1 -0
  143. package/dist/core/async.js +6 -0
  144. package/dist/core/async.js.map +1 -0
  145. package/dist/core/buffer.d.ts +23 -0
  146. package/dist/core/buffer.d.ts.map +1 -0
  147. package/dist/core/buffer.js +40 -0
  148. package/dist/core/buffer.js.map +1 -0
  149. package/dist/core/cancellation.d.ts +52 -0
  150. package/dist/core/cancellation.d.ts.map +1 -0
  151. package/dist/core/cancellation.js +169 -0
  152. package/dist/core/cancellation.js.map +1 -0
  153. package/dist/core/charCode.d.ts +428 -0
  154. package/dist/core/charCode.d.ts.map +1 -0
  155. package/dist/core/charCode.js +439 -0
  156. package/dist/core/charCode.js.map +1 -0
  157. package/dist/core/collections.d.ts +49 -0
  158. package/dist/core/collections.d.ts.map +1 -0
  159. package/dist/core/collections.js +132 -0
  160. package/dist/core/collections.js.map +1 -0
  161. package/dist/core/diff/diff.d.ts +151 -0
  162. package/dist/core/diff/diff.d.ts.map +1 -0
  163. package/dist/core/diff/diff.js +1076 -0
  164. package/dist/core/diff/diff.js.map +1 -0
  165. package/dist/core/diff/diffChange.d.ts +39 -0
  166. package/dist/core/diff/diffChange.d.ts.map +1 -0
  167. package/dist/core/diff/diffChange.js +37 -0
  168. package/dist/core/diff/diffChange.js.map +1 -0
  169. package/dist/core/errors.d.ts +114 -0
  170. package/dist/core/errors.d.ts.map +1 -0
  171. package/dist/core/errors.js +258 -0
  172. package/dist/core/errors.js.map +1 -0
  173. package/dist/core/event.d.ts +595 -0
  174. package/dist/core/event.d.ts.map +1 -0
  175. package/dist/core/event.js +1479 -0
  176. package/dist/core/event.js.map +1 -0
  177. package/dist/core/functional.d.ts +5 -0
  178. package/dist/core/functional.d.ts.map +1 -0
  179. package/dist/core/functional.js +35 -0
  180. package/dist/core/functional.js.map +1 -0
  181. package/dist/core/hash.d.ts +15 -0
  182. package/dist/core/hash.d.ts.map +1 -0
  183. package/dist/core/hash.js +27 -0
  184. package/dist/core/hash.js.map +1 -0
  185. package/dist/core/iterator.d.ts +33 -0
  186. package/dist/core/iterator.d.ts.map +1 -0
  187. package/dist/core/iterator.js +188 -0
  188. package/dist/core/iterator.js.map +1 -0
  189. package/dist/core/lifecycle.d.ts +313 -0
  190. package/dist/core/lifecycle.d.ts.map +1 -0
  191. package/dist/core/lifecycle.js +789 -0
  192. package/dist/core/lifecycle.js.map +1 -0
  193. package/dist/core/linkedList.d.ts +17 -0
  194. package/dist/core/linkedList.d.ts.map +1 -0
  195. package/dist/core/linkedList.js +138 -0
  196. package/dist/core/linkedList.js.map +1 -0
  197. package/dist/core/map.d.ts +175 -0
  198. package/dist/core/map.d.ts.map +1 -0
  199. package/dist/core/map.js +796 -0
  200. package/dist/core/map.js.map +1 -0
  201. package/dist/core/marshallingIds.d.ts +29 -0
  202. package/dist/core/marshallingIds.d.ts.map +1 -0
  203. package/dist/core/marshallingIds.js +38 -0
  204. package/dist/core/marshallingIds.js.map +1 -0
  205. package/dist/core/observable.d.ts +28 -0
  206. package/dist/core/observable.d.ts.map +1 -0
  207. package/dist/core/observable.js +6 -0
  208. package/dist/core/observable.js.map +1 -0
  209. package/dist/core/platform.d.ts +4 -0
  210. package/dist/core/platform.d.ts.map +1 -0
  211. package/dist/core/platform.js +17 -0
  212. package/dist/core/platform.js.map +1 -0
  213. package/dist/core/position.d.ts +91 -0
  214. package/dist/core/position.d.ts.map +1 -0
  215. package/dist/core/position.js +145 -0
  216. package/dist/core/position.js.map +1 -0
  217. package/dist/core/range.d.ts +198 -0
  218. package/dist/core/range.d.ts.map +1 -0
  219. package/dist/core/range.js +426 -0
  220. package/dist/core/range.js.map +1 -0
  221. package/dist/core/resources.d.ts +10 -0
  222. package/dist/core/resources.d.ts.map +1 -0
  223. package/dist/core/resources.js +126 -0
  224. package/dist/core/resources.js.map +1 -0
  225. package/dist/core/sequence.d.ts +20 -0
  226. package/dist/core/sequence.d.ts.map +1 -0
  227. package/dist/core/sequence.js +21 -0
  228. package/dist/core/sequence.js.map +1 -0
  229. package/dist/core/stopwatch.d.ts +11 -0
  230. package/dist/core/stopwatch.d.ts.map +1 -0
  231. package/dist/core/stopwatch.js +33 -0
  232. package/dist/core/stopwatch.js.map +1 -0
  233. package/dist/core/symbols.d.ts +5 -0
  234. package/dist/core/symbols.d.ts.map +1 -0
  235. package/dist/core/symbols.js +13 -0
  236. package/dist/core/symbols.js.map +1 -0
  237. package/dist/core/types.d.ts +229 -0
  238. package/dist/core/types.d.ts.map +1 -0
  239. package/dist/core/types.js +278 -0
  240. package/dist/core/types.js.map +1 -0
  241. package/dist/core/uint.d.ts +32 -0
  242. package/dist/core/uint.d.ts.map +1 -0
  243. package/dist/core/uint.js +57 -0
  244. package/dist/core/uint.js.map +1 -0
  245. package/dist/core/uri.d.ts +172 -0
  246. package/dist/core/uri.d.ts.map +1 -0
  247. package/dist/core/uri.js +623 -0
  248. package/dist/core/uri.js.map +1 -0
  249. package/dist/host/browserAutomation.d.ts +276 -0
  250. package/dist/host/browserAutomation.d.ts.map +1 -0
  251. package/dist/host/browserAutomation.js +6 -0
  252. package/dist/host/browserAutomation.js.map +1 -0
  253. package/dist/host/diagnostics.d.ts +68 -0
  254. package/dist/host/diagnostics.d.ts.map +1 -0
  255. package/dist/host/diagnostics.js +41 -0
  256. package/dist/host/diagnostics.js.map +1 -0
  257. package/dist/host/files.d.ts +70 -0
  258. package/dist/host/files.d.ts.map +1 -0
  259. package/dist/host/files.js +54 -0
  260. package/dist/host/files.js.map +1 -0
  261. package/dist/host/services.d.ts +106 -0
  262. package/dist/host/services.d.ts.map +1 -0
  263. package/dist/host/services.js +6 -0
  264. package/dist/host/services.js.map +1 -0
  265. package/dist/host/symbols.d.ts +45 -0
  266. package/dist/host/symbols.d.ts.map +1 -0
  267. package/dist/host/symbols.js +43 -0
  268. package/dist/host/symbols.js.map +1 -0
  269. package/dist/host/textModel.d.ts +83 -0
  270. package/dist/host/textModel.d.ts.map +1 -0
  271. package/dist/host/textModel.js +6 -0
  272. package/dist/host/textModel.js.map +1 -0
  273. package/dist/host/workspace.d.ts +123 -0
  274. package/dist/host/workspace.d.ts.map +1 -0
  275. package/dist/host/workspace.js +32 -0
  276. package/dist/host/workspace.js.map +1 -0
  277. package/dist/index.d.ts +40 -0
  278. package/dist/index.d.ts.map +1 -0
  279. package/dist/index.js +26 -0
  280. package/dist/index.js.map +1 -0
  281. package/dist/node/cleanSlateAnthropicMessageAdapter.d.ts +12 -0
  282. package/dist/node/cleanSlateAnthropicMessageAdapter.d.ts.map +1 -0
  283. package/dist/node/cleanSlateAnthropicMessageAdapter.js +130 -0
  284. package/dist/node/cleanSlateAnthropicMessageAdapter.js.map +1 -0
  285. package/dist/node/cleanSlateHeadlessRunner.d.ts +63 -0
  286. package/dist/node/cleanSlateHeadlessRunner.d.ts.map +1 -0
  287. package/dist/node/cleanSlateHeadlessRunner.js +84 -0
  288. package/dist/node/cleanSlateHeadlessRunner.js.map +1 -0
  289. package/dist/node/cleanSlateNodeAgentRuntime.d.ts +94 -0
  290. package/dist/node/cleanSlateNodeAgentRuntime.d.ts.map +1 -0
  291. package/dist/node/cleanSlateNodeAgentRuntime.js +339 -0
  292. package/dist/node/cleanSlateNodeAgentRuntime.js.map +1 -0
  293. package/dist/node/cleanSlateNodeBrowserAutomation.d.ts +279 -0
  294. package/dist/node/cleanSlateNodeBrowserAutomation.d.ts.map +1 -0
  295. package/dist/node/cleanSlateNodeBrowserAutomation.js +470 -0
  296. package/dist/node/cleanSlateNodeBrowserAutomation.js.map +1 -0
  297. package/dist/node/cleanSlateNodeCommandService.d.ts +40 -0
  298. package/dist/node/cleanSlateNodeCommandService.d.ts.map +1 -0
  299. package/dist/node/cleanSlateNodeCommandService.js +435 -0
  300. package/dist/node/cleanSlateNodeCommandService.js.map +1 -0
  301. package/dist/node/cleanSlateNodeFileServices.d.ts +68 -0
  302. package/dist/node/cleanSlateNodeFileServices.d.ts.map +1 -0
  303. package/dist/node/cleanSlateNodeFileServices.js +138 -0
  304. package/dist/node/cleanSlateNodeFileServices.js.map +1 -0
  305. package/dist/node/cleanSlateNodeIndexService.d.ts +17 -0
  306. package/dist/node/cleanSlateNodeIndexService.d.ts.map +1 -0
  307. package/dist/node/cleanSlateNodeIndexService.js +128 -0
  308. package/dist/node/cleanSlateNodeIndexService.js.map +1 -0
  309. package/dist/node/cleanSlateNodeLanguageCommands.d.ts +11 -0
  310. package/dist/node/cleanSlateNodeLanguageCommands.d.ts.map +1 -0
  311. package/dist/node/cleanSlateNodeLanguageCommands.js +146 -0
  312. package/dist/node/cleanSlateNodeLanguageCommands.js.map +1 -0
  313. package/dist/node/cleanSlateNodeMainService.d.ts +87 -0
  314. package/dist/node/cleanSlateNodeMainService.d.ts.map +1 -0
  315. package/dist/node/cleanSlateNodeMainService.js +1304 -0
  316. package/dist/node/cleanSlateNodeMainService.js.map +1 -0
  317. package/dist/node/cleanSlateNodeMcpClient.d.ts +20 -0
  318. package/dist/node/cleanSlateNodeMcpClient.d.ts.map +1 -0
  319. package/dist/node/cleanSlateNodeMcpClient.js +184 -0
  320. package/dist/node/cleanSlateNodeMcpClient.js.map +1 -0
  321. package/dist/node/cleanSlateNodeSearchService.d.ts +14 -0
  322. package/dist/node/cleanSlateNodeSearchService.d.ts.map +1 -0
  323. package/dist/node/cleanSlateNodeSearchService.js +180 -0
  324. package/dist/node/cleanSlateNodeSearchService.js.map +1 -0
  325. package/dist/node/cleanSlateNodeTextModel.d.ts +56 -0
  326. package/dist/node/cleanSlateNodeTextModel.d.ts.map +1 -0
  327. package/dist/node/cleanSlateNodeTextModel.js +127 -0
  328. package/dist/node/cleanSlateNodeTextModel.js.map +1 -0
  329. package/dist/node/cleanSlateNodeToolContext.d.ts +50 -0
  330. package/dist/node/cleanSlateNodeToolContext.d.ts.map +1 -0
  331. package/dist/node/cleanSlateNodeToolContext.js +134 -0
  332. package/dist/node/cleanSlateNodeToolContext.js.map +1 -0
  333. package/dist/node/cleanSlateNodeWebRetrieval.d.ts +20 -0
  334. package/dist/node/cleanSlateNodeWebRetrieval.d.ts.map +1 -0
  335. package/dist/node/cleanSlateNodeWebRetrieval.js +379 -0
  336. package/dist/node/cleanSlateNodeWebRetrieval.js.map +1 -0
  337. package/dist/node/cleanSlateOpenAIMessageAdapter.d.ts +8 -0
  338. package/dist/node/cleanSlateOpenAIMessageAdapter.d.ts.map +1 -0
  339. package/dist/node/cleanSlateOpenAIMessageAdapter.js +111 -0
  340. package/dist/node/cleanSlateOpenAIMessageAdapter.js.map +1 -0
  341. package/dist/node/cleanSlateProviderSchemaNormalizer.d.ts +18 -0
  342. package/dist/node/cleanSlateProviderSchemaNormalizer.d.ts.map +1 -0
  343. package/dist/node/cleanSlateProviderSchemaNormalizer.js +175 -0
  344. package/dist/node/cleanSlateProviderSchemaNormalizer.js.map +1 -0
  345. package/dist/node/index.d.ts +25 -0
  346. package/dist/node/index.d.ts.map +1 -0
  347. package/dist/node/index.js +28 -0
  348. package/dist/node/index.js.map +1 -0
  349. package/dist/protocol/cleanSlateAI.d.ts +964 -0
  350. package/dist/protocol/cleanSlateAI.d.ts.map +1 -0
  351. package/dist/protocol/cleanSlateAI.js +35 -0
  352. package/dist/protocol/cleanSlateAI.js.map +1 -0
  353. package/dist/protocol/cleanSlateModelCapabilities.d.ts +86 -0
  354. package/dist/protocol/cleanSlateModelCapabilities.d.ts.map +1 -0
  355. package/dist/protocol/cleanSlateModelCapabilities.js +1104 -0
  356. package/dist/protocol/cleanSlateModelCapabilities.js.map +1 -0
  357. package/dist/protocol/cleanSlateProviderMessageTransforms.d.ts +11 -0
  358. package/dist/protocol/cleanSlateProviderMessageTransforms.d.ts.map +1 -0
  359. package/dist/protocol/cleanSlateProviderMessageTransforms.js +178 -0
  360. package/dist/protocol/cleanSlateProviderMessageTransforms.js.map +1 -0
  361. package/dist/protocol/cleanSlateService.d.ts +68 -0
  362. package/dist/protocol/cleanSlateService.d.ts.map +1 -0
  363. package/dist/protocol/cleanSlateService.js +1149 -0
  364. package/dist/protocol/cleanSlateService.js.map +1 -0
  365. package/dist/services/cleanSlateCancellation.d.ts +7 -0
  366. package/dist/services/cleanSlateCancellation.d.ts.map +1 -0
  367. package/dist/services/cleanSlateCancellation.js +56 -0
  368. package/dist/services/cleanSlateCancellation.js.map +1 -0
  369. package/dist/services/cleanSlateCommandExecutionService.d.ts +25 -0
  370. package/dist/services/cleanSlateCommandExecutionService.d.ts.map +1 -0
  371. package/dist/services/cleanSlateCommandExecutionService.js +31 -0
  372. package/dist/services/cleanSlateCommandExecutionService.js.map +1 -0
  373. package/dist/services/cleanSlateDiffService.d.ts +62 -0
  374. package/dist/services/cleanSlateDiffService.d.ts.map +1 -0
  375. package/dist/services/cleanSlateDiffService.js +428 -0
  376. package/dist/services/cleanSlateDiffService.js.map +1 -0
  377. package/dist/services/cleanSlateEditMatchValidator.d.ts +63 -0
  378. package/dist/services/cleanSlateEditMatchValidator.d.ts.map +1 -0
  379. package/dist/services/cleanSlateEditMatchValidator.js +341 -0
  380. package/dist/services/cleanSlateEditMatchValidator.js.map +1 -0
  381. package/dist/services/cleanSlateEditService.d.ts +155 -0
  382. package/dist/services/cleanSlateEditService.d.ts.map +1 -0
  383. package/dist/services/cleanSlateEditService.js +848 -0
  384. package/dist/services/cleanSlateEditService.js.map +1 -0
  385. package/dist/services/cleanSlateFileHistory.d.ts +56 -0
  386. package/dist/services/cleanSlateFileHistory.d.ts.map +1 -0
  387. package/dist/services/cleanSlateFileHistory.js +157 -0
  388. package/dist/services/cleanSlateFileHistory.js.map +1 -0
  389. package/dist/services/cleanSlateTaskEvidenceCodec.d.ts +15 -0
  390. package/dist/services/cleanSlateTaskEvidenceCodec.d.ts.map +1 -0
  391. package/dist/services/cleanSlateTaskEvidenceCodec.js +151 -0
  392. package/dist/services/cleanSlateTaskEvidenceCodec.js.map +1 -0
  393. package/dist/services/cleanSlateTaskSessionService.d.ts +258 -0
  394. package/dist/services/cleanSlateTaskSessionService.d.ts.map +1 -0
  395. package/dist/services/cleanSlateTaskSessionService.js +1079 -0
  396. package/dist/services/cleanSlateTaskSessionService.js.map +1 -0
  397. package/dist/services/cleanSlateTaskState.d.ts +32 -0
  398. package/dist/services/cleanSlateTaskState.d.ts.map +1 -0
  399. package/dist/services/cleanSlateTaskState.js +40 -0
  400. package/dist/services/cleanSlateTaskState.js.map +1 -0
  401. package/dist/services/cleanSlateThreadService.d.ts +64 -0
  402. package/dist/services/cleanSlateThreadService.d.ts.map +1 -0
  403. package/dist/services/cleanSlateThreadService.js +188 -0
  404. package/dist/services/cleanSlateThreadService.js.map +1 -0
  405. package/dist/services/cleanSlateTools.d.ts +29 -0
  406. package/dist/services/cleanSlateTools.d.ts.map +1 -0
  407. package/dist/services/cleanSlateTools.js +38 -0
  408. package/dist/services/cleanSlateTools.js.map +1 -0
  409. package/dist/services/cleanSlateVerificationTargetTracker.d.ts +23 -0
  410. package/dist/services/cleanSlateVerificationTargetTracker.d.ts.map +1 -0
  411. package/dist/services/cleanSlateVerificationTargetTracker.js +214 -0
  412. package/dist/services/cleanSlateVerificationTargetTracker.js.map +1 -0
  413. package/dist/skills/cleanSlateSkillCatalog.d.ts +29 -0
  414. package/dist/skills/cleanSlateSkillCatalog.d.ts.map +1 -0
  415. package/dist/skills/cleanSlateSkillCatalog.js +225 -0
  416. package/dist/skills/cleanSlateSkillCatalog.js.map +1 -0
  417. package/dist/tools/ApplyEditTool.d.ts +73 -0
  418. package/dist/tools/ApplyEditTool.d.ts.map +1 -0
  419. package/dist/tools/ApplyEditTool.js +741 -0
  420. package/dist/tools/ApplyEditTool.js.map +1 -0
  421. package/dist/tools/AskQuestionTool.d.ts +3 -0
  422. package/dist/tools/AskQuestionTool.d.ts.map +1 -0
  423. package/dist/tools/AskQuestionTool.js +113 -0
  424. package/dist/tools/AskQuestionTool.js.map +1 -0
  425. package/dist/tools/BrowserAutomationTools.d.ts +28 -0
  426. package/dist/tools/BrowserAutomationTools.d.ts.map +1 -0
  427. package/dist/tools/BrowserAutomationTools.js +639 -0
  428. package/dist/tools/BrowserAutomationTools.js.map +1 -0
  429. package/dist/tools/CreateMultipleFilesTool.d.ts +6 -0
  430. package/dist/tools/CreateMultipleFilesTool.d.ts.map +1 -0
  431. package/dist/tools/CreateMultipleFilesTool.js +115 -0
  432. package/dist/tools/CreateMultipleFilesTool.js.map +1 -0
  433. package/dist/tools/ExecuteCommandTool.d.ts +12 -0
  434. package/dist/tools/ExecuteCommandTool.d.ts.map +1 -0
  435. package/dist/tools/ExecuteCommandTool.js +378 -0
  436. package/dist/tools/ExecuteCommandTool.js.map +1 -0
  437. package/dist/tools/FileHistoryRewindTool.d.ts +3 -0
  438. package/dist/tools/FileHistoryRewindTool.d.ts.map +1 -0
  439. package/dist/tools/FileHistoryRewindTool.js +45 -0
  440. package/dist/tools/FileHistoryRewindTool.js.map +1 -0
  441. package/dist/tools/FindByNameTool.d.ts +6 -0
  442. package/dist/tools/FindByNameTool.d.ts.map +1 -0
  443. package/dist/tools/FindByNameTool.js +80 -0
  444. package/dist/tools/FindByNameTool.js.map +1 -0
  445. package/dist/tools/FindReferencesTool.d.ts +3 -0
  446. package/dist/tools/FindReferencesTool.d.ts.map +1 -0
  447. package/dist/tools/FindReferencesTool.js +128 -0
  448. package/dist/tools/FindReferencesTool.js.map +1 -0
  449. package/dist/tools/GetDefinitionsTool.d.ts +3 -0
  450. package/dist/tools/GetDefinitionsTool.d.ts.map +1 -0
  451. package/dist/tools/GetDefinitionsTool.js +136 -0
  452. package/dist/tools/GetDefinitionsTool.js.map +1 -0
  453. package/dist/tools/GetOpenFilesTool.d.ts +6 -0
  454. package/dist/tools/GetOpenFilesTool.d.ts.map +1 -0
  455. package/dist/tools/GetOpenFilesTool.js +21 -0
  456. package/dist/tools/GetOpenFilesTool.js.map +1 -0
  457. package/dist/tools/GrepSearchTool.d.ts +7 -0
  458. package/dist/tools/GrepSearchTool.d.ts.map +1 -0
  459. package/dist/tools/GrepSearchTool.js +95 -0
  460. package/dist/tools/GrepSearchTool.js.map +1 -0
  461. package/dist/tools/ListDirTool.d.ts +6 -0
  462. package/dist/tools/ListDirTool.d.ts.map +1 -0
  463. package/dist/tools/ListDirTool.js +39 -0
  464. package/dist/tools/ListDirTool.js.map +1 -0
  465. package/dist/tools/MCPTools.d.ts +6 -0
  466. package/dist/tools/MCPTools.d.ts.map +1 -0
  467. package/dist/tools/MCPTools.js +103 -0
  468. package/dist/tools/MCPTools.js.map +1 -0
  469. package/dist/tools/MultiFileReplaceTool.d.ts +6 -0
  470. package/dist/tools/MultiFileReplaceTool.d.ts.map +1 -0
  471. package/dist/tools/MultiFileReplaceTool.js +345 -0
  472. package/dist/tools/MultiFileReplaceTool.js.map +1 -0
  473. package/dist/tools/ReadFileRangeTool.d.ts +6 -0
  474. package/dist/tools/ReadFileRangeTool.d.ts.map +1 -0
  475. package/dist/tools/ReadFileRangeTool.js +150 -0
  476. package/dist/tools/ReadFileRangeTool.js.map +1 -0
  477. package/dist/tools/ReadFileTool.d.ts +6 -0
  478. package/dist/tools/ReadFileTool.d.ts.map +1 -0
  479. package/dist/tools/ReadFileTool.js +183 -0
  480. package/dist/tools/ReadFileTool.js.map +1 -0
  481. package/dist/tools/ReadLintsTool.d.ts +6 -0
  482. package/dist/tools/ReadLintsTool.d.ts.map +1 -0
  483. package/dist/tools/ReadLintsTool.js +83 -0
  484. package/dist/tools/ReadLintsTool.js.map +1 -0
  485. package/dist/tools/ReadReferenceTool.d.ts +6 -0
  486. package/dist/tools/ReadReferenceTool.d.ts.map +1 -0
  487. package/dist/tools/ReadReferenceTool.js +24 -0
  488. package/dist/tools/ReadReferenceTool.js.map +1 -0
  489. package/dist/tools/ReadSymbolsTool.d.ts +3 -0
  490. package/dist/tools/ReadSymbolsTool.d.ts.map +1 -0
  491. package/dist/tools/ReadSymbolsTool.js +100 -0
  492. package/dist/tools/ReadSymbolsTool.js.map +1 -0
  493. package/dist/tools/SearchCodebaseTool.d.ts +6 -0
  494. package/dist/tools/SearchCodebaseTool.d.ts.map +1 -0
  495. package/dist/tools/SearchCodebaseTool.js +30 -0
  496. package/dist/tools/SearchCodebaseTool.js.map +1 -0
  497. package/dist/tools/SearchWorkspaceTool.d.ts +7 -0
  498. package/dist/tools/SearchWorkspaceTool.d.ts.map +1 -0
  499. package/dist/tools/SearchWorkspaceTool.js +21 -0
  500. package/dist/tools/SearchWorkspaceTool.js.map +1 -0
  501. package/dist/tools/SemanticSearchTool.d.ts +12 -0
  502. package/dist/tools/SemanticSearchTool.d.ts.map +1 -0
  503. package/dist/tools/SemanticSearchTool.js +46 -0
  504. package/dist/tools/SemanticSearchTool.js.map +1 -0
  505. package/dist/tools/SkillTools.d.ts +3 -0
  506. package/dist/tools/SkillTools.d.ts.map +1 -0
  507. package/dist/tools/SkillTools.js +108 -0
  508. package/dist/tools/SkillTools.js.map +1 -0
  509. package/dist/tools/SpawnWorkerTool.d.ts +6 -0
  510. package/dist/tools/SpawnWorkerTool.d.ts.map +1 -0
  511. package/dist/tools/SpawnWorkerTool.js +28 -0
  512. package/dist/tools/SpawnWorkerTool.js.map +1 -0
  513. package/dist/tools/SubmitArtifactTool.d.ts +3 -0
  514. package/dist/tools/SubmitArtifactTool.d.ts.map +1 -0
  515. package/dist/tools/SubmitArtifactTool.js +121 -0
  516. package/dist/tools/SubmitArtifactTool.js.map +1 -0
  517. package/dist/tools/UndoEditTool.d.ts +3 -0
  518. package/dist/tools/UndoEditTool.d.ts.map +1 -0
  519. package/dist/tools/UndoEditTool.js +66 -0
  520. package/dist/tools/UndoEditTool.js.map +1 -0
  521. package/dist/tools/UpdateTodoTool.d.ts +6 -0
  522. package/dist/tools/UpdateTodoTool.d.ts.map +1 -0
  523. package/dist/tools/UpdateTodoTool.js +116 -0
  524. package/dist/tools/UpdateTodoTool.js.map +1 -0
  525. package/dist/tools/WebRetrievalTools.d.ts +4 -0
  526. package/dist/tools/WebRetrievalTools.d.ts.map +1 -0
  527. package/dist/tools/WebRetrievalTools.js +169 -0
  528. package/dist/tools/WebRetrievalTools.js.map +1 -0
  529. package/dist/tools/WriteFileTool.d.ts +6 -0
  530. package/dist/tools/WriteFileTool.d.ts.map +1 -0
  531. package/dist/tools/WriteFileTool.js +145 -0
  532. package/dist/tools/WriteFileTool.js.map +1 -0
  533. package/dist/tools/cleanSlateFileReadPolicy.d.ts +33 -0
  534. package/dist/tools/cleanSlateFileReadPolicy.d.ts.map +1 -0
  535. package/dist/tools/cleanSlateFileReadPolicy.js +84 -0
  536. package/dist/tools/cleanSlateFileReadPolicy.js.map +1 -0
  537. package/dist/tools/cleanSlateHostTypes.d.ts +100 -0
  538. package/dist/tools/cleanSlateHostTypes.d.ts.map +1 -0
  539. package/dist/tools/cleanSlateHostTypes.js +6 -0
  540. package/dist/tools/cleanSlateHostTypes.js.map +1 -0
  541. package/dist/tools/cleanSlatePlanArtifactPolicy.d.ts +47 -0
  542. package/dist/tools/cleanSlatePlanArtifactPolicy.d.ts.map +1 -0
  543. package/dist/tools/cleanSlatePlanArtifactPolicy.js +126 -0
  544. package/dist/tools/cleanSlatePlanArtifactPolicy.js.map +1 -0
  545. package/dist/tools/cleanSlateStaleDiagnosticPolicy.d.ts +3 -0
  546. package/dist/tools/cleanSlateStaleDiagnosticPolicy.d.ts.map +1 -0
  547. package/dist/tools/cleanSlateStaleDiagnosticPolicy.js +13 -0
  548. package/dist/tools/cleanSlateStaleDiagnosticPolicy.js.map +1 -0
  549. package/dist/tools/languageFeatureActivation.d.ts +13 -0
  550. package/dist/tools/languageFeatureActivation.d.ts.map +1 -0
  551. package/dist/tools/languageFeatureActivation.js +95 -0
  552. package/dist/tools/languageFeatureActivation.js.map +1 -0
  553. package/dist/tools/registry.d.ts +5 -0
  554. package/dist/tools/registry.d.ts.map +1 -0
  555. package/dist/tools/registry.js +104 -0
  556. package/dist/tools/registry.js.map +1 -0
  557. package/dist/tools/structuredEditCanonicalizer.d.ts +11 -0
  558. package/dist/tools/structuredEditCanonicalizer.d.ts.map +1 -0
  559. package/dist/tools/structuredEditCanonicalizer.js +44 -0
  560. package/dist/tools/structuredEditCanonicalizer.js.map +1 -0
  561. package/dist/tools/symbolContext.d.ts +36 -0
  562. package/dist/tools/symbolContext.d.ts.map +1 -0
  563. package/dist/tools/symbolContext.js +146 -0
  564. package/dist/tools/symbolContext.js.map +1 -0
  565. package/dist/tools/symbolEditResolver.d.ts +11 -0
  566. package/dist/tools/symbolEditResolver.d.ts.map +1 -0
  567. package/dist/tools/symbolEditResolver.js +259 -0
  568. package/dist/tools/symbolEditResolver.js.map +1 -0
  569. package/dist/tools/symbolIndex.d.ts +18 -0
  570. package/dist/tools/symbolIndex.d.ts.map +1 -0
  571. package/dist/tools/symbolIndex.js +235 -0
  572. package/dist/tools/symbolIndex.js.map +1 -0
  573. package/dist/tools/types.d.ts +108 -0
  574. package/dist/tools/types.d.ts.map +1 -0
  575. package/dist/tools/types.js +6 -0
  576. package/dist/tools/types.js.map +1 -0
  577. package/dist/tools/utils.d.ts +56 -0
  578. package/dist/tools/utils.d.ts.map +1 -0
  579. package/dist/tools/utils.js +205 -0
  580. package/dist/tools/utils.js.map +1 -0
  581. package/package.json +71 -0
@@ -0,0 +1,1304 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) CleanSlate. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { Emitter, Event } from '../core/event.js';
6
+ import { CleanSlateNodeCommandService } from './cleanSlateNodeCommandService.js';
7
+ import { CleanSlateAnthropicMessageAdapter } from './cleanSlateAnthropicMessageAdapter.js';
8
+ import { CleanSlateOpenAIMessageAdapter } from './cleanSlateOpenAIMessageAdapter.js';
9
+ import { CleanSlateProviderSchemaNormalizer } from './cleanSlateProviderSchemaNormalizer.js';
10
+ import { normalizeToolName } from '../protocol/cleanSlateProviderMessageTransforms.js';
11
+ import { CleanSlateNodeWebRetrieval } from './cleanSlateNodeWebRetrieval.js';
12
+ const LEADING_REASONING_HOLD_CAP_CHARS = 8_000;
13
+ /**
14
+ * Node implementation of the provider-facing service used by CleanSlateService.
15
+ *
16
+ * Provider SDK events are adapted into CleanSlate's framed part stream. Methods
17
+ * that require an editor-owned capability deliberately reject on this surface.
18
+ */
19
+ export class NodeCleanSlateMainService {
20
+ static { this.MODEL_LIST_TIMEOUT_MS = 30_000; }
21
+ static { this.PROVIDER_STREAM_IDLE_TIMEOUT_MS = 120_000; }
22
+ constructor(rootPath = process.cwd()) {
23
+ this.providerSchemaNormalizer = new CleanSlateProviderSchemaNormalizer();
24
+ this.openAIMessageAdapter = new CleanSlateOpenAIMessageAdapter();
25
+ this.anthropicMessageAdapter = new CleanSlateAnthropicMessageAdapter(this.providerSchemaNormalizer);
26
+ this.webRetrieval = new CleanSlateNodeWebRetrieval();
27
+ this.onDidPublishThreadSession = Event.None;
28
+ this.commandService = new CleanSlateNodeCommandService(rootPath);
29
+ }
30
+ getRuntimeConfig() {
31
+ const apiBaseUrl = this.normalizeEnvValue(process.env['CLEANSLATE_API_BASE_URL']) ?? 'https://api.thewariend.com/api';
32
+ const authWebUrl = this.normalizeEnvValue(process.env['CLEANSLATE_AUTH_WEB_URL']) ?? 'https://thewariend.com/auth';
33
+ return Promise.resolve({
34
+ authWebUrl,
35
+ apiBaseUrl,
36
+ managedAIBaseUrl: `${apiBaseUrl}/cleanslate`,
37
+ proCheckoutUrl: 'https://api.thewariend.com/checkout/cleanslate/pro'
38
+ });
39
+ }
40
+ getModelsDevModelMetadata(_provider, _model, _token) {
41
+ return Promise.resolve(undefined);
42
+ }
43
+ async listOpenAICompatibleModels(options, token) {
44
+ if (!options.apiKey && !this.isCustomProviderName(options.providerName)) {
45
+ throw new Error('API key is required for OpenAI-compatible model listing.');
46
+ }
47
+ if (this.isCustomProviderName(options.providerName) && !this.resolveOpenAICompatibleBaseUrl(options)) {
48
+ throw new Error('Base URL is required for Custom API model listing.');
49
+ }
50
+ const client = await this.createOpenAICompatibleClient(options);
51
+ const abort = this.createProviderAbortController(token, NodeCleanSlateMainService.MODEL_LIST_TIMEOUT_MS);
52
+ try {
53
+ const response = await client.models.list({}, { signal: abort.signal });
54
+ const models = Array.isArray(response?.data) ? response.data : [];
55
+ return models
56
+ .map((model) => typeof model?.id === 'string' ? model.id : undefined)
57
+ .filter((id) => typeof id === 'string' && id.length > 0)
58
+ .sort((a, b) => a.localeCompare(b));
59
+ }
60
+ catch (error) {
61
+ throw new Error(this.toProviderErrorMessage(error, abort, 'OpenAI-compatible model listing'));
62
+ }
63
+ finally {
64
+ abort.dispose();
65
+ }
66
+ }
67
+ openAICompatibleChatStream(options, token) {
68
+ const emitter = new Emitter();
69
+ (async () => {
70
+ let abort;
71
+ try {
72
+ if (!options.apiKey && !this.isCustomProviderName(options.providerName)) {
73
+ throw new Error(`${options.providerName} API key is required.`);
74
+ }
75
+ if (!options.model) {
76
+ throw new Error(`${options.providerName} model is required.`);
77
+ }
78
+ if (this.isCustomProviderName(options.providerName) && !this.resolveOpenAICompatibleBaseUrl(options)) {
79
+ throw new Error('Custom API base URL is required.');
80
+ }
81
+ const client = await this.createOpenAICompatibleClient(options);
82
+ const body = {
83
+ model: options.model,
84
+ stream: true,
85
+ messages: options.messages.map((message, index) => this.openAIMessageAdapter.toChatMessage(message, index))
86
+ };
87
+ if (options.store !== undefined) {
88
+ body.store = options.store;
89
+ }
90
+ if (options.promptCacheKey) {
91
+ body.prompt_cache_key = options.promptCacheKey;
92
+ }
93
+ const maxOutputTokens = Number.isFinite(options.maxOutputTokens) && options.maxOutputTokens > 0
94
+ ? Math.floor(options.maxOutputTokens)
95
+ : undefined;
96
+ if (options.useMaxCompletionTokens) {
97
+ if (maxOutputTokens !== undefined) {
98
+ body.max_completion_tokens = maxOutputTokens;
99
+ }
100
+ if (options.reasoningEffort) {
101
+ body.reasoning_effort = options.reasoningEffort;
102
+ }
103
+ }
104
+ else {
105
+ if (maxOutputTokens !== undefined) {
106
+ body.max_tokens = maxOutputTokens;
107
+ }
108
+ if (options.temperature !== undefined) {
109
+ body.temperature = options.temperature;
110
+ }
111
+ if (options.topP !== undefined) {
112
+ body.top_p = options.topP;
113
+ }
114
+ if (options.topK !== undefined && !options.azure && options.providerName !== 'OpenAI') {
115
+ body.top_k = options.topK;
116
+ }
117
+ if (options.reasoningEffort) {
118
+ body.reasoning_effort = options.reasoningEffort;
119
+ }
120
+ }
121
+ if (options.bodyOptions) {
122
+ Object.assign(body, options.bodyOptions);
123
+ }
124
+ if (options.options?.tools?.length) {
125
+ body.tools = options.options.tools.map(tool => ({
126
+ type: 'function',
127
+ function: {
128
+ name: tool.name,
129
+ description: tool.description,
130
+ parameters: this.providerSchemaNormalizer.normalizeJsonObjectSchema(tool.parametersSchema, { target: 'openaiCompatible', model: options.model })
131
+ }
132
+ }));
133
+ body.tool_choice = options.options.requiredToolName
134
+ ? { type: 'function', function: { name: options.options.requiredToolName } }
135
+ : 'auto';
136
+ if (options.parallelToolCalls && !options.options.requiredToolName && options.reasoningEffort !== 'minimal') {
137
+ body.parallel_tool_calls = true;
138
+ }
139
+ }
140
+ abort = this.createProviderAbortController(token, NodeCleanSlateMainService.PROVIDER_STREAM_IDLE_TIMEOUT_MS);
141
+ const stream = await client.chat.completions.create(body, { signal: abort.signal });
142
+ const toolCalls = new Map();
143
+ const emittedToolCallIndexes = new Set();
144
+ let lastUsageSignature;
145
+ const emitBufferedToolCalls = () => {
146
+ for (const [index, toolCall] of toolCalls.entries()) {
147
+ if (emittedToolCallIndexes.has(index) || !toolCall.name) {
148
+ continue;
149
+ }
150
+ emittedToolCallIndexes.add(index);
151
+ this.emitProviderPart(emitter, {
152
+ type: 'tool_call',
153
+ call: {
154
+ id: toolCall.id || `call_${index}`,
155
+ toolName: toolCall.name,
156
+ input: this.parseToolInput(toolCall.argumentsJson)
157
+ }
158
+ });
159
+ }
160
+ };
161
+ const thinkState = { inside: false, pending: '', sawOpen: false, holdLeading: options.reasoningEffort !== undefined };
162
+ for await (const chunk of stream) {
163
+ abort.touch();
164
+ if (token.isCancellationRequested) {
165
+ break;
166
+ }
167
+ const delta = chunk?.choices?.[0]?.delta ?? {};
168
+ const usage = this.toProviderUsage(chunk?.usage);
169
+ if (usage) {
170
+ const signature = JSON.stringify(usage);
171
+ if (signature !== lastUsageSignature) {
172
+ lastUsageSignature = signature;
173
+ this.emitProviderPart(emitter, { type: 'usage', usage });
174
+ }
175
+ }
176
+ const content = delta.content;
177
+ const reasoningDelta = this.extractOpenAICompatibleReasoningDelta(delta);
178
+ if (reasoningDelta) {
179
+ this.emitProviderPart(emitter, { type: 'reasoning', content: reasoningDelta });
180
+ }
181
+ if (typeof content === 'string' && content.length > 0) {
182
+ const split = this.splitInlineReasoningTags(content, thinkState);
183
+ if (split.reasoning.length > 0) {
184
+ this.emitProviderPart(emitter, { type: 'reasoning', content: split.reasoning });
185
+ }
186
+ if (split.text.length > 0) {
187
+ this.emitProviderPart(emitter, { type: 'text', content: split.text });
188
+ }
189
+ }
190
+ if (Array.isArray(delta.tool_calls)) {
191
+ for (const toolCallDelta of delta.tool_calls) {
192
+ const index = Number.isFinite(toolCallDelta.index) ? toolCallDelta.index : toolCalls.size;
193
+ const existing = toolCalls.get(index) ?? { name: '', argumentsJson: '' };
194
+ if (typeof toolCallDelta.id === 'string') {
195
+ existing.id = toolCallDelta.id;
196
+ }
197
+ if (typeof toolCallDelta.function?.name === 'string') {
198
+ existing.name = toolCallDelta.function.name;
199
+ }
200
+ if (typeof toolCallDelta.function?.arguments === 'string') {
201
+ existing.argumentsJson += toolCallDelta.function.arguments;
202
+ }
203
+ toolCalls.set(index, existing);
204
+ }
205
+ }
206
+ if (chunk?.choices?.[0]?.finish_reason === 'tool_calls') {
207
+ emitBufferedToolCalls();
208
+ }
209
+ }
210
+ if (thinkState.pending.length > 0) {
211
+ this.emitProviderPart(emitter, {
212
+ type: thinkState.inside ? 'reasoning' : 'text',
213
+ content: thinkState.pending
214
+ });
215
+ thinkState.pending = '';
216
+ }
217
+ emitBufferedToolCalls();
218
+ }
219
+ catch (error) {
220
+ emitter.fire(`ERROR: ${this.toProviderErrorMessage(error, abort, options.providerName)}`);
221
+ }
222
+ finally {
223
+ abort?.dispose();
224
+ emitter.fire(null);
225
+ }
226
+ })();
227
+ return emitter.event;
228
+ }
229
+ openAIResponsesStream(options, token) {
230
+ const emitter = new Emitter();
231
+ (async () => {
232
+ let abort;
233
+ try {
234
+ if (!options.apiKey) {
235
+ throw new Error(`${options.providerName} API key is required.`);
236
+ }
237
+ if (!options.model) {
238
+ throw new Error(`${options.providerName} model is required.`);
239
+ }
240
+ const client = await this.createOpenAICompatibleClient(options);
241
+ if (typeof client.responses?.create !== 'function') {
242
+ throw new Error('OpenAI SDK does not expose the Responses API.');
243
+ }
244
+ const body = {
245
+ model: options.model,
246
+ stream: true,
247
+ input: this.openAIMessageAdapter.toResponsesInput(options.messages)
248
+ };
249
+ if (options.store !== undefined) {
250
+ body.store = options.store;
251
+ }
252
+ if (options.promptCacheKey) {
253
+ body.prompt_cache_key = options.promptCacheKey;
254
+ }
255
+ const maxOutputTokens = Number.isFinite(options.maxOutputTokens) && options.maxOutputTokens > 0
256
+ ? Math.floor(options.maxOutputTokens)
257
+ : undefined;
258
+ if (maxOutputTokens !== undefined) {
259
+ body.max_output_tokens = maxOutputTokens;
260
+ }
261
+ if (options.reasoningEffort) {
262
+ body.reasoning = { effort: options.reasoningEffort };
263
+ if (options.reasoningSummary && options.reasoningEffort !== 'none') {
264
+ body.reasoning.summary = options.reasoningSummary;
265
+ }
266
+ }
267
+ if (options.include?.length) {
268
+ body.include = options.include;
269
+ }
270
+ if (options.bodyOptions) {
271
+ Object.assign(body, options.bodyOptions);
272
+ }
273
+ if (options.options?.tools?.length) {
274
+ body.tools = options.options.tools.map(tool => ({
275
+ type: 'function',
276
+ name: tool.name,
277
+ description: tool.description,
278
+ parameters: this.providerSchemaNormalizer.normalizeJsonObjectSchema(tool.parametersSchema, { target: 'openaiCompatible', model: options.model })
279
+ }));
280
+ body.tool_choice = options.options.requiredToolName
281
+ ? { type: 'function', name: options.options.requiredToolName }
282
+ : 'auto';
283
+ if (options.parallelToolCalls && !options.options.requiredToolName && options.reasoningEffort !== 'minimal') {
284
+ body.parallel_tool_calls = true;
285
+ }
286
+ }
287
+ abort = this.createProviderAbortController(token, NodeCleanSlateMainService.PROVIDER_STREAM_IDLE_TIMEOUT_MS);
288
+ const stream = await client.responses.create(body, { signal: abort.signal });
289
+ const toolCalls = new Map();
290
+ const emittedToolCallKeys = new Set();
291
+ const outputTextPhases = new Map();
292
+ const toolCallKey = (event) => String(event?.item_id ?? event?.output_index ?? toolCalls.size);
293
+ const rememberOutputTextPhase = (event, item) => {
294
+ const phase = item?.phase;
295
+ if (phase !== 'commentary' && phase !== 'final_answer') {
296
+ return;
297
+ }
298
+ for (const key of [event?.item_id, item?.id, event?.output_index]) {
299
+ if (key !== undefined && key !== null) {
300
+ outputTextPhases.set(String(key), phase);
301
+ }
302
+ }
303
+ };
304
+ const getOutputTextPhase = (event) => {
305
+ for (const key of [event?.item_id, event?.output_index]) {
306
+ if (key !== undefined && key !== null) {
307
+ const phase = outputTextPhases.get(String(key));
308
+ if (phase) {
309
+ return phase;
310
+ }
311
+ }
312
+ }
313
+ return undefined;
314
+ };
315
+ const emitBufferedToolCall = (key) => {
316
+ const toolCall = toolCalls.get(key);
317
+ if (!toolCall || emittedToolCallKeys.has(key) || !toolCall.name) {
318
+ return;
319
+ }
320
+ emittedToolCallKeys.add(key);
321
+ this.emitProviderPart(emitter, {
322
+ type: 'tool_call',
323
+ call: {
324
+ id: toolCall.id || key,
325
+ toolName: toolCall.name,
326
+ input: this.parseToolInput(toolCall.argumentsJson)
327
+ }
328
+ });
329
+ };
330
+ const rememberFunctionCall = (key, item) => {
331
+ const existing = toolCalls.get(key) ?? { name: '', argumentsJson: '' };
332
+ if (typeof item?.id === 'string') {
333
+ existing.id = item.id;
334
+ }
335
+ if (typeof item?.call_id === 'string') {
336
+ existing.id = item.call_id;
337
+ }
338
+ if (typeof item?.name === 'string') {
339
+ existing.name = item.name;
340
+ }
341
+ if (typeof item?.arguments === 'string' && item.arguments.length > 0) {
342
+ existing.argumentsJson = item.arguments;
343
+ }
344
+ toolCalls.set(key, existing);
345
+ };
346
+ for await (const event of stream) {
347
+ abort.touch();
348
+ if (token.isCancellationRequested) {
349
+ break;
350
+ }
351
+ if (event?.type === 'response.output_text.delta' && typeof event.delta === 'string') {
352
+ const phase = getOutputTextPhase(event);
353
+ this.emitProviderPart(emitter, {
354
+ type: 'text',
355
+ content: event.delta,
356
+ ...(phase ? { phase } : {})
357
+ });
358
+ continue;
359
+ }
360
+ if (event?.type === 'response.reasoning_summary_text.delta' && typeof event.delta === 'string') {
361
+ this.emitProviderPart(emitter, { type: 'reasoning', content: event.delta });
362
+ continue;
363
+ }
364
+ if (event?.type === 'response.output_item.added') {
365
+ if (event.item?.type === 'function_call') {
366
+ rememberFunctionCall(toolCallKey(event), event.item);
367
+ }
368
+ else if (event.item?.type === 'message') {
369
+ rememberOutputTextPhase(event, event.item);
370
+ }
371
+ continue;
372
+ }
373
+ if (event?.type === 'response.function_call_arguments.delta') {
374
+ const key = toolCallKey(event);
375
+ const existing = toolCalls.get(key) ?? { name: '', argumentsJson: '' };
376
+ if (typeof event.delta === 'string') {
377
+ existing.argumentsJson += event.delta;
378
+ }
379
+ toolCalls.set(key, existing);
380
+ continue;
381
+ }
382
+ if (event?.type === 'response.function_call_arguments.done') {
383
+ const key = toolCallKey(event);
384
+ const existing = toolCalls.get(key) ?? { name: '', argumentsJson: '' };
385
+ if (typeof event.name === 'string') {
386
+ existing.name = event.name;
387
+ }
388
+ if (typeof event.arguments === 'string') {
389
+ existing.argumentsJson = event.arguments;
390
+ }
391
+ toolCalls.set(key, existing);
392
+ emitBufferedToolCall(key);
393
+ continue;
394
+ }
395
+ if (event?.type === 'response.output_item.done' && event.item?.type === 'function_call') {
396
+ const key = toolCallKey(event);
397
+ rememberFunctionCall(key, event.item);
398
+ emitBufferedToolCall(key);
399
+ continue;
400
+ }
401
+ if (event?.type === 'response.completed' && Array.isArray(event.response?.output)) {
402
+ const usage = this.toProviderUsage(event.response?.usage);
403
+ if (usage) {
404
+ this.emitProviderPart(emitter, { type: 'usage', usage });
405
+ }
406
+ for (const [index, item] of event.response.output.entries()) {
407
+ if (item?.type === 'function_call') {
408
+ const key = String(item.id ?? item.call_id ?? index);
409
+ rememberFunctionCall(key, item);
410
+ emitBufferedToolCall(key);
411
+ }
412
+ }
413
+ }
414
+ }
415
+ for (const key of toolCalls.keys()) {
416
+ emitBufferedToolCall(key);
417
+ }
418
+ }
419
+ catch (error) {
420
+ emitter.fire(`ERROR: ${this.toProviderErrorMessage(error, abort, options.providerName)}`);
421
+ }
422
+ finally {
423
+ abort?.dispose();
424
+ emitter.fire(null);
425
+ }
426
+ })();
427
+ return emitter.event;
428
+ }
429
+ async listAnthropicModels(options, token) {
430
+ if (!options.apiKey) {
431
+ throw new Error('Anthropic API key is required for model listing.');
432
+ }
433
+ const client = await this.createAnthropicClient(options);
434
+ const abort = this.createProviderAbortController(token, NodeCleanSlateMainService.MODEL_LIST_TIMEOUT_MS);
435
+ try {
436
+ const page = await client.models.list({ limit: 100 }, { signal: abort.signal });
437
+ const data = Array.isArray(page?.data) ? page.data : [];
438
+ return data
439
+ .map((model) => typeof model?.id === 'string' ? model.id : undefined)
440
+ .filter((id) => typeof id === 'string' && id.length > 0)
441
+ .sort((a, b) => a.localeCompare(b));
442
+ }
443
+ catch (error) {
444
+ throw new Error(this.toProviderErrorMessage(error, abort, 'Anthropic model listing'));
445
+ }
446
+ finally {
447
+ abort.dispose();
448
+ }
449
+ }
450
+ anthropicMessagesStream(options, token) {
451
+ const emitter = new Emitter();
452
+ (async () => {
453
+ let abort;
454
+ try {
455
+ if (!options.apiKey) {
456
+ throw new Error('Anthropic API key is required.');
457
+ }
458
+ if (!options.model) {
459
+ throw new Error('Anthropic model is required.');
460
+ }
461
+ const client = await this.createAnthropicClient(options);
462
+ const body = this.anthropicMessageAdapter.toMessagesRequest(options);
463
+ abort = this.createProviderAbortController(token, NodeCleanSlateMainService.PROVIDER_STREAM_IDLE_TIMEOUT_MS);
464
+ const stream = await client.messages.create(body, { signal: abort.signal });
465
+ let currentToolUseId = null;
466
+ let currentToolName = null;
467
+ let currentInputJson = '';
468
+ for await (const event of stream) {
469
+ abort.touch();
470
+ if (token.isCancellationRequested) {
471
+ break;
472
+ }
473
+ if (event.type === 'content_block_start' && event.content_block?.type === 'tool_use') {
474
+ currentToolUseId = event.content_block.id;
475
+ currentToolName = event.content_block.name;
476
+ currentInputJson = '';
477
+ continue;
478
+ }
479
+ if (event.type === 'content_block_delta') {
480
+ if (event.delta?.type === 'text_delta' && typeof event.delta.text === 'string') {
481
+ this.emitProviderPart(emitter, { type: 'text', content: event.delta.text });
482
+ }
483
+ else if (event.delta?.type === 'thinking_delta' && typeof event.delta.thinking === 'string') {
484
+ this.emitProviderPart(emitter, { type: 'reasoning', content: event.delta.thinking });
485
+ }
486
+ else if (event.delta?.type === 'input_json_delta' && typeof event.delta.partial_json === 'string') {
487
+ currentInputJson += event.delta.partial_json;
488
+ }
489
+ continue;
490
+ }
491
+ if (event.type === 'content_block_stop' && currentToolUseId && currentToolName) {
492
+ this.emitProviderPart(emitter, {
493
+ type: 'tool_call',
494
+ call: {
495
+ id: currentToolUseId,
496
+ toolName: currentToolName,
497
+ input: this.parseToolInput(currentInputJson)
498
+ }
499
+ });
500
+ currentToolUseId = null;
501
+ currentToolName = null;
502
+ currentInputJson = '';
503
+ }
504
+ }
505
+ }
506
+ catch (error) {
507
+ emitter.fire(`ERROR: ${this.toProviderErrorMessage(error, abort, 'Anthropic')}`);
508
+ }
509
+ finally {
510
+ abort?.dispose();
511
+ emitter.fire(null);
512
+ }
513
+ })();
514
+ return emitter.event;
515
+ }
516
+ executeCommand(options) {
517
+ return this.commandService.executeCommand(options);
518
+ }
519
+ proxyRequest(_options, _token) {
520
+ return this.unsupported('proxy requests');
521
+ }
522
+ proxyStream(_options, _token) {
523
+ return this.unsupportedEvent('proxy streams');
524
+ }
525
+ async listGeminiModels(options, token) {
526
+ if (!options.apiKey) {
527
+ throw new Error('Google Gemini API key is required for model listing.');
528
+ }
529
+ const client = await this.createGeminiClient(options);
530
+ const pager = await client.models.list({ config: { pageSize: 100 } });
531
+ const models = [];
532
+ for await (const model of pager) {
533
+ if (token.isCancellationRequested) {
534
+ break;
535
+ }
536
+ const actions = Array.isArray(model?.supportedActions) ? model.supportedActions : [];
537
+ if (actions.length && !actions.includes('generateContent')) {
538
+ continue;
539
+ }
540
+ const name = typeof model?.name === 'string' ? model.name.replace(/^models\//, '') : undefined;
541
+ if (name) {
542
+ models.push(name);
543
+ }
544
+ }
545
+ return Array.from(new Set(models)).sort((a, b) => a.localeCompare(b));
546
+ }
547
+ geminiGenerateContentStream(options, token) {
548
+ const emitter = new Emitter();
549
+ (async () => {
550
+ let abort;
551
+ try {
552
+ if (!options.apiKey) {
553
+ throw new Error('Google Gemini API key is required.');
554
+ }
555
+ if (!options.model) {
556
+ throw new Error('Google Gemini model is required.');
557
+ }
558
+ const client = await this.createGeminiClient(options);
559
+ const googleModule = await this.importExternalModule('@google/genai');
560
+ const { contents, systemInstruction } = this.toGeminiContents(options.messages);
561
+ abort = this.createProviderAbortController(token, NodeCleanSlateMainService.PROVIDER_STREAM_IDLE_TIMEOUT_MS);
562
+ const config = {
563
+ maxOutputTokens: options.maxOutputTokens || 16384,
564
+ abortSignal: abort.signal,
565
+ automaticFunctionCalling: { disable: true, ignoreCallHistory: true }
566
+ };
567
+ if (options.temperature !== undefined) {
568
+ config.temperature = options.temperature;
569
+ }
570
+ if (options.topP !== undefined) {
571
+ config.topP = options.topP;
572
+ }
573
+ if (options.topK !== undefined) {
574
+ config.topK = options.topK;
575
+ }
576
+ if (options.thinkingConfig) {
577
+ config.thinkingConfig = options.thinkingConfig;
578
+ }
579
+ if (systemInstruction) {
580
+ config.systemInstruction = systemInstruction;
581
+ }
582
+ if (options.options?.tools?.length) {
583
+ config.tools = [{
584
+ functionDeclarations: options.options.tools.map(tool => ({
585
+ name: normalizeToolName(tool.name, 'gemini') ?? tool.name,
586
+ description: tool.description,
587
+ parametersJsonSchema: this.providerSchemaNormalizer.normalizeJsonObjectSchema(tool.parametersSchema, { target: 'gemini', model: options.model })
588
+ }))
589
+ }];
590
+ const requiredToolName = normalizeToolName(options.options.requiredToolName, 'gemini');
591
+ config.toolConfig = {
592
+ functionCallingConfig: {
593
+ mode: options.options.requiredToolName
594
+ ? (googleModule.FunctionCallingConfigMode?.ANY ?? 'ANY')
595
+ : (googleModule.FunctionCallingConfigMode?.AUTO ?? 'AUTO'),
596
+ allowedFunctionNames: requiredToolName ? [requiredToolName] : undefined
597
+ }
598
+ };
599
+ }
600
+ const stream = await client.models.generateContentStream({ model: options.model, contents, config });
601
+ const pendingToolCalls = new Map();
602
+ for await (const chunk of stream) {
603
+ abort.touch();
604
+ if (token.isCancellationRequested) {
605
+ break;
606
+ }
607
+ const thoughtText = this.extractGeminiThoughtText(chunk);
608
+ if (thoughtText) {
609
+ this.emitProviderPart(emitter, { type: 'reasoning', content: thoughtText });
610
+ }
611
+ const text = chunk?.text;
612
+ if (typeof text === 'string' && text.length > 0) {
613
+ this.emitProviderPart(emitter, { type: 'text', content: text });
614
+ }
615
+ for (const call of this.extractGeminiFunctionCallParts(chunk)) {
616
+ this.collectGeminiPendingToolCall(pendingToolCalls, call);
617
+ }
618
+ }
619
+ for (const call of pendingToolCalls.values()) {
620
+ this.emitProviderPart(emitter, {
621
+ type: 'tool_call',
622
+ call: {
623
+ id: call.id,
624
+ toolName: call.toolName,
625
+ input: call.input,
626
+ providerMetadata: call.thoughtSignature
627
+ ? { gemini: { thoughtSignature: call.thoughtSignature } }
628
+ : undefined
629
+ }
630
+ });
631
+ }
632
+ }
633
+ catch (error) {
634
+ emitter.fire(`ERROR: ${this.toProviderErrorMessage(error, abort, 'Google Gemini')}`);
635
+ }
636
+ finally {
637
+ abort?.dispose();
638
+ emitter.fire(null);
639
+ }
640
+ })();
641
+ return emitter.event;
642
+ }
643
+ async listBedrockFoundationModels(options, token) {
644
+ if (!options.region) {
645
+ throw new Error('AWS region is required for Bedrock model listing.');
646
+ }
647
+ const { BedrockClient, ListFoundationModelsCommand } = await this.importExternalModule('@aws-sdk/client-bedrock');
648
+ const client = new BedrockClient(await this.createBedrockClientConfig(options));
649
+ const abort = this.createProviderAbortController(token, NodeCleanSlateMainService.MODEL_LIST_TIMEOUT_MS);
650
+ try {
651
+ const response = await client.send(new ListFoundationModelsCommand({}), { abortSignal: abort.signal });
652
+ return (response.modelSummaries ?? [])
653
+ .filter((model) => model.modelId && (model.outputModalities ?? []).includes('TEXT'))
654
+ .map((model) => model.modelId)
655
+ .sort((a, b) => a.localeCompare(b));
656
+ }
657
+ catch (error) {
658
+ throw new Error(this.toProviderErrorMessage(error, abort, 'AWS Bedrock model listing'));
659
+ }
660
+ finally {
661
+ abort.dispose();
662
+ }
663
+ }
664
+ bedrockConverseStream(options, token) {
665
+ const emitter = new Emitter();
666
+ (async () => {
667
+ let abort;
668
+ try {
669
+ if (!options.region) {
670
+ throw new Error('AWS region is required for Bedrock.');
671
+ }
672
+ if (!options.modelId) {
673
+ throw new Error('Bedrock model ID is required.');
674
+ }
675
+ const { BedrockRuntimeClient, ConverseStreamCommand } = await this.importExternalModule('@aws-sdk/client-bedrock-runtime');
676
+ const client = new BedrockRuntimeClient(await this.createBedrockClientConfig(options));
677
+ abort = this.createProviderAbortController(token, NodeCleanSlateMainService.PROVIDER_STREAM_IDLE_TIMEOUT_MS);
678
+ const response = await client.send(new ConverseStreamCommand(this.toProviderConverseRequest(options)), { abortSignal: abort.signal });
679
+ const toolUses = new Map();
680
+ const thinkState = {
681
+ inside: false,
682
+ pending: '',
683
+ sawOpen: false,
684
+ holdLeading: false
685
+ };
686
+ for await (const event of (response.stream ?? [])) {
687
+ abort.touch();
688
+ if (token.isCancellationRequested) {
689
+ break;
690
+ }
691
+ const start = event.contentBlockStart?.start?.toolUse;
692
+ if (start) {
693
+ const index = event.contentBlockStart?.contentBlockIndex ?? toolUses.size;
694
+ toolUses.set(index, {
695
+ id: start.toolUseId ?? `tool_${index}`,
696
+ name: start.name ?? '',
697
+ inputJson: ''
698
+ });
699
+ continue;
700
+ }
701
+ const delta = event.contentBlockDelta?.delta;
702
+ if (typeof delta?.text === 'string' && delta.text.length > 0) {
703
+ const split = this.splitInlineReasoningTags(delta.text, thinkState);
704
+ if (split.reasoning) {
705
+ this.emitProviderPart(emitter, { type: 'reasoning', content: split.reasoning });
706
+ }
707
+ if (split.text) {
708
+ this.emitProviderPart(emitter, { type: 'text', content: split.text });
709
+ }
710
+ }
711
+ if (typeof delta?.reasoningContent?.text === 'string' && delta.reasoningContent.text.length > 0) {
712
+ this.emitProviderPart(emitter, { type: 'reasoning', content: delta.reasoningContent.text });
713
+ }
714
+ if (delta?.toolUse?.input) {
715
+ const index = event.contentBlockDelta?.contentBlockIndex ?? 0;
716
+ const existing = toolUses.get(index) ?? { id: `tool_${index}`, name: '', inputJson: '' };
717
+ existing.inputJson += delta.toolUse.input;
718
+ toolUses.set(index, existing);
719
+ }
720
+ const stopIndex = event.contentBlockStop?.contentBlockIndex;
721
+ if (stopIndex !== undefined) {
722
+ const toolUse = toolUses.get(stopIndex);
723
+ if (toolUse?.name) {
724
+ this.emitProviderPart(emitter, {
725
+ type: 'tool_call',
726
+ call: {
727
+ id: toolUse.id,
728
+ toolName: toolUse.name,
729
+ input: this.parseToolInput(toolUse.inputJson)
730
+ }
731
+ });
732
+ toolUses.delete(stopIndex);
733
+ }
734
+ }
735
+ }
736
+ if (thinkState.pending) {
737
+ this.emitProviderPart(emitter, {
738
+ type: thinkState.inside ? 'reasoning' : 'text',
739
+ content: thinkState.pending
740
+ });
741
+ }
742
+ }
743
+ catch (error) {
744
+ emitter.fire(`ERROR: ${this.toProviderErrorMessage(error, abort, 'AWS Bedrock')}`);
745
+ }
746
+ finally {
747
+ abort?.dispose();
748
+ emitter.fire(null);
749
+ }
750
+ })();
751
+ return emitter.event;
752
+ }
753
+ webSearch(options, token) {
754
+ return this.webRetrieval.search(options, token);
755
+ }
756
+ webFetch(options, token) {
757
+ return this.webRetrieval.fetch(options, token);
758
+ }
759
+ localEmbeddings(_options, _token) {
760
+ return this.unsupported('local embeddings');
761
+ }
762
+ executeCommandStream(_options, _token) {
763
+ return this.commandService.executeCommandStream(_options, _token);
764
+ }
765
+ startBackgroundCommand(_options) {
766
+ return this.commandService.startBackgroundCommand(_options);
767
+ }
768
+ stopBackgroundCommand(_processId) {
769
+ return this.commandService.stopBackgroundCommand(_processId);
770
+ }
771
+ getBackgroundCommand(_processId) {
772
+ return this.commandService.getBackgroundCommand(_processId);
773
+ }
774
+ listBackgroundCommands() {
775
+ return this.commandService.listBackgroundCommands();
776
+ }
777
+ browserPlaywright(_request) {
778
+ return this.unsupported('integrated browser control');
779
+ }
780
+ loadThreadSession(_sessionId) {
781
+ return Promise.resolve(undefined);
782
+ }
783
+ loadActiveThreadSession(_workspaceId) {
784
+ return Promise.resolve(undefined);
785
+ }
786
+ saveActiveThreadSession(_workspaceId, _session) {
787
+ return this.unsupported('thread persistence');
788
+ }
789
+ publishThreadSession(_update) {
790
+ return this.unsupported('thread persistence');
791
+ }
792
+ clearActiveThreadSession(_workspaceId) {
793
+ return this.unsupported('thread persistence');
794
+ }
795
+ listThreadSessions() {
796
+ return Promise.resolve([]);
797
+ }
798
+ listArchivedThreadSessions(_workspaceId) {
799
+ return Promise.resolve([]);
800
+ }
801
+ archiveThreadSession(_workspaceId, _session) {
802
+ return this.unsupported('thread persistence');
803
+ }
804
+ removeThreadSession(_sessionId) {
805
+ return this.unsupported('thread persistence');
806
+ }
807
+ removeArchivedThreadSession(_workspaceId, _sessionId) {
808
+ return this.unsupported('thread persistence');
809
+ }
810
+ async createGeminiClient(options) {
811
+ const googleModule = await this.importExternalModule('@google/genai');
812
+ const GoogleGenAI = googleModule.GoogleGenAI;
813
+ if (!GoogleGenAI) {
814
+ throw new Error('Google GenAI SDK is installed but did not expose a GoogleGenAI client.');
815
+ }
816
+ return new GoogleGenAI({ apiKey: options.apiKey });
817
+ }
818
+ toGeminiContents(messages) {
819
+ const systemParts = [];
820
+ const contents = [];
821
+ for (let index = 0; index < messages.length; index++) {
822
+ const message = messages[index];
823
+ if (message.role === 'system') {
824
+ systemParts.push(...this.toGeminiParts(message.content));
825
+ continue;
826
+ }
827
+ if (message.role === 'tool') {
828
+ const parts = [];
829
+ while (index < messages.length && messages[index].role === 'tool') {
830
+ const toolMessage = messages[index];
831
+ parts.push({ text: this.toGeminiToolResultTranscriptText(toolMessage) });
832
+ index++;
833
+ }
834
+ index--;
835
+ contents.push({ role: 'user', parts });
836
+ continue;
837
+ }
838
+ const parts = this.toGeminiParts(message.content);
839
+ if (message.role === 'assistant' && message.toolCalls?.length) {
840
+ for (let toolIndex = 0; toolIndex < message.toolCalls.length; toolIndex++) {
841
+ const toolCall = message.toolCalls[toolIndex];
842
+ parts.push({
843
+ text: [
844
+ `Tool call (${toolCall.id || `call_${index}_${toolIndex}`}): ${toolCall.toolName || 'tool'}`,
845
+ `Arguments: ${this.safeStringifyForTranscript(toolCall.input ?? {})}`
846
+ ].join('\n')
847
+ });
848
+ }
849
+ }
850
+ if (parts.length) {
851
+ contents.push({ role: message.role === 'assistant' ? 'model' : 'user', parts });
852
+ }
853
+ }
854
+ return {
855
+ contents,
856
+ systemInstruction: systemParts.length ? { role: 'user', parts: systemParts } : undefined
857
+ };
858
+ }
859
+ toGeminiToolResultTranscriptText(toolMessage) {
860
+ return [
861
+ `Tool result (${toolMessage.toolCallId || 'tool_result'}): ${toolMessage.toolName || 'tool'}`,
862
+ this.messageContentToText(toolMessage.content)
863
+ ].filter(part => typeof part === 'string' && part.trim().length > 0).join('\n');
864
+ }
865
+ safeStringifyForTranscript(value) {
866
+ try {
867
+ return JSON.stringify(value);
868
+ }
869
+ catch {
870
+ return String(value);
871
+ }
872
+ }
873
+ extractGeminiThoughtText(chunk) {
874
+ let thought = '';
875
+ for (const candidate of Array.isArray(chunk?.candidates) ? chunk.candidates : []) {
876
+ for (const part of Array.isArray(candidate?.content?.parts) ? candidate.content.parts : []) {
877
+ if (part?.thought === true && typeof part.text === 'string') {
878
+ thought += part.text;
879
+ }
880
+ }
881
+ }
882
+ return thought || undefined;
883
+ }
884
+ extractGeminiFunctionCallParts(chunk) {
885
+ const calls = [];
886
+ for (const candidate of Array.isArray(chunk?.candidates) ? chunk.candidates : []) {
887
+ for (const part of Array.isArray(candidate?.content?.parts) ? candidate.content.parts : []) {
888
+ if (part?.functionCall) {
889
+ calls.push({
890
+ ...part.functionCall,
891
+ thoughtSignature: typeof part.thoughtSignature === 'string' ? part.thoughtSignature : undefined
892
+ });
893
+ }
894
+ }
895
+ }
896
+ return calls.length > 0 ? calls : (Array.isArray(chunk?.functionCalls) ? chunk.functionCalls : []);
897
+ }
898
+ collectGeminiPendingToolCall(pendingToolCalls, call) {
899
+ const toolName = typeof call?.name === 'string' ? call.name : '';
900
+ if (!toolName) {
901
+ return;
902
+ }
903
+ const input = call.args && typeof call.args === 'object' ? call.args : {};
904
+ const providerId = typeof call.id === 'string' && call.id.length > 0 ? call.id : undefined;
905
+ const key = providerId ? `${providerId}:${toolName}` : `semantic:${toolName}:${JSON.stringify(input)}`;
906
+ const existing = pendingToolCalls.get(key);
907
+ pendingToolCalls.set(key, {
908
+ id: providerId ?? existing?.id ?? `call_${toolName}_${pendingToolCalls.size}`,
909
+ toolName,
910
+ input,
911
+ thoughtSignature: call.thoughtSignature || existing?.thoughtSignature
912
+ });
913
+ }
914
+ toGeminiParts(content) {
915
+ if (typeof content === 'string') {
916
+ return content.trim() ? [{ text: content }] : [];
917
+ }
918
+ if (!Array.isArray(content)) {
919
+ return [];
920
+ }
921
+ return content.map(part => {
922
+ if (part?.type === 'text') {
923
+ return { text: part.text ?? '' };
924
+ }
925
+ if (part?.type === 'image_url' && part.image_url?.url) {
926
+ const match = String(part.image_url.url).match(/^data:(image\/[a-zA-Z0-9.\-+]+);base64,(.*)$/);
927
+ if (match) {
928
+ return { inlineData: { mimeType: match[1], data: match[2] } };
929
+ }
930
+ }
931
+ return null;
932
+ }).filter(Boolean);
933
+ }
934
+ async createBedrockClientConfig(options) {
935
+ const config = { region: options.region };
936
+ if (options.credentialMode === 'accessKey') {
937
+ if (!options.accessKeyId || !options.secretAccessKey) {
938
+ throw new Error('Bedrock access key ID and secret access key are required for manual credential mode.');
939
+ }
940
+ config.credentials = {
941
+ accessKeyId: options.accessKeyId,
942
+ secretAccessKey: options.secretAccessKey,
943
+ sessionToken: options.sessionToken || undefined
944
+ };
945
+ }
946
+ else if (options.credentialMode === 'profile') {
947
+ if (!options.profile) {
948
+ throw new Error('AWS profile name is required for Bedrock profile credential mode.');
949
+ }
950
+ const { fromIni } = await this.importExternalModule('@aws-sdk/credential-provider-ini');
951
+ config.credentials = fromIni({ profile: options.profile });
952
+ }
953
+ else {
954
+ const { defaultProvider } = await this.importExternalModule('@aws-sdk/credential-provider-node');
955
+ config.credentials = defaultProvider();
956
+ }
957
+ return config;
958
+ }
959
+ toProviderConverseRequest(options) {
960
+ const system = [];
961
+ const messages = [];
962
+ for (let index = 0; index < options.messages.length; index++) {
963
+ const message = options.messages[index];
964
+ const text = this.messageContentToText(message.content);
965
+ if (message.role === 'system') {
966
+ if (text) {
967
+ system.push({ text });
968
+ }
969
+ continue;
970
+ }
971
+ if (message.role === 'tool') {
972
+ const content = [];
973
+ while (index < options.messages.length && options.messages[index].role === 'tool') {
974
+ const toolMessage = options.messages[index];
975
+ content.push({
976
+ toolResult: {
977
+ toolUseId: toolMessage.toolCallId || `tool_${index}`,
978
+ content: [{ text: this.messageContentToText(toolMessage.content) }]
979
+ }
980
+ });
981
+ index++;
982
+ }
983
+ index--;
984
+ messages.push({ role: 'user', content });
985
+ continue;
986
+ }
987
+ const content = [];
988
+ if (text) {
989
+ content.push({ text });
990
+ }
991
+ if (message.role === 'assistant' && message.toolCalls?.length) {
992
+ for (const [toolIndex, toolCall] of message.toolCalls.entries()) {
993
+ content.push({
994
+ toolUse: {
995
+ toolUseId: toolCall.id || `tool_${index}_${toolIndex}`,
996
+ name: normalizeToolName(toolCall.toolName, 'bedrock') ?? toolCall.toolName,
997
+ input: toolCall.input ?? {}
998
+ }
999
+ });
1000
+ }
1001
+ }
1002
+ if (content.length) {
1003
+ messages.push({ role: message.role === 'assistant' ? 'assistant' : 'user', content });
1004
+ }
1005
+ }
1006
+ const request = {
1007
+ modelId: options.modelId,
1008
+ messages,
1009
+ inferenceConfig: { maxTokens: options.maxOutputTokens || 16384 }
1010
+ };
1011
+ if (options.temperature !== undefined) {
1012
+ request.inferenceConfig.temperature = options.temperature;
1013
+ }
1014
+ if (options.topP !== undefined) {
1015
+ request.inferenceConfig.topP = options.topP;
1016
+ }
1017
+ if (options.additionalModelRequestFields) {
1018
+ request.additionalModelRequestFields = options.additionalModelRequestFields;
1019
+ }
1020
+ if (system.length) {
1021
+ request.system = system;
1022
+ }
1023
+ const hasToolBlocks = messages.some(message => message.content?.some((block) => block?.toolUse || block?.toolResult));
1024
+ if (options.options?.tools?.length) {
1025
+ request.toolConfig = {
1026
+ tools: options.options.tools.map(tool => ({
1027
+ toolSpec: {
1028
+ name: normalizeToolName(tool.name, 'bedrock') ?? tool.name,
1029
+ description: tool.description,
1030
+ inputSchema: {
1031
+ json: this.providerSchemaNormalizer.normalizeJsonObjectSchema(tool.parametersSchema, { target: 'bedrock', model: options.modelId })
1032
+ }
1033
+ }
1034
+ })),
1035
+ toolChoice: options.options.requiredToolName
1036
+ ? { tool: { name: normalizeToolName(options.options.requiredToolName, 'bedrock') ?? options.options.requiredToolName } }
1037
+ : undefined
1038
+ };
1039
+ }
1040
+ else if (hasToolBlocks) {
1041
+ request.toolConfig = { tools: [] };
1042
+ }
1043
+ return request;
1044
+ }
1045
+ async createOpenAICompatibleClient(options) {
1046
+ const openAIModule = await this.importExternalModule('openai');
1047
+ const azure = options.azure;
1048
+ if (azure) {
1049
+ const AzureOpenAI = openAIModule.AzureOpenAI;
1050
+ if (!AzureOpenAI) {
1051
+ throw new Error('OpenAI SDK is installed but did not expose an AzureOpenAI client.');
1052
+ }
1053
+ return new AzureOpenAI({
1054
+ apiKey: options.apiKey,
1055
+ endpoint: azure.endpoint,
1056
+ deployment: azure.deploymentName,
1057
+ apiVersion: azure.apiVersion || '2024-12-01-preview'
1058
+ });
1059
+ }
1060
+ const OpenAI = openAIModule.OpenAI ?? openAIModule.default;
1061
+ if (!OpenAI) {
1062
+ throw new Error('OpenAI SDK is installed but did not expose an OpenAI client.');
1063
+ }
1064
+ const baseURL = this.resolveOpenAICompatibleBaseUrl(options);
1065
+ const managed = this.isCleanSlateManagedProviderName(options.providerName);
1066
+ const azureV1 = options.providerName === 'Azure AI Foundry';
1067
+ return new OpenAI({
1068
+ apiKey: options.apiKey || (this.isCustomProviderName(options.providerName) ? 'cleanslate-custom-api-key' : ''),
1069
+ baseURL,
1070
+ defaultHeaders: managed
1071
+ ? { 'User-Agent': 'CleanSlate/1.0' }
1072
+ : azureV1 ? { 'api-key': options.apiKey } : undefined,
1073
+ ...(managed ? { maxRetries: 0 } : {})
1074
+ });
1075
+ }
1076
+ async createAnthropicClient(options) {
1077
+ const anthropicModule = await this.importExternalModule('@anthropic-ai/sdk');
1078
+ const Anthropic = anthropicModule.Anthropic ?? anthropicModule.default;
1079
+ if (!Anthropic) {
1080
+ throw new Error('Anthropic SDK is installed but did not expose an Anthropic client.');
1081
+ }
1082
+ return new Anthropic({
1083
+ apiKey: options.apiKey,
1084
+ baseURL: options.baseUrl || undefined
1085
+ });
1086
+ }
1087
+ resolveOpenAICompatibleBaseUrl(options) {
1088
+ if (this.isCleanSlateManagedProviderName(options.providerName)) {
1089
+ return `${this.normalizeEnvValue(process.env['CLEANSLATE_API_BASE_URL']) ?? 'https://api.thewariend.com/api'}/cleanslate`;
1090
+ }
1091
+ const configured = this.normalizeEnvValue(options.baseUrl);
1092
+ if (configured) {
1093
+ return configured;
1094
+ }
1095
+ if (this.isNvidiaProviderName(options.providerName)) {
1096
+ return this.normalizeEnvValue(process.env['CLEANSLATE_NVIDIA_BASE_URL'])
1097
+ || this.normalizeEnvValue(process.env['NVIDIA_BASE_URL'])
1098
+ || 'https://integrate.api.nvidia.com/v1';
1099
+ }
1100
+ if (this.isOpenRouterProviderName(options.providerName)) {
1101
+ return this.normalizeEnvValue(process.env['CLEANSLATE_OPENROUTER_BASE_URL'])
1102
+ || this.normalizeEnvValue(process.env['OPENROUTER_BASE_URL'])
1103
+ || 'https://openrouter.ai/api/v1';
1104
+ }
1105
+ return undefined;
1106
+ }
1107
+ isNvidiaProviderName(providerName) {
1108
+ return typeof providerName === 'string' && providerName.toLowerCase().includes('nvidia');
1109
+ }
1110
+ isOpenRouterProviderName(providerName) {
1111
+ return typeof providerName === 'string' && providerName.toLowerCase().includes('openrouter');
1112
+ }
1113
+ isCustomProviderName(providerName) {
1114
+ return typeof providerName === 'string' && providerName.toLowerCase().includes('custom');
1115
+ }
1116
+ isCleanSlateManagedProviderName(providerName) {
1117
+ return typeof providerName === 'string' && providerName.toLowerCase() === 'cleanslate pro';
1118
+ }
1119
+ normalizeEnvValue(value) {
1120
+ const trimmed = value?.trim();
1121
+ return trimmed ? trimmed.replace(/\/+$/, '') : undefined;
1122
+ }
1123
+ async importExternalModule(specifier) {
1124
+ return import(specifier);
1125
+ }
1126
+ createProviderAbortController(token, timeoutMs) {
1127
+ const controller = new AbortController();
1128
+ let timeoutHandle;
1129
+ let timedOut = false;
1130
+ const clearTimer = () => {
1131
+ if (timeoutHandle) {
1132
+ clearTimeout(timeoutHandle);
1133
+ timeoutHandle = undefined;
1134
+ }
1135
+ };
1136
+ const armTimer = () => {
1137
+ clearTimer();
1138
+ if (timeoutMs > 0 && !controller.signal.aborted) {
1139
+ timeoutHandle = setTimeout(() => {
1140
+ timedOut = true;
1141
+ controller.abort();
1142
+ }, timeoutMs);
1143
+ }
1144
+ };
1145
+ const cancellation = token.onCancellationRequested(() => controller.abort());
1146
+ if (token.isCancellationRequested) {
1147
+ controller.abort();
1148
+ }
1149
+ else {
1150
+ armTimer();
1151
+ }
1152
+ return {
1153
+ signal: controller.signal,
1154
+ touch: armTimer,
1155
+ dispose: () => {
1156
+ clearTimer();
1157
+ cancellation.dispose();
1158
+ },
1159
+ isTimedOut: () => timedOut,
1160
+ timeoutMs
1161
+ };
1162
+ }
1163
+ toProviderErrorMessage(error, abort, operation) {
1164
+ if (abort?.isTimedOut()) {
1165
+ return `${operation} did not receive provider activity for ${Math.round(abort.timeoutMs / 1000)} seconds. Check the endpoint, API version, deployment/model name, credentials, and network.`;
1166
+ }
1167
+ return error instanceof Error ? error.message : String(error);
1168
+ }
1169
+ messageContentToText(content) {
1170
+ if (typeof content === 'string') {
1171
+ return content;
1172
+ }
1173
+ if (Array.isArray(content)) {
1174
+ return content
1175
+ .filter(part => part?.type === 'text')
1176
+ .map(part => part.text ?? '')
1177
+ .filter(text => text.length > 0)
1178
+ .join('\n');
1179
+ }
1180
+ return '';
1181
+ }
1182
+ parseToolInput(inputJson) {
1183
+ if (!inputJson || inputJson.trim().length === 0) {
1184
+ return {};
1185
+ }
1186
+ try {
1187
+ return JSON.parse(inputJson);
1188
+ }
1189
+ catch (error) {
1190
+ return {
1191
+ __cleanSlateArgumentsParseError: `failed to parse function arguments: ${error instanceof Error ? error.message : String(error)}`,
1192
+ __cleanSlateRawArguments: inputJson.slice(0, 400)
1193
+ };
1194
+ }
1195
+ }
1196
+ emitProviderPart(emitter, part) {
1197
+ emitter.fire(`data: ${JSON.stringify(part)}\n\n`);
1198
+ }
1199
+ toProviderUsage(usage) {
1200
+ if (!usage || typeof usage !== 'object') {
1201
+ return undefined;
1202
+ }
1203
+ const asNonNegativeInteger = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0
1204
+ ? Math.floor(value)
1205
+ : undefined;
1206
+ const inputTokens = asNonNegativeInteger(usage.input_tokens ?? usage.prompt_tokens);
1207
+ const outputTokens = asNonNegativeInteger(usage.output_tokens ?? usage.completion_tokens);
1208
+ const totalTokens = asNonNegativeInteger(usage.total_tokens);
1209
+ const cachedInputTokens = asNonNegativeInteger(usage.input_tokens_details?.cached_tokens ?? usage.prompt_tokens_details?.cached_tokens);
1210
+ if (inputTokens === undefined && outputTokens === undefined && totalTokens === undefined) {
1211
+ return undefined;
1212
+ }
1213
+ return { inputTokens, outputTokens, totalTokens, cachedInputTokens };
1214
+ }
1215
+ splitInlineReasoningTags(delta, state) {
1216
+ const OPEN = '<think>';
1217
+ const CLOSE = '</think>';
1218
+ state.pending += delta;
1219
+ let reasoning = '';
1220
+ let text = '';
1221
+ while (state.pending.length > 0) {
1222
+ if (state.inside) {
1223
+ const idx = state.pending.indexOf(CLOSE);
1224
+ if (idx === -1) {
1225
+ const held = this.holdPartialTagSuffix(state.pending, CLOSE);
1226
+ reasoning += state.pending.slice(0, state.pending.length - held);
1227
+ state.pending = state.pending.slice(state.pending.length - held);
1228
+ break;
1229
+ }
1230
+ reasoning += state.pending.slice(0, idx);
1231
+ state.pending = state.pending.slice(idx + CLOSE.length);
1232
+ state.inside = false;
1233
+ continue;
1234
+ }
1235
+ const openIdx = state.pending.indexOf(OPEN);
1236
+ const closeIdx = state.sawOpen ? -1 : state.pending.indexOf(CLOSE);
1237
+ if (closeIdx !== -1 && (openIdx === -1 || closeIdx < openIdx)) {
1238
+ reasoning += state.pending.slice(0, closeIdx);
1239
+ state.pending = state.pending.slice(closeIdx + CLOSE.length);
1240
+ state.sawOpen = true;
1241
+ continue;
1242
+ }
1243
+ if (openIdx !== -1) {
1244
+ text += state.pending.slice(0, openIdx);
1245
+ state.pending = state.pending.slice(openIdx + OPEN.length);
1246
+ state.inside = true;
1247
+ state.sawOpen = true;
1248
+ continue;
1249
+ }
1250
+ if (state.holdLeading && !state.sawOpen) {
1251
+ if (state.pending.length <= LEADING_REASONING_HOLD_CAP_CHARS) {
1252
+ break;
1253
+ }
1254
+ state.holdLeading = false;
1255
+ }
1256
+ const holdOpen = this.holdPartialTagSuffix(state.pending, OPEN);
1257
+ const holdClose = state.sawOpen ? 0 : this.holdPartialTagSuffix(state.pending, CLOSE);
1258
+ const held = Math.max(holdOpen, holdClose);
1259
+ text += state.pending.slice(0, state.pending.length - held);
1260
+ state.pending = state.pending.slice(state.pending.length - held);
1261
+ break;
1262
+ }
1263
+ return { reasoning, text };
1264
+ }
1265
+ holdPartialTagSuffix(s, tag) {
1266
+ const max = Math.min(tag.length - 1, s.length);
1267
+ for (let k = max; k > 0; k--) {
1268
+ if (s.slice(s.length - k) === tag.slice(0, k)) {
1269
+ return k;
1270
+ }
1271
+ }
1272
+ return 0;
1273
+ }
1274
+ extractOpenAICompatibleReasoningDelta(delta) {
1275
+ if (!delta) {
1276
+ return undefined;
1277
+ }
1278
+ const candidate = delta.reasoning_content ?? delta.reasoning;
1279
+ if (typeof candidate === 'string' && candidate.length > 0) {
1280
+ return candidate;
1281
+ }
1282
+ if (Array.isArray(delta.reasoning_details)) {
1283
+ const joined = delta.reasoning_details
1284
+ .map((entry) => (typeof entry?.text === 'string' ? entry.text : ''))
1285
+ .join('');
1286
+ if (joined.length > 0) {
1287
+ return joined;
1288
+ }
1289
+ }
1290
+ return undefined;
1291
+ }
1292
+ unsupported(capability) {
1293
+ return Promise.reject(new Error(`${capability} is not supported on the Node CLI surface.`));
1294
+ }
1295
+ unsupportedEvent(capability) {
1296
+ const emitter = new Emitter();
1297
+ queueMicrotask(() => {
1298
+ emitter.fire(`ERROR: ${capability} is not supported on the Node CLI surface.`);
1299
+ emitter.fire(null);
1300
+ });
1301
+ return emitter.event;
1302
+ }
1303
+ }
1304
+ //# sourceMappingURL=cleanSlateNodeMainService.js.map