@tyvm/knowhow 0.0.46 → 0.0.48

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 (461) hide show
  1. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +2909 -0
  2. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +1671 -0
  3. package/jest.config.js +2 -2
  4. package/package.json +8 -3
  5. package/src/agents/base/base.ts +30 -24
  6. package/src/agents/patcher/patcher.ts +26 -5
  7. package/src/agents/tools/agentCall.ts +4 -2
  8. package/src/agents/tools/aiClient.ts +3 -11
  9. package/src/agents/tools/ast/astAppendNode.ts +90 -0
  10. package/src/agents/tools/ast/astDeleteNode.ts +88 -0
  11. package/src/agents/tools/ast/astEditNode.ts +95 -0
  12. package/src/agents/tools/ast/astGetPathForLine.ts +73 -0
  13. package/src/agents/tools/ast/astListPaths.ts +66 -0
  14. package/src/agents/tools/ast/index.ts +7 -0
  15. package/src/agents/tools/callPlugin.ts +8 -2
  16. package/src/agents/tools/embeddingSearch.ts +2 -1
  17. package/src/agents/tools/execCommand.ts +239 -94
  18. package/src/agents/tools/fileSearch.ts +15 -17
  19. package/src/agents/tools/index.ts +1 -0
  20. package/src/agents/tools/language/definitions.ts +10 -2
  21. package/src/agents/tools/language/index.ts +3 -2
  22. package/src/agents/tools/lintFile.ts +4 -2
  23. package/src/agents/tools/list.ts +203 -62
  24. package/src/agents/tools/patch.ts +48 -14
  25. package/src/agents/tools/readBlocks.ts +34 -0
  26. package/src/agents/tools/readFile.ts +23 -0
  27. package/src/agents/tools/stringReplace.ts +33 -9
  28. package/src/agents/tools/writeFile.ts +55 -0
  29. package/src/agents/tools/ycmd/server.ts +14 -4
  30. package/src/chat/CliChatService.ts +6 -1
  31. package/src/chat/modules/AgentModule.ts +107 -64
  32. package/src/chat/modules/AskModule.ts +0 -1
  33. package/src/chat/modules/SetupModule.ts +4 -4
  34. package/src/chat/modules/SystemModule.ts +28 -5
  35. package/src/chat/types.ts +2 -0
  36. package/src/chat-old.ts +2 -2
  37. package/src/clients/anthropic.ts +22 -1
  38. package/src/clients/openai.ts +1 -1
  39. package/src/clients/types.ts +1 -1
  40. package/src/clients/xai.ts +15 -5
  41. package/src/config.ts +17 -5
  42. package/src/dataset/diffs/generate.ts +2 -2
  43. package/src/dataset/diffs/jsonl.ts +0 -1
  44. package/src/embeddings.ts +6 -4
  45. package/src/index.ts +11 -5
  46. package/src/plugins/GitPlugin.ts +530 -0
  47. package/src/plugins/LinterPlugin.ts +89 -0
  48. package/src/plugins/PluginBase.ts +4 -2
  49. package/src/plugins/asana.ts +4 -2
  50. package/src/plugins/downloader/plugin.ts +5 -2
  51. package/src/plugins/embedding.ts +24 -4
  52. package/src/plugins/figma.ts +7 -3
  53. package/src/plugins/github.ts +4 -2
  54. package/src/plugins/jira.ts +4 -2
  55. package/src/plugins/language.ts +134 -27
  56. package/src/plugins/linear.ts +4 -2
  57. package/src/plugins/notion.ts +4 -2
  58. package/src/plugins/plugins.ts +27 -16
  59. package/src/plugins/tree-sitter/editor.ts +369 -0
  60. package/src/plugins/tree-sitter/lang-packs/index.ts +23 -0
  61. package/src/plugins/tree-sitter/lang-packs/java.ts +59 -0
  62. package/src/plugins/tree-sitter/lang-packs/javascript.ts +57 -0
  63. package/src/plugins/tree-sitter/lang-packs/python.ts +45 -0
  64. package/src/plugins/tree-sitter/lang-packs/types.ts +79 -0
  65. package/src/plugins/tree-sitter/lang-packs/typescript.ts +49 -0
  66. package/src/plugins/tree-sitter/parser.ts +444 -0
  67. package/src/plugins/tree-sitter/simple-paths.ts +467 -0
  68. package/src/plugins/types.ts +11 -0
  69. package/src/plugins/url.ts +5 -3
  70. package/src/plugins/vim.ts +8 -5
  71. package/src/processors/CustomVariables.ts +19 -7
  72. package/src/processors/TokenCompressor.ts +13 -13
  73. package/src/processors/ToolResponseCache.ts +15 -6
  74. package/src/services/EmbeddingService.ts +18 -9
  75. package/src/services/EventService.ts +80 -0
  76. package/src/services/Mcp.ts +5 -0
  77. package/src/services/S3.ts +4 -3
  78. package/src/services/Tools.ts +125 -53
  79. package/src/services/index.ts +16 -11
  80. package/src/services/types.ts +3 -3
  81. package/src/types.ts +7 -2
  82. package/src/worker.ts +14 -1
  83. package/test-comprehensive.ts +31 -0
  84. package/tests/clients/AIClient.test.ts +490 -0
  85. package/tests/manual/agent-events/run-test.ts +203 -0
  86. package/tests/{integration → manual/file-edits}/figma.test.ts +1 -1
  87. package/tests/{integration → manual/file-edits}/fileblocks/readwrite.test.ts +7 -3
  88. package/tests/{integration → manual/file-edits}/patching.test.ts +11 -8
  89. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +332 -0
  90. package/tests/plugins/language/languagePlugin-integration.test.ts +456 -0
  91. package/tests/plugins/language/languagePlugin.test.ts +363 -0
  92. package/tests/processors/Base64ImageDetector.test.ts +403 -0
  93. package/tests/processors/CustomVariables.test.ts +430 -0
  94. package/tests/processors/HarmonyToolProcessor.test.ts +490 -0
  95. package/tests/processors/TokenCompressor.test.ts +391 -0
  96. package/tests/processors/ToolResponseCache.test.ts +688 -0
  97. package/tests/services/Tools.test.ts +1339 -0
  98. package/tests/test.spec.ts +162 -117
  99. package/tests/tree-sitter/editor.test.ts +113 -0
  100. package/tests/tree-sitter/invalid.test.ts +299 -0
  101. package/tests/tree-sitter/paths/common-edits.test.ts +564 -0
  102. package/tests/tree-sitter/paths/debug-exact-position.test.ts +44 -0
  103. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +49 -0
  104. package/tests/tree-sitter/paths/debug-paths.test.ts +90 -0
  105. package/tests/tree-sitter/paths/paths.test.ts +170 -0
  106. package/tests/tree-sitter/paths/simple-paths.test.ts +367 -0
  107. package/tests/tree-sitter/sample-after.ts +48 -0
  108. package/tests/tree-sitter/sample-before.ts +25 -0
  109. package/tests/tree-sitter/test-files/completely-broken.ts +7 -0
  110. package/tests/tree-sitter/test-files/duplicate-braces.ts +39 -0
  111. package/tests/tree-sitter/test-files/invalid-nesting.ts +39 -0
  112. package/tests/tree-sitter/test-files/malformed-signature.ts +39 -0
  113. package/tests/tree-sitter/test-files/mismatched-parens.ts +39 -0
  114. package/tests/tree-sitter/test-files/missing-semicolon.ts +39 -0
  115. package/tests/tree-sitter/test-files/partially-broken.ts +20 -0
  116. package/tests/tree-sitter/test-files/specific-errors.ts +14 -0
  117. package/tests/tree-sitter/test-files/unclosed-string.ts +39 -0
  118. package/tests/tree-sitter/tree-sitter.test.ts +251 -0
  119. package/ts_build/package.json +8 -3
  120. package/ts_build/src/agents/base/base.d.ts +2 -2
  121. package/ts_build/src/agents/base/base.js +24 -20
  122. package/ts_build/src/agents/base/base.js.map +1 -1
  123. package/ts_build/src/agents/patcher/patcher.js +26 -5
  124. package/ts_build/src/agents/patcher/patcher.js.map +1 -1
  125. package/ts_build/src/agents/tools/agentCall.js +2 -1
  126. package/ts_build/src/agents/tools/agentCall.js.map +1 -1
  127. package/ts_build/src/agents/tools/aiClient.d.ts +7 -8
  128. package/ts_build/src/agents/tools/aiClient.js.map +1 -1
  129. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -0
  130. package/ts_build/src/agents/tools/ast/astAppendNode.js +96 -0
  131. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -0
  132. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -0
  133. package/ts_build/src/agents/tools/ast/astDeleteNode.js +94 -0
  134. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -0
  135. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -0
  136. package/ts_build/src/agents/tools/ast/astEditNode.js +96 -0
  137. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -0
  138. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -0
  139. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +78 -0
  140. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -0
  141. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -0
  142. package/ts_build/src/agents/tools/ast/astListPaths.js +78 -0
  143. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -0
  144. package/ts_build/src/agents/tools/ast/index.d.ts +5 -0
  145. package/ts_build/src/agents/tools/ast/index.js +14 -0
  146. package/ts_build/src/agents/tools/ast/index.js.map +1 -0
  147. package/ts_build/src/agents/tools/astAppendNode.d.ts +1 -0
  148. package/ts_build/src/agents/tools/astAppendNode.js +98 -0
  149. package/ts_build/src/agents/tools/astAppendNode.js.map +1 -0
  150. package/ts_build/src/agents/tools/astDeleteNode.d.ts +1 -0
  151. package/ts_build/src/agents/tools/astDeleteNode.js +95 -0
  152. package/ts_build/src/agents/tools/astDeleteNode.js.map +1 -0
  153. package/ts_build/src/agents/tools/astEditNode.d.ts +1 -0
  154. package/ts_build/src/agents/tools/astEditNode.js +98 -0
  155. package/ts_build/src/agents/tools/astEditNode.js.map +1 -0
  156. package/ts_build/src/agents/tools/astGetPathForLine.d.ts +1 -0
  157. package/ts_build/src/agents/tools/astGetPathForLine.js +89 -0
  158. package/ts_build/src/agents/tools/astGetPathForLine.js.map +1 -0
  159. package/ts_build/src/agents/tools/astListPaths.d.ts +1 -0
  160. package/ts_build/src/agents/tools/astListPaths.js +82 -0
  161. package/ts_build/src/agents/tools/astListPaths.js.map +1 -0
  162. package/ts_build/src/agents/tools/callPlugin.js +4 -2
  163. package/ts_build/src/agents/tools/callPlugin.js.map +1 -1
  164. package/ts_build/src/agents/tools/embeddingSearch.js +3 -2
  165. package/ts_build/src/agents/tools/embeddingSearch.js.map +1 -1
  166. package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
  167. package/ts_build/src/agents/tools/execCommand.js +201 -67
  168. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  169. package/ts_build/src/agents/tools/fileSearch.d.ts +1 -1
  170. package/ts_build/src/agents/tools/fileSearch.js +11 -15
  171. package/ts_build/src/agents/tools/fileSearch.js.map +1 -1
  172. package/ts_build/src/agents/tools/github/index.d.ts +1 -1
  173. package/ts_build/src/agents/tools/index.d.ts +1 -0
  174. package/ts_build/src/agents/tools/index.js +1 -0
  175. package/ts_build/src/agents/tools/index.js.map +1 -1
  176. package/ts_build/src/agents/tools/language/definitions.js +11 -2
  177. package/ts_build/src/agents/tools/language/definitions.js.map +1 -1
  178. package/ts_build/src/agents/tools/language/index.js +4 -3
  179. package/ts_build/src/agents/tools/language/index.js.map +1 -1
  180. package/ts_build/src/agents/tools/lintFile.js +4 -2
  181. package/ts_build/src/agents/tools/lintFile.js.map +1 -1
  182. package/ts_build/src/agents/tools/list.js +185 -49
  183. package/ts_build/src/agents/tools/list.js.map +1 -1
  184. package/ts_build/src/agents/tools/patch.js +33 -10
  185. package/ts_build/src/agents/tools/patch.js.map +1 -1
  186. package/ts_build/src/agents/tools/readBlocks.js +23 -0
  187. package/ts_build/src/agents/tools/readBlocks.js.map +1 -1
  188. package/ts_build/src/agents/tools/readFile.js +14 -0
  189. package/ts_build/src/agents/tools/readFile.js.map +1 -1
  190. package/ts_build/src/agents/tools/stringReplace.js +19 -2
  191. package/ts_build/src/agents/tools/stringReplace.js.map +1 -1
  192. package/ts_build/src/agents/tools/writeFile.js +40 -0
  193. package/ts_build/src/agents/tools/writeFile.js.map +1 -1
  194. package/ts_build/src/agents/tools/ycmd/server.js +5 -0
  195. package/ts_build/src/agents/tools/ycmd/server.js.map +1 -1
  196. package/ts_build/src/chat/CliChatService.d.ts +1 -0
  197. package/ts_build/src/chat/CliChatService.js +6 -2
  198. package/ts_build/src/chat/CliChatService.js.map +1 -1
  199. package/ts_build/src/chat/modules/AgentModule.d.ts +5 -1
  200. package/ts_build/src/chat/modules/AgentModule.js +53 -31
  201. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  202. package/ts_build/src/chat/modules/AskModule.js.map +1 -1
  203. package/ts_build/src/chat/modules/SetupModule.js +4 -3
  204. package/ts_build/src/chat/modules/SetupModule.js.map +1 -1
  205. package/ts_build/src/chat/modules/SystemModule.js +19 -4
  206. package/ts_build/src/chat/modules/SystemModule.js.map +1 -1
  207. package/ts_build/src/chat/modules/index.d.ts +5 -0
  208. package/ts_build/src/chat/modules/index.js +14 -0
  209. package/ts_build/src/chat/modules/index.js.map +1 -0
  210. package/ts_build/src/chat/types.d.ts +2 -0
  211. package/ts_build/src/chat-old.js +3 -3
  212. package/ts_build/src/chat-old.js.map +1 -1
  213. package/ts_build/src/clients/anthropic.d.ts +1 -0
  214. package/ts_build/src/clients/anthropic.js +22 -1
  215. package/ts_build/src/clients/anthropic.js.map +1 -1
  216. package/ts_build/src/clients/openai.js +1 -1
  217. package/ts_build/src/clients/openai.js.map +1 -1
  218. package/ts_build/src/clients/types.d.ts +1 -1
  219. package/ts_build/src/clients/xai.d.ts +7 -0
  220. package/ts_build/src/clients/xai.js +13 -4
  221. package/ts_build/src/clients/xai.js.map +1 -1
  222. package/ts_build/src/config.js +14 -3
  223. package/ts_build/src/config.js.map +1 -1
  224. package/ts_build/src/dataset/diffs/generate.js +2 -2
  225. package/ts_build/src/dataset/diffs/generate.js.map +1 -1
  226. package/ts_build/src/dataset/diffs/jsonl.js.map +1 -1
  227. package/ts_build/src/embeddings.js +7 -9
  228. package/ts_build/src/embeddings.js.map +1 -1
  229. package/ts_build/src/index.js +10 -10
  230. package/ts_build/src/index.js.map +1 -1
  231. package/ts_build/src/plugins/GitPlugin.d.ts +39 -0
  232. package/ts_build/src/plugins/GitPlugin.js +439 -0
  233. package/ts_build/src/plugins/GitPlugin.js.map +1 -0
  234. package/ts_build/src/plugins/LinterPlugin.d.ts +15 -0
  235. package/ts_build/src/plugins/LinterPlugin.js +65 -0
  236. package/ts_build/src/plugins/LinterPlugin.js.map +1 -0
  237. package/ts_build/src/plugins/PluginBase.d.ts +4 -3
  238. package/ts_build/src/plugins/PluginBase.js +3 -3
  239. package/ts_build/src/plugins/PluginBase.js.map +1 -1
  240. package/ts_build/src/plugins/asana.d.ts +3 -1
  241. package/ts_build/src/plugins/asana.js +3 -2
  242. package/ts_build/src/plugins/asana.js.map +1 -1
  243. package/ts_build/src/plugins/downloader/plugin.d.ts +3 -1
  244. package/ts_build/src/plugins/downloader/plugin.js +3 -2
  245. package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
  246. package/ts_build/src/plugins/embedding.d.ts +5 -1
  247. package/ts_build/src/plugins/embedding.js +15 -3
  248. package/ts_build/src/plugins/embedding.js.map +1 -1
  249. package/ts_build/src/plugins/figma.d.ts +3 -1
  250. package/ts_build/src/plugins/figma.js +28 -4
  251. package/ts_build/src/plugins/figma.js.map +1 -1
  252. package/ts_build/src/plugins/github.d.ts +3 -1
  253. package/ts_build/src/plugins/github.js +3 -2
  254. package/ts_build/src/plugins/github.js.map +1 -1
  255. package/ts_build/src/plugins/jira.d.ts +3 -1
  256. package/ts_build/src/plugins/jira.js +3 -2
  257. package/ts_build/src/plugins/jira.js.map +1 -1
  258. package/ts_build/src/plugins/language.d.ts +7 -4
  259. package/ts_build/src/plugins/language.js +85 -20
  260. package/ts_build/src/plugins/language.js.map +1 -1
  261. package/ts_build/src/plugins/linear.d.ts +3 -1
  262. package/ts_build/src/plugins/linear.js +3 -2
  263. package/ts_build/src/plugins/linear.js.map +1 -1
  264. package/ts_build/src/plugins/notion.d.ts +3 -1
  265. package/ts_build/src/plugins/notion.js +3 -2
  266. package/ts_build/src/plugins/notion.js.map +1 -1
  267. package/ts_build/src/plugins/plugins.d.ts +4 -3
  268. package/ts_build/src/plugins/plugins.js +24 -14
  269. package/ts_build/src/plugins/plugins.js.map +1 -1
  270. package/ts_build/src/plugins/tree-sitter/editor.d.ts +34 -0
  271. package/ts_build/src/plugins/tree-sitter/editor.js +218 -0
  272. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -0
  273. package/ts_build/src/plugins/tree-sitter/human-readable-paths-new.d.ts +29 -0
  274. package/ts_build/src/plugins/tree-sitter/human-readable-paths-new.js +538 -0
  275. package/ts_build/src/plugins/tree-sitter/human-readable-paths-new.js.map +1 -0
  276. package/ts_build/src/plugins/tree-sitter/human-readable-paths.d.ts +22 -0
  277. package/ts_build/src/plugins/tree-sitter/human-readable-paths.js +332 -0
  278. package/ts_build/src/plugins/tree-sitter/human-readable-paths.js.map +1 -0
  279. package/ts_build/src/plugins/tree-sitter/lang-packs/index.d.ts +8 -0
  280. package/ts_build/src/plugins/tree-sitter/lang-packs/index.js +26 -0
  281. package/ts_build/src/plugins/tree-sitter/lang-packs/index.js.map +1 -0
  282. package/ts_build/src/plugins/tree-sitter/lang-packs/java.d.ts +2 -0
  283. package/ts_build/src/plugins/tree-sitter/lang-packs/java.js +61 -0
  284. package/ts_build/src/plugins/tree-sitter/lang-packs/java.js.map +1 -0
  285. package/ts_build/src/plugins/tree-sitter/lang-packs/javascript.d.ts +2 -0
  286. package/ts_build/src/plugins/tree-sitter/lang-packs/javascript.js +59 -0
  287. package/ts_build/src/plugins/tree-sitter/lang-packs/javascript.js.map +1 -0
  288. package/ts_build/src/plugins/tree-sitter/lang-packs/python.d.ts +2 -0
  289. package/ts_build/src/plugins/tree-sitter/lang-packs/python.js +47 -0
  290. package/ts_build/src/plugins/tree-sitter/lang-packs/python.js.map +1 -0
  291. package/ts_build/src/plugins/tree-sitter/lang-packs/types.d.ts +43 -0
  292. package/ts_build/src/plugins/tree-sitter/lang-packs/types.js +3 -0
  293. package/ts_build/src/plugins/tree-sitter/lang-packs/types.js.map +1 -0
  294. package/ts_build/src/plugins/tree-sitter/lang-packs/typescript.d.ts +2 -0
  295. package/ts_build/src/plugins/tree-sitter/lang-packs/typescript.js +50 -0
  296. package/ts_build/src/plugins/tree-sitter/lang-packs/typescript.js.map +1 -0
  297. package/ts_build/src/plugins/tree-sitter/parser.d.ts +75 -0
  298. package/ts_build/src/plugins/tree-sitter/parser.js +306 -0
  299. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -0
  300. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +22 -0
  301. package/ts_build/src/plugins/tree-sitter/simple-paths.js +332 -0
  302. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -0
  303. package/ts_build/src/plugins/types.d.ts +10 -0
  304. package/ts_build/src/plugins/url.d.ts +3 -2
  305. package/ts_build/src/plugins/url.js +3 -2
  306. package/ts_build/src/plugins/url.js.map +1 -1
  307. package/ts_build/src/plugins/vim.d.ts +4 -2
  308. package/ts_build/src/plugins/vim.js +6 -8
  309. package/ts_build/src/plugins/vim.js.map +1 -1
  310. package/ts_build/src/processors/CustomVariables.js +12 -3
  311. package/ts_build/src/processors/CustomVariables.js.map +1 -1
  312. package/ts_build/src/processors/TokenCompressor.js +8 -11
  313. package/ts_build/src/processors/TokenCompressor.js.map +1 -1
  314. package/ts_build/src/processors/ToolResponseCache.d.ts +2 -2
  315. package/ts_build/src/processors/ToolResponseCache.js +12 -2
  316. package/ts_build/src/processors/ToolResponseCache.js.map +1 -1
  317. package/ts_build/src/services/EmbeddingService.d.ts +10 -1
  318. package/ts_build/src/services/EmbeddingService.js +12 -12
  319. package/ts_build/src/services/EmbeddingService.js.map +1 -1
  320. package/ts_build/src/services/EventService.d.ts +7 -0
  321. package/ts_build/src/services/EventService.js +49 -0
  322. package/ts_build/src/services/EventService.js.map +1 -1
  323. package/ts_build/src/services/Mcp.js +8 -0
  324. package/ts_build/src/services/Mcp.js.map +1 -1
  325. package/ts_build/src/services/S3.js +4 -3
  326. package/ts_build/src/services/S3.js.map +1 -1
  327. package/ts_build/src/services/Tools.d.ts +1 -0
  328. package/ts_build/src/services/Tools.js +97 -35
  329. package/ts_build/src/services/Tools.js.map +1 -1
  330. package/ts_build/src/services/index.d.ts +4 -5
  331. package/ts_build/src/services/index.js +14 -9
  332. package/ts_build/src/services/index.js.map +1 -1
  333. package/ts_build/src/services/types.js +3 -3
  334. package/ts_build/src/services/types.js.map +1 -1
  335. package/ts_build/src/types.d.ts +7 -1
  336. package/ts_build/src/types.js +4 -0
  337. package/ts_build/src/types.js.map +1 -1
  338. package/ts_build/src/worker.js +12 -1
  339. package/ts_build/src/worker.js.map +1 -1
  340. package/ts_build/tests/clients/AIClient.test.d.ts +1 -0
  341. package/ts_build/tests/clients/AIClient.test.js +377 -0
  342. package/ts_build/tests/clients/AIClient.test.js.map +1 -0
  343. package/ts_build/tests/languagePlugin.test.js +217 -11
  344. package/ts_build/tests/languagePlugin.test.js.map +1 -1
  345. package/ts_build/tests/manual/agent-events/event-handler-reliability.test.d.ts +1 -0
  346. package/ts_build/tests/manual/agent-events/event-handler-reliability.test.js +315 -0
  347. package/ts_build/tests/manual/agent-events/event-handler-reliability.test.js.map +1 -0
  348. package/ts_build/tests/manual/agent-events/run-test.d.ts +2 -0
  349. package/ts_build/tests/manual/agent-events/run-test.js +148 -0
  350. package/ts_build/tests/manual/agent-events/run-test.js.map +1 -0
  351. package/ts_build/tests/manual/file-edits/figma.test.d.ts +1 -0
  352. package/ts_build/tests/manual/file-edits/figma.test.js +47 -0
  353. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -0
  354. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +1 -0
  355. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +100 -0
  356. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +1 -0
  357. package/ts_build/tests/manual/file-edits/patching.test.d.ts +1 -0
  358. package/ts_build/tests/manual/file-edits/patching.test.js +119 -0
  359. package/ts_build/tests/manual/file-edits/patching.test.js.map +1 -0
  360. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +1 -0
  361. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +277 -0
  362. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -0
  363. package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +1 -0
  364. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +331 -0
  365. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +1 -0
  366. package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +1 -0
  367. package/ts_build/tests/plugins/language/languagePlugin.test.js +286 -0
  368. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -0
  369. package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +1 -0
  370. package/ts_build/tests/processors/Base64ImageDetector.test.js +351 -0
  371. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +1 -0
  372. package/ts_build/tests/processors/CustomVariables.test.d.ts +1 -0
  373. package/ts_build/tests/processors/CustomVariables.test.js +351 -0
  374. package/ts_build/tests/processors/CustomVariables.test.js.map +1 -0
  375. package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +1 -0
  376. package/ts_build/tests/processors/HarmonyToolProcessor.test.js +382 -0
  377. package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +1 -0
  378. package/ts_build/tests/processors/TokenCompressor.test.d.ts +1 -0
  379. package/ts_build/tests/processors/TokenCompressor.test.js +300 -0
  380. package/ts_build/tests/processors/TokenCompressor.test.js.map +1 -0
  381. package/ts_build/tests/processors/ToolResponseCache.test.d.ts +1 -0
  382. package/ts_build/tests/processors/ToolResponseCache.test.js +539 -0
  383. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -0
  384. package/ts_build/tests/services/Plugins/plugin-event-integration.test.d.ts +1 -0
  385. package/ts_build/tests/services/Plugins/plugin-event-integration.test.js +232 -0
  386. package/ts_build/tests/services/Plugins/plugin-event-integration.test.js.map +1 -0
  387. package/ts_build/tests/services/Tools.test.d.ts +1 -0
  388. package/ts_build/tests/services/Tools.test.js +1059 -0
  389. package/ts_build/tests/services/Tools.test.js.map +1 -0
  390. package/ts_build/tests/test.spec.js +110 -68
  391. package/ts_build/tests/test.spec.js.map +1 -1
  392. package/ts_build/tests/tree-sitter/editor.test.d.ts +1 -0
  393. package/ts_build/tests/tree-sitter/editor.test.js +85 -0
  394. package/ts_build/tests/tree-sitter/editor.test.js.map +1 -0
  395. package/ts_build/tests/tree-sitter/invalid.test.d.ts +1 -0
  396. package/ts_build/tests/tree-sitter/invalid.test.js +198 -0
  397. package/ts_build/tests/tree-sitter/invalid.test.js.map +1 -0
  398. package/ts_build/tests/tree-sitter/paths/common-edits.test.d.ts +1 -0
  399. package/ts_build/tests/tree-sitter/paths/common-edits.test.js +347 -0
  400. package/ts_build/tests/tree-sitter/paths/common-edits.test.js.map +1 -0
  401. package/ts_build/tests/tree-sitter/paths/debug-exact-position.test.d.ts +1 -0
  402. package/ts_build/tests/tree-sitter/paths/debug-exact-position.test.js +35 -0
  403. package/ts_build/tests/tree-sitter/paths/debug-exact-position.test.js.map +1 -0
  404. package/ts_build/tests/tree-sitter/paths/debug-line-indexing.test.d.ts +1 -0
  405. package/ts_build/tests/tree-sitter/paths/debug-line-indexing.test.js +38 -0
  406. package/ts_build/tests/tree-sitter/paths/debug-line-indexing.test.js.map +1 -0
  407. package/ts_build/tests/tree-sitter/paths/debug-paths.test.d.ts +1 -0
  408. package/ts_build/tests/tree-sitter/paths/debug-paths.test.js +74 -0
  409. package/ts_build/tests/tree-sitter/paths/debug-paths.test.js.map +1 -0
  410. package/ts_build/tests/tree-sitter/paths/human-readable-paths.test.d.ts +1 -0
  411. package/ts_build/tests/tree-sitter/paths/human-readable-paths.test.js +302 -0
  412. package/ts_build/tests/tree-sitter/paths/human-readable-paths.test.js.map +1 -0
  413. package/ts_build/tests/tree-sitter/paths/paths.test.d.ts +1 -0
  414. package/ts_build/tests/tree-sitter/paths/paths.test.js +116 -0
  415. package/ts_build/tests/tree-sitter/paths/paths.test.js.map +1 -0
  416. package/ts_build/tests/tree-sitter/paths/simple-paths.test.d.ts +1 -0
  417. package/ts_build/tests/tree-sitter/paths/simple-paths.test.js +302 -0
  418. package/ts_build/tests/tree-sitter/paths/simple-paths.test.js.map +1 -0
  419. package/ts_build/tests/tree-sitter/sample-after.d.ts +11 -0
  420. package/ts_build/tests/tree-sitter/sample-after.js +44 -0
  421. package/ts_build/tests/tree-sitter/sample-after.js.map +1 -0
  422. package/ts_build/tests/tree-sitter/sample-before.d.ts +9 -0
  423. package/ts_build/tests/tree-sitter/sample-before.js +28 -0
  424. package/ts_build/tests/tree-sitter/sample-before.js.map +1 -0
  425. package/ts_build/tests/tree-sitter/test-files/completely-broken.d.ts +2 -0
  426. package/ts_build/tests/tree-sitter/test-files/completely-broken.js +17 -0
  427. package/ts_build/tests/tree-sitter/test-files/completely-broken.js.map +1 -0
  428. package/ts_build/tests/tree-sitter/test-files/duplicate-braces.d.ts +8 -0
  429. package/ts_build/tests/tree-sitter/test-files/duplicate-braces.js +38 -0
  430. package/ts_build/tests/tree-sitter/test-files/duplicate-braces.js.map +1 -0
  431. package/ts_build/tests/tree-sitter/test-files/invalid-nesting.d.ts +8 -0
  432. package/ts_build/tests/tree-sitter/test-files/invalid-nesting.js +38 -0
  433. package/ts_build/tests/tree-sitter/test-files/invalid-nesting.js.map +1 -0
  434. package/ts_build/tests/tree-sitter/test-files/malformed-signature.d.ts +8 -0
  435. package/ts_build/tests/tree-sitter/test-files/malformed-signature.js +38 -0
  436. package/ts_build/tests/tree-sitter/test-files/malformed-signature.js.map +1 -0
  437. package/ts_build/tests/tree-sitter/test-files/mismatched-parens.d.ts +10 -0
  438. package/ts_build/tests/tree-sitter/test-files/mismatched-parens.js +38 -0
  439. package/ts_build/tests/tree-sitter/test-files/mismatched-parens.js.map +1 -0
  440. package/ts_build/tests/tree-sitter/test-files/missing-semicolon.d.ts +8 -0
  441. package/ts_build/tests/tree-sitter/test-files/missing-semicolon.js +38 -0
  442. package/ts_build/tests/tree-sitter/test-files/missing-semicolon.js.map +1 -0
  443. package/ts_build/tests/tree-sitter/test-files/partially-broken.d.ts +6 -0
  444. package/ts_build/tests/tree-sitter/test-files/partially-broken.js +20 -0
  445. package/ts_build/tests/tree-sitter/test-files/partially-broken.js.map +1 -0
  446. package/ts_build/tests/tree-sitter/test-files/specific-errors.d.ts +7 -0
  447. package/ts_build/tests/tree-sitter/test-files/specific-errors.js +14 -0
  448. package/ts_build/tests/tree-sitter/test-files/specific-errors.js.map +1 -0
  449. package/ts_build/tests/tree-sitter/test-files/unclosed-string.d.ts +8 -0
  450. package/ts_build/tests/tree-sitter/test-files/unclosed-string.js +38 -0
  451. package/ts_build/tests/tree-sitter/test-files/unclosed-string.js.map +1 -0
  452. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +1 -0
  453. package/ts_build/tests/tree-sitter/tree-sitter.test.js +185 -0
  454. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -0
  455. package/tsconfig.json +2 -1
  456. package/tests/languagePlugin.test.ts +0 -74
  457. /package/src/chat/modules/{index.js → index.ts} +0 -0
  458. /package/tests/{integration → manual/file-edits}/patching/input.txt +0 -0
  459. /package/tests/{integration → manual/file-edits}/patching/output.txt +0 -0
  460. /package/tests/{integration → manual/file-edits}/patching/patch.txt +0 -0
  461. /package/tests/{integration → manual/file-edits}/patching/unseen.txt +0 -0
