@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,741 @@
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 { resolvePathToUri, isUriInIdeWorkspace, resolveTextModelHeadless } from './utils.js';
6
+ import { URI } from '../core/uri.js';
7
+ import { CleanSlateEditService } from '../services/cleanSlateEditService.js';
8
+ import { CleanSlateDiffService } from '../services/cleanSlateDiffService.js';
9
+ import { canonicalizeStructuredEdits } from './structuredEditCanonicalizer.js';
10
+ import { CleanSlateFileHistory } from '../services/cleanSlateFileHistory.js';
11
+ /**
12
+ * Tool: apply_edit
13
+ */
14
+ export const applyEditTool = {
15
+ name: 'apply_edit',
16
+ description: 'Performs an exact string replacement in an existing file. The file must have been read first. old_string must identify one current occurrence unless replace_all is true. Successful edits update the host read state, so the file only needs to be read again after an external change or a failed match.',
17
+ category: "edit",
18
+ parametersSchema: {
19
+ type: 'object',
20
+ additionalProperties: false,
21
+ properties: {
22
+ file_path: { type: 'string', description: 'The absolute path to the file to modify.' },
23
+ old_string: { type: 'string', description: 'The exact current text to replace. Include enough surrounding text to make it unique.' },
24
+ new_string: { type: 'string', description: 'The replacement text. It must differ from old_string.' },
25
+ replace_all: { type: 'boolean', description: 'Replace every exact occurrence of old_string. Defaults to false.' }
26
+ },
27
+ required: ['file_path', 'old_string', 'new_string']
28
+ },
29
+ async run(input, context) {
30
+ // Restored sessions may still carry the old structured shape, but new
31
+ // model calls only see the exact-string schema above.
32
+ const requestedPath = input.file_path ?? input.path;
33
+ if (!requestedPath)
34
+ throw new Error('apply_edit: The "file_path" parameter is required.');
35
+ input = { ...input, path: requestedPath };
36
+ const uri = resolvePathToUri(requestedPath, context, { allowWorkspaceRootRelativeAbsolute: false });
37
+ // Reveal/decorate the edit in the IDE editor only when the file belongs to the project the
38
+ // IDE currently has open. A cross-project Agent Manager session still applies the edit to
39
+ // disk headlessly; it just must not surface the file in the other project's editor.
40
+ const revealInEditor = isUriInIdeWorkspace(context, uri);
41
+ try {
42
+ // 0. Force background resolution to 'warm up' the Language Server for this file
43
+ await context.textFileService.files.resolve(uri);
44
+ // 1. Resolve the model (without opening a visible editor).
45
+ let model = context.modelService.getModel(uri);
46
+ if (!model) {
47
+ model = await resolveTextModelHeadless(uri, context);
48
+ }
49
+ if (!model)
50
+ throw new Error(`apply_edit: Could not load model for ${requestedPath}.`);
51
+ // Only bring the file into a visible editor when revealing in the IDE is appropriate.
52
+ let editor = null;
53
+ if (revealInEditor) {
54
+ const activeEditor = context.codeEditorService.getActiveCodeEditor();
55
+ if (!activeEditor || activeEditor.getModel()?.uri.toString() !== uri.toString()) {
56
+ await context.codeEditorService.openCodeEditor({ resource: uri }, activeEditor);
57
+ }
58
+ editor = context.codeEditorService.getActiveCodeEditor();
59
+ // No editor means nothing to reveal into — a headless host, or a
60
+ // reveal the workbench declined. The edit still applies to disk;
61
+ // only the on-screen diff is skipped.
62
+ }
63
+ const beforeContent = model.getValue();
64
+ const beforeVersionId = model.getVersionId();
65
+ const normalizedRequest = normalizeApplyEditRequest(input, beforeContent);
66
+ if (!normalizedRequest.ok) {
67
+ return { success: false, path: uri.fsPath, ...normalizedRequest.result };
68
+ }
69
+ input = { ...input, edits: normalizedRequest.edits };
70
+ const readGuard = await validateReadBeforeEdit(uri, beforeVersionId, input, context, beforeContent);
71
+ if (!readGuard.ok) {
72
+ return readGuard.result;
73
+ }
74
+ // 2. Canonicalize the exact replacement (legacy restored sessions may still carry structured edits).
75
+ const canonicalizedEdits = await canonicalizeStructuredEdits(requestedPath, model, input.edits, context);
76
+ if (!canonicalizedEdits.ok) {
77
+ return canonicalizedEdits.failure;
78
+ }
79
+ const rangeBudgetGuard = validateSourceCodeRangeEditBudget(model, canonicalizedEdits.edits, uri.fsPath);
80
+ if (!rangeBudgetGuard.ok) {
81
+ return rangeBudgetGuard.result;
82
+ }
83
+ const versionGuard = resolveSafeExpectedVersionId(model, input, readGuard.readState, canonicalizedEdits.edits, uri.fsPath);
84
+ if (!versionGuard.ok) {
85
+ return versionGuard.result;
86
+ }
87
+ const plan = CleanSlateEditService.planEdits(model, {
88
+ edits: canonicalizedEdits.edits,
89
+ expectedVersionId: versionGuard.expectedVersionId
90
+ });
91
+ if (!plan.ok) {
92
+ const primaryDiagnostic = plan.diagnostics[0];
93
+ return {
94
+ success: false,
95
+ path: uri.fsPath,
96
+ code: primaryDiagnostic?.code ?? 'invalid_input',
97
+ primaryDiagnostic,
98
+ diagnostics: plan.diagnostics,
99
+ allMatches: primaryDiagnostic?.allMatches,
100
+ recoveryHint: CleanSlateEditService.buildRecoveryHint(primaryDiagnostic, model),
101
+ attemptedEdits: input.edits.length,
102
+ currentVersionId: model.getVersionId(),
103
+ message: CleanSlateEditService.formatFailure(plan)
104
+ };
105
+ }
106
+ const rewriteAssessment = assessRewriteScope(model, plan.edits, uri.fsPath);
107
+ // Keep the write path deterministic and extension-host independent.
108
+ // Syntax/semantic diagnostics are collected after the edit through the
109
+ // normal editor marker pipeline instead of invoking Tree-sitter here.
110
+ const preflightDiagnostics = [];
111
+ // 3. Capture Pre-Application State
112
+ const appliedChanges = plan.edits.map((e) => ({
113
+ range: e.range,
114
+ oldText: model.getValueInRange(e.range),
115
+ newText: e.text,
116
+ strategy: e.strategy,
117
+ sourceMode: e.sourceMode,
118
+ confidence: e.confidence,
119
+ matchCount: e.matchCount
120
+ }));
121
+ const plannedAdded = appliedChanges.reduce((sum, change) => sum + change.newText.split('\n').length, 0);
122
+ const plannedDeleted = appliedChanges.reduce((sum, change) => sum + change.oldText.split('\n').length, 0);
123
+ const workspaceId = context.workspaceContextService.getWorkspace().id;
124
+ const storageRoot = context.environmentService ? URI.joinPath(context.environmentService.workspaceStorageHome, workspaceId) : undefined;
125
+ const historyEntry = await CleanSlateFileHistory.trackEdit({
126
+ workspaceRoot: context.workspaceContextService.getWorkspaceFolder(uri)?.uri,
127
+ storageRoot,
128
+ resource: uri,
129
+ fileService: context.fileService,
130
+ modelService: context.modelService,
131
+ operation: input.historyOperation ?? 'apply_edit',
132
+ toolName: input.historyToolName ?? applyEditTool.name,
133
+ versionId: beforeVersionId
134
+ });
135
+ const markerBaseline = CleanSlateEditService.captureMarkerValidationBaseline(context.markerService, uri);
136
+ const markerRefreshWaiter = CleanSlateEditService.createMarkerRefreshWaiter(context.markerService, uri);
137
+ // 4. PHYSICAL APPLICATION (in-memory first; persisted only after validation)
138
+ const commitReadGuard = await validateReadBeforeEdit(uri, beforeVersionId, input, context, beforeContent);
139
+ if (!commitReadGuard.ok) {
140
+ markerRefreshWaiter.dispose();
141
+ return commitReadGuard.result;
142
+ }
143
+ try {
144
+ model.pushStackElement(); // Create undo point
145
+ model.pushEditOperations(null, plan.edits.map((e) => ({ range: e.range, text: e.text })), () => null);
146
+ model.pushStackElement();
147
+ }
148
+ catch (error) {
149
+ markerRefreshWaiter.dispose();
150
+ throw error;
151
+ }
152
+ // 5. PRE-SAVE VALIDATION
153
+ const markerValidation = await CleanSlateEditService.validateMarkersAfterEdit(context.markerService, uri, markerBaseline, markerRefreshWaiter);
154
+ const postApplyDiagnostics = markerValidation.ok ? [] : markerValidation.issues;
155
+ // 6. AUTO-SAVE ENFORCEMENT
156
+ await context.textFileService.save(uri);
157
+ const afterContent = model.getValue();
158
+ const afterVersionId = model.getVersionId();
159
+ context.readFileState?.set(uri.toString(), {
160
+ path: uri.fsPath,
161
+ uri: uri.toString(),
162
+ content: afterContent,
163
+ currentVersionId: afterVersionId,
164
+ mtime: await getFileMtime(uri, context),
165
+ totalLines: afterContent.split('\n').length,
166
+ isPartialView: false,
167
+ readAt: Date.now()
168
+ });
169
+ if (afterContent === beforeContent) {
170
+ return {
171
+ success: true,
172
+ path: uri.fsPath,
173
+ code: 'no_op',
174
+ attemptedEdits: input.edits.length,
175
+ currentVersionId: afterVersionId,
176
+ rewriteAssessment,
177
+ message: `NO_OP: The file content already matches the target for ${uri.fsPath}. No changes were necessary.`
178
+ };
179
+ }
180
+ // 7. Visual Decorations (Post-Apply Mode) — only when the file was revealed in the IDE.
181
+ if (editor && context.editorDecorationHost) {
182
+ // The host expects originalEdits shaped for the diff overlay.
183
+ const originalEditsForUI = appliedChanges.map(c => ({
184
+ range: c.range,
185
+ text: c.oldText,
186
+ originalStartLine: c.range.startLineNumber
187
+ }));
188
+ context.editorDecorationHost.showPostApply(uri, plan.edits, originalEditsForUI, beforeContent);
189
+ }
190
+ // 8. Generate Granular Feedback for the Agent
191
+ const totalLinesChanged = appliedChanges.reduce((sum, c) => sum + (c.range.endLineNumber - c.range.startLineNumber + 1), 0);
192
+ const diffSnippet = CleanSlateDiffService.renderUnifiedDiff(uri.fsPath, beforeContent, plan.edits.map(e => ({ range: e.range, text: e.text })));
193
+ const appliedWithDiagnostics = preflightDiagnostics.length > 0 || postApplyDiagnostics.length > 0;
194
+ const diagnosticsSummary = [
195
+ ...preflightDiagnostics.map(diagnostic => `[${diagnostic.code}] ${diagnostic.message}`),
196
+ ...postApplyDiagnostics.map(issue => `[marker] ${issue.message} (${issue.startLineNumber}:${issue.startColumn})`)
197
+ ];
198
+ return {
199
+ success: true,
200
+ path: uri.fsPath,
201
+ appliedBlocks: plan.edits.length,
202
+ added: plannedAdded,
203
+ deleted: plannedDeleted,
204
+ totalLinesChanged,
205
+ strategies: [...new Set(plan.edits.map(edit => edit.strategy))],
206
+ previousVersionId: beforeVersionId,
207
+ currentVersionId: afterVersionId,
208
+ versionGuardAdjustedFrom: versionGuard.adjustedFrom,
209
+ historyEntryId: historyEntry?.id,
210
+ rewriteAssessment,
211
+ appliedWithDiagnostics,
212
+ diagnostics: diagnosticsSummary,
213
+ preflightDiagnostics,
214
+ postApplyDiagnostics,
215
+ changes: appliedChanges.map(c => ({
216
+ lines: `${c.range.startLineNumber}-${c.range.endLineNumber}`,
217
+ strategy: c.strategy,
218
+ sourceMode: c.sourceMode,
219
+ confidence: c.confidence,
220
+ matchCount: c.matchCount,
221
+ preview: `-${c.oldText.split('\n')[0]}\n+${c.newText.split('\n')[0]}`
222
+ })),
223
+ diff: diffSnippet,
224
+ beforeContent,
225
+ afterContent,
226
+ message: appliedWithDiagnostics
227
+ ? `SUCCESS WITH DIAGNOSTICS: Applied ${plan.edits.length} change(s) to ${uri.fsPath}. New syntax/compiler diagnostics were preserved for the agent to fix in follow-up edits.`
228
+ : `SUCCESS: Applied ${plan.edits.length} change(s) to ${uri.fsPath}. See 'diff' for details.`
229
+ };
230
+ }
231
+ catch (err) {
232
+ throw new Error(`Failed to apply edit to ${requestedPath}: ${String(err)}`);
233
+ }
234
+ }
235
+ };
236
+ export function normalizeApplyEditRequest(input, currentContent) {
237
+ if (typeof input.old_string === 'string' || typeof input.new_string === 'string') {
238
+ if (typeof input.old_string !== 'string' || typeof input.new_string !== 'string') {
239
+ return {
240
+ ok: false,
241
+ result: {
242
+ code: 'invalid_input',
243
+ message: 'apply_edit requires both "old_string" and "new_string".'
244
+ }
245
+ };
246
+ }
247
+ if (input.old_string.length === 0) {
248
+ return {
249
+ ok: false,
250
+ result: {
251
+ code: 'invalid_input',
252
+ message: 'apply_edit edits existing files; "old_string" must not be empty. Use write_file for a new file.'
253
+ }
254
+ };
255
+ }
256
+ if (input.old_string === input.new_string) {
257
+ return {
258
+ ok: false,
259
+ result: {
260
+ code: 'no_op',
261
+ message: 'No changes to make: old_string and new_string are exactly the same.'
262
+ }
263
+ };
264
+ }
265
+ const actualOldString = findActualString(currentContent, input.old_string);
266
+ if (!actualOldString) {
267
+ return {
268
+ ok: false,
269
+ result: {
270
+ code: 'no_match',
271
+ matchCount: 0,
272
+ message: `String to replace not found in file.\nString: ${input.old_string}`
273
+ }
274
+ };
275
+ }
276
+ const matchIndexes = findAllMatchIndexes(currentContent, actualOldString);
277
+ if (matchIndexes.length > 1 && input.replace_all !== true) {
278
+ return {
279
+ ok: false,
280
+ result: {
281
+ code: 'ambiguous_match',
282
+ matchCount: matchIndexes.length,
283
+ allMatches: matchIndexes.slice(0, 8).map(index => {
284
+ const candidate = buildMatchCandidate(currentContent, index, actualOldString.length);
285
+ return {
286
+ lineNumber: candidate.startLine,
287
+ endLineNumber: candidate.endLine,
288
+ lineContent: candidate.content,
289
+ confidence: 1
290
+ };
291
+ }),
292
+ message: `Found ${matchIndexes.length} matches of old_string. Provide more surrounding context to make it unique, or set replace_all to true.`
293
+ }
294
+ };
295
+ }
296
+ const actualNewString = CleanSlateEditService.preserveQuoteStyle(input.old_string, actualOldString, input.new_string);
297
+ if (input.replace_all === true) {
298
+ return {
299
+ ok: true,
300
+ edits: [{
301
+ mode: 'full_file',
302
+ content: currentContent.split(actualOldString).join(actualNewString)
303
+ }]
304
+ };
305
+ }
306
+ return {
307
+ ok: true,
308
+ edits: [{
309
+ mode: 'replace_exact',
310
+ originalText: actualOldString,
311
+ replacementText: actualNewString
312
+ }]
313
+ };
314
+ }
315
+ if (Array.isArray(input.edits) && input.edits.length > 0) {
316
+ return { ok: true, edits: input.edits };
317
+ }
318
+ return {
319
+ ok: false,
320
+ result: {
321
+ code: 'invalid_input',
322
+ message: 'apply_edit requires "file_path", "old_string", and "new_string".'
323
+ }
324
+ };
325
+ }
326
+ export async function validateReadBeforeEdit(uri, currentVersionId, input, context, currentContent) {
327
+ const readState = getReadFileState(uri, context);
328
+ if (!readState) {
329
+ return {
330
+ ok: false,
331
+ result: {
332
+ success: false,
333
+ path: uri.fsPath,
334
+ code: 'file_not_read',
335
+ currentVersionId,
336
+ message: 'File has not been read yet. Read it first before editing it.',
337
+ recoveryHint: 'Call read_file or read_file_range for the target file, then retry the edit using current content and version information.'
338
+ }
339
+ };
340
+ }
341
+ const edits = input.edits ?? [];
342
+ const needsWholeFileRead = edits.some(edit => edit.mode === 'full_file');
343
+ if (typeof readState.currentVersionId === 'number' && readState.currentVersionId !== currentVersionId) {
344
+ return {
345
+ ok: false,
346
+ result: {
347
+ success: false,
348
+ path: uri.fsPath,
349
+ code: 'file_changed',
350
+ previousReadVersionId: readState.currentVersionId,
351
+ currentVersionId,
352
+ message: 'File has been modified since it was read. Re-read it before attempting to edit it.',
353
+ recoveryHint: 'Call read_file or read_file_range again and prepare the edit from the fresh result.'
354
+ }
355
+ };
356
+ }
357
+ if ((typeof readState.currentVersionId !== 'number' || needsWholeFileRead)
358
+ && !readState.isPartialView
359
+ && typeof readState.content === 'string'
360
+ && typeof currentContent === 'string'
361
+ && readState.content !== currentContent) {
362
+ return {
363
+ ok: false,
364
+ result: {
365
+ success: false,
366
+ path: uri.fsPath,
367
+ code: 'file_changed',
368
+ currentVersionId,
369
+ message: 'File content has changed since it was read. Re-read it before attempting to edit it.',
370
+ recoveryHint: 'Call read_file again and prepare the edit from the fresh result.'
371
+ }
372
+ };
373
+ }
374
+ const currentMtime = await getFileMtime(uri, context);
375
+ if ((typeof readState.currentVersionId !== 'number' || needsWholeFileRead)
376
+ && typeof readState.mtime === 'number'
377
+ && typeof currentMtime === 'number'
378
+ && currentMtime > readState.mtime) {
379
+ return {
380
+ ok: false,
381
+ result: {
382
+ success: false,
383
+ path: uri.fsPath,
384
+ code: 'file_changed',
385
+ previousReadMtime: readState.mtime,
386
+ currentMtime,
387
+ currentVersionId,
388
+ message: 'File has been modified since it was read. Re-read it before attempting to edit it.',
389
+ recoveryHint: 'Call read_file or read_file_range again and prepare the edit from the fresh result.'
390
+ }
391
+ };
392
+ }
393
+ const rangeAnchorGuard = validateFreshReplaceRangeAnchors(uri.fsPath, currentVersionId, currentContent ?? '', edits, readState);
394
+ if (!rangeAnchorGuard.ok) {
395
+ return rangeAnchorGuard;
396
+ }
397
+ if (readState.isPartialView && needsWholeFileRead) {
398
+ return {
399
+ ok: false,
400
+ result: {
401
+ success: false,
402
+ path: uri.fsPath,
403
+ code: 'partial_read_before_structural_edit',
404
+ currentVersionId,
405
+ message: 'Only a partial view of this file has been read. Whole-file (full_file) edits require a full current file read first.',
406
+ recoveryHint: 'Use read_file for the full file before retrying, then provide an exact old_string from the current result.'
407
+ }
408
+ };
409
+ }
410
+ return { ok: true, readState };
411
+ }
412
+ export async function getFileMtime(uri, context) {
413
+ try {
414
+ return (await context.fileService.stat(uri)).mtime;
415
+ }
416
+ catch {
417
+ return undefined;
418
+ }
419
+ }
420
+ function getReadFileState(uri, context) {
421
+ const exact = context.readFileState?.get(uri.toString());
422
+ if (exact) {
423
+ return exact;
424
+ }
425
+ for (const state of context.readFileState?.values() ?? []) {
426
+ if (state.path === uri.fsPath || state.uri === uri.toString()) {
427
+ return state;
428
+ }
429
+ }
430
+ return undefined;
431
+ }
432
+ export function validateFreshReplaceRangeAnchors(path, currentVersionId, currentContent, edits, readState) {
433
+ const failures = [];
434
+ for (let editIndex = 0; editIndex < edits.length; editIndex++) {
435
+ const edit = edits[editIndex];
436
+ if (edit.mode !== 'replace_range'
437
+ || typeof edit.startLine !== 'number'
438
+ || typeof edit.endLine !== 'number') {
439
+ continue;
440
+ }
441
+ const startLine = Math.max(1, Math.floor(edit.startLine));
442
+ const endLine = Math.max(startLine, Math.floor(edit.endLine));
443
+ const requestedRange = { startLine, endLine };
444
+ const currentRangeContent = getLineRangeContent(currentContent, startLine, endLine);
445
+ // String-anchor-first grounding:
446
+ // a unique originalText match against the CURRENT file
447
+ // content proves the edit targets reality, regardless of line
448
+ // coordinates — every applied edit shifts lines, so range-read
449
+ // evidence goes stale constantly, and the edit service resyncs the
450
+ // range to the exact match anyway. Requiring per-range read evidence
451
+ // first rejected edits the applier could perform safely, causing
452
+ // read → fail → re-read churn.
453
+ const hasTextAnchor = typeof edit.originalText === 'string' && edit.originalText.length > 0;
454
+ if (hasTextAnchor) {
455
+ const actualOldString = findActualString(currentContent, edit.originalText);
456
+ if (!actualOldString) {
457
+ failures.push({
458
+ path,
459
+ editIndex,
460
+ code: 'no_match',
461
+ message: `String to replace was not found for edit ${editIndex + 1}. Re-read the requested range and use its current text.`,
462
+ requestedRange,
463
+ currentContent: currentRangeContent,
464
+ matchCount: 0
465
+ });
466
+ continue;
467
+ }
468
+ const matchIndexes = findAllMatchIndexes(currentContent, actualOldString);
469
+ if (matchIndexes.length > 1) {
470
+ failures.push({
471
+ path,
472
+ editIndex,
473
+ code: 'ambiguous_match',
474
+ message: `Found ${matchIndexes.length} matches for edit ${editIndex + 1}. Provide more current surrounding text so old_string is unique.`,
475
+ requestedRange,
476
+ currentContent: currentRangeContent,
477
+ matchCount: matchIndexes.length,
478
+ candidates: matchIndexes.slice(0, 8).map(index => buildMatchCandidate(currentContent, index, actualOldString.length))
479
+ });
480
+ }
481
+ continue;
482
+ }
483
+ // No text anchor: line coordinates are the only grounding, so they
484
+ // must be covered by a read of the current file version.
485
+ if (!hasFreshReadEvidence(readState, currentVersionId, startLine, endLine)) {
486
+ failures.push({
487
+ path,
488
+ editIndex,
489
+ code: 'range_not_read',
490
+ message: `Edit ${editIndex + 1} is not covered by a current read of lines ${startLine}-${endLine}.`,
491
+ requestedRange,
492
+ currentContent: currentRangeContent
493
+ });
494
+ }
495
+ }
496
+ if (failures.length === 0) {
497
+ return { ok: true };
498
+ }
499
+ const diagnostics = failures.map(failure => ({
500
+ code: failure.code,
501
+ blockIndex: failure.editIndex,
502
+ message: failure.message,
503
+ snippet: failure.currentContent,
504
+ matchCount: failure.matchCount,
505
+ allMatches: failure.candidates?.map(candidate => ({
506
+ lineNumber: candidate.startLine,
507
+ endLineNumber: candidate.endLine,
508
+ lineContent: candidate.content,
509
+ confidence: 1
510
+ })),
511
+ preferredRecoveryMode: 'replace_range'
512
+ }));
513
+ return {
514
+ ok: false,
515
+ result: {
516
+ success: false,
517
+ path,
518
+ code: 'edit_batch_preflight_failed',
519
+ primaryDiagnostic: diagnostics[0],
520
+ diagnostics,
521
+ failures,
522
+ attemptedEdits: edits.length,
523
+ currentVersionId,
524
+ recoveryHint: 'Retry exactly one failed edit at a time with an exact current old_string from the candidate context.',
525
+ message: `Edit preflight failed for ${failures.length} of ${edits.length} edit(s). No changes were applied.`
526
+ }
527
+ };
528
+ }
529
+ function hasFreshReadEvidence(readState, currentVersionId, startLine, endLine) {
530
+ if (!readState.isPartialView
531
+ && (readState.currentVersionId === currentVersionId || typeof readState.currentVersionId !== 'number')) {
532
+ return true;
533
+ }
534
+ return (readState.ranges ?? []).some(range => range.startLine <= startLine
535
+ && range.endLine >= endLine
536
+ && range.currentVersionId === readState.currentVersionId
537
+ && range.mtime === readState.mtime);
538
+ }
539
+ /**
540
+ * Returns the span of `fileContent` the model was aiming at, as the file
541
+ * actually spells it. A model writes straight quotes, so an exact hit is tried
542
+ * first and a quote-insensitive comparison is the fallback. Quote normalization
543
+ * is a character-for-character substitution, so offsets in the normalized text
544
+ * map straight back onto the original.
545
+ */
546
+ function findActualString(fileContent, searchString) {
547
+ const exactIndex = fileContent.indexOf(searchString);
548
+ if (exactIndex !== -1) {
549
+ return searchString;
550
+ }
551
+ const foldedIndex = CleanSlateEditService.normalizeQuotes(fileContent)
552
+ .indexOf(CleanSlateEditService.normalizeQuotes(searchString));
553
+ if (foldedIndex === -1) {
554
+ return undefined;
555
+ }
556
+ return fileContent.slice(foldedIndex, foldedIndex + searchString.length);
557
+ }
558
+ function findAllMatchIndexes(content, search) {
559
+ const indexes = [];
560
+ let searchFrom = 0;
561
+ while (searchFrom <= content.length - search.length) {
562
+ const index = content.indexOf(search, searchFrom);
563
+ if (index === -1) {
564
+ break;
565
+ }
566
+ indexes.push(index);
567
+ searchFrom = index + search.length;
568
+ }
569
+ return indexes;
570
+ }
571
+ function getLineRangeContent(content, startLine, endLine) {
572
+ const lines = content.split('\n');
573
+ return clipRecoveryContent(lines.slice(startLine - 1, Math.min(endLine, lines.length)).join('\n'));
574
+ }
575
+ function buildMatchCandidate(content, matchIndex, matchLength) {
576
+ const startLine = countLinesBeforeOffset(content, matchIndex);
577
+ const endLine = startLine + content.slice(matchIndex, matchIndex + matchLength).split('\n').length - 1;
578
+ const lines = content.split('\n');
579
+ const contextStart = Math.max(1, startLine - 3);
580
+ const contextEnd = Math.min(lines.length, endLine + 3);
581
+ return {
582
+ startLine,
583
+ endLine,
584
+ content: clipRecoveryContent(lines.slice(contextStart - 1, contextEnd).join('\n'))
585
+ };
586
+ }
587
+ function countLinesBeforeOffset(content, offset) {
588
+ let line = 1;
589
+ for (let index = 0; index < offset; index++) {
590
+ if (content.charCodeAt(index) === 10) {
591
+ line++;
592
+ }
593
+ }
594
+ return line;
595
+ }
596
+ function clipRecoveryContent(content) {
597
+ return content.length <= 4000 ? content : `${content.slice(0, 4000)}\n[... clipped ...]`;
598
+ }
599
+ export function resolveSafeExpectedVersionId(model, input, readState, edits, path) {
600
+ const currentVersionId = model.getVersionId();
601
+ const requestedVersionId = typeof input.expectedVersionId === 'number' ? input.expectedVersionId : undefined;
602
+ const readVersionId = typeof readState.currentVersionId === 'number' ? readState.currentVersionId : undefined;
603
+ if (requestedVersionId === undefined || requestedVersionId === currentVersionId) {
604
+ return { ok: true, expectedVersionId: readVersionId ?? currentVersionId };
605
+ }
606
+ if (readVersionId === currentVersionId && editsHaveStrongAnchors(edits)) {
607
+ return {
608
+ ok: true,
609
+ expectedVersionId: currentVersionId,
610
+ adjustedFrom: requestedVersionId
611
+ };
612
+ }
613
+ return {
614
+ ok: false,
615
+ result: {
616
+ success: false,
617
+ path,
618
+ code: 'stale_expected_version_without_anchor',
619
+ expectedVersionId: requestedVersionId,
620
+ currentVersionId,
621
+ readVersionId,
622
+ message: `The edit used stale expectedVersionId ${requestedVersionId}, but the current file version is ${currentVersionId}.`,
623
+ recoveryHint: 'Re-read the relevant current text and retry apply_edit with an exact current old_string.'
624
+ }
625
+ };
626
+ }
627
+ function editsHaveStrongAnchors(edits) {
628
+ return edits.length > 0 && edits.every(edit => {
629
+ if (edit.mode === 'replace_symbol') {
630
+ return typeof edit.symbolName === 'string' && edit.symbolName.trim().length > 0;
631
+ }
632
+ if (edit.mode === 'replace_range') {
633
+ return typeof edit.originalText === 'string'
634
+ || edit.structuralOrigin === 'symbol'
635
+ || edit.structuralOrigin === 'tree_sitter_declaration';
636
+ }
637
+ if (edit.mode === 'replace_exact') {
638
+ return typeof edit.originalText === 'string' && edit.originalText.length > 0;
639
+ }
640
+ return false;
641
+ });
642
+ }
643
+ export function assessRewriteScope(model, edits, path) {
644
+ const fileLineCount = Math.max(1, model.getLineCount());
645
+ let replacedLines = 0;
646
+ let addedLines = 0;
647
+ let largestReplacedBlock = 0;
648
+ let largestAddedBlock = 0;
649
+ for (const edit of edits) {
650
+ const oldText = model.getValueInRange(edit.range);
651
+ const oldLineCount = countLogicalLines(oldText);
652
+ const newLineCount = countLogicalLines(edit.text);
653
+ replacedLines += oldLineCount;
654
+ addedLines += newLineCount;
655
+ largestReplacedBlock = Math.max(largestReplacedBlock, oldLineCount);
656
+ largestAddedBlock = Math.max(largestAddedBlock, newLineCount);
657
+ }
658
+ const replacesMostOfFile = replacedLines > fileLineCount * 0.6;
659
+ const classification = replacesMostOfFile ? 'large_rewrite' : 'surgical';
660
+ const netLineDelta = addedLines - replacedLines;
661
+ const message = classification === 'large_rewrite'
662
+ ? `Large rewrite: replacing ${replacedLines}/${fileLineCount} line(s) with ${addedLines} line(s) (net ${netLineDelta >= 0 ? '+' : ''}${netLineDelta}). Fresh-read, unique-anchor, version, atomic-planning, and syntax safeguards remain enforced.`
663
+ : `Surgical edit: replacing ${replacedLines} line(s) with ${addedLines} line(s).`;
664
+ if (classification === 'large_rewrite') {
665
+ console.info(`[CleanSlateEdit] ${message}`);
666
+ }
667
+ return {
668
+ path,
669
+ classification,
670
+ fileLineCount,
671
+ replacedLines,
672
+ addedLines,
673
+ netLineDelta,
674
+ largestReplacedBlock,
675
+ largestAddedBlock,
676
+ replacesMostOfFile,
677
+ message
678
+ };
679
+ }
680
+ export function validateSourceCodeRangeEditBudget(model, edits, path) {
681
+ if (!isSourceCodePath(path) || !edits?.length) {
682
+ return { ok: true };
683
+ }
684
+ const fileLineCount = Math.max(1, model.getLineCount());
685
+ const maxRawRangeLines = 60;
686
+ const maxRawReplacementLines = 90;
687
+ for (let index = 0; index < edits.length; index++) {
688
+ const edit = edits[index];
689
+ if (edit.mode !== 'replace_range') {
690
+ continue;
691
+ }
692
+ if (edit.structuralOrigin === 'symbol') {
693
+ continue;
694
+ }
695
+ const startLine = edit.startLine;
696
+ const endLine = edit.endLine;
697
+ if (typeof startLine !== 'number' || typeof endLine !== 'number') {
698
+ continue;
699
+ }
700
+ const selectedLines = Math.max(1, endLine - startLine + 1);
701
+ const replacementLines = countLogicalLines(edit.replacementText ?? '');
702
+ const hasCurrentAnchor = typeof edit.originalText === 'string' && edit.originalText.trim().length > 0;
703
+ const isAnchoredBalancedRange = hasCurrentAnchor
704
+ && replacementLines >= selectedLines * 0.5
705
+ && replacementLines <= Math.max(300, selectedLines * 3);
706
+ const targetsMostOfFile = fileLineCount >= 20 && selectedLines > fileLineCount * 0.6;
707
+ const isBroadRange = !isAnchoredBalancedRange
708
+ && (selectedLines > maxRawRangeLines || replacementLines > maxRawReplacementLines || targetsMostOfFile);
709
+ if (!isBroadRange) {
710
+ continue;
711
+ }
712
+ return {
713
+ ok: false,
714
+ result: {
715
+ success: false,
716
+ path,
717
+ code: 'range_too_broad_for_source_code',
718
+ blockIndex: index,
719
+ startLine,
720
+ endLine,
721
+ selectedLines,
722
+ replacementLines,
723
+ fileLineCount,
724
+ currentVersionId: model.getVersionId(),
725
+ message: `The legacy source-code range target is too broad (${selectedLines}/${fileLineCount} selected line(s), ${replacementLines} replacement line(s)).`,
726
+ recoveryHint: 'Retry through apply_edit with one or more exact current old_string replacements.'
727
+ }
728
+ };
729
+ }
730
+ return { ok: true };
731
+ }
732
+ function countLogicalLines(value) {
733
+ if (value.length === 0) {
734
+ return 0;
735
+ }
736
+ return value.split('\n').length;
737
+ }
738
+ function isSourceCodePath(path) {
739
+ return /\.(c|cc|cpp|cs|css|dart|go|h|hpp|java|js|jsx|kt|less|m|mm|php|rs|scss|swift|ts|tsx|vue)$/i.test(path.trim());
740
+ }
741
+ //# sourceMappingURL=ApplyEditTool.js.map