@cdoing/core 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 (378) hide show
  1. package/dist/agents/coordinator.d.ts +114 -0
  2. package/dist/agents/coordinator.d.ts.map +1 -0
  3. package/dist/agents/coordinator.js +158 -0
  4. package/dist/agents/coordinator.js.map +1 -0
  5. package/dist/context-providers/clipboard.d.ts +13 -0
  6. package/dist/context-providers/clipboard.d.ts.map +1 -0
  7. package/dist/context-providers/clipboard.js +53 -0
  8. package/dist/context-providers/clipboard.js.map +1 -0
  9. package/dist/context-providers/codebase.d.ts +46 -0
  10. package/dist/context-providers/codebase.d.ts.map +1 -0
  11. package/dist/context-providers/codebase.js +273 -0
  12. package/dist/context-providers/codebase.js.map +1 -0
  13. package/dist/context-providers/diff.d.ts +18 -0
  14. package/dist/context-providers/diff.d.ts.map +1 -0
  15. package/dist/context-providers/diff.js +63 -0
  16. package/dist/context-providers/diff.js.map +1 -0
  17. package/dist/context-providers/docs.d.ts +21 -0
  18. package/dist/context-providers/docs.d.ts.map +1 -0
  19. package/dist/context-providers/docs.js +180 -0
  20. package/dist/context-providers/docs.js.map +1 -0
  21. package/dist/context-providers/file-include.d.ts +13 -0
  22. package/dist/context-providers/file-include.d.ts.map +1 -0
  23. package/dist/context-providers/file-include.js +82 -0
  24. package/dist/context-providers/file-include.js.map +1 -0
  25. package/dist/context-providers/folder.d.ts +19 -0
  26. package/dist/context-providers/folder.d.ts.map +1 -0
  27. package/dist/context-providers/folder.js +130 -0
  28. package/dist/context-providers/folder.js.map +1 -0
  29. package/dist/context-providers/git.d.ts +19 -0
  30. package/dist/context-providers/git.d.ts.map +1 -0
  31. package/dist/context-providers/git.js +74 -0
  32. package/dist/context-providers/git.js.map +1 -0
  33. package/dist/context-providers/index.d.ts +26 -0
  34. package/dist/context-providers/index.d.ts.map +1 -0
  35. package/dist/context-providers/index.js +37 -0
  36. package/dist/context-providers/index.js.map +1 -0
  37. package/dist/context-providers/open-files.d.ts +25 -0
  38. package/dist/context-providers/open-files.d.ts.map +1 -0
  39. package/dist/context-providers/open-files.js +134 -0
  40. package/dist/context-providers/open-files.js.map +1 -0
  41. package/dist/context-providers/problems.d.ts +24 -0
  42. package/dist/context-providers/problems.d.ts.map +1 -0
  43. package/dist/context-providers/problems.js +97 -0
  44. package/dist/context-providers/problems.js.map +1 -0
  45. package/dist/context-providers/registry.d.ts +61 -0
  46. package/dist/context-providers/registry.d.ts.map +1 -0
  47. package/dist/context-providers/registry.js +92 -0
  48. package/dist/context-providers/registry.js.map +1 -0
  49. package/dist/context-providers/terminal.d.ts +25 -0
  50. package/dist/context-providers/terminal.d.ts.map +1 -0
  51. package/dist/context-providers/terminal.js +55 -0
  52. package/dist/context-providers/terminal.js.map +1 -0
  53. package/dist/context-providers/tree.d.ts +29 -0
  54. package/dist/context-providers/tree.d.ts.map +1 -0
  55. package/dist/context-providers/tree.js +172 -0
  56. package/dist/context-providers/tree.js.map +1 -0
  57. package/dist/context-providers/types.d.ts +72 -0
  58. package/dist/context-providers/types.d.ts.map +1 -0
  59. package/dist/context-providers/types.js +10 -0
  60. package/dist/context-providers/types.js.map +1 -0
  61. package/dist/context-providers/url.d.ts +27 -0
  62. package/dist/context-providers/url.d.ts.map +1 -0
  63. package/dist/context-providers/url.js +131 -0
  64. package/dist/context-providers/url.js.map +1 -0
  65. package/dist/effort/index.d.ts +78 -0
  66. package/dist/effort/index.d.ts.map +1 -0
  67. package/dist/effort/index.js +146 -0
  68. package/dist/effort/index.js.map +1 -0
  69. package/dist/hooks/index.d.ts +47 -0
  70. package/dist/hooks/index.d.ts.map +1 -0
  71. package/dist/hooks/index.js +151 -0
  72. package/dist/hooks/index.js.map +1 -0
  73. package/dist/index.d.ts +75 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +152 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/indexing/chunker.d.ts +25 -0
  78. package/dist/indexing/chunker.d.ts.map +1 -0
  79. package/dist/indexing/chunker.js +217 -0
  80. package/dist/indexing/chunker.js.map +1 -0
  81. package/dist/indexing/database.d.ts +49 -0
  82. package/dist/indexing/database.d.ts.map +1 -0
  83. package/dist/indexing/database.js +287 -0
  84. package/dist/indexing/database.js.map +1 -0
  85. package/dist/indexing/index.d.ts +9 -0
  86. package/dist/indexing/index.d.ts.map +1 -0
  87. package/dist/indexing/index.js +13 -0
  88. package/dist/indexing/index.js.map +1 -0
  89. package/dist/indexing/indexer.d.ts +63 -0
  90. package/dist/indexing/indexer.d.ts.map +1 -0
  91. package/dist/indexing/indexer.js +352 -0
  92. package/dist/indexing/indexer.js.map +1 -0
  93. package/dist/indexing/recent-edits-cache.d.ts +77 -0
  94. package/dist/indexing/recent-edits-cache.d.ts.map +1 -0
  95. package/dist/indexing/recent-edits-cache.js +123 -0
  96. package/dist/indexing/recent-edits-cache.js.map +1 -0
  97. package/dist/indexing/types.d.ts +39 -0
  98. package/dist/indexing/types.d.ts.map +1 -0
  99. package/dist/indexing/types.js +6 -0
  100. package/dist/indexing/types.js.map +1 -0
  101. package/dist/mcp/index.d.ts +33 -0
  102. package/dist/mcp/index.d.ts.map +1 -0
  103. package/dist/mcp/index.js +37 -0
  104. package/dist/mcp/index.js.map +1 -0
  105. package/dist/mcp/manager.d.ts +123 -0
  106. package/dist/mcp/manager.d.ts.map +1 -0
  107. package/dist/mcp/manager.js +331 -0
  108. package/dist/mcp/manager.js.map +1 -0
  109. package/dist/oauth.d.ts +33 -0
  110. package/dist/oauth.d.ts.map +1 -0
  111. package/dist/oauth.js +312 -0
  112. package/dist/oauth.js.map +1 -0
  113. package/dist/permissions/index.d.ts +216 -0
  114. package/dist/permissions/index.d.ts.map +1 -0
  115. package/dist/permissions/index.js +938 -0
  116. package/dist/permissions/index.js.map +1 -0
  117. package/dist/plan/index.d.ts +20 -0
  118. package/dist/plan/index.d.ts.map +1 -0
  119. package/dist/plan/index.js +24 -0
  120. package/dist/plan/index.js.map +1 -0
  121. package/dist/plan/manager.d.ts +101 -0
  122. package/dist/plan/manager.d.ts.map +1 -0
  123. package/dist/plan/manager.js +170 -0
  124. package/dist/plan/manager.js.map +1 -0
  125. package/dist/rules/index.d.ts +28 -0
  126. package/dist/rules/index.d.ts.map +1 -0
  127. package/dist/rules/index.js +31 -0
  128. package/dist/rules/index.js.map +1 -0
  129. package/dist/rules/manager.d.ts +77 -0
  130. package/dist/rules/manager.d.ts.map +1 -0
  131. package/dist/rules/manager.js +279 -0
  132. package/dist/rules/manager.js.map +1 -0
  133. package/dist/rules/types.d.ts +34 -0
  134. package/dist/rules/types.d.ts.map +1 -0
  135. package/dist/rules/types.js +9 -0
  136. package/dist/rules/types.js.map +1 -0
  137. package/dist/sandbox/filesystem.d.ts +20 -0
  138. package/dist/sandbox/filesystem.d.ts.map +1 -0
  139. package/dist/sandbox/filesystem.js +141 -0
  140. package/dist/sandbox/filesystem.js.map +1 -0
  141. package/dist/sandbox/index.d.ts +4 -0
  142. package/dist/sandbox/index.d.ts.map +1 -0
  143. package/dist/sandbox/index.js +8 -0
  144. package/dist/sandbox/index.js.map +1 -0
  145. package/dist/sandbox/manager.d.ts +47 -0
  146. package/dist/sandbox/manager.d.ts.map +1 -0
  147. package/dist/sandbox/manager.js +220 -0
  148. package/dist/sandbox/manager.js.map +1 -0
  149. package/dist/sandbox/network.d.ts +14 -0
  150. package/dist/sandbox/network.d.ts.map +1 -0
  151. package/dist/sandbox/network.js +87 -0
  152. package/dist/sandbox/network.js.map +1 -0
  153. package/dist/sandbox/types.d.ts +42 -0
  154. package/dist/sandbox/types.d.ts.map +1 -0
  155. package/dist/sandbox/types.js +25 -0
  156. package/dist/sandbox/types.js.map +1 -0
  157. package/dist/tools/ast-edit.d.ts +57 -0
  158. package/dist/tools/ast-edit.d.ts.map +1 -0
  159. package/dist/tools/ast-edit.js +443 -0
  160. package/dist/tools/ast-edit.js.map +1 -0
  161. package/dist/tools/code-verify.d.ts +8 -0
  162. package/dist/tools/code-verify.d.ts.map +1 -0
  163. package/dist/tools/code-verify.js +159 -0
  164. package/dist/tools/code-verify.js.map +1 -0
  165. package/dist/tools/codebase-search.d.ts +17 -0
  166. package/dist/tools/codebase-search.d.ts.map +1 -0
  167. package/dist/tools/codebase-search.js +104 -0
  168. package/dist/tools/codebase-search.js.map +1 -0
  169. package/dist/tools/file-delete.d.ts +26 -0
  170. package/dist/tools/file-delete.d.ts.map +1 -0
  171. package/dist/tools/file-delete.js +179 -0
  172. package/dist/tools/file-delete.js.map +1 -0
  173. package/dist/tools/file-edit.d.ts +10 -0
  174. package/dist/tools/file-edit.d.ts.map +1 -0
  175. package/dist/tools/file-edit.js +138 -0
  176. package/dist/tools/file-edit.js.map +1 -0
  177. package/dist/tools/file-read.d.ts +12 -0
  178. package/dist/tools/file-read.d.ts.map +1 -0
  179. package/dist/tools/file-read.js +211 -0
  180. package/dist/tools/file-read.js.map +1 -0
  181. package/dist/tools/file-run.d.ts +10 -0
  182. package/dist/tools/file-run.d.ts.map +1 -0
  183. package/dist/tools/file-run.js +179 -0
  184. package/dist/tools/file-run.js.map +1 -0
  185. package/dist/tools/file-write.d.ts +10 -0
  186. package/dist/tools/file-write.d.ts.map +1 -0
  187. package/dist/tools/file-write.js +134 -0
  188. package/dist/tools/file-write.js.map +1 -0
  189. package/dist/tools/glob-search.d.ts +8 -0
  190. package/dist/tools/glob-search.d.ts.map +1 -0
  191. package/dist/tools/glob-search.js +108 -0
  192. package/dist/tools/glob-search.js.map +1 -0
  193. package/dist/tools/grep-search.d.ts +8 -0
  194. package/dist/tools/grep-search.d.ts.map +1 -0
  195. package/dist/tools/grep-search.js +139 -0
  196. package/dist/tools/grep-search.js.map +1 -0
  197. package/dist/tools/list-dir.d.ts +16 -0
  198. package/dist/tools/list-dir.d.ts.map +1 -0
  199. package/dist/tools/list-dir.js +183 -0
  200. package/dist/tools/list-dir.js.map +1 -0
  201. package/dist/tools/multi-edit.d.ts +16 -0
  202. package/dist/tools/multi-edit.d.ts.map +1 -0
  203. package/dist/tools/multi-edit.js +163 -0
  204. package/dist/tools/multi-edit.js.map +1 -0
  205. package/dist/tools/notebook-edit.d.ts +31 -0
  206. package/dist/tools/notebook-edit.d.ts.map +1 -0
  207. package/dist/tools/notebook-edit.js +321 -0
  208. package/dist/tools/notebook-edit.js.map +1 -0
  209. package/dist/tools/registry.d.ts +16 -0
  210. package/dist/tools/registry.d.ts.map +1 -0
  211. package/dist/tools/registry.js +41 -0
  212. package/dist/tools/registry.js.map +1 -0
  213. package/dist/tools/shell-exec.d.ts +12 -0
  214. package/dist/tools/shell-exec.d.ts.map +1 -0
  215. package/dist/tools/shell-exec.js +261 -0
  216. package/dist/tools/shell-exec.js.map +1 -0
  217. package/dist/tools/sub-agent-manager.d.ts +57 -0
  218. package/dist/tools/sub-agent-manager.d.ts.map +1 -0
  219. package/dist/tools/sub-agent-manager.js +153 -0
  220. package/dist/tools/sub-agent-manager.js.map +1 -0
  221. package/dist/tools/sub-agent-status.d.ts +12 -0
  222. package/dist/tools/sub-agent-status.d.ts.map +1 -0
  223. package/dist/tools/sub-agent-status.js +59 -0
  224. package/dist/tools/sub-agent-status.js.map +1 -0
  225. package/dist/tools/sub-agent-terminate.d.ts +12 -0
  226. package/dist/tools/sub-agent-terminate.d.ts.map +1 -0
  227. package/dist/tools/sub-agent-terminate.js +55 -0
  228. package/dist/tools/sub-agent-terminate.js.map +1 -0
  229. package/dist/tools/sub-agent.d.ts +34 -0
  230. package/dist/tools/sub-agent.d.ts.map +1 -0
  231. package/dist/tools/sub-agent.js +140 -0
  232. package/dist/tools/sub-agent.js.map +1 -0
  233. package/dist/tools/system-info.d.ts +24 -0
  234. package/dist/tools/system-info.d.ts.map +1 -0
  235. package/dist/tools/system-info.js +220 -0
  236. package/dist/tools/system-info.js.map +1 -0
  237. package/dist/tools/todo.d.ts +16 -0
  238. package/dist/tools/todo.d.ts.map +1 -0
  239. package/dist/tools/todo.js +144 -0
  240. package/dist/tools/todo.js.map +1 -0
  241. package/dist/tools/types.d.ts +20 -0
  242. package/dist/tools/types.d.ts.map +1 -0
  243. package/dist/tools/types.js +3 -0
  244. package/dist/tools/types.js.map +1 -0
  245. package/dist/tools/view-diff.d.ts +11 -0
  246. package/dist/tools/view-diff.d.ts.map +1 -0
  247. package/dist/tools/view-diff.js +88 -0
  248. package/dist/tools/view-diff.js.map +1 -0
  249. package/dist/tools/view-repo-map.d.ts +18 -0
  250. package/dist/tools/view-repo-map.d.ts.map +1 -0
  251. package/dist/tools/view-repo-map.js +245 -0
  252. package/dist/tools/view-repo-map.js.map +1 -0
  253. package/dist/tools/web-fetch.d.ts +13 -0
  254. package/dist/tools/web-fetch.d.ts.map +1 -0
  255. package/dist/tools/web-fetch.js +106 -0
  256. package/dist/tools/web-fetch.js.map +1 -0
  257. package/dist/tools/web-search.d.ts +10 -0
  258. package/dist/tools/web-search.d.ts.map +1 -0
  259. package/dist/tools/web-search.js +106 -0
  260. package/dist/tools/web-search.js.map +1 -0
  261. package/dist/utils/gitignore.d.ts +10 -0
  262. package/dist/utils/gitignore.d.ts.map +1 -0
  263. package/dist/utils/gitignore.js +104 -0
  264. package/dist/utils/gitignore.js.map +1 -0
  265. package/dist/utils/lazy-apply.d.ts +45 -0
  266. package/dist/utils/lazy-apply.d.ts.map +1 -0
  267. package/dist/utils/lazy-apply.js +164 -0
  268. package/dist/utils/lazy-apply.js.map +1 -0
  269. package/dist/utils/memory.d.ts +36 -0
  270. package/dist/utils/memory.d.ts.map +1 -0
  271. package/dist/utils/memory.js +136 -0
  272. package/dist/utils/memory.js.map +1 -0
  273. package/dist/utils/path-matching.d.ts +24 -0
  274. package/dist/utils/path-matching.d.ts.map +1 -0
  275. package/dist/utils/path-matching.js +116 -0
  276. package/dist/utils/path-matching.js.map +1 -0
  277. package/dist/utils/path-safety.d.ts +13 -0
  278. package/dist/utils/path-safety.d.ts.map +1 -0
  279. package/dist/utils/path-safety.js +54 -0
  280. package/dist/utils/path-safety.js.map +1 -0
  281. package/dist/utils/project-config.d.ts +18 -0
  282. package/dist/utils/project-config.d.ts.map +1 -0
  283. package/dist/utils/project-config.js +76 -0
  284. package/dist/utils/project-config.js.map +1 -0
  285. package/dist/utils/search-match.d.ts +63 -0
  286. package/dist/utils/search-match.d.ts.map +1 -0
  287. package/dist/utils/search-match.js +426 -0
  288. package/dist/utils/search-match.js.map +1 -0
  289. package/dist/utils/shell-paths.d.ts +17 -0
  290. package/dist/utils/shell-paths.d.ts.map +1 -0
  291. package/dist/utils/shell-paths.js +107 -0
  292. package/dist/utils/shell-paths.js.map +1 -0
  293. package/dist/utils/streaming-diff.d.ts +45 -0
  294. package/dist/utils/streaming-diff.d.ts.map +1 -0
  295. package/dist/utils/streaming-diff.js +230 -0
  296. package/dist/utils/streaming-diff.js.map +1 -0
  297. package/dist/utils/todo.d.ts +47 -0
  298. package/dist/utils/todo.d.ts.map +1 -0
  299. package/dist/utils/todo.js +102 -0
  300. package/dist/utils/todo.js.map +1 -0
  301. package/package.json +23 -0
  302. package/src/agents/coordinator.ts +240 -0
  303. package/src/context-providers/clipboard.ts +48 -0
  304. package/src/context-providers/codebase.ts +274 -0
  305. package/src/context-providers/diff.ts +66 -0
  306. package/src/context-providers/docs.ts +160 -0
  307. package/src/context-providers/file-include.ts +54 -0
  308. package/src/context-providers/folder.ts +106 -0
  309. package/src/context-providers/git.ts +72 -0
  310. package/src/context-providers/index.ts +26 -0
  311. package/src/context-providers/open-files.ts +113 -0
  312. package/src/context-providers/problems.ts +100 -0
  313. package/src/context-providers/registry.ts +99 -0
  314. package/src/context-providers/terminal.ts +58 -0
  315. package/src/context-providers/tree.ts +161 -0
  316. package/src/context-providers/types.ts +84 -0
  317. package/src/context-providers/url.ts +138 -0
  318. package/src/effort/index.ts +177 -0
  319. package/src/hooks/index.ts +148 -0
  320. package/src/index.ts +114 -0
  321. package/src/indexing/README.md +267 -0
  322. package/src/indexing/chunker.ts +206 -0
  323. package/src/indexing/database.ts +299 -0
  324. package/src/indexing/index.ts +15 -0
  325. package/src/indexing/indexer.ts +383 -0
  326. package/src/indexing/recent-edits-cache.ts +150 -0
  327. package/src/indexing/types.ts +44 -0
  328. package/src/mcp/index.ts +33 -0
  329. package/src/mcp/manager.ts +385 -0
  330. package/src/oauth.ts +330 -0
  331. package/src/permissions/index.ts +1011 -0
  332. package/src/plan/index.ts +20 -0
  333. package/src/plan/manager.ts +233 -0
  334. package/src/rules/index.ts +28 -0
  335. package/src/rules/manager.ts +276 -0
  336. package/src/rules/types.ts +40 -0
  337. package/src/sandbox/filesystem.ts +135 -0
  338. package/src/sandbox/index.ts +9 -0
  339. package/src/sandbox/manager.ts +213 -0
  340. package/src/sandbox/network.ts +101 -0
  341. package/src/sandbox/types.ts +63 -0
  342. package/src/tools/ast-edit.ts +493 -0
  343. package/src/tools/code-verify.ts +143 -0
  344. package/src/tools/codebase-search.ts +117 -0
  345. package/src/tools/file-delete.ts +155 -0
  346. package/src/tools/file-edit.ts +115 -0
  347. package/src/tools/file-read.ts +195 -0
  348. package/src/tools/file-run.ts +158 -0
  349. package/src/tools/file-write.ts +104 -0
  350. package/src/tools/glob-search.ts +80 -0
  351. package/src/tools/grep-search.ts +120 -0
  352. package/src/tools/list-dir.ts +172 -0
  353. package/src/tools/multi-edit.ts +138 -0
  354. package/src/tools/notebook-edit.ts +342 -0
  355. package/src/tools/registry.ts +43 -0
  356. package/src/tools/shell-exec.ts +251 -0
  357. package/src/tools/sub-agent-manager.ts +183 -0
  358. package/src/tools/sub-agent-status.ts +67 -0
  359. package/src/tools/sub-agent-terminate.ts +62 -0
  360. package/src/tools/sub-agent.ts +162 -0
  361. package/src/tools/system-info.ts +248 -0
  362. package/src/tools/todo.ts +149 -0
  363. package/src/tools/types.ts +21 -0
  364. package/src/tools/view-diff.ts +99 -0
  365. package/src/tools/view-repo-map.ts +249 -0
  366. package/src/tools/web-fetch.ts +118 -0
  367. package/src/tools/web-search.ts +129 -0
  368. package/src/utils/gitignore.ts +73 -0
  369. package/src/utils/lazy-apply.ts +189 -0
  370. package/src/utils/memory.ts +124 -0
  371. package/src/utils/path-matching.ts +84 -0
  372. package/src/utils/path-safety.ts +19 -0
  373. package/src/utils/project-config.ts +41 -0
  374. package/src/utils/search-match.ts +495 -0
  375. package/src/utils/shell-paths.ts +79 -0
  376. package/src/utils/streaming-diff.ts +260 -0
  377. package/src/utils/todo.ts +115 -0
  378. package/tsconfig.json +18 -0
