@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
@@ -26,12 +26,28 @@ import * as path from 'node:path';
26
26
  import * as fs from 'node:fs';
27
27
  import { fileURLToPath } from 'node:url';
28
28
  import { injectAutomationOverlay } from './automationOverlay.js';
29
+ import { logBrowserAgentConnection } from '../../telemetry/loggers.js';
29
30
  const __filename = fileURLToPath(import.meta.url);
30
31
  const __dirname = path.dirname(__filename);
31
32
  // Default browser profile directory name within ~/.cell-cli/
32
33
  const BROWSER_PROFILE_DIR = 'cli-browser-profile';
34
+ /**
35
+ * Typed error for domain restriction violations.
36
+ * Thrown when a navigation tool targets a domain not in allowedDomains.
37
+ * Caught by mcpToolWrapper to terminate the agent immediately.
38
+ */
39
+ export class DomainNotAllowedError extends Error {
40
+ constructor(message) {
41
+ super(message);
42
+ this.name = 'DomainNotAllowedError';
43
+ }
44
+ }
33
45
  // Default timeout for MCP operations
34
46
  const MCP_TIMEOUT_MS = 60_000;
47
+ // Maximum reconnection attempts before giving up
48
+ const MAX_RECONNECT_RETRIES = 3;
49
+ // Base delay (ms) for exponential backoff between reconnection attempts
50
+ const RECONNECT_BASE_DELAY_MS = 500;
35
51
  /**
36
52
  * Tools that can cause a full-page navigation (explicitly or implicitly).
37
53
  *
@@ -63,10 +79,138 @@ const POTENTIALLY_NAVIGATING_TOOLS = new Set([
63
79
  */
