@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
@@ -5,28 +5,30 @@
5
5
  */
6
6
  import { reportError } from '../utils/errorReporting.js';
7
7
  import { GeminiChat, StreamEventType } from '../core/geminiChat.js';
8
+ import { Type } from '@google/genai';
8
9
  import { executeToolCall } from '../core/nonInteractiveToolExecutor.js';
9
10
  import { ToolRegistry } from '../tools/tool-registry.js';
11
+ import { CompressionStatus } from '../core/turn.js';
12
+ import { ChatCompressionService } from '../services/chatCompressionService.js';
10
13
  import { getDirectoryContextString } from '../utils/environmentContext.js';
11
- import { GlobTool } from '../tools/glob.js';
12
- import { GrepTool } from '../tools/grep.js';
13
- import { RipGrepTool } from '../tools/ripGrep.js';
14
- import { LSTool } from '../tools/ls.js';
15
- import { MemoryTool } from '../tools/memoryTool.js';
16
- import { ReadFileTool } from '../tools/read-file.js';
17
- import { ReadManyFilesTool } from '../tools/read-many-files.js';
18
- import { WebSearchTool } from '../tools/web-search.js';
14
+ import { GLOB_TOOL_NAME, GREP_TOOL_NAME, LS_TOOL_NAME, MEMORY_TOOL_NAME, READ_FILE_TOOL_NAME, READ_MANY_FILES_TOOL_NAME, WEB_SEARCH_TOOL_NAME, } from '../tools/tool-names.js';
15
+ import { promptIdContext } from '../utils/promptIdContext.js';
16
+ import { logAgentStart, logAgentFinish, logRecoveryAttempt, } from '../telemetry/loggers.js';
17
+ import { AgentStartEvent, AgentFinishEvent, RecoveryAttemptEvent, } from '../telemetry/types.js';
19
18
  import { AgentTerminateMode } from './types.js';
20
19
  import { templateString } from './utils.js';
21
20
  import { parseThought } from '../utils/thoughtUtils.js';
21
+ import {} from 'zod';
22
+ import { zodToJsonSchema } from 'zod-to-json-schema';
23
+ import { debugLogger } from '../utils/debugLogger.js';
24
+ import { getModelConfigAlias } from './registry.js';
25
+ const TASK_COMPLETE_TOOL_NAME = 'complete_task';
26
+ const GRACE_PERIOD_MS = 60 * 1000; // 1 min
22
27
  /**
23
28
  * Executes an agent loop based on an {@link AgentDefinition}.
24
29
  *
25
- * This executor uses a simplified two-phase approach:
26
- * 1. **Work Phase:** The agent runs in a loop, calling tools until it has
27
- * gathered all necessary information to fulfill its goal.
28
- * 2. **Extraction Phase:** A final prompt is sent to the model to summarize
29
- * the work and extract the final result in the desired format.
30
+ * This executor runs the agent in a loop, calling tools until it calls the
31
+ * mandatory `complete_task` tool to signal completion.
30
32
  */