@@ -0,0 +1,426 @@
1
+ "use strict";
2
+ /**
3
+ * Search Match — multi-strategy string matching for file editing.
4
+ *
5
+ * Inspired by Continue's cascading match strategies:
6
+ * 1. Exact match
7
+ * 2. Trimmed match (ignore leading/trailing whitespace)
8
+ * 3. Case-insensitive match
9
+ * 4. Whitespace-ignored match (strips all whitespace, maps back to original positions)
10
+ *
11
+ * This makes the edit tool far more resilient to LLM formatting differences.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.findSearchMatch = findSearchMatch;
15
+ exports.findAllSearchMatches = findAllSearchMatches;
16
+ exports.executeFindAndReplace = executeFindAndReplace;
17
+ exports.executeMultiFindAndReplace = executeMultiFindAndReplace;
18
+ exports.isUnifiedDiff = isUnifiedDiff;
19
+ exports.applyUnifiedDiff = applyUnifiedDiff;
20
+ /** 1. Exact string match */
21
+ function exactMatch(fileContent, searchContent) {
22
+ const idx = fileContent.indexOf(searchContent);
23
+ if (idx !== -1) {
24
+ return { startIndex: idx, endIndex: idx + searchContent.length, strategyName: "exact" };
25
+ }
26
+ return null;
27
+ }
28
+ /** 2. Trimmed match — ignore leading/trailing whitespace */
29
+ function trimmedMatch(fileContent, searchContent) {
30
+ const trimmed = searchContent.trim();
31
+ if (!trimmed)
32
+ return null;
33
+ if (trimmed === searchContent)
34
+ return null;
35
+ const idx = fileContent.indexOf(trimmed);
36
+ if (idx !== -1) {
37
+ return { startIndex: idx, endIndex: idx + trimmed.length, strategyName: "trimmed" };
38
+ }
39
+ return null;
40
+ }
41
+ /** 3. Case-insensitive match */
42
+ function caseInsensitiveMatch(fileContent, searchContent) {
43
+ const idx = fileContent.toLowerCase().indexOf(searchContent.toLowerCase());
44
+ if (idx !== -1) {
45
+ return { startIndex: idx, endIndex: idx + searchContent.length, strategyName: "caseInsensitive" };
46
+ }
47
+ return null;
48
+ }
49
+ /** 4. Whitespace-ignored match — strips all whitespace, maps positions back */
50
+ function whitespaceIgnoredMatch(fileContent, searchContent) {
51
+ const strippedFile = fileContent.replace(/\s/g, "");
52
+ const strippedSearch = searchContent.replace(/\s/g, "");
53
+ if (!strippedSearch)
54
+ return null;
55
+ const strippedIdx = strippedFile.indexOf(strippedSearch);
56
+ if (strippedIdx === -1)
57
+ return null;
58
+ // Map stripped position back to original
59
+ let originalStart = -1;
60
+ let nonWsCount = 0;
61
+ for (let i = 0; i < fileContent.length; i++) {
62
+ if (!/\s/.test(fileContent[i])) {
63
+ if (nonWsCount === strippedIdx) {
64
+ originalStart = i;
65
+ break;
66
+ }
67
+ nonWsCount++;
68
+ }
69
+ }
70
+ if (originalStart === -1)
71
+ return null;
72
+ // Find end position
73
+ let originalEnd = originalStart;
74
+ let matchedChars = 0;
75
+ for (let i = originalStart; i < fileContent.length; i++) {
76
+ if (!/\s/.test(fileContent[i])) {
77
+ matchedChars++;
78
+ if (matchedChars === strippedSearch.length) {
79
+ originalEnd = i + 1;
80
+ break;
81
+ }
82
+ }
83
+ originalEnd = i + 1;
84
+ }
85
+ return { startIndex: originalStart, endIndex: originalEnd, strategyName: "whitespaceIgnored" };
86
+ }
87
+ /** 5. Jaro-Winkler fuzzy match — line-based sliding window with 90%+ threshold */
88
+ function fuzzyMatch(fileContent, searchContent) {
89
+ const searchBlock = searchContent.trim();
90
+ if (searchBlock.length < 10)
91
+ return null; // Too short for meaningful fuzzy match
92
+ const searchLines = searchBlock.split("\n");
93
+ const fileLines = fileContent.split("\n");
94
+ if (searchLines.length > fileLines.length)
95
+ return null;
96
+ let bestMatch = null;
97
+ let bestSimilarity = 0;
98
+ const threshold = 0.9;
99
+ // Sliding window of searchLines.length over fileLines
100
+ for (let i = 0; i <= fileLines.length - searchLines.length; i++) {
101
+ const candidate = fileLines.slice(i, i + searchLines.length).join("\n").trim();
102
+ if (candidate.length < 5)
103
+ continue;
104
+ const similarity = jaroWinklerSimilarity(searchBlock, candidate);
105
+ if (similarity >= threshold && similarity > bestSimilarity) {
106
+ const before = fileLines.slice(0, i).join("\n");
107
+ const startIndex = before.length + (i > 0 ? 1 : 0);
108
+ bestMatch = {
109
+ startIndex,
110
+ endIndex: startIndex + candidate.length,
111
+ strategyName: "fuzzy",
112
+ };
113
+ bestSimilarity = similarity;
114
+ }
115
+ }
116
+ return bestMatch;
117
+ }
118
+ function jaroSimilarity(s1, s2) {
119
+ if (s1 === s2)
120
+ return 1.0;
121
+ if (!s1.length || !s2.length)
122
+ return 0.0;
123
+ const matchDist = Math.floor(Math.max(s1.length, s2.length) / 2) - 1;
124
+ if (matchDist < 0)
125
+ return 0.0;
126
+ const s1m = new Array(s1.length).fill(false);
127
+ const s2m = new Array(s2.length).fill(false);
128
+ let matches = 0;
129
+ let transpositions = 0;
130
+ for (let i = 0; i < s1.length; i++) {
131
+ const lo = Math.max(0, i - matchDist);
132
+ const hi = Math.min(i + matchDist + 1, s2.length);
133
+ for (let j = lo; j < hi; j++) {
134
+ if (s2m[j] || s1[i] !== s2[j])
135
+ continue;
136
+ s1m[i] = s2m[j] = true;
137
+ matches++;
138
+ break;
139
+ }
140
+ }
141
+ if (!matches)
142
+ return 0.0;
143
+ let k = 0;
144
+ for (let i = 0; i < s1.length; i++) {
145
+ if (!s1m[i])
146
+ continue;
147
+ while (!s2m[k])
148
+ k++;
149
+ if (s1[i] !== s2[k])
150
+ transpositions++;
151
+ k++;
152
+ }
153
+ return (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;
154
+ }
155
+ function jaroWinklerSimilarity(s1, s2) {
156
+ const jaro = jaroSimilarity(s1, s2);
157
+ if (jaro < 0.7)
158
+ return jaro;
159
+ let prefix = 0;
160
+ const max = Math.min(4, Math.min(s1.length, s2.length));
161
+ for (let i = 0; i < max; i++) {
162
+ if (s1[i] === s2[i])
163
+ prefix++;
164
+ else
165
+ break;
166
+ }
167
+ return jaro + prefix * 0.1 * (1 - jaro);
168
+ }
169
+ const strategies = [
170
+ exactMatch,
171
+ trimmedMatch,
172
+ caseInsensitiveMatch,
173
+ whitespaceIgnoredMatch,
174
+ fuzzyMatch,
175
+ ];
176
+ /**
177
+ * Find a match for searchContent in fileContent using cascading strategies.
178
+ * Returns null if no strategy matches.
179
+ */
180
+ function findSearchMatch(fileContent, searchContent) {
181
+ if (!searchContent.trim()) {
182
+ return { startIndex: 0, endIndex: 0, strategyName: "empty" };
183
+ }
184
+ for (const strategy of strategies) {
185
+ const result = strategy(fileContent, searchContent);
186
+ if (result)
187
+ return result;
188
+ }
189
+ return null;
190
+ }
191
+ /**
192
+ * Find all matches for searchContent in fileContent.
193
+ */
194
+ function findAllSearchMatches(fileContent, searchContent) {
195
+ if (!searchContent.trim()) {
196
+ return [{ startIndex: 0, endIndex: 0, strategyName: "empty" }];
197
+ }
198
+ const matches = [];
199
+ let remaining = fileContent;
200
+ let offset = 0;
201
+ while (remaining.length > 0) {
202
+ const match = findSearchMatch(remaining, searchContent);
203
+ if (!match)
204
+ break;
205
+ const adjusted = {
206
+ startIndex: match.startIndex + offset,
207
+ endIndex: match.endIndex + offset,
208
+ strategyName: match.strategyName,
209
+ };
210
+ // Prevent infinite loops
211
+ if (matches.length > 0 && adjusted.startIndex <= matches[matches.length - 1].startIndex)
212
+ break;
213
+ matches.push(adjusted);
214
+ offset = adjusted.endIndex;
215
+ remaining = fileContent.slice(offset);
216
+ }
217
+ return matches;
218
+ }
219
+ /**
220
+ * Execute a single find-and-replace on content.
221
+ * Uses multi-strategy matching. Returns the new content.
222
+ * Throws if match not found or multiple matches without replace_all.
223
+ *
224
+ * When a non-exact strategy is used, indentation is automatically
225
+ * adjusted so that new_string matches the file's original indentation
226
+ * rather than whatever the LLM happened to produce.
227
+ */
228
+ function executeFindAndReplace(content, oldString, newString, replaceAll) {
229
+ if (oldString === newString) {
230
+ throw new Error("old_string and new_string are identical — no change needed");
231
+ }
232
+ const matches = findAllSearchMatches(content, oldString);
233
+ if (matches.length === 0) {
234
+ throw new Error(`old_string not found in file (tried exact, trimmed, case-insensitive, and whitespace-ignored matching)`);
235
+ }
236
+ if (!replaceAll && matches.length > 1) {
237
+ throw new Error(`Multiple matches found (${matches.length}). Use replace_all or add more surrounding context to make old_string unique.`);
238
+ }
239
+ const toReplace = replaceAll ? matches : [matches[0]];
240
+ const strategy = matches[0].strategyName;
241
+ // Apply replacements in reverse order to preserve positions
242
+ let result = content;
243
+ for (let i = toReplace.length - 1; i >= 0; i--) {
244
+ const m = toReplace[i];
245
+ const adjustedNewString = normalizeIndentation(content, m.startIndex, oldString, newString, strategy === "exact");
246
+ result = result.substring(0, m.startIndex) + adjustedNewString + result.substring(m.endIndex);
247
+ }
248
+ return { result, count: toReplace.length, strategy };
249
+ }
250
+ /**
251
+ * Normalize indentation of new_string so it matches the file's context.
252
+ *
253
+ * The key idea: preserve the RELATIVE indentation within new_string,
254
+ * but set the BASE indentation to match the target (the file's actual
255
+ * indentation at the match point).
256
+ *
257
+ * Example:
258
+ * File: " update: (id, data) => {\n return id;\n }" (base: 2 spaces)
259
+ * new_string: " modifyItem: (id, data) => {\n return id;\n }" (base: 6 spaces)
260
+ * Result: " modifyItem: (id, data) => {\n return id;\n }" (base: 2 spaces, relative preserved)
261
+ */
262
+ function normalizeIndentation(fileContent, matchStartIndex, _oldString, newString, _isExact) {
263
+ // Get the full line indentation at the match point in the file
264
+ const fileLineIndent = getLineIndent(fileContent, matchStartIndex);
265
+ // How much of that indent is BEFORE matchStartIndex?
266
+ // (already in the file, outside the matched range — it stays in the output)
267
+ //
268
+ // For exact match: match includes the indent → preMatchIndent = ""
269
+ // For trimmed match: match starts after indent → preMatchIndent = fileLineIndent
270
+ const lineStartPos = matchStartIndex - fileLineIndent.length;
271
+ const preMatchIndent = fileContent.substring(lineStartPos, matchStartIndex);
272
+ // The first line of the replacement needs LESS indent because preMatchIndent
273
+ // is already in the file before the insertion point.
274
+ // Subsequent lines start on fresh lines (after \n) — they need the full indent.
275
+ const firstLineTargetIndent = fileLineIndent.substring(preMatchIndent.length);
276
+ // What base indentation does new_string currently have?
277
+ const newBaseIndent = getLeadingWhitespace(newString);
278
+ // If first-line target already matches new_string's base, no adjustment needed
279
+ if (firstLineTargetIndent === newBaseIndent)
280
+ return newString;
281
+ // Re-indent every line: strip newBaseIndent, prepend the correct target indent.
282
+ const lines = newString.split("\n");
283
+ const adjusted = lines.map((line, i) => {
284
+ const lineIndent = getLeadingWhitespace(line);
285
+ const content = line.substring(lineIndent.length);
286
+ // Empty/whitespace-only lines: keep as-is
287
+ if (!content)
288
+ return line;
289
+ // Compute relative indent (how much deeper than new_string's base)
290
+ let relativeIndent = "";
291
+ if (lineIndent.length >= newBaseIndent.length && lineIndent.startsWith(newBaseIndent)) {
292
+ relativeIndent = lineIndent.substring(newBaseIndent.length);
293
+ }
294
+ // First line: use firstLineTargetIndent (accounts for pre-match whitespace already in file)
295
+ // Subsequent lines: use full fileLineIndent (they start on fresh lines after \n)
296
+ const baseIndent = i === 0 ? firstLineTargetIndent : fileLineIndent;
297
+ return baseIndent + relativeIndent + content;
298
+ });
299
+ return adjusted.join("\n");
300
+ }
301
+ /** Get the indentation (leading whitespace) at a position in the file */
302
+ function getLineIndent(content, position) {
303
+ // Walk backwards to find the start of the line
304
+ let lineStart = position;
305
+ while (lineStart > 0 && content[lineStart - 1] !== "\n") {
306
+ lineStart--;
307
+ }
308
+ // Extract leading whitespace from line start to the first non-whitespace
309
+ let indent = "";
310
+ for (let i = lineStart; i < content.length && (content[i] === " " || content[i] === "\t"); i++) {
311
+ indent += content[i];
312
+ }
313
+ return indent;
314
+ }
315
+ /** Get leading whitespace of a string's first line */
316
+ function getLeadingWhitespace(text) {
317
+ const match = text.match(/^([ \t]*)/);
318
+ return match ? match[1] : "";
319
+ }
320
+ /**
321
+ * Execute multiple sequential find-and-replace operations.
322
+ * Each edit operates on the result of the previous one.
323
+ * Atomic: if any edit fails, none are applied (throws).
324
+ */
325
+ function executeMultiFindAndReplace(content, edits) {
326
+ let current = content;
327
+ let totalCount = 0;
328
+ for (let i = 0; i < edits.length; i++) {
329
+ const edit = edits[i];
330
+ try {
331
+ const { result, count } = executeFindAndReplace(current, edit.old_string, edit.new_string, edit.replace_all ?? false);
332
+ current = result;
333
+ totalCount += count;
334
+ }
335
+ catch (err) {
336
+ throw new Error(`Edit ${i + 1}/${edits.length} failed: ${err.message}`);
337
+ }
338
+ }
339
+ return { result: current, totalCount };
340
+ }
341
+ // ── Unified Diff Application ────────────────────────────────────────────────
342
+ /**
343
+ * Check if a string looks like a unified diff format.
344
+ */
345
+ function isUnifiedDiff(text) {
346
+ return /^@@\s+-\d+(?:,\d+)?\s+\+\d+(?:,\d+)?\s+@@/m.test(text);
347
+ }
348
+ /**
349
+ * Apply a unified diff to file content.
350
+ * Supports standard @@ -n,m +n,m @@ hunk headers.
351
+ * Tolerates minor whitespace differences in context lines.
352
+ */
353
+ function applyUnifiedDiff(originalContent, diff) {
354
+ const lines = diff.split("\n");
355
+ const sourceLines = originalContent.split("\n");
356
+ const resultLines = [...sourceLines];
357
+ // Parse hunks
358
+ const hunks = [];
359
+ let currentHunk = null;
360
+ for (const line of lines) {
361
+ // Skip file headers
362
+ if (line.startsWith("---") || line.startsWith("+++"))
363
+ continue;
364
+ // Parse hunk header
365
+ const hunkMatch = line.match(/^@@\s+-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/);
366
+ if (hunkMatch) {
367
+ if (currentHunk)
368
+ hunks.push(currentHunk);
369
+ currentHunk = {
370
+ oldStart: parseInt(hunkMatch[1], 10),
371
+ oldCount: parseInt(hunkMatch[2] ?? "1", 10),
372
+ newStart: parseInt(hunkMatch[3], 10),
373
+ newCount: parseInt(hunkMatch[4] ?? "1", 10),
374
+ lines: [],
375
+ };
376
+ continue;
377
+ }
378
+ if (!currentHunk)
379
+ continue;
380
+ if (line.startsWith("+")) {
381
+ currentHunk.lines.push({ type: "add", text: line.substring(1) });
382
+ }
383
+ else if (line.startsWith("-")) {
384
+ currentHunk.lines.push({ type: "remove", text: line.substring(1) });
385
+ }
386
+ else if (line.startsWith(" ") || line === "") {
387
+ currentHunk.lines.push({ type: "context", text: line.startsWith(" ") ? line.substring(1) : line });
388
+ }
389
+ }
390
+ if (currentHunk)
391
+ hunks.push(currentHunk);
392
+ if (hunks.length === 0) {
393
+ throw new Error("No valid hunks found in diff");
394
+ }
395
+ // Apply hunks in reverse order to preserve line numbers
396
+ for (let h = hunks.length - 1; h >= 0; h--) {
397
+ const hunk = hunks[h];
398
+ const startLine = hunk.oldStart - 1; // Convert to 0-based
399
+ // Collect removals and additions
400
+ const toRemove = [];
401
+ const toAdd = [];
402
+ let lineIdx = startLine;
403
+ for (const dl of hunk.lines) {
404
+ if (dl.type === "remove") {
405
+ toRemove.push(lineIdx);
406
+ lineIdx++;
407
+ }
408
+ else if (dl.type === "add") {
409
+ toAdd.push(dl.text);
410
+ }
411
+ else {
412
+ // context
413
+ lineIdx++;
414
+ }
415
+ }
416
+ // Remove lines (reverse order)
417
+ for (let i = toRemove.length - 1; i >= 0; i--) {
418
+ resultLines.splice(toRemove[i], 1);
419
+ }
420
+ // Insert new lines at the position of first removal (or startLine if no removals)
421
+ const insertAt = toRemove.length > 0 ? toRemove[0] : startLine;
422
+ resultLines.splice(insertAt, 0, ...toAdd);
423
+ }
424
+ return resultLines.join("\n");
425
+ }
426
+ //# sourceMappingURL=search-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-match.js","sourceRoot":"","sources":["../../src/utils/search-match.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shell command path extraction — shared between ShellExecTool and PermissionManager.
3
+ *
4
+ * Heuristically extracts file paths from a shell command and classifies them
5
+ * as read / write / delete operations so permission rules can be applied.
6
+ */
7
+ export interface ExtractedPaths {
8
+ read: string[];
9
+ write: string[];
10
+ delete: string[];
11
+ }
12
+ /**
13
+ * Extract file paths from a shell command and classify by operation type.
14
+ * Best-effort heuristic — compound commands are split on operators and analyzed per segment.
15
+ */
16
+ export declare function extractShellPaths(command: string, workingDir: string): ExtractedPaths;
17
+ //# sourceMappingURL=shell-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-paths.d.ts","sourceRoot":"","sources":["../../src/utils/shell-paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAI,MAAM,EAAE,CAAC;IACjB,KAAK,EAAG,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAoDrF"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * Shell command path extraction — shared between ShellExecTool and PermissionManager.
4
+ *
5
+ * Heuristically extracts file paths from a shell command and classifies them
6
+ * as read / write / delete operations so permission rules can be applied.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.extractShellPaths = extractShellPaths;
43
+ const path = __importStar(require("path"));
44
+ /** Commands that READ files */
45
+ const READ_COMMANDS = /\b(?:cat|less|more|head|tail|bat|view|open|code|vim|nano|emacs|pg|nl|od|xxd|strings|file|wc|cksum|md5|sha\w+sum|diff|cmp|sort|uniq|awk|sed|grep|rg|ag|fzf)\b/;
46
+ /** Commands that WRITE/MODIFY files */
47
+ const WRITE_COMMANDS = /\b(?:cp|mv|install|patch|chmod|chown|chgrp|touch|truncate|split|csplit|sed\s+-i|perl\s+-[pi])\b/;
48
+ /** Commands that DELETE files */
49
+ const DELETE_COMMANDS = /\b(?:rm|rmdir|del|rd|unlink|shred|trash|git\s+clean)\b/;
50
+ /**
51
+ * Extract file paths from a shell command and classify by operation type.
52
+ * Best-effort heuristic — compound commands are split on operators and analyzed per segment.
53
+ */
54
+ function extractShellPaths(command, workingDir) {
55
+ const result = { read: [], write: [], delete: [] };
56
+ const segments = command.split(/\s*(?:&&|\|\||;|\|)\s*/);
57
+ for (const seg of segments) {
58
+ const trimmed = seg.trim();
59
+ if (!trimmed)
60
+ continue;
61
+ const parts = trimmed.split(/\s+/).filter((p) => !p.includes("=") || p.startsWith("-"));
62
+ if (parts.length === 0)
63
+ continue;
64
+ const args = parts.slice(1).filter((a) => !a.startsWith("-") && a !== "");
65
+ const resolvePath = (p) => {
66
+ if (p.startsWith("/") || p.startsWith("~"))
67
+ return p;
68
+ return path.resolve(workingDir, p);
69
+ };
70
+ if (DELETE_COMMANDS.test(trimmed)) {
71
+ for (const a of args)
72
+ result.delete.push(resolvePath(a));
73
+ }
74
+ else if (WRITE_COMMANDS.test(trimmed)) {
75
+ // cp/mv: last arg is destination (write), rest are sources (read)
76
+ if (/\b(?:cp|mv)\b/.test(trimmed) && args.length >= 2) {
77
+ for (let i = 0; i < args.length - 1; i++)
78
+ result.read.push(resolvePath(args[i]));
79
+ result.write.push(resolvePath(args[args.length - 1]));
80
+ }
81
+ else {
82
+ for (const a of args)
83
+ result.write.push(resolvePath(a));
84
+ }
85
+ }
86
+ else if (READ_COMMANDS.test(trimmed)) {
87
+ for (const a of args)
88
+ result.read.push(resolvePath(a));
89
+ }
90
+ // Redirect writes: > file, >> file
91
+ let m;
92
+ const redirectRe = />{1,2}\s*([^\s;|&>]+)/g;
93
+ while ((m = redirectRe.exec(trimmed)) !== null) {
94
+ result.write.push(resolvePath(m[1]));
95
+ }
96
+ // tee writes
97
+ const teeRe = /\btee\s+(?:-[a-zA-Z]\s+)*([^\s;|&]+)/g;
98
+ while ((m = teeRe.exec(trimmed)) !== null) {
99
+ result.write.push(resolvePath(m[1]));
100
+ }
101
+ }
102
+ result.read = [...new Set(result.read)];
103
+ result.write = [...new Set(result.write)];
104
+ result.delete = [...new Set(result.delete)];
105
+ return result;
106
+ }
107
+ //# sourceMappingURL=shell-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-paths.js","sourceRoot":"","sources":["../../src/utils/shell-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Streaming Diff — generates and emits diff chunks in real-time as edits are applied.
3
+ *
4
+ * Instead of computing the entire diff at once and returning it,
5
+ * StreamingDiff emits line-level diff events via a callback, enabling
6
+ * UIs to render changes incrementally (e.g., green/red highlighting as
7
+ * each hunk is processed).
8
+ *
9
+ * Supports three strategies:
10
+ * 1. Deterministic — line-by-line Myers diff (always correct, synchronous)
11
+ * 2. Unified diff — parse and stream hunk-by-hunk from a unified diff string
12
+ * 3. Streaming — emit chunks as they arrive from an LLM token stream
13
+ */
14
+ export interface DiffChunk {
15
+ type: "context" | "add" | "remove" | "hunk-header" | "file-header";
16
+ content: string;
17
+ lineNumber?: number;
18
+ }
19
+ export type DiffChunkCallback = (chunk: DiffChunk) => void;
20
+ /**
21
+ * Compute a line-level diff between two strings and emit chunks via callback.
22
+ * Uses a simple LCS-based diff algorithm.
23
+ */
24
+ export declare function streamDeterministicDiff(oldContent: string, newContent: string, filePath: string, onChunk: DiffChunkCallback): void;
25
+ /**
26
+ * Stream a unified diff string hunk-by-hunk via callback.
27
+ */
28
+ export declare function streamUnifiedDiff(diffText: string, onChunk: DiffChunkCallback): void;
29
+ /**
30
+ * StreamingDiffAccumulator — collects tokens from an LLM stream and emits
31
+ * diff chunks as complete lines are formed. Used for real-time diff display
32
+ * while the model is still generating.
33
+ */
34
+ export declare class StreamingDiffAccumulator {
35
+ private buffer;
36
+ private onChunk;
37
+ private lineNumber;
38
+ constructor(onChunk: DiffChunkCallback);
39
+ /** Feed a token from the LLM stream */
40
+ addToken(token: string): void;
41
+ /** Flush any remaining content */
42
+ flush(): void;
43
+ private emitLine;
44
+ }
45
+ //# sourceMappingURL=streaming-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-diff.d.ts","sourceRoot":"","sources":["../../src/utils/streaming-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,aAAa,GAAG,aAAa,CAAC;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,IAAI,CAwBN;AAuID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAgBpF;AAED;;;;GAIG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,UAAU,CAAa;gBAEnB,OAAO,EAAE,iBAAiB;IAItC,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY7B,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,QAAQ;CAajB"}