@office-ai/aioncli-core 0.8.1 → 0.18.5

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 (778) 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.d.ts +15 -1
  165. package/dist/src/core/openaiContentGenerator.js +139 -22
  166. package/dist/src/core/openaiContentGenerator.js.map +1 -1
  167. package/dist/src/core/prompts.d.ts +2 -1
  168. package/dist/src/core/prompts.js +135 -154
  169. package/dist/src/core/prompts.js.map +1 -1
  170. package/dist/src/core/prompts.test.js +128 -189
  171. package/dist/src/core/prompts.test.js.map +1 -1
  172. package/dist/src/core/recordingContentGenerator.d.ts +18 -0
  173. package/dist/src/core/recordingContentGenerator.js +77 -0
  174. package/dist/src/core/recordingContentGenerator.js.map +1 -0
  175. package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
  176. package/dist/src/core/recordingContentGenerator.test.js +101 -0
  177. package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
  178. package/dist/src/core/tokenLimits.test.d.ts +6 -0
  179. package/dist/src/core/tokenLimits.test.js +26 -0
  180. package/dist/src/core/tokenLimits.test.js.map +1 -0
  181. package/dist/src/core/turn.d.ts +23 -3
  182. package/dist/src/core/turn.js +18 -9
  183. package/dist/src/core/turn.js.map +1 -1
  184. package/dist/src/core/turn.test.js +98 -104
  185. package/dist/src/core/turn.test.js.map +1 -1
  186. package/dist/src/fallback/handler.js +60 -8
  187. package/dist/src/fallback/handler.js.map +1 -1
  188. package/dist/src/fallback/handler.test.js +132 -17
  189. package/dist/src/fallback/handler.test.js.map +1 -1
  190. package/dist/src/fallback/types.d.ts +1 -1
  191. package/dist/src/generated/git-commit.d.ts +2 -2
  192. package/dist/src/generated/git-commit.js +2 -2
  193. package/dist/src/generated/git-commit.js.map +1 -1
  194. package/dist/src/hooks/hookAggregator.d.ts +68 -0
  195. package/dist/src/hooks/hookAggregator.js +262 -0
  196. package/dist/src/hooks/hookAggregator.js.map +1 -0
  197. package/dist/src/hooks/hookAggregator.test.d.ts +6 -0
  198. package/dist/src/hooks/hookAggregator.test.js +387 -0
  199. package/dist/src/hooks/hookAggregator.test.js.map +1 -0
  200. package/dist/src/hooks/hookPlanner.d.ts +46 -0
  201. package/dist/src/hooks/hookPlanner.js +108 -0
  202. package/dist/src/hooks/hookPlanner.js.map +1 -0
  203. package/dist/src/hooks/hookPlanner.test.d.ts +6 -0
  204. package/dist/src/hooks/hookPlanner.test.js +255 -0
  205. package/dist/src/hooks/hookPlanner.test.js.map +1 -0
  206. package/dist/src/hooks/hookRegistry.d.ts +87 -0
  207. package/dist/src/hooks/hookRegistry.js +198 -0
  208. package/dist/src/hooks/hookRegistry.js.map +1 -0
  209. package/dist/src/hooks/hookRegistry.test.d.ts +6 -0
  210. package/dist/src/hooks/hookRegistry.test.js +341 -0
  211. package/dist/src/hooks/hookRegistry.test.js.map +1 -0
  212. package/dist/src/hooks/hookRunner.d.ts +42 -0
  213. package/dist/src/hooks/hookRunner.js +272 -0
  214. package/dist/src/hooks/hookRunner.js.map +1 -0
  215. package/dist/src/hooks/hookRunner.test.d.ts +6 -0
  216. package/dist/src/hooks/hookRunner.test.js +468 -0
  217. package/dist/src/hooks/hookRunner.test.js.map +1 -0
  218. package/dist/src/hooks/hookTranslator.d.ts +113 -0
  219. package/dist/src/hooks/hookTranslator.js +232 -0
  220. package/dist/src/hooks/hookTranslator.js.map +1 -0
  221. package/dist/src/hooks/hookTranslator.test.d.ts +6 -0
  222. package/dist/src/hooks/hookTranslator.test.js +192 -0
  223. package/dist/src/hooks/hookTranslator.test.js.map +1 -0
  224. package/dist/src/hooks/types.d.ts +384 -0
  225. package/dist/src/hooks/types.js +284 -0
  226. package/dist/src/hooks/types.js.map +1 -0
  227. package/dist/src/hooks/types.test.d.ts +6 -0
  228. package/dist/src/hooks/types.test.js +313 -0
  229. package/dist/src/hooks/types.test.js.map +1 -0
  230. package/dist/src/ide/detect-ide.d.ts +4 -0
  231. package/dist/src/ide/detect-ide.js +6 -1
  232. package/dist/src/ide/detect-ide.js.map +1 -1
  233. package/dist/src/ide/detect-ide.test.js +16 -0
  234. package/dist/src/ide/detect-ide.test.js.map +1 -1
  235. package/dist/src/ide/ide-client.d.ts +3 -1
  236. package/dist/src/ide/ide-client.js +12 -10
  237. package/dist/src/ide/ide-client.js.map +1 -1
  238. package/dist/src/ide/ide-client.test.js +163 -4
  239. package/dist/src/ide/ide-client.test.js.map +1 -1
  240. package/dist/src/ide/ide-installer.js +66 -21
  241. package/dist/src/ide/ide-installer.js.map +1 -1
  242. package/dist/src/ide/ide-installer.test.js +54 -1
  243. package/dist/src/ide/ide-installer.test.js.map +1 -1
  244. package/dist/src/ide/process-utils.js +85 -75
  245. package/dist/src/ide/process-utils.js.map +1 -1
  246. package/dist/src/ide/process-utils.test.js +83 -90
  247. package/dist/src/ide/process-utils.test.js.map +1 -1
  248. package/dist/src/ide/types.d.ts +5 -5
  249. package/dist/src/ide/types.js +1 -1
  250. package/dist/src/index.d.ts +21 -0
  251. package/dist/src/index.js +24 -0
  252. package/dist/src/index.js.map +1 -1
  253. package/dist/src/mcp/google-auth-provider.d.ts +2 -0
  254. package/dist/src/mcp/google-auth-provider.js +21 -3
  255. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  256. package/dist/src/mcp/google-auth-provider.test.js +42 -9
  257. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  258. package/dist/src/mcp/oauth-provider.d.ts +8 -5
  259. package/dist/src/mcp/oauth-provider.js +140 -55
  260. package/dist/src/mcp/oauth-provider.js.map +1 -1
  261. package/dist/src/mcp/oauth-provider.test.js +369 -2
  262. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  263. package/dist/src/mcp/oauth-token-storage.js +5 -4
  264. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  265. package/dist/src/mcp/oauth-token-storage.test.js +17 -11
  266. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  267. package/dist/src/mcp/oauth-utils.d.ts +7 -0
  268. package/dist/src/mcp/oauth-utils.js +28 -8
  269. package/dist/src/mcp/oauth-utils.js.map +1 -1
  270. package/dist/src/mcp/oauth-utils.test.js +45 -2
  271. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  272. package/dist/src/mcp/sa-impersonation-provider.d.ts +0 -6
  273. package/dist/src/mcp/sa-impersonation-provider.js +6 -23
  274. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
  275. package/dist/src/mcp/token-storage/base-token-storage.test.js +75 -84
  276. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
  277. package/dist/src/mcp/token-storage/file-token-storage.js +3 -2
  278. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  279. package/dist/src/mcp/token-storage/file-token-storage.test.js +11 -8
  280. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  281. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
  282. package/dist/src/mcp/token-storage/keychain-token-storage.js +63 -7
  283. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  284. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +54 -3
  285. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
  286. package/dist/src/mcp/token-storage/types.d.ts +6 -0
  287. package/dist/src/mcp/token-storage/types.js.map +1 -1
  288. package/dist/src/output/stream-json-formatter.d.ts +32 -0
  289. package/dist/src/output/stream-json-formatter.js +52 -0
  290. package/dist/src/output/stream-json-formatter.js.map +1 -0
  291. package/dist/src/output/stream-json-formatter.test.d.ts +6 -0
  292. package/dist/src/output/stream-json-formatter.test.js +479 -0
  293. package/dist/src/output/stream-json-formatter.test.js.map +1 -0
  294. package/dist/src/output/types.d.ts +63 -1
  295. package/dist/src/output/types.js +11 -0
  296. package/dist/src/output/types.js.map +1 -1
  297. package/dist/src/policy/config.d.ts +31 -0
  298. package/dist/src/policy/config.js +199 -0
  299. package/dist/src/policy/config.js.map +1 -0
  300. package/dist/src/policy/config.test.d.ts +6 -0
  301. package/dist/src/policy/config.test.js +538 -0
  302. package/dist/src/policy/config.test.js.map +1 -0
  303. package/dist/src/policy/index.d.ts +2 -0
  304. package/dist/src/policy/index.js +2 -0
  305. package/dist/src/policy/index.js.map +1 -1
  306. package/dist/src/policy/policies/discovered.toml +8 -0
  307. package/dist/src/policy/policies/read-only.toml +56 -0
  308. package/dist/src/policy/policies/write.toml +73 -0
  309. package/dist/src/policy/policies/yolo.toml +31 -0
  310. package/dist/src/policy/policy-engine.d.ts +12 -3
  311. package/dist/src/policy/policy-engine.js +74 -8
  312. package/dist/src/policy/policy-engine.js.map +1 -1
  313. package/dist/src/policy/policy-engine.test.js +460 -76
  314. package/dist/src/policy/policy-engine.test.js.map +1 -1
  315. package/dist/src/policy/toml-loader.d.ts +47 -0
  316. package/dist/src/policy/toml-loader.js +411 -0
  317. package/dist/src/policy/toml-loader.js.map +1 -0
  318. package/dist/src/policy/toml-loader.test.d.ts +6 -0
  319. package/dist/src/policy/toml-loader.test.js +376 -0
  320. package/dist/src/policy/toml-loader.test.js.map +1 -0
  321. package/dist/src/policy/types.d.ts +83 -0
  322. package/dist/src/policy/types.js +10 -0
  323. package/dist/src/policy/types.js.map +1 -1
  324. package/dist/src/prompts/mcp-prompts.test.d.ts +6 -0
  325. package/dist/src/prompts/mcp-prompts.test.js +39 -0
  326. package/dist/src/prompts/mcp-prompts.test.js.map +1 -0
  327. package/dist/src/prompts/prompt-registry.js +2 -1
  328. package/dist/src/prompts/prompt-registry.js.map +1 -1
  329. package/dist/src/prompts/prompt-registry.test.d.ts +6 -0
  330. package/dist/src/prompts/prompt-registry.test.js +96 -0
  331. package/dist/src/prompts/prompt-registry.test.js.map +1 -0
  332. package/dist/src/routing/modelRouterService.js +15 -0
  333. package/dist/src/routing/modelRouterService.js.map +1 -1
  334. package/dist/src/routing/modelRouterService.test.js +62 -0
  335. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  336. package/dist/src/routing/strategies/classifierStrategy.d.ts +1 -1
  337. package/dist/src/routing/strategies/classifierStrategy.js +9 -16
  338. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  339. package/dist/src/routing/strategies/classifierStrategy.test.js +17 -13
  340. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  341. package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
  342. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  343. package/dist/src/routing/strategies/fallbackStrategy.test.js +4 -0
  344. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  345. package/dist/src/routing/strategies/overrideStrategy.js +2 -2
  346. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  347. package/dist/src/routing/strategies/overrideStrategy.test.js +3 -0
  348. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
  349. package/dist/src/safety/built-in.d.ts +21 -0
  350. package/dist/src/safety/built-in.js +106 -0
  351. package/dist/src/safety/built-in.js.map +1 -0
  352. package/dist/src/safety/built-in.test.d.ts +6 -0
  353. package/dist/src/safety/built-in.test.js +199 -0
  354. package/dist/src/safety/built-in.test.js.map +1 -0
  355. package/dist/src/safety/checker-runner.d.ts +48 -0
  356. package/dist/src/safety/checker-runner.js +208 -0
  357. package/dist/src/safety/checker-runner.js.map +1 -0
  358. package/dist/src/safety/checker-runner.test.d.ts +6 -0
  359. package/dist/src/safety/checker-runner.test.js +238 -0
  360. package/dist/src/safety/checker-runner.test.js.map +1 -0
  361. package/dist/src/safety/context-builder.d.ts +23 -0
  362. package/dist/src/safety/context-builder.js +47 -0
  363. package/dist/src/safety/context-builder.js.map +1 -0
  364. package/dist/src/safety/context-builder.test.d.ts +6 -0
  365. package/dist/src/safety/context-builder.test.js +49 -0
  366. package/dist/src/safety/context-builder.test.js.map +1 -0
  367. package/dist/src/safety/protocol.d.ts +88 -0
  368. package/dist/src/safety/protocol.js +15 -0
  369. package/dist/src/safety/protocol.js.map +1 -0
  370. package/dist/src/safety/registry.d.ts +26 -0
  371. package/dist/src/safety/registry.js +65 -0
  372. package/dist/src/safety/registry.js.map +1 -0
  373. package/dist/src/safety/registry.test.d.ts +6 -0
  374. package/dist/src/safety/registry.test.js +31 -0
  375. package/dist/src/safety/registry.test.js.map +1 -0
  376. package/dist/src/services/chatCompressionService.d.ts +32 -0
  377. package/dist/src/services/chatCompressionService.js +162 -0
  378. package/dist/src/services/chatCompressionService.js.map +1 -0
  379. package/dist/src/services/chatCompressionService.test.d.ts +6 -0
  380. package/dist/src/services/chatCompressionService.test.js +210 -0
  381. package/dist/src/services/chatCompressionService.test.js.map +1 -0
  382. package/dist/src/services/chatRecordingService.d.ts +3 -2
  383. package/dist/src/services/chatRecordingService.js +11 -9
  384. package/dist/src/services/chatRecordingService.js.map +1 -1
  385. package/dist/src/services/fileDiscoveryService.d.ts +2 -14
  386. package/dist/src/services/fileDiscoveryService.js +19 -55
  387. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  388. package/dist/src/services/fileDiscoveryService.test.js +91 -11
  389. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  390. package/dist/src/services/loopDetectionService.d.ts +4 -1
  391. package/dist/src/services/loopDetectionService.js +95 -42
  392. package/dist/src/services/loopDetectionService.js.map +1 -1
  393. package/dist/src/services/loopDetectionService.test.js +220 -12
  394. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  395. package/dist/src/services/modelConfig.golden.test.d.ts +6 -0
  396. package/dist/src/services/modelConfig.golden.test.js +42 -0
  397. package/dist/src/services/modelConfig.golden.test.js.map +1 -0
  398. package/dist/src/services/modelConfig.integration.test.d.ts +6 -0
  399. package/dist/src/services/modelConfig.integration.test.js +247 -0
  400. package/dist/src/services/modelConfig.integration.test.js.map +1 -0
  401. package/dist/src/services/modelConfigService.d.ts +48 -0
  402. package/dist/src/services/modelConfigService.js +151 -0
  403. package/dist/src/services/modelConfigService.js.map +1 -0
  404. package/dist/src/services/modelConfigService.test.d.ts +6 -0
  405. package/dist/src/services/modelConfigService.test.js +531 -0
  406. package/dist/src/services/modelConfigService.test.js.map +1 -0
  407. package/dist/src/services/shellExecutionService.d.ts +1 -0
  408. package/dist/src/services/shellExecutionService.js +195 -92
  409. package/dist/src/services/shellExecutionService.js.map +1 -1
  410. package/dist/src/services/shellExecutionService.test.js +137 -14
  411. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  412. package/dist/src/services/test-data/resolved-aliases.golden.json +202 -0
  413. package/dist/src/telemetry/activity-monitor.d.ts +116 -0
  414. package/dist/src/telemetry/activity-monitor.js +209 -0
  415. package/dist/src/telemetry/activity-monitor.js.map +1 -0
  416. package/dist/src/telemetry/activity-monitor.test.d.ts +6 -0
  417. package/dist/src/telemetry/activity-monitor.test.js +251 -0
  418. package/dist/src/telemetry/activity-monitor.test.js.map +1 -0
  419. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +25 -7
  420. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +294 -76
  421. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  422. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +1 -0
  423. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +192 -66
  424. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  425. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +25 -3
  426. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +59 -5
  427. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  428. package/dist/src/telemetry/constants.d.ts +0 -28
  429. package/dist/src/telemetry/constants.js +0 -29
  430. package/dist/src/telemetry/constants.js.map +1 -1
  431. package/dist/src/telemetry/gcp-exporters.js +0 -1
  432. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  433. package/dist/src/telemetry/gcp-exporters.test.js +1 -1
  434. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
  435. package/dist/src/telemetry/index.d.ts +7 -3
  436. package/dist/src/telemetry/index.js +13 -4
  437. package/dist/src/telemetry/index.js.map +1 -1
  438. package/dist/src/telemetry/loggers.d.ts +14 -7
  439. package/dist/src/telemetry/loggers.js +197 -320
  440. package/dist/src/telemetry/loggers.js.map +1 -1
  441. package/dist/src/telemetry/loggers.test.circular.js +0 -1
  442. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  443. package/dist/src/telemetry/loggers.test.js +460 -59
  444. package/dist/src/telemetry/loggers.test.js.map +1 -1
  445. package/dist/src/telemetry/memory-monitor.d.ts +149 -0
  446. package/dist/src/telemetry/memory-monitor.js +335 -0
  447. package/dist/src/telemetry/memory-monitor.js.map +1 -0
  448. package/dist/src/telemetry/memory-monitor.test.d.ts +6 -0
  449. package/dist/src/telemetry/memory-monitor.test.js +472 -0
  450. package/dist/src/telemetry/memory-monitor.test.js.map +1 -0
  451. package/dist/src/telemetry/metrics.d.ts +180 -4
  452. package/dist/src/telemetry/metrics.js +270 -6
  453. package/dist/src/telemetry/metrics.js.map +1 -1
  454. package/dist/src/telemetry/metrics.test.js +502 -184
  455. package/dist/src/telemetry/metrics.test.js.map +1 -1
  456. package/dist/src/telemetry/sdk.js +3 -2
  457. package/dist/src/telemetry/sdk.js.map +1 -1
  458. package/dist/src/telemetry/semantic.d.ts +82 -0
  459. package/dist/src/telemetry/semantic.js +269 -0
  460. package/dist/src/telemetry/semantic.js.map +1 -0
  461. package/dist/src/telemetry/semantic.test.d.ts +6 -0
  462. package/dist/src/telemetry/semantic.test.js +387 -0
  463. package/dist/src/telemetry/semantic.test.js.map +1 -0
  464. package/dist/src/telemetry/telemetry-utils.test.js +29 -28
  465. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -1
  466. package/dist/src/telemetry/telemetryAttributes.d.ts +8 -0
  467. package/dist/src/telemetry/telemetryAttributes.js +19 -0
  468. package/dist/src/telemetry/telemetryAttributes.js.map +1 -0
  469. package/dist/src/telemetry/trace.d.ts +46 -0
  470. package/dist/src/telemetry/trace.js +121 -0
  471. package/dist/src/telemetry/trace.js.map +1 -0
  472. package/dist/src/telemetry/types.d.ts +227 -29
  473. package/dist/src/telemetry/types.js +858 -72
  474. package/dist/src/telemetry/types.js.map +1 -1
  475. package/dist/src/telemetry/uiTelemetry.d.ts +1 -1
  476. package/dist/src/telemetry/uiTelemetry.js +7 -7
  477. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  478. package/dist/src/telemetry/uiTelemetry.test.js +89 -67
  479. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  480. package/dist/src/test-utils/config.d.ts +1 -1
  481. package/dist/src/test-utils/config.js +1 -1
  482. package/dist/src/tools/base-tool-invocation.test.d.ts +6 -0
  483. package/dist/src/tools/base-tool-invocation.test.js +85 -0
  484. package/dist/src/tools/base-tool-invocation.test.js.map +1 -0
  485. package/dist/src/tools/edit.d.ts +4 -3
  486. package/dist/src/tools/edit.js +50 -47
  487. package/dist/src/tools/edit.js.map +1 -1
  488. package/dist/src/tools/edit.test.js +306 -216
  489. package/dist/src/tools/edit.test.js.map +1 -1
  490. package/dist/src/tools/glob.d.ts +4 -3
  491. package/dist/src/tools/glob.js +24 -27
  492. package/dist/src/tools/glob.js.map +1 -1
  493. package/dist/src/tools/glob.test.js +212 -205
  494. package/dist/src/tools/glob.test.js.map +1 -1
  495. package/dist/src/tools/grep.d.ts +4 -3
  496. package/dist/src/tools/grep.js +31 -25
  497. package/dist/src/tools/grep.js.map +1 -1
  498. package/dist/src/tools/grep.test.js +15 -12
  499. package/dist/src/tools/grep.test.js.map +1 -1
  500. package/dist/src/tools/ls.d.ts +4 -3
  501. package/dist/src/tools/ls.js +29 -35
  502. package/dist/src/tools/ls.js.map +1 -1
  503. package/dist/src/tools/ls.test.js +34 -42
  504. package/dist/src/tools/ls.test.js.map +1 -1
  505. package/dist/src/tools/mcp-client-manager.d.ts +49 -11
  506. package/dist/src/tools/mcp-client-manager.js +191 -31
  507. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  508. package/dist/src/tools/mcp-client-manager.test.js +132 -25
  509. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  510. package/dist/src/tools/mcp-client.d.ts +12 -5
  511. package/dist/src/tools/mcp-client.js +287 -267
  512. package/dist/src/tools/mcp-client.js.map +1 -1
  513. package/dist/src/tools/mcp-client.test.js +352 -45
  514. package/dist/src/tools/mcp-client.test.js.map +1 -1
  515. package/dist/src/tools/mcp-tool.d.ts +6 -2
  516. package/dist/src/tools/mcp-tool.js +19 -8
  517. package/dist/src/tools/mcp-tool.js.map +1 -1
  518. package/dist/src/tools/mcp-tool.test.js +186 -273
  519. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  520. package/dist/src/tools/memoryTool.d.ts +7 -5
  521. package/dist/src/tools/memoryTool.js +14 -12
  522. package/dist/src/tools/memoryTool.js.map +1 -1
  523. package/dist/src/tools/memoryTool.test.js +10 -9
  524. package/dist/src/tools/memoryTool.test.js.map +1 -1
  525. package/dist/src/tools/message-bus-integration.test.js +14 -1
  526. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  527. package/dist/src/tools/modifiable-tool.d.ts +5 -1
  528. package/dist/src/tools/modifiable-tool.js +38 -16
  529. package/dist/src/tools/modifiable-tool.js.map +1 -1
  530. package/dist/src/tools/modifiable-tool.test.js +66 -31
  531. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  532. package/dist/src/tools/read-file.d.ts +6 -5
  533. package/dist/src/tools/read-file.js +26 -32
  534. package/dist/src/tools/read-file.js.map +1 -1
  535. package/dist/src/tools/read-file.test.js +68 -33
  536. package/dist/src/tools/read-file.test.js.map +1 -1
  537. package/dist/src/tools/read-many-files.d.ts +6 -12
  538. package/dist/src/tools/read-many-files.js +28 -57
  539. package/dist/src/tools/read-many-files.js.map +1 -1
  540. package/dist/src/tools/read-many-files.test.js +37 -36
  541. package/dist/src/tools/read-many-files.test.js.map +1 -1
  542. package/dist/src/tools/ripGrep.d.ts +28 -10
  543. package/dist/src/tools/ripGrep.js +195 -193
  544. package/dist/src/tools/ripGrep.js.map +1 -1
  545. package/dist/src/tools/ripGrep.test.js +533 -204
  546. package/dist/src/tools/ripGrep.test.js.map +1 -1
  547. package/dist/src/tools/shell.d.ts +8 -6
  548. package/dist/src/tools/shell.js +64 -38
  549. package/dist/src/tools/shell.js.map +1 -1
  550. package/dist/src/tools/shell.test.js +134 -43
  551. package/dist/src/tools/shell.test.js.map +1 -1
  552. package/dist/src/tools/smart-edit.d.ts +10 -23
  553. package/dist/src/tools/smart-edit.js +100 -85
  554. package/dist/src/tools/smart-edit.js.map +1 -1
  555. package/dist/src/tools/smart-edit.test.js +229 -179
  556. package/dist/src/tools/smart-edit.test.js.map +1 -1
  557. package/dist/src/tools/tool-error.d.ts +21 -0
  558. package/dist/src/tools/tool-error.js +27 -0
  559. package/dist/src/tools/tool-error.js.map +1 -1
  560. package/dist/src/tools/tool-names.d.ts +17 -0
  561. package/dist/src/tools/tool-names.js +21 -0
  562. package/dist/src/tools/tool-names.js.map +1 -0
  563. package/dist/src/tools/tool-registry.d.ts +32 -20
  564. package/dist/src/tools/tool-registry.js +122 -78
  565. package/dist/src/tools/tool-registry.js.map +1 -1
  566. package/dist/src/tools/tool-registry.test.js +167 -90
  567. package/dist/src/tools/tool-registry.test.js.map +1 -1
  568. package/dist/src/tools/tools.d.ts +23 -8
  569. package/dist/src/tools/tools.js +69 -37
  570. package/dist/src/tools/tools.js.map +1 -1
  571. package/dist/src/tools/web-fetch.d.ts +11 -3
  572. package/dist/src/tools/web-fetch.js +80 -38
  573. package/dist/src/tools/web-fetch.js.map +1 -1
  574. package/dist/src/tools/web-fetch.test.js +338 -9
  575. package/dist/src/tools/web-fetch.test.js.map +1 -1
  576. package/dist/src/tools/web-search.d.ts +4 -3
  577. package/dist/src/tools/web-search.js +11 -9
  578. package/dist/src/tools/web-search.js.map +1 -1
  579. package/dist/src/tools/web-search.test.js +6 -0
  580. package/dist/src/tools/web-search.test.js.map +1 -1
  581. package/dist/src/tools/write-file.d.ts +3 -2
  582. package/dist/src/tools/write-file.js +41 -40
  583. package/dist/src/tools/write-file.js.map +1 -1
  584. package/dist/src/tools/write-file.test.js +130 -123
  585. package/dist/src/tools/write-file.test.js.map +1 -1
  586. package/dist/src/tools/write-todos.d.ts +34 -9
  587. package/dist/src/tools/write-todos.js +54 -11
  588. package/dist/src/tools/write-todos.js.map +1 -1
  589. package/dist/src/tools/write-todos.test.js +2 -2
  590. package/dist/src/tools/write-todos.test.js.map +1 -1
  591. package/dist/src/utils/bfsFileSearch.js +3 -2
  592. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  593. package/dist/src/utils/channel.d.ts +19 -0
  594. package/dist/src/utils/channel.js +49 -0
  595. package/dist/src/utils/channel.js.map +1 -0
  596. package/dist/src/utils/channel.test.d.ts +6 -0
  597. package/dist/src/utils/channel.test.js +170 -0
  598. package/dist/src/utils/channel.test.js.map +1 -0
  599. package/dist/src/utils/debugLogger.d.ts +25 -0
  600. package/dist/src/utils/debugLogger.js +33 -0
  601. package/dist/src/utils/debugLogger.js.map +1 -0
  602. package/dist/src/utils/debugLogger.test.d.ts +6 -0
  603. package/dist/src/utils/debugLogger.test.js +69 -0
  604. package/dist/src/utils/debugLogger.test.js.map +1 -0
  605. package/dist/src/utils/delay.d.ts +16 -0
  606. package/dist/src/utils/delay.js +43 -0
  607. package/dist/src/utils/delay.js.map +1 -0
  608. package/dist/src/utils/delay.test.d.ts +6 -0
  609. package/dist/src/utils/delay.test.js +88 -0
  610. package/dist/src/utils/delay.test.js.map +1 -0
  611. package/dist/src/utils/editCorrector.js +10 -25
  612. package/dist/src/utils/editCorrector.js.map +1 -1
  613. package/dist/src/utils/editCorrector.test.js +19 -5
  614. package/dist/src/utils/editCorrector.test.js.map +1 -1
  615. package/dist/src/utils/editor.d.ts +4 -2
  616. package/dist/src/utils/editor.js +53 -39
  617. package/dist/src/utils/editor.js.map +1 -1
  618. package/dist/src/utils/editor.test.js +18 -45
  619. package/dist/src/utils/editor.test.js.map +1 -1
  620. package/dist/src/utils/environmentContext.d.ts +2 -1
  621. package/dist/src/utils/environmentContext.js +20 -33
  622. package/dist/src/utils/environmentContext.js.map +1 -1
  623. package/dist/src/utils/environmentContext.test.js +6 -34
  624. package/dist/src/utils/environmentContext.test.js.map +1 -1
  625. package/dist/src/utils/errorParsing.d.ts +1 -1
  626. package/dist/src/utils/errorParsing.js +5 -33
  627. package/dist/src/utils/errorParsing.js.map +1 -1
  628. package/dist/src/utils/errorParsing.test.js +0 -88
  629. package/dist/src/utils/errorParsing.test.js.map +1 -1
  630. package/dist/src/utils/errors.d.ts +3 -0
  631. package/dist/src/utils/errors.js +6 -0
  632. package/dist/src/utils/errors.js.map +1 -1
  633. package/dist/src/utils/events.d.ts +121 -0
  634. package/dist/src/utils/events.js +84 -0
  635. package/dist/src/utils/events.js.map +1 -0
  636. package/dist/src/utils/events.test.d.ts +6 -0
  637. package/dist/src/utils/events.test.js +212 -0
  638. package/dist/src/utils/events.test.js.map +1 -0
  639. package/dist/src/utils/extensionLoader.d.ts +86 -0
  640. package/dist/src/utils/extensionLoader.js +208 -0
  641. package/dist/src/utils/extensionLoader.js.map +1 -0
  642. package/dist/src/utils/extensionLoader.test.d.ts +6 -0
  643. package/dist/src/utils/extensionLoader.test.js +154 -0
  644. package/dist/src/utils/extensionLoader.test.js.map +1 -0
  645. package/dist/src/utils/fetch.d.ts +1 -0
  646. package/dist/src/utils/fetch.js +4 -0
  647. package/dist/src/utils/fetch.js.map +1 -1
  648. package/dist/src/utils/fileUtils.d.ts +4 -0
  649. package/dist/src/utils/fileUtils.js +34 -2
  650. package/dist/src/utils/fileUtils.js.map +1 -1
  651. package/dist/src/utils/fileUtils.test.js +87 -61
  652. package/dist/src/utils/fileUtils.test.js.map +1 -1
  653. package/dist/src/utils/filesearch/fileSearch.js +1 -1
  654. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  655. package/dist/src/utils/flashFallback.test.js +28 -47
  656. package/dist/src/utils/flashFallback.test.js.map +1 -1
  657. package/dist/src/utils/formatters.d.ts +1 -0
  658. package/dist/src/utils/formatters.js +2 -1
  659. package/dist/src/utils/formatters.js.map +1 -1
  660. package/dist/src/utils/formatters.test.d.ts +6 -0
  661. package/dist/src/utils/formatters.test.js +26 -0
  662. package/dist/src/utils/formatters.test.js.map +1 -0
  663. package/dist/src/utils/getFolderStructure.js +9 -17
  664. package/dist/src/utils/getFolderStructure.js.map +1 -1
  665. package/dist/src/utils/getFolderStructure.test.js +7 -6
  666. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  667. package/dist/src/utils/gitIgnoreParser.d.ts +4 -1
  668. package/dist/src/utils/gitIgnoreParser.js +28 -10
  669. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  670. package/dist/src/utils/gitIgnoreParser.test.js +58 -0
  671. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  672. package/dist/src/utils/googleErrors.d.ts +104 -0
  673. package/dist/src/utils/googleErrors.js +152 -0
  674. package/dist/src/utils/googleErrors.js.map +1 -0
  675. package/dist/src/utils/googleErrors.test.d.ts +6 -0
  676. package/dist/src/utils/googleErrors.test.js +301 -0
  677. package/dist/src/utils/googleErrors.test.js.map +1 -0
  678. package/dist/src/utils/googleQuotaErrors.d.ts +37 -0
  679. package/dist/src/utils/googleQuotaErrors.js +157 -0
  680. package/dist/src/utils/googleQuotaErrors.js.map +1 -0
  681. package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
  682. package/dist/src/utils/googleQuotaErrors.test.js +311 -0
  683. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
  684. package/dist/src/utils/httpErrors.d.ts +18 -0
  685. package/dist/src/utils/httpErrors.js +36 -0
  686. package/dist/src/utils/httpErrors.js.map +1 -0
  687. package/dist/src/utils/ignorePatterns.test.js +26 -30
  688. package/dist/src/utils/ignorePatterns.test.js.map +1 -1
  689. package/dist/src/utils/installationManager.js +2 -1
  690. package/dist/src/utils/installationManager.js.map +1 -1
  691. package/dist/src/utils/installationManager.test.js +6 -4
  692. package/dist/src/utils/installationManager.test.js.map +1 -1
  693. package/dist/src/utils/llm-edit-fixer.d.ts +1 -1
  694. package/dist/src/utils/llm-edit-fixer.js +33 -9
  695. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  696. package/dist/src/utils/llm-edit-fixer.test.js +38 -1
  697. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  698. package/dist/src/utils/memoryDiscovery.d.ts +20 -1
  699. package/dist/src/utils/memoryDiscovery.js +176 -12
  700. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  701. package/dist/src/utils/memoryDiscovery.test.js +299 -40
  702. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  703. package/dist/src/utils/memoryImportProcessor.js +4 -3
  704. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  705. package/dist/src/utils/memoryImportProcessor.test.js +8 -14
  706. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  707. package/dist/src/utils/nextSpeakerChecker.js +3 -3
  708. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  709. package/dist/src/utils/nextSpeakerChecker.test.js +13 -5
  710. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  711. package/dist/src/utils/package.d.ts +12 -0
  712. package/dist/src/utils/package.js +15 -0
  713. package/dist/src/utils/package.js.map +1 -0
  714. package/dist/src/utils/pathCorrector.d.ts +25 -0
  715. package/dist/src/utils/pathCorrector.js +33 -0
  716. package/dist/src/utils/pathCorrector.js.map +1 -0
  717. package/dist/src/utils/pathCorrector.test.d.ts +6 -0
  718. package/dist/src/utils/pathCorrector.test.js +83 -0
  719. package/dist/src/utils/pathCorrector.test.js.map +1 -0
  720. package/dist/src/utils/pathReader.js +4 -4
  721. package/dist/src/utils/pathReader.js.map +1 -1
  722. package/dist/src/utils/pathReader.test.js +44 -1
  723. package/dist/src/utils/pathReader.test.js.map +1 -1
  724. package/dist/src/utils/paths.d.ts +1 -1
  725. package/dist/src/utils/paths.js +131 -29
  726. package/dist/src/utils/paths.js.map +1 -1
  727. package/dist/src/utils/paths.test.js +200 -68
  728. package/dist/src/utils/paths.test.js.map +1 -1
  729. package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
  730. package/dist/src/utils/quotaErrorDetection.js +0 -46
  731. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  732. package/dist/src/utils/retry.d.ts +3 -10
  733. package/dist/src/utils/retry.js +97 -195
  734. package/dist/src/utils/retry.js.map +1 -1
  735. package/dist/src/utils/retry.test.js +179 -145
  736. package/dist/src/utils/retry.test.js.map +1 -1
  737. package/dist/src/utils/safeJsonStringify.d.ts +4 -4
  738. package/dist/src/utils/safeJsonStringify.js +31 -7
  739. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  740. package/dist/src/utils/shell-utils.d.ts +15 -2
  741. package/dist/src/utils/shell-utils.js +387 -140
  742. package/dist/src/utils/shell-utils.js.map +1 -1
  743. package/dist/src/utils/shell-utils.test.js +244 -62
  744. package/dist/src/utils/shell-utils.test.js.map +1 -1
  745. package/dist/src/utils/stdio.d.ts +32 -0
  746. package/dist/src/utils/stdio.js +85 -0
  747. package/dist/src/utils/stdio.js.map +1 -0
  748. package/dist/src/utils/stdio.test.d.ts +6 -0
  749. package/dist/src/utils/stdio.test.js +47 -0
  750. package/dist/src/utils/stdio.test.js.map +1 -0
  751. package/dist/src/utils/summarizer.d.ts +4 -2
  752. package/dist/src/utils/summarizer.js +8 -9
  753. package/dist/src/utils/summarizer.js.map +1 -1
  754. package/dist/src/utils/summarizer.test.js +32 -12
  755. package/dist/src/utils/summarizer.test.js.map +1 -1
  756. package/dist/src/utils/systemEncoding.js +5 -4
  757. package/dist/src/utils/systemEncoding.js.map +1 -1
  758. package/dist/src/utils/systemEncoding.test.js +2 -1
  759. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  760. package/dist/src/utils/terminal.d.ts +14 -0
  761. package/dist/src/utils/terminal.js +38 -0
  762. package/dist/src/utils/terminal.js.map +1 -0
  763. package/dist/src/utils/tool-utils.d.ts +2 -2
  764. package/dist/src/utils/tool-utils.js +15 -6
  765. package/dist/src/utils/tool-utils.js.map +1 -1
  766. package/dist/src/utils/tool-utils.test.js +8 -0
  767. package/dist/src/utils/tool-utils.test.js.map +1 -1
  768. package/dist/src/utils/userAccountManager.js +5 -4
  769. package/dist/src/utils/userAccountManager.js.map +1 -1
  770. package/dist/src/utils/userAccountManager.test.js +9 -7
  771. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  772. package/dist/src/utils/workspaceContext.d.ts +4 -3
  773. package/dist/src/utils/workspaceContext.js +13 -13
  774. package/dist/src/utils/workspaceContext.js.map +1 -1
  775. package/dist/src/utils/workspaceContext.test.js +8 -7
  776. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  777. package/dist/tsconfig.tsbuildinfo +1 -1
  778. package/package.json +12 -7
