@machina.ai/cell-cli-core 1.20.2-rc1 → 1.25.0-rc1

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 (898) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +26 -0
  2. package/dist/docs/CHANGES.md +124 -0
  3. package/dist/docs/api-proxy.md +27 -0
  4. package/dist/docs/architecture.md +80 -0
  5. package/dist/docs/assets/connected_devtools.png +0 -0
  6. package/dist/docs/assets/gemini-screenshot.png +0 -0
  7. package/dist/docs/assets/monitoring-dashboard-logs.png +0 -0
  8. package/dist/docs/assets/monitoring-dashboard-metrics.png +0 -0
  9. package/dist/docs/assets/monitoring-dashboard-overview.png +0 -0
  10. package/dist/docs/assets/release_patch.png +0 -0
  11. package/dist/docs/assets/theme-ansi-light.png +0 -0
  12. package/dist/docs/assets/theme-ansi.png +0 -0
  13. package/dist/docs/assets/theme-atom-one.png +0 -0
  14. package/dist/docs/assets/theme-ayu-light.png +0 -0
  15. package/dist/docs/assets/theme-ayu.png +0 -0
  16. package/dist/docs/assets/theme-custom.png +0 -0
  17. package/dist/docs/assets/theme-default-light.png +0 -0
  18. package/dist/docs/assets/theme-default.png +0 -0
  19. package/dist/docs/assets/theme-dracula.png +0 -0
  20. package/dist/docs/assets/theme-github-light.png +0 -0
  21. package/dist/docs/assets/theme-github.png +0 -0
  22. package/dist/docs/assets/theme-google-light.png +0 -0
  23. package/dist/docs/assets/theme-xcode-light.png +0 -0
  24. package/dist/docs/changelogs/index.md +612 -0
  25. package/dist/docs/changelogs/latest.md +153 -0
  26. package/dist/docs/changelogs/preview.md +131 -0
  27. package/dist/docs/changelogs/releases.md +1162 -0
  28. package/dist/docs/cli/authentication.md +3 -0
  29. package/dist/docs/cli/checkpointing.md +94 -0
  30. package/dist/docs/cli/commands.md +357 -0
  31. package/dist/docs/cli/custom-commands.md +315 -0
  32. package/dist/docs/cli/enterprise.md +564 -0
  33. package/dist/docs/cli/gemini-ignore.md +71 -0
  34. package/dist/docs/cli/gemini-md.md +109 -0
  35. package/dist/docs/cli/generation-settings.md +210 -0
  36. package/dist/docs/cli/headless.md +388 -0
  37. package/dist/docs/cli/index.md +63 -0
  38. package/dist/docs/cli/keyboard-shortcuts.md +136 -0
  39. package/dist/docs/cli/model-routing.md +37 -0
  40. package/dist/docs/cli/model.md +62 -0
  41. package/dist/docs/cli/sandbox.md +171 -0
  42. package/dist/docs/cli/session-management.md +158 -0
  43. package/dist/docs/cli/settings.md +148 -0
  44. package/dist/docs/cli/skills.md +188 -0
  45. package/dist/docs/cli/system-prompt.md +94 -0
  46. package/dist/docs/cli/telemetry.md +813 -0
  47. package/dist/docs/cli/themes.md +237 -0
  48. package/dist/docs/cli/token-caching.md +20 -0
  49. package/dist/docs/cli/trusted-folders.md +95 -0
  50. package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
  51. package/dist/docs/cli/tutorials.md +87 -0
  52. package/dist/docs/cli/uninstall.md +47 -0
  53. package/dist/docs/core/index.md +101 -0
  54. package/dist/docs/core/memport.md +246 -0
  55. package/dist/docs/core/policy-engine.md +268 -0
  56. package/dist/docs/core/tools-api.md +131 -0
  57. package/dist/docs/examples/proxy-script.md +83 -0
  58. package/dist/docs/extensions/extension-releasing.md +183 -0
  59. package/dist/docs/extensions/getting-started-extensions.md +244 -0
  60. package/dist/docs/extensions/index.md +343 -0
  61. package/dist/docs/faq.md +153 -0
  62. package/dist/docs/get-started/authentication.md +321 -0
  63. package/dist/docs/get-started/configuration-v1.md +890 -0
  64. package/dist/docs/get-started/configuration.md +1643 -0
  65. package/dist/docs/get-started/examples.md +218 -0
  66. package/dist/docs/get-started/gemini-3.md +101 -0
  67. package/dist/docs/get-started/index.md +71 -0
  68. package/dist/docs/get-started/installation.md +141 -0
  69. package/dist/docs/hooks/best-practices.md +856 -0
  70. package/dist/docs/hooks/index.md +723 -0
  71. package/dist/docs/hooks/reference.md +178 -0
  72. package/dist/docs/hooks/writing-hooks.md +1044 -0
  73. package/dist/docs/ide-integration/ide-companion-spec.md +267 -0
  74. package/dist/docs/ide-integration/index.md +201 -0
  75. package/dist/docs/index.md +147 -0
  76. package/dist/docs/integration-tests.md +211 -0
  77. package/dist/docs/issue-and-pr-automation.md +134 -0
  78. package/dist/docs/local-development.md +128 -0
  79. package/dist/docs/mcp_integration.md +160 -0
  80. package/dist/docs/mermaid/context.mmd +103 -0
  81. package/dist/docs/mermaid/render-path.mmd +64 -0
  82. package/dist/docs/npm.md +62 -0
  83. package/dist/docs/quota-and-pricing.md +158 -0
  84. package/dist/docs/release-confidence.md +164 -0
  85. package/dist/docs/releases.md +540 -0
  86. package/dist/docs/sidebar.json +301 -0
  87. package/dist/docs/tools/file-system.md +217 -0
  88. package/dist/docs/tools/index.md +95 -0
  89. package/dist/docs/tools/mcp-server.md +1045 -0
  90. package/dist/docs/tools/memory.md +54 -0
  91. package/dist/docs/tools/shell.md +260 -0
  92. package/dist/docs/tools/todos.md +56 -0
  93. package/dist/docs/tools/web-fetch.md +59 -0
  94. package/dist/docs/tools/web-search.md +42 -0
  95. package/dist/docs/tos-privacy.md +96 -0
  96. package/dist/docs/troubleshooting.md +162 -0
  97. package/dist/index.d.ts +1 -1
  98. package/dist/index.js +1 -1
  99. package/dist/index.js.map +1 -1
  100. package/dist/package.json +7 -4
  101. package/dist/src/agents/a2a-client-manager.d.ts +82 -0
  102. package/dist/src/agents/a2a-client-manager.js +295 -0
  103. package/dist/src/agents/a2a-client-manager.js.map +1 -0
  104. package/dist/src/agents/a2a-client-manager.test.js +281 -0
  105. package/dist/src/agents/a2a-client-manager.test.js.map +1 -0
  106. package/dist/src/agents/a2aUtils.d.ts +29 -0
  107. package/dist/src/agents/a2aUtils.js +113 -0
  108. package/dist/src/agents/a2aUtils.js.map +1 -0
  109. package/dist/src/agents/a2aUtils.test.js +147 -0
  110. package/dist/src/agents/a2aUtils.test.js.map +1 -0
  111. package/dist/src/agents/agentLoader.d.ts +68 -0
  112. package/dist/src/agents/agentLoader.js +255 -0
  113. package/dist/src/agents/agentLoader.js.map +1 -0
  114. package/dist/src/agents/agentLoader.test.js +307 -0
  115. package/dist/src/agents/agentLoader.test.js.map +1 -0
  116. package/dist/src/agents/cli-help-agent.d.ts +24 -0
  117. package/dist/src/agents/cli-help-agent.js +85 -0
  118. package/dist/src/agents/cli-help-agent.js.map +1 -0
  119. package/dist/src/agents/cli-help-agent.test.d.ts +6 -0
  120. package/dist/src/agents/cli-help-agent.test.js +65 -0
  121. package/dist/src/agents/cli-help-agent.test.js.map +1 -0
  122. package/dist/src/agents/codebase-investigator.d.ts +2 -2
  123. package/dist/src/agents/codebase-investigator.js +14 -8
  124. package/dist/src/agents/codebase-investigator.js.map +1 -1
  125. package/dist/src/agents/delegate-to-agent-tool.d.ts +19 -0
  126. package/dist/src/agents/delegate-to-agent-tool.js +122 -0
  127. package/dist/src/agents/delegate-to-agent-tool.js.map +1 -0
  128. package/dist/src/agents/delegate-to-agent-tool.test.d.ts +6 -0
  129. package/dist/src/agents/delegate-to-agent-tool.test.js +213 -0
  130. package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -0
  131. package/dist/src/agents/{executor.d.ts → local-executor.d.ts} +5 -11
  132. package/dist/src/agents/{executor.js → local-executor.js} +124 -63
  133. package/dist/src/agents/local-executor.js.map +1 -0
  134. package/dist/src/agents/local-executor.test.d.ts +6 -0
  135. package/dist/src/agents/{executor.test.js → local-executor.test.js} +136 -58
  136. package/dist/src/agents/local-executor.test.js.map +1 -0
  137. package/dist/src/agents/{invocation.d.ts → local-invocation.d.ts} +6 -7
  138. package/dist/src/agents/{invocation.js → local-invocation.js} +9 -10
  139. package/dist/src/agents/local-invocation.js.map +1 -0
  140. package/dist/src/agents/local-invocation.test.d.ts +6 -0
  141. package/dist/src/agents/{invocation.test.js → local-invocation.test.js} +29 -20
  142. package/dist/src/agents/local-invocation.test.js.map +1 -0
  143. package/dist/src/agents/registry.d.ts +37 -1
  144. package/dist/src/agents/registry.js +240 -27
  145. package/dist/src/agents/registry.js.map +1 -1
  146. package/dist/src/agents/registry.test.js +465 -30
  147. package/dist/src/agents/registry.test.js.map +1 -1
  148. package/dist/src/agents/remote-invocation.d.ts +35 -0
  149. package/dist/src/agents/remote-invocation.js +126 -0
  150. package/dist/src/agents/remote-invocation.js.map +1 -0
  151. package/dist/src/agents/remote-invocation.test.d.ts +6 -0
  152. package/dist/src/agents/remote-invocation.test.js +201 -0
  153. package/dist/src/agents/remote-invocation.test.js.map +1 -0
  154. package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
  155. package/dist/src/agents/subagent-tool-wrapper.js +11 -6
  156. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  157. package/dist/src/agents/subagent-tool-wrapper.test.js +33 -19
  158. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  159. package/dist/src/agents/types.d.ts +21 -15
  160. package/dist/src/agents/types.js.map +1 -1
  161. package/dist/src/availability/errorClassification.d.ts +7 -0
  162. package/dist/src/availability/errorClassification.js +20 -0
  163. package/dist/src/availability/errorClassification.js.map +1 -0
  164. package/dist/src/availability/fallbackIntegration.test.d.ts +6 -0
  165. package/dist/src/availability/fallbackIntegration.test.js +58 -0
  166. package/dist/src/availability/fallbackIntegration.test.js.map +1 -0
  167. package/dist/src/availability/modelAvailabilityService.d.ts +3 -1
  168. package/dist/src/availability/modelAvailabilityService.js +3 -0
  169. package/dist/src/availability/modelAvailabilityService.js.map +1 -1
  170. package/dist/src/availability/modelPolicy.d.ts +8 -1
  171. package/dist/src/availability/policyCatalog.d.ts +1 -0
  172. package/dist/src/availability/policyCatalog.js +6 -7
  173. package/dist/src/availability/policyCatalog.js.map +1 -1
  174. package/dist/src/availability/policyCatalog.test.js +2 -2
  175. package/dist/src/availability/policyCatalog.test.js.map +1 -1
  176. package/dist/src/availability/policyHelpers.d.ts +34 -3
  177. package/dist/src/availability/policyHelpers.js +104 -13
  178. package/dist/src/availability/policyHelpers.js.map +1 -1
  179. package/dist/src/availability/policyHelpers.test.js +143 -13
  180. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  181. package/dist/src/availability/testUtils.d.ts +10 -0
  182. package/dist/src/availability/testUtils.js +22 -0
  183. package/dist/src/availability/testUtils.js.map +1 -0
  184. package/dist/src/code_assist/experiments/client_metadata.js +2 -1
  185. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
  186. package/dist/src/code_assist/experiments/client_metadata.test.js +7 -10
  187. package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -1
  188. package/dist/src/code_assist/experiments/experiments.d.ts +1 -1
  189. package/dist/src/code_assist/experiments/experiments.js +21 -0
  190. package/dist/src/code_assist/experiments/experiments.js.map +1 -1
  191. package/dist/src/code_assist/experiments/experiments_local.test.d.ts +6 -0
  192. package/dist/src/code_assist/experiments/experiments_local.test.js +110 -0
  193. package/dist/src/code_assist/experiments/experiments_local.test.js.map +1 -0
  194. package/dist/src/code_assist/oauth-credential-storage.js +3 -4
  195. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  196. package/dist/src/code_assist/oauth2.d.ts +2 -0
  197. package/dist/src/code_assist/oauth2.js +70 -14
  198. package/dist/src/code_assist/oauth2.js.map +1 -1
  199. package/dist/src/code_assist/oauth2.test.js +224 -22
  200. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  201. package/dist/src/code_assist/server.d.ts +9 -1
  202. package/dist/src/code_assist/server.js +74 -11
  203. package/dist/src/code_assist/server.js.map +1 -1
  204. package/dist/src/code_assist/server.test.js +199 -27
  205. package/dist/src/code_assist/server.test.js.map +1 -1
  206. package/dist/src/code_assist/setup.js +6 -4
  207. package/dist/src/code_assist/setup.js.map +1 -1
  208. package/dist/src/code_assist/setup.test.js +63 -0
  209. package/dist/src/code_assist/setup.test.js.map +1 -1
  210. package/dist/src/code_assist/telemetry.d.ts +14 -0
  211. package/dist/src/code_assist/telemetry.js +157 -0
  212. package/dist/src/code_assist/telemetry.js.map +1 -0
  213. package/dist/src/code_assist/telemetry.test.d.ts +6 -0
  214. package/dist/src/code_assist/telemetry.test.js +301 -0
  215. package/dist/src/code_assist/telemetry.test.js.map +1 -0
  216. package/dist/src/code_assist/types.d.ts +77 -1
  217. package/dist/src/code_assist/types.js +28 -0
  218. package/dist/src/code_assist/types.js.map +1 -1
  219. package/dist/src/commands/init.d.ts +7 -0
  220. package/dist/src/commands/init.js +53 -0
  221. package/dist/src/commands/init.js.map +1 -0
  222. package/dist/src/commands/init.test.d.ts +6 -0
  223. package/dist/src/commands/init.test.js +25 -0
  224. package/dist/src/commands/init.test.js.map +1 -0
  225. package/dist/src/commands/memory.d.ts +11 -0
  226. package/dist/src/commands/memory.js +80 -0
  227. package/dist/src/commands/memory.js.map +1 -0
  228. package/dist/src/commands/memory.test.d.ts +6 -0
  229. package/dist/src/commands/memory.test.js +155 -0
  230. package/dist/src/commands/memory.test.js.map +1 -0
  231. package/dist/src/commands/restore.d.ts +9 -0
  232. package/dist/src/commands/restore.js +46 -0
  233. package/dist/src/commands/restore.js.map +1 -0
  234. package/dist/src/commands/restore.test.d.ts +6 -0
  235. package/dist/src/commands/restore.test.js +137 -0
  236. package/dist/src/commands/restore.test.js.map +1 -0
  237. package/dist/src/commands/types.d.ts +41 -0
  238. package/dist/src/commands/types.js +7 -0
  239. package/dist/src/commands/types.js.map +1 -0
  240. package/dist/src/config/config.d.ts +145 -25
  241. package/dist/src/config/config.js +370 -132
  242. package/dist/src/config/config.js.map +1 -1
  243. package/dist/src/config/config.test.js +416 -50
  244. package/dist/src/config/config.test.js.map +1 -1
  245. package/dist/src/config/defaultModelConfigs.js +21 -0
  246. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  247. package/dist/src/config/flashFallback.test.js +11 -35
  248. package/dist/src/config/flashFallback.test.js.map +1 -1
  249. package/dist/src/config/models.d.ts +36 -15
  250. package/dist/src/config/models.js +89 -28
  251. package/dist/src/config/models.js.map +1 -1
  252. package/dist/src/config/models.test.js +107 -77
  253. package/dist/src/config/models.test.js.map +1 -1
  254. package/dist/src/config/storage.d.ts +5 -0
  255. package/dist/src/config/storage.js +17 -2
  256. package/dist/src/config/storage.js.map +1 -1
  257. package/dist/src/config/storage.test.js +16 -0
  258. package/dist/src/config/storage.test.js.map +1 -1
  259. package/dist/src/confirmation-bus/message-bus.js +3 -1
  260. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  261. package/dist/src/confirmation-bus/types.d.ts +4 -0
  262. package/dist/src/core/baseLlmClient.d.ts +3 -1
  263. package/dist/src/core/baseLlmClient.js +60 -22
  264. package/dist/src/core/baseLlmClient.js.map +1 -1
  265. package/dist/src/core/baseLlmClient.test.js +177 -7
  266. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  267. package/dist/src/core/client.d.ts +7 -1
  268. package/dist/src/core/client.js +261 -96
  269. package/dist/src/core/client.js.map +1 -1
  270. package/dist/src/core/client.test.js +397 -67
  271. package/dist/src/core/client.test.js.map +1 -1
  272. package/dist/src/core/clientHookTriggers.js +2 -2
  273. package/dist/src/core/clientHookTriggers.js.map +1 -1
  274. package/dist/src/core/contentGenerator.js +6 -4
  275. package/dist/src/core/contentGenerator.js.map +1 -1
  276. package/dist/src/core/contentGenerator.test.js +24 -23
  277. package/dist/src/core/contentGenerator.test.js.map +1 -1
  278. package/dist/src/core/coreToolHookTriggers.d.ts +9 -5
  279. package/dist/src/core/coreToolHookTriggers.js +119 -21
  280. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  281. package/dist/src/core/coreToolHookTriggers.test.d.ts +6 -0
  282. package/dist/src/core/coreToolHookTriggers.test.js +191 -0
  283. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -0
  284. package/dist/src/core/coreToolScheduler.d.ts +7 -93
  285. package/dist/src/core/coreToolScheduler.js +139 -333
  286. package/dist/src/core/coreToolScheduler.js.map +1 -1
  287. package/dist/src/core/coreToolScheduler.test.js +304 -348
  288. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  289. package/dist/src/core/geminiChat.d.ts +26 -1
  290. package/dist/src/core/geminiChat.js +144 -80
  291. package/dist/src/core/geminiChat.js.map +1 -1
  292. package/dist/src/core/geminiChat.test.js +334 -253
  293. package/dist/src/core/geminiChat.test.js.map +1 -1
  294. package/dist/src/core/geminiChatHookTriggers.d.ts +8 -4
  295. package/dist/src/core/geminiChatHookTriggers.js +34 -12
  296. package/dist/src/core/geminiChatHookTriggers.js.map +1 -1
  297. package/dist/src/core/geminiChatHookTriggers.test.d.ts +6 -0
  298. package/dist/src/core/geminiChatHookTriggers.test.js +153 -0
  299. package/dist/src/core/geminiChatHookTriggers.test.js.map +1 -0
  300. package/dist/src/core/geminiChat_network_retry.test.d.ts +6 -0
  301. package/dist/src/core/geminiChat_network_retry.test.js +196 -0
  302. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -0
  303. package/dist/src/core/logger.js.map +1 -1
  304. package/dist/src/core/loggingContentGenerator.js +19 -2
  305. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  306. package/dist/src/core/loggingContentGenerator.test.js +30 -0
  307. package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
  308. package/dist/src/core/nonInteractiveToolExecutor.test.js +7 -8
  309. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  310. package/dist/src/core/prompts.js +48 -22
  311. package/dist/src/core/prompts.js.map +1 -1
  312. package/dist/src/core/prompts.test.js +66 -11
  313. package/dist/src/core/prompts.test.js.map +1 -1
  314. package/dist/src/core/tokenLimits.js +6 -12
  315. package/dist/src/core/tokenLimits.js.map +1 -1
  316. package/dist/src/core/tokenLimits.test.js +8 -4
  317. package/dist/src/core/tokenLimits.test.js.map +1 -1
  318. package/dist/src/core/turn.d.ts +21 -21
  319. package/dist/src/core/turn.js +32 -22
  320. package/dist/src/core/turn.js.map +1 -1
  321. package/dist/src/core/turn.test.js +79 -5
  322. package/dist/src/core/turn.test.js.map +1 -1
  323. package/dist/src/fallback/handler.js +55 -120
  324. package/dist/src/fallback/handler.js.map +1 -1
  325. package/dist/src/fallback/handler.test.js +115 -288
  326. package/dist/src/fallback/handler.test.js.map +1 -1
  327. package/dist/src/generated/git-commit.d.ts +3 -3
  328. package/dist/src/generated/git-commit.js +3 -3
  329. package/dist/src/hooks/hookAggregator.js +7 -0
  330. package/dist/src/hooks/hookAggregator.js.map +1 -1
  331. package/dist/src/hooks/hookEventHandler.d.ts +9 -5
  332. package/dist/src/hooks/hookEventHandler.js +120 -16
  333. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  334. package/dist/src/hooks/hookEventHandler.test.js +231 -9
  335. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  336. package/dist/src/hooks/hookPlanner.d.ts +1 -5
  337. package/dist/src/hooks/hookPlanner.js +2 -7
  338. package/dist/src/hooks/hookPlanner.js.map +1 -1
  339. package/dist/src/hooks/hookPlanner.test.js +62 -2
  340. package/dist/src/hooks/hookPlanner.test.js.map +1 -1
  341. package/dist/src/hooks/hookRegistry.d.ts +6 -18
  342. package/dist/src/hooks/hookRegistry.js +49 -35
  343. package/dist/src/hooks/hookRegistry.js.map +1 -1
  344. package/dist/src/hooks/hookRegistry.test.js +167 -8
  345. package/dist/src/hooks/hookRegistry.test.js.map +1 -1
  346. package/dist/src/hooks/hookRunner.d.ts +5 -3
  347. package/dist/src/hooks/hookRunner.js +68 -18
  348. package/dist/src/hooks/hookRunner.js.map +1 -1
  349. package/dist/src/hooks/hookRunner.test.js +173 -36
  350. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  351. package/dist/src/hooks/hookSystem.d.ts +10 -6
  352. package/dist/src/hooks/hookSystem.js +36 -16
  353. package/dist/src/hooks/hookSystem.js.map +1 -1
  354. package/dist/src/hooks/hookSystem.test.js +123 -18
  355. package/dist/src/hooks/hookSystem.test.js.map +1 -1
  356. package/dist/src/hooks/hookTranslator.js +2 -1
  357. package/dist/src/hooks/hookTranslator.js.map +1 -1
  358. package/dist/src/hooks/index.d.ts +2 -1
  359. package/dist/src/hooks/index.js +1 -0
  360. package/dist/src/hooks/index.js.map +1 -1
  361. package/dist/src/hooks/trustedHooks.d.ts +28 -0
  362. package/dist/src/hooks/trustedHooks.js +90 -0
  363. package/dist/src/hooks/trustedHooks.js.map +1 -0
  364. package/dist/src/hooks/trustedHooks.test.d.ts +6 -0
  365. package/dist/src/hooks/trustedHooks.test.js +154 -0
  366. package/dist/src/hooks/trustedHooks.test.js.map +1 -0
  367. package/dist/src/hooks/types.d.ts +42 -11
  368. package/dist/src/hooks/types.js +31 -42
  369. package/dist/src/hooks/types.js.map +1 -1
  370. package/dist/src/hooks/types.test.js +9 -52
  371. package/dist/src/hooks/types.test.js.map +1 -1
  372. package/dist/src/ide/detect-ide.d.ts +4 -0
  373. package/dist/src/ide/detect-ide.js +7 -2
  374. package/dist/src/ide/detect-ide.js.map +1 -1
  375. package/dist/src/ide/detect-ide.test.js +42 -1
  376. package/dist/src/ide/detect-ide.test.js.map +1 -1
  377. package/dist/src/ide/ide-client.js +6 -1
  378. package/dist/src/ide/ide-client.js.map +1 -1
  379. package/dist/src/ide/ide-installer.js +2 -2
  380. package/dist/src/ide/ide-installer.js.map +1 -1
  381. package/dist/src/ide/ide-installer.test.js +12 -3
  382. package/dist/src/ide/ide-installer.test.js.map +1 -1
  383. package/dist/src/index.d.ts +23 -1
  384. package/dist/src/index.js +25 -2
  385. package/dist/src/index.js.map +1 -1
  386. package/dist/src/mcp/oauth-provider.js +7 -3
  387. package/dist/src/mcp/oauth-provider.js.map +1 -1
  388. package/dist/src/mcp/oauth-provider.test.js +4 -1
  389. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  390. package/dist/src/mcp/oauth-utils.d.ts +8 -1
  391. package/dist/src/mcp/oauth-utils.js +31 -2
  392. package/dist/src/mcp/oauth-utils.js.map +1 -1
  393. package/dist/src/mcp/oauth-utils.test.js +42 -0
  394. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  395. package/dist/src/mcp/token-storage/file-token-storage.js +2 -2
  396. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  397. package/dist/src/mcp/token-storage/keychain-token-storage.js +1 -1
  398. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  399. package/dist/src/output/json-formatter.d.ts +2 -2
  400. package/dist/src/output/json-formatter.js +6 -3
  401. package/dist/src/output/json-formatter.js.map +1 -1
  402. package/dist/src/output/json-formatter.test.js +37 -9
  403. package/dist/src/output/json-formatter.test.js.map +1 -1
  404. package/dist/src/output/stream-json-formatter.js +6 -0
  405. package/dist/src/output/stream-json-formatter.js.map +1 -1
  406. package/dist/src/output/stream-json-formatter.test.js +98 -100
  407. package/dist/src/output/stream-json-formatter.test.js.map +1 -1
  408. package/dist/src/output/types.d.ts +3 -0
  409. package/dist/src/output/types.js.map +1 -1
  410. package/dist/src/policy/config.js +140 -15
  411. package/dist/src/policy/config.js.map +1 -1
  412. package/dist/src/policy/config.test.js +24 -2
  413. package/dist/src/policy/config.test.js.map +1 -1
  414. package/dist/src/policy/persistence.test.d.ts +6 -0
  415. package/dist/src/policy/persistence.test.js +154 -0
  416. package/dist/src/policy/persistence.test.js.map +1 -0
  417. package/dist/src/policy/policies/agent.toml +31 -0
  418. package/dist/src/policy/policies/write.toml +5 -0
  419. package/dist/src/policy/policies/yolo.toml +1 -0
  420. package/dist/src/policy/policy-engine.d.ts +14 -1
  421. package/dist/src/policy/policy-engine.js +165 -7
  422. package/dist/src/policy/policy-engine.js.map +1 -1
  423. package/dist/src/policy/policy-engine.test.js +315 -3
  424. package/dist/src/policy/policy-engine.test.js.map +1 -1
  425. package/dist/src/policy/policy-updater.test.d.ts +6 -0
  426. package/dist/src/policy/policy-updater.test.js +116 -0
  427. package/dist/src/policy/policy-updater.test.js.map +1 -0
  428. package/dist/src/policy/shell-safety.test.d.ts +6 -0
  429. package/dist/src/policy/shell-safety.test.js +438 -0
  430. package/dist/src/policy/shell-safety.test.js.map +1 -0
  431. package/dist/src/policy/toml-loader.d.ts +3 -5
  432. package/dist/src/policy/toml-loader.js +43 -60
  433. package/dist/src/policy/toml-loader.js.map +1 -1
  434. package/dist/src/policy/toml-loader.test.js +41 -7
  435. package/dist/src/policy/toml-loader.test.js.map +1 -1
  436. package/dist/src/policy/types.d.ts +25 -0
  437. package/dist/src/policy/utils.d.ts +21 -0
  438. package/dist/src/policy/utils.js +45 -0
  439. package/dist/src/policy/utils.js.map +1 -0
  440. package/dist/src/policy/utils.test.d.ts +6 -0
  441. package/dist/src/policy/utils.test.js +92 -0
  442. package/dist/src/policy/utils.test.js.map +1 -0
  443. package/dist/src/resources/resource-registry.d.ts +30 -0
  444. package/dist/src/resources/resource-registry.js +57 -0
  445. package/dist/src/resources/resource-registry.js.map +1 -0
  446. package/dist/src/resources/resource-registry.test.d.ts +6 -0
  447. package/dist/src/resources/resource-registry.test.js +54 -0
  448. package/dist/src/resources/resource-registry.test.js.map +1 -0
  449. package/dist/src/routing/modelRouterService.js +0 -15
  450. package/dist/src/routing/modelRouterService.js.map +1 -1
  451. package/dist/src/routing/modelRouterService.test.js +0 -62
  452. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  453. package/dist/src/routing/routingStrategy.d.ts +2 -0
  454. package/dist/src/routing/strategies/classifierStrategy.js +10 -21
  455. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  456. package/dist/src/routing/strategies/classifierStrategy.test.js +18 -1
  457. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  458. package/dist/src/routing/strategies/compositeStrategy.js +4 -2
  459. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -1
  460. package/dist/src/routing/strategies/compositeStrategy.test.js +11 -10
  461. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -1
  462. package/dist/src/routing/strategies/fallbackStrategy.d.ts +1 -1
  463. package/dist/src/routing/strategies/fallbackStrategy.js +21 -13
  464. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  465. package/dist/src/routing/strategies/fallbackStrategy.test.js +76 -39
  466. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  467. package/dist/src/routing/strategies/overrideStrategy.d.ts +1 -1
  468. package/dist/src/routing/strategies/overrideStrategy.js +5 -4
  469. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  470. package/dist/src/routing/strategies/overrideStrategy.test.js +14 -0
  471. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
  472. package/dist/src/safety/checker-runner.js +17 -6
  473. package/dist/src/safety/checker-runner.js.map +1 -1
  474. package/dist/src/scheduler/tool-executor.d.ts +22 -0
  475. package/dist/src/scheduler/tool-executor.js +198 -0
  476. package/dist/src/scheduler/tool-executor.js.map +1 -0
  477. package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
  478. package/dist/src/scheduler/tool-executor.test.js +231 -0
  479. package/dist/src/scheduler/tool-executor.test.js.map +1 -0
  480. package/dist/src/scheduler/tool-modifier.d.ts +23 -0
  481. package/dist/src/scheduler/tool-modifier.js +50 -0
  482. package/dist/src/scheduler/tool-modifier.js.map +1 -0
  483. package/dist/src/scheduler/tool-modifier.test.d.ts +6 -0
  484. package/dist/src/scheduler/tool-modifier.test.js +159 -0
  485. package/dist/src/scheduler/tool-modifier.test.js.map +1 -0
  486. package/dist/src/scheduler/types.d.ts +95 -0
  487. package/dist/src/scheduler/types.js +7 -0
  488. package/dist/src/scheduler/types.js.map +1 -0
  489. package/dist/src/services/chatCompressionService.js +8 -1
  490. package/dist/src/services/chatCompressionService.js.map +1 -1
  491. package/dist/src/services/chatCompressionService.test.js +3 -0
  492. package/dist/src/services/chatCompressionService.test.js.map +1 -1
  493. package/dist/src/services/chatRecordingService.d.ts +21 -1
  494. package/dist/src/services/chatRecordingService.js +57 -2
  495. package/dist/src/services/chatRecordingService.js.map +1 -1
  496. package/dist/src/services/chatRecordingService.test.js +43 -0
  497. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  498. package/dist/src/services/contextManager.d.ts +5 -11
  499. package/dist/src/services/contextManager.js +20 -17
  500. package/dist/src/services/contextManager.js.map +1 -1
  501. package/dist/src/services/contextManager.test.js +40 -41
  502. package/dist/src/services/contextManager.test.js.map +1 -1
  503. package/dist/src/services/environmentSanitization.d.ts +15 -0
  504. package/dist/src/services/environmentSanitization.js +142 -0
  505. package/dist/src/services/environmentSanitization.js.map +1 -0
  506. package/dist/src/services/environmentSanitization.test.d.ts +6 -0
  507. package/dist/src/services/environmentSanitization.test.js +284 -0
  508. package/dist/src/services/environmentSanitization.test.js.map +1 -0
  509. package/dist/src/services/fileSystemService.d.ts +0 -9
  510. package/dist/src/services/fileSystemService.js +0 -11
  511. package/dist/src/services/fileSystemService.js.map +1 -1
  512. package/dist/src/services/gitService.js +15 -1
  513. package/dist/src/services/gitService.js.map +1 -1
  514. package/dist/src/services/gitService.test.js +56 -2
  515. package/dist/src/services/gitService.test.js.map +1 -1
  516. package/dist/src/services/loopDetectionService.js +4 -3
  517. package/dist/src/services/loopDetectionService.js.map +1 -1
  518. package/dist/src/services/loopDetectionService.test.js +14 -8
  519. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  520. package/dist/src/services/modelConfig.golden.test.js +32 -0
  521. package/dist/src/services/modelConfig.golden.test.js.map +1 -1
  522. package/dist/src/services/modelConfig.integration.test.js +3 -3
  523. package/dist/src/services/modelConfig.integration.test.js.map +1 -1
  524. package/dist/src/services/modelConfigService.d.ts +41 -4
  525. package/dist/src/services/modelConfigService.js +135 -75
  526. package/dist/src/services/modelConfigService.js.map +1 -1
  527. package/dist/src/services/modelConfigService.test.js +226 -0
  528. package/dist/src/services/modelConfigService.test.js.map +1 -1
  529. package/dist/src/services/modelConfigServiceTestUtils.d.ts +10 -0
  530. package/dist/src/services/modelConfigServiceTestUtils.js +17 -0
  531. package/dist/src/services/modelConfigServiceTestUtils.js.map +1 -0
  532. package/dist/src/services/sessionSummaryService.d.ts +28 -0
  533. package/dist/src/services/sessionSummaryService.js +131 -0
  534. package/dist/src/services/sessionSummaryService.js.map +1 -0
  535. package/dist/src/services/sessionSummaryService.test.d.ts +6 -0
  536. package/dist/src/services/sessionSummaryService.test.js +785 -0
  537. package/dist/src/services/sessionSummaryService.test.js.map +1 -0
  538. package/dist/src/services/sessionSummaryUtils.d.ts +16 -0
  539. package/dist/src/services/sessionSummaryUtils.js +129 -0
  540. package/dist/src/services/sessionSummaryUtils.js.map +1 -0
  541. package/dist/src/services/sessionSummaryUtils.test.d.ts +6 -0
  542. package/dist/src/services/sessionSummaryUtils.test.js +137 -0
  543. package/dist/src/services/sessionSummaryUtils.test.js.map +1 -0
  544. package/dist/src/services/shellExecutionService.d.ts +2 -0
  545. package/dist/src/services/shellExecutionService.js +34 -72
  546. package/dist/src/services/shellExecutionService.js.map +1 -1
  547. package/dist/src/services/shellExecutionService.test.js +114 -8
  548. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  549. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +238 -0
  550. package/dist/src/services/test-data/resolved-aliases.golden.json +16 -0
  551. package/dist/src/skills/skillLoader.d.ts +31 -0
  552. package/dist/src/skills/skillLoader.js +77 -0
  553. package/dist/src/skills/skillLoader.js.map +1 -0
  554. package/dist/src/skills/skillLoader.test.d.ts +6 -0
  555. package/dist/src/skills/skillLoader.test.js +75 -0
  556. package/dist/src/skills/skillLoader.test.js.map +1 -0
  557. package/dist/src/skills/skillManager.d.ts +69 -0
  558. package/dist/src/skills/skillManager.js +127 -0
  559. package/dist/src/skills/skillManager.js.map +1 -0
  560. package/dist/src/skills/skillManager.test.d.ts +6 -0
  561. package/dist/src/skills/skillManager.test.js +210 -0
  562. package/dist/src/skills/skillManager.test.js.map +1 -0
  563. package/dist/src/telemetry/activity-detector.test.js.map +1 -1
  564. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +19 -9
  565. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +261 -164
  566. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  567. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +223 -27
  568. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  569. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +12 -3
  570. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +26 -5
  571. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  572. package/dist/src/telemetry/config.js +2 -0
  573. package/dist/src/telemetry/config.js.map +1 -1
  574. package/dist/src/telemetry/config.test.js +25 -0
  575. package/dist/src/telemetry/config.test.js.map +1 -1
  576. package/dist/src/telemetry/gcp-exporters.d.ts +4 -3
  577. package/dist/src/telemetry/gcp-exporters.js +8 -4
  578. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  579. package/dist/src/telemetry/index.d.ts +1 -1
  580. package/dist/src/telemetry/index.js +1 -1
  581. package/dist/src/telemetry/index.js.map +1 -1
  582. package/dist/src/telemetry/loggers.d.ts +4 -3
  583. package/dist/src/telemetry/loggers.js +351 -340
  584. package/dist/src/telemetry/loggers.js.map +1 -1
  585. package/dist/src/telemetry/loggers.test.circular.js +1 -0
  586. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  587. package/dist/src/telemetry/loggers.test.js +71 -15
  588. package/dist/src/telemetry/loggers.test.js.map +1 -1
  589. package/dist/src/telemetry/metrics.test.js.map +1 -1
  590. package/dist/src/telemetry/sdk.d.ts +9 -2
  591. package/dist/src/telemetry/sdk.js +142 -17
  592. package/dist/src/telemetry/sdk.js.map +1 -1
  593. package/dist/src/telemetry/sdk.test.js +130 -28
  594. package/dist/src/telemetry/sdk.test.js.map +1 -1
  595. package/dist/src/telemetry/startupProfiler.js +26 -3
  596. package/dist/src/telemetry/startupProfiler.js.map +1 -1
  597. package/dist/src/telemetry/startupProfiler.test.js +49 -7
  598. package/dist/src/telemetry/startupProfiler.test.js.map +1 -1
  599. package/dist/src/telemetry/telemetry.test.js +10 -3
  600. package/dist/src/telemetry/telemetry.test.js.map +1 -1
  601. package/dist/src/telemetry/trace.js.map +1 -1
  602. package/dist/src/telemetry/types.d.ts +37 -12
  603. package/dist/src/telemetry/types.js +61 -20
  604. package/dist/src/telemetry/types.js.map +1 -1
  605. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  606. package/dist/src/telemetry/uiTelemetry.js +2 -0
  607. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  608. package/dist/src/telemetry/uiTelemetry.test.js +4 -0
  609. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  610. package/dist/src/test-utils/mock-message-bus.d.ts +1 -0
  611. package/dist/src/test-utils/mock-message-bus.js +29 -0
  612. package/dist/src/test-utils/mock-message-bus.js.map +1 -1
  613. package/dist/src/test-utils/mock-tool.d.ts +5 -3
  614. package/dist/src/test-utils/mock-tool.js +11 -10
  615. package/dist/src/test-utils/mock-tool.js.map +1 -1
  616. package/dist/src/tools/activate-skill.d.ts +27 -0
  617. package/dist/src/tools/activate-skill.js +133 -0
  618. package/dist/src/tools/activate-skill.js.map +1 -0
  619. package/dist/src/tools/activate-skill.test.d.ts +6 -0
  620. package/dist/src/tools/activate-skill.test.js +113 -0
  621. package/dist/src/tools/activate-skill.test.js.map +1 -0
  622. package/dist/src/tools/confirmation-policy.test.d.ts +6 -0
  623. package/dist/src/tools/confirmation-policy.test.js +143 -0
  624. package/dist/src/tools/confirmation-policy.test.js.map +1 -0
  625. package/dist/src/tools/edit.d.ts +27 -5
  626. package/dist/src/tools/edit.js +460 -136
  627. package/dist/src/tools/edit.js.map +1 -1
  628. package/dist/src/tools/edit.test.js +292 -526
  629. package/dist/src/tools/edit.test.js.map +1 -1
  630. package/dist/src/tools/get-internal-docs.d.ts +27 -0
  631. package/dist/src/tools/get-internal-docs.js +122 -0
  632. package/dist/src/tools/get-internal-docs.js.map +1 -0
  633. package/dist/src/tools/get-internal-docs.test.d.ts +6 -0
  634. package/dist/src/tools/get-internal-docs.test.js +57 -0
  635. package/dist/src/tools/get-internal-docs.test.js.map +1 -0
  636. package/dist/src/tools/glob.d.ts +2 -2
  637. package/dist/src/tools/glob.js +1 -1
  638. package/dist/src/tools/glob.js.map +1 -1
  639. package/dist/src/tools/glob.test.js +2 -1
  640. package/dist/src/tools/glob.test.js.map +1 -1
  641. package/dist/src/tools/grep.d.ts +2 -2
  642. package/dist/src/tools/grep.js +1 -1
  643. package/dist/src/tools/grep.js.map +1 -1
  644. package/dist/src/tools/grep.test.js +5 -4
  645. package/dist/src/tools/grep.test.js.map +1 -1
  646. package/dist/src/tools/ls.d.ts +2 -2
  647. package/dist/src/tools/ls.js +2 -2
  648. package/dist/src/tools/ls.js.map +1 -1
  649. package/dist/src/tools/ls.test.js +2 -1
  650. package/dist/src/tools/ls.test.js.map +1 -1
  651. package/dist/src/tools/mcp-client-manager.d.ts +2 -1
  652. package/dist/src/tools/mcp-client-manager.js +32 -9
  653. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  654. package/dist/src/tools/mcp-client-manager.test.js +41 -10
  655. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  656. package/dist/src/tools/mcp-client.d.ts +43 -6
  657. package/dist/src/tools/mcp-client.js +443 -176
  658. package/dist/src/tools/mcp-client.js.map +1 -1
  659. package/dist/src/tools/mcp-client.test.js +664 -39
  660. package/dist/src/tools/mcp-client.test.js.map +1 -1
  661. package/dist/src/tools/mcp-tool.d.ts +20 -5
  662. package/dist/src/tools/mcp-tool.js +21 -8
  663. package/dist/src/tools/mcp-tool.js.map +1 -1
  664. package/dist/src/tools/mcp-tool.test.js +35 -5
  665. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  666. package/dist/src/tools/memoryTool.d.ts +3 -3
  667. package/dist/src/tools/memoryTool.js +3 -4
  668. package/dist/src/tools/memoryTool.js.map +1 -1
  669. package/dist/src/tools/memoryTool.test.js +5 -2
  670. package/dist/src/tools/memoryTool.test.js.map +1 -1
  671. package/dist/src/tools/message-bus-integration.test.js +10 -37
  672. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  673. package/dist/src/tools/modifiable-tool.js.map +1 -1
  674. package/dist/src/tools/modifiable-tool.test.js +22 -13
  675. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  676. package/dist/src/tools/read-file.d.ts +2 -2
  677. package/dist/src/tools/read-file.js +2 -2
  678. package/dist/src/tools/read-file.js.map +1 -1
  679. package/dist/src/tools/read-file.test.js +3 -2
  680. package/dist/src/tools/read-file.test.js.map +1 -1
  681. package/dist/src/tools/read-many-files.d.ts +2 -2
  682. package/dist/src/tools/read-many-files.js +7 -6
  683. package/dist/src/tools/read-many-files.js.map +1 -1
  684. package/dist/src/tools/read-many-files.test.js +4 -3
  685. package/dist/src/tools/read-many-files.test.js.map +1 -1
  686. package/dist/src/tools/ripGrep.d.ts +3 -2
  687. package/dist/src/tools/ripGrep.js +18 -7
  688. package/dist/src/tools/ripGrep.js.map +1 -1
  689. package/dist/src/tools/ripGrep.test.js +60 -4
  690. package/dist/src/tools/ripGrep.test.js.map +1 -1
  691. package/dist/src/tools/shell.d.ts +5 -7
  692. package/dist/src/tools/shell.js +35 -49
  693. package/dist/src/tools/shell.js.map +1 -1
  694. package/dist/src/tools/shell.test.js +36 -59
  695. package/dist/src/tools/shell.test.js.map +1 -1
  696. package/dist/src/tools/tool-error.d.ts +6 -1
  697. package/dist/src/tools/tool-error.js +6 -0
  698. package/dist/src/tools/tool-error.js.map +1 -1
  699. package/dist/src/tools/tool-names.d.ts +17 -0
  700. package/dist/src/tools/tool-names.js +59 -0
  701. package/dist/src/tools/tool-names.js.map +1 -1
  702. package/dist/src/tools/tool-names.test.d.ts +6 -0
  703. package/dist/src/tools/tool-names.test.js +43 -0
  704. package/dist/src/tools/tool-names.test.js.map +1 -0
  705. package/dist/src/tools/tool-registry.d.ts +11 -7
  706. package/dist/src/tools/tool-registry.js +15 -10
  707. package/dist/src/tools/tool-registry.js.map +1 -1
  708. package/dist/src/tools/tool-registry.test.js +16 -11
  709. package/dist/src/tools/tool-registry.test.js.map +1 -1
  710. package/dist/src/tools/tools.d.ts +27 -6
  711. package/dist/src/tools/tools.js +44 -25
  712. package/dist/src/tools/tools.js.map +1 -1
  713. package/dist/src/tools/tools.test.js +3 -1
  714. package/dist/src/tools/tools.test.js.map +1 -1
  715. package/dist/src/tools/web-fetch.d.ts +2 -2
  716. package/dist/src/tools/web-fetch.js +21 -8
  717. package/dist/src/tools/web-fetch.js.map +1 -1
  718. package/dist/src/tools/web-fetch.test.js +18 -19
  719. package/dist/src/tools/web-fetch.test.js.map +1 -1
  720. package/dist/src/tools/web-search.d.ts +2 -2
  721. package/dist/src/tools/web-search.js +5 -5
  722. package/dist/src/tools/web-search.js.map +1 -1
  723. package/dist/src/tools/web-search.test.js +2 -1
  724. package/dist/src/tools/web-search.test.js.map +1 -1
  725. package/dist/src/tools/write-file.d.ts +2 -2
  726. package/dist/src/tools/write-file.js +14 -6
  727. package/dist/src/tools/write-file.js.map +1 -1
  728. package/dist/src/tools/write-file.test.js +49 -7
  729. package/dist/src/tools/write-file.test.js.map +1 -1
  730. package/dist/src/tools/write-todos.d.ts +2 -2
  731. package/dist/src/tools/write-todos.js +5 -4
  732. package/dist/src/tools/write-todos.js.map +1 -1
  733. package/dist/src/tools/write-todos.test.js +2 -1
  734. package/dist/src/tools/write-todos.test.js.map +1 -1
  735. package/dist/src/utils/apiConversionUtils.d.ts +12 -0
  736. package/dist/src/utils/apiConversionUtils.js +46 -0
  737. package/dist/src/utils/apiConversionUtils.js.map +1 -0
  738. package/dist/src/utils/apiConversionUtils.test.d.ts +6 -0
  739. package/dist/src/utils/apiConversionUtils.test.js +150 -0
  740. package/dist/src/utils/apiConversionUtils.test.js.map +1 -0
  741. package/dist/src/utils/bfsFileSearch.d.ts +8 -0
  742. package/dist/src/utils/bfsFileSearch.js +63 -23
  743. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  744. package/dist/src/utils/bfsFileSearch.test.js +65 -1
  745. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  746. package/dist/src/utils/checkpointUtils.d.ts +82 -0
  747. package/dist/src/utils/checkpointUtils.js +117 -0
  748. package/dist/src/utils/checkpointUtils.js.map +1 -0
  749. package/dist/src/utils/checkpointUtils.test.d.ts +6 -0
  750. package/dist/src/utils/checkpointUtils.test.js +229 -0
  751. package/dist/src/utils/checkpointUtils.test.js.map +1 -0
  752. package/dist/src/utils/debugLogger.d.ts +3 -0
  753. package/dist/src/utils/debugLogger.js +28 -0
  754. package/dist/src/utils/debugLogger.js.map +1 -1
  755. package/dist/src/utils/editCorrector.d.ts +3 -3
  756. package/dist/src/utils/editCorrector.js +27 -10
  757. package/dist/src/utils/editCorrector.js.map +1 -1
  758. package/dist/src/utils/editCorrector.test.js +27 -23
  759. package/dist/src/utils/editCorrector.test.js.map +1 -1
  760. package/dist/src/utils/editor.d.ts +10 -1
  761. package/dist/src/utils/editor.js +48 -19
  762. package/dist/src/utils/editor.js.map +1 -1
  763. package/dist/src/utils/editor.test.js +27 -4
  764. package/dist/src/utils/editor.test.js.map +1 -1
  765. package/dist/src/utils/environmentContext.d.ts +1 -0
  766. package/dist/src/utils/environmentContext.js +4 -0
  767. package/dist/src/utils/environmentContext.js.map +1 -1
  768. package/dist/src/utils/environmentContext.test.js +2 -0
  769. package/dist/src/utils/environmentContext.test.js.map +1 -1
  770. package/dist/src/utils/errorReporting.d.ts +1 -1
  771. package/dist/src/utils/errorReporting.js +13 -12
  772. package/dist/src/utils/errorReporting.js.map +1 -1
  773. package/dist/src/utils/errorReporting.test.js +17 -14
  774. package/dist/src/utils/errorReporting.test.js.map +1 -1
  775. package/dist/src/utils/errors.d.ts +8 -0
  776. package/dist/src/utils/errors.js +39 -2
  777. package/dist/src/utils/errors.js.map +1 -1
  778. package/dist/src/utils/errors.test.d.ts +6 -0
  779. package/dist/src/utils/errors.test.js +155 -0
  780. package/dist/src/utils/errors.test.js.map +1 -0
  781. package/dist/src/utils/events.d.ts +71 -19
  782. package/dist/src/utils/events.js +35 -9
  783. package/dist/src/utils/events.js.map +1 -1
  784. package/dist/src/utils/events.test.js +25 -0
  785. package/dist/src/utils/events.test.js.map +1 -1
  786. package/dist/src/utils/extensionLoader.d.ts +2 -2
  787. package/dist/src/utils/extensionLoader.js +5 -6
  788. package/dist/src/utils/extensionLoader.js.map +1 -1
  789. package/dist/src/utils/extensionLoader.test.js +11 -0
  790. package/dist/src/utils/extensionLoader.test.js.map +1 -1
  791. package/dist/src/utils/fetch.d.ts +1 -1
  792. package/dist/src/utils/fetch.js +3 -3
  793. package/dist/src/utils/fetch.js.map +1 -1
  794. package/dist/src/utils/fileDiffUtils.d.ts +18 -0
  795. package/dist/src/utils/fileDiffUtils.js +37 -0
  796. package/dist/src/utils/fileDiffUtils.js.map +1 -0
  797. package/dist/src/utils/fileDiffUtils.test.d.ts +6 -0
  798. package/dist/src/utils/fileDiffUtils.test.js +84 -0
  799. package/dist/src/utils/fileDiffUtils.test.js.map +1 -0
  800. package/dist/src/utils/fileUtils.d.ts +4 -0
  801. package/dist/src/utils/fileUtils.js +53 -0
  802. package/dist/src/utils/fileUtils.js.map +1 -1
  803. package/dist/src/utils/fileUtils.test.js +127 -1
  804. package/dist/src/utils/fileUtils.test.js.map +1 -1
  805. package/dist/src/utils/filesearch/crawlCache.js.map +1 -1
  806. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  807. package/dist/src/utils/flashFallback.test.js +1 -1
  808. package/dist/src/utils/flashFallback.test.js.map +1 -1
  809. package/dist/src/utils/geminiIgnoreParser.d.ts +11 -0
  810. package/dist/src/utils/geminiIgnoreParser.js +20 -0
  811. package/dist/src/utils/geminiIgnoreParser.js.map +1 -1
  812. package/dist/src/utils/geminiIgnoreParser.test.js +48 -0
  813. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -1
  814. package/dist/src/utils/generateContentResponseUtilities.d.ts +3 -1
  815. package/dist/src/utils/generateContentResponseUtilities.js +106 -0
  816. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  817. package/dist/src/utils/generateContentResponseUtilities.test.js +279 -2
  818. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  819. package/dist/src/utils/getFolderStructure.js +7 -2
  820. package/dist/src/utils/getFolderStructure.js.map +1 -1
  821. package/dist/src/utils/gitIgnoreParser.js +9 -10
  822. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  823. package/dist/src/utils/googleErrors.js +31 -18
  824. package/dist/src/utils/googleErrors.js.map +1 -1
  825. package/dist/src/utils/googleErrors.test.js +10 -2
  826. package/dist/src/utils/googleErrors.test.js.map +1 -1
  827. package/dist/src/utils/googleQuotaErrors.d.ts +3 -3
  828. package/dist/src/utils/googleQuotaErrors.js +32 -6
  829. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  830. package/dist/src/utils/googleQuotaErrors.test.js +94 -2
  831. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
  832. package/dist/src/utils/installationManager.test.js +11 -3
  833. package/dist/src/utils/installationManager.test.js.map +1 -1
  834. package/dist/src/utils/memoryDiscovery.js +3 -4
  835. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  836. package/dist/src/utils/memoryDiscovery.test.js +12 -1
  837. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  838. package/dist/src/utils/nextSpeakerChecker.test.js +4 -0
  839. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  840. package/dist/src/utils/partUtils.js +1 -1
  841. package/dist/src/utils/partUtils.js.map +1 -1
  842. package/dist/src/utils/pathCorrector.js +12 -2
  843. package/dist/src/utils/pathCorrector.js.map +1 -1
  844. package/dist/src/utils/pathCorrector.test.js +6 -2
  845. package/dist/src/utils/pathCorrector.test.js.map +1 -1
  846. package/dist/src/utils/paths.d.ts +10 -0
  847. package/dist/src/utils/paths.js +20 -1
  848. package/dist/src/utils/paths.js.map +1 -1
  849. package/dist/src/utils/retry.d.ts +12 -0
  850. package/dist/src/utils/retry.js +70 -17
  851. package/dist/src/utils/retry.js.map +1 -1
  852. package/dist/src/utils/retry.test.js +181 -21
  853. package/dist/src/utils/retry.test.js.map +1 -1
  854. package/dist/src/utils/shell-utils.d.ts +16 -47
  855. package/dist/src/utils/shell-utils.js +98 -194
  856. package/dist/src/utils/shell-utils.js.map +1 -1
  857. package/dist/src/utils/shell-utils.test.js +99 -288
  858. package/dist/src/utils/shell-utils.test.js.map +1 -1
  859. package/dist/src/utils/summarizer.test.js +3 -2
  860. package/dist/src/utils/summarizer.test.js.map +1 -1
  861. package/dist/src/utils/terminal.d.ts +4 -0
  862. package/dist/src/utils/terminal.js +12 -0
  863. package/dist/src/utils/terminal.js.map +1 -1
  864. package/dist/src/utils/terminalSerializer.test.js +17 -0
  865. package/dist/src/utils/terminalSerializer.test.js.map +1 -1
  866. package/dist/src/utils/tokenCalculation.js +20 -5
  867. package/dist/src/utils/tokenCalculation.js.map +1 -1
  868. package/dist/src/utils/tokenCalculation.test.js +11 -2
  869. package/dist/src/utils/tokenCalculation.test.js.map +1 -1
  870. package/dist/src/utils/tool-utils.d.ts +9 -0
  871. package/dist/src/utils/tool-utils.js +29 -0
  872. package/dist/src/utils/tool-utils.js.map +1 -1
  873. package/dist/src/utils/tool-utils.test.js +17 -2
  874. package/dist/src/utils/tool-utils.test.js.map +1 -1
  875. package/dist/src/utils/userAccountManager.test.js +5 -5
  876. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  877. package/dist/src/utils/version.d.ts +6 -0
  878. package/dist/src/utils/version.js +15 -0
  879. package/dist/src/utils/version.js.map +1 -0
  880. package/dist/src/utils/version.test.d.ts +6 -0
  881. package/dist/src/utils/version.test.js +39 -0
  882. package/dist/src/utils/version.test.js.map +1 -0
  883. package/dist/src/utils/workspaceContext.test.js +1 -1
  884. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  885. package/dist/tsconfig.tsbuildinfo +1 -1
  886. package/package.json +8 -6
  887. package/dist/src/agents/executor.js.map +0 -1
  888. package/dist/src/agents/executor.test.js.map +0 -1
  889. package/dist/src/agents/invocation.js.map +0 -1
  890. package/dist/src/agents/invocation.test.js.map +0 -1
  891. package/dist/src/tools/smart-edit.d.ts +0 -78
  892. package/dist/src/tools/smart-edit.js +0 -717
  893. package/dist/src/tools/smart-edit.js.map +0 -1
  894. package/dist/src/tools/smart-edit.test.js +0 -592
  895. package/dist/src/tools/smart-edit.test.js.map +0 -1
  896. /package/dist/src/agents/{executor.test.d.ts → a2a-client-manager.test.d.ts} +0 -0
  897. /package/dist/src/agents/{invocation.test.d.ts → a2aUtils.test.d.ts} +0 -0
  898. /package/dist/src/{tools/smart-edit.test.d.ts → agents/agentLoader.test.d.ts} +0 -0