@@ -1,9 +1,37 @@
1
+ // Global mocks that need to be hoisted before any imports
2
+ jest.mock("tree-sitter", () => {
3
+ return jest.fn().mockImplementation(() => ({
4
+ setLanguage: jest.fn(),
5
+ parse: jest.fn(() => ({ rootNode: { toString: () => "mock tree" } })),
6
+ }));
7
+ });
8
+ jest.mock("tree-sitter-typescript", () => ({ typescript: jest.fn() }));
9
+ jest.mock("tree-sitter-javascript", () => ({ javascript: jest.fn() }));
10
+ jest.mock("../src/plugins/tree-sitter/parser", () => ({
11
+ LanguageAgnosticParser: jest.fn(),
12
+ }));
13
+ jest.mock("../src/plugins/tree-sitter/editor", () => ({
14
+ TreeEditor: jest.fn(),
15
+ }));
16
+ jest.mock("../src/services/S3", () => ({
17
+ S3Service: jest.fn().mockImplementation(() => ({
18
+ uploadFile: jest.fn(),
19
+ downloadFile: jest.fn(),
20
+ uploadToPresignedUrl: jest.fn(),
21
+ downloadFromPresignedUrl: jest.fn(),
22
+ })),
23
+ }));
24
+ jest.mock("@aws-sdk/client-s3", () => ({
25
+ S3Client: jest.fn(),
26
+ }));
1
27
  jest.mock("fs");
