@office-ai/aioncli-core 0.8.1 → 0.18.4

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 (777) hide show
  1. package/dist/index.d.ts +8 -2
  2. package/dist/index.js +7 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/agents/codebase-investigator.d.ts +36 -1
  5. package/dist/src/agents/codebase-investigator.js +93 -34
  6. package/dist/src/agents/codebase-investigator.js.map +1 -1
  7. package/dist/src/agents/codebase-investigator.test.d.ts +6 -0
  8. package/dist/src/agents/codebase-investigator.test.js +35 -0
  9. package/dist/src/agents/codebase-investigator.test.js.map +1 -0
  10. package/dist/src/agents/executor.d.ts +37 -11
  11. package/dist/src/agents/executor.js +512 -150
  12. package/dist/src/agents/executor.js.map +1 -1
  13. package/dist/src/agents/executor.test.js +1188 -245
  14. package/dist/src/agents/executor.test.js.map +1 -1
  15. package/dist/src/agents/invocation.d.ts +5 -2
  16. package/dist/src/agents/invocation.js +4 -2
  17. package/dist/src/agents/invocation.js.map +1 -1
  18. package/dist/src/agents/invocation.test.js +9 -0
  19. package/dist/src/agents/invocation.test.js.map +1 -1
  20. package/dist/src/agents/registry.d.ts +6 -1
  21. package/dist/src/agents/registry.js +51 -4
  22. package/dist/src/agents/registry.js.map +1 -1
  23. package/dist/src/agents/registry.test.js +30 -16
  24. package/dist/src/agents/registry.test.js.map +1 -1
  25. package/dist/src/agents/subagent-tool-wrapper.d.ts +3 -1
  26. package/dist/src/agents/subagent-tool-wrapper.js +4 -3
  27. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  28. package/dist/src/agents/subagent-tool-wrapper.test.js +9 -4
  29. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  30. package/dist/src/agents/types.d.ts +37 -7
  31. package/dist/src/agents/types.js +2 -0
  32. package/dist/src/agents/types.js.map +1 -1
  33. package/dist/src/code_assist/codeAssist.js +1 -1
  34. package/dist/src/code_assist/codeAssist.test.d.ts +6 -0
  35. package/dist/src/code_assist/codeAssist.test.js +99 -0
  36. package/dist/src/code_assist/codeAssist.test.js.map +1 -0
  37. package/dist/src/code_assist/converter.d.ts +1 -0
  38. package/dist/src/code_assist/converter.js +1 -0
  39. package/dist/src/code_assist/converter.js.map +1 -1
  40. package/dist/src/code_assist/converter.test.js +19 -0
  41. package/dist/src/code_assist/converter.test.js.map +1 -1
  42. package/dist/src/code_assist/experiments/client_metadata.d.ts +12 -0
  43. package/dist/src/code_assist/experiments/client_metadata.js +50 -0
  44. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -0
  45. package/dist/src/code_assist/experiments/client_metadata.test.d.ts +6 -0
  46. package/dist/src/code_assist/experiments/client_metadata.test.js +99 -0
  47. package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -0
  48. package/dist/src/code_assist/experiments/experiments.d.ts +17 -0
  49. package/dist/src/code_assist/experiments/experiments.js +36 -0
  50. package/dist/src/code_assist/experiments/experiments.js.map +1 -0
  51. package/dist/src/code_assist/experiments/experiments.test.d.ts +6 -0
  52. package/dist/src/code_assist/experiments/experiments.test.js +92 -0
  53. package/dist/src/code_assist/experiments/experiments.test.js.map +1 -0
  54. package/dist/src/code_assist/experiments/flagNames.d.ts +13 -0
  55. package/dist/src/code_assist/experiments/flagNames.js +13 -0
  56. package/dist/src/code_assist/experiments/flagNames.js.map +1 -0
  57. package/dist/src/code_assist/experiments/types.d.ts +35 -0
  58. package/dist/src/code_assist/experiments/types.js +7 -0
  59. package/dist/src/code_assist/experiments/types.js.map +1 -0
  60. package/dist/src/code_assist/oauth-credential-storage.js +6 -5
  61. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  62. package/dist/src/code_assist/oauth-credential-storage.test.js +65 -3
  63. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  64. package/dist/src/code_assist/oauth2.d.ts +2 -2
  65. package/dist/src/code_assist/oauth2.js +161 -93
  66. package/dist/src/code_assist/oauth2.js.map +1 -1
  67. package/dist/src/code_assist/oauth2.test.js +103 -57
  68. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  69. package/dist/src/code_assist/server.d.ts +6 -4
  70. package/dist/src/code_assist/server.js +16 -8
  71. package/dist/src/code_assist/server.js.map +1 -1
  72. package/dist/src/code_assist/server.test.js +126 -28
  73. package/dist/src/code_assist/server.test.js.map +1 -1
  74. package/dist/src/code_assist/setup.d.ts +2 -2
  75. package/dist/src/code_assist/setup.js +4 -2
  76. package/dist/src/code_assist/setup.js.map +1 -1
  77. package/dist/src/code_assist/types.d.ts +1 -1
  78. package/dist/src/code_assist/types.js.map +1 -1
  79. package/dist/src/commands/extensions.d.ts +7 -0
  80. package/dist/src/commands/extensions.js +9 -0
  81. package/dist/src/commands/extensions.js.map +1 -0
  82. package/dist/src/commands/extensions.test.d.ts +6 -0
  83. package/dist/src/commands/extensions.test.js +19 -0
  84. package/dist/src/commands/extensions.test.js.map +1 -0
  85. package/dist/src/config/config.d.ts +169 -43
  86. package/dist/src/config/config.js +418 -79
  87. package/dist/src/config/config.js.map +1 -1
  88. package/dist/src/config/config.test.js +684 -49
  89. package/dist/src/config/config.test.js.map +1 -1
  90. package/dist/src/config/defaultModelConfigs.d.ts +7 -0
  91. package/dist/src/config/defaultModelConfigs.js +185 -0
  92. package/dist/src/config/defaultModelConfigs.js.map +1 -0
  93. package/dist/src/config/models.d.ts +23 -2
  94. package/dist/src/config/models.js +50 -7
  95. package/dist/src/config/models.js.map +1 -1
  96. package/dist/src/config/models.test.js +71 -10
  97. package/dist/src/config/models.test.js.map +1 -1
  98. package/dist/src/config/storage.d.ts +3 -1
  99. package/dist/src/config/storage.js +22 -2
  100. package/dist/src/config/storage.js.map +1 -1
  101. package/dist/src/config/storage.test.js +7 -6
  102. package/dist/src/config/storage.test.js.map +1 -1
  103. package/dist/src/confirmation-bus/message-bus.d.ts +3 -2
  104. package/dist/src/confirmation-bus/message-bus.js +9 -3
  105. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  106. package/dist/src/confirmation-bus/message-bus.test.js +30 -24
  107. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
  108. package/dist/src/confirmation-bus/types.d.ts +13 -2
  109. package/dist/src/confirmation-bus/types.js +1 -0
  110. package/dist/src/confirmation-bus/types.js.map +1 -1
  111. package/dist/src/core/apiKeyCredentialStorage.d.ts +17 -0
  112. package/dist/src/core/apiKeyCredentialStorage.js +64 -0
  113. package/dist/src/core/apiKeyCredentialStorage.js.map +1 -0
  114. package/dist/src/core/apiKeyCredentialStorage.test.d.ts +6 -0
  115. package/dist/src/core/apiKeyCredentialStorage.test.js +71 -0
  116. package/dist/src/core/apiKeyCredentialStorage.test.js.map +1 -0
  117. package/dist/src/core/baseLlmClient.d.ts +4 -8
  118. package/dist/src/core/baseLlmClient.js +6 -11
  119. package/dist/src/core/baseLlmClient.js.map +1 -1
  120. package/dist/src/core/baseLlmClient.test.js +22 -27
  121. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  122. package/dist/src/core/client.d.ts +12 -19
  123. package/dist/src/core/client.js +104 -206
  124. package/dist/src/core/client.js.map +1 -1
  125. package/dist/src/core/client.test.js +329 -452
  126. package/dist/src/core/client.test.js.map +1 -1
  127. package/dist/src/core/contentGenerator.d.ts +3 -2
  128. package/dist/src/core/contentGenerator.js +56 -41
  129. package/dist/src/core/contentGenerator.js.map +1 -1
  130. package/dist/src/core/contentGenerator.test.js +49 -1
  131. package/dist/src/core/contentGenerator.test.js.map +1 -1
  132. package/dist/src/core/coreToolScheduler.d.ts +8 -4
  133. package/dist/src/core/coreToolScheduler.js +348 -179
  134. package/dist/src/core/coreToolScheduler.js.map +1 -1
  135. package/dist/src/core/coreToolScheduler.test.js +575 -219
  136. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  137. package/dist/src/core/fakeContentGenerator.d.ts +33 -0
  138. package/dist/src/core/fakeContentGenerator.js +58 -0
  139. package/dist/src/core/fakeContentGenerator.js.map +1 -0
  140. package/dist/src/core/fakeContentGenerator.test.d.ts +6 -0
  141. package/dist/src/core/fakeContentGenerator.test.js +127 -0
  142. package/dist/src/core/fakeContentGenerator.test.js.map +1 -0
  143. package/dist/src/core/geminiChat.d.ts +23 -18
  144. package/dist/src/core/geminiChat.js +186 -108
  145. package/dist/src/core/geminiChat.js.map +1 -1
  146. package/dist/src/core/geminiChat.test.js +581 -270
  147. package/dist/src/core/geminiChat.test.js.map +1 -1
  148. package/dist/src/core/logger.d.ts +7 -2
  149. package/dist/src/core/logger.js +35 -27
  150. package/dist/src/core/logger.js.map +1 -1
  151. package/dist/src/core/logger.test.js +45 -29
  152. package/dist/src/core/logger.test.js.map +1 -1
  153. package/dist/src/core/loggingContentGenerator.d.ts +1 -0
  154. package/dist/src/core/loggingContentGenerator.js +113 -33
  155. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  156. package/dist/src/core/loggingContentGenerator.test.d.ts +6 -0
  157. package/dist/src/core/loggingContentGenerator.test.js +180 -0
  158. package/dist/src/core/loggingContentGenerator.test.js.map +1 -0
  159. package/dist/src/core/nonInteractiveToolExecutor.d.ts +3 -2
  160. package/dist/src/core/nonInteractiveToolExecutor.js +12 -7
  161. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  162. package/dist/src/core/nonInteractiveToolExecutor.test.js +12 -8
  163. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  164. package/dist/src/core/openaiContentGenerator.js +31 -8
  165. package/dist/src/core/openaiContentGenerator.js.map +1 -1
  166. package/dist/src/core/prompts.d.ts +2 -1
  167. package/dist/src/core/prompts.js +135 -154
  168. package/dist/src/core/prompts.js.map +1 -1
  169. package/dist/src/core/prompts.test.js +128 -189
  170. package/dist/src/core/prompts.test.js.map +1 -1
  171. package/dist/src/core/recordingContentGenerator.d.ts +18 -0
  172. package/dist/src/core/recordingContentGenerator.js +77 -0
  173. package/dist/src/core/recordingContentGenerator.js.map +1 -0
  174. package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
  175. package/dist/src/core/recordingContentGenerator.test.js +101 -0
  176. package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
  177. package/dist/src/core/tokenLimits.test.d.ts +6 -0
  178. package/dist/src/core/tokenLimits.test.js +26 -0
  179. package/dist/src/core/tokenLimits.test.js.map +1 -0
  180. package/dist/src/core/turn.d.ts +23 -3
  181. package/dist/src/core/turn.js +18 -9
  182. package/dist/src/core/turn.js.map +1 -1
  183. package/dist/src/core/turn.test.js +98 -104
  184. package/dist/src/core/turn.test.js.map +1 -1
  185. package/dist/src/fallback/handler.js +60 -8
  186. package/dist/src/fallback/handler.js.map +1 -1
  187. package/dist/src/fallback/handler.test.js +132 -17
  188. package/dist/src/fallback/handler.test.js.map +1 -1
  189. package/dist/src/fallback/types.d.ts +1 -1
  190. package/dist/src/generated/git-commit.d.ts +2 -2
  191. package/dist/src/generated/git-commit.js +2 -2
  192. package/dist/src/generated/git-commit.js.map +1 -1
  193. package/dist/src/hooks/hookAggregator.d.ts +68 -0
  194. package/dist/src/hooks/hookAggregator.js +262 -0
  195. package/dist/src/hooks/hookAggregator.js.map +1 -0
  196. package/dist/src/hooks/hookAggregator.test.d.ts +6 -0
  197. package/dist/src/hooks/hookAggregator.test.js +387 -0
  198. package/dist/src/hooks/hookAggregator.test.js.map +1 -0
  199. package/dist/src/hooks/hookPlanner.d.ts +46 -0
  200. package/dist/src/hooks/hookPlanner.js +108 -0
  201. package/dist/src/hooks/hookPlanner.js.map +1 -0
  202. package/dist/src/hooks/hookPlanner.test.d.ts +6 -0
  203. package/dist/src/hooks/hookPlanner.test.js +255 -0
  204. package/dist/src/hooks/hookPlanner.test.js.map +1 -0
  205. package/dist/src/hooks/hookRegistry.d.ts +87 -0
  206. package/dist/src/hooks/hookRegistry.js +198 -0
  207. package/dist/src/hooks/hookRegistry.js.map +1 -0
  208. package/dist/src/hooks/hookRegistry.test.d.ts +6 -0
  209. package/dist/src/hooks/hookRegistry.test.js +341 -0
  210. package/dist/src/hooks/hookRegistry.test.js.map +1 -0
  211. package/dist/src/hooks/hookRunner.d.ts +42 -0
  212. package/dist/src/hooks/hookRunner.js +272 -0
  213. package/dist/src/hooks/hookRunner.js.map +1 -0
  214. package/dist/src/hooks/hookRunner.test.d.ts +6 -0
  215. package/dist/src/hooks/hookRunner.test.js +468 -0
  216. package/dist/src/hooks/hookRunner.test.js.map +1 -0
  217. package/dist/src/hooks/hookTranslator.d.ts +113 -0
  218. package/dist/src/hooks/hookTranslator.js +232 -0
  219. package/dist/src/hooks/hookTranslator.js.map +1 -0
  220. package/dist/src/hooks/hookTranslator.test.d.ts +6 -0
  221. package/dist/src/hooks/hookTranslator.test.js +192 -0
  222. package/dist/src/hooks/hookTranslator.test.js.map +1 -0
  223. package/dist/src/hooks/types.d.ts +384 -0
  224. package/dist/src/hooks/types.js +284 -0
  225. package/dist/src/hooks/types.js.map +1 -0
  226. package/dist/src/hooks/types.test.d.ts +6 -0
  227. package/dist/src/hooks/types.test.js +313 -0
  228. package/dist/src/hooks/types.test.js.map +1 -0
  229. package/dist/src/ide/detect-ide.d.ts +4 -0
  230. package/dist/src/ide/detect-ide.js +6 -1
  231. package/dist/src/ide/detect-ide.js.map +1 -1
  232. package/dist/src/ide/detect-ide.test.js +16 -0
  233. package/dist/src/ide/detect-ide.test.js.map +1 -1
  234. package/dist/src/ide/ide-client.d.ts +3 -1
  235. package/dist/src/ide/ide-client.js +12 -10
  236. package/dist/src/ide/ide-client.js.map +1 -1
  237. package/dist/src/ide/ide-client.test.js +163 -4
  238. package/dist/src/ide/ide-client.test.js.map +1 -1
  239. package/dist/src/ide/ide-installer.js +66 -21
  240. package/dist/src/ide/ide-installer.js.map +1 -1
  241. package/dist/src/ide/ide-installer.test.js +54 -1
  242. package/dist/src/ide/ide-installer.test.js.map +1 -1
  243. package/dist/src/ide/process-utils.js +85 -75
  244. package/dist/src/ide/process-utils.js.map +1 -1
  245. package/dist/src/ide/process-utils.test.js +83 -90
  246. package/dist/src/ide/process-utils.test.js.map +1 -1
  247. package/dist/src/ide/types.d.ts +1 -1
  248. package/dist/src/ide/types.js +1 -1
  249. package/dist/src/index.d.ts +21 -0
  250. package/dist/src/index.js +24 -0
  251. package/dist/src/index.js.map +1 -1
  252. package/dist/src/mcp/google-auth-provider.d.ts +2 -0
  253. package/dist/src/mcp/google-auth-provider.js +21 -3
  254. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  255. package/dist/src/mcp/google-auth-provider.test.js +42 -9
  256. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  257. package/dist/src/mcp/oauth-provider.d.ts +8 -5
  258. package/dist/src/mcp/oauth-provider.js +140 -55
  259. package/dist/src/mcp/oauth-provider.js.map +1 -1
  260. package/dist/src/mcp/oauth-provider.test.js +369 -2
  261. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  262. package/dist/src/mcp/oauth-token-storage.js +5 -4
  263. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  264. package/dist/src/mcp/oauth-token-storage.test.js +17 -11
  265. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  266. package/dist/src/mcp/oauth-utils.d.ts +7 -0
  267. package/dist/src/mcp/oauth-utils.js +28 -8
  268. package/dist/src/mcp/oauth-utils.js.map +1 -1
  269. package/dist/src/mcp/oauth-utils.test.js +45 -2
  270. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  271. package/dist/src/mcp/sa-impersonation-provider.d.ts +0 -6
  272. package/dist/src/mcp/sa-impersonation-provider.js +6 -23
  273. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
  274. package/dist/src/mcp/token-storage/base-token-storage.test.js +75 -84
  275. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
  276. package/dist/src/mcp/token-storage/file-token-storage.js +3 -2
  277. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  278. package/dist/src/mcp/token-storage/file-token-storage.test.js +11 -8
  279. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  280. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
  281. package/dist/src/mcp/token-storage/keychain-token-storage.js +63 -7
  282. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  283. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +54 -3
  284. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
  285. package/dist/src/mcp/token-storage/types.d.ts +6 -0
  286. package/dist/src/mcp/token-storage/types.js.map +1 -1
  287. package/dist/src/output/stream-json-formatter.d.ts +32 -0
  288. package/dist/src/output/stream-json-formatter.js +52 -0
  289. package/dist/src/output/stream-json-formatter.js.map +1 -0
  290. package/dist/src/output/stream-json-formatter.test.d.ts +6 -0
  291. package/dist/src/output/stream-json-formatter.test.js +479 -0
  292. package/dist/src/output/stream-json-formatter.test.js.map +1 -0
  293. package/dist/src/output/types.d.ts +63 -1
  294. package/dist/src/output/types.js +11 -0
  295. package/dist/src/output/types.js.map +1 -1
  296. package/dist/src/policy/config.d.ts +31 -0
  297. package/dist/src/policy/config.js +199 -0
  298. package/dist/src/policy/config.js.map +1 -0
  299. package/dist/src/policy/config.test.d.ts +6 -0
  300. package/dist/src/policy/config.test.js +538 -0
  301. package/dist/src/policy/config.test.js.map +1 -0
  302. package/dist/src/policy/index.d.ts +2 -0
  303. package/dist/src/policy/index.js +2 -0
  304. package/dist/src/policy/index.js.map +1 -1
  305. package/dist/src/policy/policies/discovered.toml +8 -0
  306. package/dist/src/policy/policies/read-only.toml +56 -0
  307. package/dist/src/policy/policies/write.toml +73 -0
  308. package/dist/src/policy/policies/yolo.toml +31 -0
  309. package/dist/src/policy/policy-engine.d.ts +12 -3
  310. package/dist/src/policy/policy-engine.js +74 -8
  311. package/dist/src/policy/policy-engine.js.map +1 -1
  312. package/dist/src/policy/policy-engine.test.js +460 -76
  313. package/dist/src/policy/policy-engine.test.js.map +1 -1
  314. package/dist/src/policy/toml-loader.d.ts +47 -0
  315. package/dist/src/policy/toml-loader.js +411 -0
  316. package/dist/src/policy/toml-loader.js.map +1 -0
  317. package/dist/src/policy/toml-loader.test.d.ts +6 -0
  318. package/dist/src/policy/toml-loader.test.js +376 -0
  319. package/dist/src/policy/toml-loader.test.js.map +1 -0
  320. package/dist/src/policy/types.d.ts +83 -0
  321. package/dist/src/policy/types.js +10 -0
  322. package/dist/src/policy/types.js.map +1 -1
  323. package/dist/src/prompts/mcp-prompts.test.d.ts +6 -0
  324. package/dist/src/prompts/mcp-prompts.test.js +39 -0
  325. package/dist/src/prompts/mcp-prompts.test.js.map +1 -0
  326. package/dist/src/prompts/prompt-registry.js +2 -1
  327. package/dist/src/prompts/prompt-registry.js.map +1 -1
  328. package/dist/src/prompts/prompt-registry.test.d.ts +6 -0
  329. package/dist/src/prompts/prompt-registry.test.js +96 -0
  330. package/dist/src/prompts/prompt-registry.test.js.map +1 -0
  331. package/dist/src/routing/modelRouterService.js +15 -0
  332. package/dist/src/routing/modelRouterService.js.map +1 -1
  333. package/dist/src/routing/modelRouterService.test.js +62 -0
  334. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  335. package/dist/src/routing/strategies/classifierStrategy.d.ts +1 -1
  336. package/dist/src/routing/strategies/classifierStrategy.js +9 -16
  337. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  338. package/dist/src/routing/strategies/classifierStrategy.test.js +17 -13
  339. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  340. package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
  341. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  342. package/dist/src/routing/strategies/fallbackStrategy.test.js +4 -0
  343. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  344. package/dist/src/routing/strategies/overrideStrategy.js +2 -2
  345. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  346. package/dist/src/routing/strategies/overrideStrategy.test.js +3 -0
  347. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
  348. package/dist/src/safety/built-in.d.ts +21 -0
  349. package/dist/src/safety/built-in.js +106 -0
  350. package/dist/src/safety/built-in.js.map +1 -0
  351. package/dist/src/safety/built-in.test.d.ts +6 -0
  352. package/dist/src/safety/built-in.test.js +199 -0
  353. package/dist/src/safety/built-in.test.js.map +1 -0
  354. package/dist/src/safety/checker-runner.d.ts +48 -0
  355. package/dist/src/safety/checker-runner.js +208 -0
  356. package/dist/src/safety/checker-runner.js.map +1 -0
  357. package/dist/src/safety/checker-runner.test.d.ts +6 -0
  358. package/dist/src/safety/checker-runner.test.js +238 -0
  359. package/dist/src/safety/checker-runner.test.js.map +1 -0
  360. package/dist/src/safety/context-builder.d.ts +23 -0
  361. package/dist/src/safety/context-builder.js +47 -0
  362. package/dist/src/safety/context-builder.js.map +1 -0
  363. package/dist/src/safety/context-builder.test.d.ts +6 -0
  364. package/dist/src/safety/context-builder.test.js +49 -0
  365. package/dist/src/safety/context-builder.test.js.map +1 -0
  366. package/dist/src/safety/protocol.d.ts +88 -0
  367. package/dist/src/safety/protocol.js +15 -0
  368. package/dist/src/safety/protocol.js.map +1 -0
  369. package/dist/src/safety/registry.d.ts +26 -0
  370. package/dist/src/safety/registry.js +65 -0
  371. package/dist/src/safety/registry.js.map +1 -0
  372. package/dist/src/safety/registry.test.d.ts +6 -0
  373. package/dist/src/safety/registry.test.js +31 -0
  374. package/dist/src/safety/registry.test.js.map +1 -0
  375. package/dist/src/services/chatCompressionService.d.ts +32 -0
  376. package/dist/src/services/chatCompressionService.js +162 -0
  377. package/dist/src/services/chatCompressionService.js.map +1 -0
  378. package/dist/src/services/chatCompressionService.test.d.ts +6 -0
  379. package/dist/src/services/chatCompressionService.test.js +210 -0
  380. package/dist/src/services/chatCompressionService.test.js.map +1 -0
  381. package/dist/src/services/chatRecordingService.d.ts +3 -2
  382. package/dist/src/services/chatRecordingService.js +11 -9
  383. package/dist/src/services/chatRecordingService.js.map +1 -1
  384. package/dist/src/services/fileDiscoveryService.d.ts +2 -14
  385. package/dist/src/services/fileDiscoveryService.js +19 -55
  386. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  387. package/dist/src/services/fileDiscoveryService.test.js +91 -11
  388. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  389. package/dist/src/services/loopDetectionService.d.ts +4 -1
  390. package/dist/src/services/loopDetectionService.js +95 -42
  391. package/dist/src/services/loopDetectionService.js.map +1 -1
  392. package/dist/src/services/loopDetectionService.test.js +220 -12
  393. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  394. package/dist/src/services/modelConfig.golden.test.d.ts +6 -0
  395. package/dist/src/services/modelConfig.golden.test.js +42 -0
  396. package/dist/src/services/modelConfig.golden.test.js.map +1 -0
  397. package/dist/src/services/modelConfig.integration.test.d.ts +6 -0
  398. package/dist/src/services/modelConfig.integration.test.js +247 -0
  399. package/dist/src/services/modelConfig.integration.test.js.map +1 -0
  400. package/dist/src/services/modelConfigService.d.ts +48 -0
  401. package/dist/src/services/modelConfigService.js +151 -0
  402. package/dist/src/services/modelConfigService.js.map +1 -0
  403. package/dist/src/services/modelConfigService.test.d.ts +6 -0
  404. package/dist/src/services/modelConfigService.test.js +531 -0
  405. package/dist/src/services/modelConfigService.test.js.map +1 -0
  406. package/dist/src/services/shellExecutionService.d.ts +1 -0
  407. package/dist/src/services/shellExecutionService.js +195 -92
  408. package/dist/src/services/shellExecutionService.js.map +1 -1
  409. package/dist/src/services/shellExecutionService.test.js +137 -14
  410. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  411. package/dist/src/services/test-data/resolved-aliases.golden.json +202 -0
  412. package/dist/src/telemetry/activity-monitor.d.ts +116 -0
  413. package/dist/src/telemetry/activity-monitor.js +209 -0
  414. package/dist/src/telemetry/activity-monitor.js.map +1 -0
  415. package/dist/src/telemetry/activity-monitor.test.d.ts +6 -0
  416. package/dist/src/telemetry/activity-monitor.test.js +251 -0
  417. package/dist/src/telemetry/activity-monitor.test.js.map +1 -0
  418. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +25 -7
  419. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +294 -76
  420. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  421. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +1 -0
  422. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +192 -66
  423. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  424. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +25 -3
  425. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +59 -5
  426. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  427. package/dist/src/telemetry/constants.d.ts +0 -28
  428. package/dist/src/telemetry/constants.js +0 -29
  429. package/dist/src/telemetry/constants.js.map +1 -1
  430. package/dist/src/telemetry/gcp-exporters.js +0 -1
  431. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  432. package/dist/src/telemetry/gcp-exporters.test.js +1 -1
  433. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
  434. package/dist/src/telemetry/index.d.ts +7 -3
  435. package/dist/src/telemetry/index.js +13 -4
  436. package/dist/src/telemetry/index.js.map +1 -1
  437. package/dist/src/telemetry/loggers.d.ts +14 -7
  438. package/dist/src/telemetry/loggers.js +197 -320
  439. package/dist/src/telemetry/loggers.js.map +1 -1
  440. package/dist/src/telemetry/loggers.test.circular.js +0 -1
  441. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  442. package/dist/src/telemetry/loggers.test.js +460 -59
  443. package/dist/src/telemetry/loggers.test.js.map +1 -1
  444. package/dist/src/telemetry/memory-monitor.d.ts +149 -0
  445. package/dist/src/telemetry/memory-monitor.js +335 -0
  446. package/dist/src/telemetry/memory-monitor.js.map +1 -0
  447. package/dist/src/telemetry/memory-monitor.test.d.ts +6 -0
  448. package/dist/src/telemetry/memory-monitor.test.js +472 -0
  449. package/dist/src/telemetry/memory-monitor.test.js.map +1 -0
  450. package/dist/src/telemetry/metrics.d.ts +180 -4
  451. package/dist/src/telemetry/metrics.js +270 -6
  452. package/dist/src/telemetry/metrics.js.map +1 -1
  453. package/dist/src/telemetry/metrics.test.js +502 -184
  454. package/dist/src/telemetry/metrics.test.js.map +1 -1
  455. package/dist/src/telemetry/sdk.js +3 -2
  456. package/dist/src/telemetry/sdk.js.map +1 -1
  457. package/dist/src/telemetry/semantic.d.ts +82 -0
  458. package/dist/src/telemetry/semantic.js +269 -0
  459. package/dist/src/telemetry/semantic.js.map +1 -0
  460. package/dist/src/telemetry/semantic.test.d.ts +6 -0
  461. package/dist/src/telemetry/semantic.test.js +387 -0
  462. package/dist/src/telemetry/semantic.test.js.map +1 -0
  463. package/dist/src/telemetry/telemetry-utils.test.js +29 -28
  464. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -1
  465. package/dist/src/telemetry/telemetryAttributes.d.ts +8 -0
  466. package/dist/src/telemetry/telemetryAttributes.js +19 -0
  467. package/dist/src/telemetry/telemetryAttributes.js.map +1 -0
  468. package/dist/src/telemetry/trace.d.ts +46 -0
  469. package/dist/src/telemetry/trace.js +121 -0
  470. package/dist/src/telemetry/trace.js.map +1 -0
  471. package/dist/src/telemetry/types.d.ts +227 -29
  472. package/dist/src/telemetry/types.js +858 -72
  473. package/dist/src/telemetry/types.js.map +1 -1
  474. package/dist/src/telemetry/uiTelemetry.d.ts +1 -1
  475. package/dist/src/telemetry/uiTelemetry.js +7 -7
  476. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  477. package/dist/src/telemetry/uiTelemetry.test.js +89 -67
  478. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  479. package/dist/src/test-utils/config.d.ts +1 -1
  480. package/dist/src/test-utils/config.js +1 -1
  481. package/dist/src/tools/base-tool-invocation.test.d.ts +6 -0
  482. package/dist/src/tools/base-tool-invocation.test.js +85 -0
  483. package/dist/src/tools/base-tool-invocation.test.js.map +1 -0
  484. package/dist/src/tools/edit.d.ts +4 -3
  485. package/dist/src/tools/edit.js +50 -47
  486. package/dist/src/tools/edit.js.map +1 -1
  487. package/dist/src/tools/edit.test.js +306 -216
  488. package/dist/src/tools/edit.test.js.map +1 -1
  489. package/dist/src/tools/glob.d.ts +4 -3
  490. package/dist/src/tools/glob.js +24 -27
  491. package/dist/src/tools/glob.js.map +1 -1
  492. package/dist/src/tools/glob.test.js +212 -205
  493. package/dist/src/tools/glob.test.js.map +1 -1
  494. package/dist/src/tools/grep.d.ts +4 -3
  495. package/dist/src/tools/grep.js +31 -25
  496. package/dist/src/tools/grep.js.map +1 -1
  497. package/dist/src/tools/grep.test.js +15 -12
  498. package/dist/src/tools/grep.test.js.map +1 -1
  499. package/dist/src/tools/ls.d.ts +4 -3
  500. package/dist/src/tools/ls.js +29 -35
  501. package/dist/src/tools/ls.js.map +1 -1
  502. package/dist/src/tools/ls.test.js +34 -42
  503. package/dist/src/tools/ls.test.js.map +1 -1
  504. package/dist/src/tools/mcp-client-manager.d.ts +49 -11
  505. package/dist/src/tools/mcp-client-manager.js +191 -31
  506. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  507. package/dist/src/tools/mcp-client-manager.test.js +132 -25
  508. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  509. package/dist/src/tools/mcp-client.d.ts +12 -5
  510. package/dist/src/tools/mcp-client.js +287 -267
  511. package/dist/src/tools/mcp-client.js.map +1 -1
  512. package/dist/src/tools/mcp-client.test.js +352 -45
  513. package/dist/src/tools/mcp-client.test.js.map +1 -1
  514. package/dist/src/tools/mcp-tool.d.ts +6 -2
  515. package/dist/src/tools/mcp-tool.js +19 -8
  516. package/dist/src/tools/mcp-tool.js.map +1 -1
  517. package/dist/src/tools/mcp-tool.test.js +186 -273
  518. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  519. package/dist/src/tools/memoryTool.d.ts +7 -5
  520. package/dist/src/tools/memoryTool.js +14 -12
  521. package/dist/src/tools/memoryTool.js.map +1 -1
  522. package/dist/src/tools/memoryTool.test.js +10 -9
  523. package/dist/src/tools/memoryTool.test.js.map +1 -1
  524. package/dist/src/tools/message-bus-integration.test.js +14 -1
  525. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  526. package/dist/src/tools/modifiable-tool.d.ts +5 -1
  527. package/dist/src/tools/modifiable-tool.js +38 -16
  528. package/dist/src/tools/modifiable-tool.js.map +1 -1
  529. package/dist/src/tools/modifiable-tool.test.js +66 -31
  530. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  531. package/dist/src/tools/read-file.d.ts +6 -5
  532. package/dist/src/tools/read-file.js +26 -32
  533. package/dist/src/tools/read-file.js.map +1 -1
  534. package/dist/src/tools/read-file.test.js +68 -33
  535. package/dist/src/tools/read-file.test.js.map +1 -1
  536. package/dist/src/tools/read-many-files.d.ts +6 -12
  537. package/dist/src/tools/read-many-files.js +28 -57
  538. package/dist/src/tools/read-many-files.js.map +1 -1
  539. package/dist/src/tools/read-many-files.test.js +37 -36
  540. package/dist/src/tools/read-many-files.test.js.map +1 -1
  541. package/dist/src/tools/ripGrep.d.ts +28 -10
  542. package/dist/src/tools/ripGrep.js +195 -193
  543. package/dist/src/tools/ripGrep.js.map +1 -1
  544. package/dist/src/tools/ripGrep.test.js +533 -204
  545. package/dist/src/tools/ripGrep.test.js.map +1 -1
  546. package/dist/src/tools/shell.d.ts +8 -6
  547. package/dist/src/tools/shell.js +64 -38
  548. package/dist/src/tools/shell.js.map +1 -1
  549. package/dist/src/tools/shell.test.js +134 -43
  550. package/dist/src/tools/shell.test.js.map +1 -1
  551. package/dist/src/tools/smart-edit.d.ts +10 -23
  552. package/dist/src/tools/smart-edit.js +100 -85
  553. package/dist/src/tools/smart-edit.js.map +1 -1
  554. package/dist/src/tools/smart-edit.test.js +229 -179
  555. package/dist/src/tools/smart-edit.test.js.map +1 -1
  556. package/dist/src/tools/tool-error.d.ts +21 -0
  557. package/dist/src/tools/tool-error.js +27 -0
  558. package/dist/src/tools/tool-error.js.map +1 -1
  559. package/dist/src/tools/tool-names.d.ts +17 -0
  560. package/dist/src/tools/tool-names.js +21 -0
  561. package/dist/src/tools/tool-names.js.map +1 -0
  562. package/dist/src/tools/tool-registry.d.ts +32 -20
  563. package/dist/src/tools/tool-registry.js +122 -78
  564. package/dist/src/tools/tool-registry.js.map +1 -1
  565. package/dist/src/tools/tool-registry.test.js +167 -90
  566. package/dist/src/tools/tool-registry.test.js.map +1 -1
  567. package/dist/src/tools/tools.d.ts +23 -8
  568. package/dist/src/tools/tools.js +69 -37
  569. package/dist/src/tools/tools.js.map +1 -1
  570. package/dist/src/tools/web-fetch.d.ts +11 -3
  571. package/dist/src/tools/web-fetch.js +80 -38
  572. package/dist/src/tools/web-fetch.js.map +1 -1
  573. package/dist/src/tools/web-fetch.test.js +338 -9
  574. package/dist/src/tools/web-fetch.test.js.map +1 -1
  575. package/dist/src/tools/web-search.d.ts +4 -3
  576. package/dist/src/tools/web-search.js +11 -9
  577. package/dist/src/tools/web-search.js.map +1 -1
  578. package/dist/src/tools/web-search.test.js +6 -0
  579. package/dist/src/tools/web-search.test.js.map +1 -1
  580. package/dist/src/tools/write-file.d.ts +3 -2
  581. package/dist/src/tools/write-file.js +41 -40
  582. package/dist/src/tools/write-file.js.map +1 -1
  583. package/dist/src/tools/write-file.test.js +130 -123
  584. package/dist/src/tools/write-file.test.js.map +1 -1
  585. package/dist/src/tools/write-todos.d.ts +34 -9
  586. package/dist/src/tools/write-todos.js +54 -11
  587. package/dist/src/tools/write-todos.js.map +1 -1
  588. package/dist/src/tools/write-todos.test.js +2 -2
  589. package/dist/src/tools/write-todos.test.js.map +1 -1
  590. package/dist/src/utils/bfsFileSearch.js +3 -2
  591. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  592. package/dist/src/utils/channel.d.ts +19 -0
  593. package/dist/src/utils/channel.js +49 -0
  594. package/dist/src/utils/channel.js.map +1 -0
  595. package/dist/src/utils/channel.test.d.ts +6 -0
  596. package/dist/src/utils/channel.test.js +170 -0
  597. package/dist/src/utils/channel.test.js.map +1 -0
  598. package/dist/src/utils/debugLogger.d.ts +25 -0
  599. package/dist/src/utils/debugLogger.js +33 -0
  600. package/dist/src/utils/debugLogger.js.map +1 -0
  601. package/dist/src/utils/debugLogger.test.d.ts +6 -0
  602. package/dist/src/utils/debugLogger.test.js +69 -0
  603. package/dist/src/utils/debugLogger.test.js.map +1 -0
  604. package/dist/src/utils/delay.d.ts +16 -0
  605. package/dist/src/utils/delay.js +43 -0
  606. package/dist/src/utils/delay.js.map +1 -0
  607. package/dist/src/utils/delay.test.d.ts +6 -0
  608. package/dist/src/utils/delay.test.js +88 -0
  609. package/dist/src/utils/delay.test.js.map +1 -0
  610. package/dist/src/utils/editCorrector.js +10 -25
  611. package/dist/src/utils/editCorrector.js.map +1 -1
  612. package/dist/src/utils/editCorrector.test.js +19 -5
  613. package/dist/src/utils/editCorrector.test.js.map +1 -1
  614. package/dist/src/utils/editor.d.ts +4 -2
  615. package/dist/src/utils/editor.js +53 -39
  616. package/dist/src/utils/editor.js.map +1 -1
  617. package/dist/src/utils/editor.test.js +18 -45
  618. package/dist/src/utils/editor.test.js.map +1 -1
  619. package/dist/src/utils/environmentContext.d.ts +2 -1
  620. package/dist/src/utils/environmentContext.js +20 -33
  621. package/dist/src/utils/environmentContext.js.map +1 -1
  622. package/dist/src/utils/environmentContext.test.js +6 -34
  623. package/dist/src/utils/environmentContext.test.js.map +1 -1
  624. package/dist/src/utils/errorParsing.d.ts +1 -1
  625. package/dist/src/utils/errorParsing.js +5 -33
  626. package/dist/src/utils/errorParsing.js.map +1 -1
  627. package/dist/src/utils/errorParsing.test.js +0 -88
  628. package/dist/src/utils/errorParsing.test.js.map +1 -1
  629. package/dist/src/utils/errors.d.ts +3 -0
  630. package/dist/src/utils/errors.js +6 -0
  631. package/dist/src/utils/errors.js.map +1 -1
  632. package/dist/src/utils/events.d.ts +121 -0
  633. package/dist/src/utils/events.js +84 -0
  634. package/dist/src/utils/events.js.map +1 -0
  635. package/dist/src/utils/events.test.d.ts +6 -0
  636. package/dist/src/utils/events.test.js +212 -0
  637. package/dist/src/utils/events.test.js.map +1 -0
  638. package/dist/src/utils/extensionLoader.d.ts +86 -0
  639. package/dist/src/utils/extensionLoader.js +208 -0
  640. package/dist/src/utils/extensionLoader.js.map +1 -0
  641. package/dist/src/utils/extensionLoader.test.d.ts +6 -0
  642. package/dist/src/utils/extensionLoader.test.js +154 -0
  643. package/dist/src/utils/extensionLoader.test.js.map +1 -0
  644. package/dist/src/utils/fetch.d.ts +1 -0
  645. package/dist/src/utils/fetch.js +4 -0
  646. package/dist/src/utils/fetch.js.map +1 -1
  647. package/dist/src/utils/fileUtils.d.ts +4 -0
  648. package/dist/src/utils/fileUtils.js +34 -2
  649. package/dist/src/utils/fileUtils.js.map +1 -1
  650. package/dist/src/utils/fileUtils.test.js +87 -61
  651. package/dist/src/utils/fileUtils.test.js.map +1 -1
  652. package/dist/src/utils/filesearch/fileSearch.js +1 -1
  653. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  654. package/dist/src/utils/flashFallback.test.js +28 -47
  655. package/dist/src/utils/flashFallback.test.js.map +1 -1
  656. package/dist/src/utils/formatters.d.ts +1 -0
  657. package/dist/src/utils/formatters.js +2 -1
  658. package/dist/src/utils/formatters.js.map +1 -1
  659. package/dist/src/utils/formatters.test.d.ts +6 -0
  660. package/dist/src/utils/formatters.test.js +26 -0
  661. package/dist/src/utils/formatters.test.js.map +1 -0
  662. package/dist/src/utils/getFolderStructure.js +9 -17
  663. package/dist/src/utils/getFolderStructure.js.map +1 -1
  664. package/dist/src/utils/getFolderStructure.test.js +7 -6
  665. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  666. package/dist/src/utils/gitIgnoreParser.d.ts +4 -1
  667. package/dist/src/utils/gitIgnoreParser.js +28 -10
  668. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  669. package/dist/src/utils/gitIgnoreParser.test.js +58 -0
  670. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  671. package/dist/src/utils/googleErrors.d.ts +104 -0
  672. package/dist/src/utils/googleErrors.js +152 -0
  673. package/dist/src/utils/googleErrors.js.map +1 -0
  674. package/dist/src/utils/googleErrors.test.d.ts +6 -0
  675. package/dist/src/utils/googleErrors.test.js +301 -0
  676. package/dist/src/utils/googleErrors.test.js.map +1 -0
  677. package/dist/src/utils/googleQuotaErrors.d.ts +37 -0
  678. package/dist/src/utils/googleQuotaErrors.js +157 -0
  679. package/dist/src/utils/googleQuotaErrors.js.map +1 -0
  680. package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
  681. package/dist/src/utils/googleQuotaErrors.test.js +311 -0
  682. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
  683. package/dist/src/utils/httpErrors.d.ts +18 -0
  684. package/dist/src/utils/httpErrors.js +36 -0
  685. package/dist/src/utils/httpErrors.js.map +1 -0
  686. package/dist/src/utils/ignorePatterns.test.js +26 -30
  687. package/dist/src/utils/ignorePatterns.test.js.map +1 -1
  688. package/dist/src/utils/installationManager.js +2 -1
  689. package/dist/src/utils/installationManager.js.map +1 -1
  690. package/dist/src/utils/installationManager.test.js +6 -4
  691. package/dist/src/utils/installationManager.test.js.map +1 -1
  692. package/dist/src/utils/llm-edit-fixer.d.ts +1 -1
  693. package/dist/src/utils/llm-edit-fixer.js +33 -9
  694. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  695. package/dist/src/utils/llm-edit-fixer.test.js +38 -1
  696. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  697. package/dist/src/utils/memoryDiscovery.d.ts +20 -1
  698. package/dist/src/utils/memoryDiscovery.js +176 -12
  699. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  700. package/dist/src/utils/memoryDiscovery.test.js +299 -40
  701. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  702. package/dist/src/utils/memoryImportProcessor.js +4 -3
  703. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  704. package/dist/src/utils/memoryImportProcessor.test.js +8 -14
  705. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  706. package/dist/src/utils/nextSpeakerChecker.js +3 -3
  707. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  708. package/dist/src/utils/nextSpeakerChecker.test.js +13 -5
  709. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  710. package/dist/src/utils/package.d.ts +12 -0
  711. package/dist/src/utils/package.js +15 -0
  712. package/dist/src/utils/package.js.map +1 -0
  713. package/dist/src/utils/pathCorrector.d.ts +25 -0
  714. package/dist/src/utils/pathCorrector.js +33 -0
  715. package/dist/src/utils/pathCorrector.js.map +1 -0
  716. package/dist/src/utils/pathCorrector.test.d.ts +6 -0
  717. package/dist/src/utils/pathCorrector.test.js +83 -0
  718. package/dist/src/utils/pathCorrector.test.js.map +1 -0
  719. package/dist/src/utils/pathReader.js +4 -4
  720. package/dist/src/utils/pathReader.js.map +1 -1
  721. package/dist/src/utils/pathReader.test.js +44 -1
  722. package/dist/src/utils/pathReader.test.js.map +1 -1
  723. package/dist/src/utils/paths.d.ts +1 -1
  724. package/dist/src/utils/paths.js +131 -29
  725. package/dist/src/utils/paths.js.map +1 -1
  726. package/dist/src/utils/paths.test.js +200 -68
  727. package/dist/src/utils/paths.test.js.map +1 -1
  728. package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
  729. package/dist/src/utils/quotaErrorDetection.js +0 -46
  730. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  731. package/dist/src/utils/retry.d.ts +3 -10
  732. package/dist/src/utils/retry.js +97 -195
  733. package/dist/src/utils/retry.js.map +1 -1
  734. package/dist/src/utils/retry.test.js +179 -145
  735. package/dist/src/utils/retry.test.js.map +1 -1
  736. package/dist/src/utils/safeJsonStringify.d.ts +4 -4
  737. package/dist/src/utils/safeJsonStringify.js +31 -7
  738. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  739. package/dist/src/utils/shell-utils.d.ts +15 -2
  740. package/dist/src/utils/shell-utils.js +387 -140
  741. package/dist/src/utils/shell-utils.js.map +1 -1
  742. package/dist/src/utils/shell-utils.test.js +244 -62
  743. package/dist/src/utils/shell-utils.test.js.map +1 -1
  744. package/dist/src/utils/stdio.d.ts +32 -0
  745. package/dist/src/utils/stdio.js +85 -0
  746. package/dist/src/utils/stdio.js.map +1 -0
  747. package/dist/src/utils/stdio.test.d.ts +6 -0
  748. package/dist/src/utils/stdio.test.js +47 -0
  749. package/dist/src/utils/stdio.test.js.map +1 -0
  750. package/dist/src/utils/summarizer.d.ts +4 -2
  751. package/dist/src/utils/summarizer.js +8 -9
  752. package/dist/src/utils/summarizer.js.map +1 -1
  753. package/dist/src/utils/summarizer.test.js +32 -12
  754. package/dist/src/utils/summarizer.test.js.map +1 -1
  755. package/dist/src/utils/systemEncoding.js +5 -4
  756. package/dist/src/utils/systemEncoding.js.map +1 -1
  757. package/dist/src/utils/systemEncoding.test.js +2 -1
  758. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  759. package/dist/src/utils/terminal.d.ts +14 -0
  760. package/dist/src/utils/terminal.js +38 -0
  761. package/dist/src/utils/terminal.js.map +1 -0
  762. package/dist/src/utils/tool-utils.d.ts +2 -2
  763. package/dist/src/utils/tool-utils.js +15 -6
  764. package/dist/src/utils/tool-utils.js.map +1 -1
  765. package/dist/src/utils/tool-utils.test.js +8 -0
  766. package/dist/src/utils/tool-utils.test.js.map +1 -1
  767. package/dist/src/utils/userAccountManager.js +5 -4
  768. package/dist/src/utils/userAccountManager.js.map +1 -1
  769. package/dist/src/utils/userAccountManager.test.js +9 -7
  770. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  771. package/dist/src/utils/workspaceContext.d.ts +4 -3
  772. package/dist/src/utils/workspaceContext.js +13 -13
  773. package/dist/src/utils/workspaceContext.js.map +1 -1
  774. package/dist/src/utils/workspaceContext.test.js +8 -7
  775. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  776. package/dist/tsconfig.tsbuildinfo +1 -1
  777. package/package.json +12 -7
