@google/gemini-cli-core 0.30.0-preview.6 → 0.31.0-preview.0

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 (687) hide show
  1. package/README.md +1 -1
  2. package/dist/docs/CONTRIBUTING.md +6 -7
  3. package/dist/docs/changelogs/index.md +22 -2
  4. package/dist/docs/changelogs/latest.md +359 -293
  5. package/dist/docs/changelogs/preview.md +300 -349
  6. package/dist/docs/cli/cli-reference.md +23 -23
  7. package/dist/docs/cli/enterprise.md +7 -7
  8. package/dist/docs/cli/gemini-md.md +1 -1
  9. package/dist/docs/cli/model.md +1 -1
  10. package/dist/docs/cli/plan-mode.md +180 -80
  11. package/dist/docs/cli/sandbox.md +3 -3
  12. package/dist/docs/cli/settings.md +59 -51
  13. package/dist/docs/cli/telemetry.md +4 -1
  14. package/dist/docs/cli/themes.md +3 -3
  15. package/dist/docs/cli/trusted-folders.md +31 -0
  16. package/dist/docs/cli/tutorials/memory-management.md +2 -2
  17. package/dist/docs/cli/tutorials/session-management.md +1 -1
  18. package/dist/docs/core/index.md +7 -7
  19. package/dist/docs/core/subagents.md +155 -39
  20. package/dist/docs/extensions/reference.md +38 -14
  21. package/dist/docs/get-started/authentication.md +4 -4
  22. package/dist/docs/get-started/examples.md +2 -2
  23. package/dist/docs/get-started/gemini-3.md +17 -3
  24. package/dist/docs/get-started/index.md +11 -2
  25. package/dist/docs/hooks/best-practices.md +1 -1
  26. package/dist/docs/hooks/reference.md +8 -0
  27. package/dist/docs/ide-integration/index.md +14 -0
  28. package/dist/docs/index.md +62 -67
  29. package/dist/docs/redirects.json +19 -0
  30. package/dist/docs/{cli → reference}/commands.md +67 -11
  31. package/dist/docs/{get-started → reference}/configuration.md +93 -24
  32. package/dist/docs/{cli → reference}/keyboard-shortcuts.md +3 -3
  33. package/dist/docs/{core → reference}/policy-engine.md +63 -27
  34. package/dist/docs/{faq.md → resources/faq.md} +1 -1
  35. package/dist/docs/{quota-and-pricing.md → resources/quota-and-pricing.md} +12 -5
  36. package/dist/docs/{tos-privacy.md → resources/tos-privacy.md} +2 -2
  37. package/dist/docs/{troubleshooting.md → resources/troubleshooting.md} +1 -1
  38. package/dist/docs/sidebar.json +203 -166
  39. package/dist/docs/tools/file-system.md +7 -4
  40. package/dist/docs/tools/index.md +5 -2
  41. package/dist/docs/tools/internal-docs.md +5 -5
  42. package/dist/docs/tools/mcp-server.md +62 -2
  43. package/dist/docs/tools/planning.md +2 -0
  44. package/dist/docs/tools/shell.md +3 -3
  45. package/dist/src/agents/a2a-client-manager.test.js +1 -2
  46. package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
  47. package/dist/src/agents/a2aUtils.d.ts +1 -5
  48. package/dist/src/agents/a2aUtils.js +1 -1
  49. package/dist/src/agents/a2aUtils.js.map +1 -1
  50. package/dist/src/agents/acknowledgedAgents.js +1 -0
  51. package/dist/src/agents/acknowledgedAgents.js.map +1 -1
  52. package/dist/src/agents/agent-scheduler.js +1 -0
  53. package/dist/src/agents/agent-scheduler.js.map +1 -1
  54. package/dist/src/agents/agentLoader.d.ts +0 -1
  55. package/dist/src/agents/agentLoader.js +22 -21
  56. package/dist/src/agents/agentLoader.js.map +1 -1
  57. package/dist/src/agents/agentLoader.test.js +1 -5
  58. package/dist/src/agents/agentLoader.test.js.map +1 -1
  59. package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
  60. package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
  61. package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
  62. package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
  63. package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
  64. package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
  65. package/dist/src/agents/auth-provider/base-provider.d.ts +2 -2
  66. package/dist/src/agents/auth-provider/base-provider.js.map +1 -1
  67. package/dist/src/agents/auth-provider/factory.js +6 -3
  68. package/dist/src/agents/auth-provider/factory.js.map +1 -1
  69. package/dist/src/agents/auth-provider/factory.test.js +12 -0
  70. package/dist/src/agents/auth-provider/factory.test.js.map +1 -1
  71. package/dist/src/agents/auth-provider/types.d.ts +2 -4
  72. package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
  73. package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
  74. package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
  75. package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
  76. package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
  77. package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
  78. package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
  79. package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
  80. package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
  81. package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
  82. package/dist/src/agents/browser/browserAgentFactory.js +107 -0
  83. package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
  84. package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
  85. package/dist/src/agents/browser/browserAgentFactory.test.js +186 -0
  86. package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
  87. package/dist/src/agents/browser/browserAgentInvocation.d.ts +44 -0
  88. package/dist/src/agents/browser/browserAgentInvocation.js +109 -0
  89. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
  90. package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
  91. package/dist/src/agents/browser/browserAgentInvocation.test.js +87 -0
  92. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
  93. package/dist/src/agents/browser/browserManager.d.ts +110 -0
  94. package/dist/src/agents/browser/browserManager.js +323 -0
  95. package/dist/src/agents/browser/browserManager.js.map +1 -0
  96. package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
  97. package/dist/src/agents/browser/browserManager.test.js +314 -0
  98. package/dist/src/agents/browser/browserManager.test.js.map +1 -0
  99. package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
  100. package/dist/src/agents/browser/mcpToolWrapper.js +356 -0
  101. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
  102. package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
  103. package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
  104. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
  105. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
  106. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +57 -0
  107. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
  108. package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
  109. package/dist/src/agents/browser/modelAvailability.js +23 -0
  110. package/dist/src/agents/browser/modelAvailability.js.map +1 -0
  111. package/dist/src/agents/local-executor.js +73 -31
  112. package/dist/src/agents/local-executor.js.map +1 -1
  113. package/dist/src/agents/local-executor.test.js +157 -4
  114. package/dist/src/agents/local-executor.test.js.map +1 -1
  115. package/dist/src/agents/local-invocation.test.js.map +1 -1
  116. package/dist/src/agents/registry.js +8 -0
  117. package/dist/src/agents/registry.js.map +1 -1
  118. package/dist/src/agents/registry.test.js.map +1 -1
  119. package/dist/src/agents/remote-invocation.d.ts +2 -1
  120. package/dist/src/agents/remote-invocation.js +3 -3
  121. package/dist/src/agents/remote-invocation.js.map +1 -1
  122. package/dist/src/agents/subagent-tool-wrapper.js +6 -0
  123. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  124. package/dist/src/agents/subagent-tool.d.ts +3 -0
  125. package/dist/src/agents/subagent-tool.js +62 -3
  126. package/dist/src/agents/subagent-tool.js.map +1 -1
  127. package/dist/src/agents/subagent-tool.test.js +143 -0
  128. package/dist/src/agents/subagent-tool.test.js.map +1 -1
  129. package/dist/src/availability/fallbackIntegration.test.js +4 -1
  130. package/dist/src/availability/fallbackIntegration.test.js.map +1 -1
  131. package/dist/src/availability/policyHelpers.js +3 -1
  132. package/dist/src/availability/policyHelpers.js.map +1 -1
  133. package/dist/src/availability/policyHelpers.test.js +51 -5
  134. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  135. package/dist/src/code_assist/admin/admin_controls.js +1 -0
  136. package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
  137. package/dist/src/code_assist/converter.js +8 -2
  138. package/dist/src/code_assist/converter.js.map +1 -1
  139. package/dist/src/code_assist/converter.test.js.map +1 -1
  140. package/dist/src/code_assist/experiments/experiments.js +1 -1
  141. package/dist/src/code_assist/experiments/experiments.js.map +1 -1
  142. package/dist/src/code_assist/oauth-credential-storage.js +1 -1
  143. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  144. package/dist/src/code_assist/oauth-credential-storage.test.js +5 -0
  145. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  146. package/dist/src/code_assist/oauth2.js +11 -8
  147. package/dist/src/code_assist/oauth2.js.map +1 -1
  148. package/dist/src/code_assist/oauth2.test.js +55 -0
  149. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  150. package/dist/src/code_assist/server.js +22 -13
  151. package/dist/src/code_assist/server.js.map +1 -1
  152. package/dist/src/code_assist/server.test.js +26 -0
  153. package/dist/src/code_assist/server.test.js.map +1 -1
  154. package/dist/src/code_assist/telemetry.js +16 -3
  155. package/dist/src/code_assist/telemetry.js.map +1 -1
  156. package/dist/src/code_assist/telemetry.test.js +10 -0
  157. package/dist/src/code_assist/telemetry.test.js.map +1 -1
  158. package/dist/src/code_assist/types.d.ts +13 -12
  159. package/dist/src/code_assist/types.js.map +1 -1
  160. package/dist/src/config/config.d.ts +83 -8
  161. package/dist/src/config/config.js +127 -23
  162. package/dist/src/config/config.js.map +1 -1
  163. package/dist/src/config/config.test.js +285 -10
  164. package/dist/src/config/config.test.js.map +1 -1
  165. package/dist/src/config/projectRegistry.js +1 -0
  166. package/dist/src/config/projectRegistry.js.map +1 -1
  167. package/dist/src/config/storage.d.ts +17 -1
  168. package/dist/src/config/storage.js +82 -2
  169. package/dist/src/config/storage.js.map +1 -1
  170. package/dist/src/config/storage.test.js +149 -2
  171. package/dist/src/config/storage.test.js.map +1 -1
  172. package/dist/src/config/userHintService.d.ts +46 -0
  173. package/dist/src/config/userHintService.js +81 -0
  174. package/dist/src/config/userHintService.js.map +1 -0
  175. package/dist/src/config/userHintService.test.d.ts +6 -0
  176. package/dist/src/config/userHintService.test.js +62 -0
  177. package/dist/src/config/userHintService.test.js.map +1 -0
  178. package/dist/src/confirmation-bus/message-bus.js +15 -3
  179. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  180. package/dist/src/confirmation-bus/message-bus.test.js +15 -0
  181. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
  182. package/dist/src/confirmation-bus/types.d.ts +7 -0
  183. package/dist/src/confirmation-bus/types.js.map +1 -1
  184. package/dist/src/core/baseLlmClient.d.ts +2 -3
  185. package/dist/src/core/baseLlmClient.js +7 -5
  186. package/dist/src/core/baseLlmClient.js.map +1 -1
  187. package/dist/src/core/baseLlmClient.test.js +45 -20
  188. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  189. package/dist/src/core/client.js +18 -7
  190. package/dist/src/core/client.js.map +1 -1
  191. package/dist/src/core/coreToolHookTriggers.d.ts +2 -3
  192. package/dist/src/core/coreToolHookTriggers.js +8 -3
  193. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  194. package/dist/src/core/coreToolScheduler.js +2 -1
  195. package/dist/src/core/coreToolScheduler.js.map +1 -1
  196. package/dist/src/core/coreToolScheduler.test.js +10 -3
  197. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  198. package/dist/src/core/fakeContentGenerator.js +2 -0
  199. package/dist/src/core/fakeContentGenerator.js.map +1 -1
  200. package/dist/src/core/geminiChat.d.ts +1 -1
  201. package/dist/src/core/geminiChat.js +5 -5
  202. package/dist/src/core/geminiChat.js.map +1 -1
  203. package/dist/src/core/geminiChat.test.js +1 -0
  204. package/dist/src/core/geminiChat.test.js.map +1 -1
  205. package/dist/src/core/geminiChat_network_retry.test.js +1 -0
  206. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  207. package/dist/src/core/logger.js +2 -0
  208. package/dist/src/core/logger.js.map +1 -1
  209. package/dist/src/core/loggingContentGenerator.d.ts +14 -2
  210. package/dist/src/core/loggingContentGenerator.js +98 -4
  211. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  212. package/dist/src/core/loggingContentGenerator.test.js +275 -1
  213. package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
  214. package/dist/src/core/prompts.test.js +55 -27
  215. package/dist/src/core/prompts.test.js.map +1 -1
  216. package/dist/src/core/recordingContentGenerator.test.js +5 -0
  217. package/dist/src/core/recordingContentGenerator.test.js.map +1 -1
  218. package/dist/src/core/turn.d.ts +4 -2
  219. package/dist/src/core/turn.js +2 -0
  220. package/dist/src/core/turn.js.map +1 -1
  221. package/dist/src/core/turn.test.js +4 -1
  222. package/dist/src/core/turn.test.js.map +1 -1
  223. package/dist/src/generated/git-commit.d.ts +2 -2
  224. package/dist/src/generated/git-commit.js +2 -2
  225. package/dist/src/hooks/hookAggregator.d.ts +1 -2
  226. package/dist/src/hooks/hookAggregator.js +1 -2
  227. package/dist/src/hooks/hookAggregator.js.map +1 -1
  228. package/dist/src/hooks/hookEventHandler.d.ts +2 -2
  229. package/dist/src/hooks/hookEventHandler.js +13 -4
  230. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  231. package/dist/src/hooks/hookEventHandler.test.js +1 -2
  232. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  233. package/dist/src/hooks/hookPlanner.d.ts +1 -2
  234. package/dist/src/hooks/hookPlanner.js.map +1 -1
  235. package/dist/src/hooks/hookRegistry.d.ts +8 -0
  236. package/dist/src/hooks/hookRegistry.js +31 -3
  237. package/dist/src/hooks/hookRegistry.js.map +1 -1
  238. package/dist/src/hooks/hookRegistry.test.js.map +1 -1
  239. package/dist/src/hooks/hookRunner.d.ts +5 -2
  240. package/dist/src/hooks/hookRunner.js +52 -2
  241. package/dist/src/hooks/hookRunner.js.map +1 -1
  242. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  243. package/dist/src/hooks/hookSystem.d.ts +11 -3
  244. package/dist/src/hooks/hookSystem.js +10 -4
  245. package/dist/src/hooks/hookSystem.js.map +1 -1
  246. package/dist/src/hooks/hookSystem.test.js +1 -0
  247. package/dist/src/hooks/hookSystem.test.js.map +1 -1
  248. package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
  249. package/dist/src/hooks/runtimeHooks.test.js +100 -0
  250. package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
  251. package/dist/src/hooks/trustedHooks.js +6 -1
  252. package/dist/src/hooks/trustedHooks.js.map +1 -1
  253. package/dist/src/hooks/trustedHooks.test.js +17 -9
  254. package/dist/src/hooks/trustedHooks.test.js.map +1 -1
  255. package/dist/src/hooks/types.d.ts +49 -8
  256. package/dist/src/hooks/types.js +20 -1
  257. package/dist/src/hooks/types.js.map +1 -1
  258. package/dist/src/ide/detect-ide.d.ts +0 -1
  259. package/dist/src/ide/detect-ide.js +1 -1
  260. package/dist/src/ide/detect-ide.js.map +1 -1
  261. package/dist/src/ide/ide-client.js +3 -2
  262. package/dist/src/ide/ide-client.js.map +1 -1
  263. package/dist/src/ide/ide-connection-utils.js +90 -14
  264. package/dist/src/ide/ide-connection-utils.js.map +1 -1
  265. package/dist/src/ide/ide-connection-utils.test.js +78 -0
  266. package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
  267. package/dist/src/ide/ide-installer.test.js +1 -2
  268. package/dist/src/ide/ide-installer.test.js.map +1 -1
  269. package/dist/src/ide/process-utils.d.ts +7 -0
  270. package/dist/src/ide/process-utils.js +20 -0
  271. package/dist/src/ide/process-utils.js.map +1 -1
  272. package/dist/src/ide/process-utils.test.js +30 -0
  273. package/dist/src/ide/process-utils.test.js.map +1 -1
  274. package/dist/src/index.d.ts +6 -1
  275. package/dist/src/index.js +6 -1
  276. package/dist/src/index.js.map +1 -1
  277. package/dist/src/mcp/oauth-provider.d.ts +1 -1
  278. package/dist/src/mcp/oauth-provider.js +8 -7
  279. package/dist/src/mcp/oauth-provider.js.map +1 -1
  280. package/dist/src/mcp/oauth-provider.test.js +34 -2
  281. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  282. package/dist/src/mcp/oauth-utils.js +2 -0
  283. package/dist/src/mcp/oauth-utils.js.map +1 -1
  284. package/dist/src/mcp/oauth-utils.test.js +12 -0
  285. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  286. package/dist/src/mcp/token-storage/file-token-storage.js +4 -1
  287. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  288. package/dist/src/mcp/token-storage/file-token-storage.test.js +40 -2
  289. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  290. package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -0
  291. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  292. package/dist/src/policy/config.d.ts +18 -9
  293. package/dist/src/policy/config.js +75 -54
  294. package/dist/src/policy/config.js.map +1 -1
  295. package/dist/src/policy/config.test.js +26 -26
  296. package/dist/src/policy/integrity.d.ts +45 -0
  297. package/dist/src/policy/integrity.js +121 -0
  298. package/dist/src/policy/integrity.js.map +1 -0
  299. package/dist/src/policy/integrity.test.d.ts +6 -0
  300. package/dist/src/policy/integrity.test.js +132 -0
  301. package/dist/src/policy/integrity.test.js.map +1 -0
  302. package/dist/src/policy/persistence.test.js +29 -19
  303. package/dist/src/policy/persistence.test.js.map +1 -1
  304. package/dist/src/policy/policies/conseca.toml +6 -0
  305. package/dist/src/policy/policies/plan.toml +28 -12
  306. package/dist/src/policy/policies/read-only.toml +11 -10
  307. package/dist/src/policy/policies/write.toml +11 -10
  308. package/dist/src/policy/policies/yolo.toml +11 -10
  309. package/dist/src/policy/policy-engine.d.ts +16 -3
  310. package/dist/src/policy/policy-engine.js +154 -29
  311. package/dist/src/policy/policy-engine.js.map +1 -1
  312. package/dist/src/policy/policy-engine.test.js +480 -9
  313. package/dist/src/policy/policy-engine.test.js.map +1 -1
  314. package/dist/src/policy/policy-updater.test.js +11 -6
  315. package/dist/src/policy/policy-updater.test.js.map +1 -1
  316. package/dist/src/policy/toml-loader.d.ts +13 -2
  317. package/dist/src/policy/toml-loader.js +55 -34
  318. package/dist/src/policy/toml-loader.js.map +1 -1
  319. package/dist/src/policy/toml-loader.test.js +115 -7
  320. package/dist/src/policy/toml-loader.test.js.map +1 -1
  321. package/dist/src/policy/types.d.ts +18 -1
  322. package/dist/src/policy/types.js +1 -0
  323. package/dist/src/policy/types.js.map +1 -1
  324. package/dist/src/policy/workspace-policy.test.d.ts +6 -0
  325. package/dist/src/policy/workspace-policy.test.js +231 -0
  326. package/dist/src/policy/workspace-policy.test.js.map +1 -0
  327. package/dist/src/prompts/promptProvider.js +11 -13
  328. package/dist/src/prompts/promptProvider.js.map +1 -1
  329. package/dist/src/prompts/promptProvider.test.js +64 -3
  330. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  331. package/dist/src/prompts/snippets.js +41 -10
  332. package/dist/src/prompts/snippets.js.map +1 -1
  333. package/dist/src/prompts/snippets.legacy.js +1 -0
  334. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  335. package/dist/src/routing/modelRouterService.js +3 -1
  336. package/dist/src/routing/modelRouterService.js.map +1 -1
  337. package/dist/src/routing/modelRouterService.test.js +12 -6
  338. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  339. package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
  340. package/dist/src/routing/strategies/approvalModeStrategy.js +58 -0
  341. package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
  342. package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
  343. package/dist/src/routing/strategies/approvalModeStrategy.test.js +110 -0
  344. package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
  345. package/dist/src/safety/checker-runner.js +1 -0
  346. package/dist/src/safety/checker-runner.js.map +1 -1
  347. package/dist/src/safety/conseca/conseca.d.ts +31 -0
  348. package/dist/src/safety/conseca/conseca.js +105 -0
  349. package/dist/src/safety/conseca/conseca.js.map +1 -0
  350. package/dist/src/safety/conseca/conseca.test.d.ts +6 -0
  351. package/dist/src/safety/conseca/conseca.test.js +226 -0
  352. package/dist/src/safety/conseca/conseca.test.js.map +1 -0
  353. package/dist/src/safety/conseca/integration.test.d.ts +6 -0
  354. package/dist/src/safety/conseca/integration.test.js +19 -0
  355. package/dist/src/safety/conseca/integration.test.js.map +1 -0
  356. package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
  357. package/dist/src/safety/conseca/policy-enforcer.js +135 -0
  358. package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
  359. package/dist/src/safety/conseca/policy-enforcer.test.d.ts +6 -0
  360. package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
  361. package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
  362. package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
  363. package/dist/src/safety/conseca/policy-generator.js +144 -0
  364. package/dist/src/safety/conseca/policy-generator.js.map +1 -0
  365. package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
  366. package/dist/src/safety/conseca/policy-generator.test.js +84 -0
  367. package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
  368. package/dist/src/safety/conseca/types.d.ts +15 -0
  369. package/dist/src/safety/conseca/types.js +7 -0
  370. package/dist/src/safety/conseca/types.js.map +1 -0
  371. package/dist/src/safety/context-builder.d.ts +3 -3
  372. package/dist/src/safety/context-builder.js +60 -4
  373. package/dist/src/safety/context-builder.js.map +1 -1
  374. package/dist/src/safety/context-builder.test.js +98 -18
  375. package/dist/src/safety/context-builder.test.js.map +1 -1
  376. package/dist/src/safety/protocol.d.ts +4 -0
  377. package/dist/src/safety/registry.d.ts +2 -1
  378. package/dist/src/safety/registry.js +14 -4
  379. package/dist/src/safety/registry.js.map +1 -1
  380. package/dist/src/safety/registry.test.js +5 -2
  381. package/dist/src/safety/registry.test.js.map +1 -1
  382. package/dist/src/scheduler/confirmation.d.ts +0 -13
  383. package/dist/src/scheduler/confirmation.js +1 -1
  384. package/dist/src/scheduler/confirmation.js.map +1 -1
  385. package/dist/src/scheduler/policy.js +6 -2
  386. package/dist/src/scheduler/policy.js.map +1 -1
  387. package/dist/src/scheduler/policy.test.js +4 -3
  388. package/dist/src/scheduler/policy.test.js.map +1 -1
  389. package/dist/src/scheduler/scheduler.d.ts +3 -1
  390. package/dist/src/scheduler/scheduler.js +148 -28
  391. package/dist/src/scheduler/scheduler.js.map +1 -1
  392. package/dist/src/scheduler/scheduler.test.js +341 -242
  393. package/dist/src/scheduler/scheduler.test.js.map +1 -1
  394. package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
  395. package/dist/src/scheduler/scheduler_parallel.test.js +309 -0
  396. package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
  397. package/dist/src/scheduler/state-manager.d.ts +8 -0
  398. package/dist/src/scheduler/state-manager.js +30 -2
  399. package/dist/src/scheduler/state-manager.js.map +1 -1
  400. package/dist/src/scheduler/state-manager.test.js +61 -0
  401. package/dist/src/scheduler/state-manager.test.js.map +1 -1
  402. package/dist/src/scheduler/tool-executor.js +15 -7
  403. package/dist/src/scheduler/tool-executor.js.map +1 -1
  404. package/dist/src/scheduler/tool-executor.test.js +1 -1
  405. package/dist/src/scheduler/tool-executor.test.js.map +1 -1
  406. package/dist/src/scheduler/types.d.ts +23 -0
  407. package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
  408. package/dist/src/services/FolderTrustDiscoveryService.js +167 -0
  409. package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
  410. package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
  411. package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
  412. package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
  413. package/dist/src/services/chatCompressionService.d.ts +0 -14
  414. package/dist/src/services/chatCompressionService.js +29 -7
  415. package/dist/src/services/chatCompressionService.js.map +1 -1
  416. package/dist/src/services/chatCompressionService.test.js +3 -1
  417. package/dist/src/services/chatCompressionService.test.js.map +1 -1
  418. package/dist/src/services/chatRecordingService.d.ts +7 -1
  419. package/dist/src/services/chatRecordingService.js +12 -1
  420. package/dist/src/services/chatRecordingService.js.map +1 -1
  421. package/dist/src/services/chatRecordingService.test.js +34 -0
  422. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  423. package/dist/src/services/loopDetectionService.js +1 -2
  424. package/dist/src/services/loopDetectionService.js.map +1 -1
  425. package/dist/src/services/sessionSummaryUtils.js +3 -0
  426. package/dist/src/services/sessionSummaryUtils.js.map +1 -1
  427. package/dist/src/services/shellExecutionService.js +6 -0
  428. package/dist/src/services/shellExecutionService.js.map +1 -1
  429. package/dist/src/skills/skillLoader.js +2 -2
  430. package/dist/src/skills/skillLoader.js.map +1 -1
  431. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +3 -1
  432. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +35 -4
  433. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  434. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +0 -1
  435. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +19 -5
  436. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  437. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +14 -1
  438. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +29 -1
  439. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  440. package/dist/src/telemetry/conseca-logger.d.ts +9 -0
  441. package/dist/src/telemetry/conseca-logger.js +91 -0
  442. package/dist/src/telemetry/conseca-logger.js.map +1 -0
  443. package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
  444. package/dist/src/telemetry/conseca-logger.test.js +89 -0
  445. package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
  446. package/dist/src/telemetry/gcp-exporters.js +1 -2
  447. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  448. package/dist/src/telemetry/index.d.ts +2 -1
  449. package/dist/src/telemetry/index.js +2 -1
  450. package/dist/src/telemetry/index.js.map +1 -1
  451. package/dist/src/telemetry/integration.test.circular.js +3 -0
  452. package/dist/src/telemetry/integration.test.circular.js.map +1 -1
  453. package/dist/src/telemetry/loggers.d.ts +1 -2
  454. package/dist/src/telemetry/loggers.js +3 -13
  455. package/dist/src/telemetry/loggers.js.map +1 -1
  456. package/dist/src/telemetry/loggers.test.circular.js +3 -0
  457. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  458. package/dist/src/telemetry/loggers.test.js +6 -5
  459. package/dist/src/telemetry/loggers.test.js.map +1 -1
  460. package/dist/src/telemetry/metrics.d.ts +1 -3
  461. package/dist/src/telemetry/metrics.js +3 -2
  462. package/dist/src/telemetry/metrics.js.map +1 -1
  463. package/dist/src/telemetry/metrics.test.js +7 -3
  464. package/dist/src/telemetry/metrics.test.js.map +1 -1
  465. package/dist/src/telemetry/sanitize.test.js +19 -18
  466. package/dist/src/telemetry/sanitize.test.js.map +1 -1
  467. package/dist/src/telemetry/semantic.d.ts +7 -9
  468. package/dist/src/telemetry/semantic.js +8 -8
  469. package/dist/src/telemetry/semantic.js.map +1 -1
  470. package/dist/src/telemetry/types.d.ts +42 -4
  471. package/dist/src/telemetry/types.js +87 -2
  472. package/dist/src/telemetry/types.js.map +1 -1
  473. package/dist/src/telemetry/uiTelemetry.d.ts +1 -2
  474. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  475. package/dist/src/telemetry/uiTelemetry.test.js +1 -2
  476. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  477. package/dist/src/tools/ask-user.test.js +1 -19
  478. package/dist/src/tools/ask-user.test.js.map +1 -1
  479. package/dist/src/tools/confirmation-policy.test.js +14 -17
  480. package/dist/src/tools/confirmation-policy.test.js.map +1 -1
  481. package/dist/src/tools/definitions/dynamic-declaration-helpers.js +1 -1
  482. package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
  483. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +14 -16
  484. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  485. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +24 -59
  486. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  487. package/dist/src/tools/diff-utils.d.ts +9 -0
  488. package/dist/src/tools/diff-utils.js +66 -0
  489. package/dist/src/tools/diff-utils.js.map +1 -0
  490. package/dist/src/tools/diff-utils.test.d.ts +6 -0
  491. package/dist/src/tools/diff-utils.test.js +53 -0
  492. package/dist/src/tools/diff-utils.test.js.map +1 -0
  493. package/dist/src/tools/edit.d.ts +9 -4
  494. package/dist/src/tools/edit.js +203 -34
  495. package/dist/src/tools/edit.js.map +1 -1
  496. package/dist/src/tools/edit.test.js +225 -10
  497. package/dist/src/tools/edit.test.js.map +1 -1
  498. package/dist/src/tools/enter-plan-mode.js +1 -1
  499. package/dist/src/tools/enter-plan-mode.js.map +1 -1
  500. package/dist/src/tools/enter-plan-mode.test.js +1 -1
  501. package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
  502. package/dist/src/tools/exit-plan-mode.js +10 -24
  503. package/dist/src/tools/exit-plan-mode.js.map +1 -1
  504. package/dist/src/tools/exit-plan-mode.test.js +1 -1
  505. package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
  506. package/dist/src/tools/grep-utils.d.ts +49 -0
  507. package/dist/src/tools/grep-utils.js +139 -0
  508. package/dist/src/tools/grep-utils.js.map +1 -0
  509. package/dist/src/tools/grep.js +4 -44
  510. package/dist/src/tools/grep.js.map +1 -1
  511. package/dist/src/tools/grep.test.js +21 -2
  512. package/dist/src/tools/grep.test.js.map +1 -1
  513. package/dist/src/tools/ls.js +6 -1
  514. package/dist/src/tools/ls.js.map +1 -1
  515. package/dist/src/tools/ls.test.js +2 -2
  516. package/dist/src/tools/ls.test.js.map +1 -1
  517. package/dist/src/tools/mcp-client-manager.js +16 -18
  518. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  519. package/dist/src/tools/mcp-client-manager.test.js +51 -0
  520. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  521. package/dist/src/tools/mcp-client.d.ts +22 -1
  522. package/dist/src/tools/mcp-client.js +95 -36
  523. package/dist/src/tools/mcp-client.js.map +1 -1
  524. package/dist/src/tools/mcp-client.test.js +148 -20
  525. package/dist/src/tools/mcp-client.test.js.map +1 -1
  526. package/dist/src/tools/mcp-tool.d.ts +15 -5
  527. package/dist/src/tools/mcp-tool.js +36 -8
  528. package/dist/src/tools/mcp-tool.js.map +1 -1
  529. package/dist/src/tools/memoryTool.js +1 -1
  530. package/dist/src/tools/memoryTool.js.map +1 -1
  531. package/dist/src/tools/memoryTool.test.js +5 -0
  532. package/dist/src/tools/memoryTool.test.js.map +1 -1
  533. package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
  534. package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
  535. package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
  536. package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
  537. package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
  538. package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
  539. package/dist/src/tools/read-file.d.ts +4 -4
  540. package/dist/src/tools/read-file.js +17 -10
  541. package/dist/src/tools/read-file.js.map +1 -1
  542. package/dist/src/tools/read-file.test.js +20 -10
  543. package/dist/src/tools/read-file.test.js.map +1 -1
  544. package/dist/src/tools/ripGrep.js +49 -46
  545. package/dist/src/tools/ripGrep.js.map +1 -1
  546. package/dist/src/tools/ripGrep.test.js +52 -37
  547. package/dist/src/tools/ripGrep.test.js.map +1 -1
  548. package/dist/src/tools/shell.d.ts +2 -2
  549. package/dist/src/tools/shell.js +2 -2
  550. package/dist/src/tools/shell.js.map +1 -1
  551. package/dist/src/tools/shell.test.js +1 -2
  552. package/dist/src/tools/shell.test.js.map +1 -1
  553. package/dist/src/tools/tool-names.d.ts +0 -6
  554. package/dist/src/tools/tool-names.js +0 -15
  555. package/dist/src/tools/tool-names.js.map +1 -1
  556. package/dist/src/tools/tool-registry.d.ts +1 -0
  557. package/dist/src/tools/tool-registry.js +33 -6
  558. package/dist/src/tools/tool-registry.js.map +1 -1
  559. package/dist/src/tools/tool-registry.test.js +47 -0
  560. package/dist/src/tools/tool-registry.test.js.map +1 -1
  561. package/dist/src/tools/tools.d.ts +21 -1
  562. package/dist/src/tools/tools.js +19 -3
  563. package/dist/src/tools/tools.js.map +1 -1
  564. package/dist/src/tools/tools.test.js +24 -0
  565. package/dist/src/tools/tools.test.js.map +1 -1
  566. package/dist/src/tools/web-fetch.d.ts +9 -1
  567. package/dist/src/tools/web-fetch.js +273 -34
  568. package/dist/src/tools/web-fetch.js.map +1 -1
  569. package/dist/src/tools/web-fetch.test.js +303 -30
  570. package/dist/src/tools/web-fetch.test.js.map +1 -1
  571. package/dist/src/tools/write-file.js +14 -10
  572. package/dist/src/tools/write-file.js.map +1 -1
  573. package/dist/src/tools/write-file.test.js +75 -0
  574. package/dist/src/tools/write-file.test.js.map +1 -1
  575. package/dist/src/tools/write-todos.d.ts +2 -2
  576. package/dist/src/tools/write-todos.js +1 -1
  577. package/dist/src/tools/write-todos.js.map +1 -1
  578. package/dist/src/tools/xcode-mcp-fix-transport.js +4 -1
  579. package/dist/src/tools/xcode-mcp-fix-transport.js.map +1 -1
  580. package/dist/src/utils/approvalModeUtils.d.ts +14 -0
  581. package/dist/src/utils/approvalModeUtils.js +35 -0
  582. package/dist/src/utils/approvalModeUtils.js.map +1 -0
  583. package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
  584. package/dist/src/utils/approvalModeUtils.test.js +36 -0
  585. package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
  586. package/dist/src/utils/authConsent.d.ts +1 -1
  587. package/dist/src/utils/authConsent.js +10 -8
  588. package/dist/src/utils/authConsent.js.map +1 -1
  589. package/dist/src/utils/authConsent.test.js +89 -44
  590. package/dist/src/utils/authConsent.test.js.map +1 -1
  591. package/dist/src/utils/compatibility.d.ts +41 -0
  592. package/dist/src/utils/compatibility.js +112 -0
  593. package/dist/src/utils/compatibility.js.map +1 -0
  594. package/dist/src/utils/compatibility.test.d.ts +6 -0
  595. package/dist/src/utils/compatibility.test.js +233 -0
  596. package/dist/src/utils/compatibility.test.js.map +1 -0
  597. package/dist/src/utils/editCorrector.js +22 -29
  598. package/dist/src/utils/editCorrector.js.map +1 -1
  599. package/dist/src/utils/editCorrector.test.js.map +1 -1
  600. package/dist/src/utils/envExpansion.d.ts +18 -0
  601. package/dist/src/utils/envExpansion.js +46 -0
  602. package/dist/src/utils/envExpansion.js.map +1 -0
  603. package/dist/src/utils/envExpansion.test.d.ts +6 -0
  604. package/dist/src/utils/envExpansion.test.js +110 -0
  605. package/dist/src/utils/envExpansion.test.js.map +1 -0
  606. package/dist/src/utils/errors.d.ts +1 -0
  607. package/dist/src/utils/errors.js +55 -10
  608. package/dist/src/utils/errors.js.map +1 -1
  609. package/dist/src/utils/errors.test.js +27 -1
  610. package/dist/src/utils/errors.test.js.map +1 -1
  611. package/dist/src/utils/events.d.ts +17 -0
  612. package/dist/src/utils/events.js +12 -0
  613. package/dist/src/utils/events.js.map +1 -1
  614. package/dist/src/utils/events.test.d.ts +1 -1
  615. package/dist/src/utils/events.test.js +50 -3
  616. package/dist/src/utils/events.test.js.map +1 -1
  617. package/dist/src/utils/fastAckHelper.js +2 -1
  618. package/dist/src/utils/fastAckHelper.js.map +1 -1
  619. package/dist/src/utils/fetch.d.ts +1 -1
  620. package/dist/src/utils/fetch.js +15 -2
  621. package/dist/src/utils/fetch.js.map +1 -1
  622. package/dist/src/utils/fileDiffUtils.d.ts +2 -2
  623. package/dist/src/utils/fileDiffUtils.js +1 -2
  624. package/dist/src/utils/fileDiffUtils.js.map +1 -1
  625. package/dist/src/utils/fileUtils.d.ts +5 -3
  626. package/dist/src/utils/fileUtils.js +25 -16
  627. package/dist/src/utils/fileUtils.js.map +1 -1
  628. package/dist/src/utils/fileUtils.test.js +14 -13
  629. package/dist/src/utils/fileUtils.test.js.map +1 -1
  630. package/dist/src/utils/filesearch/fileSearch.js +4 -1
  631. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  632. package/dist/src/utils/getFolderStructure.test.js +4 -5
  633. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  634. package/dist/src/utils/getPty.js +4 -0
  635. package/dist/src/utils/getPty.js.map +1 -1
  636. package/dist/src/utils/googleErrors.js +29 -5
  637. package/dist/src/utils/googleErrors.js.map +1 -1
  638. package/dist/src/utils/googleQuotaErrors.js +10 -0
  639. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  640. package/dist/src/utils/googleQuotaErrors.test.js +16 -1
  641. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
  642. package/dist/src/utils/memoryDiscovery.js +2 -0
  643. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  644. package/dist/src/utils/memoryDiscovery.test.js +1 -2
  645. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  646. package/dist/src/utils/retry.d.ts +1 -1
  647. package/dist/src/utils/retry.js +9 -4
  648. package/dist/src/utils/retry.js.map +1 -1
  649. package/dist/src/utils/retry.test.js +15 -12
  650. package/dist/src/utils/retry.test.js.map +1 -1
  651. package/dist/src/utils/safeJsonStringify.js +3 -0
  652. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  653. package/dist/src/utils/schemaValidator.js +5 -3
  654. package/dist/src/utils/schemaValidator.js.map +1 -1
  655. package/dist/src/utils/session.d.ts +1 -0
  656. package/dist/src/utils/session.js +3 -0
  657. package/dist/src/utils/session.js.map +1 -1
  658. package/dist/src/utils/sessionUtils.d.ts +14 -0
  659. package/dist/src/utils/sessionUtils.js +113 -0
  660. package/dist/src/utils/sessionUtils.js.map +1 -0
  661. package/dist/src/utils/sessionUtils.test.d.ts +1 -0
  662. package/dist/src/utils/sessionUtils.test.js +137 -0
  663. package/dist/src/utils/sessionUtils.test.js.map +1 -0
  664. package/dist/src/utils/shell-utils.js +1 -0
  665. package/dist/src/utils/shell-utils.js.map +1 -1
  666. package/dist/src/utils/stdio.js +6 -0
  667. package/dist/src/utils/stdio.js.map +1 -1
  668. package/dist/src/utils/textUtils.d.ts +9 -0
  669. package/dist/src/utils/textUtils.js +15 -0
  670. package/dist/src/utils/textUtils.js.map +1 -1
  671. package/dist/src/utils/textUtils.test.js +42 -1
  672. package/dist/src/utils/textUtils.test.js.map +1 -1
  673. package/dist/src/utils/toolCallContext.d.ts +0 -5
  674. package/dist/src/utils/toolCallContext.js +1 -1
  675. package/dist/src/utils/toolCallContext.js.map +1 -1
  676. package/dist/src/utils/userAccountManager.js +3 -0
  677. package/dist/src/utils/userAccountManager.js.map +1 -1
  678. package/dist/tsconfig.tsbuildinfo +1 -1
  679. package/package.json +6 -3
  680. package/dist/docs/architecture.md +0 -80
  681. package/dist/docs/cli/index.md +0 -123
  682. package/dist/docs/core/concepts.md +0 -137
  683. package/dist/docs/get-started/configuration-v1.md +0 -882
  684. package/dist/google-gemini-cli-core-0.30.0-preview.5.tgz +0 -0
  685. /package/dist/docs/{core → reference}/memport.md +0 -0
  686. /package/dist/docs/{core → reference}/tools-api.md +0 -0
  687. /package/dist/docs/{cli → resources}/uninstall.md +0 -0