@@ -7,13 +7,23 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
7
  import { ApiError, ThinkingLevel } from '@google/genai';
8
8
  import { GeminiChat, InvalidStreamError, StreamEventType, SYNTHETIC_THOUGHT_SIGNATURE, } from './geminiChat.js';
9
9
  import { setSimulate429 } from '../utils/testUtils.js';
10
- import { DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_THINKING_MODE, PREVIEW_GEMINI_MODEL, } from '../config/models.js';
10
+ import { DEFAULT_THINKING_MODE } from '../config/models.js';
11
11
  import { AuthType } from './contentGenerator.js';
12
12
  import { TerminalQuotaError } from '../utils/googleQuotaErrors.js';
13
- import { retryWithBackoff } from '../utils/retry.js';
13
+ import {} from '../utils/retry.js';
14
14
  import { uiTelemetryService } from '../telemetry/uiTelemetry.js';
15
15
  import { HookSystem } from '../hooks/hookSystem.js';
16
16
  import { createMockMessageBus } from '../test-utils/mock-message-bus.js';
17
+ import { createAvailabilityServiceMock } from '../availability/testUtils.js';
18
+ import * as policyHelpers from '../availability/policyHelpers.js';
19
+ import { makeResolvedModelConfig } from '../services/modelConfigServiceTestUtils.js';
20
+ import { fireBeforeModelHook, fireAfterModelHook, fireBeforeToolSelectionHook, } from './geminiChatHookTriggers.js';
21
+ // Mock hook triggers
22
+ vi.mock('./geminiChatHookTriggers.js', () => ({
23
+ fireBeforeModelHook: vi.fn(),
24
+ fireAfterModelHook: vi.fn(),
25
+ fireBeforeToolSelectionHook: vi.fn().mockResolvedValue({}),
26
+ }));
17
27
  // Mock fs module to prevent actual file system operations during tests
