@machina.ai/cell-cli-core 1.36.0-rc1 → 1.38.1-rc2

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 (733) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +3 -10
  2. package/dist/docs/assets/theme-tokyonight-dark.png +0 -0
  3. package/dist/docs/changelogs/index.md +49 -0
  4. package/dist/docs/changelogs/latest.md +355 -458
  5. package/dist/docs/changelogs/preview.md +402 -363
  6. package/dist/docs/cli/acp-mode.md +126 -0
  7. package/dist/docs/cli/cli-reference.md +1 -1
  8. package/dist/docs/cli/notifications.md +5 -5
  9. package/dist/docs/cli/plan-mode.md +26 -10
  10. package/dist/docs/cli/sandbox.md +53 -1
  11. package/dist/docs/cli/settings.md +52 -48
  12. package/dist/docs/cli/themes.md +5 -0
  13. package/dist/docs/core/index.md +2 -2
  14. package/dist/docs/core/remote-agents.md +14 -18
  15. package/dist/docs/core/subagents.md +194 -47
  16. package/dist/docs/get-started/authentication.md +2 -2
  17. package/dist/docs/get-started/gemini-3.md +1 -1
  18. package/dist/docs/get-started/index.md +127 -1
  19. package/dist/docs/get-started/installation.md +7 -0
  20. package/dist/docs/hooks/index.md +6 -6
  21. package/dist/docs/ide-integration/index.md +99 -24
  22. package/dist/docs/index.md +0 -2
  23. package/dist/docs/redirects.json +1 -0
  24. package/dist/docs/reference/commands.md +1 -3
  25. package/dist/docs/reference/configuration.md +220 -99
  26. package/dist/docs/reference/keyboard-shortcuts.md +21 -8
  27. package/dist/docs/reference/policy-engine.md +36 -31
  28. package/dist/docs/reference/tools.md +56 -23
  29. package/dist/docs/release-confidence.md +0 -6
  30. package/dist/docs/releases.md +4 -0
  31. package/dist/docs/resources/quota-and-pricing.md +23 -9
  32. package/dist/docs/sidebar.json +11 -4
  33. package/dist/docs/tools/mcp-server.md +3 -3
  34. package/dist/docs/tools/planning.md +6 -4
  35. package/dist/docs/tools/web-fetch.md +3 -0
  36. package/dist/package.json +2 -1
  37. package/dist/src/agent/agent-session.test.js +14 -6
  38. package/dist/src/agent/agent-session.test.js.map +1 -1
  39. package/dist/src/agent/event-translator.js +2 -1
  40. package/dist/src/agent/event-translator.js.map +1 -1
  41. package/dist/src/agent/event-translator.test.js +1 -0
  42. package/dist/src/agent/event-translator.test.js.map +1 -1
  43. package/dist/src/agent/legacy-agent-session.d.ts +47 -4
  44. package/dist/src/agent/legacy-agent-session.js +38 -15
  45. package/dist/src/agent/legacy-agent-session.js.map +1 -1
  46. package/dist/src/agent/legacy-agent-session.test.js +60 -73
  47. package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
  48. package/dist/src/agent/mock.js +7 -1
  49. package/dist/src/agent/mock.js.map +1 -1
  50. package/dist/src/agent/mock.test.js +1 -1
  51. package/dist/src/agent/mock.test.js.map +1 -1
  52. package/dist/src/agent/types.d.ts +34 -1
  53. package/dist/src/agents/a2a-client-manager.js +3 -3
  54. package/dist/src/agents/a2a-client-manager.js.map +1 -1
  55. package/dist/src/agents/agent-scheduler.js +6 -1
  56. package/dist/src/agents/agent-scheduler.js.map +1 -1
  57. package/dist/src/agents/agent-scheduler.test.js +38 -0
  58. package/dist/src/agents/agent-scheduler.test.js.map +1 -1
  59. package/dist/src/agents/agentLoader.d.ts +12 -12
  60. package/dist/src/agents/agentLoader.js +1 -0
  61. package/dist/src/agents/agentLoader.js.map +1 -1
  62. package/dist/src/agents/auth-provider/api-key-provider.test.js +18 -2
  63. package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -1
  64. package/dist/src/agents/auth-provider/value-resolver.test.js +30 -0
  65. package/dist/src/agents/auth-provider/value-resolver.test.js.map +1 -1
  66. package/dist/src/agents/browser/analyzeScreenshot.js +36 -6
  67. package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
  68. package/dist/src/agents/browser/analyzeScreenshot.test.js +35 -3
  69. package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
  70. package/dist/src/agents/browser/automationOverlay.js +2 -10
  71. package/dist/src/agents/browser/automationOverlay.js.map +1 -1
  72. package/dist/src/agents/browser/browserAgentDefinition.js +10 -3
  73. package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -1
  74. package/dist/src/agents/browser/browserAgentFactory.d.ts +11 -3
  75. package/dist/src/agents/browser/browserAgentFactory.js +171 -129
  76. package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
  77. package/dist/src/agents/browser/browserAgentFactory.test.js +99 -13
  78. package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
  79. package/dist/src/agents/browser/browserAgentInvocation.d.ts +1 -0
  80. package/dist/src/agents/browser/browserAgentInvocation.js +87 -27
  81. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  82. package/dist/src/agents/browser/browserAgentInvocation.test.js +107 -7
  83. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
  84. package/dist/src/agents/browser/browserManager.d.ts +89 -8
  85. package/dist/src/agents/browser/browserManager.js +357 -74
  86. package/dist/src/agents/browser/browserManager.js.map +1 -1
  87. package/dist/src/agents/browser/browserManager.test.js +540 -19
  88. package/dist/src/agents/browser/browserManager.test.js.map +1 -1
  89. package/dist/src/agents/browser/inputBlocker.d.ts +4 -4
  90. package/dist/src/agents/browser/inputBlocker.js +8 -18
  91. package/dist/src/agents/browser/inputBlocker.js.map +1 -1
  92. package/dist/src/agents/browser/inputBlocker.test.js +31 -3
  93. package/dist/src/agents/browser/inputBlocker.test.js.map +1 -1
  94. package/dist/src/agents/browser/mcpToolWrapper.d.ts +1 -1
  95. package/dist/src/agents/browser/mcpToolWrapper.js +9 -6
  96. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
  97. package/dist/src/agents/browser/mcpToolWrapper.test.js +2 -2
  98. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
  99. package/dist/src/agents/browser/modelAvailability.d.ts +5 -0
  100. package/dist/src/agents/browser/modelAvailability.js +12 -0
  101. package/dist/src/agents/browser/modelAvailability.js.map +1 -1
  102. package/dist/src/agents/browser/snapshotSuperseder.d.ts +31 -0
  103. package/dist/src/agents/browser/snapshotSuperseder.js +101 -0
  104. package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -0
  105. package/dist/src/agents/browser/snapshotSuperseder.test.js +158 -0
  106. package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -0
  107. package/dist/src/agents/local-executor.d.ts +9 -0
  108. package/dist/src/agents/local-executor.js +144 -200
  109. package/dist/src/agents/local-executor.js.map +1 -1
  110. package/dist/src/agents/local-executor.test.js +500 -115
  111. package/dist/src/agents/local-executor.test.js.map +1 -1
  112. package/dist/src/agents/local-invocation.d.ts +1 -0
  113. package/dist/src/agents/local-invocation.js +19 -9
  114. package/dist/src/agents/local-invocation.js.map +1 -1
  115. package/dist/src/agents/local-invocation.test.js +24 -0
  116. package/dist/src/agents/local-invocation.test.js.map +1 -1
  117. package/dist/src/agents/memory-manager-agent.js +1 -0
  118. package/dist/src/agents/memory-manager-agent.js.map +1 -1
  119. package/dist/src/agents/memory-manager-agent.test.js +6 -0
  120. package/dist/src/agents/memory-manager-agent.test.js.map +1 -1
  121. package/dist/src/agents/registry.js +19 -11
  122. package/dist/src/agents/registry.js.map +1 -1
  123. package/dist/src/agents/registry.test.js +67 -0
  124. package/dist/src/agents/registry.test.js.map +1 -1
  125. package/dist/src/agents/skill-extraction-agent.d.ts +24 -0
  126. package/dist/src/agents/skill-extraction-agent.js +269 -0
  127. package/dist/src/agents/skill-extraction-agent.js.map +1 -0
  128. package/dist/src/agents/types.d.ts +20 -0
  129. package/dist/src/agents/types.js.map +1 -1
  130. package/dist/src/availability/policyCatalog.d.ts +2 -1
  131. package/dist/src/availability/policyCatalog.js +1 -1
  132. package/dist/src/availability/policyCatalog.js.map +1 -1
  133. package/dist/src/availability/policyHelpers.js +43 -32
  134. package/dist/src/availability/policyHelpers.js.map +1 -1
  135. package/dist/src/availability/policyHelpers.test.js +12 -1
  136. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  137. package/dist/src/code_assist/admin/admin_controls.js +1 -1
  138. package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
  139. package/dist/src/code_assist/experiments/flagNames.d.ts +1 -0
  140. package/dist/src/code_assist/experiments/flagNames.js +1 -0
  141. package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
  142. package/dist/src/code_assist/oauth2.js +8 -3
  143. package/dist/src/code_assist/oauth2.js.map +1 -1
  144. package/dist/src/code_assist/oauth2.test.js +57 -0
  145. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  146. package/dist/src/code_assist/server.js +1 -1
  147. package/dist/src/code_assist/server.js.map +1 -1
  148. package/dist/src/code_assist/setup.js +5 -2
  149. package/dist/src/code_assist/setup.js.map +1 -1
  150. package/dist/src/code_assist/setup.test.js +27 -1
  151. package/dist/src/code_assist/setup.test.js.map +1 -1
  152. package/dist/src/code_assist/types.d.ts +80 -80
  153. package/dist/src/commands/memory.js +1 -1
  154. package/dist/src/commands/memory.js.map +1 -1
  155. package/dist/src/config/agent-loop-context.d.ts +2 -0
  156. package/dist/src/config/config.d.ts +91 -23
  157. package/dist/src/config/config.js +238 -79
  158. package/dist/src/config/config.js.map +1 -1
  159. package/dist/src/config/config.test.js +189 -15
  160. package/dist/src/config/config.test.js.map +1 -1
  161. package/dist/src/config/defaultModelConfigs.js +9 -0
  162. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  163. package/dist/src/config/extensions/integrity.js +1 -1
  164. package/dist/src/config/extensions/integrity.js.map +1 -1
  165. package/dist/src/config/memory.d.ts +1 -0
  166. package/dist/src/config/memory.js +6 -0
  167. package/dist/src/config/memory.js.map +1 -1
  168. package/dist/src/config/projectRegistry.js +5 -3
  169. package/dist/src/config/projectRegistry.js.map +1 -1
  170. package/dist/src/config/scoped-config.d.ts +30 -0
  171. package/dist/src/config/scoped-config.js +69 -0
  172. package/dist/src/config/scoped-config.js.map +1 -0
  173. package/dist/src/config/scoped-config.test.d.ts +6 -0
  174. package/dist/src/config/scoped-config.test.js +161 -0
  175. package/dist/src/config/scoped-config.test.js.map +1 -0
  176. package/dist/src/config/storage.d.ts +3 -0
  177. package/dist/src/config/storage.js +9 -0
  178. package/dist/src/config/storage.js.map +1 -1
  179. package/dist/src/config/storage.test.js +10 -5
  180. package/dist/src/config/storage.test.js.map +1 -1
  181. package/dist/src/config/topicState.d.ts +21 -0
  182. package/dist/src/config/topicState.js +41 -0
  183. package/dist/src/config/topicState.js.map +1 -0
  184. package/dist/src/confirmation-bus/types.d.ts +13 -4
  185. package/dist/src/confirmation-bus/types.js +2 -0
  186. package/dist/src/confirmation-bus/types.js.map +1 -1
  187. package/dist/src/context/agentHistoryProvider.d.ts +45 -0
  188. package/dist/src/context/agentHistoryProvider.js +294 -0
  189. package/dist/src/context/agentHistoryProvider.js.map +1 -0
  190. package/dist/src/context/agentHistoryProvider.test.d.ts +6 -0
  191. package/dist/src/context/agentHistoryProvider.test.js +357 -0
  192. package/dist/src/context/agentHistoryProvider.test.js.map +1 -0
  193. package/dist/src/context/chatCompressionService.js.map +1 -0
  194. package/dist/src/context/chatCompressionService.test.js.map +1 -0
  195. package/dist/src/context/contextCompressionService.d.ts +30 -0
  196. package/dist/src/context/contextCompressionService.js +405 -0
  197. package/dist/src/context/contextCompressionService.js.map +1 -0
  198. package/dist/src/context/contextCompressionService.test.js +253 -0
  199. package/dist/src/context/contextCompressionService.test.js.map +1 -0
  200. package/dist/src/{services/contextManager.d.ts → context/memoryContextManager.d.ts} +3 -1
  201. package/dist/src/{services/contextManager.js → context/memoryContextManager.js} +20 -11
  202. package/dist/src/context/memoryContextManager.js.map +1 -0
  203. package/dist/src/{services/contextManager.test.js → context/memoryContextManager.test.js} +42 -33
  204. package/dist/src/context/memoryContextManager.test.js.map +1 -0
  205. package/dist/src/context/profiles.d.ts +7 -0
  206. package/dist/src/context/profiles.js +21 -0
  207. package/dist/src/context/profiles.js.map +1 -0
  208. package/dist/src/context/toolDistillationService.d.ts +38 -0
  209. package/dist/src/context/toolDistillationService.js +170 -0
  210. package/dist/src/context/toolDistillationService.js.map +1 -0
  211. package/dist/src/context/toolDistillationService.test.d.ts +6 -0
  212. package/dist/src/context/toolDistillationService.test.js +86 -0
  213. package/dist/src/context/toolDistillationService.test.js.map +1 -0
  214. package/dist/src/{services → context}/toolOutputMaskingService.d.ts +2 -2
  215. package/dist/src/{services → context}/toolOutputMaskingService.js +7 -7
  216. package/dist/src/context/toolOutputMaskingService.js.map +1 -0
  217. package/dist/src/context/toolOutputMaskingService.test.d.ts +6 -0
  218. package/dist/src/{services → context}/toolOutputMaskingService.test.js +4 -5
  219. package/dist/src/context/toolOutputMaskingService.test.js.map +1 -0
  220. package/dist/src/context/truncation.d.ts +26 -0
  221. package/dist/src/context/truncation.js +102 -0
  222. package/dist/src/context/truncation.js.map +1 -0
  223. package/dist/src/context/types.d.ts +36 -0
  224. package/dist/src/context/types.js +7 -0
  225. package/dist/src/context/types.js.map +1 -0
  226. package/dist/src/core/AuthenticatedContentGenerator.js +9 -1
  227. package/dist/src/core/AuthenticatedContentGenerator.js.map +1 -1
  228. package/dist/src/core/baseLlmClient.js +1 -1
  229. package/dist/src/core/baseLlmClient.js.map +1 -1
  230. package/dist/src/core/baseLlmClient.test.js +1 -0
  231. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  232. package/dist/src/core/client.d.ts +3 -1
  233. package/dist/src/core/client.js +24 -14
  234. package/dist/src/core/client.js.map +1 -1
  235. package/dist/src/core/client.test.js +36 -40
  236. package/dist/src/core/client.test.js.map +1 -1
  237. package/dist/src/core/contentGenerator.d.ts +0 -1
  238. package/dist/src/core/contentGenerator.js +2 -28
  239. package/dist/src/core/contentGenerator.js.map +1 -1
  240. package/dist/src/core/contentGenerator.test.js +1 -101
  241. package/dist/src/core/contentGenerator.test.js.map +1 -1
  242. package/dist/src/core/geminiChat.js +12 -5
  243. package/dist/src/core/geminiChat.js.map +1 -1
  244. package/dist/src/core/geminiChat.test.js +72 -18
  245. package/dist/src/core/geminiChat.test.js.map +1 -1
  246. package/dist/src/core/geminiChat_network_retry.test.js +1 -0
  247. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  248. package/dist/src/core/logger.js +4 -4
  249. package/dist/src/core/logger.js.map +1 -1
  250. package/dist/src/core/logger.test.js +1 -1
  251. package/dist/src/core/logger.test.js.map +1 -1
  252. package/dist/src/core/loggingContentGenerator.js +1 -1
  253. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  254. package/dist/src/core/prompts-substitution.test.js +5 -0
  255. package/dist/src/core/prompts-substitution.test.js.map +1 -1
  256. package/dist/src/core/prompts.test.js +3 -0
  257. package/dist/src/core/prompts.test.js.map +1 -1
  258. package/dist/src/generated/git-commit.d.ts +2 -2
  259. package/dist/src/generated/git-commit.js +2 -2
  260. package/dist/src/hooks/hookEventHandler.js +8 -0
  261. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  262. package/dist/src/hooks/hookRunner.js +9 -5
  263. package/dist/src/hooks/hookRunner.js.map +1 -1
  264. package/dist/src/hooks/hookRunner.test.js +20 -3
  265. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  266. package/dist/src/hooks/hookSystem.d.ts +2 -0
  267. package/dist/src/hooks/hookSystem.js +1 -0
  268. package/dist/src/hooks/hookSystem.js.map +1 -1
  269. package/dist/src/hooks/hookTranslator.js +20 -13
  270. package/dist/src/hooks/hookTranslator.js.map +1 -1
  271. package/dist/src/hooks/hookTranslator.test.js +36 -0
  272. package/dist/src/hooks/hookTranslator.test.js.map +1 -1
  273. package/dist/src/hooks/types.d.ts +2 -0
  274. package/dist/src/ide/ide-client.js +3 -3
  275. package/dist/src/ide/ide-client.js.map +1 -1
  276. package/dist/src/ide/ide-connection-utils.js +1 -1
  277. package/dist/src/ide/ide-connection-utils.js.map +1 -1
  278. package/dist/src/ide/ide-installer.js +5 -4
  279. package/dist/src/ide/ide-installer.js.map +1 -1
  280. package/dist/src/ide/process-utils.js +3 -3
  281. package/dist/src/ide/process-utils.js.map +1 -1
  282. package/dist/src/index.d.ts +10 -3
  283. package/dist/src/index.js +13 -5
  284. package/dist/src/index.js.map +1 -1
  285. package/dist/src/mcp/mcpLauncher.js +1 -1
  286. package/dist/src/output/json-formatter.js +2 -1
  287. package/dist/src/output/json-formatter.js.map +1 -1
  288. package/dist/src/policy/config.d.ts +1 -1
  289. package/dist/src/policy/config.js +61 -24
  290. package/dist/src/policy/config.js.map +1 -1
  291. package/dist/src/policy/config.test.js +21 -20
  292. package/dist/src/policy/config.test.js.map +1 -1
  293. package/dist/src/policy/persistence.test.js +42 -0
  294. package/dist/src/policy/persistence.test.js.map +1 -1
  295. package/dist/src/policy/policies/discovered.toml +7 -0
  296. package/dist/src/policy/policies/memory-manager.toml +11 -1
  297. package/dist/src/policy/policies/non-interactive.toml +7 -0
  298. package/dist/src/policy/policies/plan.toml +36 -2
  299. package/dist/src/policy/policies/read-only.toml +12 -0
  300. package/dist/src/policy/policies/sandbox-default.toml +4 -4
  301. package/dist/src/policy/policies/write.toml +21 -0
  302. package/dist/src/policy/policies/yolo.toml +1 -1
  303. package/dist/src/policy/policy-engine.d.ts +2 -4
  304. package/dist/src/policy/policy-engine.js +47 -37
  305. package/dist/src/policy/policy-engine.js.map +1 -1
  306. package/dist/src/policy/policy-engine.test.js +236 -30
  307. package/dist/src/policy/policy-engine.test.js.map +1 -1
  308. package/dist/src/policy/sandboxPolicyManager.d.ts +26 -1
  309. package/dist/src/policy/sandboxPolicyManager.js +41 -12
  310. package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
  311. package/dist/src/policy/sandboxPolicyManager.test.d.ts +6 -0
  312. package/dist/src/policy/sandboxPolicyManager.test.js +61 -0
  313. package/dist/src/policy/sandboxPolicyManager.test.js.map +1 -0
  314. package/dist/src/policy/topic-policy.test.d.ts +6 -0
  315. package/dist/src/policy/topic-policy.test.js +48 -0
  316. package/dist/src/policy/topic-policy.test.js.map +1 -0
  317. package/dist/src/policy/types.d.ts +9 -6
  318. package/dist/src/policy/types.js +11 -0
  319. package/dist/src/policy/types.js.map +1 -1
  320. package/dist/src/policy/workspace-policy.test.js +18 -15
  321. package/dist/src/policy/workspace-policy.test.js.map +1 -1
  322. package/dist/src/prompts/promptProvider.js +20 -4
  323. package/dist/src/prompts/promptProvider.js.map +1 -1
  324. package/dist/src/prompts/promptProvider.test.js +84 -1
  325. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  326. package/dist/src/prompts/snippets-memory-manager.test.js +1 -1
  327. package/dist/src/prompts/snippets-memory-manager.test.js.map +1 -1
  328. package/dist/src/prompts/snippets.d.ts +3 -4
  329. package/dist/src/prompts/snippets.js +37 -52
  330. package/dist/src/prompts/snippets.js.map +1 -1
  331. package/dist/src/prompts/snippets.legacy.d.ts +6 -4
  332. package/dist/src/prompts/snippets.legacy.js +36 -7
  333. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  334. package/dist/src/prompts/utils.test.js +7 -5
  335. package/dist/src/prompts/utils.test.js.map +1 -1
  336. package/dist/src/safety/built-in.js +1 -1
  337. package/dist/src/safety/built-in.js.map +1 -1
  338. package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +11 -1
  339. package/dist/src/sandbox/linux/LinuxSandboxManager.js +131 -41
  340. package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
  341. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +82 -139
  342. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
  343. package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +24 -0
  344. package/dist/src/sandbox/linux/bwrapArgsBuilder.js +200 -0
  345. package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -0
  346. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.d.ts +6 -0
  347. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +247 -0
  348. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -0
  349. package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +10 -22
  350. package/dist/src/sandbox/macos/MacOsSandboxManager.js +67 -59
  351. package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
  352. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +168 -103
  353. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
  354. package/dist/src/sandbox/macos/baseProfile.d.ts +1 -1
  355. package/dist/src/sandbox/macos/baseProfile.js +26 -8
  356. package/dist/src/sandbox/macos/baseProfile.js.map +1 -1
  357. package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +10 -10
  358. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +81 -93
  359. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
  360. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +136 -99
  361. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
  362. package/dist/src/sandbox/{macos → utils}/commandSafety.d.ts +11 -0
  363. package/dist/src/sandbox/{macos → utils}/commandSafety.js +47 -14
  364. package/dist/src/sandbox/utils/commandSafety.js.map +1 -0
  365. package/dist/src/sandbox/utils/commandUtils.d.ts +9 -0
  366. package/dist/src/sandbox/utils/commandUtils.js +57 -0
  367. package/dist/src/sandbox/utils/commandUtils.js.map +1 -0
  368. package/dist/src/sandbox/utils/fsUtils.d.ts +11 -0
  369. package/dist/src/sandbox/utils/fsUtils.js +84 -0
  370. package/dist/src/sandbox/utils/fsUtils.js.map +1 -0
  371. package/dist/src/sandbox/utils/fsUtils.test.d.ts +6 -0
  372. package/dist/src/sandbox/utils/fsUtils.test.js +43 -0
  373. package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -0
  374. package/dist/src/sandbox/utils/proactivePermissions.d.ts +19 -0
  375. package/dist/src/sandbox/utils/proactivePermissions.js +163 -0
  376. package/dist/src/sandbox/utils/proactivePermissions.js.map +1 -0
  377. package/dist/src/sandbox/utils/proactivePermissions.test.d.ts +6 -0
  378. package/dist/src/sandbox/utils/proactivePermissions.test.js +145 -0
  379. package/dist/src/sandbox/utils/proactivePermissions.test.js.map +1 -0
  380. package/dist/src/sandbox/utils/sandboxDenialUtils.d.ts +27 -0
  381. package/dist/src/sandbox/utils/sandboxDenialUtils.js +142 -0
  382. package/dist/src/sandbox/utils/sandboxDenialUtils.js.map +1 -0
  383. package/dist/src/sandbox/utils/sandboxDenialUtils.test.d.ts +6 -0
  384. package/dist/src/sandbox/utils/sandboxDenialUtils.test.js +188 -0
  385. package/dist/src/sandbox/utils/sandboxDenialUtils.test.js.map +1 -0
  386. package/dist/src/sandbox/utils/sandboxReadWriteUtils.d.ts +5 -0
  387. package/dist/src/sandbox/utils/sandboxReadWriteUtils.js +64 -0
  388. package/dist/src/sandbox/utils/sandboxReadWriteUtils.js.map +1 -0
  389. package/dist/src/sandbox/windows/GeminiSandbox.cs +312 -223
  390. package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +16 -2
  391. package/dist/src/sandbox/windows/WindowsSandboxManager.js +261 -44
  392. package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
  393. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +379 -17
  394. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
  395. package/dist/src/sandbox/windows/commandSafety.d.ts +19 -0
  396. package/dist/src/sandbox/windows/commandSafety.js +128 -0
  397. package/dist/src/sandbox/windows/commandSafety.js.map +1 -0
  398. package/dist/src/sandbox/windows/commandSafety.test.d.ts +6 -0
  399. package/dist/src/sandbox/windows/commandSafety.test.js +42 -0
  400. package/dist/src/sandbox/windows/commandSafety.test.js.map +1 -0
  401. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.d.ts +13 -0
  402. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js +69 -0
  403. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js.map +1 -0
  404. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.d.ts +6 -0
  405. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js +68 -0
  406. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js.map +1 -0
  407. package/dist/src/scheduler/policy.js +20 -5
  408. package/dist/src/scheduler/policy.js.map +1 -1
  409. package/dist/src/scheduler/policy.test.js +80 -0
  410. package/dist/src/scheduler/policy.test.js.map +1 -1
  411. package/dist/src/scheduler/scheduler.js +13 -3
  412. package/dist/src/scheduler/scheduler.js.map +1 -1
  413. package/dist/src/scheduler/scheduler.test.js +52 -0
  414. package/dist/src/scheduler/scheduler.test.js.map +1 -1
  415. package/dist/src/scheduler/scheduler_hooks.test.js +1 -0
  416. package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
  417. package/dist/src/scheduler/state-manager.js +1 -1
  418. package/dist/src/scheduler/state-manager.js.map +1 -1
  419. package/dist/src/scheduler/state-manager.test.js +10 -0
  420. package/dist/src/scheduler/state-manager.test.js.map +1 -1
  421. package/dist/src/scheduler/tool-executor.js +7 -2
  422. package/dist/src/scheduler/tool-executor.js.map +1 -1
  423. package/dist/src/scheduler/tool-executor.test.js +38 -0
  424. package/dist/src/scheduler/tool-executor.test.js.map +1 -1
  425. package/dist/src/scheduler/types.d.ts +4 -2
  426. package/dist/src/services/chatRecordingService.d.ts +1 -13
  427. package/dist/src/services/chatRecordingService.js +45 -46
  428. package/dist/src/services/chatRecordingService.js.map +1 -1
  429. package/dist/src/services/chatRecordingService.test.js +79 -10
  430. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  431. package/dist/src/services/executionLifecycleService.d.ts +44 -6
  432. package/dist/src/services/executionLifecycleService.js +52 -12
  433. package/dist/src/services/executionLifecycleService.js.map +1 -1
  434. package/dist/src/services/executionLifecycleService.test.js +157 -3
  435. package/dist/src/services/executionLifecycleService.test.js.map +1 -1
  436. package/dist/src/services/fileDiscoveryService.d.ts +17 -2
  437. package/dist/src/services/fileDiscoveryService.js +84 -20
  438. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  439. package/dist/src/services/fileDiscoveryService.test.js +67 -1
  440. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  441. package/dist/src/services/gitService.js +1 -1
  442. package/dist/src/services/gitService.js.map +1 -1
  443. package/dist/src/services/memoryService.d.ts +65 -0
  444. package/dist/src/services/memoryService.js +511 -0
  445. package/dist/src/services/memoryService.js.map +1 -0
  446. package/dist/src/services/memoryService.test.d.ts +6 -0
  447. package/dist/src/services/memoryService.test.js +563 -0
  448. package/dist/src/services/memoryService.test.js.map +1 -0
  449. package/dist/src/services/modelConfigService.d.ts +11 -0
  450. package/dist/src/services/modelConfigService.js +67 -0
  451. package/dist/src/services/modelConfigService.js.map +1 -1
  452. package/dist/src/services/modelConfigService.test.js +30 -0
  453. package/dist/src/services/modelConfigService.test.js.map +1 -1
  454. package/dist/src/services/sandboxManager.d.ts +107 -8
  455. package/dist/src/services/sandboxManager.integration.test.d.ts +1 -0
  456. package/dist/src/services/sandboxManager.integration.test.js +445 -0
  457. package/dist/src/services/sandboxManager.integration.test.js.map +1 -0
  458. package/dist/src/services/sandboxManager.js +176 -13
  459. package/dist/src/services/sandboxManager.js.map +1 -1
  460. package/dist/src/services/sandboxManager.test.js +401 -117
  461. package/dist/src/services/sandboxManager.test.js.map +1 -1
  462. package/dist/src/services/sandboxManagerFactory.d.ts +2 -3
  463. package/dist/src/services/sandboxManagerFactory.js +12 -22
  464. package/dist/src/services/sandboxManagerFactory.js.map +1 -1
  465. package/dist/src/services/sandboxedFileSystemService.d.ts +1 -0
  466. package/dist/src/services/sandboxedFileSystemService.js +43 -3
  467. package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
  468. package/dist/src/services/sandboxedFileSystemService.test.js +97 -11
  469. package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -1
  470. package/dist/src/services/shellExecutionService.d.ts +18 -1
  471. package/dist/src/services/shellExecutionService.js +115 -26
  472. package/dist/src/services/shellExecutionService.js.map +1 -1
  473. package/dist/src/services/shellExecutionService.test.js +70 -8
  474. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  475. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +4 -0
  476. package/dist/src/services/test-data/resolved-aliases.golden.json +4 -0
  477. package/dist/src/services/worktreeService.test.js +7 -7
  478. package/dist/src/services/worktreeService.test.js.map +1 -1
  479. package/dist/src/skills/skillLoader.d.ts +8 -0
  480. package/dist/src/skills/skillLoader.js +1 -1
  481. package/dist/src/skills/skillLoader.js.map +1 -1
  482. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +29 -1
  483. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +107 -0
  484. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  485. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +172 -1
  486. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  487. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +10 -1
  488. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +22 -1
  489. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  490. package/dist/src/telemetry/loggers.d.ts +22 -0
  491. package/dist/src/telemetry/loggers.js +41 -2
  492. package/dist/src/telemetry/loggers.js.map +1 -1
  493. package/dist/src/telemetry/loggers.test.js +8 -3
  494. package/dist/src/telemetry/loggers.test.js.map +1 -1
  495. package/dist/src/telemetry/metrics.d.ts +118 -1
  496. package/dist/src/telemetry/metrics.js +196 -4
  497. package/dist/src/telemetry/metrics.js.map +1 -1
  498. package/dist/src/telemetry/metrics.test.js +298 -0
  499. package/dist/src/telemetry/metrics.test.js.map +1 -1
  500. package/dist/src/telemetry/types.d.ts +3 -3
  501. package/dist/src/telemetry/types.js +9 -4
  502. package/dist/src/telemetry/types.js.map +1 -1
  503. package/dist/src/test-utils/mock-message-bus.d.ts +1 -1
  504. package/dist/src/test-utils/mock-message-bus.js +1 -1
  505. package/dist/src/test-utils/mock-message-bus.js.map +1 -1
  506. package/dist/src/tools/complete-task.d.ts +29 -0
  507. package/dist/src/tools/complete-task.js +123 -0
  508. package/dist/src/tools/complete-task.js.map +1 -0
  509. package/dist/src/tools/complete-task.test.d.ts +6 -0
  510. package/dist/src/tools/complete-task.test.js +114 -0
  511. package/dist/src/tools/complete-task.test.js.map +1 -0
  512. package/dist/src/tools/definitions/base-declarations.d.ts +8 -0
  513. package/dist/src/tools/definitions/base-declarations.js +10 -0
  514. package/dist/src/tools/definitions/base-declarations.js.map +1 -1
  515. package/dist/src/tools/definitions/coreTools.d.ts +2 -1
  516. package/dist/src/tools/definitions/coreTools.js +9 -3
  517. package/dist/src/tools/definitions/coreTools.js.map +1 -1
  518. package/dist/src/tools/definitions/dynamic-declaration-helpers.d.ts +4 -0
  519. package/dist/src/tools/definitions/dynamic-declaration-helpers.js +33 -2
  520. package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
  521. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +14 -9
  522. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  523. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +13 -7
  524. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  525. package/dist/src/tools/definitions/trackerTools.js +3 -3
  526. package/dist/src/tools/definitions/trackerTools.js.map +1 -1
  527. package/dist/src/tools/definitions/types.d.ts +1 -0
  528. package/dist/src/tools/enter-plan-mode.js +15 -0
  529. package/dist/src/tools/enter-plan-mode.js.map +1 -1
  530. package/dist/src/tools/enter-plan-mode.test.js +25 -0
  531. package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
  532. package/dist/src/tools/grep-utils.d.ts +2 -1
  533. package/dist/src/tools/grep-utils.js +22 -3
  534. package/dist/src/tools/grep-utils.js.map +1 -1
  535. package/dist/src/tools/grep.js +16 -3
  536. package/dist/src/tools/grep.js.map +1 -1
  537. package/dist/src/tools/grep.test.js +36 -8
  538. package/dist/src/tools/grep.test.js.map +1 -1
  539. package/dist/src/tools/jit-context.js +3 -3
  540. package/dist/src/tools/jit-context.js.map +1 -1
  541. package/dist/src/tools/jit-context.test.js +15 -13
  542. package/dist/src/tools/jit-context.test.js.map +1 -1
  543. package/dist/src/tools/ls.js +6 -4
  544. package/dist/src/tools/ls.js.map +1 -1
  545. package/dist/src/tools/ls.test.js +22 -7
  546. package/dist/src/tools/ls.test.js.map +1 -1
  547. package/dist/src/tools/mcp-client-manager.js +6 -3
  548. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  549. package/dist/src/tools/mcp-client-manager.test.js +35 -0
  550. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  551. package/dist/src/tools/mcp-client.js +1 -1
  552. package/dist/src/tools/mcp-client.js.map +1 -1
  553. package/dist/src/tools/mcp-tool.test.js +1 -1
  554. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  555. package/dist/src/tools/memoryTool.d.ts +9 -2
  556. package/dist/src/tools/memoryTool.js +39 -15
  557. package/dist/src/tools/memoryTool.js.map +1 -1
  558. package/dist/src/tools/memoryTool.test.js +61 -2
  559. package/dist/src/tools/memoryTool.test.js.map +1 -1
  560. package/dist/src/tools/read-many-files.js +12 -4
  561. package/dist/src/tools/read-many-files.js.map +1 -1
  562. package/dist/src/tools/read-many-files.test.js +17 -17
  563. package/dist/src/tools/read-many-files.test.js.map +1 -1
  564. package/dist/src/tools/ripGrep.js +14 -1
  565. package/dist/src/tools/ripGrep.js.map +1 -1
  566. package/dist/src/tools/ripGrep.test.js +10 -10
  567. package/dist/src/tools/ripGrep.test.js.map +1 -1
  568. package/dist/src/tools/shell.d.ts +17 -4
  569. package/dist/src/tools/shell.js +342 -151
  570. package/dist/src/tools/shell.js.map +1 -1
  571. package/dist/src/tools/shell.test.js +204 -11
  572. package/dist/src/tools/shell.test.js.map +1 -1
  573. package/dist/src/tools/shellBackgroundTools.d.ts +38 -0
  574. package/dist/src/tools/shellBackgroundTools.integration.test.d.ts +6 -0
  575. package/dist/src/tools/shellBackgroundTools.integration.test.js +86 -0
  576. package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -0
  577. package/dist/src/tools/shellBackgroundTools.js +186 -0
  578. package/dist/src/tools/shellBackgroundTools.js.map +1 -0
  579. package/dist/src/tools/shellBackgroundTools.test.d.ts +6 -0
  580. package/dist/src/tools/shellBackgroundTools.test.js +230 -0
  581. package/dist/src/tools/shellBackgroundTools.test.js.map +1 -0
  582. package/dist/src/tools/shell_proactive.test.d.ts +6 -0
  583. package/dist/src/tools/shell_proactive.test.js +122 -0
  584. package/dist/src/tools/shell_proactive.test.js.map +1 -0
  585. package/dist/src/tools/tool-names.d.ts +4 -4
  586. package/dist/src/tools/tool-names.js +6 -3
  587. package/dist/src/tools/tool-names.js.map +1 -1
  588. package/dist/src/tools/tool-registry.js +11 -1
  589. package/dist/src/tools/tool-registry.js.map +1 -1
  590. package/dist/src/tools/tool-registry.test.js +43 -1
  591. package/dist/src/tools/tool-registry.test.js.map +1 -1
  592. package/dist/src/tools/tools.d.ts +12 -1
  593. package/dist/src/tools/tools.js +16 -1
  594. package/dist/src/tools/tools.js.map +1 -1
  595. package/dist/src/tools/tools.test.js +42 -1
  596. package/dist/src/tools/tools.test.js.map +1 -1
  597. package/dist/src/tools/topicTool.d.ts +29 -0
  598. package/dist/src/tools/topicTool.js +72 -0
  599. package/dist/src/tools/topicTool.js.map +1 -0
  600. package/dist/src/tools/topicTool.test.d.ts +6 -0
  601. package/dist/src/tools/topicTool.test.js +105 -0
  602. package/dist/src/tools/topicTool.test.js.map +1 -0
  603. package/dist/src/tools/web-fetch.js +40 -22
  604. package/dist/src/tools/web-fetch.js.map +1 -1
  605. package/dist/src/tools/web-fetch.test.js +28 -0
  606. package/dist/src/tools/web-fetch.test.js.map +1 -1
  607. package/dist/src/tools/xcode-mcp-fix-transport.js +1 -1
  608. package/dist/src/tools/xcode-mcp-fix-transport.js.map +1 -1
  609. package/dist/src/utils/bfsFileSearch.js +3 -6
  610. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  611. package/dist/src/utils/checkpointUtils.d.ts +4 -4
  612. package/dist/src/utils/checkpointUtils.js +11 -8
  613. package/dist/src/utils/checkpointUtils.js.map +1 -1
  614. package/dist/src/utils/compatibility.js +0 -7
  615. package/dist/src/utils/compatibility.js.map +1 -1
  616. package/dist/src/utils/compatibility.test.js +0 -9
  617. package/dist/src/utils/compatibility.test.js.map +1 -1
  618. package/dist/src/utils/editor.js +3 -0
  619. package/dist/src/utils/editor.js.map +1 -1
  620. package/dist/src/utils/errorParsing.js +2 -2
  621. package/dist/src/utils/errorParsing.js.map +1 -1
  622. package/dist/src/utils/errors.d.ts +3 -0
  623. package/dist/src/utils/errors.js +28 -6
  624. package/dist/src/utils/errors.js.map +1 -1
  625. package/dist/src/utils/errors.test.js +23 -0
  626. package/dist/src/utils/errors.test.js.map +1 -1
  627. package/dist/src/utils/events.d.ts +12 -0
  628. package/dist/src/utils/events.js +7 -0
  629. package/dist/src/utils/events.js.map +1 -1
  630. package/dist/src/utils/fetch.d.ts +1 -0
  631. package/dist/src/utils/fetch.js +22 -6
  632. package/dist/src/utils/fetch.js.map +1 -1
  633. package/dist/src/utils/fetch.test.js +26 -1
  634. package/dist/src/utils/fetch.test.js.map +1 -1
  635. package/dist/src/utils/fileUtils.js +1 -1
  636. package/dist/src/utils/fileUtils.js.map +1 -1
  637. package/dist/src/utils/filesearch/crawler.js +1 -1
  638. package/dist/src/utils/filesearch/crawler.js.map +1 -1
  639. package/dist/src/utils/filesearch/fileSearch.test.js +7 -2
  640. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  641. package/dist/src/utils/getFolderStructure.js +1 -1
  642. package/dist/src/utils/getFolderStructure.js.map +1 -1
  643. package/dist/src/utils/getPty.js +2 -2
  644. package/dist/src/utils/getPty.js.map +1 -1
  645. package/dist/src/utils/gitIgnoreParser.d.ts +2 -2
  646. package/dist/src/utils/gitIgnoreParser.js +30 -52
  647. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  648. package/dist/src/utils/gitIgnoreParser.test.js +51 -185
  649. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  650. package/dist/src/utils/gitUtils.js +2 -2
  651. package/dist/src/utils/gitUtils.js.map +1 -1
  652. package/dist/src/utils/googleErrors.js +5 -5
  653. package/dist/src/utils/googleErrors.js.map +1 -1
  654. package/dist/src/utils/ignoreFileParser.d.ts +2 -2
  655. package/dist/src/utils/ignoreFileParser.js +7 -18
  656. package/dist/src/utils/ignoreFileParser.js.map +1 -1
  657. package/dist/src/utils/ignoreFileParser.test.js +40 -132
  658. package/dist/src/utils/ignoreFileParser.test.js.map +1 -1
  659. package/dist/src/utils/ignorePathUtils.d.ts +11 -0
  660. package/dist/src/utils/ignorePathUtils.js +39 -0
  661. package/dist/src/utils/ignorePathUtils.js.map +1 -0
  662. package/dist/src/utils/ignorePathUtils.test.d.ts +6 -0
  663. package/dist/src/utils/ignorePathUtils.test.js +70 -0
  664. package/dist/src/utils/ignorePathUtils.test.js.map +1 -0
  665. package/dist/src/utils/memoryDiscovery.d.ts +6 -4
  666. package/dist/src/utils/memoryDiscovery.js +69 -48
  667. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  668. package/dist/src/utils/memoryDiscovery.test.js +40 -0
  669. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  670. package/dist/src/utils/memoryImportProcessor.d.ts +1 -1
  671. package/dist/src/utils/memoryImportProcessor.js +24 -15
  672. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  673. package/dist/src/utils/paths.d.ts +8 -0
  674. package/dist/src/utils/paths.js +37 -6
  675. package/dist/src/utils/paths.js.map +1 -1
  676. package/dist/src/utils/paths.test.js +61 -3
  677. package/dist/src/utils/paths.test.js.map +1 -1
  678. package/dist/src/utils/process-utils.js +2 -2
  679. package/dist/src/utils/process-utils.js.map +1 -1
  680. package/dist/src/utils/retry.js +7 -0
  681. package/dist/src/utils/retry.js.map +1 -1
  682. package/dist/src/utils/retry.test.js +41 -0
  683. package/dist/src/utils/retry.test.js.map +1 -1
  684. package/dist/src/utils/secure-browser-launcher.js +1 -1
  685. package/dist/src/utils/secure-browser-launcher.js.map +1 -1
  686. package/dist/src/utils/sessionOperations.d.ts +19 -0
  687. package/dist/src/utils/sessionOperations.js +101 -0
  688. package/dist/src/utils/sessionOperations.js.map +1 -0
  689. package/dist/src/utils/sessionOperations.test.d.ts +6 -0
  690. package/dist/src/utils/sessionOperations.test.js +92 -0
  691. package/dist/src/utils/sessionOperations.test.js.map +1 -0
  692. package/dist/src/utils/shell-utils.d.ts +24 -0
  693. package/dist/src/utils/shell-utils.integration.test.js +1 -1
  694. package/dist/src/utils/shell-utils.integration.test.js.map +1 -1
  695. package/dist/src/utils/shell-utils.js +86 -6
  696. package/dist/src/utils/shell-utils.js.map +1 -1
  697. package/dist/src/utils/shell-utils.test.js +13 -1
  698. package/dist/src/utils/shell-utils.test.js.map +1 -1
  699. package/dist/src/utils/systemEncoding.js +1 -1
  700. package/dist/src/utils/systemEncoding.js.map +1 -1
  701. package/dist/src/utils/terminalSerializer.d.ts +1 -0
  702. package/dist/src/utils/terminalSerializer.js +31 -8
  703. package/dist/src/utils/terminalSerializer.js.map +1 -1
  704. package/dist/src/utils/terminalSerializer.test.js +3 -2
  705. package/dist/src/utils/terminalSerializer.test.js.map +1 -1
  706. package/dist/src/utils/textUtils.d.ts +8 -0
  707. package/dist/src/utils/textUtils.js +16 -0
  708. package/dist/src/utils/textUtils.js.map +1 -1
  709. package/dist/src/utils/tokenCalculation.d.ts +2 -0
  710. package/dist/src/utils/tokenCalculation.js +2 -2
  711. package/dist/src/utils/tokenCalculation.js.map +1 -1
  712. package/dist/src/utils/workspaceContext.js +2 -2
  713. package/dist/src/utils/workspaceContext.js.map +1 -1
  714. package/dist/tsconfig.tsbuildinfo +1 -1
  715. package/package.json +2 -1
  716. package/dist/docs/CONTRIBUTING.md +0 -566
  717. package/dist/docs/get-started/examples.md +0 -141
  718. package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js +0 -164
  719. package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js.map +0 -1
  720. package/dist/src/sandbox/macos/commandSafety.js.map +0 -1
  721. package/dist/src/services/chatCompressionService.js.map +0 -1
  722. package/dist/src/services/chatCompressionService.test.js.map +0 -1
  723. package/dist/src/services/contextManager.js.map +0 -1
  724. package/dist/src/services/contextManager.test.js.map +0 -1
  725. package/dist/src/services/toolOutputMaskingService.js.map +0 -1
  726. package/dist/src/services/toolOutputMaskingService.test.js.map +0 -1
  727. /package/dist/src/{services/toolOutputMaskingService.test.d.ts → agents/browser/snapshotSuperseder.test.d.ts} +0 -0
  728. /package/dist/src/{services → context}/chatCompressionService.d.ts +0 -0
  729. /package/dist/src/{services → context}/chatCompressionService.js +0 -0
  730. /package/dist/src/{services → context}/chatCompressionService.test.d.ts +0 -0
  731. /package/dist/src/{services → context}/chatCompressionService.test.js +0 -0
  732. /package/dist/src/{sandbox/macos/MacOsSandboxManager.integration.test.d.ts → context/contextCompressionService.test.d.ts} +0 -0
  733. /package/dist/src/{services/contextManager.test.d.ts → context/memoryContextManager.test.d.ts} +0 -0
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
7
- const { mockSendMessageStream, mockScheduleAgentTools, mockSetSystemInstruction, mockCompress, mockMaybeDiscoverMcpServer, mockStopMcp, } = vi.hoisted(() => ({
7
+ const { mockSendMessageStream, mockScheduleAgentTools, mockSetSystemInstruction, mockRecordCompletedToolCalls, mockSaveSummary, mockCompress, mockMaybeDiscoverMcpServer, mockStopMcp, } = vi.hoisted(() => ({
8
8
  mockSendMessageStream: vi.fn().mockResolvedValue({
9
9
  async *[Symbol.asyncIterator]() {
10
10
  yield {
@@ -15,6 +15,8 @@ const { mockSendMessageStream, mockScheduleAgentTools, mockSetSystemInstruction,
15
15
  }),
16
16
  mockScheduleAgentTools: vi.fn(),
17
17
  mockSetSystemInstruction: vi.fn(),
18
+ mockRecordCompletedToolCalls: vi.fn(),
19
+ mockSaveSummary: vi.fn(),
18
20
  mockCompress: vi.fn(),
19
21
  mockMaybeDiscoverMcpServer: vi.fn().mockResolvedValue(undefined),
20
22
  mockStopMcp: vi.fn().mockResolvedValue(undefined),
@@ -33,7 +35,7 @@ import { PromptRegistry } from '../prompts/prompt-registry.js';
33
35
  import { ResourceRegistry } from '../resources/resource-registry.js';
34
36
  import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
35
37
  import { LSTool } from '../tools/ls.js';
36
- import { LS_TOOL_NAME, READ_FILE_TOOL_NAME } from '../tools/tool-names.js';
38
+ import { COMPLETE_TASK_TOOL_NAME, LS_TOOL_NAME, READ_FILE_TOOL_NAME, } from '../tools/tool-names.js';
37
39
  import { GeminiChat, StreamEventType, } from '../core/geminiChat.js';
38
40
  import {} from '@google/genai';
39
41
  import { MockTool } from '../test-utils/mock-tool.js';
@@ -47,29 +49,32 @@ import { AgentTerminateMode, SubagentActivityErrorType, } from './types.js';
47
49
  import { ToolConfirmationOutcome, } from '../tools/tools.js';
48
50
  import { CoreToolCallStatus, } from '../scheduler/types.js';
49
51
  import { CompressionStatus } from '../core/turn.js';
50
- import { ChatCompressionService } from '../services/chatCompressionService.js';
52
+ import { ChatCompressionService } from '../context/chatCompressionService.js';
51
53
  import { getModelConfigAlias } from './registry.js';
52
54
  let mockChatHistory = [];
53
55
  const mockSetHistory = vi.fn((newHistory) => {
54
56
  mockChatHistory = newHistory;
55
57
  });
56
- vi.mock('../services/chatCompressionService.js', () => ({
58
+ vi.mock('../context/chatCompressionService.js', () => ({
57
59
  ChatCompressionService: vi.fn().mockImplementation(() => ({
58
60
  compress: mockCompress,
59
61
  })),
60
62
  }));
61
- vi.mock('../core/geminiChat.js', async (importOriginal) => {
62
- const actual = await importOriginal();
63
- return {
64
- ...actual,
65
- GeminiChat: vi.fn().mockImplementation(() => ({
66
- sendMessageStream: mockSendMessageStream,
67
- getHistory: vi.fn((_curated) => [...mockChatHistory]),
68
- setHistory: mockSetHistory,
69
- setSystemInstruction: mockSetSystemInstruction,
70
- })),
71
- };
72
- });
63
+ vi.mock('../core/geminiChat.js', () => ({
64
+ StreamEventType: {
65
+ CHUNK: 'chunk',
66
+ },
67
+ GeminiChat: vi.fn().mockImplementation(() => ({
68
+ sendMessageStream: mockSendMessageStream,
69
+ getHistory: vi.fn((_curated) => [...mockChatHistory]),
70
+ setHistory: mockSetHistory,
71
+ setSystemInstruction: mockSetSystemInstruction,
72
+ recordCompletedToolCalls: mockRecordCompletedToolCalls,
73
+ getChatRecordingService: vi.fn().mockReturnValue({
74
+ saveSummary: mockSaveSummary,
75
+ }),
76
+ })),
77
+ }));
73
78
  vi.mock('./agent-scheduler.js', () => ({
74
79
  scheduleAgentTools: mockScheduleAgentTools,
75
80
  }));
@@ -108,6 +113,17 @@ vi.mock('../utils/promptIdContext.js', async (importOriginal) => {
108
113
  },
109
114
  };
110
115
  });
116
+ vi.mock('../config/scoped-config.js', async (importOriginal) => {
117
+ const actual = await importOriginal();
118
+ return {
119
+ ...actual,
120
+ runWithScopedWorkspaceContext: vi.fn(actual.runWithScopedWorkspaceContext),
121
+ createScopedWorkspaceContext: vi.fn(actual.createScopedWorkspaceContext),
122
+ };
123
+ });
124
+ import { runWithScopedWorkspaceContext, createScopedWorkspaceContext, } from '../config/scoped-config.js';
125
+ const mockedRunWithScopedWorkspaceContext = vi.mocked(runWithScopedWorkspaceContext);
126
+ const mockedCreateScopedWorkspaceContext = vi.mocked(createScopedWorkspaceContext);
111
127
  const MockedGeminiChat = vi.mocked(GeminiChat);
112
128
  const mockedGetDirectoryContextString = vi.mocked(getDirectoryContextString);
113
129
  const mockedPromptIdContext = vi.mocked(promptIdContext);
@@ -115,8 +131,31 @@ const mockedLogAgentStart = vi.mocked(logAgentStart);
115
131
  const mockedLogAgentFinish = vi.mocked(logAgentFinish);
116
132
  const mockedLogRecoveryAttempt = vi.mocked(logRecoveryAttempt);
117
133
  // Constants for testing
118
- const TASK_COMPLETE_TOOL_NAME = 'complete_task';
119
134
  const MOCK_TOOL_NOT_ALLOWED = new MockTool({ name: 'write_file_interactive' });
135
+ /**
136
+ * Helper to mock a successful completion result from the scheduler.
137
+ */
138
+ const mockCompletionResult = (callId, submittedOutput, toolName = COMPLETE_TASK_TOOL_NAME) => {
139
+ mockScheduleAgentTools.mockResolvedValueOnce([
140
+ {
141
+ status: 'success',
142
+ request: {
143
+ callId,
144
+ name: toolName,
145
+ args: {},
146
+ prompt_id: 'test-prompt',
147
+ },
148
+ response: {
149
+ resultDisplay: 'Task completed.',
150
+ responseParts: [],
151
+ data: {
152
+ taskCompleted: true,
153
+ submittedOutput,
154
+ },
155
+ },
156
+ },
157
+ ]);
158
+ };
120
159
  /**
121
160
  * Helper to create a mock API response chunk.
122
161
  * Uses conditional spread to handle readonly functionCalls property safely.
@@ -207,11 +246,50 @@ describe('LocalAgentExecutor', () => {
207
246
  vi.resetAllMocks();
208
247
  mockCompress.mockClear();
209
248
  mockSetHistory.mockClear();
210
- mockSendMessageStream.mockReset();
249
+ mockSendMessageStream.mockReset().mockResolvedValue({
250
+ async *[Symbol.asyncIterator]() {
251
+ yield {
252
+ type: StreamEventType.CHUNK,
253
+ value: { candidates: [] },
254
+ };
255
+ },
256
+ });
211
257
  mockSetSystemInstruction.mockReset();
212
- mockScheduleAgentTools.mockReset();
258
+ mockScheduleAgentTools
259
+ .mockReset()
260
+ .mockImplementation(async (_config, requests) =>
261
+ // Default mock behavior for scheduleAgentTools
262
+ requests.map((req) => {
263
+ if (req.name === COMPLETE_TASK_TOOL_NAME) {
264
+ return {
265
+ status: 'success',
266
+ request: req,
267
+ response: {
268
+ resultDisplay: 'Task completed.',
269
+ responseParts: [],
270
+ data: {
271
+ taskCompleted: true,
272
+ submittedOutput: req.args['finalResult'] ||
273
+ req.args['result'] ||
274
+ JSON.stringify(req.args),
275
+ },
276
+ },
277
+ };
278
+ }
279
+ return {
280
+ status: 'success',
281
+ request: req,
282
+ response: {
283
+ resultDisplay: 'Mock tool executed',
284
+ responseParts: [],
285
+ data: {},
286
+ },
287
+ };
288
+ }));
213
289
  mockedLogAgentStart.mockReset();
214
290
  mockedLogAgentFinish.mockReset();
291
+ mockedRunWithScopedWorkspaceContext.mockClear();
292
+ mockedCreateScopedWorkspaceContext.mockClear();
215
293
  mockedPromptIdContext.getStore.mockReset();
216
294
  mockedPromptIdContext.run.mockImplementation((_id, fn) => fn());
217
295
  ChatCompressionService.mockImplementation(() => ({
@@ -227,6 +305,10 @@ describe('LocalAgentExecutor', () => {
227
305
  getHistory: vi.fn((_curated) => [...mockChatHistory]),
228
306
  getLastPromptTokenCount: vi.fn(() => 100),
229
307
  setHistory: mockSetHistory,
308
+ recordCompletedToolCalls: mockRecordCompletedToolCalls,
309
+ getChatRecordingService: vi.fn().mockReturnValue({
310
+ saveSummary: mockSaveSummary,
311
+ }),
230
312
  }));
231
313
  vi.useFakeTimers();
232
314
  mockConfig = makeFakeConfig();
@@ -272,7 +354,7 @@ describe('LocalAgentExecutor', () => {
272
354
  const executor = await LocalAgentExecutor.create(definition, extendedContext, onActivity);
273
355
  mockModelResponse([
274
356
  {
275
- name: TASK_COMPLETE_TOOL_NAME,
357
+ name: COMPLETE_TASK_TOOL_NAME,
276
358
  args: { finalResult: 'done' },
277
359
  id: 'call1',
278
360
  },
@@ -282,7 +364,7 @@ describe('LocalAgentExecutor', () => {
282
364
  const executionContext = chatConstructorArgs[0];
283
365
  expect(executionContext).toBeDefined();
284
366
  expect(executionContext.config).toBe(extendedContext.config);
285
- expect(executionContext.promptId).toBe(extendedContext.promptId);
367
+ expect(executionContext.promptId).toBeDefined();
286
368
  expect(executionContext.geminiClient).toBe(extendedContext.geminiClient);
287
369
  expect(executionContext.sandboxManager).toBe(extendedContext.sandboxManager);
288
370
  const agentToolRegistry = executor['toolRegistry'];
@@ -299,7 +381,84 @@ describe('LocalAgentExecutor', () => {
299
381
  expect(executionContext.toolRegistry).not.toBe(extendedContext.toolRegistry);
300
382
  expect(executionContext.messageBus).not.toBe(extendedContext.messageBus);
301
383
  });
302
- it('should create successfully with allowed tools', async () => {
384
+ it('should propagate parentSessionId from context when creating executionContext', async () => {
385
+ const parentSessionId = 'top-level-session-id';
386
+ const currentPromptId = 'subagent-a-id';
387
+ const mockGeminiClient = {};
388
+ const mockSandboxManager = {};
389
+ const mockMessageBus = {
390
+ derive: () => ({}),
391
+ };
392
+ const mockToolRegistry = {
393
+ getMessageBus: () => mockMessageBus,
394
+ getAllToolNames: () => [],
395
+ sortTools: () => { },
396
+ };
397
+ const context = {
398
+ config: mockConfig,
399
+ promptId: currentPromptId,
400
+ parentSessionId,
401
+ toolRegistry: mockToolRegistry,
402
+ promptRegistry: {},
403
+ resourceRegistry: {},
404
+ geminiClient: mockGeminiClient,
405
+ sandboxManager: mockSandboxManager,
406
+ messageBus: mockMessageBus,
407
+ };
408
+ const definition = createTestDefinition([]);
409
+ const executor = await LocalAgentExecutor.create(definition, context);
410
+ mockModelResponse([
411
+ {
412
+ name: COMPLETE_TASK_TOOL_NAME,
413
+ args: { finalResult: 'done' },
414
+ id: 'call1',
415
+ },
416
+ ]);
417
+ await executor.run({ goal: 'test' }, signal);
418
+ const chatConstructorArgs = MockedGeminiChat.mock.calls[MockedGeminiChat.mock.calls.length - 1];
419
+ const executionContext = chatConstructorArgs[0];
420
+ expect(executionContext.parentSessionId).toBe(parentSessionId);
421
+ expect(executionContext.promptId).toBe(executor['agentId']);
422
+ });
423
+ it('should fall back to promptId if parentSessionId is missing (top-level subagent)', async () => {
424
+ const rootSessionId = 'root-session-id';
425
+ const mockGeminiClient = {};
426
+ const mockSandboxManager = {};
427
+ const mockMessageBus = {
428
+ derive: () => ({}),
429
+ };
430
+ const mockToolRegistry = {
431
+ getMessageBus: () => mockMessageBus,
432
+ getAllToolNames: () => [],
433
+ sortTools: () => { },
434
+ };
435
+ const context = {
436
+ config: mockConfig,
437
+ promptId: rootSessionId,
438
+ // parentSessionId is undefined
439
+ toolRegistry: mockToolRegistry,
440
+ promptRegistry: {},
441
+ resourceRegistry: {},
442
+ geminiClient: mockGeminiClient,
443
+ sandboxManager: mockSandboxManager,
444
+ messageBus: mockMessageBus,
445
+ };
446
+ const definition = createTestDefinition([]);
447
+ const executor = await LocalAgentExecutor.create(definition, context);
448
+ mockModelResponse([
449
+ {
450
+ name: COMPLETE_TASK_TOOL_NAME,
451
+ args: { finalResult: 'done' },
452
+ id: 'call1',
453
+ },
454
+ ]);
455
+ await executor.run({ goal: 'test' }, signal);
456
+ const chatConstructorArgs = MockedGeminiChat.mock.calls[MockedGeminiChat.mock.calls.length - 1];
457
+ const executionContext = chatConstructorArgs[0];
458
+ expect(executionContext.parentSessionId).toBe(rootSessionId);
459
+ expect(executionContext.promptId).toBe(executor['agentId']);
460
+ });
461
+ it('should successfully with allowed tools', async () => {
303
462
  const definition = createTestDefinition([LS_TOOL_NAME]);
304
463
  const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
305
464
  expect(executor).toBeInstanceOf(LocalAgentExecutor);
@@ -317,8 +476,12 @@ describe('LocalAgentExecutor', () => {
317
476
  const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
318
477
  const agentRegistry = executor['toolRegistry'];
319
478
  expect(agentRegistry).not.toBe(parentToolRegistry);
320
- expect(agentRegistry.getAllToolNames()).toEqual(expect.arrayContaining([LS_TOOL_NAME, READ_FILE_TOOL_NAME]));
321
- expect(agentRegistry.getAllToolNames()).toHaveLength(2);
479
+ expect(agentRegistry.getAllToolNames()).toEqual(expect.arrayContaining([
480
+ LS_TOOL_NAME,
481
+ READ_FILE_TOOL_NAME,
482
+ COMPLETE_TASK_TOOL_NAME,
483
+ ]));
484
+ expect(agentRegistry.getAllToolNames()).toHaveLength(3);
322
485
  expect(agentRegistry.getTool(MOCK_TOOL_NOT_ALLOWED.name)).toBeUndefined();
323
486
  });
324
487
  it('should use parentPromptId from context to create agentId', async () => {
@@ -329,7 +492,7 @@ describe('LocalAgentExecutor', () => {
329
492
  });
330
493
  const definition = createTestDefinition();
331
494
  const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
332
- expect(executor['agentId']).toMatch(new RegExp(`^${parentId}-${definition.name}-`));
495
+ expect(executor['agentId']).toBeDefined();
333
496
  });
334
497
  it('should correctly apply templates to initialMessages', async () => {
335
498
  const definition = createTestDefinition();
@@ -344,7 +507,7 @@ describe('LocalAgentExecutor', () => {
344
507
  // Mock a response to prevent the loop from running forever
345
508
  mockModelResponse([
346
509
  {
347
- name: TASK_COMPLETE_TOOL_NAME,
510
+ name: COMPLETE_TASK_TOOL_NAME,
348
511
  args: { finalResult: 'done' },
349
512
  id: 'call1',
350
513
  },
@@ -450,6 +613,39 @@ describe('LocalAgentExecutor', () => {
450
613
  expect(toolNames).toContain(LS_TOOL_NAME);
451
614
  });
452
615
  });
616
+ describe('run (Workspace Scoping)', () => {
617
+ it('should use runWithScopedWorkspaceContext when workspaceDirectories is set', async () => {
618
+ const definition = createTestDefinition();
619
+ definition.workspaceDirectories = ['/tmp/extra-dir'];
620
+ const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
621
+ // Mock a simple complete_task response so run() terminates
622
+ mockModelResponse([
623
+ {
624
+ name: COMPLETE_TASK_TOOL_NAME,
625
+ args: { finalResult: 'done' },
626
+ id: 'c1',
627
+ },
628
+ ]);
629
+ await executor.run({ goal: 'test' }, signal);
630
+ expect(mockedCreateScopedWorkspaceContext).toHaveBeenCalledOnce();
631
+ expect(mockedRunWithScopedWorkspaceContext).toHaveBeenCalledOnce();
632
+ });
633
+ it('should not use runWithScopedWorkspaceContext when workspaceDirectories is not set', async () => {
634
+ const definition = createTestDefinition();
635
+ const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
636
+ // Mock a simple complete_task response so run() terminates
637
+ mockModelResponse([
638
+ {
639
+ name: COMPLETE_TASK_TOOL_NAME,
640
+ args: { finalResult: 'done' },
641
+ id: 'c1',
642
+ },
643
+ ]);
644
+ await executor.run({ goal: 'test' }, signal);
645
+ expect(mockedCreateScopedWorkspaceContext).not.toHaveBeenCalled();
646
+ expect(mockedRunWithScopedWorkspaceContext).not.toHaveBeenCalled();
647
+ });
648
+ });
453
649
  describe('run (Execution Loop and Logic)', () => {
454
650
  it('should log AgentFinish with error if run throws', async () => {
455
651
  const definition = createTestDefinition();
@@ -509,15 +705,43 @@ describe('LocalAgentExecutor', () => {
509
705
  // Turn 2: Model calls complete_task with required output
510
706
  mockModelResponse([
511
707
  {
512
- name: TASK_COMPLETE_TOOL_NAME,
708
+ name: COMPLETE_TASK_TOOL_NAME,
513
709
  args: { finalResult: 'Found file1.txt' },
514
710
  id: 'call2',
515
711
  },
516
712
  ], 'T2: Done');
713
+ mockScheduleAgentTools.mockResolvedValueOnce([
714
+ {
715
+ status: 'success',
716
+ request: {
717
+ callId: 'call2',
718
+ name: COMPLETE_TASK_TOOL_NAME,
719
+ args: { finalResult: 'Found file1.txt' },
720
+ prompt_id: 'p1',
721
+ },
722
+ response: {
723
+ resultDisplay: 'Output submitted and task completed.',
724
+ responseParts: [
725
+ {
726
+ functionResponse: {
727
+ name: COMPLETE_TASK_TOOL_NAME,
728
+ id: 'call2',
729
+ response: { result: 'Output submitted and task completed.' },
730
+ },
731
+ },
732
+ ],
733
+ data: {
734
+ taskCompleted: true,
735
+ submittedOutput: 'Found file1.txt',
736
+ },
737
+ },
738
+ },
739
+ ]);
517
740
  const output = await executor.run(inputs, signal);
518
741
  expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
742
+ expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
519
743
  const systemInstruction = MockedGeminiChat.mock.calls[0][1];
520
- expect(systemInstruction).toContain(`MUST call the \`${TASK_COMPLETE_TOOL_NAME}\` tool`);
744
+ expect(systemInstruction).toContain(`MUST call the \`${COMPLETE_TASK_TOOL_NAME}\` tool`);
521
745
  expect(systemInstruction).toContain('Mocked Environment Context');
522
746
  expect(systemInstruction).toContain('You are running in a non-interactive mode');
523
747
  expect(systemInstruction).toContain('Always use absolute paths');
@@ -530,10 +754,11 @@ describe('LocalAgentExecutor', () => {
530
754
  expect(sentTools).toBeDefined();
531
755
  expect(sentTools).toEqual(expect.arrayContaining([
532
756
  expect.objectContaining({ name: LS_TOOL_NAME }),
533
- expect.objectContaining({ name: TASK_COMPLETE_TOOL_NAME }),
757
+ expect.objectContaining({ name: COMPLETE_TASK_TOOL_NAME }),
534
758
  ]));
535
- const completeToolDef = sentTools.find((t) => t.name === TASK_COMPLETE_TOOL_NAME);
536
- expect(completeToolDef?.parameters?.required).toContain('finalResult');
759
+ const completeToolDef = sentTools.find((t) => t.name === COMPLETE_TASK_TOOL_NAME);
760
+ const completeSchema = completeToolDef?.parametersJsonSchema;
761
+ expect(completeSchema?.['required']).toContain('finalResult');
537
762
  expect(output.result).toBe('Found file1.txt');
538
763
  expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
539
764
  // Telemetry checks
@@ -545,6 +770,17 @@ describe('LocalAgentExecutor', () => {
545
770
  expect(finishEvent.terminate_reason).toBe(AgentTerminateMode.GOAL);
546
771
  // Context checks
547
772
  expect(mockedPromptIdContext.run).toHaveBeenCalledTimes(2); // Two turns
773
+ // Recording checks
774
+ expect(mockRecordCompletedToolCalls).toHaveBeenCalledTimes(2);
775
+ expect(mockRecordCompletedToolCalls).toHaveBeenNthCalledWith(1, expect.any(String), // model
776
+ expect.arrayContaining([
777
+ expect.objectContaining({
778
+ status: 'success',
779
+ request: expect.objectContaining({ name: LS_TOOL_NAME }),
780
+ }),
781
+ ]));
782
+ expect(mockSaveSummary).toHaveBeenCalledTimes(1);
783
+ expect(mockSaveSummary).toHaveBeenCalledWith('Found file1.txt');
548
784
  const agentId = executor['agentId'];
549
785
  expect(mockedPromptIdContext.run).toHaveBeenNthCalledWith(1, `${agentId}#0`, expect.any(Function));
550
786
  expect(mockedPromptIdContext.run).toHaveBeenNthCalledWith(2, `${agentId}#1`, expect.any(Function));
@@ -563,14 +799,14 @@ describe('LocalAgentExecutor', () => {
563
799
  expect.objectContaining({
564
800
  type: 'TOOL_CALL_START',
565
801
  data: expect.objectContaining({
566
- name: TASK_COMPLETE_TOOL_NAME,
802
+ name: COMPLETE_TASK_TOOL_NAME,
567
803
  args: { finalResult: 'Found file1.txt' },
568
804
  }),
569
805
  }),
570
806
  expect.objectContaining({
571
807
  type: 'TOOL_CALL_END',
572
808
  data: expect.objectContaining({
573
- name: TASK_COMPLETE_TOOL_NAME,
809
+ name: COMPLETE_TASK_TOOL_NAME,
574
810
  output: expect.stringContaining('Output submitted'),
575
811
  }),
576
812
  }),
@@ -614,11 +850,12 @@ describe('LocalAgentExecutor', () => {
614
850
  ]);
615
851
  mockModelResponse([
616
852
  {
617
- name: TASK_COMPLETE_TOOL_NAME,
853
+ name: COMPLETE_TASK_TOOL_NAME,
618
854
  args: { result: 'All work done' },
619
855
  id: 'call2',
620
856
  },
621
857
  ], 'Task finished.');
858
+ mockCompletionResult('call2', 'All work done');
622
859
  const output = await executor.run({ goal: 'Do work' }, signal);
623
860
  const { modelConfigKey } = getMockMessageParams(0);
624
861
  expect(modelConfigKey.model).toBe(getModelConfigAlias(definition));
@@ -626,11 +863,13 @@ describe('LocalAgentExecutor', () => {
626
863
  const passedToolsArg = chatConstructorArgs[2];
627
864
  const sentTools = passedToolsArg[0].functionDeclarations;
628
865
  expect(sentTools).toBeDefined();
629
- const completeToolDef = sentTools.find((t) => t.name === TASK_COMPLETE_TOOL_NAME);
630
- expect(completeToolDef?.parameters?.required).toEqual(['result']);
866
+ const completeToolDef = sentTools.find((t) => t.name === COMPLETE_TASK_TOOL_NAME);
867
+ const schema = completeToolDef?.parametersJsonSchema;
868
+ expect(schema?.['required']).toContain('result');
631
869
  expect(completeToolDef?.description).toContain('submit your final findings');
632
870
  expect(output.result).toBe('All work done');
633
871
  expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
872
+ expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
634
873
  });
635
874
  it('should error immediately if the model stops tools without calling complete_task (Protocol Violation)', async () => {
636
875
  const definition = createTestDefinition();
@@ -674,7 +913,7 @@ describe('LocalAgentExecutor', () => {
674
913
  mockModelResponse([], 'I still give up.');
675
914
  const output = await executor.run({ goal: 'Strict test' }, signal);
676
915
  expect(mockSendMessageStream).toHaveBeenCalledTimes(3);
677
- const expectedError = `Agent stopped calling tools but did not call '${TASK_COMPLETE_TOOL_NAME}'.`;
916
+ const expectedError = `Agent stopped calling tools but did not call '${COMPLETE_TASK_TOOL_NAME}'.`;
678
917
  expect(output.terminate_reason).toBe(AgentTerminateMode.ERROR_NO_COMPLETE_TASK_CALL);
679
918
  expect(output.result).toBe(expectedError);
680
919
  // Telemetry check for error
@@ -696,27 +935,59 @@ describe('LocalAgentExecutor', () => {
696
935
  // Turn 1: Missing arg
697
936
  mockModelResponse([
698
937
  {
699
- name: TASK_COMPLETE_TOOL_NAME,
938
+ name: COMPLETE_TASK_TOOL_NAME,
700
939
  args: { wrongArg: 'oops' },
701
940
  id: 'call1',
702
941
  },
703
942
  ]);
943
+ // Mock failure in scheduler for Turn 1
944
+ mockScheduleAgentTools.mockResolvedValueOnce([
945
+ {
946
+ status: 'error',
947
+ request: {
948
+ callId: 'call1',
949
+ name: COMPLETE_TASK_TOOL_NAME,
950
+ args: { wrongArg: 'oops' },
951
+ prompt_id: 'p1',
952
+ },
953
+ response: {
954
+ resultDisplay: 'Error',
955
+ responseParts: [
956
+ {
957
+ functionResponse: {
958
+ name: COMPLETE_TASK_TOOL_NAME,
959
+ id: 'call1',
960
+ response: {
961
+ error: "Missing required argument 'finalResult' for completion.",
962
+ },
963
+ },
964
+ },
965
+ ],
966
+ error: {
967
+ message: "Missing required argument 'finalResult' for completion.",
968
+ type: 'INVALID_TOOL_PARAMS',
969
+ },
970
+ },
971
+ },
972
+ ]);
704
973
  // Turn 2: Corrected
705
974
  mockModelResponse([
706
975
  {
707
- name: TASK_COMPLETE_TOOL_NAME,
976
+ name: COMPLETE_TASK_TOOL_NAME,
708
977
  args: { finalResult: 'Corrected result' },
709
978
  id: 'call2',
710
979
  },
711
980
  ]);
981
+ mockCompletionResult('call2', 'Corrected result');
712
982
  const output = await executor.run({ goal: 'Error test' }, signal);
713
983
  expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
984
+ expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
714
985
  const expectedError = "Missing required argument 'finalResult' for completion.";
715
986
  expect(activities).toContainEqual(expect.objectContaining({
716
987
  type: 'ERROR',
717
988
  data: expect.objectContaining({
718
989
  context: 'tool_call',
719
- name: TASK_COMPLETE_TOOL_NAME,
990
+ name: COMPLETE_TASK_TOOL_NAME,
720
991
  error: expectedError,
721
992
  errorType: SubagentActivityErrorType.GENERIC,
722
993
  }),
@@ -727,7 +998,7 @@ describe('LocalAgentExecutor', () => {
727
998
  expect(turn2Parts).toHaveLength(1);
728
999
  expect(turn2Parts[0]).toEqual(expect.objectContaining({
729
1000
  functionResponse: expect.objectContaining({
730
- name: TASK_COMPLETE_TOOL_NAME,
1001
+ name: COMPLETE_TASK_TOOL_NAME,
731
1002
  response: { error: expectedError },
732
1003
  id: 'call1',
733
1004
  }),
@@ -735,31 +1006,61 @@ describe('LocalAgentExecutor', () => {
735
1006
  expect(output.result).toBe('Corrected result');
736
1007
  expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
737
1008
  });
738
- it('should handle multiple calls to complete_task in the same turn (accept first, block rest)', async () => {
1009
+ it('should handle multiple calls to complete_task in the same turn', async () => {
739
1010
  const definition = createTestDefinition([], {}, 'none');
740
1011
  const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
741
1012
  // Turn 1: Duplicate calls
742
1013
  mockModelResponse([
743
1014
  {
744
- name: TASK_COMPLETE_TOOL_NAME,
745
- args: { result: 'done' },
1015
+ name: COMPLETE_TASK_TOOL_NAME,
1016
+ args: { result: 'first' },
746
1017
  id: 'call1',
747
1018
  },
748
1019
  {
749
- name: TASK_COMPLETE_TOOL_NAME,
750
- args: { result: 'ignored' },
1020
+ name: COMPLETE_TASK_TOOL_NAME,
1021
+ args: { result: 'second' },
751
1022
  id: 'call2',
752
1023
  },
753
1024
  ]);
1025
+ mockScheduleAgentTools.mockResolvedValueOnce([
1026
+ {
1027
+ status: 'success',
1028
+ request: {
1029
+ callId: 'call1',
1030
+ name: COMPLETE_TASK_TOOL_NAME,
1031
+ args: { result: 'first' },
1032
+ prompt_id: 'p1',
1033
+ },
1034
+ response: {
1035
+ resultDisplay: 'ok',
1036
+ responseParts: [],
1037
+ data: { taskCompleted: true, submittedOutput: 'first' },
1038
+ },
1039
+ },
1040
+ {
1041
+ status: 'success',
1042
+ request: {
1043
+ callId: 'call2',
1044
+ name: COMPLETE_TASK_TOOL_NAME,
1045
+ args: { result: 'second' },
1046
+ prompt_id: 'p1',
1047
+ },
1048
+ response: {
1049
+ resultDisplay: 'ok',
1050
+ responseParts: [],
1051
+ data: { taskCompleted: true, submittedOutput: 'second' },
1052
+ },
1053
+ },
1054
+ ]);
754
1055
  const output = await executor.run({ goal: 'Dup test' }, signal);
755
1056
  expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
1057
+ expect(mockScheduleAgentTools).toHaveBeenCalledTimes(1);
756
1058
  expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
1059
+ // In current impl, the first successful complete_task in the batch is respected.
1060
+ expect(output.result).toBe('first');
757
1061
  const completions = activities.filter((a) => a.type === 'TOOL_CALL_END' &&
758
- a.data['name'] === TASK_COMPLETE_TOOL_NAME);
759
- const errors = activities.filter((a) => a.type === 'ERROR' && a.data['name'] === TASK_COMPLETE_TOOL_NAME);
760
- expect(completions).toHaveLength(1);
761
- expect(errors).toHaveLength(1);
762
- expect(errors[0].data['error']).toContain('Task already marked complete in this turn');
1062
+ a.data['name'] === COMPLETE_TASK_TOOL_NAME);
1063
+ expect(completions).toHaveLength(2);
763
1064
  });
764
1065
  it('should execute parallel tool calls and then complete', async () => {
765
1066
  const definition = createTestDefinition([LS_TOOL_NAME]);
@@ -784,39 +1085,57 @@ describe('LocalAgentExecutor', () => {
784
1085
  });
785
1086
  mockScheduleAgentTools.mockImplementation(async (_ctx, requests) => {
786
1087
  const results = await Promise.all(requests.map(async (reqInfo) => {
787
- callsStarted++;
788
- if (callsStarted === 2)
789
- resolveCalls();
790
- await vi.advanceTimersByTimeAsync(100);
791
- return {
792
- status: CoreToolCallStatus.Success,
793
- request: reqInfo,
794
- tool: {},
795
- invocation: {},
796
- response: {
797
- callId: reqInfo.callId,
798
- resultDisplay: 'ok',
799
- responseParts: [
800
- {
801
- functionResponse: {
802
- name: reqInfo.name,
803
- response: {},
804
- id: reqInfo.callId,
1088
+ if (reqInfo.name === LS_TOOL_NAME) {
1089
+ callsStarted++;
1090
+ if (callsStarted === 2)
1091
+ resolveCalls();
1092
+ await vi.advanceTimersByTimeAsync(100);
1093
+ return {
1094
+ status: CoreToolCallStatus.Success,
1095
+ request: reqInfo,
1096
+ tool: {},
1097
+ invocation: {},
1098
+ response: {
1099
+ callId: reqInfo.callId,
1100
+ resultDisplay: 'ok',
1101
+ responseParts: [
1102
+ {
1103
+ functionResponse: {
1104
+ name: reqInfo.name,
1105
+ response: {},
1106
+ id: reqInfo.callId,
1107
+ },
805
1108
  },
1109
+ ],
1110
+ error: undefined,
1111
+ errorType: undefined,
1112
+ contentLength: 0,
1113
+ },
1114
+ };
1115
+ }
1116
+ else if (reqInfo.name === COMPLETE_TASK_TOOL_NAME) {
1117
+ return {
1118
+ status: CoreToolCallStatus.Success,
1119
+ request: reqInfo,
1120
+ response: {
1121
+ callId: reqInfo.callId,
1122
+ resultDisplay: 'Task completed.',
1123
+ responseParts: [],
1124
+ data: {
1125
+ taskCompleted: true,
1126
+ submittedOutput: reqInfo.args['finalResult'],
806
1127
  },
807
- ],
808
- error: undefined,
809
- errorType: undefined,
810
- contentLength: 0,
811
- },
812
- };
1128
+ },
1129
+ };
1130
+ }
1131
+ throw new Error(`Unexpected tool: ${reqInfo.name}`);
813
1132
  }));
814
1133
  return results;
815
1134
  });
816
1135
  // Turn 2: Completion
817
1136
  mockModelResponse([
818
1137
  {
819
- name: TASK_COMPLETE_TOOL_NAME,
1138
+ name: COMPLETE_TASK_TOOL_NAME,
820
1139
  args: { finalResult: 'done' },
821
1140
  id: 'c3',
822
1141
  },
@@ -827,7 +1146,7 @@ describe('LocalAgentExecutor', () => {
827
1146
  await vi.advanceTimersByTimeAsync(150);
828
1147
  await vi.advanceTimersByTimeAsync(1);
829
1148
  const output = await runPromise;
830
- expect(mockScheduleAgentTools).toHaveBeenCalledTimes(1);
1149
+ expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
831
1150
  expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
832
1151
  // Safe access to message parts
833
1152
  const turn2Params = getMockMessageParams(1);
@@ -858,7 +1177,7 @@ describe('LocalAgentExecutor', () => {
858
1177
  // Turn 2: Model gives up and completes
859
1178
  mockModelResponse([
860
1179
  {
861
- name: TASK_COMPLETE_TOOL_NAME,
1180
+ name: COMPLETE_TASK_TOOL_NAME,
862
1181
  args: { finalResult: 'Could not read file.' },
863
1182
  id: 'c2',
864
1183
  },
@@ -866,9 +1185,28 @@ describe('LocalAgentExecutor', () => {
866
1185
  const consoleWarnSpy = vi
867
1186
  .spyOn(debugLogger, 'warn')
868
1187
  .mockImplementation(() => { });
1188
+ mockScheduleAgentTools.mockResolvedValueOnce([
1189
+ {
1190
+ status: 'success',
1191
+ request: {
1192
+ callId: 'c2',
1193
+ name: COMPLETE_TASK_TOOL_NAME,
1194
+ args: { finalResult: 'Could not read file.' },
1195
+ prompt_id: 'p2',
1196
+ },
1197
+ response: {
1198
+ resultDisplay: 'Output submitted and task completed.',
1199
+ responseParts: [],
1200
+ data: {
1201
+ taskCompleted: true,
1202
+ submittedOutput: 'Could not read file.',
1203
+ },
1204
+ },
1205
+ },
1206
+ ]);
869
1207
  await executor.run({ goal: 'Sec test' }, signal);
870
- // Verify external executor was not called (Security held)
871
- expect(mockScheduleAgentTools).not.toHaveBeenCalled();
1208
+ // Verify external executor was called exactly once (for complete_task)
1209
+ expect(mockScheduleAgentTools).toHaveBeenCalledTimes(1);
872
1210
  // 2. Verify console warning
873
1211
  expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining(`[LocalAgentExecutor] Blocked call:`));
874
1212
  consoleWarnSpy.mockRestore();
@@ -903,28 +1241,53 @@ describe('LocalAgentExecutor', () => {
903
1241
  // Turn 1: Invalid arg (too short)
904
1242
  mockModelResponse([
905
1243
  {
906
- name: TASK_COMPLETE_TOOL_NAME,
1244
+ name: COMPLETE_TASK_TOOL_NAME,
907
1245
  args: { finalResult: 'short' },
908
1246
  id: 'call1',
909
1247
  },
910
1248
  ]);
1249
+ const expectedError = 'Output validation failed: {"formErrors":["String must contain at least 10 character(s)"],"fieldErrors":{}}';
1250
+ mockScheduleAgentTools.mockResolvedValueOnce([
1251
+ {
1252
+ status: 'error',
1253
+ request: {
1254
+ callId: 'call1',
1255
+ name: COMPLETE_TASK_TOOL_NAME,
1256
+ args: { finalResult: 'short' },
1257
+ prompt_id: 'p1',
1258
+ },
1259
+ response: {
1260
+ resultDisplay: expectedError,
1261
+ responseParts: [
1262
+ {
1263
+ functionResponse: {
1264
+ name: COMPLETE_TASK_TOOL_NAME,
1265
+ id: 'call1',
1266
+ response: { error: expectedError },
1267
+ },
1268
+ },
1269
+ ],
1270
+ data: { taskCompleted: false },
1271
+ error: new Error(expectedError),
1272
+ },
1273
+ },
1274
+ ]);
911
1275
  // Turn 2: Corrected
912
1276
  mockModelResponse([
913
1277
  {
914
- name: TASK_COMPLETE_TOOL_NAME,
1278
+ name: COMPLETE_TASK_TOOL_NAME,
915
1279
  args: { finalResult: 'This is a much longer and valid result' },
916
1280
  id: 'call2',
917
1281
  },
918
1282
  ]);
919
1283
  const output = await executor.run({ goal: 'Validation test' }, signal);
920
1284
  expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
921
- const expectedError = 'Output validation failed: {"formErrors":["String must contain at least 10 character(s)"],"fieldErrors":{}}';
922
1285
  // Check that the error was reported in the activity stream
923
1286
  expect(activities).toContainEqual(expect.objectContaining({
924
1287
  type: 'ERROR',
925
1288
  data: expect.objectContaining({
926
1289
  context: 'tool_call',
927
- name: TASK_COMPLETE_TOOL_NAME,
1290
+ name: COMPLETE_TASK_TOOL_NAME,
928
1291
  error: expect.stringContaining('Output validation failed'),
929
1292
  errorType: SubagentActivityErrorType.GENERIC,
930
1293
  }),
@@ -935,7 +1298,7 @@ describe('LocalAgentExecutor', () => {
935
1298
  expect(turn2Parts).toEqual([
936
1299
  expect.objectContaining({
937
1300
  functionResponse: expect.objectContaining({
938
- name: TASK_COMPLETE_TOOL_NAME,
1301
+ name: COMPLETE_TASK_TOOL_NAME,
939
1302
  response: { error: expectedError },
940
1303
  id: 'call1',
941
1304
  }),
@@ -1008,13 +1371,32 @@ describe('LocalAgentExecutor', () => {
1008
1371
  // Turn 2: Model sees the error and completes
1009
1372
  mockModelResponse([
1010
1373
  {
1011
- name: TASK_COMPLETE_TOOL_NAME,
1374
+ name: COMPLETE_TASK_TOOL_NAME,
1012
1375
  args: { finalResult: 'Aborted due to tool failure.' },
1013
1376
  id: 'call2',
1014
1377
  },
1015
1378
  ]);
1379
+ mockScheduleAgentTools.mockResolvedValueOnce([
1380
+ {
1381
+ status: 'success',
1382
+ request: {
1383
+ callId: 'call2',
1384
+ name: COMPLETE_TASK_TOOL_NAME,
1385
+ args: { finalResult: 'Aborted due to tool failure.' },
1386
+ prompt_id: 'p2',
1387
+ },
1388
+ response: {
1389
+ resultDisplay: 'Task completed.',
1390
+ responseParts: [],
1391
+ data: {
1392
+ taskCompleted: true,
1393
+ submittedOutput: 'Aborted due to tool failure.',
1394
+ },
1395
+ },
1396
+ },
1397
+ ]);
1016
1398
  const output = await executor.run({ goal: 'Tool failure test' }, signal);
1017
- expect(mockScheduleAgentTools).toHaveBeenCalledTimes(1);
1399
+ expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
1018
1400
  expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
1019
1401
  // Verify the error was reported in the activity stream
1020
1402
  expect(activities).toContainEqual(expect.objectContaining({
@@ -1086,7 +1468,7 @@ describe('LocalAgentExecutor', () => {
1086
1468
  // Turn 2: Model sees the rejection + consolidated instructions and completes
1087
1469
  mockModelResponse([
1088
1470
  {
1089
- name: TASK_COMPLETE_TOOL_NAME,
1471
+ name: COMPLETE_TASK_TOOL_NAME,
1090
1472
  args: { finalResult: 'User rejected access to /secret.' },
1091
1473
  id: 'call2',
1092
1474
  },
@@ -1186,7 +1568,7 @@ describe('LocalAgentExecutor', () => {
1186
1568
  const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
1187
1569
  mockModelResponse([
1188
1570
  {
1189
- name: TASK_COMPLETE_TOOL_NAME,
1571
+ name: COMPLETE_TASK_TOOL_NAME,
1190
1572
  args: { finalResult: 'done' },
1191
1573
  id: 'call1',
1192
1574
  },
@@ -1210,7 +1592,7 @@ describe('LocalAgentExecutor', () => {
1210
1592
  const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
1211
1593
  mockModelResponse([
1212
1594
  {
1213
- name: TASK_COMPLETE_TOOL_NAME,
1595
+ name: COMPLETE_TASK_TOOL_NAME,
1214
1596
  args: { finalResult: 'done' },
1215
1597
  id: 'call1',
1216
1598
  },
@@ -1390,7 +1772,7 @@ describe('LocalAgentExecutor', () => {
1390
1772
  // Recovery Turn (succeeds)
1391
1773
  mockModelResponse([
1392
1774
  {
1393
- name: TASK_COMPLETE_TOOL_NAME,
1775
+ name: COMPLETE_TASK_TOOL_NAME,
1394
1776
  args: { finalResult: 'Recovered!' },
1395
1777
  id: 't2',
1396
1778
  },
@@ -1445,7 +1827,7 @@ describe('LocalAgentExecutor', () => {
1445
1827
  // Turn 3: Recovery turn (succeeds)
1446
1828
  mockModelResponse([
1447
1829
  {
1448
- name: TASK_COMPLETE_TOOL_NAME,
1830
+ name: COMPLETE_TASK_TOOL_NAME,
1449
1831
  args: { finalResult: 'Recovered from violation!' },
1450
1832
  id: 't3',
1451
1833
  },
@@ -1473,7 +1855,7 @@ describe('LocalAgentExecutor', () => {
1473
1855
  const output = await executor.run({ goal: 'Violation recovery fail' }, signal);
1474
1856
  expect(mockSendMessageStream).toHaveBeenCalledTimes(3);
1475
1857
  expect(output.terminate_reason).toBe(AgentTerminateMode.ERROR_NO_COMPLETE_TASK_CALL);
1476
- expect(output.result).toContain(`Agent stopped calling tools but did not call '${TASK_COMPLETE_TOOL_NAME}'`);
1858
+ expect(output.result).toContain(`Agent stopped calling tools but did not call '${COMPLETE_TASK_TOOL_NAME}'`);
1477
1859
  expect(activities).toContainEqual(expect.objectContaining({
1478
1860
  type: 'ERROR',
1479
1861
  data: expect.objectContaining({
@@ -1502,7 +1884,7 @@ describe('LocalAgentExecutor', () => {
1502
1884
  // Recovery turn (succeeds)
1503
1885
  mockModelResponse([
1504
1886
  {
1505
- name: TASK_COMPLETE_TOOL_NAME,
1887
+ name: COMPLETE_TASK_TOOL_NAME,
1506
1888
  args: { finalResult: 'Recovered from timeout!' },
1507
1889
  id: 't2',
1508
1890
  },
@@ -1624,7 +2006,7 @@ describe('LocalAgentExecutor', () => {
1624
2006
  // Recovery Turn (succeeds)
1625
2007
  mockModelResponse([
1626
2008
  {
1627
- name: TASK_COMPLETE_TOOL_NAME,
2009
+ name: COMPLETE_TASK_TOOL_NAME,
1628
2010
  args: { finalResult: 'Recovered!' },
1629
2011
  id: 't2',
1630
2012
  },
@@ -1635,6 +2017,9 @@ describe('LocalAgentExecutor', () => {
1635
2017
  expect(recoveryEvent).toBeInstanceOf(RecoveryAttemptEvent);
1636
2018
  expect(recoveryEvent.success).toBe(true);
1637
2019
  expect(recoveryEvent.reason).toBe(AgentTerminateMode.MAX_TURNS);
2020
+ // Verify that the summary is saved upon successful recovery
2021
+ expect(mockSaveSummary).toHaveBeenCalledTimes(1);
2022
+ expect(mockSaveSummary).toHaveBeenCalledWith('Recovered!');
1638
2023
  });
1639
2024
  describe('Model Steering', () => {
1640
2025
  let configWithHints;
@@ -1659,7 +2044,7 @@ describe('LocalAgentExecutor', () => {
1659
2044
  // Turn 2: Model calls complete_task
1660
2045
  mockModelResponse([
1661
2046
  {
1662
- name: TASK_COMPLETE_TOOL_NAME,
2047
+ name: COMPLETE_TASK_TOOL_NAME,
1663
2048
  args: { finalResult: 'Done' },
1664
2049
  id: 'call2',
1665
2050
  },
@@ -1711,7 +2096,7 @@ describe('LocalAgentExecutor', () => {
1711
2096
  const executor = await LocalAgentExecutor.create(definition, configWithHints);
1712
2097
  mockModelResponse([
1713
2098
  {
1714
- name: TASK_COMPLETE_TOOL_NAME,
2099
+ name: COMPLETE_TASK_TOOL_NAME,
1715
2100
  args: { finalResult: 'Done' },
1716
2101
  id: 'call1',
1717
2102
  },
@@ -1741,7 +2126,7 @@ describe('LocalAgentExecutor', () => {
1741
2126
  // Turn 2: Model calls complete_task
1742
2127
  mockModelResponse([
1743
2128
  {
1744
- name: TASK_COMPLETE_TOOL_NAME,
2129
+ name: COMPLETE_TASK_TOOL_NAME,
1745
2130
  args: { finalResult: 'Done' },
1746
2131
  id: 'call2',
1747
2132
  },
@@ -1809,7 +2194,7 @@ describe('LocalAgentExecutor', () => {
1809
2194
  mockScheduleAgentTools.mockReturnValueOnce(toolCallPromise);
1810
2195
  mockModelResponse([
1811
2196
  {
1812
- name: TASK_COMPLETE_TOOL_NAME,
2197
+ name: COMPLETE_TASK_TOOL_NAME,
1813
2198
  args: { finalResult: 'Done' },
1814
2199
  id: 'call2',
1815
2200
  },
@@ -1864,7 +2249,7 @@ describe('LocalAgentExecutor', () => {
1864
2249
  mockScheduleAgentTools.mockReturnValueOnce(toolCallPromise);
1865
2250
  mockModelResponse([
1866
2251
  {
1867
- name: TASK_COMPLETE_TOOL_NAME,
2252
+ name: COMPLETE_TASK_TOOL_NAME,
1868
2253
  args: { finalResult: 'Done' },
1869
2254
  id: 'call2',
1870
2255
  },
@@ -1918,7 +2303,7 @@ describe('LocalAgentExecutor', () => {
1918
2303
  expect(configWithHints.injectionService.getInjections('background_completion')).toEqual(['bg output']);
1919
2304
  mockModelResponse([
1920
2305
  {
1921
- name: TASK_COMPLETE_TOOL_NAME,
2306
+ name: COMPLETE_TASK_TOOL_NAME,
1922
2307
  args: { finalResult: 'Done' },
1923
2308
  id: 'call1',
1924
2309
  },
@@ -1974,7 +2359,7 @@ describe('LocalAgentExecutor', () => {
1974
2359
  // Turn 2: Complete
1975
2360
  mockModelResponse([
1976
2361
  {
1977
- name: TASK_COMPLETE_TOOL_NAME,
2362
+ name: COMPLETE_TASK_TOOL_NAME,
1978
2363
  args: { finalResult: 'Done' },
1979
2364
  id: 'call2',
1980
2365
  },
@@ -1995,7 +2380,7 @@ describe('LocalAgentExecutor', () => {
1995
2380
  // Turn 1: Complete
1996
2381
  mockModelResponse([
1997
2382
  {
1998
- name: TASK_COMPLETE_TOOL_NAME,
2383
+ name: COMPLETE_TASK_TOOL_NAME,
1999
2384
  args: { finalResult: 'Done' },
2000
2385
  id: 'call1',
2001
2386
  },
@@ -2025,7 +2410,7 @@ describe('LocalAgentExecutor', () => {
2025
2410
  // Turn 2: Complete
2026
2411
  mockModelResponse([
2027
2412
  {
2028
- name: TASK_COMPLETE_TOOL_NAME,
2413
+ name: COMPLETE_TASK_TOOL_NAME,
2029
2414
  args: { finalResult: 'Done' },
2030
2415
  id: 't2',
2031
2416
  },
@@ -2067,7 +2452,7 @@ describe('LocalAgentExecutor', () => {
2067
2452
  // Turn 3: Complete
2068
2453
  mockModelResponse([
2069
2454
  {
2070
- name: TASK_COMPLETE_TOOL_NAME,
2455
+ name: COMPLETE_TASK_TOOL_NAME,
2071
2456
  args: { finalResult: 'Done' },
2072
2457
  id: 't3',
2073
2458
  },
@@ -2183,7 +2568,7 @@ describe('LocalAgentExecutor', () => {
2183
2568
  ]);
2184
2569
  mockModelResponse([
2185
2570
  {
2186
- name: TASK_COMPLETE_TOOL_NAME,
2571
+ name: COMPLETE_TASK_TOOL_NAME,
2187
2572
  args: { finalResult: 'done' },
2188
2573
  id: 'c1',
2189
2574
  },
@@ -2242,7 +2627,7 @@ describe('LocalAgentExecutor', () => {
2242
2627
  };
2243
2628
  mockModelResponse([
2244
2629
  {
2245
- name: TASK_COMPLETE_TOOL_NAME,
2630
+ name: COMPLETE_TASK_TOOL_NAME,
2246
2631
  args: { finalResult: 'ok' },
2247
2632
  id: 'c1',
2248
2633
  },
@@ -2253,7 +2638,7 @@ describe('LocalAgentExecutor', () => {
2253
2638
  const names = declarations.map((d) => d.name);
2254
2639
  expect(names.filter((n) => n === LS_TOOL_NAME)).toHaveLength(1);
2255
2640
  expect(names.filter((n) => n === 'fill')).toHaveLength(1);
2256
- expect(names.filter((n) => n === TASK_COMPLETE_TOOL_NAME)).toHaveLength(1);
2641
+ expect(names.filter((n) => n === COMPLETE_TASK_TOOL_NAME)).toHaveLength(1);
2257
2642
  // Total = ls + fill + complete_task
2258
2643
  expect(declarations).toHaveLength(3);
2259
2644
  });
@@ -2301,7 +2686,7 @@ describe('LocalAgentExecutor', () => {
2301
2686
  // Turn 2: Model completes
2302
2687
  mockModelResponse([
2303
2688
  {
2304
- name: TASK_COMPLETE_TOOL_NAME,
2689
+ name: COMPLETE_TASK_TOOL_NAME,
2305
2690
  args: { finalResult: 'done' },
2306
2691
  id: 'call-done',
2307
2692
  },
@@ -2320,7 +2705,7 @@ describe('LocalAgentExecutor', () => {
2320
2705
  const definition = createInstanceToolDefinition([new MockTool({ name: 'take_snapshot' })], 'none');
2321
2706
  mockModelResponse([
2322
2707
  {
2323
- name: TASK_COMPLETE_TOOL_NAME,
2708
+ name: COMPLETE_TASK_TOOL_NAME,
2324
2709
  args: { result: 'done' },
2325
2710
  id: 'c1',
2326
2711
  },
@@ -2329,7 +2714,7 @@ describe('LocalAgentExecutor', () => {
2329
2714
  await executor.run({ goal: 'Test' }, signal);
2330
2715
  const declarations = getSentFunctionDeclarations();
2331
2716
  const names = declarations.map((d) => d.name);
2332
- expect(names).toContain(TASK_COMPLETE_TOOL_NAME);
2717
+ expect(names).toContain(COMPLETE_TASK_TOOL_NAME);
2333
2718
  expect(names).toContain('take_snapshot');
2334
2719
  expect(declarations).toHaveLength(2);
2335
2720
  });
@@ -2355,7 +2740,7 @@ describe('LocalAgentExecutor', () => {
2355
2740
  const definition = createInstanceToolDefinition(instanceTools);
2356
2741
  mockModelResponse([
2357
2742
  {
2358
- name: TASK_COMPLETE_TOOL_NAME,
2743
+ name: COMPLETE_TASK_TOOL_NAME,
2359
2744
  args: { finalResult: 'done' },
2360
2745
  id: 'c1',
2361
2746
  },
@@ -2383,7 +2768,7 @@ describe('LocalAgentExecutor', () => {
2383
2768
  vi.spyOn(mockConfig, 'getSystemInstructionMemory').mockReturnValue(mockMemory);
2384
2769
  mockModelResponse([
2385
2770
  {
2386
- name: TASK_COMPLETE_TOOL_NAME,
2771
+ name: COMPLETE_TASK_TOOL_NAME,
2387
2772
  args: { finalResult: 'done' },
2388
2773
  id: 'call1',
2389
2774
  },
@@ -2402,7 +2787,7 @@ describe('LocalAgentExecutor', () => {
2402
2787
  vi.spyOn(mockConfig, 'isJitContextEnabled').mockReturnValue(false);
2403
2788
  mockModelResponse([
2404
2789
  {
2405
- name: TASK_COMPLETE_TOOL_NAME,
2790
+ name: COMPLETE_TASK_TOOL_NAME,
2406
2791
  args: { finalResult: 'done' },
2407
2792
  id: 'call1',
2408
2793
  },
@@ -2423,7 +2808,7 @@ describe('LocalAgentExecutor', () => {
2423
2808
  vi.spyOn(mockConfig, 'isJitContextEnabled').mockReturnValue(true);
2424
2809
  mockModelResponse([
2425
2810
  {
2426
- name: TASK_COMPLETE_TOOL_NAME,
2811
+ name: COMPLETE_TASK_TOOL_NAME,
2427
2812
  args: { finalResult: 'done' },
2428
2813
  id: 'call1',
2429
2814
  },