@office-ai/aioncli-core 0.30.0 → 0.30.1
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/assets/theme-ansi-dark.png +0 -0
- package/dist/docs/assets/theme-atom-one-dark.png +0 -0
- package/dist/docs/assets/theme-ayu-dark.png +0 -0
- package/dist/docs/assets/theme-default-dark.png +0 -0
- package/dist/docs/assets/theme-dracula-dark.png +0 -0
- package/dist/docs/assets/theme-github-dark.png +0 -0
- package/dist/docs/assets/theme-holiday-dark.png +0 -0
- package/dist/docs/assets/theme-shades-of-purple-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-light.png +0 -0
- package/dist/docs/cli/notifications.md +58 -0
- package/dist/docs/redirects.json +20 -0
- package/dist/docs/reference/commands.md +563 -0
- package/dist/docs/reference/configuration.md +1804 -0
- package/dist/docs/reference/keyboard-shortcuts.md +168 -0
- package/dist/docs/reference/memport.md +246 -0
- package/dist/docs/reference/policy-engine.md +386 -0
- package/dist/docs/reference/tools.md +106 -0
- package/dist/docs/resources/faq.md +175 -0
- package/dist/docs/resources/quota-and-pricing.md +199 -0
- package/dist/docs/resources/tos-privacy.md +102 -0
- package/dist/docs/resources/troubleshooting.md +176 -0
- package/dist/docs/resources/uninstall.md +56 -0
- package/dist/src/agents/a2a-errors.d.ts +65 -0
- package/dist/src/agents/a2a-errors.js +164 -0
- package/dist/src/agents/a2a-errors.js.map +1 -0
- package/dist/src/agents/a2a-errors.test.d.ts +6 -0
- package/dist/src/agents/a2a-errors.test.js +183 -0
- package/dist/src/agents/a2a-errors.test.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
- package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
- package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.d.ts +28 -0
- package/dist/src/agents/auth-provider/http-provider.js +73 -0
- package/dist/src/agents/auth-provider/http-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/http-provider.test.js +112 -0
- package/dist/src/agents/auth-provider/http-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.d.ts +65 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js +233 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js +490 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
- package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
- package/dist/src/agents/browser/automationOverlay.d.ts +26 -0
- package/dist/src/agents/browser/automationOverlay.js +100 -0
- package/dist/src/agents/browser/automationOverlay.js.map +1 -0
- package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
- package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
- package/dist/src/agents/browser/browserAgentFactory.js +116 -0
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js +240 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +34 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +386 -0
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js +382 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
- package/dist/src/agents/browser/browserManager.d.ts +115 -0
- package/dist/src/agents/browser/browserManager.js +370 -0
- package/dist/src/agents/browser/browserManager.js.map +1 -0
- package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
- package/dist/src/agents/browser/browserManager.test.js +382 -0
- package/dist/src/agents/browser/browserManager.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
- package/dist/src/agents/browser/mcpToolWrapper.js +358 -0
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +59 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
- package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
- package/dist/src/agents/browser/modelAvailability.js +23 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -0
- package/dist/src/agents/cli-help-agent.d.ts +2 -2
- package/dist/src/billing/billing.d.ts +80 -0
- package/dist/src/billing/billing.js +128 -0
- package/dist/src/billing/billing.js.map +1 -0
- package/dist/src/billing/billing.test.d.ts +6 -0
- package/dist/src/billing/billing.test.js +182 -0
- package/dist/src/billing/billing.test.js.map +1 -0
- package/dist/src/billing/index.d.ts +6 -0
- package/dist/src/billing/index.js +7 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +1 -1
- package/dist/src/code_assist/types.d.ts +26 -26
- package/dist/src/config/agent-loop-context.d.ts +22 -0
- package/dist/src/config/agent-loop-context.js +7 -0
- package/dist/src/config/agent-loop-context.js.map +1 -0
- package/dist/src/config/trackerFeatureFlag.test.d.ts +6 -0
- package/dist/src/config/trackerFeatureFlag.test.js +43 -0
- package/dist/src/config/trackerFeatureFlag.test.js.map +1 -0
- package/dist/src/config/userHintService.d.ts +46 -0
- package/dist/src/config/userHintService.js +81 -0
- package/dist/src/config/userHintService.js.map +1 -0
- package/dist/src/config/userHintService.test.d.ts +6 -0
- package/dist/src/config/userHintService.test.js +62 -0
- package/dist/src/config/userHintService.test.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.d.ts +24 -0
- package/dist/src/core/localLiteRtLmClient.js +77 -0
- package/dist/src/core/localLiteRtLmClient.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.test.d.ts +6 -0
- package/dist/src/core/localLiteRtLmClient.test.js +87 -0
- package/dist/src/core/localLiteRtLmClient.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator.d.ts +1 -0
- package/dist/src/core/openaiContentGenerator.js +13 -13
- package/dist/src/core/openaiContentGenerator.js.map +1 -1
- package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
- package/dist/src/hooks/runtimeHooks.test.js +100 -0
- package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
- package/dist/src/ide/types.d.ts +6 -6
- package/dist/src/mcp/mcp-oauth-provider.d.ts +43 -0
- package/dist/src/mcp/mcp-oauth-provider.js +67 -0
- package/dist/src/mcp/mcp-oauth-provider.js.map +1 -0
- package/dist/src/mcp/mcp-oauth-provider.test.d.ts +6 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js +63 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js.map +1 -0
- package/dist/src/policy/integrity.d.ts +45 -0
- package/dist/src/policy/integrity.js +121 -0
- package/dist/src/policy/integrity.js.map +1 -0
- package/dist/src/policy/integrity.test.d.ts +6 -0
- package/dist/src/policy/integrity.test.js +132 -0
- package/dist/src/policy/integrity.test.js.map +1 -0
- package/dist/src/policy/policies/conseca.toml +6 -0
- package/dist/src/policy/workspace-policy.test.js +231 -0
- package/dist/src/policy/workspace-policy.test.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js +59 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js +140 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.d.ts +14 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js +182 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +218 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -0
- package/dist/src/safety/conseca/conseca.d.ts +31 -0
- package/dist/src/safety/conseca/conseca.js +105 -0
- package/dist/src/safety/conseca/conseca.js.map +1 -0
- package/dist/src/safety/conseca/conseca.test.js +226 -0
- package/dist/src/safety/conseca/conseca.test.js.map +1 -0
- package/dist/src/safety/conseca/integration.test.js +19 -0
- package/dist/src/safety/conseca/integration.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
- package/dist/src/safety/conseca/policy-enforcer.js +135 -0
- package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
- package/dist/src/safety/conseca/policy-generator.js +144 -0
- package/dist/src/safety/conseca/policy-generator.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
- package/dist/src/safety/conseca/policy-generator.test.js +84 -0
- package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
- package/dist/src/safety/conseca/types.d.ts +15 -0
- package/dist/src/safety/conseca/types.js +7 -0
- package/dist/src/safety/conseca/types.js.map +1 -0
- package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
- package/dist/src/scheduler/scheduler_parallel.test.js +401 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
- package/dist/src/services/FolderTrustDiscoveryService.js +169 -0
- package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
- package/dist/src/services/fileKeychain.d.ts +24 -0
- package/dist/src/services/fileKeychain.js +123 -0
- package/dist/src/services/fileKeychain.js.map +1 -0
- package/dist/src/services/keychainService.d.ts +51 -0
- package/dist/src/services/keychainService.js +133 -0
- package/dist/src/services/keychainService.js.map +1 -0
- package/dist/src/services/keychainService.test.d.ts +6 -0
- package/dist/src/services/keychainService.test.js +150 -0
- package/dist/src/services/keychainService.test.js.map +1 -0
- package/dist/src/services/keychainTypes.d.ts +41 -0
- package/dist/src/services/keychainTypes.js +18 -0
- package/dist/src/services/keychainTypes.js.map +1 -0
- package/dist/src/services/trackerService.d.ts +49 -0
- package/dist/src/services/trackerService.js +193 -0
- package/dist/src/services/trackerService.js.map +1 -0
- package/dist/src/services/trackerService.test.d.ts +6 -0
- package/dist/src/services/trackerService.test.js +117 -0
- package/dist/src/services/trackerService.test.js.map +1 -0
- package/dist/src/services/trackerTypes.d.ts +51 -0
- package/dist/src/services/trackerTypes.js +33 -0
- package/dist/src/services/trackerTypes.js.map +1 -0
- package/dist/src/telemetry/billingEvents.d.ts +75 -0
- package/dist/src/telemetry/billingEvents.js +181 -0
- package/dist/src/telemetry/billingEvents.js.map +1 -0
- package/dist/src/telemetry/billingEvents.test.d.ts +6 -0
- package/dist/src/telemetry/billingEvents.test.js +139 -0
- package/dist/src/telemetry/billingEvents.test.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.d.ts +9 -0
- package/dist/src/telemetry/conseca-logger.js +91 -0
- package/dist/src/telemetry/conseca-logger.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
- package/dist/src/telemetry/conseca-logger.test.js +90 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
- package/dist/src/telemetry/trace.test.d.ts +6 -0
- package/dist/src/telemetry/trace.test.js +116 -0
- package/dist/src/telemetry/trace.test.js.map +1 -0
- package/dist/src/tools/definitions/trackerTools.d.ts +12 -0
- package/dist/src/tools/definitions/trackerTools.js +146 -0
- package/dist/src/tools/definitions/trackerTools.js.map +1 -0
- package/dist/src/tools/diff-utils.d.ts +9 -0
- package/dist/src/tools/diff-utils.js +66 -0
- package/dist/src/tools/diff-utils.js.map +1 -0
- package/dist/src/tools/diff-utils.test.d.ts +6 -0
- package/dist/src/tools/diff-utils.test.js +53 -0
- package/dist/src/tools/diff-utils.test.js.map +1 -0
- package/dist/src/tools/grep-utils.d.ts +49 -0
- package/dist/src/tools/grep-utils.js +147 -0
- package/dist/src/tools/grep-utils.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
- package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
- package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
- package/dist/src/tools/trackerTools.d.ts +122 -0
- package/dist/src/tools/trackerTools.js +365 -0
- package/dist/src/tools/trackerTools.js.map +1 -0
- package/dist/src/tools/trackerTools.test.d.ts +6 -0
- package/dist/src/tools/trackerTools.test.js +97 -0
- package/dist/src/tools/trackerTools.test.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.d.ts +14 -0
- package/dist/src/utils/approvalModeUtils.js +35 -0
- package/dist/src/utils/approvalModeUtils.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
- package/dist/src/utils/approvalModeUtils.test.js +36 -0
- package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
- package/dist/src/utils/cache.d.ts +63 -0
- package/dist/src/utils/cache.js +103 -0
- package/dist/src/utils/cache.js.map +1 -0
- package/dist/src/utils/cache.test.d.ts +6 -0
- package/dist/src/utils/cache.test.js +158 -0
- package/dist/src/utils/cache.test.js.map +1 -0
- package/dist/src/utils/checkpointUtils.d.ts +2 -2
- package/dist/src/utils/compatibility.d.ts +41 -0
- package/dist/src/utils/compatibility.js +112 -0
- package/dist/src/utils/compatibility.js.map +1 -0
- package/dist/src/utils/compatibility.test.d.ts +6 -0
- package/dist/src/utils/compatibility.test.js +233 -0
- package/dist/src/utils/compatibility.test.js.map +1 -0
- package/dist/src/utils/envExpansion.d.ts +18 -0
- package/dist/src/utils/envExpansion.js +46 -0
- package/dist/src/utils/envExpansion.js.map +1 -0
- package/dist/src/utils/envExpansion.test.d.ts +6 -0
- package/dist/src/utils/envExpansion.test.js +110 -0
- package/dist/src/utils/envExpansion.test.js.map +1 -0
- package/dist/src/utils/errors_timeout.test.d.ts +6 -0
- package/dist/src/utils/errors_timeout.test.js +40 -0
- package/dist/src/utils/errors_timeout.test.js.map +1 -0
- package/dist/src/utils/fetch.test.d.ts +6 -0
- package/dist/src/utils/fetch.test.js +206 -0
- package/dist/src/utils/fetch.test.js.map +1 -0
- package/dist/src/utils/markdownUtils.d.ts +22 -0
- package/dist/src/utils/markdownUtils.js +126 -0
- package/dist/src/utils/markdownUtils.js.map +1 -0
- package/dist/src/utils/markdownUtils.test.d.ts +6 -0
- package/dist/src/utils/markdownUtils.test.js +107 -0
- package/dist/src/utils/markdownUtils.test.js.map +1 -0
- package/dist/src/utils/oauth-flow.d.ts +105 -0
- package/dist/src/utils/oauth-flow.js +370 -0
- package/dist/src/utils/oauth-flow.js.map +1 -0
- package/dist/src/utils/oauth-flow.test.d.ts +6 -0
- package/dist/src/utils/oauth-flow.test.js +360 -0
- package/dist/src/utils/oauth-flow.test.js.map +1 -0
- package/dist/src/utils/sessionUtils.d.ts +14 -0
- package/dist/src/utils/sessionUtils.js +122 -0
- package/dist/src/utils/sessionUtils.js.map +1 -0
- package/dist/src/utils/sessionUtils.test.d.ts +1 -0
- package/dist/src/utils/sessionUtils.test.js +171 -0
- package/dist/src/utils/sessionUtils.test.js.map +1 -0
- package/dist/src/voice/responseFormatter.d.ts +38 -0
- package/dist/src/voice/responseFormatter.js +130 -0
- package/dist/src/voice/responseFormatter.js.map +1 -0
- package/dist/src/voice/responseFormatter.test.d.ts +6 -0
- package/dist/src/voice/responseFormatter.test.js +214 -0
- package/dist/src/voice/responseFormatter.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/docs/CONTRIBUTING.md +0 -555
- package/dist/src/agents/executor.d.ts +0 -114
- package/dist/src/agents/executor.js +0 -779
- package/dist/src/agents/executor.js.map +0 -1
- package/dist/src/agents/executor.test.js +0 -1362
- package/dist/src/agents/executor.test.js.map +0 -1
- package/dist/src/agents/invocation.d.ts +0 -46
- package/dist/src/agents/invocation.js +0 -102
- package/dist/src/agents/invocation.js.map +0 -1
- package/dist/src/agents/invocation.test.js +0 -215
- package/dist/src/agents/invocation.test.js.map +0 -1
- package/dist/src/core/subagent.d.ts +0 -236
- package/dist/src/core/subagent.js +0 -482
- package/dist/src/core/subagent.js.map +0 -1
- package/dist/src/core/subagent.test.js +0 -530
- package/dist/src/core/subagent.test.js.map +0 -1
- package/dist/src/tools/smart-edit.d.ts +0 -78
- package/dist/src/tools/smart-edit.js +0 -717
- package/dist/src/tools/smart-edit.js.map +0 -1
- package/dist/src/tools/smart-edit.test.js +0 -592
- package/dist/src/tools/smart-edit.test.js.map +0 -1
- /package/dist/src/{agents/executor.test.d.ts → policy/workspace-policy.test.d.ts} +0 -0
- /package/dist/src/{agents/invocation.test.d.ts → safety/conseca/conseca.test.d.ts} +0 -0
- /package/dist/src/{core/subagent.test.d.ts → safety/conseca/integration.test.d.ts} +0 -0
- /package/dist/src/{tools/smart-edit.test.d.ts → safety/conseca/policy-enforcer.test.d.ts} +0 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { BrowserAgentInvocation } from './browserAgentInvocation.js';
|
|
8
|
+
import { makeFakeConfig } from '../../test-utils/config.js';
|
|
9
|
+
import {} from '../types.js';
|
|
10
|
+
// Mock dependencies before imports
|
|
11
|
+
vi.mock('../../utils/debugLogger.js', () => ({
|
|
12
|
+
debugLogger: {
|
|
13
|
+
log: vi.fn(),
|
|
14
|
+
error: vi.fn(),
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
vi.mock('./browserAgentFactory.js', () => ({
|
|
18
|
+
createBrowserAgentDefinition: vi.fn(),
|
|
19
|
+
cleanupBrowserAgent: vi.fn(),
|
|
20
|
+
}));
|
|
21
|
+
vi.mock('../local-executor.js', () => ({
|
|
22
|
+
LocalAgentExecutor: {
|
|
23
|
+
create: vi.fn(),
|
|
24
|
+
},
|
|
25
|
+
}));
|
|
26
|
+
import { createBrowserAgentDefinition, cleanupBrowserAgent, } from './browserAgentFactory.js';
|
|
27
|
+
import { LocalAgentExecutor } from '../local-executor.js';
|
|
28
|
+
describe('BrowserAgentInvocation', () => {
|
|
29
|
+
let mockConfig;
|
|
30
|
+
let mockMessageBus;
|
|
31
|
+
let mockParams;
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
vi.clearAllMocks();
|
|
34
|
+
mockConfig = makeFakeConfig({
|
|
35
|
+
agents: {
|
|
36
|
+
overrides: {
|
|
37
|
+
browser_agent: {
|
|
38
|
+
enabled: true,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
browser: {
|
|
42
|
+
headless: false,
|
|
43
|
+
sessionMode: 'isolated',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
mockMessageBus = {
|
|
48
|
+
publish: vi.fn().mockResolvedValue(undefined),
|
|
49
|
+
subscribe: vi.fn(),
|
|
50
|
+
unsubscribe: vi.fn(),
|
|
51
|
+
};
|
|
52
|
+
mockParams = {
|
|
53
|
+
task: 'Navigate to example.com and click the button',
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
afterEach(() => {
|
|
57
|
+
vi.restoreAllMocks();
|
|
58
|
+
});
|
|
59
|
+
describe('constructor', () => {
|
|
60
|
+
it('should create invocation with params', () => {
|
|
61
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
62
|
+
expect(invocation.params).toEqual(mockParams);
|
|
63
|
+
});
|
|
64
|
+
it('should use browser_agent as default tool name', () => {
|
|
65
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
66
|
+
expect(invocation['_toolName']).toBe('browser_agent');
|
|
67
|
+
});
|
|
68
|
+
it('should use custom tool name if provided', () => {
|
|
69
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus, 'custom_name', 'Custom Display Name');
|
|
70
|
+
expect(invocation['_toolName']).toBe('custom_name');
|
|
71
|
+
expect(invocation['_toolDisplayName']).toBe('Custom Display Name');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('getDescription', () => {
|
|
75
|
+
it('should return description with input summary', () => {
|
|
76
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
77
|
+
const description = invocation.getDescription();
|
|
78
|
+
expect(description).toContain('browser agent');
|
|
79
|
+
expect(description).toContain('task');
|
|
80
|
+
});
|
|
81
|
+
it('should truncate long input values', () => {
|
|
82
|
+
const longParams = {
|
|
83
|
+
task: 'A'.repeat(100),
|
|
84
|
+
};
|
|
85
|
+
const invocation = new BrowserAgentInvocation(mockConfig, longParams, mockMessageBus);
|
|
86
|
+
const description = invocation.getDescription();
|
|
87
|
+
// Should be truncated to max length
|
|
88
|
+
expect(description.length).toBeLessThanOrEqual(200);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('toolLocations', () => {
|
|
92
|
+
it('should return empty array by default', () => {
|
|
93
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
94
|
+
const locations = invocation.toolLocations();
|
|
95
|
+
expect(locations).toEqual([]);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('execute', () => {
|
|
99
|
+
let mockExecutor;
|
|
100
|
+
beforeEach(() => {
|
|
101
|
+
vi.mocked(createBrowserAgentDefinition).mockResolvedValue({
|
|
102
|
+
definition: {
|
|
103
|
+
name: 'browser_agent',
|
|
104
|
+
description: 'mock definition',
|
|
105
|
+
kind: 'local',
|
|
106
|
+
inputConfig: {},
|
|
107
|
+
outputConfig: {},
|
|
108
|
+
processOutput: () => '',
|
|
109
|
+
modelConfig: { model: 'test' },
|
|
110
|
+
runConfig: {},
|
|
111
|
+
promptConfig: { query: '', systemPrompt: '' },
|
|
112
|
+
toolConfig: { tools: ['analyze_screenshot', 'click'] },
|
|
113
|
+
},
|
|
114
|
+
browserManager: {},
|
|
115
|
+
});
|
|
116
|
+
mockExecutor = {
|
|
117
|
+
run: vi.fn().mockResolvedValue({
|
|
118
|
+
result: JSON.stringify({ success: true }),
|
|
119
|
+
terminate_reason: 'GOAL',
|
|
120
|
+
}),
|
|
121
|
+
};
|
|
122
|
+
vi.mocked(LocalAgentExecutor.create).mockResolvedValue(mockExecutor);
|
|
123
|
+
vi.mocked(cleanupBrowserAgent).mockClear();
|
|
124
|
+
});
|
|
125
|
+
it('should return result text and call cleanup on success', async () => {
|
|
126
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
127
|
+
const controller = new AbortController();
|
|
128
|
+
const updateOutput = vi.fn();
|
|
129
|
+
const result = await invocation.execute(controller.signal, updateOutput);
|
|
130
|
+
expect(Array.isArray(result.llmContent)).toBe(true);
|
|
131
|
+
expect(result.llmContent[0].text).toContain('Browser agent finished');
|
|
132
|
+
expect(cleanupBrowserAgent).toHaveBeenCalled();
|
|
133
|
+
});
|
|
134
|
+
it('should work without updateOutput (fire-and-forget)', async () => {
|
|
135
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
136
|
+
const controller = new AbortController();
|
|
137
|
+
// Should not throw even with no updateOutput
|
|
138
|
+
await expect(invocation.execute(controller.signal)).resolves.toBeDefined();
|
|
139
|
+
});
|
|
140
|
+
it('should return error result when executor throws', async () => {
|
|
141
|
+
mockExecutor.run.mockRejectedValue(new Error('Unexpected crash'));
|
|
142
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
143
|
+
const controller = new AbortController();
|
|
144
|
+
const result = await invocation.execute(controller.signal);
|
|
145
|
+
expect(result.error).toBeDefined();
|
|
146
|
+
expect(cleanupBrowserAgent).toHaveBeenCalled();
|
|
147
|
+
});
|
|
148
|
+
// ─── Structured SubagentProgress emission tests ───────────────────────
|
|
149
|
+
/**
|
|
150
|
+
* Helper: sets up LocalAgentExecutor.create to capture the onActivity
|
|
151
|
+
* callback so tests can fire synthetic activity events.
|
|
152
|
+
*/
|
|
153
|
+
function setupActivityCapture() {
|
|
154
|
+
let onActivityFn;
|
|
155
|
+
vi.mocked(LocalAgentExecutor.create).mockImplementation(async (_def, _config, onActivity) => {
|
|
156
|
+
onActivityFn = onActivity;
|
|
157
|
+
return mockExecutor;
|
|
158
|
+
});
|
|
159
|
+
return {
|
|
160
|
+
capturedOnActivity: () => undefined,
|
|
161
|
+
fireActivity: (event) => {
|
|
162
|
+
onActivityFn?.(event);
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
it('should emit initial SubagentProgress with running state', async () => {
|
|
167
|
+
const updateOutput = vi.fn();
|
|
168
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
169
|
+
await invocation.execute(new AbortController().signal, updateOutput);
|
|
170
|
+
const firstCall = updateOutput.mock.calls[0]?.[0];
|
|
171
|
+
expect(firstCall.isSubagentProgress).toBe(true);
|
|
172
|
+
expect(firstCall.state).toBe('running');
|
|
173
|
+
expect(firstCall.recentActivity).toEqual([]);
|
|
174
|
+
});
|
|
175
|
+
it('should emit completed SubagentProgress on success', async () => {
|
|
176
|
+
const updateOutput = vi.fn();
|
|
177
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
178
|
+
await invocation.execute(new AbortController().signal, updateOutput);
|
|
179
|
+
const lastCall = updateOutput.mock.calls[updateOutput.mock.calls.length - 1]?.[0];
|
|
180
|
+
expect(lastCall.isSubagentProgress).toBe(true);
|
|
181
|
+
expect(lastCall.state).toBe('completed');
|
|
182
|
+
});
|
|
183
|
+
it('should handle THOUGHT_CHUNK and emit structured progress', async () => {
|
|
184
|
+
const { fireActivity } = setupActivityCapture();
|
|
185
|
+
const updateOutput = vi.fn();
|
|
186
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
187
|
+
const executePromise = invocation.execute(new AbortController().signal, updateOutput);
|
|
188
|
+
// Allow createBrowserAgentDefinition to resolve and onActivity to be registered
|
|
189
|
+
await Promise.resolve();
|
|
190
|
+
await Promise.resolve();
|
|
191
|
+
fireActivity({
|
|
192
|
+
isSubagentActivityEvent: true,
|
|
193
|
+
agentName: 'browser_agent',
|
|
194
|
+
type: 'THOUGHT_CHUNK',
|
|
195
|
+
data: { text: 'Navigating to the page...' },
|
|
196
|
+
});
|
|
197
|
+
await executePromise;
|
|
198
|
+
const progressCalls = updateOutput.mock.calls
|
|
199
|
+
.map((c) => c[0])
|
|
200
|
+
.filter((p) => p.isSubagentProgress);
|
|
201
|
+
const thoughtProgress = progressCalls.find((p) => p.recentActivity.some((a) => a.type === 'thought' &&
|
|
202
|
+
a.content.includes('Navigating to the page...')));
|
|
203
|
+
expect(thoughtProgress).toBeDefined();
|
|
204
|
+
});
|
|
205
|
+
it('should handle TOOL_CALL_START and TOOL_CALL_END with callId tracking', async () => {
|
|
206
|
+
const { fireActivity } = setupActivityCapture();
|
|
207
|
+
const updateOutput = vi.fn();
|
|
208
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
209
|
+
const executePromise = invocation.execute(new AbortController().signal, updateOutput);
|
|
210
|
+
await Promise.resolve();
|
|
211
|
+
await Promise.resolve();
|
|
212
|
+
fireActivity({
|
|
213
|
+
isSubagentActivityEvent: true,
|
|
214
|
+
agentName: 'browser_agent',
|
|
215
|
+
type: 'TOOL_CALL_START',
|
|
216
|
+
data: {
|
|
217
|
+
name: 'navigate_browser',
|
|
218
|
+
callId: 'call-1',
|
|
219
|
+
args: { url: 'https://example.com' },
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
fireActivity({
|
|
223
|
+
isSubagentActivityEvent: true,
|
|
224
|
+
agentName: 'browser_agent',
|
|
225
|
+
type: 'TOOL_CALL_END',
|
|
226
|
+
data: { name: 'navigate_browser', id: 'call-1' },
|
|
227
|
+
});
|
|
228
|
+
await executePromise;
|
|
229
|
+
const progressCalls = updateOutput.mock.calls
|
|
230
|
+
.map((c) => c[0])
|
|
231
|
+
.filter((p) => p.isSubagentProgress);
|
|
232
|
+
// After TOOL_CALL_END, the tool should be completed
|
|
233
|
+
const finalProgress = progressCalls[progressCalls.length - 1];
|
|
234
|
+
const toolItem = finalProgress?.recentActivity.find((a) => a.type === 'tool_call' && a.content === 'navigate_browser');
|
|
235
|
+
expect(toolItem).toBeDefined();
|
|
236
|
+
expect(toolItem?.status).toBe('completed');
|
|
237
|
+
});
|
|
238
|
+
it('should sanitize sensitive data in tool call args', async () => {
|
|
239
|
+
const { fireActivity } = setupActivityCapture();
|
|
240
|
+
const updateOutput = vi.fn();
|
|
241
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
242
|
+
const executePromise = invocation.execute(new AbortController().signal, updateOutput);
|
|
243
|
+
await Promise.resolve();
|
|
244
|
+
await Promise.resolve();
|
|
245
|
+
fireActivity({
|
|
246
|
+
isSubagentActivityEvent: true,
|
|
247
|
+
agentName: 'browser_agent',
|
|
248
|
+
type: 'TOOL_CALL_START',
|
|
249
|
+
data: {
|
|
250
|
+
name: 'fill_form',
|
|
251
|
+
callId: 'call-2',
|
|
252
|
+
args: { password: 'supersecret123', url: 'https://example.com' },
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
await executePromise;
|
|
256
|
+
const progressCalls = updateOutput.mock.calls
|
|
257
|
+
.map((c) => c[0])
|
|
258
|
+
.filter((p) => p.isSubagentProgress);
|
|
259
|
+
const toolItem = progressCalls
|
|
260
|
+
.flatMap((p) => p.recentActivity)
|
|
261
|
+
.find((a) => a.type === 'tool_call' && a.content === 'fill_form');
|
|
262
|
+
expect(toolItem).toBeDefined();
|
|
263
|
+
expect(toolItem?.args).not.toContain('supersecret123');
|
|
264
|
+
expect(toolItem?.args).toContain('[REDACTED]');
|
|
265
|
+
});
|
|
266
|
+
it('should handle ERROR event with callId and mark tool as errored', async () => {
|
|
267
|
+
const { fireActivity } = setupActivityCapture();
|
|
268
|
+
const updateOutput = vi.fn();
|
|
269
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
270
|
+
const executePromise = invocation.execute(new AbortController().signal, updateOutput);
|
|
271
|
+
await Promise.resolve();
|
|
272
|
+
await Promise.resolve();
|
|
273
|
+
fireActivity({
|
|
274
|
+
isSubagentActivityEvent: true,
|
|
275
|
+
agentName: 'browser_agent',
|
|
276
|
+
type: 'TOOL_CALL_START',
|
|
277
|
+
data: { name: 'click_element', callId: 'call-3', args: {} },
|
|
278
|
+
});
|
|
279
|
+
fireActivity({
|
|
280
|
+
isSubagentActivityEvent: true,
|
|
281
|
+
agentName: 'browser_agent',
|
|
282
|
+
type: 'ERROR',
|
|
283
|
+
data: { error: 'Element not found', callId: 'call-3' },
|
|
284
|
+
});
|
|
285
|
+
await executePromise;
|
|
286
|
+
const progressCalls = updateOutput.mock.calls
|
|
287
|
+
.map((c) => c[0])
|
|
288
|
+
.filter((p) => p.isSubagentProgress);
|
|
289
|
+
const allItems = progressCalls.flatMap((p) => p.recentActivity);
|
|
290
|
+
const toolItem = allItems.find((a) => a.type === 'tool_call' && a.content === 'click_element');
|
|
291
|
+
expect(toolItem?.status).toBe('error');
|
|
292
|
+
});
|
|
293
|
+
it('should sanitize sensitive data in ERROR event messages', async () => {
|
|
294
|
+
const { fireActivity } = setupActivityCapture();
|
|
295
|
+
const updateOutput = vi.fn();
|
|
296
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
297
|
+
const executePromise = invocation.execute(new AbortController().signal, updateOutput);
|
|
298
|
+
await Promise.resolve();
|
|
299
|
+
await Promise.resolve();
|
|
300
|
+
fireActivity({
|
|
301
|
+
isSubagentActivityEvent: true,
|
|
302
|
+
agentName: 'browser_agent',
|
|
303
|
+
type: 'ERROR',
|
|
304
|
+
data: { error: 'Auth failed: api_key=sk-secret-abc1234567890' },
|
|
305
|
+
});
|
|
306
|
+
await executePromise;
|
|
307
|
+
const progressCalls = updateOutput.mock.calls
|
|
308
|
+
.map((c) => c[0])
|
|
309
|
+
.filter((p) => p.isSubagentProgress);
|
|
310
|
+
const errorItem = progressCalls
|
|
311
|
+
.flatMap((p) => p.recentActivity)
|
|
312
|
+
.find((a) => a.type === 'thought' && a.status === 'error');
|
|
313
|
+
expect(errorItem).toBeDefined();
|
|
314
|
+
expect(errorItem?.content).not.toContain('sk-secret-abc1234567890');
|
|
315
|
+
expect(errorItem?.content).toContain('[REDACTED]');
|
|
316
|
+
});
|
|
317
|
+
it('should sanitize inline PEM content in error messages', async () => {
|
|
318
|
+
const { fireActivity } = setupActivityCapture();
|
|
319
|
+
const updateOutput = vi.fn();
|
|
320
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
321
|
+
const executePromise = invocation.execute(new AbortController().signal, updateOutput);
|
|
322
|
+
await Promise.resolve();
|
|
323
|
+
await Promise.resolve();
|
|
324
|
+
fireActivity({
|
|
325
|
+
isSubagentActivityEvent: true,
|
|
326
|
+
agentName: 'browser_agent',
|
|
327
|
+
type: 'ERROR',
|
|
328
|
+
data: {
|
|
329
|
+
error: 'Failed to authenticate:\n-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA12345...\n-----END RSA PRIVATE KEY-----\nPlease check credentials.',
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
await executePromise;
|
|
333
|
+
const progressCalls = updateOutput.mock.calls
|
|
334
|
+
.map((c) => c[0])
|
|
335
|
+
.filter((p) => p.isSubagentProgress);
|
|
336
|
+
const errorItem = progressCalls
|
|
337
|
+
.flatMap((p) => p.recentActivity)
|
|
338
|
+
.find((a) => a.type === 'thought' && a.status === 'error');
|
|
339
|
+
expect(errorItem).toBeDefined();
|
|
340
|
+
expect(errorItem?.content).toContain('[REDACTED_PEM]');
|
|
341
|
+
expect(errorItem?.content).not.toContain('-----BEGIN');
|
|
342
|
+
});
|
|
343
|
+
it('should mark all running tools as errored when ERROR has no callId', async () => {
|
|
344
|
+
const { fireActivity } = setupActivityCapture();
|
|
345
|
+
const updateOutput = vi.fn();
|
|
346
|
+
const invocation = new BrowserAgentInvocation(mockConfig, mockParams, mockMessageBus);
|
|
347
|
+
const executePromise = invocation.execute(new AbortController().signal, updateOutput);
|
|
348
|
+
await Promise.resolve();
|
|
349
|
+
await Promise.resolve();
|
|
350
|
+
fireActivity({
|
|
351
|
+
isSubagentActivityEvent: true,
|
|
352
|
+
agentName: 'browser_agent',
|
|
353
|
+
type: 'TOOL_CALL_START',
|
|
354
|
+
data: { name: 'tool_a', callId: 'c1', args: {} },
|
|
355
|
+
});
|
|
356
|
+
fireActivity({
|
|
357
|
+
isSubagentActivityEvent: true,
|
|
358
|
+
agentName: 'browser_agent',
|
|
359
|
+
type: 'TOOL_CALL_START',
|
|
360
|
+
data: { name: 'tool_b', callId: 'c2', args: {} },
|
|
361
|
+
});
|
|
362
|
+
// ERROR with no callId should mark ALL running tools as error
|
|
363
|
+
fireActivity({
|
|
364
|
+
isSubagentActivityEvent: true,
|
|
365
|
+
agentName: 'browser_agent',
|
|
366
|
+
type: 'ERROR',
|
|
367
|
+
data: { error: 'Agent crashed' },
|
|
368
|
+
});
|
|
369
|
+
await executePromise;
|
|
370
|
+
const progressCalls = updateOutput.mock.calls
|
|
371
|
+
.map((c) => c[0])
|
|
372
|
+
.filter((p) => p.isSubagentProgress);
|
|
373
|
+
const allItems = progressCalls.flatMap((p) => p.recentActivity);
|
|
374
|
+
const toolA = allItems.find((a) => a.type === 'tool_call' && a.content === 'tool_a');
|
|
375
|
+
const toolB = allItems.find((a) => a.type === 'tool_call' && a.content === 'tool_b');
|
|
376
|
+
// Both should be error since no callId was specified
|
|
377
|
+
expect(toolA?.status).toBe('error');
|
|
378
|
+
expect(toolB?.status).toBe('error');
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
//# sourceMappingURL=browserAgentInvocation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserAgentInvocation.test.js","sourceRoot":"","sources":["../../../../src/agents/browser/browserAgentInvocation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @fileoverview Manages browser lifecycle for the Browser Agent.
|
|
8
|
+
*
|
|
9
|
+
* Handles:
|
|
10
|
+
* - Browser management via chrome-devtools-mcp with --isolated mode
|
|
11
|
+
* - CDP connection via raw MCP SDK Client (NOT registered in main registry)
|
|
12
|
+
* - Visual tools via --experimental-vision flag
|
|
13
|
+
*
|
|
14
|
+
* IMPORTANT: The MCP client here is ISOLATED from the main agent's tool registry.
|
|
15
|
+
* Tools discovered from chrome-devtools-mcp are NOT registered in the main registry.
|
|
16
|
+
* They are wrapped as DeclarativeTools and passed directly to the browser agent.
|
|
17
|
+
*/
|
|
18
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
19
|
+
import type { Tool as McpTool } from '@modelcontextprotocol/sdk/types.js';
|
|
20
|
+
import type { Config } from '../../config/config.js';
|
|
21
|
+
/**
|
|
22
|
+
* Content item from an MCP tool call response.
|
|
23
|
+
* Can be text or image (for take_screenshot).
|
|
24
|
+
*/
|
|
25
|
+
export interface McpContentItem {
|
|
26
|
+
type: 'text' | 'image';
|
|
27
|
+
text?: string;
|
|
28
|
+
/** Base64-encoded image data (for type='image') */
|
|
29
|
+
data?: string;
|
|
30
|
+
/** MIME type of the image (e.g., 'image/png') */
|
|
31
|
+
mimeType?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Result from an MCP tool call.
|
|
35
|
+
*/
|
|
36
|
+
export interface McpToolCallResult {
|
|
37
|
+
content?: McpContentItem[];
|
|
38
|
+
isError?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Manages browser lifecycle and ISOLATED MCP client for the Browser Agent.
|
|
42
|
+
*
|
|
43
|
+
* The browser is launched and managed by chrome-devtools-mcp in --isolated mode.
|
|
44
|
+
* Visual tools (click_at, etc.) are enabled via --experimental-vision flag.
|
|
45
|
+
*
|
|
46
|
+
* Key isolation property: The MCP client here does NOT register tools
|
|
47
|
+
* in the main ToolRegistry. Tools are kept local to the browser agent.
|
|
48
|
+
*/
|
|
49
|
+
export declare class BrowserManager {
|
|
50
|
+
private config;
|
|
51
|
+
private rawMcpClient;
|
|
52
|
+
private mcpTransport;
|
|
53
|
+
private discoveredTools;
|
|
54
|
+
/**
|
|
55
|
+
* Whether to inject the automation overlay.
|
|
56
|
+
* Always false in headless mode (no visible window to decorate).
|
|
57
|
+
*/
|
|
58
|
+
private readonly shouldInjectOverlay;
|
|
59
|
+
constructor(config: Config);
|
|
60
|
+
/**
|
|
61
|
+
* Gets the raw MCP SDK Client for direct tool calls.
|
|
62
|
+
* This client is ISOLATED from the main tool registry.
|
|
63
|
+
*/
|
|
64
|
+
getRawMcpClient(): Promise<Client>;
|
|
65
|
+
/**
|
|
66
|
+
* Gets the tool definitions discovered from the MCP server.
|
|
67
|
+
* These are dynamically fetched from chrome-devtools-mcp.
|
|
68
|
+
*/
|
|
69
|
+
getDiscoveredTools(): Promise<McpTool[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Calls a tool on the MCP server.
|
|
72
|
+
*
|
|
73
|
+
* @param toolName The name of the tool to call
|
|
74
|
+
* @param args Arguments to pass to the tool
|
|
75
|
+
* @param signal Optional AbortSignal to cancel the call
|
|
76
|
+
* @returns The result from the MCP server
|
|
77
|
+
*/
|
|
78
|
+
callTool(toolName: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<McpToolCallResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Safely maps a raw MCP SDK callTool response to our typed McpToolCallResult
|
|
81
|
+
* without using unsafe type assertions.
|
|
82
|
+
*/
|
|
83
|
+
private toResult;
|
|
84
|
+
/**
|
|
85
|
+
* Ensures browser and MCP client are connected.
|
|
86
|
+
*/
|
|
87
|
+
ensureConnection(): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Closes browser and cleans up connections.
|
|
90
|
+
* The browser process is managed by chrome-devtools-mcp, so closing
|
|
91
|
+
* the transport will terminate the browser.
|
|
92
|
+
*/
|
|
93
|
+
close(): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Connects to chrome-devtools-mcp which manages the browser process.
|
|
96
|
+
*
|
|
97
|
+
* Spawns npx chrome-devtools-mcp with:
|
|
98
|
+
* - --isolated: Manages its own browser instance
|
|
99
|
+
* - --experimental-vision: Enables visual tools (click_at, etc.)
|
|
100
|
+
*
|
|
101
|
+
* IMPORTANT: This does NOT use McpClientManager and does NOT register
|
|
102
|
+
* tools in the main ToolRegistry. The connection is isolated to this
|
|
103
|
+
* BrowserManager instance.
|
|
104
|
+
*/
|
|
105
|
+
private connectMcp;
|
|
106
|
+
/**
|
|
107
|
+
* Creates an Error with context-specific remediation based on the actual
|
|
108
|
+
* error message and the current sessionMode.
|
|
109
|
+
*/
|
|
110
|
+
private createConnectionError;
|
|
111
|
+
/**
|
|
112
|
+
* Discovers tools from the connected MCP server.
|
|
113
|
+
*/
|
|
114
|
+
private discoverTools;
|
|
115
|
+
}
|