@@ -34,9 +34,9 @@ import { ToolErrorType } from './tool-error.js';
34
34
  import path from 'node:path';
35
35
  import fs from 'node:fs';
36
36
  import os from 'node:os';
37
- import { ApprovalMode } from '../config/config.js';
38
- import { createMockWorkspaceContext } from '../test-utils/mockWorkspaceContext.js';
37
+ import { ApprovalMode } from '../policy/types.js';
39
38
  import { StandardFileSystemService } from '../services/fileSystemService.js';
39
+ import { WorkspaceContext } from '../utils/workspaceContext.js';
40
40
  describe('EditTool', () => {
41
41
  let tool;
42
42
  let tempDir;
@@ -61,7 +61,7 @@ describe('EditTool', () => {
61
61
  getTargetDir: () => rootDir,
62
62
  getApprovalMode: vi.fn(),
63
63
  setApprovalMode: vi.fn(),
64
- getWorkspaceContext: () => createMockWorkspaceContext(rootDir),
64
+ getWorkspaceContext: () => new WorkspaceContext(rootDir),
65
65
  getFileSystemService: () => new StandardFileSystemService(),
66
66
  getIdeMode: () => false,
67
67
  // getGeminiConfig: () => ({ apiKey: 'test-api-key' }), // This was not a real Config method
@@ -72,7 +72,6 @@ describe('EditTool', () => {
72
72
  getSandbox: () => false,
73
73
  getDebugMode: () => false,
74
74
  getQuestion: () => undefined,
75
- getFullContext: () => false,
76
75
  getToolDiscoveryCommand: () => undefined,
77
76
  getToolCallCommand: () => undefined,
78
77
  getMcpServerCommand: () => undefined,
@@ -83,6 +82,7 @@ describe('EditTool', () => {
83
82
  getGeminiMdFileCount: () => 0,
84
83
  setGeminiMdFileCount: vi.fn(),
85
84
  getToolRegistry: () => ({}), // Minimal mock for ToolRegistry
85
+ isInteractive: () => false,
86
86
  };
87
87
  // Reset mocks before each test
88
88
  mockConfig.getApprovalMode.mockClear();
@@ -157,75 +157,80 @@ describe('EditTool', () => {
157
157
  it('should return currentContent if oldString is empty and not a new file', () => {
158
158
  expect(applyReplacement('hello world', '', 'new', false)).toBe('hello world');
159
159
  });
160
- it('should treat $ literally and not as replacement pattern', () => {
161
- const current = "price is $100 and pattern end is ' '";
162
- const oldStr = 'price is $100';
163
- const newStr = 'price is $200';
160
+ it.each([
161
+ {
162
+ name: '$ literal',
163
+ current: "price is $100 and pattern end is ' '",
164
+ oldStr: 'price is $100',
165
+ newStr: 'price is $200',
166
+ expected: "price is $200 and pattern end is ' '",
167
+ },
168
+ {
169
+ name: "$' literal",
170
+ current: 'foo',
171
+ oldStr: 'foo',
172
+ newStr: "bar$'baz",
173
+ expected: "bar$'baz",
174
+ },
175
+ {
176
+ name: '$& literal',
177
+ current: 'hello world',
178
+ oldStr: 'hello',
179
+ newStr: '$&-replacement',
180
+ expected: '$&-replacement world',
181
+ },
182
+ {
183
+ name: '$` literal',
184
+ current: 'prefix-middle-suffix',
185
+ oldStr: 'middle',
186
+ newStr: 'new$`content',
187
+ expected: 'prefix-new$`content-suffix',
188
+ },
189
+ {
190
+ name: '$1, $2 capture groups literal',
191
+ current: 'test string',
192
+ oldStr: 'test',
193
+ newStr: '$1$2replacement',
194
+ expected: '$1$2replacement string',
195
+ },
196
+ {
197
+ name: 'normal strings without problematic $',
198
+ current: 'normal text replacement',
199
+ oldStr: 'text',
200
+ newStr: 'string',
201
+ expected: 'normal string replacement',
202
+ },
203
+ {
204
+ name: 'multiple occurrences with $ sequences',
205
+ current: 'foo bar foo baz',
206
+ oldStr: 'foo',
207
+ newStr: "test$'end",
208
+ expected: "test$'end bar test$'end baz",
209
+ },
210
+ {
211
+ name: 'complex regex patterns with $ at end',
212
+ current: "| select('match', '^[sv]d[a-z]$')",
213
+ oldStr: "'^[sv]d[a-z]$'",
214
+ newStr: "'^[sv]d[a-z]$' # updated",
215
+ expected: "| select('match', '^[sv]d[a-z]$' # updated)",
216
+ },
217
+ {
218
+ name: 'empty replacement with problematic $',
219
+ current: 'test content',
220
+ oldStr: 'nothing',
221
+ newStr: "replacement$'text",
222
+ expected: 'test content',
223
+ },
224
+ {
225
+ name: '$$ (escaped dollar)',
226
+ current: 'price value',
227
+ oldStr: 'value',
228
+ newStr: '$$100',
229
+ expected: 'price $$100',
230
+ },
231
+ ])('should handle $name', ({ current, oldStr, newStr, expected }) => {
164
232
  const result = applyReplacement(current, oldStr, newStr, false);
165
- expect(result).toBe("price is $200 and pattern end is ' '");
166
- });
167
- it("should treat $' literally and not as a replacement pattern", () => {
168
- const current = 'foo';
169
- const oldStr = 'foo';
170
- const newStr = "bar$'baz";
171
- const result = applyReplacement(current, oldStr, newStr, false);
172
- expect(result).toBe("bar$'baz");
173
- });
174
- it('should treat $& literally and not as a replacement pattern', () => {
175
- const current = 'hello world';
176
- const oldStr = 'hello';
177
- const newStr = '$&-replacement';
178
- const result = applyReplacement(current, oldStr, newStr, false);
179
- expect(result).toBe('$&-replacement world');
180
- });
181
- it('should treat $` literally and not as a replacement pattern', () => {
182
- const current = 'prefix-middle-suffix';
183
- const oldStr = 'middle';
184
- const newStr = 'new$`content';
185
- const result = applyReplacement(current, oldStr, newStr, false);
186
- expect(result).toBe('prefix-new$`content-suffix');
187
- });
188
- it('should treat $1, $2 capture groups literally', () => {
189
- const current = 'test string';
190
- const oldStr = 'test';
191
- const newStr = '$1$2replacement';
192
- const result = applyReplacement(current, oldStr, newStr, false);
193
- expect(result).toBe('$1$2replacement string');
194
- });
195
- it('should use replaceAll for normal strings without problematic $ sequences', () => {
196
- const current = 'normal text replacement';
197
- const oldStr = 'text';
198
- const newStr = 'string';
199
- const result = applyReplacement(current, oldStr, newStr, false);
200
- expect(result).toBe('normal string replacement');
201
- });
202
- it('should handle multiple occurrences with problematic $ sequences', () => {
203
- const current = 'foo bar foo baz';
204
- const oldStr = 'foo';
205
- const newStr = "test$'end";
206
- const result = applyReplacement(current, oldStr, newStr, false);
207
- expect(result).toBe("test$'end bar test$'end baz");
208
- });
209
- it('should handle complex regex patterns with $ at end', () => {
210
- const current = "| select('match', '^[sv]d[a-z]$')";
211
- const oldStr = "'^[sv]d[a-z]$'";
212
- const newStr = "'^[sv]d[a-z]$' # updated";
213
- const result = applyReplacement(current, oldStr, newStr, false);
214
- expect(result).toBe("| select('match', '^[sv]d[a-z]$' # updated)");
215
- });
216
- it('should handle empty replacement with problematic $ in newString', () => {
217
- const current = 'test content';
218
- const oldStr = 'nothing';
219
- const newStr = "replacement$'text";
220
- const result = applyReplacement(current, oldStr, newStr, false);
221
- expect(result).toBe('test content'); // No replacement because oldStr not found
222
- });
223
- it('should handle $$ (escaped dollar) correctly', () => {
224
- const current = 'price value';
225
- const oldStr = 'value';
226
- const newStr = '$$100';
227
- const result = applyReplacement(current, oldStr, newStr, false);
228
- expect(result).toBe('price $$100');
233
+ expect(result).toBe(expected);
229
234
  });
230
235
  });
231
236
  describe('validateToolParams', () => {
@@ -237,14 +242,6 @@ describe('EditTool', () => {
237
242
  };
238
243
  expect(tool.validateToolParams(params)).toBeNull();
239
244
  });
240
- it('should return error for relative path', () => {
241
- const params = {
242
- file_path: 'test.txt',
243
- old_string: 'old',
244
- new_string: 'new',
245
- };
246
- expect(tool.validateToolParams(params)).toMatch(/File path must be absolute/);
247
- });
248
245
  it('should return error for path outside root', () => {
249
246
  const params = {
250
247
  file_path: path.join(tempDir, 'outside-root.txt'),
@@ -261,13 +258,25 @@ describe('EditTool', () => {
261
258
  beforeEach(() => {
262
259
  filePath = path.join(rootDir, testFile);
263
260
  });
264
- it('should throw an error if params are invalid', async () => {
261
+ it('should resolve relative path and request confirmation', async () => {
262
+ fs.writeFileSync(filePath, 'some old content here');
265
263
  const params = {
266
- file_path: 'relative.txt',
264
+ file_path: testFile, // relative path
267
265
  old_string: 'old',
268
266
  new_string: 'new',
269
267
  };
270
- expect(() => tool.build(params)).toThrow();
268
+ // ensureCorrectEdit will be called by shouldConfirmExecute
269
+ mockEnsureCorrectEdit.mockResolvedValueOnce({
270
+ params: { ...params, file_path: filePath },
271
+ occurrences: 1,
272
+ });
273
+ const invocation = tool.build(params);
274
+ const confirmation = await invocation.shouldConfirmExecute(new AbortController().signal);
275
+ expect(confirmation).toEqual(expect.objectContaining({
276
+ title: `Confirm Edit: ${testFile}`,
277
+ fileName: testFile,
278
+ fileDiff: expect.any(String),
279
+ }));
271
280
  });
272
281
  it('should request confirmation for valid edit', async () => {
273
282
  fs.writeFileSync(filePath, 'some old content here');
@@ -421,13 +430,19 @@ describe('EditTool', () => {
421
430
  return { params, occurrences };
422
431
  });
423
432
  });
424
- it('should throw error if file path is not absolute', async () => {
433
+ it('should resolve relative path and execute successfully', async () => {
434
+ const initialContent = 'This is some old text.';
435
+ const newContent = 'This is some new text.';
436
+ fs.writeFileSync(filePath, initialContent, 'utf8');
425
437
  const params = {
426
- file_path: 'relative.txt',
438
+ file_path: testFile, // relative path
427
439
  old_string: 'old',
428
440
  new_string: 'new',
429
441
  };
430
- expect(() => tool.build(params)).toThrow(/File path must be absolute/);
442
+ const invocation = tool.build(params);
443
+ const result = await invocation.execute(new AbortController().signal);
444
+ expect(result.llmContent).toMatch(/Successfully modified file/);
445
+ expect(fs.readFileSync(filePath, 'utf8')).toBe(newContent);
431
446
  });
432
447
  it('should throw error if file path is empty', async () => {
433
448
  const params = {
@@ -610,27 +625,25 @@ describe('EditTool', () => {
610
625
  user_removed_chars: 7,
611
626
  });
612
627
  });
613
- it('should not include modification message when proposed content is not modified', async () => {
614
- const initialContent = 'This is some old text.';
615
- fs.writeFileSync(filePath, initialContent, 'utf8');
616
- const params = {
617
- file_path: filePath,
618
- old_string: 'old',
619
- new_string: 'new',
620
- modified_by_user: false,
621
- };
622
- mockConfig.getApprovalMode.mockReturnValueOnce(ApprovalMode.AUTO_EDIT);
623
- const invocation = tool.build(params);
624
- const result = await invocation.execute(new AbortController().signal);
625
- expect(result.llmContent).not.toMatch(/User modified the `new_string` content/);
626
- });
627
- it('should not include modification message when modified_by_user is not provided', async () => {
628
+ it.each([
629
+ {
630
+ name: 'modified_by_user is false',
631
+ modifiedByUser: false,
632
+ },
633
+ {
634
+ name: 'modified_by_user is not provided',
635
+ modifiedByUser: undefined,
636
+ },
637
+ ])('should not include modification message when $name', async ({ modifiedByUser }) => {
628
638
  const initialContent = 'This is some old text.';
629
639
  fs.writeFileSync(filePath, initialContent, 'utf8');
630
640
  const params = {
631
641
  file_path: filePath,
632
642
  old_string: 'old',
633
643
  new_string: 'new',
644
+ ...(modifiedByUser !== undefined && {
645
+ modified_by_user: modifiedByUser,
646
+ }),
634
647
  };
635
648
  mockConfig.getApprovalMode.mockReturnValueOnce(ApprovalMode.AUTO_EDIT);
636
649
  const invocation = tool.build(params);
@@ -678,126 +691,126 @@ describe('EditTool', () => {
678
691
  beforeEach(() => {
679
692
  filePath = path.join(rootDir, testFile);
680
693
  });
681
- it('should return FILE_NOT_FOUND error', async () => {
682
- const params = {
683
- file_path: filePath,
684
- old_string: 'any',
685
- new_string: 'new',
686
- };
687
- const invocation = tool.build(params);
688
- const result = await invocation.execute(new AbortController().signal);
689
- expect(result.error?.type).toBe(ToolErrorType.FILE_NOT_FOUND);
690
- });
691
- it('should return ATTEMPT_TO_CREATE_EXISTING_FILE error', async () => {
692
- fs.writeFileSync(filePath, 'existing content', 'utf8');
693
- const params = {
694
- file_path: filePath,
695
- old_string: '',
696
- new_string: 'new content',
697
- };
698
- const invocation = tool.build(params);
699
- const result = await invocation.execute(new AbortController().signal);
700
- expect(result.error?.type).toBe(ToolErrorType.ATTEMPT_TO_CREATE_EXISTING_FILE);
701
- });
702
- it('should return NO_OCCURRENCE_FOUND error', async () => {
703
- fs.writeFileSync(filePath, 'content', 'utf8');
704
- const params = {
705
- file_path: filePath,
706
- old_string: 'not-found',
707
- new_string: 'new',
708
- };
709
- const invocation = tool.build(params);
710
- const result = await invocation.execute(new AbortController().signal);
711
- expect(result.error?.type).toBe(ToolErrorType.EDIT_NO_OCCURRENCE_FOUND);
712
- });
713
- it('should return EXPECTED_OCCURRENCE_MISMATCH error', async () => {
714
- fs.writeFileSync(filePath, 'one one two', 'utf8');
715
- const params = {
716
- file_path: filePath,
717
- old_string: 'one',
718
- new_string: 'new',
719
- expected_replacements: 3,
720
- };
721
- const invocation = tool.build(params);
722
- const result = await invocation.execute(new AbortController().signal);
723
- expect(result.error?.type).toBe(ToolErrorType.EDIT_EXPECTED_OCCURRENCE_MISMATCH);
724
- });
725
- it('should return NO_CHANGE error', async () => {
726
- fs.writeFileSync(filePath, 'content', 'utf8');
727
- const params = {
728
- file_path: filePath,
729
- old_string: 'content',
730
- new_string: 'content',
731
- };
732
- const invocation = tool.build(params);
733
- const result = await invocation.execute(new AbortController().signal);
734
- expect(result.error?.type).toBe(ToolErrorType.EDIT_NO_CHANGE);
735
- });
736
- it('should throw INVALID_PARAMETERS error for relative path', async () => {
737
- const params = {
738
- file_path: 'relative/path.txt',
739
- old_string: 'a',
740
- new_string: 'b',
741
- };
742
- expect(() => tool.build(params)).toThrow();
743
- });
744
- it('should return FILE_WRITE_FAILURE on write error', async () => {
745
- fs.writeFileSync(filePath, 'content', 'utf8');
746
- // Make file readonly to trigger a write error
747
- fs.chmodSync(filePath, '444');
748
- const params = {
749
- file_path: filePath,
750
- old_string: 'content',
751
- new_string: 'new content',
752
- };
753
- const invocation = tool.build(params);
754
- const result = await invocation.execute(new AbortController().signal);
755
- expect(result.error?.type).toBe(ToolErrorType.FILE_WRITE_FAILURE);
694
+ it.each([
695
+ {
696
+ name: 'FILE_NOT_FOUND error',
697
+ setup: () => { },
698
+ params: { file_path: '', old_string: 'any', new_string: 'new' },
699
+ expectedError: ToolErrorType.FILE_NOT_FOUND,
700
+ isAsyncTest: true,
701
+ },
702
+ {
703
+ name: 'ATTEMPT_TO_CREATE_EXISTING_FILE error',
704
+ setup: (fp) => fs.writeFileSync(fp, 'existing content', 'utf8'),
705
+ params: { file_path: '', old_string: '', new_string: 'new content' },
706
+ expectedError: ToolErrorType.ATTEMPT_TO_CREATE_EXISTING_FILE,
707
+ isAsyncTest: true,
708
+ },
709
+ {
710
+ name: 'NO_OCCURRENCE_FOUND error',
711
+ setup: (fp) => fs.writeFileSync(fp, 'content', 'utf8'),
712
+ params: { file_path: '', old_string: 'not-found', new_string: 'new' },
713
+ expectedError: ToolErrorType.EDIT_NO_OCCURRENCE_FOUND,
714
+ isAsyncTest: true,
715
+ },
716
+ {
717
+ name: 'EXPECTED_OCCURRENCE_MISMATCH error',
718
+ setup: (fp) => fs.writeFileSync(fp, 'one one two', 'utf8'),
719
+ params: {
720
+ file_path: '',
721
+ old_string: 'one',
722
+ new_string: 'new',
723
+ expected_replacements: 3,
724
+ },
725
+ expectedError: ToolErrorType.EDIT_EXPECTED_OCCURRENCE_MISMATCH,
726
+ isAsyncTest: true,
727
+ },
728
+ {
729
+ name: 'NO_CHANGE error',
730
+ setup: (fp) => fs.writeFileSync(fp, 'content', 'utf8'),
731
+ params: { file_path: '', old_string: 'content', new_string: 'content' },
732
+ expectedError: ToolErrorType.EDIT_NO_CHANGE,
733
+ isAsyncTest: true,
734
+ },
735
+ {
736
+ name: 'relative path (should not throw)',
737
+ setup: () => { },
738
+ params: {
739
+ file_path: 'relative/path.txt',
740
+ old_string: 'a',
741
+ new_string: 'b',
742
+ },
743
+ expectedError: null,
744
+ isAsyncTest: false,
745
+ },
746
+ {
747
+ name: 'FILE_WRITE_FAILURE on write error',
748
+ setup: (fp) => {
749
+ fs.writeFileSync(fp, 'content', 'utf8');
750
+ fs.chmodSync(fp, '444');
751
+ },
752
+ params: {
753
+ file_path: '',
754
+ old_string: 'content',
755
+ new_string: 'new content',
756
+ },
757
+ expectedError: ToolErrorType.FILE_WRITE_FAILURE,
758
+ isAsyncTest: true,
759
+ },
760
+ ])('should return $name', async ({ setup, params, expectedError, isAsyncTest }) => {
761
+ const testParams = {
762
+ ...params,
763
+ file_path: params.file_path || filePath,
764
+ };
765
+ setup(filePath);
766
+ if (!isAsyncTest) {
767
+ expect(() => tool.build(testParams)).not.toThrow();
768
+ }
769
+ else {
770
+ const invocation = tool.build(testParams);
771
+ const result = await invocation.execute(new AbortController().signal);
772
+ expect(result.error?.type).toBe(expectedError);
773
+ }
756
774
  });
757
775
  });
758
776
  describe('getDescription', () => {
759
- it('should return "No file changes to..." if old_string and new_string are the same', () => {
760
- const testFileName = 'test.txt';
761
- const params = {
762
- file_path: path.join(rootDir, testFileName),
763
- old_string: 'identical_string',
764
- new_string: 'identical_string',
765
- };
766
- const invocation = tool.build(params);
767
- // shortenPath will be called internally, resulting in just the file name
768
- expect(invocation.getDescription()).toBe(`No file changes to ${testFileName}`);
769
- });
770
- it('should return a snippet of old and new strings if they are different', () => {
771
- const testFileName = 'test.txt';
772
- const params = {
773
- file_path: path.join(rootDir, testFileName),
774
- old_string: 'this is the old string value',
775
- new_string: 'this is the new string value',
776
- };
777
- const invocation = tool.build(params);
778
- // shortenPath will be called internally, resulting in just the file name
779
- // The snippets are truncated at 30 chars + '...'
780
- expect(invocation.getDescription()).toBe(`${testFileName}: this is the old string value => this is the new string value`);
781
- });
782
- it('should handle very short strings correctly in the description', () => {
783
- const testFileName = 'short.txt';
784
- const params = {
785
- file_path: path.join(rootDir, testFileName),
786
- old_string: 'old',
787
- new_string: 'new',
777
+ it.each([
778
+ {
779
+ name: 'identical strings (no change)',
780
+ fileName: 'test.txt',
781
+ oldStr: 'identical_string',
782
+ newStr: 'identical_string',
783
+ expected: 'No file changes to test.txt',
784
+ },
785
+ {
786
+ name: 'different strings (full)',
787
+ fileName: 'test.txt',
788
+ oldStr: 'this is the old string value',
789
+ newStr: 'this is the new string value',
790
+ expected: 'test.txt: this is the old string value => this is the new string value',
791
+ },
792
+ {
793
+ name: 'very short strings',
794
+ fileName: 'short.txt',
795
+ oldStr: 'old',
796
+ newStr: 'new',
797
+ expected: 'short.txt: old => new',
798
+ },
799
+ {
800
+ name: 'long strings (truncated)',
801
+ fileName: 'long.txt',
802
+ oldStr: 'this is a very long old string that will definitely be truncated',
803
+ newStr: 'this is a very long new string that will also be truncated',
804
+ expected: 'long.txt: this is a very long old string... => this is a very long new string...',
805
+ },
806
+ ])('should handle $name', ({ fileName, oldStr, newStr, expected }) => {
807
+ const params = {
808
+ file_path: path.join(rootDir, fileName),
809
+ old_string: oldStr,
810
+ new_string: newStr,
788
811
  };
789
812
  const invocation = tool.build(params);
790
- expect(invocation.getDescription()).toBe(`${testFileName}: old => new`);
791
- });
792
- it('should truncate long strings in the description', () => {
793
- const testFileName = 'long.txt';
794
- const params = {
795
- file_path: path.join(rootDir, testFileName),
796
- old_string: 'this is a very long old string that will definitely be truncated',
797
- new_string: 'this is a very long new string that will also be truncated',
798
- };
799
- const invocation = tool.build(params);
800
- expect(invocation.getDescription()).toBe(`${testFileName}: this is a very long old string... => this is a very long new string...`);
813
+ expect(invocation.getDescription()).toBe(expected);
801
814
  });
802
815
  });
803
816
  describe('workspace boundary validation', () => {
@@ -820,6 +833,25 @@ describe('EditTool', () => {
820
833
  expect(error).toContain(rootDir);
821
834
  });
822
835
  });
836
+ describe('constructor', () => {
837
+ afterEach(() => {
838
+ vi.restoreAllMocks();
839
+ });
840
+ it('should use windows-style path examples on windows', () => {
841
+ vi.spyOn(process, 'platform', 'get').mockReturnValue('win32');
842
+ const tool = new EditTool({});
843
+ const schema = tool.schema;
844
+ expect(schema.parametersJsonSchema.properties
845
+ .file_path.description).toBe('The path to the file to modify.');
846
+ });
847
+ it('should use unix-style path examples on non-windows platforms', () => {
848
+ vi.spyOn(process, 'platform', 'get').mockReturnValue('linux');
849
+ const tool = new EditTool({});
850
+ const schema = tool.schema;
851
+ expect(schema.parametersJsonSchema.properties
852
+ .file_path.description).toBe('The path to the file to modify.');
853
+ });
854
+ });
823
855
  describe('IDE mode', () => {
824
856
  const testFile = 'edit_me.txt';
825
857
  let filePath;
@@ -861,5 +893,63 @@ describe('EditTool', () => {
861
893
  expect(params.new_string).toBe(modifiedContent);
862
894
  });
863
895
  });
896
+ describe('multiple file edits', () => {
897
+ it('should perform multiple removals and report correct diff stats', async () => {
898
+ const numFiles = 10;
899
+ const files = [];
900
+ const expectedLinesRemoved = [];
901
+ const actualLinesRemoved = [];
902
+ // 1. Create 10 files with 5-10 lines each
903
+ for (let i = 0; i < numFiles; i++) {
904
+ const fileName = `test-file-${i}.txt`;
905
+ const filePath = path.join(rootDir, fileName);
906
+ const numLines = Math.floor(Math.random() * 6) + 5; // 5 to 10 lines
907
+ const lines = Array.from({ length: numLines }, (_, j) => `File ${i}, Line ${j + 1}`);
908
+ const content = lines.join('\n') + '\n';
909
+ // Determine which lines to remove (2 or 3 lines)
910
+ const numLinesToRemove = Math.floor(Math.random() * 2) + 2; // 2 or 3
911
+ expectedLinesRemoved.push(numLinesToRemove);
912
+ const startLineToRemove = 1; // Start removing from the second line
913
+ const linesToRemove = lines.slice(startLineToRemove, startLineToRemove + numLinesToRemove);
914
+ const toRemove = linesToRemove.join('\n') + '\n';
915
+ fs.writeFileSync(filePath, content, 'utf8');
916
+ files.push({
917
+ path: filePath,
918
+ initialContent: content,
919
+ toRemove,
920
+ });
921
+ }
922
+ // 2. Create and execute 10 tool calls for removal
923
+ for (const file of files) {
924
+ const params = {
925
+ file_path: file.path,
926
+ old_string: file.toRemove,
927
+ new_string: '', // Removing the content
928
+ };
929
+ const invocation = tool.build(params);
930
+ const result = await invocation.execute(new AbortController().signal);
931
+ if (result.returnDisplay &&
932
+ typeof result.returnDisplay === 'object' &&
933
+ 'diffStat' in result.returnDisplay &&
934
+ result.returnDisplay.diffStat) {
935
+ actualLinesRemoved.push(result.returnDisplay.diffStat?.model_removed_lines);
936
+ }
937
+ else if (result.error) {
938
+ console.error(`Edit failed for ${file.path}:`, result.error);
939
+ }
940
+ }
941
+ // 3. Assert that the content was removed from each file
942
+ for (const file of files) {
943
+ const finalContent = fs.readFileSync(file.path, 'utf8');
944
+ const expectedContent = file.initialContent.replace(file.toRemove, '');
945
+ expect(finalContent).toBe(expectedContent);
946
+ expect(finalContent).not.toContain(file.toRemove);
947
+ }
948
+ // 4. Assert that the total number of removed lines matches the diffStat total
949
+ const totalExpectedRemoved = expectedLinesRemoved.reduce((sum, current) => sum + current, 0);
950
+ const totalActualRemoved = actualLinesRemoved.reduce((sum, current) => sum + current, 0);
951
+ expect(totalActualRemoved).toBe(totalExpectedRemoved);
952
+ });
953
+ });
864
954
  });
865
955
  //# sourceMappingURL=edit.test.js.map