@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.
- package/dist/docs/AFTER_MERGE_PROMPT.md +3 -10
- package/dist/docs/assets/theme-tokyonight-dark.png +0 -0
- package/dist/docs/changelogs/index.md +49 -0
- package/dist/docs/changelogs/latest.md +355 -458
- package/dist/docs/changelogs/preview.md +402 -363
- package/dist/docs/cli/acp-mode.md +126 -0
- package/dist/docs/cli/cli-reference.md +1 -1
- package/dist/docs/cli/notifications.md +5 -5
- package/dist/docs/cli/plan-mode.md +26 -10
- package/dist/docs/cli/sandbox.md +53 -1
- package/dist/docs/cli/settings.md +52 -48
- package/dist/docs/cli/themes.md +5 -0
- package/dist/docs/core/index.md +2 -2
- package/dist/docs/core/remote-agents.md +14 -18
- package/dist/docs/core/subagents.md +194 -47
- package/dist/docs/get-started/authentication.md +2 -2
- package/dist/docs/get-started/gemini-3.md +1 -1
- package/dist/docs/get-started/index.md +127 -1
- package/dist/docs/get-started/installation.md +7 -0
- package/dist/docs/hooks/index.md +6 -6
- package/dist/docs/ide-integration/index.md +99 -24
- package/dist/docs/index.md +0 -2
- package/dist/docs/redirects.json +1 -0
- package/dist/docs/reference/commands.md +1 -3
- package/dist/docs/reference/configuration.md +220 -99
- package/dist/docs/reference/keyboard-shortcuts.md +21 -8
- package/dist/docs/reference/policy-engine.md +36 -31
- package/dist/docs/reference/tools.md +56 -23
- package/dist/docs/release-confidence.md +0 -6
- package/dist/docs/releases.md +4 -0
- package/dist/docs/resources/quota-and-pricing.md +23 -9
- package/dist/docs/sidebar.json +11 -4
- package/dist/docs/tools/mcp-server.md +3 -3
- package/dist/docs/tools/planning.md +6 -4
- package/dist/docs/tools/web-fetch.md +3 -0
- package/dist/package.json +2 -1
- package/dist/src/agent/agent-session.test.js +14 -6
- package/dist/src/agent/agent-session.test.js.map +1 -1
- package/dist/src/agent/event-translator.js +2 -1
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/event-translator.test.js +1 -0
- package/dist/src/agent/event-translator.test.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.d.ts +47 -4
- package/dist/src/agent/legacy-agent-session.js +38 -15
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +60 -73
- package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
- package/dist/src/agent/mock.js +7 -1
- package/dist/src/agent/mock.js.map +1 -1
- package/dist/src/agent/mock.test.js +1 -1
- package/dist/src/agent/mock.test.js.map +1 -1
- package/dist/src/agent/types.d.ts +34 -1
- package/dist/src/agents/a2a-client-manager.js +3 -3
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/agent-scheduler.js +6 -1
- package/dist/src/agents/agent-scheduler.js.map +1 -1
- package/dist/src/agents/agent-scheduler.test.js +38 -0
- package/dist/src/agents/agent-scheduler.test.js.map +1 -1
- package/dist/src/agents/agentLoader.d.ts +12 -12
- package/dist/src/agents/agentLoader.js +1 -0
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/auth-provider/api-key-provider.test.js +18 -2
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -1
- package/dist/src/agents/auth-provider/value-resolver.test.js +30 -0
- package/dist/src/agents/auth-provider/value-resolver.test.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.js +36 -6
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.test.js +35 -3
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
- package/dist/src/agents/browser/automationOverlay.js +2 -10
- package/dist/src/agents/browser/automationOverlay.js.map +1 -1
- package/dist/src/agents/browser/browserAgentDefinition.js +10 -3
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.d.ts +11 -3
- package/dist/src/agents/browser/browserAgentFactory.js +171 -129
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.test.js +99 -13
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +87 -27
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.test.js +107 -7
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
- package/dist/src/agents/browser/browserManager.d.ts +89 -8
- package/dist/src/agents/browser/browserManager.js +357 -74
- package/dist/src/agents/browser/browserManager.js.map +1 -1
- package/dist/src/agents/browser/browserManager.test.js +540 -19
- package/dist/src/agents/browser/browserManager.test.js.map +1 -1
- package/dist/src/agents/browser/inputBlocker.d.ts +4 -4
- package/dist/src/agents/browser/inputBlocker.js +8 -18
- package/dist/src/agents/browser/inputBlocker.js.map +1 -1
- package/dist/src/agents/browser/inputBlocker.test.js +31 -3
- package/dist/src/agents/browser/inputBlocker.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.js +9 -6
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.test.js +2 -2
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
- package/dist/src/agents/browser/modelAvailability.d.ts +5 -0
- package/dist/src/agents/browser/modelAvailability.js +12 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -1
- package/dist/src/agents/browser/snapshotSuperseder.d.ts +31 -0
- package/dist/src/agents/browser/snapshotSuperseder.js +101 -0
- package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -0
- package/dist/src/agents/browser/snapshotSuperseder.test.js +158 -0
- package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -0
- package/dist/src/agents/local-executor.d.ts +9 -0
- package/dist/src/agents/local-executor.js +144 -200
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +500 -115
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +1 -0
- package/dist/src/agents/local-invocation.js +19 -9
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +24 -0
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.js +1 -0
- package/dist/src/agents/memory-manager-agent.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.test.js +6 -0
- package/dist/src/agents/memory-manager-agent.test.js.map +1 -1
- package/dist/src/agents/registry.js +19 -11
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +67 -0
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.d.ts +24 -0
- package/dist/src/agents/skill-extraction-agent.js +269 -0
- package/dist/src/agents/skill-extraction-agent.js.map +1 -0
- package/dist/src/agents/types.d.ts +20 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/policyCatalog.d.ts +2 -1
- package/dist/src/availability/policyCatalog.js +1 -1
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +43 -32
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +12 -1
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.js +1 -1
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/experiments/flagNames.d.ts +1 -0
- package/dist/src/code_assist/experiments/flagNames.js +1 -0
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +8 -3
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +57 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +1 -1
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +5 -2
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +27 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +80 -80
- package/dist/src/commands/memory.js +1 -1
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/config/agent-loop-context.d.ts +2 -0
- package/dist/src/config/config.d.ts +91 -23
- package/dist/src/config/config.js +238 -79
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +189 -15
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +9 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/extensions/integrity.js +1 -1
- package/dist/src/config/extensions/integrity.js.map +1 -1
- package/dist/src/config/memory.d.ts +1 -0
- package/dist/src/config/memory.js +6 -0
- package/dist/src/config/memory.js.map +1 -1
- package/dist/src/config/projectRegistry.js +5 -3
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/scoped-config.d.ts +30 -0
- package/dist/src/config/scoped-config.js +69 -0
- package/dist/src/config/scoped-config.js.map +1 -0
- package/dist/src/config/scoped-config.test.d.ts +6 -0
- package/dist/src/config/scoped-config.test.js +161 -0
- package/dist/src/config/scoped-config.test.js.map +1 -0
- package/dist/src/config/storage.d.ts +3 -0
- package/dist/src/config/storage.js +9 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +10 -5
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/config/topicState.d.ts +21 -0
- package/dist/src/config/topicState.js +41 -0
- package/dist/src/config/topicState.js.map +1 -0
- package/dist/src/confirmation-bus/types.d.ts +13 -4
- package/dist/src/confirmation-bus/types.js +2 -0
- package/dist/src/confirmation-bus/types.js.map +1 -1
- package/dist/src/context/agentHistoryProvider.d.ts +45 -0
- package/dist/src/context/agentHistoryProvider.js +294 -0
- package/dist/src/context/agentHistoryProvider.js.map +1 -0
- package/dist/src/context/agentHistoryProvider.test.d.ts +6 -0
- package/dist/src/context/agentHistoryProvider.test.js +357 -0
- package/dist/src/context/agentHistoryProvider.test.js.map +1 -0
- package/dist/src/context/chatCompressionService.js.map +1 -0
- package/dist/src/context/chatCompressionService.test.js.map +1 -0
- package/dist/src/context/contextCompressionService.d.ts +30 -0
- package/dist/src/context/contextCompressionService.js +405 -0
- package/dist/src/context/contextCompressionService.js.map +1 -0
- package/dist/src/context/contextCompressionService.test.js +253 -0
- package/dist/src/context/contextCompressionService.test.js.map +1 -0
- package/dist/src/{services/contextManager.d.ts → context/memoryContextManager.d.ts} +3 -1
- package/dist/src/{services/contextManager.js → context/memoryContextManager.js} +20 -11
- package/dist/src/context/memoryContextManager.js.map +1 -0
- package/dist/src/{services/contextManager.test.js → context/memoryContextManager.test.js} +42 -33
- package/dist/src/context/memoryContextManager.test.js.map +1 -0
- package/dist/src/context/profiles.d.ts +7 -0
- package/dist/src/context/profiles.js +21 -0
- package/dist/src/context/profiles.js.map +1 -0
- package/dist/src/context/toolDistillationService.d.ts +38 -0
- package/dist/src/context/toolDistillationService.js +170 -0
- package/dist/src/context/toolDistillationService.js.map +1 -0
- package/dist/src/context/toolDistillationService.test.d.ts +6 -0
- package/dist/src/context/toolDistillationService.test.js +86 -0
- package/dist/src/context/toolDistillationService.test.js.map +1 -0
- package/dist/src/{services → context}/toolOutputMaskingService.d.ts +2 -2
- package/dist/src/{services → context}/toolOutputMaskingService.js +7 -7
- package/dist/src/context/toolOutputMaskingService.js.map +1 -0
- package/dist/src/context/toolOutputMaskingService.test.d.ts +6 -0
- package/dist/src/{services → context}/toolOutputMaskingService.test.js +4 -5
- package/dist/src/context/toolOutputMaskingService.test.js.map +1 -0
- package/dist/src/context/truncation.d.ts +26 -0
- package/dist/src/context/truncation.js +102 -0
- package/dist/src/context/truncation.js.map +1 -0
- package/dist/src/context/types.d.ts +36 -0
- package/dist/src/context/types.js +7 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/core/AuthenticatedContentGenerator.js +9 -1
- package/dist/src/core/AuthenticatedContentGenerator.js.map +1 -1
- package/dist/src/core/baseLlmClient.js +1 -1
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +1 -0
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +3 -1
- package/dist/src/core/client.js +24 -14
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +36 -40
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +0 -1
- package/dist/src/core/contentGenerator.js +2 -28
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +1 -101
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +12 -5
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +72 -18
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +1 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/logger.js +4 -4
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.js +1 -1
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/prompts-substitution.test.js +5 -0
- package/dist/src/core/prompts-substitution.test.js.map +1 -1
- package/dist/src/core/prompts.test.js +3 -0
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/hooks/hookEventHandler.js +8 -0
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookRunner.js +9 -5
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +20 -3
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.d.ts +2 -0
- package/dist/src/hooks/hookSystem.js +1 -0
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookTranslator.js +20 -13
- package/dist/src/hooks/hookTranslator.js.map +1 -1
- package/dist/src/hooks/hookTranslator.test.js +36 -0
- package/dist/src/hooks/hookTranslator.test.js.map +1 -1
- package/dist/src/hooks/types.d.ts +2 -0
- package/dist/src/ide/ide-client.js +3 -3
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +1 -1
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-installer.js +5 -4
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.js +3 -3
- package/dist/src/ide/process-utils.js.map +1 -1
- package/dist/src/index.d.ts +10 -3
- package/dist/src/index.js +13 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/mcpLauncher.js +1 -1
- package/dist/src/output/json-formatter.js +2 -1
- package/dist/src/output/json-formatter.js.map +1 -1
- package/dist/src/policy/config.d.ts +1 -1
- package/dist/src/policy/config.js +61 -24
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +21 -20
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/persistence.test.js +42 -0
- package/dist/src/policy/persistence.test.js.map +1 -1
- package/dist/src/policy/policies/discovered.toml +7 -0
- package/dist/src/policy/policies/memory-manager.toml +11 -1
- package/dist/src/policy/policies/non-interactive.toml +7 -0
- package/dist/src/policy/policies/plan.toml +36 -2
- package/dist/src/policy/policies/read-only.toml +12 -0
- package/dist/src/policy/policies/sandbox-default.toml +4 -4
- package/dist/src/policy/policies/write.toml +21 -0
- package/dist/src/policy/policies/yolo.toml +1 -1
- package/dist/src/policy/policy-engine.d.ts +2 -4
- package/dist/src/policy/policy-engine.js +47 -37
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +236 -30
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.d.ts +26 -1
- package/dist/src/policy/sandboxPolicyManager.js +41 -12
- package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.test.d.ts +6 -0
- package/dist/src/policy/sandboxPolicyManager.test.js +61 -0
- package/dist/src/policy/sandboxPolicyManager.test.js.map +1 -0
- package/dist/src/policy/topic-policy.test.d.ts +6 -0
- package/dist/src/policy/topic-policy.test.js +48 -0
- package/dist/src/policy/topic-policy.test.js.map +1 -0
- package/dist/src/policy/types.d.ts +9 -6
- package/dist/src/policy/types.js +11 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/policy/workspace-policy.test.js +18 -15
- package/dist/src/policy/workspace-policy.test.js.map +1 -1
- package/dist/src/prompts/promptProvider.js +20 -4
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +84 -1
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory-manager.test.js +1 -1
- package/dist/src/prompts/snippets-memory-manager.test.js.map +1 -1
- package/dist/src/prompts/snippets.d.ts +3 -4
- package/dist/src/prompts/snippets.js +37 -52
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +6 -4
- package/dist/src/prompts/snippets.legacy.js +36 -7
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/prompts/utils.test.js +7 -5
- package/dist/src/prompts/utils.test.js.map +1 -1
- package/dist/src/safety/built-in.js +1 -1
- package/dist/src/safety/built-in.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +11 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.js +131 -41
- package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +82 -139
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +24 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js +200 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.d.ts +6 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +247 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +10 -22
- package/dist/src/sandbox/macos/MacOsSandboxManager.js +67 -59
- package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +168 -103
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/macos/baseProfile.d.ts +1 -1
- package/dist/src/sandbox/macos/baseProfile.js +26 -8
- package/dist/src/sandbox/macos/baseProfile.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +10 -10
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +81 -93
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +136 -99
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
- package/dist/src/sandbox/{macos → utils}/commandSafety.d.ts +11 -0
- package/dist/src/sandbox/{macos → utils}/commandSafety.js +47 -14
- package/dist/src/sandbox/utils/commandSafety.js.map +1 -0
- package/dist/src/sandbox/utils/commandUtils.d.ts +9 -0
- package/dist/src/sandbox/utils/commandUtils.js +57 -0
- package/dist/src/sandbox/utils/commandUtils.js.map +1 -0
- package/dist/src/sandbox/utils/fsUtils.d.ts +11 -0
- package/dist/src/sandbox/utils/fsUtils.js +84 -0
- package/dist/src/sandbox/utils/fsUtils.js.map +1 -0
- package/dist/src/sandbox/utils/fsUtils.test.d.ts +6 -0
- package/dist/src/sandbox/utils/fsUtils.test.js +43 -0
- package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -0
- package/dist/src/sandbox/utils/proactivePermissions.d.ts +19 -0
- package/dist/src/sandbox/utils/proactivePermissions.js +163 -0
- package/dist/src/sandbox/utils/proactivePermissions.js.map +1 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.d.ts +6 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.js +145 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.js.map +1 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.d.ts +27 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.js +142 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.js.map +1 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.d.ts +6 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.js +188 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.js.map +1 -0
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.d.ts +5 -0
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.js +64 -0
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.js.map +1 -0
- package/dist/src/sandbox/windows/GeminiSandbox.cs +312 -223
- package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +16 -2
- package/dist/src/sandbox/windows/WindowsSandboxManager.js +261 -44
- package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +379 -17
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/windows/commandSafety.d.ts +19 -0
- package/dist/src/sandbox/windows/commandSafety.js +128 -0
- package/dist/src/sandbox/windows/commandSafety.js.map +1 -0
- package/dist/src/sandbox/windows/commandSafety.test.d.ts +6 -0
- package/dist/src/sandbox/windows/commandSafety.test.js +42 -0
- package/dist/src/sandbox/windows/commandSafety.test.js.map +1 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.d.ts +13 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js +69 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js.map +1 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.d.ts +6 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js +68 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js.map +1 -0
- package/dist/src/scheduler/policy.js +20 -5
- package/dist/src/scheduler/policy.js.map +1 -1
- package/dist/src/scheduler/policy.test.js +80 -0
- package/dist/src/scheduler/policy.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.js +13 -3
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +52 -0
- package/dist/src/scheduler/scheduler.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_hooks.test.js +1 -0
- package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
- package/dist/src/scheduler/state-manager.js +1 -1
- package/dist/src/scheduler/state-manager.js.map +1 -1
- package/dist/src/scheduler/state-manager.test.js +10 -0
- package/dist/src/scheduler/state-manager.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +7 -2
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/tool-executor.test.js +38 -0
- package/dist/src/scheduler/tool-executor.test.js.map +1 -1
- package/dist/src/scheduler/types.d.ts +4 -2
- package/dist/src/services/chatRecordingService.d.ts +1 -13
- package/dist/src/services/chatRecordingService.js +45 -46
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +79 -10
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/executionLifecycleService.d.ts +44 -6
- package/dist/src/services/executionLifecycleService.js +52 -12
- package/dist/src/services/executionLifecycleService.js.map +1 -1
- package/dist/src/services/executionLifecycleService.test.js +157 -3
- package/dist/src/services/executionLifecycleService.test.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.d.ts +17 -2
- package/dist/src/services/fileDiscoveryService.js +84 -20
- package/dist/src/services/fileDiscoveryService.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.test.js +67 -1
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/gitService.js +1 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/memoryService.d.ts +65 -0
- package/dist/src/services/memoryService.js +511 -0
- package/dist/src/services/memoryService.js.map +1 -0
- package/dist/src/services/memoryService.test.d.ts +6 -0
- package/dist/src/services/memoryService.test.js +563 -0
- package/dist/src/services/memoryService.test.js.map +1 -0
- package/dist/src/services/modelConfigService.d.ts +11 -0
- package/dist/src/services/modelConfigService.js +67 -0
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +30 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/sandboxManager.d.ts +107 -8
- package/dist/src/services/sandboxManager.integration.test.d.ts +1 -0
- package/dist/src/services/sandboxManager.integration.test.js +445 -0
- package/dist/src/services/sandboxManager.integration.test.js.map +1 -0
- package/dist/src/services/sandboxManager.js +176 -13
- package/dist/src/services/sandboxManager.js.map +1 -1
- package/dist/src/services/sandboxManager.test.js +401 -117
- package/dist/src/services/sandboxManager.test.js.map +1 -1
- package/dist/src/services/sandboxManagerFactory.d.ts +2 -3
- package/dist/src/services/sandboxManagerFactory.js +12 -22
- package/dist/src/services/sandboxManagerFactory.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.d.ts +1 -0
- package/dist/src/services/sandboxedFileSystemService.js +43 -3
- package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.test.js +97 -11
- package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +18 -1
- package/dist/src/services/shellExecutionService.js +115 -26
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +70 -8
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +4 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +4 -0
- package/dist/src/services/worktreeService.test.js +7 -7
- package/dist/src/services/worktreeService.test.js.map +1 -1
- package/dist/src/skills/skillLoader.d.ts +8 -0
- package/dist/src/skills/skillLoader.js +1 -1
- package/dist/src/skills/skillLoader.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +29 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +107 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +172 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +10 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +22 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +22 -0
- package/dist/src/telemetry/loggers.js +41 -2
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +8 -3
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +118 -1
- package/dist/src/telemetry/metrics.js +196 -4
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +298 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +3 -3
- package/dist/src/telemetry/types.js +9 -4
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mock-message-bus.d.ts +1 -1
- package/dist/src/test-utils/mock-message-bus.js +1 -1
- package/dist/src/test-utils/mock-message-bus.js.map +1 -1
- package/dist/src/tools/complete-task.d.ts +29 -0
- package/dist/src/tools/complete-task.js +123 -0
- package/dist/src/tools/complete-task.js.map +1 -0
- package/dist/src/tools/complete-task.test.d.ts +6 -0
- package/dist/src/tools/complete-task.test.js +114 -0
- package/dist/src/tools/complete-task.test.js.map +1 -0
- package/dist/src/tools/definitions/base-declarations.d.ts +8 -0
- package/dist/src/tools/definitions/base-declarations.js +10 -0
- package/dist/src/tools/definitions/base-declarations.js.map +1 -1
- package/dist/src/tools/definitions/coreTools.d.ts +2 -1
- package/dist/src/tools/definitions/coreTools.js +9 -3
- package/dist/src/tools/definitions/coreTools.js.map +1 -1
- package/dist/src/tools/definitions/dynamic-declaration-helpers.d.ts +4 -0
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js +33 -2
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +14 -9
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js +13 -7
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/definitions/trackerTools.js +3 -3
- package/dist/src/tools/definitions/trackerTools.js.map +1 -1
- package/dist/src/tools/definitions/types.d.ts +1 -0
- package/dist/src/tools/enter-plan-mode.js +15 -0
- package/dist/src/tools/enter-plan-mode.js.map +1 -1
- package/dist/src/tools/enter-plan-mode.test.js +25 -0
- package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
- package/dist/src/tools/grep-utils.d.ts +2 -1
- package/dist/src/tools/grep-utils.js +22 -3
- package/dist/src/tools/grep-utils.js.map +1 -1
- package/dist/src/tools/grep.js +16 -3
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +36 -8
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/jit-context.js +3 -3
- package/dist/src/tools/jit-context.js.map +1 -1
- package/dist/src/tools/jit-context.test.js +15 -13
- package/dist/src/tools/jit-context.test.js.map +1 -1
- package/dist/src/tools/ls.js +6 -4
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +22 -7
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +6 -3
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +35 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +1 -1
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +1 -1
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +9 -2
- package/dist/src/tools/memoryTool.js +39 -15
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +61 -2
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +12 -4
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +17 -17
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/ripGrep.js +14 -1
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +10 -10
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +17 -4
- package/dist/src/tools/shell.js +342 -151
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +204 -11
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.d.ts +38 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.d.ts +6 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.js +86 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -0
- package/dist/src/tools/shellBackgroundTools.js +186 -0
- package/dist/src/tools/shellBackgroundTools.js.map +1 -0
- package/dist/src/tools/shellBackgroundTools.test.d.ts +6 -0
- package/dist/src/tools/shellBackgroundTools.test.js +230 -0
- package/dist/src/tools/shellBackgroundTools.test.js.map +1 -0
- package/dist/src/tools/shell_proactive.test.d.ts +6 -0
- package/dist/src/tools/shell_proactive.test.js +122 -0
- package/dist/src/tools/shell_proactive.test.js.map +1 -0
- package/dist/src/tools/tool-names.d.ts +4 -4
- package/dist/src/tools/tool-names.js +6 -3
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.js +11 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +43 -1
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +12 -1
- package/dist/src/tools/tools.js +16 -1
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +42 -1
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/topicTool.d.ts +29 -0
- package/dist/src/tools/topicTool.js +72 -0
- package/dist/src/tools/topicTool.js.map +1 -0
- package/dist/src/tools/topicTool.test.d.ts +6 -0
- package/dist/src/tools/topicTool.test.js +105 -0
- package/dist/src/tools/topicTool.test.js.map +1 -0
- package/dist/src/tools/web-fetch.js +40 -22
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +28 -0
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js +1 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.js +3 -6
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/checkpointUtils.d.ts +4 -4
- package/dist/src/utils/checkpointUtils.js +11 -8
- package/dist/src/utils/checkpointUtils.js.map +1 -1
- package/dist/src/utils/compatibility.js +0 -7
- package/dist/src/utils/compatibility.js.map +1 -1
- package/dist/src/utils/compatibility.test.js +0 -9
- package/dist/src/utils/compatibility.test.js.map +1 -1
- package/dist/src/utils/editor.js +3 -0
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/errorParsing.js +2 -2
- package/dist/src/utils/errorParsing.js.map +1 -1
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +28 -6
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.js +23 -0
- package/dist/src/utils/errors.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +12 -0
- package/dist/src/utils/events.js +7 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +1 -0
- package/dist/src/utils/fetch.js +22 -6
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fetch.test.js +26 -1
- package/dist/src/utils/fetch.test.js.map +1 -1
- package/dist/src/utils/fileUtils.js +1 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/filesearch/crawler.js +1 -1
- package/dist/src/utils/filesearch/crawler.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +7 -2
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/getFolderStructure.js +1 -1
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/getPty.js +2 -2
- package/dist/src/utils/getPty.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.d.ts +2 -2
- package/dist/src/utils/gitIgnoreParser.js +30 -52
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +51 -185
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/gitUtils.js +2 -2
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/googleErrors.js +5 -5
- package/dist/src/utils/googleErrors.js.map +1 -1
- package/dist/src/utils/ignoreFileParser.d.ts +2 -2
- package/dist/src/utils/ignoreFileParser.js +7 -18
- package/dist/src/utils/ignoreFileParser.js.map +1 -1
- package/dist/src/utils/ignoreFileParser.test.js +40 -132
- package/dist/src/utils/ignoreFileParser.test.js.map +1 -1
- package/dist/src/utils/ignorePathUtils.d.ts +11 -0
- package/dist/src/utils/ignorePathUtils.js +39 -0
- package/dist/src/utils/ignorePathUtils.js.map +1 -0
- package/dist/src/utils/ignorePathUtils.test.d.ts +6 -0
- package/dist/src/utils/ignorePathUtils.test.js +70 -0
- package/dist/src/utils/ignorePathUtils.test.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +6 -4
- package/dist/src/utils/memoryDiscovery.js +69 -48
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +40 -0
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.d.ts +1 -1
- package/dist/src/utils/memoryImportProcessor.js +24 -15
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/paths.d.ts +8 -0
- package/dist/src/utils/paths.js +37 -6
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +61 -3
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/process-utils.js +2 -2
- package/dist/src/utils/process-utils.js.map +1 -1
- package/dist/src/utils/retry.js +7 -0
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +41 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.js +1 -1
- package/dist/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/src/utils/sessionOperations.d.ts +19 -0
- package/dist/src/utils/sessionOperations.js +101 -0
- package/dist/src/utils/sessionOperations.js.map +1 -0
- package/dist/src/utils/sessionOperations.test.d.ts +6 -0
- package/dist/src/utils/sessionOperations.test.js +92 -0
- package/dist/src/utils/sessionOperations.test.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +24 -0
- package/dist/src/utils/shell-utils.integration.test.js +1 -1
- package/dist/src/utils/shell-utils.integration.test.js.map +1 -1
- package/dist/src/utils/shell-utils.js +86 -6
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +13 -1
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/terminalSerializer.d.ts +1 -0
- package/dist/src/utils/terminalSerializer.js +31 -8
- package/dist/src/utils/terminalSerializer.js.map +1 -1
- package/dist/src/utils/terminalSerializer.test.js +3 -2
- package/dist/src/utils/terminalSerializer.test.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +8 -0
- package/dist/src/utils/textUtils.js +16 -0
- package/dist/src/utils/textUtils.js.map +1 -1
- package/dist/src/utils/tokenCalculation.d.ts +2 -0
- package/dist/src/utils/tokenCalculation.js +2 -2
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/workspaceContext.js +2 -2
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/dist/docs/CONTRIBUTING.md +0 -566
- package/dist/docs/get-started/examples.md +0 -141
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js +0 -164
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js.map +0 -1
- package/dist/src/sandbox/macos/commandSafety.js.map +0 -1
- package/dist/src/services/chatCompressionService.js.map +0 -1
- package/dist/src/services/chatCompressionService.test.js.map +0 -1
- package/dist/src/services/contextManager.js.map +0 -1
- package/dist/src/services/contextManager.test.js.map +0 -1
- package/dist/src/services/toolOutputMaskingService.js.map +0 -1
- package/dist/src/services/toolOutputMaskingService.test.js.map +0 -1
- /package/dist/src/{services/toolOutputMaskingService.test.d.ts → agents/browser/snapshotSuperseder.test.d.ts} +0 -0
- /package/dist/src/{services → context}/chatCompressionService.d.ts +0 -0
- /package/dist/src/{services → context}/chatCompressionService.js +0 -0
- /package/dist/src/{services → context}/chatCompressionService.test.d.ts +0 -0
- /package/dist/src/{services → context}/chatCompressionService.test.js +0 -0
- /package/dist/src/{sandbox/macos/MacOsSandboxManager.integration.test.d.ts → context/contextCompressionService.test.d.ts} +0 -0
- /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
|
-
|
|
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
|
-
|
|
165
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|
-
|
|
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 *
|
|
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
|
-
|
|
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(
|
|
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
|
|
651
|
+
const errorType = BrowserManager.classifyConnectionError(message);
|
|
371
652
|
// "already running for the current profile" — persistent mode profile lock
|
|
372
|
-
if (
|
|
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 (
|
|
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
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
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
|
-
|
|
459
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
void injectInputBlocker(this);
|
|
775
|
+
else {
|
|
776
|
+
if (normalized === domainPattern) {
|
|
777
|
+
return true;
|
|
778
|
+
}
|
|
497
779
|
}
|
|
498
|
-
}
|
|
499
|
-
|
|
780
|
+
}
|
|
781
|
+
// If none matched, then deny
|
|
782
|
+
return false;
|
|
500
783
|
}
|
|
501
784
|
}
|
|
502
785
|
//# sourceMappingURL=browserManager.js.map
|