@@ -7,8 +7,10 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
7
  import { CoreToolScheduler, convertToFunctionResponse, truncateAndSaveToFile, } from './coreToolScheduler.js';
8
8
  import { DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES, DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD, BaseDeclarativeTool, BaseToolInvocation, ToolConfirmationOutcome, Kind, ApprovalMode, } from '../index.js';
9
9
  import { MockModifiableTool, MockTool, MOCK_TOOL_SHOULD_CONFIRM_EXECUTE, } from '../test-utils/mock-tool.js';
10
+ import * as modifiableToolModule from '../tools/modifiable-tool.js';
10
11
  import * as fs from 'node:fs/promises';
11
12
  import * as path from 'node:path';
13
+ import { isShellInvocationAllowlisted } from '../utils/shell-utils.js';
12
14
  vi.mock('fs/promises', () => ({
13
15
  writeFile: vi.fn(),
14
16
  }));
@@ -121,6 +123,50 @@ async function waitForStatus(onToolCallsUpdate, status, timeout = 5000) {
121
123
  check();
122
124
  });
123
125
  }
126
+ function createMockConfig(overrides = {}) {
127
+ const defaultToolRegistry = {
128
+ getTool: () => undefined,
129
+ getToolByName: () => undefined,
130
+ getFunctionDeclarations: () => [],
131
+ tools: new Map(),
132
+ discovery: {},
133
+ registerTool: () => { },
134
+ getToolByDisplayName: () => undefined,
135
+ getTools: () => [],
136
+ discoverTools: async () => { },
137
+ getAllTools: () => [],
138
+ getToolsByServer: () => [],
139
+ };
140
+ const baseConfig = {
141
+ getSessionId: () => 'test-session-id',
142
+ getUsageStatisticsEnabled: () => true,
143
+ getDebugMode: () => false,
144
+ getApprovalMode: () => ApprovalMode.DEFAULT,
145
+ setApprovalMode: () => { },
146
+ getAllowedTools: () => [],
147
+ getContentGeneratorConfig: () => ({
148
+ model: 'test-model',
149
+ authType: 'oauth-personal',
150
+ }),
151
+ getShellExecutionConfig: () => ({
152
+ terminalWidth: 90,
153
+ terminalHeight: 30,
154
+ }),
155
+ storage: {
156
+ getProjectTempDir: () => '/tmp',
157
+ },
158
+ getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
159
+ getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
160
+ getToolRegistry: () => defaultToolRegistry,
161
+ getUseSmartEdit: () => false,
162
+ getUseModelRouter: () => false,
163
+ getGeminiClient: () => null,
164
+ getEnableMessageBusIntegration: () => false,
165
+ getMessageBus: () => null,
166
+ getPolicyEngine: () => null,
167
+ };
168
+ return { ...baseConfig, ...overrides };
169
+ }
124
170
  describe('CoreToolScheduler', () => {
125
171
  it('should cancel a tool call if the signal is aborted before confirmation', async () => {
126
172
  const mockTool = new MockTool({
@@ -143,36 +189,15 @@ describe('CoreToolScheduler', () => {
143
189
  };
144
190
  const onAllToolCallsComplete = vi.fn();
145
191
  const onToolCallsUpdate = vi.fn();
146
- const mockConfig = {
147
- getSessionId: () => 'test-session-id',
148
- getUsageStatisticsEnabled: () => true,
149
- getDebugMode: () => false,
150
- getApprovalMode: () => ApprovalMode.DEFAULT,
151
- getAllowedTools: () => [],
152
- getContentGeneratorConfig: () => ({
153
- model: 'test-model',
154
- authType: 'oauth-personal',
155
- }),
156
- getShellExecutionConfig: () => ({
157
- terminalWidth: 90,
158
- terminalHeight: 30,
159
- }),
160
- storage: {
161
- getProjectTempDir: () => '/tmp',
162
- },
163
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
164
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
192
+ const mockConfig = createMockConfig({
165
193
  getToolRegistry: () => mockToolRegistry,
166
- getUseSmartEdit: () => false,
167
- getUseModelRouter: () => false,
168
- getGeminiClient: () => null, // No client needed for these tests
169
- };
194
+ isInteractive: () => false,
195
+ });
170
196
  const scheduler = new CoreToolScheduler({
171
197
  config: mockConfig,
172
198
  onAllToolCallsComplete,
173
199
  onToolCallsUpdate,
174
200
  getPreferredEditor: () => 'vscode',
175
- onEditorClose: vi.fn(),
176
201
  });
177
202
  const abortController = new AbortController();
178
203
  const request = {
@@ -189,6 +214,184 @@ describe('CoreToolScheduler', () => {
189
214
  .calls[0][0];
190
215
  expect(completedCalls[0].status).toBe('cancelled');
191
216
  });
217
+ it('should cancel all tools when cancelAll is called', async () => {
218
+ const mockTool1 = new MockTool({
219
+ name: 'mockTool1',
220
+ shouldConfirmExecute: MOCK_TOOL_SHOULD_CONFIRM_EXECUTE,
221
+ });
222
+ const mockTool2 = new MockTool({ name: 'mockTool2' });
223
+ const mockTool3 = new MockTool({ name: 'mockTool3' });
224
+ const mockToolRegistry = {
225
+ getTool: (name) => {
226
+ if (name === 'mockTool1')
227
+ return mockTool1;
228
+ if (name === 'mockTool2')
229
+ return mockTool2;
230
+ if (name === 'mockTool3')
231
+ return mockTool3;
232
+ return undefined;
233
+ },
234
+ getFunctionDeclarations: () => [],
235
+ tools: new Map(),
236
+ discovery: {},
237
+ registerTool: () => { },
238
+ getToolByName: (name) => {
239
+ if (name === 'mockTool1')
240
+ return mockTool1;
241
+ if (name === 'mockTool2')
242
+ return mockTool2;
243
+ if (name === 'mockTool3')
244
+ return mockTool3;
245
+ return undefined;
246
+ },
247
+ getToolByDisplayName: () => undefined,
248
+ getTools: () => [],
249
+ discoverTools: async () => { },
250
+ getAllTools: () => [],
251
+ getToolsByServer: () => [],
252
+ };
253
+ const onAllToolCallsComplete = vi.fn();
254
+ const onToolCallsUpdate = vi.fn();
255
+ const mockConfig = createMockConfig({
256
+ getToolRegistry: () => mockToolRegistry,
257
+ isInteractive: () => false,
258
+ });
259
+ const scheduler = new CoreToolScheduler({
260
+ config: mockConfig,
261
+ onAllToolCallsComplete,
262
+ onToolCallsUpdate,
263
+ getPreferredEditor: () => 'vscode',
264
+ });
265
+ const abortController = new AbortController();
266
+ const requests = [
267
+ {
268
+ callId: '1',
269
+ name: 'mockTool1',
270
+ args: {},
271
+ isClientInitiated: false,
272
+ prompt_id: 'prompt-id-1',
273
+ },
274
+ {
275
+ callId: '2',
276
+ name: 'mockTool2',
277
+ args: {},
278
+ isClientInitiated: false,
279
+ prompt_id: 'prompt-id-1',
280
+ },
281
+ {
282
+ callId: '3',
283
+ name: 'mockTool3',
284
+ args: {},
285
+ isClientInitiated: false,
286
+ prompt_id: 'prompt-id-1',
287
+ },
288
+ ];
289
+ // Don't await, let it run in the background
290
+ void scheduler.schedule(requests, abortController.signal);
291
+ // Wait for the first tool to be awaiting approval
292
+ await waitForStatus(onToolCallsUpdate, 'awaiting_approval');
293
+ // Cancel all operations
294
+ scheduler.cancelAll(abortController.signal);
295
+ abortController.abort(); // Also fire the signal
296
+ await vi.waitFor(() => {
297
+ expect(onAllToolCallsComplete).toHaveBeenCalled();
298
+ });
299
+ const completedCalls = onAllToolCallsComplete.mock
300
+ .calls[0][0];
301
+ expect(completedCalls).toHaveLength(3);
302
+ expect(completedCalls.find((c) => c.request.callId === '1')?.status).toBe('cancelled');
303
+ expect(completedCalls.find((c) => c.request.callId === '2')?.status).toBe('cancelled');
304
+ expect(completedCalls.find((c) => c.request.callId === '3')?.status).toBe('cancelled');
305
+ });
306
+ it('should cancel all tools in a batch when one is cancelled via confirmation', async () => {
307
+ const mockTool1 = new MockTool({
308
+ name: 'mockTool1',
309
+ shouldConfirmExecute: MOCK_TOOL_SHOULD_CONFIRM_EXECUTE,
310
+ });
311
+ const mockTool2 = new MockTool({ name: 'mockTool2' });
312
+ const mockTool3 = new MockTool({ name: 'mockTool3' });
313
+ const mockToolRegistry = {
314
+ getTool: (name) => {
315
+ if (name === 'mockTool1')
316
+ return mockTool1;
317
+ if (name === 'mockTool2')
318
+ return mockTool2;
319
+ if (name === 'mockTool3')
320
+ return mockTool3;
321
+ return undefined;
322
+ },
323
+ getFunctionDeclarations: () => [],
324
+ tools: new Map(),
325
+ discovery: {},
326
+ registerTool: () => { },
327
+ getToolByName: (name) => {
328
+ if (name === 'mockTool1')
329
+ return mockTool1;
330
+ if (name === 'mockTool2')
331
+ return mockTool2;
332
+ if (name === 'mockTool3')
333
+ return mockTool3;
334
+ return undefined;
335
+ },
336
+ getToolByDisplayName: () => undefined,
337
+ getTools: () => [],
338
+ discoverTools: async () => { },
339
+ getAllTools: () => [],
340
+ getToolsByServer: () => [],
341
+ };
342
+ const onAllToolCallsComplete = vi.fn();
343
+ const onToolCallsUpdate = vi.fn();
344
+ const mockConfig = createMockConfig({
345
+ getToolRegistry: () => mockToolRegistry,
346
+ isInteractive: () => false,
347
+ });
348
+ const scheduler = new CoreToolScheduler({
349
+ config: mockConfig,
350
+ onAllToolCallsComplete,
351
+ onToolCallsUpdate,
352
+ getPreferredEditor: () => 'vscode',
353
+ });
354
+ const abortController = new AbortController();
355
+ const requests = [
356
+ {
357
+ callId: '1',
358
+ name: 'mockTool1',
359
+ args: {},
360
+ isClientInitiated: false,
361
+ prompt_id: 'prompt-id-1',
362
+ },
363
+ {
364
+ callId: '2',
365
+ name: 'mockTool2',
366
+ args: {},
367
+ isClientInitiated: false,
368
+ prompt_id: 'prompt-id-1',
369
+ },
370
+ {
371
+ callId: '3',
372
+ name: 'mockTool3',
373
+ args: {},
374
+ isClientInitiated: false,
375
+ prompt_id: 'prompt-id-1',
376
+ },
377
+ ];
378
+ // Don't await, let it run in the background
379
+ void scheduler.schedule(requests, abortController.signal);
380
+ // Wait for the first tool to be awaiting approval
381
+ const awaitingCall = (await waitForStatus(onToolCallsUpdate, 'awaiting_approval'));
382
+ // Cancel the first tool via its confirmation handler
383
+ await awaitingCall.confirmationDetails.onConfirm(ToolConfirmationOutcome.Cancel);
384
+ abortController.abort(); // User cancelling often involves an abort signal
385
+ await vi.waitFor(() => {
386
+ expect(onAllToolCallsComplete).toHaveBeenCalled();
387
+ });
388
+ const completedCalls = onAllToolCallsComplete.mock
389
+ .calls[0][0];
390
+ expect(completedCalls).toHaveLength(3);
391
+ expect(completedCalls.find((c) => c.request.callId === '1')?.status).toBe('cancelled');
392
+ expect(completedCalls.find((c) => c.request.callId === '2')?.status).toBe('cancelled');
393
+ expect(completedCalls.find((c) => c.request.callId === '3')?.status).toBe('cancelled');
394
+ });
192
395
  it('should mark tool call as cancelled when abort happens during confirmation error', async () => {
193
396
  const abortController = new AbortController();
194
397
  const abortError = new Error('Abort requested during confirmation');
@@ -208,36 +411,15 @@ describe('CoreToolScheduler', () => {
208
411
  };
209
412
  const onAllToolCallsComplete = vi.fn();
210
413
  const onToolCallsUpdate = vi.fn();
211
- const mockConfig = {
212
- getSessionId: () => 'test-session-id',
213
- getUsageStatisticsEnabled: () => true,
214
- getDebugMode: () => false,
215
- getApprovalMode: () => ApprovalMode.DEFAULT,
216
- getAllowedTools: () => [],
217
- getContentGeneratorConfig: () => ({
218
- model: 'test-model',
219
- authType: 'oauth-personal',
220
- }),
221
- getShellExecutionConfig: () => ({
222
- terminalWidth: 90,
223
- terminalHeight: 30,
224
- }),
225
- storage: {
226
- getProjectTempDir: () => '/tmp',
227
- },
228
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
229
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
414
+ const mockConfig = createMockConfig({
230
415
  getToolRegistry: () => mockToolRegistry,
231
- getUseSmartEdit: () => false,
232
- getUseModelRouter: () => false,
233
- getGeminiClient: () => null,
234
- };
416
+ isInteractive: () => false,
417
+ });
235
418
  const scheduler = new CoreToolScheduler({
236
419
  config: mockConfig,
237
420
  onAllToolCallsComplete,
238
421
  onToolCallsUpdate,
239
422
  getPreferredEditor: () => 'vscode',
240
- onEditorClose: vi.fn(),
241
423
  });
242
424
  const request = {
243
425
  callId: 'abort-1',
@@ -257,20 +439,17 @@ describe('CoreToolScheduler', () => {
257
439
  describe('getToolSuggestion', () => {
258
440
  it('should suggest the top N closest tool names for a typo', () => {
259
441
  // Create mocked tool registry
260
- const mockConfig = {
261
- getToolRegistry: () => mockToolRegistry,
262
- getUseSmartEdit: () => false,
263
- getUseModelRouter: () => false,
264
- getGeminiClient: () => null, // No client needed for these tests
265
- };
266
442
  const mockToolRegistry = {
267
443
  getAllToolNames: () => ['list_files', 'read_file', 'write_file'],
268
444
  };
445
+ const mockConfig = createMockConfig({
446
+ getToolRegistry: () => mockToolRegistry,
447
+ isInteractive: () => false,
448
+ });
269
449
  // Create scheduler
270
450
  const scheduler = new CoreToolScheduler({
271
451
  config: mockConfig,
272
452
  getPreferredEditor: () => 'vscode',
273
- onEditorClose: vi.fn(),
274
453
  });
275
454
  // Test that the right tool is selected, with only 1 result, for typos
276
455
  // @ts-expect-error accessing private method
@@ -307,36 +486,15 @@ describe('CoreToolScheduler with payload', () => {
307
486
  };
308
487
  const onAllToolCallsComplete = vi.fn();
309
488
  const onToolCallsUpdate = vi.fn();
310
- const mockConfig = {
311
- getSessionId: () => 'test-session-id',
312
- getUsageStatisticsEnabled: () => true,
313
- getDebugMode: () => false,
314
- getApprovalMode: () => ApprovalMode.DEFAULT,
315
- getAllowedTools: () => [],
316
- getContentGeneratorConfig: () => ({
317
- model: 'test-model',
318
- authType: 'oauth-personal',
319
- }),
320
- getShellExecutionConfig: () => ({
321
- terminalWidth: 90,
322
- terminalHeight: 30,
323
- }),
324
- storage: {
325
- getProjectTempDir: () => '/tmp',
326
- },
327
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
328
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
489
+ const mockConfig = createMockConfig({
329
490
  getToolRegistry: () => mockToolRegistry,
330
- getUseSmartEdit: () => false,
331
- getUseModelRouter: () => false,
332
- getGeminiClient: () => null, // No client needed for these tests
333
- };
491
+ isInteractive: () => false,
492
+ });
334
493
  const scheduler = new CoreToolScheduler({
335
494
  config: mockConfig,
336
495
  onAllToolCallsComplete,
337
496
  onToolCallsUpdate,
338
497
  getPreferredEditor: () => 'vscode',
339
- onEditorClose: vi.fn(),
340
498
  });
341
499
  const abortController = new AbortController();
342
500
  const request = {
@@ -584,34 +742,15 @@ describe('CoreToolScheduler edit cancellation', () => {
584
742
  };
585
743
  const onAllToolCallsComplete = vi.fn();
586
744
  const onToolCallsUpdate = vi.fn();
587
- const mockConfig = {
588
- getSessionId: () => 'test-session-id',
589
- getUsageStatisticsEnabled: () => true,
590
- getDebugMode: () => false,
591
- getApprovalMode: () => ApprovalMode.DEFAULT,
592
- getAllowedTools: () => [],
593
- getContentGeneratorConfig: () => ({
594
- model: 'test-model',
595
- authType: 'oauth-personal',
596
- }),
597
- getShellExecutionConfig: () => ({
598
- terminalWidth: 90,
599
- terminalHeight: 30,
600
- }),
601
- storage: {
602
- getProjectTempDir: () => '/tmp',
603
- },
745
+ const mockConfig = createMockConfig({
604
746
  getToolRegistry: () => mockToolRegistry,
605
- getUseSmartEdit: () => false,
606
- getUseModelRouter: () => false,
607
- getGeminiClient: () => null, // No client needed for these tests
608
- };
747
+ isInteractive: () => false,
748
+ });
609
749
  const scheduler = new CoreToolScheduler({
610
750
  config: mockConfig,
611
751
  onAllToolCallsComplete,
612
752
  onToolCallsUpdate,
613
753
  getPreferredEditor: () => 'vscode',
614
- onEditorClose: vi.fn(),
615
754
  });
616
755
  const abortController = new AbortController();
617
756
  const request = {
@@ -670,36 +809,16 @@ describe('CoreToolScheduler YOLO mode', () => {
670
809
  const onAllToolCallsComplete = vi.fn();
671
810
  const onToolCallsUpdate = vi.fn();
672
811
  // Configure the scheduler for YOLO mode.
673
- const mockConfig = {
674
- getSessionId: () => 'test-session-id',
675
- getUsageStatisticsEnabled: () => true,
676
- getDebugMode: () => false,
677
- getApprovalMode: () => ApprovalMode.YOLO,
678
- getAllowedTools: () => [],
679
- getContentGeneratorConfig: () => ({
680
- model: 'test-model',
681
- authType: 'oauth-personal',
682
- }),
683
- getShellExecutionConfig: () => ({
684
- terminalWidth: 90,
685
- terminalHeight: 30,
686
- }),
687
- storage: {
688
- getProjectTempDir: () => '/tmp',
689
- },
812
+ const mockConfig = createMockConfig({
690
813
  getToolRegistry: () => mockToolRegistry,
691
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
692
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
693
- getUseSmartEdit: () => false,
694
- getUseModelRouter: () => false,
695
- getGeminiClient: () => null, // No client needed for these tests
696
- };
814
+ getApprovalMode: () => ApprovalMode.YOLO,
815
+ isInteractive: () => false,
816
+ });
697
817
  const scheduler = new CoreToolScheduler({
698
818
  config: mockConfig,
699
819
  onAllToolCallsComplete,
700
820
  onToolCallsUpdate,
701
821
  getPreferredEditor: () => 'vscode',
702
- onEditorClose: vi.fn(),
703
822
  });
704
823
  const abortController = new AbortController();
705
824
  const request = {
@@ -764,36 +883,16 @@ describe('CoreToolScheduler request queueing', () => {
764
883
  };
765
884
  const onAllToolCallsComplete = vi.fn();
766
885
  const onToolCallsUpdate = vi.fn();
767
- const mockConfig = {
768
- getSessionId: () => 'test-session-id',
769
- getUsageStatisticsEnabled: () => true,
770
- getDebugMode: () => false,
771
- getApprovalMode: () => ApprovalMode.YOLO, // Use YOLO to avoid confirmation prompts
772
- getAllowedTools: () => [],
773
- getContentGeneratorConfig: () => ({
774
- model: 'test-model',
775
- authType: 'oauth-personal',
776
- }),
777
- getShellExecutionConfig: () => ({
778
- terminalWidth: 90,
779
- terminalHeight: 30,
780
- }),
781
- storage: {
782
- getProjectTempDir: () => '/tmp',
783
- },
784
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
785
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
886
+ const mockConfig = createMockConfig({
786
887
  getToolRegistry: () => mockToolRegistry,
787
- getUseSmartEdit: () => false,
788
- getUseModelRouter: () => false,
789
- getGeminiClient: () => null, // No client needed for these tests
790
- };
888
+ getApprovalMode: () => ApprovalMode.YOLO, // Use YOLO to avoid confirmation prompts
889
+ isInteractive: () => false,
890
+ });
791
891
  const scheduler = new CoreToolScheduler({
792
892
  config: mockConfig,
793
893
  onAllToolCallsComplete,
794
894
  onToolCallsUpdate,
795
895
  getPreferredEditor: () => 'vscode',
796
- onEditorClose: vi.fn(),
797
896
  });
798
897
  const abortController = new AbortController();
799
898
  const request1 = {
@@ -874,38 +973,20 @@ describe('CoreToolScheduler request queueing', () => {
874
973
  const onAllToolCallsComplete = vi.fn();
875
974
  const onToolCallsUpdate = vi.fn();
876
975
  // Configure the scheduler to auto-approve the specific tool call.
877
- const mockConfig = {
878
- getSessionId: () => 'test-session-id',
879
- getUsageStatisticsEnabled: () => true,
880
- getDebugMode: () => false,
881
- getApprovalMode: () => ApprovalMode.DEFAULT, // Not YOLO mode
976
+ const mockConfig = createMockConfig({
882
977
  getAllowedTools: () => ['mockTool'], // Auto-approve this tool
883
978
  getToolRegistry: () => toolRegistry,
884
- getContentGeneratorConfig: () => ({
885
- model: 'test-model',
886
- authType: 'oauth-personal',
887
- }),
888
979
  getShellExecutionConfig: () => ({
889
980
  terminalWidth: 80,
890
981
  terminalHeight: 24,
891
982
  }),
892
- getTerminalWidth: vi.fn(() => 80),
893
- getTerminalHeight: vi.fn(() => 24),
894
- storage: {
895
- getProjectTempDir: () => '/tmp',
896
- },
897
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
898
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
899
- getUseSmartEdit: () => false,
900
- getUseModelRouter: () => false,
901
- getGeminiClient: () => null, // No client needed for these tests
902
- };
983
+ isInteractive: () => false,
984
+ });
903
985
  const scheduler = new CoreToolScheduler({
904
986
  config: mockConfig,
905
987
  onAllToolCallsComplete,
906
988
  onToolCallsUpdate,
907
989
  getPreferredEditor: () => 'vscode',
908
- onEditorClose: vi.fn(),
909
990
  });
910
991
  const abortController = new AbortController();
911
992
  const request = {
@@ -946,6 +1027,71 @@ describe('CoreToolScheduler request queueing', () => {
946
1027
  expect(completedCall.response.resultDisplay).toBe('Tool executed');
947
1028
  }
948
1029
  });
1030
+ it('should require approval for a chained shell command even when prefix is allowlisted', async () => {
1031
+ expect(isShellInvocationAllowlisted({
1032
+ params: { command: 'git status && rm -rf /tmp/should-not-run' },
1033
+ }, ['run_shell_command(git)'])).toBe(false);
1034
+ const executeFn = vi.fn().mockResolvedValue({
1035
+ llmContent: 'Shell command executed',
1036
+ returnDisplay: 'Shell command executed',
1037
+ });
1038
+ const mockShellTool = new MockTool({
1039
+ name: 'run_shell_command',
1040
+ shouldConfirmExecute: (params) => Promise.resolve({
1041
+ type: 'exec',
1042
+ title: 'Confirm Shell Command',
1043
+ command: String(params['command'] ?? ''),
1044
+ rootCommand: 'git',
1045
+ onConfirm: async () => { },
1046
+ }),
1047
+ execute: () => executeFn({}),
1048
+ });
1049
+ const toolRegistry = {
1050
+ getTool: () => mockShellTool,
1051
+ getToolByName: () => mockShellTool,
1052
+ getFunctionDeclarations: () => [],
1053
+ tools: new Map(),
1054
+ discovery: {},
1055
+ registerTool: () => { },
1056
+ getToolByDisplayName: () => mockShellTool,
1057
+ getTools: () => [],
1058
+ discoverTools: async () => { },
1059
+ getAllTools: () => [],
1060
+ getToolsByServer: () => [],
1061
+ };
1062
+ const onAllToolCallsComplete = vi.fn();
1063
+ const onToolCallsUpdate = vi.fn();
1064
+ const mockConfig = createMockConfig({
1065
+ getAllowedTools: () => ['run_shell_command(git)'],
1066
+ getShellExecutionConfig: () => ({
1067
+ terminalWidth: 80,
1068
+ terminalHeight: 24,
1069
+ }),
1070
+ getToolRegistry: () => toolRegistry,
1071
+ isInteractive: () => false,
1072
+ });
1073
+ const scheduler = new CoreToolScheduler({
1074
+ config: mockConfig,
1075
+ onAllToolCallsComplete,
1076
+ onToolCallsUpdate,
1077
+ getPreferredEditor: () => 'vscode',
1078
+ });
1079
+ const abortController = new AbortController();
1080
+ const request = {
1081
+ callId: 'shell-1',
1082
+ name: 'run_shell_command',
1083
+ args: { command: 'git status && rm -rf /tmp/should-not-run' },
1084
+ isClientInitiated: false,
1085
+ prompt_id: 'prompt-shell-auto-approved',
1086
+ };
1087
+ await scheduler.schedule([request], abortController.signal);
1088
+ const statusUpdates = onToolCallsUpdate.mock.calls
1089
+ .map((call) => call[0][0]?.status)
1090
+ .filter(Boolean);
1091
+ expect(statusUpdates).toContain('awaiting_approval');
1092
+ expect(executeFn).not.toHaveBeenCalled();
1093
+ expect(onAllToolCallsComplete).not.toHaveBeenCalled();
1094
+ }, 20000);
949
1095
  it('should handle two synchronous calls to schedule', async () => {
950
1096
  const executeFn = vi.fn().mockResolvedValue({
951
1097
  llmContent: 'Tool executed',
@@ -968,36 +1114,16 @@ describe('CoreToolScheduler request queueing', () => {
968
1114
  };
969
1115
  const onAllToolCallsComplete = vi.fn();
970
1116
  const onToolCallsUpdate = vi.fn();
971
- const mockConfig = {
972
- getSessionId: () => 'test-session-id',
973
- getUsageStatisticsEnabled: () => true,
974
- getDebugMode: () => false,
975
- getApprovalMode: () => ApprovalMode.YOLO,
976
- getAllowedTools: () => [],
977
- getContentGeneratorConfig: () => ({
978
- model: 'test-model',
979
- authType: 'oauth-personal',
980
- }),
981
- getShellExecutionConfig: () => ({
982
- terminalWidth: 90,
983
- terminalHeight: 30,
984
- }),
985
- storage: {
986
- getProjectTempDir: () => '/tmp',
987
- },
988
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
989
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
1117
+ const mockConfig = createMockConfig({
990
1118
  getToolRegistry: () => mockToolRegistry,
991
- getUseSmartEdit: () => false,
992
- getUseModelRouter: () => false,
993
- getGeminiClient: () => null, // No client needed for these tests
994
- };
1119
+ getApprovalMode: () => ApprovalMode.YOLO,
1120
+ isInteractive: () => false,
1121
+ });
995
1122
  const scheduler = new CoreToolScheduler({
996
1123
  config: mockConfig,
997
1124
  onAllToolCallsComplete,
998
1125
  onToolCallsUpdate,
999
1126
  getPreferredEditor: () => 'vscode',
1000
- onEditorClose: vi.fn(),
1001
1127
  });
1002
1128
  const abortController = new AbortController();
1003
1129
  const request1 = {
@@ -1028,28 +1154,13 @@ describe('CoreToolScheduler request queueing', () => {
1028
1154
  });
1029
1155
  it('should auto-approve remaining tool calls when first tool call is approved with ProceedAlways', async () => {
1030
1156
  let approvalMode = ApprovalMode.DEFAULT;
1031
- const mockConfig = {
1032
- getSessionId: () => 'test-session-id',
1033
- getUsageStatisticsEnabled: () => true,
1034
- getDebugMode: () => false,
1157
+ const mockConfig = createMockConfig({
1035
1158
  getApprovalMode: () => approvalMode,
1036
- getAllowedTools: () => [],
1037
1159
  setApprovalMode: (mode) => {
1038
1160
  approvalMode = mode;
1039
1161
  },
1040
- getShellExecutionConfig: () => ({
1041
- terminalWidth: 90,
1042
- terminalHeight: 30,
1043
- }),
1044
- storage: {
1045
- getProjectTempDir: () => '/tmp',
1046
- },
1047
- getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
1048
- getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
1049
- getUseSmartEdit: () => false,
1050
- getUseModelRouter: () => false,
1051
- getGeminiClient: () => null, // No client needed for these tests
1052
- };
1162
+ isInteractive: () => false,
1163
+ });
1053
1164
  const testTool = new TestApprovalTool(mockConfig);
1054
1165
  const toolRegistry = {
1055
1166
  getTool: () => testTool,
@@ -1094,7 +1205,6 @@ describe('CoreToolScheduler request queueing', () => {
1094
1205
  });
1095
1206
  },
1096
1207
  getPreferredEditor: () => 'vscode',
1097
- onEditorClose: vi.fn(),
1098
1208
  });
1099
1209
  const abortController = new AbortController();
1100
1210
  // Schedule multiple tools that need confirmation
@@ -1122,27 +1232,273 @@ describe('CoreToolScheduler request queueing', () => {
1122
1232
  },
1123
1233
  ];
1124
1234
  await scheduler.schedule(requests, abortController.signal);
1125
- // Wait for all tools to be awaiting approval
1235
+ // Wait for the FIRST tool to be awaiting approval
1126
1236
  await vi.waitFor(() => {
1127
1237
  const calls = onToolCallsUpdate.mock.calls.at(-1)?.[0];
1238
+ // With the sequential scheduler, the update includes the active call and the queue.
1128
1239
  expect(calls?.length).toBe(3);
1129
- expect(calls?.every((call) => call.status === 'awaiting_approval')).toBe(true);
1240
+ expect(calls?.[0].status).toBe('awaiting_approval');
1241
+ expect(calls?.[0].request.callId).toBe('1');
1242
+ // Check that the other two are in the queue (still in 'validating' state)
1243
+ expect(calls?.[1].status).toBe('validating');
1244
+ expect(calls?.[2].status).toBe('validating');
1130
1245
  });
1131
- expect(pendingConfirmations.length).toBe(3);
1246
+ expect(pendingConfirmations.length).toBe(1);
1132
1247
  // Approve the first tool with ProceedAlways
1133
1248
  const firstConfirmation = pendingConfirmations[0];
1134
1249
  firstConfirmation(ToolConfirmationOutcome.ProceedAlways);
1135
1250
  // Wait for all tools to be completed
1136
1251
  await vi.waitFor(() => {
1137
1252
  expect(onAllToolCallsComplete).toHaveBeenCalled();
1138
- const completedCalls = onAllToolCallsComplete.mock.calls.at(-1)?.[0];
1139
- expect(completedCalls?.length).toBe(3);
1140
- expect(completedCalls?.every((call) => call.status === 'success')).toBe(true);
1141
1253
  });
1254
+ const completedCalls = onAllToolCallsComplete.mock.calls.at(-1)?.[0];
1255
+ expect(completedCalls?.length).toBe(3);
1256
+ expect(completedCalls?.every((call) => call.status === 'success')).toBe(true);
1142
1257
  // Verify approval mode was changed
1143
1258
  expect(approvalMode).toBe(ApprovalMode.AUTO_EDIT);
1144
1259
  });
1145
1260
  });
1261
+ describe('CoreToolScheduler Sequential Execution', () => {
1262
+ it('should execute tool calls in a batch sequentially', async () => {
1263
+ // Arrange
1264
+ let firstCallFinished = false;
1265
+ const executeFn = vi
1266
+ .fn()
1267
+ .mockImplementation(async (args) => {
1268
+ if (args.call === 1) {
1269
+ // First call, wait for a bit to simulate work
1270
+ await new Promise((resolve) => setTimeout(resolve, 50));
1271
+ firstCallFinished = true;
1272
+ return { llmContent: 'First call done' };
1273
+ }
1274
+ if (args.call === 2) {
1275
+ // Second call, should only happen after the first is finished
1276
+ if (!firstCallFinished) {
1277
+ throw new Error('Second tool call started before the first one finished!');
1278
+ }
1279
+ return { llmContent: 'Second call done' };
1280
+ }
1281
+ return { llmContent: 'default' };
1282
+ });
1283
+ const mockTool = new MockTool({ name: 'mockTool', execute: executeFn });
1284
+ const declarativeTool = mockTool;
1285
+ const mockToolRegistry = {
1286
+ getTool: () => declarativeTool,
1287
+ getToolByName: () => declarativeTool,
1288
+ getFunctionDeclarations: () => [],
1289
+ tools: new Map(),
1290
+ discovery: {},
1291
+ registerTool: () => { },
1292
+ getToolByDisplayName: () => declarativeTool,
1293
+ getTools: () => [],
1294
+ discoverTools: async () => { },
1295
+ getAllTools: () => [],
1296
+ getToolsByServer: () => [],
1297
+ };
1298
+ const onAllToolCallsComplete = vi.fn();
1299
+ const onToolCallsUpdate = vi.fn();
1300
+ const mockConfig = createMockConfig({
1301
+ getToolRegistry: () => mockToolRegistry,
1302
+ getApprovalMode: () => ApprovalMode.YOLO, // Use YOLO to avoid confirmation prompts
1303
+ isInteractive: () => false,
1304
+ });
1305
+ const scheduler = new CoreToolScheduler({
1306
+ config: mockConfig,
1307
+ onAllToolCallsComplete,
1308
+ onToolCallsUpdate,
1309
+ getPreferredEditor: () => 'vscode',
1310
+ });
1311
+ const abortController = new AbortController();
1312
+ const requests = [
1313
+ {
1314
+ callId: '1',
1315
+ name: 'mockTool',
1316
+ args: { call: 1 },
1317
+ isClientInitiated: false,
1318
+ prompt_id: 'prompt-1',
1319
+ },
1320
+ {
1321
+ callId: '2',
1322
+ name: 'mockTool',
1323
+ args: { call: 2 },
1324
+ isClientInitiated: false,
1325
+ prompt_id: 'prompt-1',
1326
+ },
1327
+ ];
1328
+ // Act
1329
+ await scheduler.schedule(requests, abortController.signal);
1330
+ // Assert
1331
+ await vi.waitFor(() => {
1332
+ expect(onAllToolCallsComplete).toHaveBeenCalled();
1333
+ });
1334
+ // Check that execute was called twice
1335
+ expect(executeFn).toHaveBeenCalledTimes(2);
1336
+ // Check the order of calls
1337
+ const calls = executeFn.mock.calls;
1338
+ expect(calls[0][0]).toEqual({ call: 1 });
1339
+ expect(calls[1][0]).toEqual({ call: 2 });
1340
+ // The onAllToolCallsComplete should be called once with both results
1341
+ const completedCalls = onAllToolCallsComplete.mock
1342
+ .calls[0][0];
1343
+ expect(completedCalls).toHaveLength(2);
1344
+ expect(completedCalls[0].status).toBe('success');
1345
+ expect(completedCalls[1].status).toBe('success');
1346
+ });
1347
+ it('should cancel subsequent tools when the signal is aborted.', async () => {
1348
+ // Arrange
1349
+ const abortController = new AbortController();
1350
+ let secondCallStarted = false;
1351
+ const executeFn = vi
1352
+ .fn()
1353
+ .mockImplementation(async (args) => {
1354
+ if (args.call === 1) {
1355
+ return { llmContent: 'First call done' };
1356
+ }
1357
+ if (args.call === 2) {
1358
+ secondCallStarted = true;
1359
+ // This call will be cancelled while it's "running".
1360
+ await new Promise((resolve) => setTimeout(resolve, 100));
1361
+ // It should not return a value because it will be cancelled.
1362
+ return { llmContent: 'Second call should not complete' };
1363
+ }
1364
+ if (args.call === 3) {
1365
+ return { llmContent: 'Third call done' };
1366
+ }
1367
+ return { llmContent: 'default' };
1368
+ });
1369
+ const mockTool = new MockTool({ name: 'mockTool', execute: executeFn });
1370
+ const declarativeTool = mockTool;
1371
+ const mockToolRegistry = {
1372
+ getTool: () => declarativeTool,
1373
+ getToolByName: () => declarativeTool,
1374
+ getFunctionDeclarations: () => [],
1375
+ tools: new Map(),
1376
+ discovery: {},
1377
+ registerTool: () => { },
1378
+ getToolByDisplayName: () => declarativeTool,
1379
+ getTools: () => [],
1380
+ discoverTools: async () => { },
1381
+ getAllTools: () => [],
1382
+ getToolsByServer: () => [],
1383
+ };
1384
+ const onAllToolCallsComplete = vi.fn();
1385
+ const onToolCallsUpdate = vi.fn();
1386
+ const mockConfig = createMockConfig({
1387
+ getToolRegistry: () => mockToolRegistry,
1388
+ getApprovalMode: () => ApprovalMode.YOLO,
1389
+ isInteractive: () => false,
1390
+ });
1391
+ const scheduler = new CoreToolScheduler({
1392
+ config: mockConfig,
1393
+ onAllToolCallsComplete,
1394
+ onToolCallsUpdate,
1395
+ getPreferredEditor: () => 'vscode',
1396
+ });
1397
+ const requests = [
1398
+ {
1399
+ callId: '1',
1400
+ name: 'mockTool',
1401
+ args: { call: 1 },
1402
+ isClientInitiated: false,
1403
+ prompt_id: 'prompt-1',
1404
+ },
1405
+ {
1406
+ callId: '2',
1407
+ name: 'mockTool',
1408
+ args: { call: 2 },
1409
+ isClientInitiated: false,
1410
+ prompt_id: 'prompt-1',
1411
+ },
1412
+ {
1413
+ callId: '3',
1414
+ name: 'mockTool',
1415
+ args: { call: 3 },
1416
+ isClientInitiated: false,
1417
+ prompt_id: 'prompt-1',
1418
+ },
1419
+ ];
1420
+ // Act
1421
+ const schedulePromise = scheduler.schedule(requests, abortController.signal);
1422
+ // Wait for the second call to start, then abort.
1423
+ await vi.waitFor(() => {
1424
+ expect(secondCallStarted).toBe(true);
1425
+ });
1426
+ abortController.abort();
1427
+ await schedulePromise;
1428
+ // Assert
1429
+ await vi.waitFor(() => {
1430
+ expect(onAllToolCallsComplete).toHaveBeenCalled();
1431
+ });
1432
+ // Check that execute was called for the first two tools only
1433
+ expect(executeFn).toHaveBeenCalledTimes(2);
1434
+ expect(executeFn).toHaveBeenCalledWith({ call: 1 });
1435
+ expect(executeFn).toHaveBeenCalledWith({ call: 2 });
1436
+ const completedCalls = onAllToolCallsComplete.mock
1437
+ .calls[0][0];
1438
+ expect(completedCalls).toHaveLength(3);
1439
+ const call1 = completedCalls.find((c) => c.request.callId === '1');
1440
+ const call2 = completedCalls.find((c) => c.request.callId === '2');
1441
+ const call3 = completedCalls.find((c) => c.request.callId === '3');
1442
+ expect(call1?.status).toBe('success');
1443
+ expect(call2?.status).toBe('cancelled');
1444
+ expect(call3?.status).toBe('cancelled');
1445
+ });
1446
+ it('should pass confirmation diff data into modifyWithEditor overrides', async () => {
1447
+ const modifyWithEditorSpy = vi
1448
+ .spyOn(modifiableToolModule, 'modifyWithEditor')
1449
+ .mockResolvedValue({
1450
+ updatedParams: { param: 'updated' },
1451
+ updatedDiff: 'updated diff',
1452
+ });
1453
+ const mockModifiableTool = new MockModifiableTool('mockModifiableTool');
1454
+ const mockToolRegistry = {
1455
+ getTool: () => mockModifiableTool,
1456
+ getToolByName: () => mockModifiableTool,
1457
+ getFunctionDeclarations: () => [],
1458
+ tools: new Map(),
1459
+ discovery: {},
1460
+ registerTool: () => { },
1461
+ getToolByDisplayName: () => mockModifiableTool,
1462
+ getTools: () => [],
1463
+ discoverTools: async () => { },
1464
+ getAllTools: () => [],
1465
+ getToolsByServer: () => [],
1466
+ };
1467
+ const onAllToolCallsComplete = vi.fn();
1468
+ const onToolCallsUpdate = vi.fn();
1469
+ const mockConfig = createMockConfig({
1470
+ getToolRegistry: () => mockToolRegistry,
1471
+ });
1472
+ const scheduler = new CoreToolScheduler({
1473
+ config: mockConfig,
1474
+ onAllToolCallsComplete,
1475
+ onToolCallsUpdate,
1476
+ getPreferredEditor: () => 'vscode',
1477
+ });
1478
+ const abortController = new AbortController();
1479
+ await scheduler.schedule([
1480
+ {
1481
+ callId: '1',
1482
+ name: 'mockModifiableTool',
1483
+ args: {},
1484
+ isClientInitiated: false,
1485
+ prompt_id: 'prompt-1',
1486
+ },
1487
+ ], abortController.signal);
1488
+ const toolCall = scheduler
1489
+ .toolCalls[0];
1490
+ expect(toolCall.status).toBe('awaiting_approval');
1491
+ const confirmationSignal = new AbortController().signal;
1492
+ await scheduler.handleConfirmationResponse(toolCall.request.callId, async () => { }, ToolConfirmationOutcome.ModifyWithEditor, confirmationSignal);
1493
+ expect(modifyWithEditorSpy).toHaveBeenCalled();
1494
+ const overrides = modifyWithEditorSpy.mock.calls[modifyWithEditorSpy.mock.calls.length - 1][4];
1495
+ expect(overrides).toEqual({
1496
+ currentContent: 'originalContent',
1497
+ proposedContent: 'newContent',
1498
+ });
1499
+ modifyWithEditorSpy.mockRestore();
1500
+ });
1501
+ });
1146
1502
  describe('truncateAndSaveToFile', () => {
1147
1503
  const mockWriteFile = vi.mocked(fs.writeFile);
1148
1504
  const THRESHOLD = 40_000;