@@ -12,7 +12,6 @@ vi.mock('../telemetry/trace.js', () => ({
12
12
  runInDevTraceSpan: vi.fn(async (_opts, fn) => fn({ metadata: { input: {}, output: {} } })),
13
13
  }));
14
14
  import { logToolCall } from '../telemetry/loggers.js';
15
- import { ToolCallEvent } from '../telemetry/types.js';
16
15
  vi.mock('../telemetry/loggers.js', () => ({
17
16
  logToolCall: vi.fn(),
18
17
  }));
@@ -43,6 +42,7 @@ import { CoreToolCallStatus, ROOT_SCHEDULER_ID } from './types.js';
43
42
  import { ToolErrorType } from '../tools/tool-error.js';
44
43
  import * as ToolUtils from '../utils/tool-utils.js';
45
44
  import { getToolCallContext, } from '../utils/toolCallContext.js';
45
+ import { coreEvents, CoreEvent, } from '../utils/events.js';
46
46
  describe('Scheduler (Orchestrator)', () => {
47
47
  let scheduler;
48
48
  let signal;
@@ -109,28 +109,61 @@ describe('Scheduler (Orchestrator)', () => {
109
109
  };
110
110
  getPreferredEditor = vi.fn().mockReturnValue('vim');
111
111
  // --- Setup Sub-component Mocks ---
112
+ const mockActiveCallsMap = new Map();
113
+ const mockQueue = [];
112
114
  mockStateManager = {
113
- enqueue: vi.fn(),
114
- dequeue: vi.fn(),
115
- getToolCall: vi.fn(),
116
- updateStatus: vi.fn(),
117
- finalizeCall: vi.fn(),
115
+ enqueue: vi.fn((calls) => {
116
+ // Clone to preserve initial state for Phase 1 tests
117
+ mockQueue.push(...calls.map((c) => ({ ...c })));
118
+ }),
119
+ dequeue: vi.fn(() => {
120
+ const next = mockQueue.shift();
121
+ if (next)
122
+ mockActiveCallsMap.set(next.request.callId, next);
123
+ return next;
124
+ }),
125
+ peekQueue: vi.fn(() => mockQueue[0]),
126
+ getToolCall: vi.fn((id) => mockActiveCallsMap.get(id)),
127
+ updateStatus: vi.fn((id, status) => {
128
+ const call = mockActiveCallsMap.get(id);
129
+ if (call)
130
+ call.status = status;
131
+ }),
132
+ finalizeCall: vi.fn((id) => {
133
+ const call = mockActiveCallsMap.get(id);
134
+ if (call) {
135
+ mockActiveCallsMap.delete(id);
136
+ capturedTerminalHandler?.(call);
137
+ }
138
+ }),
118
139
  updateArgs: vi.fn(),
119
140
  setOutcome: vi.fn(),
120
- cancelAllQueued: vi.fn(),
141
+ cancelAllQueued: vi.fn(() => {
142
+ mockQueue.length = 0;
143
+ }),
121
144
  clearBatch: vi.fn(),
145
+ replaceActiveCallWithTailCall: vi.fn((id, nextCall) => {
146
+ if (mockActiveCallsMap.has(id)) {
147
+ mockActiveCallsMap.delete(id);
148
+ mockQueue.unshift(nextCall);
149
+ }
150
+ }),
122
151
  };
123
152
  // Define getters for accessors idiomatically
124
153
  Object.defineProperty(mockStateManager, 'isActive', {
125
- get: vi.fn().mockReturnValue(false),
154
+ get: vi.fn(() => mockActiveCallsMap.size > 0),
155
+ configurable: true,
156
+ });
157
+ Object.defineProperty(mockStateManager, 'allActiveCalls', {
158
+ get: vi.fn(() => Array.from(mockActiveCallsMap.values())),
126
159
  configurable: true,
127
160
  });
128
161
  Object.defineProperty(mockStateManager, 'queueLength', {
129
- get: vi.fn().mockReturnValue(0),
162
+ get: vi.fn(() => mockQueue.length),
130
163
  configurable: true,
131
164
  });
132
165
  Object.defineProperty(mockStateManager, 'firstActiveCall', {
133
- get: vi.fn().mockReturnValue(undefined),
166
+ get: vi.fn(() => mockActiveCallsMap.values().next().value),
134
167
  configurable: true,
135
168
  });
136
169
  Object.defineProperty(mockStateManager, 'completedBatch', {
@@ -159,8 +192,9 @@ describe('Scheduler (Orchestrator)', () => {
159
192
  return mockStateManager;
160
193
  });
161
194
  mockStateManager.finalizeCall.mockImplementation((callId) => {
162
- const call = mockStateManager.getToolCall(callId);
195
+ const call = mockActiveCallsMap.get(callId);
163
196
  if (call) {
197
+ mockActiveCallsMap.delete(callId);
164
198
  capturedTerminalHandler?.(call);
165
199
  }
166
200
  });
@@ -170,6 +204,13 @@ describe('Scheduler (Orchestrator)', () => {
170
204
  // but most tests here check if finalizing is called.
171
205
  });
172
206
  vi.mocked(ToolExecutor).mockReturnValue(mockExecutor);
207
+ mockExecutor.execute.mockResolvedValue({
208
+ status: 'success',
209
+ response: {
210
+ callId: 'default',
211
+ responseParts: [],
212
+ },
213
+ });
173
214
  vi.mocked(ToolModificationHandler).mockReturnValue(mockModifier);
174
215
  // Initialize Scheduler
175
216
  scheduler = new Scheduler({
@@ -239,79 +280,16 @@ describe('Scheduler (Orchestrator)', () => {
239
280
  });
240
281
  describe('Phase 2: Queue Management', () => {
241
282
  it('should drain the queue if multiple calls are scheduled', async () => {
242
- const validatingCall = {
243
- status: CoreToolCallStatus.Validating,
244
- request: req1,
245
- tool: mockTool,
246
- invocation: mockInvocation,
247
- };
248
- // Setup queue simulation: two items
249
- Object.defineProperty(mockStateManager, 'queueLength', {
250
- get: vi
251
- .fn()
252
- .mockReturnValueOnce(2)
253
- .mockReturnValueOnce(1)
254
- .mockReturnValue(0),
255
- configurable: true,
256
- });
257
- Object.defineProperty(mockStateManager, 'isActive', {
258
- get: vi.fn().mockReturnValue(false),
259
- configurable: true,
260
- });
261
- mockStateManager.dequeue.mockReturnValue(validatingCall);
262
- vi.mocked(mockStateManager.dequeue).mockReturnValue(validatingCall);
263
- Object.defineProperty(mockStateManager, 'firstActiveCall', {
264
- get: vi.fn().mockReturnValue(validatingCall),
265
- configurable: true,
266
- });
267
283
  // Execute is the end of the loop, stub it
268
284
  mockExecutor.execute.mockResolvedValue({
269
285
  status: CoreToolCallStatus.Success,
270
286
  });
271
287
  await scheduler.schedule(req1, signal);
272
- // Verify loop ran twice
273
- expect(mockStateManager.dequeue).toHaveBeenCalledTimes(2);
274
- expect(mockStateManager.finalizeCall).toHaveBeenCalledTimes(2);
288
+ // Verify loop ran once for this schedule call (which had 1 request)
289
+ // schedule(req1) enqueues 1 request.
290
+ expect(mockExecutor.execute).toHaveBeenCalledTimes(1);
275
291
  });
276
292
  it('should execute tool calls sequentially (first completes before second starts)', async () => {
277
- // Setup queue simulation: two items
278
- Object.defineProperty(mockStateManager, 'queueLength', {
279
- get: vi
280
- .fn()
281
- .mockReturnValueOnce(2)
282
- .mockReturnValueOnce(1)
283
- .mockReturnValue(0),
284
- configurable: true,
285
- });
286
- Object.defineProperty(mockStateManager, 'isActive', {
287
- get: vi.fn().mockReturnValue(false),
288
- configurable: true,
289
- });
290
- const validatingCall1 = {
291
- status: CoreToolCallStatus.Validating,
292
- request: req1,
293
- tool: mockTool,
294
- invocation: mockInvocation,
295
- };
296
- const validatingCall2 = {
297
- status: CoreToolCallStatus.Validating,
298
- request: req2,
299
- tool: mockTool,
300
- invocation: mockInvocation,
301
- };
302
- vi.mocked(mockStateManager.dequeue)
303
- .mockReturnValueOnce(validatingCall1)
304
- .mockReturnValueOnce(validatingCall2)
305
- .mockReturnValue(undefined);
306
- Object.defineProperty(mockStateManager, 'firstActiveCall', {
307
- get: vi
308
- .fn()
309
- .mockReturnValueOnce(validatingCall1) // Used in loop check for call 1
310
- .mockReturnValueOnce(validatingCall1) // Used in _execute for call 1
311
- .mockReturnValueOnce(validatingCall2) // Used in loop check for call 2
312
- .mockReturnValueOnce(validatingCall2), // Used in _execute for call 2
313
- configurable: true,
314
- });
315
293
  const executionLog = [];
316
294
  // Mock executor to push to log with a deterministic microtask delay
317
295
  mockExecutor.execute.mockImplementation(async ({ call }) => {
@@ -335,47 +313,6 @@ describe('Scheduler (Orchestrator)', () => {
335
313
  ]);
336
314
  });
337
315
  it('should queue and process multiple schedule() calls made synchronously', async () => {
338
- const validatingCall1 = {
339
- status: CoreToolCallStatus.Validating,
340
- request: req1,
341
- tool: mockTool,
342
- invocation: mockInvocation,
343
- };
344
- const validatingCall2 = {
345
- status: CoreToolCallStatus.Validating,
346
- request: req2, // Second request
347
- tool: mockTool,
348
- invocation: mockInvocation,
349
- };
350
- // Mock state responses dynamically
351
- Object.defineProperty(mockStateManager, 'isActive', {
352
- get: vi.fn().mockReturnValue(false),
353
- configurable: true,
354
- });
355
- // Queue state responses for the two batches:
356
- // Batch 1: length 1 -> 0
357
- // Batch 2: length 1 -> 0
358
- Object.defineProperty(mockStateManager, 'queueLength', {
359
- get: vi
360
- .fn()
361
- .mockReturnValueOnce(1)
362
- .mockReturnValueOnce(0)
363
- .mockReturnValueOnce(1)
364
- .mockReturnValue(0),
365
- configurable: true,
366
- });
367
- vi.mocked(mockStateManager.dequeue)
368
- .mockReturnValueOnce(validatingCall1)
369
- .mockReturnValueOnce(validatingCall2);
370
- Object.defineProperty(mockStateManager, 'firstActiveCall', {
371
- get: vi
372
- .fn()
373
- .mockReturnValueOnce(validatingCall1)
374
- .mockReturnValueOnce(validatingCall1)
375
- .mockReturnValueOnce(validatingCall2)
376
- .mockReturnValueOnce(validatingCall2),
377
- configurable: true,
378
- });
379
316
  // Executor succeeds instantly
380
317
  mockExecutor.execute.mockResolvedValue({
381
318
  status: CoreToolCallStatus.Success,
@@ -390,44 +327,6 @@ describe('Scheduler (Orchestrator)', () => {
390
327
  expect(mockStateManager.finalizeCall).toHaveBeenCalledWith('call-2');
391
328
  });
392
329
  it('should queue requests when scheduler is busy (overlapping batches)', async () => {
393
- const validatingCall1 = {
394
- status: CoreToolCallStatus.Validating,
395
- request: req1,
396
- tool: mockTool,
397
- invocation: mockInvocation,
398
- };
399
- const validatingCall2 = {
400
- status: CoreToolCallStatus.Validating,
401
- request: req2, // Second request
402
- tool: mockTool,
403
- invocation: mockInvocation,
404
- };
405
- // 1. Setup State Manager for 2 sequential batches
406
- Object.defineProperty(mockStateManager, 'isActive', {
407
- get: vi.fn().mockReturnValue(false),
408
- configurable: true,
409
- });
410
- Object.defineProperty(mockStateManager, 'queueLength', {
411
- get: vi
412
- .fn()
413
- .mockReturnValueOnce(1) // Batch 1
414
- .mockReturnValueOnce(0)
415
- .mockReturnValueOnce(1) // Batch 2
416
- .mockReturnValue(0),
417
- configurable: true,
418
- });
419
- vi.mocked(mockStateManager.dequeue)
420
- .mockReturnValueOnce(validatingCall1)
421
- .mockReturnValueOnce(validatingCall2);
422
- Object.defineProperty(mockStateManager, 'firstActiveCall', {
423
- get: vi
424
- .fn()
425
- .mockReturnValueOnce(validatingCall1)
426
- .mockReturnValueOnce(validatingCall1)
427
- .mockReturnValueOnce(validatingCall2)
428
- .mockReturnValueOnce(validatingCall2),
429
- configurable: true,
430
- });
431
330
  // 2. Setup Executor with a controllable lock for the first batch
432
331
  const executionLog = [];
433
332
  let finishFirstBatch;
@@ -487,10 +386,8 @@ describe('Scheduler (Orchestrator)', () => {
487
386
  tool: mockTool,
488
387
  invocation: mockInvocation,
489
388
  };
490
- Object.defineProperty(mockStateManager, 'firstActiveCall', {
491
- get: vi.fn().mockReturnValue(activeCall),
492
- configurable: true,
493
- });
389
+ mockStateManager.enqueue([activeCall]);
390
+ mockStateManager.dequeue();
494
391
  scheduler.cancelAll();
495
392
  expect(mockStateManager.updateStatus).toHaveBeenCalledWith('call-1', CoreToolCallStatus.Cancelled, 'Operation cancelled by user');
496
393
  // finalizeCall is handled by the processing loop, not synchronously by cancelAll
@@ -515,23 +412,7 @@ describe('Scheduler (Orchestrator)', () => {
515
412
  });
516
413
  });
517
414
  describe('Phase 3: Policy & Confirmation Loop', () => {
518
- const validatingCall = {
519
- status: CoreToolCallStatus.Validating,
520
- request: req1,
521
- tool: mockTool,
522
- invocation: mockInvocation,
523
- };
524
- beforeEach(() => {
525
- Object.defineProperty(mockStateManager, 'queueLength', {
526
- get: vi.fn().mockReturnValueOnce(1).mockReturnValue(0),
527
- configurable: true,
528
- });
529
- vi.mocked(mockStateManager.dequeue).mockReturnValue(validatingCall);
530
- Object.defineProperty(mockStateManager, 'firstActiveCall', {
531
- get: vi.fn().mockReturnValue(validatingCall),
532
- configurable: true,
533
- });
534
- });
415
+ beforeEach(() => { });
535
416
  it('should update state to error with POLICY_VIOLATION if Policy returns DENY', async () => {
536
417
  vi.mocked(checkPolicy).mockResolvedValue({
537
418
  decision: PolicyDecision.DENY,
@@ -641,27 +522,6 @@ describe('Scheduler (Orchestrator)', () => {
641
522
  expect(mockExecutor.execute).toHaveBeenCalled();
642
523
  });
643
524
  it('should auto-approve remaining identical tools in batch after ProceedAlways', async () => {
644
- // Setup: two identical tools
645
- const validatingCall1 = {
646
- status: CoreToolCallStatus.Validating,
647
- request: req1,
648
- tool: mockTool,
649
- invocation: mockInvocation,
650
- };
651
- const validatingCall2 = {
652
- status: CoreToolCallStatus.Validating,
653
- request: req2,
654
- tool: mockTool,
655
- invocation: mockInvocation,
656
- };
657
- vi.mocked(mockStateManager.dequeue)
658
- .mockReturnValueOnce(validatingCall1)
659
- .mockReturnValueOnce(validatingCall2)
660
- .mockReturnValue(undefined);
661
- vi.spyOn(mockStateManager, 'queueLength', 'get')
662
- .mockReturnValueOnce(2)
663
- .mockReturnValueOnce(1)
664
- .mockReturnValue(0);
665
525
  // First call requires confirmation, second is auto-approved (simulating policy update)
666
526
  vi.mocked(checkPolicy)
667
527
  .mockResolvedValueOnce({
@@ -730,6 +590,7 @@ describe('Scheduler (Orchestrator)', () => {
730
590
  vi.mocked(resolveConfirmation).mockResolvedValue(resolution);
731
591
  await scheduler.schedule(req1, signal);
732
592
  expect(mockStateManager.updateStatus).toHaveBeenCalledWith('call-1', CoreToolCallStatus.Cancelled, 'User denied execution.');
593
+ expect(mockStateManager.setOutcome).toHaveBeenCalledWith('call-1', ToolConfirmationOutcome.Cancel);
733
594
  expect(mockStateManager.cancelAllQueued).toHaveBeenCalledWith('User cancelled operation');
734
595
  expect(mockExecutor.execute).not.toHaveBeenCalled();
735
596
  });
@@ -777,18 +638,7 @@ describe('Scheduler (Orchestrator)', () => {
777
638
  });
778
639
  });
779
640
  describe('Phase 4: Execution Outcomes', () => {
780
- const validatingCall = {
781
- status: CoreToolCallStatus.Validating,
782
- request: req1,
783
- tool: mockTool,
784
- invocation: mockInvocation,
785
- };
786
641
  beforeEach(() => {
787
- vi.spyOn(mockStateManager, 'queueLength', 'get')
788
- .mockReturnValueOnce(1)
789
- .mockReturnValue(0);
790
- mockStateManager.dequeue.mockReturnValue(validatingCall);
791
- vi.spyOn(mockStateManager, 'firstActiveCall', 'get').mockReturnValue(validatingCall);
792
642
  mockPolicyEngine.check.mockResolvedValue({
793
643
  decision: PolicyDecision.ALLOW,
794
644
  }); // Bypass confirmation
@@ -835,25 +685,11 @@ describe('Scheduler (Orchestrator)', () => {
835
685
  status: CoreToolCallStatus.Success,
836
686
  response: mockResponse,
837
687
  });
838
- // Mock the state manager to return a SUCCESS state when getToolCall is
839
- // called
840
- const successfulCall = {
841
- status: CoreToolCallStatus.Success,
842
- request: req1,
843
- response: mockResponse,
844
- tool: mockTool,
845
- invocation: mockInvocation,
846
- };
847
- mockStateManager.getToolCall.mockReturnValue(successfulCall);
848
- Object.defineProperty(mockStateManager, 'completedBatch', {
849
- get: vi.fn().mockReturnValue([successfulCall]),
850
- configurable: true,
851
- });
852
688
  await scheduler.schedule(req1, signal);
853
689
  // Verify the finalizer and logger were called
854
690
  expect(mockStateManager.finalizeCall).toHaveBeenCalledWith('call-1');
855
- expect(ToolCallEvent).toHaveBeenCalledWith(successfulCall);
856
- expect(logToolCall).toHaveBeenCalledWith(mockConfig, expect.objectContaining(successfulCall));
691
+ // We check that logToolCall was called (it's called via the state manager's terminal handler)
692
+ expect(logToolCall).toHaveBeenCalled();
857
693
  });
858
694
  it('should not double-report completed tools when concurrent completions occur', async () => {
859
695
  // Simulate a race where execution finishes but cancelAll is called immediately after
@@ -876,6 +712,114 @@ describe('Scheduler (Orchestrator)', () => {
876
712
  expect(mockStateManager.finalizeCall).toHaveBeenCalledTimes(1);
877
713
  expect(mockStateManager.finalizeCall).toHaveBeenCalledWith('call-1');
878
714
  });
715
+ it('should break the loop if no progress is made (safeguard against stuck states)', async () => {
716
+ // Setup: A tool that is 'validating' but stays 'validating' even after processing
717
+ // This simulates a bug in state management or a weird edge case.
718
+ const stuckCall = {
719
+ status: CoreToolCallStatus.Validating,
720
+ request: req1,
721
+ tool: mockTool,
722
+ invocation: mockInvocation,
723
+ };
724
+ // Mock dequeue to keep returning the same stuck call
725
+ mockStateManager.dequeue.mockReturnValue(stuckCall);
726
+ // Mock isActive to be true
727
+ Object.defineProperty(mockStateManager, 'isActive', {
728
+ get: vi.fn().mockReturnValue(true),
729
+ configurable: true,
730
+ });
731
+ // Mock updateStatus to do NOTHING (simulating no progress)
732
+ mockStateManager.updateStatus.mockImplementation(() => { });
733
+ // This should return false (break loop) instead of hanging indefinitely
734
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
735
+ const result = await scheduler._processNextItem(signal);
736
+ expect(result).toBe(false);
737
+ });
738
+ describe('Tail Calls', () => {
739
+ it('should replace the active call with a new tool call and re-run the loop when tail call is requested', async () => {
740
+ // Setup: Tool A will return a success with a tail call request to Tool B
741
+ const mockResponse = {
742
+ callId: 'call-1',
743
+ responseParts: [],
744
+ };
745
+ mockExecutor.execute
746
+ .mockResolvedValueOnce({
747
+ status: 'success',
748
+ response: mockResponse,
749
+ tailToolCallRequest: {
750
+ name: 'tool-b',
751
+ args: { key: 'value' },
752
+ },
753
+ request: req1,
754
+ })
755
+ .mockResolvedValueOnce({
756
+ status: 'success',
757
+ response: mockResponse,
758
+ request: {
759
+ ...req1,
760
+ name: 'tool-b',
761
+ args: { key: 'value' },
762
+ originalRequestName: 'test-tool',
763
+ },
764
+ });
765
+ const mockToolB = {
766
+ name: 'tool-b',
767
+ build: vi.fn().mockReturnValue({}),
768
+ };
769
+ vi.mocked(mockToolRegistry.getTool).mockReturnValue(mockToolB);
770
+ await scheduler.schedule(req1, signal);
771
+ // Assert: The state manager is instructed to replace the call
772
+ expect(mockStateManager.replaceActiveCallWithTailCall).toHaveBeenCalledWith('call-1', expect.objectContaining({
773
+ request: expect.objectContaining({
774
+ callId: 'call-1',
775
+ name: 'tool-b',
776
+ args: { key: 'value' },
777
+ originalRequestName: 'test-tool', // Preserves original name
778
+ }),
779
+ tool: mockToolB,
780
+ }));
781
+ // Assert: The executor should be called twice (once for Tool A, once for Tool B)
782
+ expect(mockExecutor.execute).toHaveBeenCalledTimes(2);
783
+ });
784
+ it('should inject an errored tool call if the tail tool is not found', async () => {
785
+ const mockResponse = {
786
+ callId: 'call-1',
787
+ responseParts: [],
788
+ };
789
+ mockExecutor.execute.mockResolvedValue({
790
+ status: 'success',
791
+ response: mockResponse,
792
+ tailToolCallRequest: {
793
+ name: 'missing-tool',
794
+ args: {},
795
+ },
796
+ request: req1,
797
+ });
798
+ // Tool registry returns undefined for missing-tool, but valid tool for test-tool
799
+ vi.mocked(mockToolRegistry.getTool).mockImplementation((name) => {
800
+ if (name === 'test-tool') {
801
+ return {
802
+ name: 'test-tool',
803
+ build: vi.fn().mockReturnValue({}),
804
+ };
805
+ }
806
+ return undefined;
807
+ });
808
+ await scheduler.schedule(req1, signal);
809
+ // Assert: Replaces active call with an errored call
810
+ expect(mockStateManager.replaceActiveCallWithTailCall).toHaveBeenCalledWith('call-1', expect.objectContaining({
811
+ status: 'error',
812
+ request: expect.objectContaining({
813
+ callId: 'call-1',
814
+ name: 'missing-tool', // Name of the failed tail call
815
+ originalRequestName: 'test-tool',
816
+ }),
817
+ response: expect.objectContaining({
818
+ errorType: ToolErrorType.TOOL_NOT_REGISTERED,
819
+ }),
820
+ }));
821
+ });
822
+ });
879
823
  });
880
824
  describe('Tool Call Context Propagation', () => {
881
825
  it('should propagate context to the tool executor', async () => {
@@ -888,23 +832,6 @@ describe('Scheduler (Orchestrator)', () => {
888
832
  schedulerId,
889
833
  parentCallId,
890
834
  });
891
- const validatingCall = {
892
- status: CoreToolCallStatus.Validating,
893
- request: req1,
894
- tool: mockTool,
895
- invocation: mockInvocation,
896
- };
897
- // Mock queueLength to run the loop once
898
- Object.defineProperty(mockStateManager, 'queueLength', {
899
- get: vi.fn().mockReturnValueOnce(1).mockReturnValue(0),
900
- configurable: true,
901
- });
902
- vi.mocked(mockStateManager.dequeue).mockReturnValue(validatingCall);
903
- Object.defineProperty(mockStateManager, 'firstActiveCall', {
904
- get: vi.fn().mockReturnValue(validatingCall),
905
- configurable: true,
906
- });
907
- vi.mocked(mockStateManager.getToolCall).mockReturnValue(validatingCall);
908
835
  mockToolRegistry.getTool.mockReturnValue(mockTool);
909
836
  mockPolicyEngine.check.mockResolvedValue({
910
837
  decision: PolicyDecision.ALLOW,
@@ -933,5 +860,177 @@ describe('Scheduler (Orchestrator)', () => {
933
860
  expect(capturedContext.parentCallId).toBe(parentCallId);
934
861
  });
935
862
  });
863
+ describe('Cleanup', () => {
864
+ it('should unregister McpProgress listener on dispose()', () => {
865
+ const onSpy = vi.spyOn(coreEvents, 'on');
866
+ const offSpy = vi.spyOn(coreEvents, 'off');
867
+ const s = new Scheduler({
868
+ config: mockConfig,
869
+ messageBus: mockMessageBus,
870
+ getPreferredEditor,
871
+ schedulerId: 'cleanup-test',
872
+ });
873
+ expect(onSpy).toHaveBeenCalledWith(CoreEvent.McpProgress, expect.any(Function));
874
+ s.dispose();
875
+ expect(offSpy).toHaveBeenCalledWith(CoreEvent.McpProgress, expect.any(Function));
876
+ });
877
+ });
878
+ });
879
+ describe('Scheduler MCP Progress', () => {
880
+ let scheduler;
881
+ let mockStateManager;
882
+ let mockActiveCallsMap;
883
+ let mockConfig;
884
+ let mockMessageBus;
885
+ let getPreferredEditor;
886
+ const makePayload = (callId, progress, overrides = {}) => ({
887
+ serverName: 'test-server',
888
+ callId,
889
+ progressToken: 'tok-1',
890
+ progress,
891
+ ...overrides,
892
+ });
893
+ const makeExecutingCall = (callId) => ({
894
+ status: CoreToolCallStatus.Executing,
895
+ request: {
896
+ callId,
897
+ name: 'mcp-tool',
898
+ args: {},
899
+ isClientInitiated: false,
900
+ prompt_id: 'p-1',
901
+ schedulerId: ROOT_SCHEDULER_ID,
902
+ parentCallId: undefined,
903
+ },
904
+ tool: {
905
+ name: 'mcp-tool',
906
+ build: vi.fn(),
907
+ },
908
+ invocation: {},
909
+ });
910
+ beforeEach(() => {
911
+ vi.mocked(randomUUID).mockReturnValue('123e4567-e89b-12d3-a456-426614174000');
912
+ mockActiveCallsMap = new Map();
913
+ mockStateManager = {
914
+ enqueue: vi.fn(),
915
+ dequeue: vi.fn(),
916
+ peekQueue: vi.fn(),
917
+ getToolCall: vi.fn((id) => mockActiveCallsMap.get(id)),
918
+ updateStatus: vi.fn(),
919
+ finalizeCall: vi.fn(),
920
+ updateArgs: vi.fn(),
921
+ setOutcome: vi.fn(),
922
+ cancelAllQueued: vi.fn(),
923
+ clearBatch: vi.fn(),
924
+ };
925
+ Object.defineProperty(mockStateManager, 'isActive', {
926
+ get: vi.fn(() => mockActiveCallsMap.size > 0),
927
+ configurable: true,
928
+ });
929
+ Object.defineProperty(mockStateManager, 'allActiveCalls', {
930
+ get: vi.fn(() => Array.from(mockActiveCallsMap.values())),
931
+ configurable: true,
932
+ });
933
+ Object.defineProperty(mockStateManager, 'queueLength', {
934
+ get: vi.fn(() => 0),
935
+ configurable: true,
936
+ });
937
+ Object.defineProperty(mockStateManager, 'firstActiveCall', {
938
+ get: vi.fn(() => mockActiveCallsMap.values().next().value),
939
+ configurable: true,
940
+ });
941
+ Object.defineProperty(mockStateManager, 'completedBatch', {
942
+ get: vi.fn().mockReturnValue([]),
943
+ configurable: true,
944
+ });
945
+ const mockPolicyEngine = {
946
+ check: vi.fn().mockResolvedValue({ decision: PolicyDecision.ALLOW }),
947
+ };
948
+ const mockToolRegistry = {
949
+ getTool: vi.fn(),
950
+ getAllToolNames: vi.fn().mockReturnValue([]),
951
+ };
952
+ mockConfig = {
953
+ getPolicyEngine: vi.fn().mockReturnValue(mockPolicyEngine),
954
+ getToolRegistry: vi.fn().mockReturnValue(mockToolRegistry),
955
+ isInteractive: vi.fn().mockReturnValue(true),
956
+ getEnableHooks: vi.fn().mockReturnValue(true),
957
+ setApprovalMode: vi.fn(),
958
+ getApprovalMode: vi.fn().mockReturnValue(ApprovalMode.DEFAULT),
959
+ };
960
+ mockMessageBus = {
961
+ publish: vi.fn(),
962
+ subscribe: vi.fn(),
963
+ };
964
+ getPreferredEditor = vi.fn().mockReturnValue('vim');
965
+ vi.mocked(SchedulerStateManager).mockImplementation((_messageBus, _schedulerId, _onTerminalCall) => mockStateManager);
966
+ scheduler = new Scheduler({
967
+ config: mockConfig,
968
+ messageBus: mockMessageBus,
969
+ getPreferredEditor,
970
+ schedulerId: 'progress-test',
971
+ });
972
+ });
973
+ afterEach(() => {
974
+ scheduler.dispose();
975
+ vi.clearAllMocks();
976
+ });
977
+ it('should update state on progress event', () => {
978
+ const call = makeExecutingCall('call-A');
979
+ mockActiveCallsMap.set('call-A', call);
980
+ coreEvents.emit(CoreEvent.McpProgress, makePayload('call-A', 10));
981
+ expect(mockStateManager.updateStatus).toHaveBeenCalledTimes(1);
982
+ expect(mockStateManager.updateStatus).toHaveBeenCalledWith('call-A', CoreToolCallStatus.Executing, expect.objectContaining({ progress: 10 }));
983
+ });
984
+ it('should not respond to progress events after dispose()', () => {
985
+ const call = makeExecutingCall('call-A');
986
+ mockActiveCallsMap.set('call-A', call);
987
+ scheduler.dispose();
988
+ coreEvents.emit(CoreEvent.McpProgress, makePayload('call-A', 10));
989
+ expect(mockStateManager.updateStatus).not.toHaveBeenCalled();
990
+ });
991
+ it('should handle concurrent calls independently', () => {
992
+ const callA = makeExecutingCall('call-A');
993
+ const callB = makeExecutingCall('call-B');
994
+ mockActiveCallsMap.set('call-A', callA);
995
+ mockActiveCallsMap.set('call-B', callB);
996
+ coreEvents.emit(CoreEvent.McpProgress, makePayload('call-A', 10));
997
+ coreEvents.emit(CoreEvent.McpProgress, makePayload('call-B', 20));
998
+ expect(mockStateManager.updateStatus).toHaveBeenCalledTimes(2);
999
+ expect(mockStateManager.updateStatus).toHaveBeenCalledWith('call-A', CoreToolCallStatus.Executing, expect.objectContaining({ progress: 10 }));
1000
+ expect(mockStateManager.updateStatus).toHaveBeenCalledWith('call-B', CoreToolCallStatus.Executing, expect.objectContaining({ progress: 20 }));
1001
+ });
1002
+ it('should ignore progress for a callId not in active calls', () => {
1003
+ coreEvents.emit(CoreEvent.McpProgress, makePayload('unknown-call', 10));
1004
+ expect(mockStateManager.updateStatus).not.toHaveBeenCalled();
1005
+ });
1006
+ it('should ignore progress for a call in a terminal state', () => {
1007
+ const successCall = {
1008
+ status: CoreToolCallStatus.Success,
1009
+ request: {
1010
+ callId: 'call-done',
1011
+ name: 'mcp-tool',
1012
+ args: {},
1013
+ isClientInitiated: false,
1014
+ prompt_id: 'p-1',
1015
+ schedulerId: ROOT_SCHEDULER_ID,
1016
+ parentCallId: undefined,
1017
+ },
1018
+ tool: { name: 'mcp-tool' },
1019
+ response: { callId: 'call-done', responseParts: [] },
1020
+ };
1021
+ mockActiveCallsMap.set('call-done', successCall);
1022
+ coreEvents.emit(CoreEvent.McpProgress, makePayload('call-done', 50));
1023
+ expect(mockStateManager.updateStatus).not.toHaveBeenCalled();
1024
+ });
1025
+ it('should compute validTotal and percentage for determinate progress', () => {
1026
+ const call = makeExecutingCall('call-A');
1027
+ mockActiveCallsMap.set('call-A', call);
1028
+ coreEvents.emit(CoreEvent.McpProgress, makePayload('call-A', 50, { total: 100 }));
1029
+ expect(mockStateManager.updateStatus).toHaveBeenCalledWith('call-A', CoreToolCallStatus.Executing, expect.objectContaining({
1030
+ progress: 50,
1031
+ progressTotal: 100,
1032
+ progressPercent: 50,
1033
+ }));
1034
+ });
936
1035
  });
937
1036
  //# sourceMappingURL=scheduler.test.js.map