18
28
  const mockFileSystem = new Map();
19
29
  vi.mock('node:fs', () => {
@@ -31,6 +41,10 @@ vi.mock('node:fs', () => {
31
41
  });
32
42
  }),
33
43
  existsSync: vi.fn((path) => mockFileSystem.has(path)),
44
+ createWriteStream: vi.fn(() => ({
45
+ write: vi.fn(),
46
+ on: vi.fn(),
47
+ })),
34
48
  };
35
49
  return {
36
50
  default: fsModule,
@@ -44,9 +58,13 @@ const { mockHandleFallback } = vi.hoisted(() => ({
44
58
  const { mockRetryWithBackoff } = vi.hoisted(() => ({
45
59
  mockRetryWithBackoff: vi.fn(),
46
60
  }));
47
- vi.mock('../utils/retry.js', () => ({
48
- retryWithBackoff: mockRetryWithBackoff,
49
- }));
61
+ vi.mock('../utils/retry.js', async (importOriginal) => {
62
+ const actual = await importOriginal();
63
+ return {
64
+ ...actual,
65
+ retryWithBackoff: mockRetryWithBackoff,
66
+ };
67
+ });
50
68
  vi.mock('../fallback/handler.js', () => ({
51
69
  handleFallback: mockHandleFallback,
52
70
  }));
@@ -79,20 +97,32 @@ describe('GeminiChat', () => {
79
97
  };
80
98
  mockHandleFallback.mockClear();
81
99
  // Default mock implementation for tests that don't care about retry logic
82
- mockRetryWithBackoff.mockImplementation(async (apiCall) => apiCall());
100
+ mockRetryWithBackoff.mockImplementation(async (apiCall, options) => {
101
+ const result = await apiCall();
102
+ const context = options?.getAvailabilityContext?.();
103
+ if (context) {
104
+ context.service.markHealthy(context.policy.model);
105
+ }
106
+ return result;
107
+ });
108
+ let currentModel = 'gemini-pro';
109
+ let currentActiveModel = 'gemini-pro';
83
110
  mockConfig = {
84
111
  getSessionId: () => 'test-session-id',
85
112
  getTelemetryLogPromptsEnabled: () => true,
86
113
  getUsageStatisticsEnabled: () => true,
87
114
  getDebugMode: () => false,
88
115
  getPreviewFeatures: () => false,
89
- getContentGeneratorConfig: vi.fn().mockReturnValue({
90
- authType: 'oauth-personal', // Ensure this is set for fallback tests
91
- model: 'test-model',
116
+ getContentGeneratorConfig: vi.fn().mockImplementation(() => ({
117
+ authType: 'oauth-personal',
118
+ model: currentModel,
119
+ })),
120
+ getModel: vi.fn().mockImplementation(() => currentModel),
121
+ setModel: vi.fn().mockImplementation((m) => {
122
+ currentModel = m;
123
+ // When model is explicitly set, active model usually resets or updates to it
124
+ currentActiveModel = m;
92
125
  }),
93
- getModel: vi.fn().mockReturnValue('gemini-pro'),
94
- setModel: vi.fn(),
95
- isInFallbackMode: vi.fn().mockReturnValue(false),
96
126
  getQuotaErrorOccurred: vi.fn().mockReturnValue(false),
97
127
  setQuotaErrorOccurred: vi.fn(),
98
128
  flashFallbackHandler: undefined,
@@ -105,9 +135,11 @@ describe('GeminiChat', () => {
105
135
  }),
106
136
  getContentGenerator: vi.fn().mockReturnValue(mockContentGenerator),
107
137
  getRetryFetchErrors: vi.fn().mockReturnValue(false),
138
+ getUserTier: vi.fn().mockReturnValue(undefined),
108
139
  modelConfigService: {
109
140
  getResolvedConfig: vi.fn().mockImplementation((modelConfigKey) => {
110
- const thinkingConfig = modelConfigKey.model.startsWith('gemini-3')
141
+ const model = modelConfigKey.model ?? mockConfig.getModel();
142
+ const thinkingConfig = model.startsWith('gemini-3')
111
143
  ? {
112
144
  thinkingLevel: ThinkingLevel.HIGH,
113
145
  }
@@ -115,20 +147,23 @@ describe('GeminiChat', () => {
115
147
  thinkingBudget: DEFAULT_THINKING_MODE,
116
148
  };
117
149
  return {
118
- model: modelConfigKey.model,
150
+ model,
119
151
  generateContentConfig: {
120
- temperature: 0,
152
+ temperature: modelConfigKey.isRetry ? 1 : 0,
121
153
  thinkingConfig,
122
154
  },
123
155
  };
124
156
  }),
125
157
  },
126
- isPreviewModelBypassMode: vi.fn().mockReturnValue(false),
127
- setPreviewModelBypassMode: vi.fn(),
128
- isPreviewModelFallbackMode: vi.fn().mockReturnValue(false),
129
- setPreviewModelFallbackMode: vi.fn(),
130
158
  isInteractive: vi.fn().mockReturnValue(false),
131
159
  getEnableHooks: vi.fn().mockReturnValue(false),
160
+ getActiveModel: vi.fn().mockImplementation(() => currentActiveModel),
161
+ setActiveModel: vi
162
+ .fn()
163
+ .mockImplementation((m) => (currentActiveModel = m)),
164
+ getModelAvailabilityService: vi
165
+ .fn()
166
+ .mockReturnValue(createAvailabilityServiceMock()),
132
167
  };
133
168
  // Use proper MessageBus mocking for Phase 3 preparation
134
169
  const mockMessageBus = createMockMessageBus();
@@ -401,84 +436,6 @@ describe('GeminiChat', () => {
401
436
  expect(modelTurn?.parts?.length).toBe(1);
402
437
  expect(modelTurn?.parts[0].text).toBe('This is the visible text that should not be lost.');
403
438
  });
404
- it('should use maxAttempts=1 for retryWithBackoff when in Preview Model Fallback Mode', async () => {
405
- vi.mocked(mockConfig.isPreviewModelFallbackMode).mockReturnValue(true);
406
- vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue((async function* () {
407
- yield {
408
- candidates: [
409
- {
410
- content: { parts: [{ text: 'Success' }] },
411
- finishReason: 'STOP',
412
- },
413
- ],
414
- };
415
- })());
416
- const stream = await chat.sendMessageStream({ model: PREVIEW_GEMINI_MODEL }, 'test', 'prompt-id-fast-retry', new AbortController().signal);
417
- for await (const _ of stream) {
418
- // consume stream
419
- }
420
- expect(mockRetryWithBackoff).toHaveBeenCalledWith(expect.any(Function), expect.objectContaining({
421
- maxAttempts: 1,
422
- }));
423
- });
424
- it('should NOT use maxAttempts=1 for other models even in Preview Model Fallback Mode', async () => {
425
- vi.mocked(mockConfig.isPreviewModelFallbackMode).mockReturnValue(true);
426
- vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue((async function* () {
427
- yield {
428
- candidates: [
429
- {
430
- content: { parts: [{ text: 'Success' }] },
431
- finishReason: 'STOP',
432
- },
433
- ],
434
- };
435
- })());
436
- const stream = await chat.sendMessageStream({ model: DEFAULT_GEMINI_FLASH_MODEL }, 'test', 'prompt-id-normal-retry', new AbortController().signal);
437
- for await (const _ of stream) {
438
- // consume stream
439
- }
440
- expect(mockRetryWithBackoff).toHaveBeenCalledWith(expect.any(Function), expect.objectContaining({
441
- maxAttempts: undefined, // Should use default
442
- }));
443
- });
444
- it('should pass DEFAULT_GEMINI_MODEL to handleFallback when Preview Model is bypassed (downgraded)', async () => {
445
- // ARRANGE
446
- vi.mocked(mockConfig.isPreviewModelBypassMode).mockReturnValue(true);
447
- // Mock retryWithBackoff to simulate catching the error and calling onPersistent429
448
- vi.mocked(retryWithBackoff).mockImplementation(async (apiCall, options) => {
449
- const onPersistent429 = options?.onPersistent429;
450
- try {
451
- await apiCall();
452
- }
453
- catch (error) {
454
- if (onPersistent429) {
455
- await onPersistent429(AuthType.LOGIN_WITH_GOOGLE, error);
456
- }
457
- throw error;
458
- }
459
- });
460
- // We need the API call to fail so retryWithBackoff calls the callback.
461
- vi.mocked(mockContentGenerator.generateContentStream).mockRejectedValue(new TerminalQuotaError('Simulated Quota Error', {
462
- code: 429,
463
- message: 'Simulated Quota Error',
464
- details: [],
465
- }));
466
- // ACT
467
- const consumeStream = async () => {
468
- const stream = await chat.sendMessageStream({ model: PREVIEW_GEMINI_MODEL }, 'test', 'prompt-id-bypass', new AbortController().signal);
469
- // Consume the stream to trigger execution
470
- for await (const _ of stream) {
471
- // do nothing
472
- }
473
- };
474
- await expect(consumeStream()).rejects.toThrow('Simulated Quota Error');
475
- expect(retryWithBackoff).toHaveBeenCalled();
476
- // ASSERT
477
- // handleFallback is called via onPersistent429Callback
478
- // We verify it was called with DEFAULT_GEMINI_MODEL
479
- expect(mockHandleFallback).toHaveBeenCalledWith(expect.anything(), DEFAULT_GEMINI_MODEL, // This is the key assertion
480
- expect.anything(), expect.anything());
481
- });
482
439
  it('should throw an error when a tool call is followed by an empty stream response', async () => {
483
440
  // 1. Setup: A history where the model has just made a function call.
484
441
  const initialHistory = [
@@ -1295,30 +1252,6 @@ describe('GeminiChat', () => {
1295
1252
  }
1296
1253
  expect(turn4.parts[0].text).toBe('second response');
1297
1254
  });
1298
- describe('Model Resolution', () => {
1299
- const mockResponse = {
1300
- candidates: [
1301
- {
1302
- content: { parts: [{ text: 'response' }], role: 'model' },
1303
- finishReason: 'STOP',
1304
- },
1305
- ],
1306
- };
1307
- it('should use the FLASH model when in fallback mode (sendMessageStream)', async () => {
1308
- vi.mocked(mockConfig.getModel).mockReturnValue('gemini-pro');
1309
- vi.mocked(mockConfig.isInFallbackMode).mockReturnValue(true);
1310
- vi.mocked(mockContentGenerator.generateContentStream).mockImplementation(async () => (async function* () {
1311
- yield mockResponse;
1312
- })());
1313
- const stream = await chat.sendMessageStream({ model: 'test-model' }, 'test message', 'prompt-id-res3', new AbortController().signal);
1314
- for await (const _ of stream) {
1315
- // consume stream
1316
- }
1317
- expect(mockContentGenerator.generateContentStream).toHaveBeenCalledWith(expect.objectContaining({
1318
- model: DEFAULT_GEMINI_FLASH_MODEL,
1319
- }), 'prompt-id-res3');
1320
- });
1321
- });
1322
1255
  describe('Fallback Integration (Retries)', () => {
1323
1256
  const error429 = new ApiError({
1324
1257
  message: 'API Error 429: Quota exceeded',
@@ -1353,8 +1286,6 @@ describe('GeminiChat', () => {
1353
1286
  vi.mocked(mockConfig.getContentGeneratorConfig).mockReturnValue({
1354
1287
  authType,
1355
1288
  });
1356
- const isInFallbackModeSpy = vi.spyOn(mockConfig, 'isInFallbackMode');
1357
- isInFallbackModeSpy.mockReturnValue(false);
1358
1289
  vi.mocked(mockContentGenerator.generateContentStream)
1359
1290
  .mockRejectedValueOnce(error429) // Attempt 1 fails
1360
1291
  .mockResolvedValueOnce(
@@ -1369,10 +1300,7 @@ describe('GeminiChat', () => {
1369
1300
  ],
1370
1301
  };
1371
1302
  })());
1372
- mockHandleFallback.mockImplementation(async () => {
1373
- isInFallbackModeSpy.mockReturnValue(true);
1374
- return true; // Signal retry
1375
- });
1303
+ mockHandleFallback.mockImplementation(async () => true);
1376
1304
  const stream = await chat.sendMessageStream({ model: 'test-model' }, 'trigger 429', 'prompt-id-fb1', new AbortController().signal);
1377
1305
  // Consume stream to trigger logic
1378
1306
  for await (const _ of stream) {
@@ -1385,77 +1313,6 @@ describe('GeminiChat', () => {
1385
1313
  const modelTurn = history[1];
1386
1314
  expect(modelTurn.parts[0].text).toBe('Success on retry');
1387
1315
  });
1388
- it('should switch to DEFAULT_GEMINI_FLASH_MODEL and use thinkingBudget when falling back from a gemini-3 model', async () => {
1389
- // ARRANGE
1390
- const authType = AuthType.LOGIN_WITH_GOOGLE;
1391
- vi.mocked(mockConfig.getContentGeneratorConfig).mockReturnValue({
1392
- authType,
1393
- });
1394
- // Initial state: Not in fallback mode
1395
- const isInFallbackModeSpy = vi.spyOn(mockConfig, 'isInFallbackMode');
1396
- isInFallbackModeSpy.mockReturnValue(false);
1397
- // Mock API calls:
1398
- // 1. Fails with 429 (simulating gemini-3 failure)
1399
- // 2. Succeeds (simulating fallback success)
1400
- vi.mocked(mockContentGenerator.generateContentStream)
1401
- .mockRejectedValueOnce(error429)
1402
- .mockResolvedValueOnce((async function* () {
1403
- yield {
1404
- candidates: [
1405
- {
1406
- content: { parts: [{ text: 'Fallback success' }] },
1407
- finishReason: 'STOP',
1408
- },
1409
- ],
1410
- };
1411
- })());
1412
- // Mock handleFallback to enable fallback mode and signal retry
1413
- mockHandleFallback.mockImplementation(async () => {
1414
- isInFallbackModeSpy.mockReturnValue(true); // Next call will see fallback mode = true
1415
- return true;
1416
- });
1417
- // ACT
1418
- const stream = await chat.sendMessageStream({ model: 'gemini-3-test-model' }, // Start with a gemini-3 model
1419
- 'test fallback thinking', 'prompt-id-fb3', new AbortController().signal);
1420
- for await (const _ of stream) {
1421
- // consume stream
1422
- }
1423
- // ASSERT
1424
- expect(mockContentGenerator.generateContentStream).toHaveBeenCalledTimes(2);
1425
- // First call: gemini-3 model, thinkingLevel set
1426
- expect(mockContentGenerator.generateContentStream).toHaveBeenNthCalledWith(1, expect.objectContaining({
1427
- model: 'gemini-3-test-model',
1428
- config: expect.objectContaining({
1429
- thinkingConfig: {
1430
- thinkingBudget: undefined,
1431
- thinkingLevel: ThinkingLevel.HIGH,
1432
- },
1433
- }),
1434
- }), 'prompt-id-fb3');
1435
- // Second call: DEFAULT_GEMINI_FLASH_MODEL (due to fallback), thinkingBudget set (due to fix)
1436
- expect(mockContentGenerator.generateContentStream).toHaveBeenNthCalledWith(2, expect.objectContaining({
1437
- model: DEFAULT_GEMINI_FLASH_MODEL,
1438
- config: expect.objectContaining({
1439
- thinkingConfig: {
1440
- thinkingBudget: DEFAULT_THINKING_MODE,
1441
- thinkingLevel: undefined,
1442
- },
1443
- }),
1444
- }), 'prompt-id-fb3');
1445
- });
1446
- it('should stop retrying if handleFallback returns false (e.g., auth intent)', async () => {
1447
- vi.mocked(mockConfig.getModel).mockReturnValue('gemini-pro');
1448
- vi.mocked(mockContentGenerator.generateContentStream).mockRejectedValue(error429);
1449
- mockHandleFallback.mockResolvedValue(false);
1450
- const stream = await chat.sendMessageStream({ model: 'gemini-2.0-flash' }, 'test stop', 'prompt-id-fb2', new AbortController().signal);
1451
- await expect((async () => {
1452
- for await (const _ of stream) {
1453
- /* consume stream */
1454
- }
1455
- })()).rejects.toThrow(error429);
1456
- expect(mockContentGenerator.generateContentStream).toHaveBeenCalledTimes(1);
1457
- expect(mockHandleFallback).toHaveBeenCalledTimes(1);
1458
- });
1459
1316
  });
1460
1317
  it('should discard valid partial content from a failed attempt upon retry', async () => {
1461
1318
  // Mock the stream to fail on the first attempt after yielding some valid content.
@@ -1542,61 +1399,6 @@ describe('GeminiChat', () => {
1542
1399
  ]);
1543
1400
  });
1544
1401
  });
1545
- describe('Preview Model Fallback Logic', () => {
1546
- it('should reset previewModelBypassMode to false at the start of sendMessageStream', async () => {
1547
- const stream = (async function* () {
1548
- yield {
1549
- candidates: [
1550
- {
1551
- content: { role: 'model', parts: [{ text: 'Success' }] },
1552
- finishReason: 'STOP',
1553
- },
1554
- ],
1555
- };
1556
- })();
1557
- vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue(stream);
1558
- await chat.sendMessageStream({ model: 'test-model' }, 'test', 'prompt-id-preview-model-reset', new AbortController().signal);
1559
- expect(mockConfig.setPreviewModelBypassMode).toHaveBeenCalledWith(false);
1560
- });
1561
- it('should reset previewModelFallbackMode to false upon successful Preview Model usage', async () => {
1562
- const stream = (async function* () {
1563
- yield {
1564
- candidates: [
1565
- {
1566
- content: { role: 'model', parts: [{ text: 'Success' }] },
1567
- finishReason: 'STOP',
1568
- },
1569
- ],
1570
- };
1571
- })();
1572
- vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue(stream);
1573
- const resultStream = await chat.sendMessageStream({ model: PREVIEW_GEMINI_MODEL }, 'test', 'prompt-id-preview-model-healing', new AbortController().signal);
1574
- for await (const _ of resultStream) {
1575
- // consume stream
1576
- }
1577
- expect(mockConfig.setPreviewModelFallbackMode).toHaveBeenCalledWith(false);
1578
- });
1579
- it('should NOT reset previewModelFallbackMode if Preview Model was bypassed (downgraded)', async () => {
1580
- const stream = (async function* () {
1581
- yield {
1582
- candidates: [
1583
- {
1584
- content: { role: 'model', parts: [{ text: 'Success' }] },
1585
- finishReason: 'STOP',
1586
- },
1587
- ],
1588
- };
1589
- })();
1590
- vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue(stream);
1591
- // Simulate bypass mode being active (downgrade happened)
1592
- vi.mocked(mockConfig.isPreviewModelBypassMode).mockReturnValue(true);
1593
- const resultStream = await chat.sendMessageStream({ model: PREVIEW_GEMINI_MODEL }, 'test', 'prompt-id-bypass-no-healing', new AbortController().signal);
1594
- for await (const _ of resultStream) {
1595
- // consume stream
1596
- }
1597
- expect(mockConfig.setPreviewModelFallbackMode).not.toHaveBeenCalled();
1598
- });
1599
- });
1600
1402
  describe('ensureActiveLoopHasThoughtSignatures', () => {
1601
1403
  it('should add thoughtSignature to the first functionCall in each model turn of the active loop', () => {
1602
1404
  const chat = new GeminiChat(mockConfig, '', [], []);
@@ -1676,5 +1478,284 @@ describe('GeminiChat', () => {
1676
1478
  expect(newContents).toEqual(history);
1677
1479
  });
1678
1480
  });
1481
+ describe('Availability Service Integration', () => {
1482
+ let mockAvailabilityService;
1483
+ beforeEach(async () => {
1484
+ mockAvailabilityService = createAvailabilityServiceMock();
1485
+ vi.mocked(mockConfig.getModelAvailabilityService).mockReturnValue(mockAvailabilityService);
1486
+ // Stateful mock for activeModel
1487
+ let activeModel = 'model-a';
1488
+ vi.mocked(mockConfig.getActiveModel).mockImplementation(() => activeModel);
1489
+ vi.mocked(mockConfig.setActiveModel).mockImplementation((model) => {
1490
+ activeModel = model;
1491
+ });
1492
+ vi.spyOn(policyHelpers, 'resolvePolicyChain').mockReturnValue([
1493
+ {
1494
+ model: 'model-a',
1495
+ isLastResort: false,
1496
+ actions: {},
1497
+ stateTransitions: {},
1498
+ },
1499
+ {
1500
+ model: 'model-b',
1501
+ isLastResort: false,
1502
+ actions: {},
1503
+ stateTransitions: {},
1504
+ },
1505
+ {
1506
+ model: 'model-c',
1507
+ isLastResort: true,
1508
+ actions: {},
1509
+ stateTransitions: {},
1510
+ },
1511
+ ]);
1512
+ });
1513
+ it('should mark healthy on successful stream', async () => {
1514
+ vi.mocked(mockAvailabilityService.selectFirstAvailable).mockReturnValue({
1515
+ selectedModel: 'model-b',
1516
+ skipped: [],
1517
+ });
1518
+ // Simulate selection happening upstream
1519
+ mockConfig.setActiveModel('model-b');
1520
+ vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue((async function* () {
1521
+ yield {
1522
+ candidates: [
1523
+ {
1524
+ content: { parts: [{ text: 'Response' }], role: 'model' },
1525
+ finishReason: 'STOP',
1526
+ },
1527
+ ],
1528
+ };
1529
+ })());
1530
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-healthy', new AbortController().signal);
1531
+ for await (const _ of stream) {
1532
+ // consume
1533
+ }
1534
+ expect(mockAvailabilityService.markHealthy).toHaveBeenCalledWith('model-b');
1535
+ });
1536
+ it('caps retries to a single attempt when selection is sticky', async () => {
1537
+ vi.mocked(mockAvailabilityService.selectFirstAvailable).mockReturnValue({
1538
+ selectedModel: 'model-a',
1539
+ attempts: 1,
1540
+ skipped: [],
1541
+ });
1542
+ vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue((async function* () {
1543
+ yield {
1544
+ candidates: [
1545
+ {
1546
+ content: { parts: [{ text: 'Response' }], role: 'model' },
1547
+ finishReason: 'STOP',
1548
+ },
1549
+ ],
1550
+ };
1551
+ })());
1552
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-sticky-once', new AbortController().signal);
1553
+ for await (const _ of stream) {
1554
+ // consume
1555
+ }
1556
+ expect(mockRetryWithBackoff).toHaveBeenCalledWith(expect.any(Function), expect.objectContaining({ maxAttempts: 1 }));
1557
+ expect(mockAvailabilityService.consumeStickyAttempt).toHaveBeenCalledWith('model-a');
1558
+ });
1559
+ it('should pass attempted model to onPersistent429 callback which calls handleFallback', async () => {
1560
+ vi.mocked(mockAvailabilityService.selectFirstAvailable).mockReturnValue({
1561
+ selectedModel: 'model-a',
1562
+ skipped: [],
1563
+ });
1564
+ // Simulate selection happening upstream
1565
+ mockConfig.setActiveModel('model-a');
1566
+ // Simulate retry logic behavior: catch error, call onPersistent429
1567
+ const error = new TerminalQuotaError('Quota', {
1568
+ code: 429,
1569
+ message: 'quota',
1570
+ details: [],
1571
+ });
1572
+ vi.mocked(mockContentGenerator.generateContentStream).mockRejectedValue(error);
1573
+ // We need retryWithBackoff to trigger the callback
1574
+ mockRetryWithBackoff.mockImplementation(async (apiCall, options) => {
1575
+ try {
1576
+ await apiCall();
1577
+ }
1578
+ catch (e) {
1579
+ if (options?.onPersistent429) {
1580
+ await options.onPersistent429(AuthType.LOGIN_WITH_GOOGLE, e);
1581
+ }
1582
+ throw e; // throw anyway to end test
1583
+ }
1584
+ });
1585
+ const consume = async () => {
1586
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-fallback-arg', new AbortController().signal);
1587
+ for await (const _ of stream) {
1588
+ // consume
1589
+ }
1590
+ };
1591
+ await expect(consume()).rejects.toThrow();
1592
+ // handleFallback is called with the ATTEMPTED model (model-a), not the requested one (gemini-pro)
1593
+ expect(mockHandleFallback).toHaveBeenCalledWith(expect.anything(), 'model-a', expect.anything(), error);
1594
+ });
1595
+ it('re-resolves generateContentConfig when active model changes between retries', async () => {
1596
+ // Availability enabled with stateful active model
1597
+ let activeModel = 'model-a';
1598
+ vi.mocked(mockConfig.getActiveModel).mockImplementation(() => activeModel);
1599
+ vi.mocked(mockConfig.setActiveModel).mockImplementation((model) => {
1600
+ activeModel = model;
1601
+ });
1602
+ // Different configs per model
1603
+ vi.mocked(mockConfig.modelConfigService.getResolvedConfig).mockImplementation((key) => {
1604
+ if (key.model === 'model-a') {
1605
+ return makeResolvedModelConfig('model-a', { temperature: 0.1 });
1606
+ }
1607
+ if (key.model === 'model-b') {
1608
+ return makeResolvedModelConfig('model-b', { temperature: 0.9 });
1609
+ }
1610
+ // Default for the initial requested model in this test
1611
+ return makeResolvedModelConfig('model-a', { temperature: 0.1 });
1612
+ });
1613
+ // First attempt uses model-a, then simulate availability switching to model-b
1614
+ mockRetryWithBackoff.mockImplementation(async (apiCall) => {
1615
+ await apiCall(); // first attempt
1616
+ activeModel = 'model-b'; // simulate switch before retry
1617
+ return apiCall(); // second attempt
1618
+ });
1619
+ // Generators for each attempt
1620
+ const firstResponse = (async function* () {
1621
+ yield {
1622
+ candidates: [
1623
+ {
1624
+ content: { parts: [{ text: 'first' }], role: 'model' },
1625
+ finishReason: 'STOP',
1626
+ },
1627
+ ],
1628
+ };
1629
+ })();
1630
+ const secondResponse = (async function* () {
1631
+ yield {
1632
+ candidates: [
1633
+ {
1634
+ content: { parts: [{ text: 'second' }], role: 'model' },
1635
+ finishReason: 'STOP',
1636
+ },
1637
+ ],
1638
+ };
1639
+ })();
1640
+ vi.mocked(mockContentGenerator.generateContentStream)
1641
+ .mockResolvedValueOnce(firstResponse)
1642
+ .mockResolvedValueOnce(secondResponse);
1643
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-config-refresh', new AbortController().signal);
1644
+ // Consume to drive both attempts
1645
+ for await (const _ of stream) {
1646
+ // consume
1647
+ }
1648
+ expect(mockContentGenerator.generateContentStream).toHaveBeenNthCalledWith(1, expect.objectContaining({
1649
+ model: 'model-a',
1650
+ config: expect.objectContaining({ temperature: 0.1 }),
1651
+ }), expect.any(String));
1652
+ expect(mockContentGenerator.generateContentStream).toHaveBeenNthCalledWith(2, expect.objectContaining({
1653
+ model: 'model-b',
1654
+ config: expect.objectContaining({ temperature: 0.9 }),
1655
+ }), expect.any(String));
1656
+ });
1657
+ });
1658
+ describe('Hook execution control', () => {
1659
+ beforeEach(() => {
1660
+ vi.mocked(mockConfig.getEnableHooks).mockReturnValue(true);
1661
+ // Default to allowing execution
1662
+ vi.mocked(fireBeforeModelHook).mockResolvedValue({ blocked: false });
1663
+ vi.mocked(fireAfterModelHook).mockResolvedValue({
1664
+ response: {},
1665
+ });
1666
+ vi.mocked(fireBeforeToolSelectionHook).mockResolvedValue({});
1667
+ });
1668
+ it('should yield AGENT_EXECUTION_STOPPED when BeforeModel hook stops execution', async () => {
1669
+ vi.mocked(fireBeforeModelHook).mockResolvedValue({
1670
+ blocked: true,
1671
+ stopped: true,
1672
+ reason: 'stopped by hook',
1673
+ });
1674
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-id', new AbortController().signal);
1675
+ const events = [];
1676
+ for await (const event of stream) {
1677
+ events.push(event);
1678
+ }
1679
+ expect(events).toHaveLength(1);
1680
+ expect(events[0]).toEqual({
1681
+ type: StreamEventType.AGENT_EXECUTION_STOPPED,
1682
+ reason: 'stopped by hook',
1683
+ });
1684
+ });
1685
+ it('should yield AGENT_EXECUTION_BLOCKED and synthetic response when BeforeModel hook blocks execution', async () => {
1686
+ const syntheticResponse = {
1687
+ candidates: [{ content: { parts: [{ text: 'blocked' }] } }],
1688
+ };
1689
+ vi.mocked(fireBeforeModelHook).mockResolvedValue({
1690
+ blocked: true,
1691
+ reason: 'blocked by hook',
1692
+ syntheticResponse,
1693
+ });
1694
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-id', new AbortController().signal);
1695
+ const events = [];
1696
+ for await (const event of stream) {
1697
+ events.push(event);
1698
+ }
1699
+ expect(events).toHaveLength(2);
1700
+ expect(events[0]).toEqual({
1701
+ type: StreamEventType.AGENT_EXECUTION_BLOCKED,
1702
+ reason: 'blocked by hook',
1703
+ });
1704
+ expect(events[1]).toEqual({
1705
+ type: StreamEventType.CHUNK,
1706
+ value: syntheticResponse,
1707
+ });
1708
+ });
1709
+ it('should yield AGENT_EXECUTION_STOPPED when AfterModel hook stops execution', async () => {
1710
+ // Mock content generator to return a stream
1711
+ vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue((async function* () {
1712
+ yield {
1713
+ candidates: [{ content: { parts: [{ text: 'response' }] } }],
1714
+ };
1715
+ })());
1716
+ vi.mocked(fireAfterModelHook).mockResolvedValue({
1717
+ response: {},
1718
+ stopped: true,
1719
+ reason: 'stopped by after hook',
1720
+ });
1721
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-id', new AbortController().signal);
1722
+ const events = [];
1723
+ for await (const event of stream) {
1724
+ events.push(event);
1725
+ }
1726
+ expect(events).toContainEqual({
1727
+ type: StreamEventType.AGENT_EXECUTION_STOPPED,
1728
+ reason: 'stopped by after hook',
1729
+ });
1730
+ });
1731
+ it('should yield AGENT_EXECUTION_BLOCKED and response when AfterModel hook blocks execution', async () => {
1732
+ const response = {
1733
+ candidates: [{ content: { parts: [{ text: 'response' }] } }],
1734
+ };
1735
+ // Mock content generator to return a stream
1736
+ vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue((async function* () {
1737
+ yield response;
1738
+ })());
1739
+ vi.mocked(fireAfterModelHook).mockResolvedValue({
1740
+ response,
1741
+ blocked: true,
1742
+ reason: 'blocked by after hook',
1743
+ });
1744
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, 'test', 'prompt-id', new AbortController().signal);
1745
+ const events = [];
1746
+ for await (const event of stream) {
1747
+ events.push(event);
1748
+ }
1749
+ expect(events).toContainEqual({
1750
+ type: StreamEventType.AGENT_EXECUTION_BLOCKED,
1751
+ reason: 'blocked by after hook',
1752
+ });
1753
+ // Should also contain the chunk (hook response)
1754
+ expect(events).toContainEqual({
1755
+ type: StreamEventType.CHUNK,
1756
+ value: response,
1757
+ });
1758
+ });
1759
+ });
1679
1760
  });
1680
1761
  //# sourceMappingURL=geminiChat.test.js.map