64
80
  export class BrowserManager {
65
81
  config;
82
+ // --- Static singleton management ---
83
+ static instances = new Map();
84
+ /**
85
+ * Maximum number of parallel browser instances allowed in isolated mode.
86
+ * Prevents unbounded resource consumption from concurrent browser_agent calls.
87
+ */
88
+ static MAX_PARALLEL_INSTANCES = 5;
89
+ /**
90
+ * Returns the cache key for a given config.
91
+ * Uses `sessionMode:profilePath` so different profiles get separate instances.
92
+ */
93
+ static getInstanceKey(config) {
94
+ const browserConfig = config.getBrowserAgentConfig();
95
+ const sessionMode = browserConfig.customConfig.sessionMode ?? 'persistent';
96
+ const profilePath = browserConfig.customConfig.profilePath ?? 'default';
97
+ return `${sessionMode}:${profilePath}`;
98
+ }
99
+ /**
100
+ * Returns an existing BrowserManager for the current config's session mode
101
+ * and profile, or creates a new one.
102
+ *
103
+ * Concurrency rules:
104
+ * - **persistent / existing mode**: Only one instance is allowed at a time.
105
+ * If the instance is already in-use, an error is thrown instructing the
106
+ * caller to run browser tasks sequentially.
107
+ * - **isolated mode**: Parallel instances are allowed up to
108
+ * MAX_PARALLEL_INSTANCES. Each isolated instance gets its own temp profile.
109
+ */
110
+ static getInstance(config) {
111
+ const key = BrowserManager.getInstanceKey(config);
112
+ const sessionMode = config.getBrowserAgentConfig().customConfig.sessionMode ?? 'persistent';
113
+ let instance = BrowserManager.instances.get(key);
114
+ if (!instance) {
115
+ instance = new BrowserManager(config);
116
+ BrowserManager.instances.set(key, instance);
117
+ debugLogger.log(`Created new BrowserManager singleton (key: ${key})`);
118
+ }
119
+ else if (instance.inUse) {
120
+ // Persistent and existing modes share a browser profile directory.
121
+ // Chrome prevents multiple instances from using the same profile, so
122
+ // concurrent usage would cause "profile locked" errors.
123
+ if (sessionMode === 'persistent' || sessionMode === 'existing') {
124
+ throw new Error(`Cannot launch a concurrent browser agent in "${sessionMode}" session mode. ` +
125
+ `The browser instance is already in use by another task. ` +
126
+ `Please run browser tasks sequentially, or switch to "isolated" session mode for concurrent browser usage.`);
127
+ }
128
+ // Isolated mode: allow parallel instances up to the limit.
129
+ let inUseCount = 1; // primary is already in-use
130
+ let suffix = 1;
131
+ let parallelKey = `${key}:${suffix}`;
132
+ let parallel = BrowserManager.instances.get(parallelKey);
133
+ while (parallel?.inUse) {
134
+ inUseCount++;
135
+ if (inUseCount >= BrowserManager.MAX_PARALLEL_INSTANCES) {
136
+ throw new Error(`Maximum number of parallel browser instances (${BrowserManager.MAX_PARALLEL_INSTANCES}) reached. ` +
137
+ `Please wait for an existing browser task to complete before starting a new one.`);
138
+ }
139
+ suffix++;
140
+ parallelKey = `${key}:${suffix}`;
141
+ parallel = BrowserManager.instances.get(parallelKey);
142
+ }
143
+ if (!parallel) {
144
+ parallel = new BrowserManager(config);
145
+ BrowserManager.instances.set(parallelKey, parallel);
146
+ debugLogger.log(`Created parallel BrowserManager (key: ${parallelKey})`);
147
+ }
148
+ else {
149
+ debugLogger.log(`Reusing released parallel BrowserManager (key: ${parallelKey})`);
150
+ }
151
+ instance = parallel;
152
+ }
153
+ else {
154
+ debugLogger.log(`Reusing existing BrowserManager singleton (key: ${key})`);
155
+ }
156
+ return instance;
157
+ }
158
+ /**
159
+ * Closes all cached BrowserManager instances and clears the cache.
160
+ * Called on /clear commands and CLI exit.
161
+ */
162
+ static async resetAll() {
163
+ const results = await Promise.allSettled(Array.from(BrowserManager.instances.values()).map((instance) => instance.close()));
164
+ for (const result of results) {
165
+ if (result.status === 'rejected') {
166
+ debugLogger.error(`Error during BrowserManager cleanup: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`);
167
+ }
168
+ }
169
+ BrowserManager.instances.clear();
170
+ }
171
+ /**
172
+ * Alias for resetAll — used by CLI exit cleanup for clarity.
173
+ */
174
+ static async closeAll() {
175
+ await BrowserManager.resetAll();
176
+ }
177
+ // --- Instance state ---
66
178
  // Raw MCP SDK Client - NOT the wrapper McpClient
67
179
  rawMcpClient;
68
180
  mcpTransport;
69
181
  discoveredTools = [];
182
+ disconnected = false;
183
+ isClosing = false;
184
+ connectionPromise;
185
+ /**
186
+ * Whether this instance is currently acquired by an active invocation.
187
+ * Used by getInstance() to avoid handing the same browser to concurrent
188
+ * browser_agent calls.
189
+ */
190
+ inUse = false;
191
+ /**
192
+ * Marks this instance as in-use. Call this when starting a browser agent
193
+ * invocation so concurrent calls get a separate instance.
194
+ */
195
+ acquire() {
196
+ this.inUse = true;
197
+ }
198
+ /**
199
+ * Marks this instance as available for reuse. Call this in the finally
200
+ * block of a browser agent invocation.
201
+ */
202
+ release() {
203
+ this.inUse = false;
204
+ }
205
+ /**
206
+ * Returns whether this instance is currently acquired by an active invocation.
207
+ */
208
+ isAcquired() {
209
+ return this.inUse;
210
+ }
211
+ /** State for action rate limiting */
212
+ actionCounter = 0;
213
+ maxActionsPerTask;
70
214
  /**
71
215
  * Whether to inject the automation overlay.
72
216
  * Always false in headless mode (no visible window to decorate).
@@ -78,6 +222,8 @@ export class BrowserManager {
78
222
  const browserConfig = config.getBrowserAgentConfig();
79
223
  this.shouldInjectOverlay = !browserConfig?.customConfig?.headless;
80
224
  this.shouldDisableInput = config.shouldDisableBrowserUserInput();
225
+ this.maxActionsPerTask =
226
+ browserConfig?.customConfig.maxActionsPerTask ?? 100;
81
227
  }
82
228
  /**
83
229
  * Gets the raw MCP SDK Client for direct tool calls.
@@ -107,23 +253,25 @@ export class BrowserManager {
107
253
  * @param toolName The name of the tool to call
108
254
  * @param args Arguments to pass to the tool
109
255
  * @param signal Optional AbortSignal to cancel the call
256
+ * @param isInternal Determine if the tool is for internal execution
110
257
  * @returns The result from the MCP server
111
258
  */
112
- async callTool(toolName, args, signal) {
259
+ async callTool(toolName, args, signal, isInternal = false) {
113
260
  if (signal?.aborted) {
114
261
  throw signal.reason ?? new Error('Operation cancelled');
115
262
  }
263
+ // Hard enforcement of per-action rate limit
264
+ if (!isInternal) {
265
+ if (this.actionCounter >= this.maxActionsPerTask) {
266
+ const error = new Error(`Browser agent reached maximum action limit (${this.maxActionsPerTask}). ` +
267
+ `Task terminated to prevent runaway execution. To config the limit, use maxActionsPerTask in the settings.`);
268
+ throw error;
269
+ }
270
+ this.actionCounter++;
271
+ }
116
272
  const errorMessage = this.checkNavigationRestrictions(toolName, args);
117
273
  if (errorMessage) {
118
- return {
119
- content: [
120
- {
121
- type: 'text',
122
- text: errorMessage,
123
- },
124
- ],
125
- isError: true,
126
- };
274
+ throw new DomainNotAllowedError(errorMessage);
127
275
  }
128
276
  const client = await this.getRawMcpClient();
129
277
  const callPromise = client.callTool({ name: toolName, arguments: args }, undefined, { timeout: MCP_TIMEOUT_MS });
@@ -154,23 +302,23 @@ export class BrowserManager {
154
302
  // Re-inject the automation overlay and input blocker after tools that
155
303
  // can cause a full-page navigation. chrome-devtools-mcp emits no MCP
156
304
  // notifications, so callTool() is the only interception point.
305
+ //
306
+ // The input blocker injection is idempotent: the injected function
307
+ // reuses the existing DOM element when present and only recreates
308
+ // it when navigation has actually replaced the page DOM.
157
309
  if (!result.isError &&
158
310
  POTENTIALLY_NAVIGATING_TOOLS.has(toolName) &&
159
311
  !signal?.aborted) {
312
+ // Don't re-inject if explicitly switching to a page in the background
313
+ if (toolName === 'select_page' && args['bringToFront'] === false) {
314
+ return result;
315
+ }
160
316
  try {
161
317
  if (this.shouldInjectOverlay) {
162
318
  await injectAutomationOverlay(this, signal);
163
319
  }
164
- // Only re-inject the input blocker for tools that *reliably*
165
- // replace the page DOM (navigate_page, new_page, select_page).
166
- // click/click_at are handled by pointer-events suspend/resume
167
- // in mcpToolWrapper — no full re-inject roundtrip needed.
168
- // press_key/handle_dialog only sometimes navigate.
169
- const reliableNavigation = toolName === 'navigate_page' ||
170
- toolName === 'new_page' ||
171
- toolName === 'select_page';
172
- if (this.shouldDisableInput && reliableNavigation) {
173
- await injectInputBlocker(this);
320
+ if (this.shouldDisableInput) {
321
+ await injectInputBlocker(this, signal);
174
322
  }
175
323
  }
176
324
  catch {
@@ -196,20 +344,67 @@ export class BrowserManager {
196
344
  isError: raw.isError === true,
197
345
  };
198
346
  }
347
+ /**
348
+ * Returns whether the MCP client is currently connected and healthy.
349
+ */
350
+ isConnected() {
351
+ return this.rawMcpClient !== undefined && !this.disconnected;
352
+ }
199
353
  /**
200
354
  * Ensures browser and MCP client are connected.
355
+ * If a previous connection was lost (e.g., user closed the browser),
356
+ * this will reconnect with exponential backoff (up to MAX_RECONNECT_RETRIES).
357
+ *
358
+ * Concurrent callers share a single in-flight connection promise so that
359
+ * two subagents racing at startup do not trigger duplicate connectMcp() calls.
201
360
  */
202
361
  async ensureConnection() {
203
- if (this.rawMcpClient) {
362
+ // Already connected and healthy — nothing to do
363
+ if (this.isConnected()) {
204
364
  return;
205
365
  }
366
+ // A connection is already being established — wait for it instead of racing
367
+ if (this.connectionPromise) {
368
+ return this.connectionPromise;
369
+ }
370
+ // If previously connected but transport died, clean up before reconnecting
371
+ if (this.disconnected) {
372
+ debugLogger.log('Previous browser connection was lost. Cleaning up before reconnecting...');
373
+ await this.close();
374
+ this.disconnected = false;
375
+ }
376
+ // Start connecting; store the promise so concurrent callers can join it
377
+ this.connectionPromise = this.connectWithRetry().finally(() => {
378
+ this.connectionPromise = undefined;
379
+ });
380
+ return this.connectionPromise;
381
+ }
382
+ /**
383
+ * Connects to chrome-devtools-mcp with exponential backoff retry.
384
+ */
385
+ async connectWithRetry() {
206
386
  // Request browser consent if needed (first-run privacy notice)
207
387
  const consentGranted = await getBrowserConsentIfNeeded();
208
388
  if (!consentGranted) {
209
389
  throw new Error('Browser agent requires user consent to proceed. ' +
210
390
  'Please re-run and accept the privacy notice.');
211
391
  }
212
- await this.connectMcp();
392
+ let lastError;
393
+ for (let attempt = 0; attempt < MAX_RECONNECT_RETRIES; attempt++) {
394
+ try {
395
+ await this.connectMcp();
396
+ return;
397
+ }
398
+ catch (error) {
399
+ lastError = error instanceof Error ? error : new Error(String(error));
400
+ if (attempt < MAX_RECONNECT_RETRIES - 1) {
401
+ const delay = RECONNECT_BASE_DELAY_MS * Math.pow(2, attempt);
402
+ debugLogger.log(`Connection attempt ${attempt + 1} failed, retrying in ${delay}ms...`);
403
+ await new Promise((resolve) => setTimeout(resolve, delay));
404
+ }
405
+ }
406
+ }
407
+ throw lastError;
213
408
  }
214
409
  /**
215
410
  * Closes browser and cleans up connections.
@@ -217,6 +412,7 @@ export class BrowserManager {
217
412
  * the transport will terminate the browser.
218
413
  */
219
414
  async close() {
415
+ this.isClosing = true;
220
416
  // Close MCP client first
221
417
  if (this.rawMcpClient) {
222
418
  try {
@@ -238,6 +434,7 @@ export class BrowserManager {
238
434
  this.mcpTransport = undefined;
239
435
  }
240
436
  this.discoveredTools = [];
437
+ this.connectionPromise = undefined;
241
438
  }
242
439
  /**
243
440
  * Connects to chrome-devtools-mcp which manages the browser process.
@@ -250,6 +447,7 @@ export class BrowserManager {
250
447
  * BrowserManager instance.
251
448
  */
252
449
  async connectMcp() {
450
+ this.isClosing = false;
253
451
  debugLogger.log('Connecting isolated MCP client to chrome-devtools-mcp...');
254
452
  // Create raw MCP SDK Client (not the wrapper McpClient)
255
453
  this.rawMcpClient = new Client({
@@ -260,7 +458,28 @@ export class BrowserManager {
260
458
  });
261
459
  // Build args for chrome-devtools-mcp
262
460
  const browserConfig = this.config.getBrowserAgentConfig();
263
- const sessionMode = browserConfig.customConfig.sessionMode ?? 'persistent';
461
+ const rawSessionMode = browserConfig.customConfig.sessionMode;
462
+ let sessionMode = rawSessionMode === 'isolated' || rawSessionMode === 'existing'
463
+ ? rawSessionMode
464
+ : 'persistent';
465
+ // Detect sandbox environment.
466
+ // SANDBOX env var is set to 'sandbox-exec' (seatbelt) or the container
467
+ // name (Docker/Podman/gVisor/LXC) when running inside a sandbox.
468
+ // CI uses 'sandbox:none' as a metadata label — not a real sandbox.
469
+ const sandboxType = process.env['SANDBOX'];
470
+ const isContainerSandbox = !!sandboxType &&
471
+ sandboxType !== 'sandbox-exec' &&
472
+ sandboxType !== 'sandbox:none';
473
+ const isSeatbeltSandbox = sandboxType === 'sandbox-exec' && sessionMode !== 'existing';
474
+ // Seatbelt sandbox: force isolated + headless for filesystem compatibility.
475
+ // Chrome exists on the host, but persistent profiles may conflict with
476
+ // seatbelt restrictions. Isolated mode uses tmpdir (always writable).
477
+ if (isSeatbeltSandbox) {
478
+ if (sessionMode !== 'isolated') {
479
+ sessionMode = 'isolated';
480
+ coreEvents.emitFeedback('info', '🔒 Sandbox: Using isolated browser session for compatibility.');
481
+ }
482
+ }
264
483
  const mcpArgs = ['--experimental-vision'];
265
484
  // Session mode determines how the browser is managed:
266
485
  // - "isolated": Temp profile, cleaned up after session (--isolated)
@@ -271,13 +490,38 @@ export class BrowserManager {
271
490
  mcpArgs.push('--isolated');
272
491
  }
273
492
  else if (sessionMode === 'existing') {
274
- mcpArgs.push('--autoConnect');
275
- const message = '🔒 Browsing with your signed-in Chrome profile — cookies and saved logins will be visible to the agent.';
276
- coreEvents.emitFeedback('info', message);
277
- coreEvents.emitConsoleLog('info', message);
493
+ if (isContainerSandbox) {
494
+ // In container sandboxes, --autoConnect can't discover Chrome on the
495
+ // host (it uses local pipes/sockets). Use --browser-url with the
496
+ // resolved IP of host.docker.internal instead of the hostname, because
497
+ // Chrome's DevTools protocol rejects HTTP requests where the Host
498
+ // header is not 'localhost' or an IP address.
499
+ const dns = await import('node:dns');
500
+ let browserHost = 'host.docker.internal';
501
+ try {
502
+ const { address } = await dns.promises.lookup(browserHost);
503
+ browserHost = address;
504
+ }
505
+ catch {
506
+ // Fallback: use hostname as-is if DNS resolution fails
507
+ debugLogger.log(`Could not resolve host.docker.internal, using hostname directly`);
508
+ }
509
+ const browserUrl = `http://${browserHost}:9222`;
510
+ mcpArgs.push('--browser-url', browserUrl);
511
+ coreEvents.emitFeedback('info', `🔒 Container sandbox: Connecting to Chrome via ${browserHost}:9222.`);
512
+ }
513
+ else {
514
+ mcpArgs.push('--autoConnect');
515
+ const message = '🔒 Browsing with your signed-in Chrome profile — cookies and saved logins will be visible to the agent.';
516
+ coreEvents.emitFeedback('info', message);
517
+ coreEvents.emitConsoleLog('info', message);
518
+ }
278
519
  }
279
- // Add optional settings from config
280
- if (browserConfig.customConfig.headless) {
520
+ // Add optional settings from config.
521
+ // Force headless in seatbelt sandbox since Chrome profile/display access
522
+ // may be restricted, and the user is running in a sandboxed environment.
523
+ const effectiveHeadless = !!browserConfig.customConfig.headless || isSeatbeltSandbox;
524
+ if (effectiveHeadless) {
281
525
  mcpArgs.push('--headless');
282
526
  }
283
527
  if (browserConfig.customConfig.profilePath) {
@@ -302,7 +546,7 @@ export class BrowserManager {
302
546
  return `EXCLUDE ${domain}`;
303
547
  })
304
548
  .join(', ');
305
- mcpArgs.push(`--chromeArg="--host-rules=MAP * 127.0.0.1, ${exclusionRules}, EXCLUDE 127.0.0.1"`);
549
+ mcpArgs.push(`--chromeArg="--host-rules=MAP * ~NOTFOUND, ${exclusionRules}"`);
306
550
  }
307
551
  debugLogger.log(`Launching bundled chrome-devtools-mcp (${sessionMode} mode) with args: ${mcpArgs.join(' ')}`);
308
552
  // Create stdio transport to the bundled chrome-devtools-mcp.
@@ -327,9 +571,12 @@ export class BrowserManager {
327
571
  });
328
572
  }
329
573
  this.mcpTransport.onclose = () => {
574
+ this.disconnected = true;
575
+ if (this.isClosing) {
576
+ return;
577
+ }
330
578
  debugLogger.error('chrome-devtools-mcp transport closed unexpectedly. ' +
331
579
  'The MCP server process may have crashed.');
332
- this.rawMcpClient = undefined;
333
580
  };
334
581
  this.mcpTransport.onerror = (error) => {
335
582
  debugLogger.error(`chrome-devtools-mcp transport error: ${error.message}`);
@@ -338,13 +585,21 @@ export class BrowserManager {
338
585
  // since it should connect quickly if remote debugging is enabled.
339
586
  const connectTimeoutMs = sessionMode === 'existing' ? 15_000 : MCP_TIMEOUT_MS;
340
587
  let timeoutId;
588
+ const connectStartMs = Date.now();
341
589
  try {
342
590
  await Promise.race([
343
591
  (async () => {
344
592
  await this.rawMcpClient.connect(this.mcpTransport);
345
593
  debugLogger.log('MCP client connected to chrome-devtools-mcp');
346
594
  await this.discoverTools();
347
- this.registerInputBlockerHandler();
595
+ // clear the action counter for each connection
596
+ this.actionCounter = 0;
597
+ logBrowserAgentConnection(this.config, Date.now() - connectStartMs, {
598
+ session_mode: sessionMode,
599
+ headless: effectiveHeadless,
600
+ success: true,
601
+ tool_count: this.discoveredTools.length,
602
+ });
348
603
  })(),
349
604
  new Promise((_, reject) => {
350
605
  timeoutId = setTimeout(() => reject(new Error(`Timed out connecting to chrome-devtools-mcp (${connectTimeoutMs}ms)`)), connectTimeoutMs);
@@ -353,8 +608,16 @@ export class BrowserManager {
353
608
  }
354
609
  catch (error) {
355
610
  await this.close();
611
+ const rawErrorMessage = error instanceof Error ? error.message : String(error);
612
+ const errorType = BrowserManager.classifyConnectionError(rawErrorMessage);
613
+ logBrowserAgentConnection(this.config, Date.now() - connectStartMs, {
614
+ session_mode: sessionMode,
615
+ headless: effectiveHeadless,
616
+ success: false,
617
+ error_type: errorType,
618
+ });
356
619
  // Provide error-specific, session-mode-aware remediation
357
- throw this.createConnectionError(error instanceof Error ? error.message : String(error), sessionMode);
620
+ throw this.createConnectionError(rawErrorMessage, sessionMode);
358
621
  }
359
622
  finally {
360
623
  if (timeoutId !== undefined) {
@@ -362,14 +625,32 @@ export class BrowserManager {
362
625
  }
363
626
  }
364
627
  }
628
+ /**
629
+ * Classifies a connection error message into a known error type.
630
+ * Shared between connectMcp error recording and createConnectionError
631
+ * to ensure consistent error categorization across the browser agent.
632
+ */
633
+ static classifyConnectionError(message) {
634
+ const lowerMessage = message.toLowerCase();
635
+ if (lowerMessage.includes('already running')) {
636
+ return 'profile_locked';
637
+ }
638
+ else if (lowerMessage.includes('timed out')) {
639
+ return 'timeout';
640
+ }
641
+ else if (lowerMessage.includes('connection refused')) {
642
+ return 'connection_refused';
643
+ }
644
+ return 'unknown';
645
+ }
365
646
  /**
366
647
  * Creates an Error with context-specific remediation based on the actual
367
648
  * error message and the current sessionMode.
368
649
  */
369
650
  createConnectionError(message, sessionMode) {
370
- const lowerMessage = message.toLowerCase();
651
+ const errorType = BrowserManager.classifyConnectionError(message);
371
652
  // "already running for the current profile" — persistent mode profile lock
372
- if (lowerMessage.includes('already running')) {
653
+ if (errorType === 'profile_locked') {
373
654
  if (sessionMode === 'persistent' || sessionMode === 'isolated') {
374
655
  return new Error(`Could not connect to Chrome: ${message}\n\n` +
375
656
  `The Chrome profile is locked by another running instance.\n` +
@@ -384,7 +665,7 @@ export class BrowserManager {
384
665
  `Close other Chrome instances and try again.`);
385
666
  }
386
667
  // Timeout errors
387
- if (lowerMessage.includes('timed out')) {
668
+ if (errorType === 'timeout') {
388
669
  if (sessionMode === 'existing') {
389
670
  return new Error(`Timed out connecting to Chrome: ${message}\n\n` +
390
671
  `To use sessionMode "existing", you must:\n` +
@@ -446,57 +727,59 @@ export class BrowserManager {
446
727
  }
447
728
  try {
448
729
  const parsedUrl = new URL(url);
449
- const urlHostname = parsedUrl.hostname.replace(/\.$/, '');
450
- for (const domainPattern of allowedDomains) {
451
- if (domainPattern.startsWith('*.')) {
452
- const baseDomain = domainPattern.substring(2);
453
- if (urlHostname === baseDomain ||
454
- urlHostname.endsWith(`.${baseDomain}`)) {
455
- return undefined;
730
+ const urlHostname = parsedUrl.hostname;
731
+ if (!this.isDomainAllowed(urlHostname, allowedDomains)) {
732
+ return 'Domain not allowed: The requested domain is not in the allowed list.';
733
+ }
734
+ // Check query parameters for embedded URLs that could bypass domain
735
+ // restrictions via proxy services (e.g. translate.google.com/translate?u=BLOCKED).
736
+ const paramsToCheck = [
737
+ ...parsedUrl.searchParams.values(),
738
+ // Also check fragments which might contain query-like params
739
+ ...new URLSearchParams(parsedUrl.hash.replace(/^#/, '')).values(),
740
+ ];
741
+ for (const paramValue of paramsToCheck) {
742
+ try {
743
+ const embeddedUrl = new URL(paramValue);
744
+ if (embeddedUrl.protocol === 'http:' ||
745
+ embeddedUrl.protocol === 'https:') {
746
+ const embeddedHostname = embeddedUrl.hostname.replace(/\.$/, '');
747
+ if (!this.isDomainAllowed(embeddedHostname, allowedDomains)) {
748
+ return 'Domain not allowed: Embedded URL targets a disallowed domain.';
749
+ }
456
750
  }
457
751
  }
458
- else {
459
- if (urlHostname === domainPattern) {
460
- return undefined;
461
- }
752
+ catch {
753
+ // Not a valid URL, skip.
462
754
  }
463
755
  }
756
+ return undefined;
464
757
  }
465
758
  catch {
466
759
  return `Invalid URL: Malformed URL string.`;
467
760
  }
468
- // If none matched, then deny
469
- return `Tool '${toolName}' is not permitted for the requested URL/domain based on your current browser settings.`;
470
761
  }
471
762
  /**
472
- * Registers a fallback notification handler on the MCP client to
473
- * automatically re-inject the input blocker after any server-side
474
- * notification (e.g. page navigation, resource updates).
475
- *
476
- * This covers ALL navigation types (link clicks, form submissions,
477
- * history navigation) — not just explicit navigate_page tool calls.
763
+ * Checks whether a hostname matches any pattern in the allowed domains list.
478
764
  */
479
- registerInputBlockerHandler() {
480
- if (!this.rawMcpClient) {
481
- return;
482
- }
483
- if (!this.config.shouldDisableBrowserUserInput()) {
484
- return;
485
- }
486
- const existingHandler = this.rawMcpClient.fallbackNotificationHandler;
487
- this.rawMcpClient.fallbackNotificationHandler = async (notification) => {
488
- // Chain with any existing handler first.
489
- if (existingHandler) {
490
- await existingHandler(notification);
765
+ isDomainAllowed(hostname, allowedDomains) {
766
+ const normalized = hostname.replace(/\.$/, '');
767
+ for (const domainPattern of allowedDomains) {
768
+ if (domainPattern.startsWith('*.')) {
769
+ const baseDomain = domainPattern.substring(2);
770
+ if (normalized === baseDomain ||
771
+ normalized.endsWith(`.${baseDomain}`)) {
772
+ return true;
773
+ }
491
774
  }
492
- // Only re-inject on resource update notifications which indicate
493
- // page content has changed (navigation, new page, etc.)
494
- if (notification.method === 'notifications/resources/updated') {
495
- debugLogger.log('Page content changed, re-injecting input blocker...');
496
- void injectInputBlocker(this);
775
+ else {
776
+ if (normalized === domainPattern) {
777
+ return true;
778
+ }
497
779
  }
498
- };
499
- debugLogger.log('Registered global notification handler for input blocker re-injection');
780
+ }
781
+ // If none matched, then deny
782
+ return false;
500
783
  }
501
784
  }
502
785
  //# sourceMappingURL=browserManager.js.map