31
33
  export class AgentExecutor {
32
34
  definition;
@@ -34,6 +36,8 @@ export class AgentExecutor {
34
36
  toolRegistry;
35
37
  runtimeContext;
36
38
  onActivity;
39
+ compressionService;
40
+ hasFailedCompressionAttempt = false;
37
41
  /**
38
42
  * Creates and validates a new `AgentExecutor` instance.
39
43
  *
@@ -67,11 +71,14 @@ export class AgentExecutor {
67
71
  // Note: Raw `FunctionDeclaration` objects in the config don't need to be
68
72
  // registered; their schemas are passed directly to the model later.
69
73
  }
74
+ agentToolRegistry.sortTools();
70
75
  // Validate that all registered tools are safe for non-interactive
71
76
  // execution.
72
77
  await AgentExecutor.validateTools(agentToolRegistry, definition.name);
73
78
  }
74
- return new AgentExecutor(definition, runtimeContext, agentToolRegistry, onActivity);
79
+ // Get the parent prompt ID from context
80
+ const parentPromptId = promptIdContext.getStore();
81
+ return new AgentExecutor(definition, runtimeContext, agentToolRegistry, parentPromptId, onActivity);
75
82
  }
76
83
  /**
77
84
  * Constructs a new AgentExecutor instance.
@@ -79,13 +86,141 @@ export class AgentExecutor {
79
86
  * @private This constructor is private. Use the static `create` method to
80
87
  * instantiate the class.
81
88
  */
82
- constructor(definition, runtimeContext, toolRegistry, onActivity) {
89
+ constructor(definition, runtimeContext, toolRegistry, parentPromptId, onActivity) {
83
90
  this.definition = definition;
84
91
  this.runtimeContext = runtimeContext;
85
92
  this.toolRegistry = toolRegistry;
86
93
  this.onActivity = onActivity;
94
+ this.compressionService = new ChatCompressionService();
87
95
  const randomIdPart = Math.random().toString(36).slice(2, 8);
88
- this.agentId = `${this.definition.name}-${randomIdPart}`;
96
+ // parentPromptId will be undefined if this agent is invoked directly
97
+ // (top-level), rather than as a sub-agent.
98
+ const parentPrefix = parentPromptId ? `${parentPromptId}-` : '';
99
+ this.agentId = `${parentPrefix}${this.definition.name}-${randomIdPart}`;
100
+ }
101
+ /**
102
+ * Executes a single turn of the agent's logic, from calling the model
103
+ * to processing its response.
104
+ *
105
+ * @returns An {@link AgentTurnResult} object indicating whether to continue
106
+ * or stop the agent loop.
107
+ */
108
+ async executeTurn(chat, currentMessage, tools, turnCounter, combinedSignal, timeoutSignal) {
109
+ const promptId = `${this.agentId}#${turnCounter}`;
110
+ await this.tryCompressChat(chat, promptId);
111
+ const { functionCalls } = await promptIdContext.run(promptId, async () => this.callModel(chat, currentMessage, tools, combinedSignal, promptId));
112
+ if (combinedSignal.aborted) {
113
+ const terminateReason = timeoutSignal.aborted
114
+ ? AgentTerminateMode.TIMEOUT
115
+ : AgentTerminateMode.ABORTED;
116
+ return {
117
+ status: 'stop',
118
+ terminateReason,
119
+ finalResult: null, // 'run' method will set the final timeout string
120
+ };
121
+ }
122
+ // If the model stops calling tools without calling complete_task, it's an error.
123
+ if (functionCalls.length === 0) {
124
+ this.emitActivity('ERROR', {
125
+ error: `Agent stopped calling tools but did not call '${TASK_COMPLETE_TOOL_NAME}' to finalize the session.`,
126
+ context: 'protocol_violation',
127
+ });
128
+ return {
129
+ status: 'stop',
130
+ terminateReason: AgentTerminateMode.ERROR_NO_COMPLETE_TASK_CALL,
131
+ finalResult: null,
132
+ };
133
+ }
134
+ const { nextMessage, submittedOutput, taskCompleted } = await this.processFunctionCalls(functionCalls, combinedSignal, promptId);
135
+ if (taskCompleted) {
136
+ const finalResult = submittedOutput ?? 'Task completed successfully.';
137
+ return {
138
+ status: 'stop',
139
+ terminateReason: AgentTerminateMode.GOAL,
140
+ finalResult,
141
+ };
142
+ }
143
+ // Task is not complete, continue to the next turn.
144
+ return {
145
+ status: 'continue',
146
+ nextMessage,
147
+ };
148
+ }
149
+ /**
150
+ * Generates a specific warning message for the agent's final turn.
151
+ */
152
+ getFinalWarningMessage(reason) {
153
+ let explanation = '';
154
+ switch (reason) {
155
+ case AgentTerminateMode.TIMEOUT:
156
+ explanation = 'You have exceeded the time limit.';
157
+ break;
158
+ case AgentTerminateMode.MAX_TURNS:
159
+ explanation = 'You have exceeded the maximum number of turns.';
160
+ break;
161
+ case AgentTerminateMode.ERROR_NO_COMPLETE_TASK_CALL:
162
+ explanation = 'You have stopped calling tools without finishing.';
163
+ break;
164
+ default:
165
+ throw new Error(`Unknown terminate reason: ${reason}`);
166
+ }
167
+ return `${explanation} You have one final chance to complete the task with a short grace period. You MUST call \`${TASK_COMPLETE_TOOL_NAME}\` immediately with your best answer and explain that your investigation was interrupted. Do not call any other tools.`;
168
+ }
169
+ /**
170
+ * Attempts a single, final recovery turn if the agent stops for a recoverable reason.
171
+ * Gives the agent a grace period to call `complete_task`.
172
+ *
173
+ * @returns The final result string if recovery was successful, or `null` if it failed.
174
+ */
175
+ async executeFinalWarningTurn(chat, tools, turnCounter, reason, externalSignal) {
176
+ this.emitActivity('THOUGHT_CHUNK', {
177
+ text: `Execution limit reached (${reason}). Attempting one final recovery turn with a grace period.`,
178
+ });
179
+ const recoveryStartTime = Date.now();
180
+ let success = false;
181
+ const gracePeriodMs = GRACE_PERIOD_MS;
182
+ const graceTimeoutController = new AbortController();
183
+ const graceTimeoutId = setTimeout(() => graceTimeoutController.abort(new Error('Grace period timed out.')), gracePeriodMs);
184
+ try {
185
+ const recoveryMessage = {
186
+ role: 'user',
187
+ parts: [{ text: this.getFinalWarningMessage(reason) }],
188
+ };
189
+ // We monitor both the external signal and our new grace period timeout
190
+ const combinedSignal = AbortSignal.any([
191
+ externalSignal,
192
+ graceTimeoutController.signal,
193
+ ]);
194
+ const turnResult = await this.executeTurn(chat, recoveryMessage, tools, turnCounter, // This will be the "last" turn number
195
+ combinedSignal, graceTimeoutController.signal);
196
+ if (turnResult.status === 'stop' &&
197
+ turnResult.terminateReason === AgentTerminateMode.GOAL) {
198
+ // Success!
199
+ this.emitActivity('THOUGHT_CHUNK', {
200
+ text: 'Graceful recovery succeeded.',
201
+ });
202
+ success = true;
203
+ return turnResult.finalResult ?? 'Task completed during grace period.';
204
+ }
205
+ // Any other outcome (continue, error, non-GOAL stop) is a failure.
206
+ this.emitActivity('ERROR', {
207
+ error: `Graceful recovery attempt failed. Reason: ${turnResult.status}`,
208
+ context: 'recovery_turn',
209
+ });
210
+ return null;
211
+ }
212
+ catch (error) {
213
+ // This catch block will likely catch the 'Grace period timed out' error.
214
+ this.emitActivity('ERROR', {
215
+ error: `Graceful recovery attempt failed: ${String(error)}`,
216
+ context: 'recovery_turn',
217
+ });
218
+ return null;
219
+ }
220
+ finally {
221
+ clearTimeout(graceTimeoutId);
222
+ logRecoveryAttempt(this.runtimeContext, new RecoveryAttemptEvent(this.agentId, this.definition.name, reason, Date.now() - recoveryStartTime, success, turnCounter));
223
+ }
89
224
  }
90
225
  /**
91
226
  * Runs the agent.
@@ -97,64 +232,156 @@ export class AgentExecutor {
97
232
  async run(inputs, signal) {
98
233
  const startTime = Date.now();
99
234
  let turnCounter = 0;
235
+ let terminateReason = AgentTerminateMode.ERROR;
236
+ let finalResult = null;
237
+ const { max_time_minutes } = this.definition.runConfig;
238
+ const timeoutController = new AbortController();
239
+ const timeoutId = setTimeout(() => timeoutController.abort(new Error('Agent timed out.')), max_time_minutes * 60 * 1000);
240
+ // Combine the external signal with the internal timeout signal.
241
+ const combinedSignal = AbortSignal.any([signal, timeoutController.signal]);
242
+ logAgentStart(this.runtimeContext, new AgentStartEvent(this.agentId, this.definition.name));
243
+ let chat;
244
+ let tools;
100
245
  try {
101
- const chat = await this.createChatObject(inputs);
102
- const tools = this.prepareToolsList();
103
- let terminateReason = AgentTerminateMode.GOAL;
104
- // Phase 1: Work Phase
105
- // The agent works in a loop until it stops calling tools.
106
- let currentMessages = [
107
- { role: 'user', parts: [{ text: 'Get Started!' }] },
108
- ];
246
+ chat = await this.createChatObject(inputs);
247
+ tools = this.prepareToolsList();
248
+ const query = this.definition.promptConfig.query
249
+ ? templateString(this.definition.promptConfig.query, inputs)
250
+ : 'Get Started!';
251
+ let currentMessage = { role: 'user', parts: [{ text: query }] };
109
252
  while (true) {
110
- // Check for termination conditions like max turns or timeout.
253
+ // Check for termination conditions like max turns.
111
254
  const reason = this.checkTermination(startTime, turnCounter);
112
255
  if (reason) {
113
256
  terminateReason = reason;
114
257
  break;
115
258
  }
116
- if (signal.aborted) {
117
- terminateReason = AgentTerminateMode.ABORTED;
259
+ // Check for timeout or external abort.
260
+ if (combinedSignal.aborted) {
261
+ // Determine which signal caused the abort.
262
+ terminateReason = timeoutController.signal.aborted
263
+ ? AgentTerminateMode.TIMEOUT
264
+ : AgentTerminateMode.ABORTED;
118
265
  break;
119
266
  }
120
- // Call model
121
- const promptId = `${this.runtimeContext.getSessionId()}#${this.agentId}#${turnCounter++}`;
122
- const { functionCalls } = await this.callModel(chat, currentMessages, tools, signal, promptId);
123
- if (signal.aborted) {
124
- terminateReason = AgentTerminateMode.ABORTED;
125
- break;
267
+ const turnResult = await this.executeTurn(chat, currentMessage, tools, turnCounter++, combinedSignal, timeoutController.signal);
268
+ if (turnResult.status === 'stop') {
269
+ terminateReason = turnResult.terminateReason;
270
+ // Only set finalResult if the turn provided one (e.g., error or goal).
271
+ if (turnResult.finalResult) {
272
+ finalResult = turnResult.finalResult;
273
+ }
274
+ break; // Exit the loop for *any* stop reason.
126
275
  }
127
- // If the model stops calling tools, the work phase is complete.
128
- if (functionCalls.length === 0) {
129
- break;
276
+ // If status is 'continue', update message for the next loop
277
+ currentMessage = turnResult.nextMessage;
278
+ }
279
+ // === UNIFIED RECOVERY BLOCK ===
280
+ // Only attempt recovery if it's a known recoverable reason.
281
+ // We don't recover from GOAL (already done) or ABORTED (user cancelled).
282
+ if (terminateReason !== AgentTerminateMode.ERROR &&
283
+ terminateReason !== AgentTerminateMode.ABORTED &&
284
+ terminateReason !== AgentTerminateMode.GOAL) {
285
+ const recoveryResult = await this.executeFinalWarningTurn(chat, tools, turnCounter, // Use current turnCounter for the recovery attempt
286
+ terminateReason, signal);
287
+ if (recoveryResult !== null) {
288
+ // Recovery Succeeded
289
+ terminateReason = AgentTerminateMode.GOAL;
290
+ finalResult = recoveryResult;
291
+ }
292
+ else {
293
+ // Recovery Failed. Set the final error message based on the *original* reason.
294
+ if (terminateReason === AgentTerminateMode.TIMEOUT) {
295
+ finalResult = `Agent timed out after ${this.definition.runConfig.max_time_minutes} minutes.`;
296
+ this.emitActivity('ERROR', {
297
+ error: finalResult,
298
+ context: 'timeout',
299
+ });
300
+ }
301
+ else if (terminateReason === AgentTerminateMode.MAX_TURNS) {
302
+ finalResult = `Agent reached max turns limit (${this.definition.runConfig.max_turns}).`;
303
+ this.emitActivity('ERROR', {
304
+ error: finalResult,
305
+ context: 'max_turns',
306
+ });
307
+ }
308
+ else if (terminateReason === AgentTerminateMode.ERROR_NO_COMPLETE_TASK_CALL) {
309
+ // The finalResult was already set by executeTurn, but we re-emit just in case.
310
+ finalResult =
311
+ finalResult ||
312
+ `Agent stopped calling tools but did not call '${TASK_COMPLETE_TOOL_NAME}'.`;
313
+ this.emitActivity('ERROR', {
314
+ error: finalResult,
315
+ context: 'protocol_violation',
316
+ });
317
+ }
130
318
  }
131
- currentMessages = await this.processFunctionCalls(functionCalls, signal, promptId);
132
319
  }
133
- // If the work phase was terminated early, skip extraction and return.
134
- if (terminateReason !== AgentTerminateMode.GOAL) {
320
+ // === FINAL RETURN LOGIC ===
321
+ if (terminateReason === AgentTerminateMode.GOAL) {
135
322
  return {
136
- result: 'Agent execution was terminated before completion.',
323
+ result: finalResult || 'Task completed.',
137
324
  terminate_reason: terminateReason,
138
325
  };
139
326
  }
140
- // Phase 2: Extraction Phase
141
- // A final message is sent to summarize findings and produce the output.
142
- const extractionMessage = this.buildExtractionMessage();
143
- const extractionMessages = [
144
- { role: 'user', parts: [{ text: extractionMessage }] },
145
- ];
146
- const extractionPromptId = `${this.runtimeContext.getSessionId()}#${this.agentId}#extraction`;
147
- // TODO: Consider if we should keep tools to avoid cache reset.
148
- const { textResponse } = await this.callModel(chat, extractionMessages, [], // No tools are available in the extraction phase.
149
- signal, extractionPromptId);
150
327
  return {
151
- result: textResponse || 'No response generated',
328
+ result: finalResult || 'Agent execution was terminated before completion.',
152
329
  terminate_reason: terminateReason,
153
330
  };
154
331
  }
155
332
  catch (error) {
333
+ // Check if the error is an AbortError caused by our internal timeout.
334
+ if (error instanceof Error &&
335
+ error.name === 'AbortError' &&
336
+ timeoutController.signal.aborted &&
337
+ !signal.aborted // Ensure the external signal was not the cause
338
+ ) {
339
+ terminateReason = AgentTerminateMode.TIMEOUT;
340
+ // Also use the unified recovery logic here
341
+ if (chat && tools) {
342
+ const recoveryResult = await this.executeFinalWarningTurn(chat, tools, turnCounter, // Use current turnCounter
343
+ AgentTerminateMode.TIMEOUT, signal);
344
+ if (recoveryResult !== null) {
345
+ // Recovery Succeeded
346
+ terminateReason = AgentTerminateMode.GOAL;
347
+ finalResult = recoveryResult;
348
+ return {
349
+ result: finalResult,
350
+ terminate_reason: terminateReason,
351
+ };
352
+ }
353
+ }
354
+ // Recovery failed or wasn't possible
355
+ finalResult = `Agent timed out after ${this.definition.runConfig.max_time_minutes} minutes.`;
356
+ this.emitActivity('ERROR', {
357
+ error: finalResult,
358
+ context: 'timeout',
359
+ });
360
+ return {
361
+ result: finalResult,
362
+ terminate_reason: terminateReason,
363
+ };
364
+ }
156
365
  this.emitActivity('ERROR', { error: String(error) });
157
- throw error; // Re-throw the error for the parent context to handle.
366
+ throw error; // Re-throw other errors or external aborts.
367
+ }
368
+ finally {
369
+ clearTimeout(timeoutId);
370
+ logAgentFinish(this.runtimeContext, new AgentFinishEvent(this.agentId, this.definition.name, Date.now() - startTime, turnCounter, terminateReason));
371
+ }
372
+ }
373
+ async tryCompressChat(chat, prompt_id) {
374
+ const model = this.definition.modelConfig.model;
375
+ const { newHistory, info } = await this.compressionService.compress(chat, prompt_id, false, model, this.runtimeContext, this.hasFailedCompressionAttempt);
376
+ if (info.compressionStatus ===
377
+ CompressionStatus.COMPRESSION_FAILED_INFLATED_TOKEN_COUNT) {
378
+ this.hasFailedCompressionAttempt = true;
379
+ }
380
+ else if (info.compressionStatus === CompressionStatus.COMPRESSED) {
381
+ if (newHistory) {
382
+ chat.setHistory(newHistory);
383
+ this.hasFailedCompressionAttempt = false;
384
+ }
158
385
  }
159
386
  }
160
387
  /**
@@ -162,15 +389,15 @@ export class AgentExecutor {
162
389
  *
163
390
  * @returns The model's response, including any tool calls or text.
164
391
  */
165
- async callModel(chat, messages, tools, signal, promptId) {
166
- const messageParams = {
167
- message: messages[0]?.parts || [],
168
- config: {
169
- abortSignal: signal,
170
- tools: tools.length > 0 ? [{ functionDeclarations: tools }] : undefined,
171
- },
172
- };
173
- const responseStream = await chat.sendMessageStream(this.definition.modelConfig.model, messageParams, promptId);
392
+ async callModel(chat, message, tools, signal, promptId) {
393
+ if (tools.length > 0) {
394
+ // TODO(12622): Move tools back to config.
395
+ chat.setTools([{ functionDeclarations: tools }]);
396
+ }
397
+ const responseStream = await chat.sendMessageStream({
398
+ model: getModelConfigAlias(this.definition),
399
+ overrideScope: this.definition.name,
400
+ }, message.parts || [], promptId, signal);
174
401
  const functionCalls = [];
175
402
  let textResponse = '';
176
403
  for await (const resp of responseStream) {
@@ -202,28 +429,18 @@ export class AgentExecutor {
202
429
  }
203
430
  /** Initializes a `GeminiChat` instance for the agent run. */
204
431
  async createChatObject(inputs) {
205
- const { promptConfig, modelConfig } = this.definition;
432
+ const { promptConfig } = this.definition;
206
433
  if (!promptConfig.systemPrompt && !promptConfig.initialMessages) {
207
434
  throw new Error('PromptConfig must define either `systemPrompt` or `initialMessages`.');
208
435
  }
209
- const startHistory = [...(promptConfig.initialMessages ?? [])];
436
+ const startHistory = this.applyTemplateToInitialMessages(promptConfig.initialMessages ?? [], inputs);
210
437
  // Build system instruction from the templated prompt string.
211
438
  const systemInstruction = promptConfig.systemPrompt
212
439
  ? await this.buildSystemPrompt(inputs)
213
440
  : undefined;
214
441
  try {
215
- const generationConfig = {
216
- temperature: modelConfig.temp,
217
- topP: modelConfig.top_p,
218
- thinkingConfig: {
219
- includeThoughts: true,
220
- thinkingBudget: modelConfig.thinkingBudget ?? -1,
221
- },
222
- };
223
- if (systemInstruction) {
224
- generationConfig.systemInstruction = systemInstruction;
225
- }
226
- return new GeminiChat(this.runtimeContext, generationConfig, startHistory);
442
+ return new GeminiChat(this.runtimeContext, systemInstruction, [], // set in `callModel`,
443
+ startHistory);
227
444
  }
228
445
  catch (error) {
229
446
  await reportError(error, `Error initializing Gemini chat for agent ${this.definition.name}.`, startHistory, 'startChat');
@@ -234,68 +451,199 @@ export class AgentExecutor {
234
451
  /**
235
452
  * Executes function calls requested by the model and returns the results.
236
453
  *
237
- * @returns A new `Content` object to be added to the chat history.
454
+ * @returns A new `Content` object for history, any submitted output, and completion status.
238
455
  */
239
456
  async processFunctionCalls(functionCalls, signal, promptId) {
240
457
  const allowedToolNames = new Set(this.toolRegistry.getAllToolNames());
241
- // Filter out any tool calls that are not in the agent's allowed list.
242
- const validatedFunctionCalls = functionCalls.filter((call) => {
243
- if (!allowedToolNames.has(call.name)) {
244
- console.warn(`[AgentExecutor] Agent '${this.definition.name}' attempted to call ` +
245
- `unauthorized tool '${call.name}'. This call has been blocked.`);
246
- return false;
247
- }
248
- return true;
249
- });
250
- const toolPromises = validatedFunctionCalls.map(async (functionCall) => {
251
- const callId = functionCall.id ?? `${functionCall.name}-${Date.now()}`;
252
- const args = functionCall.args ?? {};
458
+ // Always allow the completion tool
459
+ allowedToolNames.add(TASK_COMPLETE_TOOL_NAME);
460
+ let submittedOutput = null;
461
+ let taskCompleted = false;
462
+ // We'll collect promises for the tool executions
463
+ const toolExecutionPromises = [];
464
+ // And we'll need a place to store the synchronous results (like complete_task or blocked calls)
465
+ const syncResponseParts = [];
466
+ for (const [index, functionCall] of functionCalls.entries()) {
467
+ const callId = functionCall.id ?? `${promptId}-${index}`;
468
+ const args = (functionCall.args ?? {});
253
469
  this.emitActivity('TOOL_CALL_START', {
254
470
  name: functionCall.name,
255
471
  args,
256
472
  });
473
+ if (functionCall.name === TASK_COMPLETE_TOOL_NAME) {
474
+ if (taskCompleted) {
475
+ // We already have a completion from this turn. Ignore subsequent ones.
476
+ const error = 'Task already marked complete in this turn. Ignoring duplicate call.';
477
+ syncResponseParts.push({
478
+ functionResponse: {
479
+ name: TASK_COMPLETE_TOOL_NAME,
480
+ response: { error },
481
+ id: callId,
482
+ },
483
+ });
484
+ this.emitActivity('ERROR', {
485
+ context: 'tool_call',
486
+ name: functionCall.name,
487
+ error,
488
+ });
489
+ continue;
490
+ }
491
+ const { outputConfig } = this.definition;
492
+ taskCompleted = true; // Signal completion regardless of output presence
493
+ if (outputConfig) {
494
+ const outputName = outputConfig.outputName;
495
+ if (args[outputName] !== undefined) {
496
+ const outputValue = args[outputName];
497
+ const validationResult = outputConfig.schema.safeParse(outputValue);
498
+ if (!validationResult.success) {
499
+ taskCompleted = false; // Validation failed, revoke completion
500
+ const error = `Output validation failed: ${JSON.stringify(validationResult.error.flatten())}`;
501
+ syncResponseParts.push({
502
+ functionResponse: {
503
+ name: TASK_COMPLETE_TOOL_NAME,
504
+ response: { error },
505
+ id: callId,
506
+ },
507
+ });
508
+ this.emitActivity('ERROR', {
509
+ context: 'tool_call',
510
+ name: functionCall.name,
511
+ error,
512
+ });
513
+ continue;
514
+ }
515
+ const validatedOutput = validationResult.data;
516
+ if (this.definition.processOutput) {
517
+ submittedOutput = this.definition.processOutput(validatedOutput);
518
+ }
519
+ else {
520
+ submittedOutput =
521
+ typeof outputValue === 'string'
522
+ ? outputValue
523
+ : JSON.stringify(outputValue, null, 2);
524
+ }
525
+ syncResponseParts.push({
526
+ functionResponse: {
527
+ name: TASK_COMPLETE_TOOL_NAME,
528
+ response: { result: 'Output submitted and task completed.' },
529
+ id: callId,
530
+ },
531
+ });
532
+ this.emitActivity('TOOL_CALL_END', {
533
+ name: functionCall.name,
534
+ output: 'Output submitted and task completed.',
535
+ });
536
+ }
537
+ else {
538
+ // Failed to provide required output.
539
+ taskCompleted = false; // Revoke completion status
540
+ const error = `Missing required argument '${outputName}' for completion.`;
541
+ syncResponseParts.push({
542
+ functionResponse: {
543
+ name: TASK_COMPLETE_TOOL_NAME,
544
+ response: { error },
545
+ id: callId,
546
+ },
547
+ });
548
+ this.emitActivity('ERROR', {
549
+ context: 'tool_call',
550
+ name: functionCall.name,
551
+ error,
552
+ });
553
+ }
554
+ }
555
+ else {
556
+ // No output expected. Just signal completion.
557
+ submittedOutput = 'Task completed successfully.';
558
+ syncResponseParts.push({
559
+ functionResponse: {
560
+ name: TASK_COMPLETE_TOOL_NAME,
561
+ response: { status: 'Task marked complete.' },
562
+ id: callId,
563
+ },
564
+ });
565
+ this.emitActivity('TOOL_CALL_END', {
566
+ name: functionCall.name,
567
+ output: 'Task marked complete.',
568
+ });
569
+ }
570
+ continue;
571
+ }
572
+ // Handle standard tools
573
+ if (!allowedToolNames.has(functionCall.name)) {
574
+ const error = `Unauthorized tool call: '${functionCall.name}' is not available to this agent.`;
575
+ debugLogger.warn(`[AgentExecutor] Blocked call: ${error}`);
576
+ syncResponseParts.push({
577
+ functionResponse: {
578
+ name: functionCall.name,
579
+ id: callId,
580
+ response: { error },
581
+ },
582
+ });
583
+ this.emitActivity('ERROR', {
584
+ context: 'tool_call_unauthorized',
585
+ name: functionCall.name,
586
+ callId,
587
+ error,
588
+ });
589
+ continue;
590
+ }
257
591
  const requestInfo = {
258
592
  callId,
259
593
  name: functionCall.name,
260
- args: args,
594
+ args,
261
595
  isClientInitiated: true,
262
596
  prompt_id: promptId,
263
597
  };
264
- const toolResponse = await executeToolCall(this.runtimeContext, requestInfo, signal);
265
- if (toolResponse.error) {
266
- this.emitActivity('ERROR', {
267
- context: 'tool_call',
268
- name: functionCall.name,
269
- error: toolResponse.error.message,
270
- });
271
- }
272
- else {
273
- this.emitActivity('TOOL_CALL_END', {
274
- name: functionCall.name,
275
- output: toolResponse.resultDisplay,
276
- });
598
+ // Create a promise for the tool execution
599
+ const executionPromise = (async () => {
600
+ const { response: toolResponse } = await executeToolCall(this.runtimeContext, requestInfo, signal);
601
+ if (toolResponse.error) {
602
+ this.emitActivity('ERROR', {
603
+ context: 'tool_call',
604
+ name: functionCall.name,
605
+ error: toolResponse.error.message,
606
+ });
607
+ }
608
+ else {
609
+ this.emitActivity('TOOL_CALL_END', {
610
+ name: functionCall.name,
611
+ output: toolResponse.resultDisplay,
612
+ });
613
+ }
614
+ return toolResponse.responseParts;
615
+ })();
616
+ toolExecutionPromises.push(executionPromise);
617
+ }
618
+ // Wait for all tool executions to complete
619
+ const asyncResults = await Promise.all(toolExecutionPromises);
620
+ // Combine all response parts
621
+ const toolResponseParts = [...syncResponseParts];
622
+ for (const result of asyncResults) {
623
+ if (result) {
624
+ toolResponseParts.push(...result);
277
625
  }
278
- return toolResponse;
279
- });
280
- const toolResponses = await Promise.all(toolPromises);
281
- const toolResponseParts = toolResponses
282
- .flatMap((response) => response.responseParts)
283
- .filter((part) => part !== undefined);
284
- // If all authorized tool calls failed, provide a generic error message
285
- // to the model so it can try a different approach.
286
- if (functionCalls.length > 0 && toolResponseParts.length === 0) {
626
+ }
627
+ // If all authorized tool calls failed (and task isn't complete), provide a generic error.
628
+ if (functionCalls.length > 0 &&
629
+ toolResponseParts.length === 0 &&
630
+ !taskCompleted) {
287
631
  toolResponseParts.push({
288
- text: 'All tool calls failed. Please analyze the errors and try an alternative approach.',
632
+ text: 'All tool calls failed or were unauthorized. Please analyze the errors and try an alternative approach.',
289
633
  });
290
634
  }
291
- return [{ role: 'user', parts: toolResponseParts }];
635
+ return {
636
+ nextMessage: { role: 'user', parts: toolResponseParts },
637
+ submittedOutput,
638
+ taskCompleted,
639
+ };
292
640
  }
293
641
  /**
294
642
  * Prepares the list of tool function declarations to be sent to the model.
295
643
  */
296
644
  prepareToolsList() {
297
645
  const toolsList = [];
298
- const { toolConfig } = this.definition;
646
+ const { toolConfig, outputConfig } = this.definition;
299
647
  if (toolConfig) {
300
648
  const toolNamesToLoad = [];
301
649
  for (const toolRef of toolConfig.tools) {
@@ -314,11 +662,32 @@ export class AgentExecutor {
314
662
  // Add schemas from tools that were registered by name.
315
663
  toolsList.push(...this.toolRegistry.getFunctionDeclarationsFiltered(toolNamesToLoad));
316
664
  }
665
+ // Always inject complete_task.
666
+ // Configure its schema based on whether output is expected.
667
+ const completeTool = {
668
+ name: TASK_COMPLETE_TOOL_NAME,
669
+ description: outputConfig
670
+ ? 'Call this tool to submit your final answer and complete the task. This is the ONLY way to finish.'
671
+ : 'Call this tool to signal that you have completed your task. This is the ONLY way to finish.',
672
+ parameters: {
673
+ type: Type.OBJECT,
674
+ properties: {},
675
+ required: [],
676
+ },
677
+ };
678
+ if (outputConfig) {
679
+ const jsonSchema = zodToJsonSchema(outputConfig.schema);
680
+ const { $schema: _$schema, definitions: _definitions, ...schema } = jsonSchema;
681
+ completeTool.parameters.properties[outputConfig.outputName] =
682
+ schema;
683
+ completeTool.parameters.required.push(outputConfig.outputName);
684
+ }
685
+ toolsList.push(completeTool);
317
686
  return toolsList;
318
687
  }
319
688
  /** Builds the system prompt from the agent definition and inputs. */
320
689
  async buildSystemPrompt(inputs) {
321
- const { promptConfig, outputConfig } = this.definition;
690
+ const { promptConfig } = this.definition;
322
691
  if (!promptConfig.systemPrompt) {
323
692
  return '';
324
693
  }
@@ -327,37 +696,35 @@ export class AgentExecutor {
327
696
  // Append environment context (CWD and folder structure).
328
697
  const dirContext = await getDirectoryContextString(this.runtimeContext);
329
698
  finalPrompt += `\n\n# Environment Context\n${dirContext}`;
330
- // Append completion criteria to guide the model's output.
331
- if (outputConfig?.completion_criteria) {
332
- finalPrompt += '\n\nEnsure you complete the following:\n';
333
- for (const criteria of outputConfig.completion_criteria) {
334
- finalPrompt += `- ${criteria}\n`;
335
- }
336
- }
337
699
  // Append standard rules for non-interactive execution.
338
700
  finalPrompt += `
339
701
  Important Rules:
340
702
  * You are running in a non-interactive mode. You CANNOT ask the user for input or clarification.
341
703
  * Work systematically using available tools to complete your task.
342
- * Always use absolute paths for file operations. Construct them using the provided "Environment Context".
343
- * When you have completed your analysis and are ready to produce the final answer, stop calling tools.`;
704
+ * Always use absolute paths for file operations. Construct them using the provided "Environment Context".`;
705
+ finalPrompt += `
706
+ * When you have completed your task, you MUST call the \`${TASK_COMPLETE_TOOL_NAME}\` tool.
707
+ * Do not call any other tools in the same turn as \`${TASK_COMPLETE_TOOL_NAME}\`.
708
+ * This is the ONLY way to complete your mission. If you stop calling tools without calling this, you have failed.`;
344
709
  return finalPrompt;
345
710
  }
346
- /** Builds the final message for the extraction phase. */
347
- buildExtractionMessage() {
348
- const { outputConfig } = this.definition;
349
- if (outputConfig?.description) {
350
- let message = `Based on your work so far, provide: ${outputConfig.description}`;
351
- if (outputConfig.completion_criteria?.length) {
352
- message += `\n\nBe sure you have addressed:\n`;
353
- for (const criteria of outputConfig.completion_criteria) {
354
- message += `- ${criteria}\n`;
711
+ /**
712
+ * Applies template strings to initial messages.
713
+ *
714
+ * @param initialMessages The initial messages from the prompt config.
715
+ * @param inputs The validated input parameters for this invocation.
716
+ * @returns A new array of `Content` with templated strings.
717
+ */
718
+ applyTemplateToInitialMessages(initialMessages, inputs) {
719
+ return initialMessages.map((content) => {
720
+ const newParts = (content.parts ?? []).map((part) => {
721
+ if ('text' in part && part.text !== undefined) {
722
+ return { text: templateString(part.text, inputs) };
355
723
  }
356
- }
357
- return message;
358
- }
359
- // Fallback to a generic extraction message if no description is provided.
360
- return 'Based on your work so far, provide a comprehensive summary of your analysis and findings. Do not perform any more function calls.';
724
+ return part;
725
+ });
726
+ return { ...content, parts: newParts };
727
+ });
361
728
  }
362
729
  /**
363
730
  * Validates that all tools in a registry are safe for non-interactive use.
@@ -368,14 +735,13 @@ Important Rules:
368
735
  // Tools that are non-interactive. This is temporary until we have tool
369
736
  // confirmations for subagents.
370
737
  const allowlist = new Set([
371
- LSTool.Name,
372
- ReadFileTool.Name,
373
- GrepTool.Name,
374
- RipGrepTool.Name,
375
- GlobTool.Name,
376
- ReadManyFilesTool.Name,
377
- MemoryTool.Name,
378
- WebSearchTool.Name,
738
+ LS_TOOL_NAME,
739
+ READ_FILE_TOOL_NAME,
740
+ GREP_TOOL_NAME,
741
+ GLOB_TOOL_NAME,
742
+ READ_MANY_FILES_TOOL_NAME,
743
+ MEMORY_TOOL_NAME,
744
+ WEB_SEARCH_TOOL_NAME,
379
745
  ]);
380
746
  for (const tool of toolRegistry.getAllTools()) {
381
747
  if (!allowlist.has(tool.name)) {
@@ -395,10 +761,6 @@ Important Rules:
395
761
  if (runConfig.max_turns && turnCounter >= runConfig.max_turns) {
396
762
  return AgentTerminateMode.MAX_TURNS;
397
763
  }
398
- const elapsedMinutes = (Date.now() - startTime) / (1000 * 60);
399
- if (elapsedMinutes >= runConfig.max_time_minutes) {
400
- return AgentTerminateMode.TIMEOUT;
401
- }
402
764
  return null;
403
765
  }
404
766
  /** Emits an activity event to the configured callback. */