2
28
  jest.mock("../src/plugins/plugins");
29
+ jest.mock("../src/utils");
30
+ jest.mock("../src/agents/tools/lintFile");
31
+ jest.mock("../src/index");
3
32
 
33
+ // Import modules after mocking
4
34
  import * as fs from "fs";
5
- import { exec } from "child_process";
6
-
7
35
  import {
8
36
  embeddingSearch,
9
37
  readFile,
@@ -12,121 +40,138 @@ import {
12
40
  execCommand,
13
41
  writeFile,
14
42
  } from "../src/agents/tools";
15
- import { Plugins } from "../src/plugins/plugins";
43
+ import { services } from "../src/services";
16
44
  import { patchFile } from "../src/agents/tools/patch";
45
+ import { fileExists } from "../src/utils";
46
+ import * as utils from "../src/utils";
47
+ import { lintFile } from "../src/agents/tools/lintFile";
48
+ import { embed } from "../src/index";
17
49
 
18
50
  const mockFs = jest.mocked(fs);
19
-
20
- test("searchFiles should call the embeddings plugin with the correct keyword", async () => {
21
- const mocked = Plugins as jest.Mocked<typeof Plugins>;
22
- const keyword = "test";
23
- const expectedResult = JSON.stringify({ files: ["test1.js", "test2.js"] });
24
-
25
- // Setting up the plugin to return the expected result
26
- mocked.call.mockResolvedValue(expectedResult);
27
-
28
- const result = await embeddingSearch(keyword);
29
-
30
- // Verifying that the plugin was called with the correct keyword
31
- expect(Plugins.call).toHaveBeenCalledWith("embeddings", keyword);
32
- // Verifying that the function returns the expected result
33
- expect(result).toBe(expectedResult);
34
- });
35
-
36
- test("readFile should return the content of a file", () => {
37
- const filePath = "test.txt";
38
- const fileContent = "Hello World";
39
-
40
- // Mock readFile to return the fileContent
41
- mockFs.readFileSync.mockReturnValue(fileContent);
42
-
43
- const result = readFile(filePath);
44
-
45
- // Verify readFile was called with the correct file path
46
- expect(fs.readFileSync).toHaveBeenCalledWith(filePath, "utf8");
47
- // Verify the result matches the fileContent
48
- expect(result).toBe(JSON.stringify([[1, fileContent]]));
49
- });
50
-
51
- test("scanFile should return the contents of a specified range of lines from a file", () => {
52
- const filePath = "test.txt";
53
- const fileContentLines = ["Line1", "Line2", "Line3", "Line4", "Line5"];
54
- const startLine = 3;
55
- const endLine = 3;
56
-
57
- // Mock fs.readFileSync to return joined fileContentLines
58
- mockFs.readFileSync.mockReturnValue(fileContentLines.join("\n"));
59
-
60
- const result = scanFile(filePath, startLine, endLine);
61
-
62
- // Verify fs.readFileSync was called with the correct file path
63
- expect(fs.readFileSync).toHaveBeenCalledWith(filePath, "utf8");
64
- // Verify that the correct range of lines is returned
65
- expect(result).toBe(
66
- JSON.stringify([
67
- [1, "Line1"],
68
- [2, "Line2"],
69
- [3, "Line3"],
70
- [4, "Line4"],
71
- [5, "Line5"],
72
- ])
73
- );
74
- });
75
-
76
- test("writeFile should write the full contents to a file", () => {
77
- const filePath = "testWrite.txt";
78
- const contentToWrite = "Writing to file";
79
-
80
- // Mock fs.writeFileSync to not actually write to disk
81
- mockFs.writeFileSync.mockImplementation(() => {});
82
-
83
- const result = writeFile(filePath, contentToWrite);
84
-
85
- // Verify fs.writeFileSync was called with the correct arguments
86
- expect(fs.writeFileSync).toHaveBeenCalledWith(filePath, contentToWrite);
87
- // Verify the function returns a success message
88
- expect(result).toBe(`File ${filePath} written`);
89
- });
90
-
91
- test("applyPatchFile should apply a patch to a file", async () => {
92
- const filePath = "testPatch.txt";
93
- const originalContent = "Original content\n";
94
- const patchedContent = "Patched content\n";
95
- const patch = "@@ -1,1 +1,1 @@\n-Original content\n+Patched content\n";
96
-
97
- // Mock fs.readFileSync to return the originalContent
98
- mockFs.readFileSync.mockReturnValue(originalContent);
99
- // Mock fs.writeFileSync to not actually write to disk
100
- mockFs.writeFileSync.mockImplementation(() => {});
101
-
102
- const result = await patchFile(filePath, patch);
103
-
104
- // Verify fs.readFileSync was called with the correct file path
105
- expect(fs.readFileSync).toHaveBeenCalledWith(filePath, "utf8");
106
- // Verify fs.writeFileSync was called with the corrected content
107
- expect(fs.writeFileSync).toHaveBeenCalledWith(filePath, patchedContent);
108
- // Verify the function returns a success message
109
- expect(result.startsWith("Patch Applied")).toBe(true);
110
- });
111
-
112
- test("execCommand should execute a system command and return its output", async () => {
113
- const command = 'echo "Hello World"';
114
- const expectedOutput = "Hello World\n";
115
-
116
- // Use the execCommand and expect it to return the correct result
117
- const result = await execCommand(command);
118
- expect(result).toEqual(expectedOutput);
119
- });
120
-
121
- test("execCommand should return an error message if the command fails", async () => {
122
- const command = "exit 1";
123
- const expectedOutput = "Command failed: exit 1\n";
124
-
125
- // Use the execCommand and expect it to return the correct result
126
- const result = await execCommand(command);
127
- expect(result).toEqual(expectedOutput);
128
- });
129
-
130
- test("it should run a test", () => {
131
- expect(true).toEqual(true);
132
- });
51
+ const mockServices = jest.mocked(services);
52
+ const mockUtils = jest.mocked(utils);
53
+ const mockLintFile = jest.mocked(lintFile);
54
+ const mockEmbed = jest.mocked(embed);
55
+
56
+ describe("Agent Tools Tests", () => {
57
+ test("searchFiles should call the embeddings plugin with the correct keyword", async () => {
58
+ const { Plugins } = mockServices();
59
+ const expectedResult = JSON.stringify({ files: ["test1.js", "test2.js"] });
60
+ const mocked = Plugins as jest.Mocked<typeof Plugins>;
61
+ const keyword = "test";
62
+
63
+ // Setting up the plugin to return the expected result
64
+ mocked.call.mockResolvedValue(expectedResult);
65
+
66
+ const result = await embeddingSearch(keyword);
67
+
68
+ // Verifying that the plugin was called with the correct keyword
69
+ expect(Plugins.call).toHaveBeenCalledWith("embeddings", keyword);
70
+ // Verifying that the function returns the expected result
71
+ expect(result).toBe(expectedResult);
72
+ });
73
+
74
+ test("readFile should return the content of a file", async () => {
75
+ const filePath = "test.txt";
76
+ const fileContent = "Hello World";
77
+
78
+ mockUtils.fileExists.mockResolvedValue(true);
79
+
80
+ // Mock readFile to return the fileContent
81
+ mockFs.readFileSync.mockReturnValue(fileContent);
82
+
83
+ const result = await readFile(filePath);
84
+
85
+ // Verify readFile was called with the correct file path
86
+ expect(mockFs.readFileSync).toHaveBeenCalledWith(filePath, "utf8");
87
+ // Verify the result is a patch (since readFile now returns patch format)
88
+ expect(result).toContain(fileContent);
89
+ });
90
+
91
+ test("scanFile should return the contents of a specified range of lines from a file", () => {
92
+ const filePath = "test.txt";
93
+ const fileContentLines = ["Line1", "Line2", "Line3", "Line4", "Line5"];
94
+ const startLine = 3;
95
+ const endLine = 3;
96
+
97
+ // Mock fs.readFileSync to return joined fileContentLines
98
+ mockFs.readFileSync.mockReturnValue(fileContentLines.join("\n"));
99
+
100
+ const result = scanFile(filePath, startLine, endLine);
101
+
102
+ // Verify fs.readFileSync was called with the correct file path
103
+ expect(mockFs.readFileSync).toHaveBeenCalledWith(filePath, "utf8");
104
+ // Verify that the correct range of lines is returned
105
+ expect(result).toBe(
106
+ JSON.stringify([
107
+ [1, "Line1"],
108
+ [2, "Line2"],
109
+ [3, "Line3"],
110
+ [4, "Line4"],
111
+ [5, "Line5"],
112
+ ])
113
+ );
114
+ });
115
+
116
+ test("writeFile should write the full contents to a file", () => {
117
+ const filePath = "testWrite.txt";
118
+ const contentToWrite = "Writing to file";
119
+
120
+ // Mock fs.writeFileSync to not actually write to disk
121
+ mockFs.writeFileSync.mockImplementation(() => {});
122
+
123
+ const result = writeFile(filePath, contentToWrite);
124
+
125
+ // Verify fs.writeFileSync was called with the correct arguments
126
+ expect(mockFs.writeFileSync).toHaveBeenCalledWith(filePath, contentToWrite);
127
+ // Verify the function returns a success message
128
+ expect(result).toBe(`File ${filePath} written`);
129
+ });
130
+
131
+ test("applyPatchFile should apply a patch to a file", async () => {
132
+ const filePath = "testPatch.txt";
133
+ const originalContent = "Original content\n";
134
+ const patch = "@@ -1,1 +1,1 @@\n-Original content\n+Patched content\n";
135
+
136
+ // Mock fs.existsSync to return true (file exists)
137
+ mockFs.existsSync.mockReturnValue(true);
138
+
139
+ // Mock the utilities that patchFile uses
140
+ mockUtils.readFile.mockResolvedValue(originalContent);
141
+ mockUtils.writeFile.mockResolvedValue(undefined);
142
+ mockUtils.fileExists.mockResolvedValue(true);
143
+ mockUtils.mkdir.mockResolvedValue(undefined);
144
+ mockUtils.splitByNewLines.mockImplementation((text: string) =>
145
+ text.split(/\r?\n/)
146
+ );
147
+ mockLintFile.mockResolvedValue("");
148
+ mockEmbed.mockResolvedValue(undefined);
149
+
150
+ const result = await patchFile(filePath, patch);
151
+
152
+ // Verify the function returns a success message
153
+ expect(result).toContain("Patch applied successfully");
154
+ }, 60000); // Increase timeout to 60 seconds
155
+
156
+ test("execCommand should execute a system command and return its output", async () => {
157
+ const command = 'echo "Hello World"';
158
+ const expectedOutput = '$ echo "Hello World"\nHello World\n';
159
+
160
+ // Use the execCommand and expect it to return the correct result
161
+ const result = await execCommand(command);
162
+ expect(result).toEqual(expectedOutput);
163
+ });
164
+
165
+ test("execCommand should return an error message if the command fails", async () => {
166
+ const command = "exit 1";
167
+ const expectedOutput = "$ exit 1\nCommand failed: exit 1";
168
+
169
+ // Use the execCommand and expect it to return the correct result
170
+ const result = await execCommand(command);
171
+ expect(result.trim()).toEqual(expectedOutput);
172
+ });
173
+
174
+ test("it should run a test", () => {
175
+ expect(true).toEqual(true);
176
+ });
177
+ });
@@ -0,0 +1,113 @@
1
+ import { join } from "path";
2
+ import { TreeEditor } from "../../src/plugins/tree-sitter/editor";
3
+ import { LanguageAgnosticParser } from "../../src/plugins/tree-sitter/parser";
4
+
5
+ describe("TreeEditor", () => {
6
+ let parser: LanguageAgnosticParser;
7
+ const sampleCode = `class Calculator {
8
+ add(a, b) {
9
+ return a + b;
10
+ }
11
+
12
+ multiply(a, b) {
13
+ return a * b;
14
+ }
15
+ }`;
16
+
17
+ beforeEach(() => {
18
+ parser = LanguageAgnosticParser.createJavaScriptParser();
19
+ });
20
+
21
+ test("should create TreeEditor from string", () => {
22
+ const editor = new TreeEditor(parser, sampleCode);
23
+ expect(editor).toBeDefined();
24
+ expect(editor.getCurrentText()).toBe(sampleCode);
25
+ });
26
+
27
+ test("should create TreeEditor from file", () => {
28
+ const beforeFilePath = join(__dirname, "sample-before.ts");
29
+ const editor = TreeEditor.fromFile(parser, beforeFilePath);
30
+ expect(editor).toBeDefined();
31
+ expect(editor.getCurrentText().length).toBeGreaterThan(0);
32
+ });
33
+
34
+ test("should add lines to code", () => {
35
+ const editor = new TreeEditor(parser, sampleCode);
36
+ const newEditor = editor.addLines(
37
+ "",
38
+ " subtract(a, b) {\n return a - b;\n }",
39
+ 5
40
+ );
41
+
42
+ const newText = newEditor.getCurrentText();
43
+ expect(newText).toContain("subtract");
44
+ expect(newText.split("\n").length).toBeGreaterThan(
45
+ sampleCode.split("\n").length
46
+ );
47
+
48
+ console.log("After adding lines:\n", newText);
49
+ });
50
+
51
+ test("should remove lines from code", () => {
52
+ const editor = new TreeEditor(parser, sampleCode);
53
+ const newEditor = editor.removeLines(1, 3); // Remove add method
54
+
55
+ const newText = newEditor.getCurrentText();
56
+ expect(newText).not.toContain("add(a, b)");
57
+ expect(newText.split("\n").length).toBeLessThan(
58
+ sampleCode.split("\n").length
59
+ );
60
+
61
+ console.log("After removing lines:\n", newText);
62
+ });
63
+
64
+ test("should update a specific line", () => {
65
+ const editor = new TreeEditor(parser, sampleCode);
66
+ const newEditor = editor.updateLine(0, "class AdvancedCalculator {");
67
+
68
+ const newText = newEditor.getCurrentText();
69
+ expect(newText).toContain("AdvancedCalculator");
70
+ expect(newText).not.toContain("class Calculator {");
71
+
72
+ console.log("After updating line:\n", newText);
73
+ });
74
+
75
+ test("should generate diff between original and modified", () => {
76
+ const editor = new TreeEditor(parser, sampleCode);
77
+ const newEditor = editor
78
+ .updateLine(0, "class AdvancedCalculator {")
79
+ .addLines("", " subtract(a, b) {\n return a - b;\n }", 5);
80
+
81
+ const diff = newEditor.generateDiff();
82
+
83
+ expect(diff).toContain("---");
84
+ expect(diff).toContain("+++");
85
+ expect(diff).toContain("-class Calculator {");
86
+ expect(diff).toContain("+class AdvancedCalculator {");
87
+ expect(diff).toContain("+ subtract(a, b) {");
88
+ expect(diff).toContain("+ return a - b;");
89
+
90
+ console.log("Generated diff:\n", diff);
91
+ });
92
+
93
+ test("should handle complex editing workflow", () => {
94
+ const beforeFilePath = join(__dirname, "sample-before.ts");
95
+ const editor = TreeEditor.fromFile(parser, beforeFilePath);
96
+
97
+ // Make multiple edits
98
+ const modifiedEditor = editor
99
+ .addLines("", " private operationCount: number = 0;", 2)
100
+ .updateLine(5, " // Enhanced add method")
101
+ .addLines("", " this.operationCount++;", 9);
102
+
103
+ const diff = modifiedEditor.generateDiff();
104
+ const newText = modifiedEditor.getCurrentText();
105
+
106
+ expect(newText).toContain("operationCount");
107
+ expect(newText).toContain("Enhanced add method");
108
+ expect(diff).toContain("operationCount");
109
+
110
+ console.log("Complex edit result:\n", newText);
111
+ console.log("Complex edit diff:\n", diff);
112
+ });
113
+ });