@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,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @fileoverview Tool for visual identification via a single model call.
|
|
8
|
+
*
|
|
9
|
+
* The semantic browser agent uses this tool when it needs to identify
|
|
10
|
+
* elements by visual attributes not present in the accessibility tree
|
|
11
|
+
* (e.g., color, layout, precise coordinates).
|
|
12
|
+
*
|
|
13
|
+
* Unlike the semantic agent which works with the accessibility tree,
|
|
14
|
+
* this tool sends a screenshot to a computer-use model for visual analysis.
|
|
15
|
+
* It returns the model's analysis (coordinates, element descriptions) back
|
|
16
|
+
* to the browser agent, which retains full control of subsequent actions.
|
|
17
|
+
*/
|
|
18
|
+
import { DeclarativeTool, BaseToolInvocation, Kind, } from '../../tools/tools.js';
|
|
19
|
+
import { getVisualAgentModel } from './modelAvailability.js';
|
|
20
|
+
import { debugLogger } from '../../utils/debugLogger.js';
|
|
21
|
+
import { LlmRole } from '../../telemetry/llmRole.js';
|
|
22
|
+
/**
|
|
23
|
+
* System prompt for the visual analysis model call.
|
|
24
|
+
*/
|
|
25
|
+
const VISUAL_SYSTEM_PROMPT = `You are a Visual Analysis Agent. You receive a screenshot of a browser page and an instruction.
|
|
26
|
+
|
|
27
|
+
Your job is to ANALYZE the screenshot and provide precise information that a browser automation agent can act on.
|
|
28
|
+
|
|
29
|
+
COORDINATE SYSTEM:
|
|
30
|
+
- Coordinates are pixel-based relative to the viewport
|
|
31
|
+
- (0,0) is top-left of the visible area
|
|
32
|
+
- Estimate element positions from the screenshot
|
|
33
|
+
|
|
34
|
+
RESPONSE FORMAT:
|
|
35
|
+
- For coordinate identification: provide exact (x, y) pixel coordinates
|
|
36
|
+
- For element identification: describe the element's visual location and appearance
|
|
37
|
+
- For layout analysis: describe the spatial relationships between elements
|
|
38
|
+
- Be concise and actionable — the browser agent will use your response to decide what action to take
|
|
39
|
+
|
|
40
|
+
IMPORTANT:
|
|
41
|
+
- You are NOT performing actions — you are only providing visual analysis
|
|
42
|
+
- Include coordinates when possible so the caller can use click_at(x, y)
|
|
43
|
+
- If the element is not visible in the screenshot, say so explicitly`;
|
|
44
|
+
/**
|
|
45
|
+
* Invocation for the analyze_screenshot tool.
|
|
46
|
+
* Makes a single generateContent call with a screenshot.
|
|
47
|
+
*/
|
|
48
|
+
class AnalyzeScreenshotInvocation extends BaseToolInvocation {
|
|
49
|
+
browserManager;
|
|
50
|
+
config;
|
|
51
|
+
constructor(browserManager, config, params, messageBus) {
|
|
52
|
+
super(params, messageBus, 'analyze_screenshot', 'Analyze Screenshot');
|
|
53
|
+
this.browserManager = browserManager;
|
|
54
|
+
this.config = config;
|
|
55
|
+
}
|
|
56
|
+
getDescription() {
|
|
57
|
+
const instruction = String(this.params['instruction'] ?? '');
|
|
58
|
+
return `Visual analysis: "${instruction}"`;
|
|
59
|
+
}
|
|
60
|
+
async execute(signal) {
|
|
61
|
+
try {
|
|
62
|
+
const instruction = String(this.params['instruction'] ?? '');
|
|
63
|
+
debugLogger.log(`Visual analysis requested: ${instruction}`);
|
|
64
|
+
// Capture screenshot via MCP tool
|
|
65
|
+
const screenshotResult = await this.browserManager.callTool('take_screenshot', {});
|
|
66
|
+
// Extract base64 image data from MCP response.
|
|
67
|
+
// Search ALL content items for image type — MCP returns [text, image]
|
|
68
|
+
// where content[0] is a text description and content[1] is the actual PNG.
|
|
69
|
+
let screenshotBase64 = '';
|
|
70
|
+
let mimeType = 'image/png';
|
|
71
|
+
if (screenshotResult.content && Array.isArray(screenshotResult.content)) {
|
|
72
|
+
for (const item of screenshotResult.content) {
|
|
73
|
+
if (item.type === 'image' && item.data) {
|
|
74
|
+
screenshotBase64 = item.data;
|
|
75
|
+
mimeType = item.mimeType ?? 'image/png';
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (!screenshotBase64) {
|
|
81
|
+
return {
|
|
82
|
+
llmContent: 'Failed to capture screenshot for visual analysis. Use accessibility tree elements instead.',
|
|
83
|
+
returnDisplay: 'Screenshot capture failed',
|
|
84
|
+
error: { message: 'Screenshot capture failed' },
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Make a single generateContent call with the visual model
|
|
88
|
+
const visualModel = getVisualAgentModel(this.config);
|
|
89
|
+
const contentGenerator = this.config.getContentGenerator();
|
|
90
|
+
const response = await contentGenerator.generateContent({
|
|
91
|
+
model: visualModel,
|
|
92
|
+
config: {
|
|
93
|
+
temperature: 0,
|
|
94
|
+
topP: 0.95,
|
|
95
|
+
systemInstruction: VISUAL_SYSTEM_PROMPT,
|
|
96
|
+
abortSignal: signal,
|
|
97
|
+
},
|
|
98
|
+
contents: [
|
|
99
|
+
{
|
|
100
|
+
role: 'user',
|
|
101
|
+
parts: [
|
|
102
|
+
{
|
|
103
|
+
text: `Analyze this screenshot and respond to the following instruction:\n\n${instruction}`,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
inlineData: {
|
|
107
|
+
mimeType,
|
|
108
|
+
data: screenshotBase64,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
}, 'visual-analysis', LlmRole.UTILITY_TOOL);
|
|
115
|
+
// Extract text from response
|
|
116
|
+
const responseText = response.candidates?.[0]?.content?.parts
|
|
117
|
+
?.filter((p) => p.text)
|
|
118
|
+
.map((p) => p.text)
|
|
119
|
+
.join('\n') ?? '';
|
|
120
|
+
if (!responseText) {
|
|
121
|
+
return {
|
|
122
|
+
llmContent: 'Visual model returned no analysis. Use accessibility tree elements instead.',
|
|
123
|
+
returnDisplay: 'Visual analysis returned empty response',
|
|
124
|
+
error: { message: 'Empty visual analysis response' },
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
debugLogger.log(`Visual analysis complete: ${responseText}`);
|
|
128
|
+
return {
|
|
129
|
+
llmContent: `Visual Analysis Result:\n${responseText}`,
|
|
130
|
+
returnDisplay: `Visual Analysis Result:\n${responseText}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
135
|
+
debugLogger.error(`Visual analysis failed: ${errorMsg}`);
|
|
136
|
+
// Provide a graceful fallback message for model unavailability
|
|
137
|
+
const isModelError = errorMsg.includes('404') ||
|
|
138
|
+
errorMsg.includes('403') ||
|
|
139
|
+
errorMsg.includes('not found') ||
|
|
140
|
+
errorMsg.includes('permission');
|
|
141
|
+
const fallbackMsg = isModelError
|
|
142
|
+
? 'Visual analysis model is not available. Use accessibility tree elements (uids from take_snapshot) for all interactions instead.'
|
|
143
|
+
: `Visual analysis failed: ${errorMsg}. Use accessibility tree elements instead.`;
|
|
144
|
+
return {
|
|
145
|
+
llmContent: fallbackMsg,
|
|
146
|
+
returnDisplay: fallbackMsg,
|
|
147
|
+
error: { message: errorMsg },
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* DeclarativeTool for screenshot-based visual analysis.
|
|
154
|
+
*/
|
|
155
|
+
class AnalyzeScreenshotTool extends DeclarativeTool {
|
|
156
|
+
browserManager;
|
|
157
|
+
config;
|
|
158
|
+
constructor(browserManager, config, messageBus) {
|
|
159
|
+
super('analyze_screenshot', 'analyze_screenshot', 'Analyze the current page visually using a screenshot. Use when you need to identify elements by visual attributes (color, layout, position) not available in the accessibility tree, or when you need precise pixel coordinates for click_at. Returns visual analysis — you perform the actions yourself.', Kind.Other, {
|
|
160
|
+
type: 'object',
|
|
161
|
+
properties: {
|
|
162
|
+
instruction: {
|
|
163
|
+
type: 'string',
|
|
164
|
+
description: 'What to identify or analyze visually (e.g., "Find the coordinates of the blue submit button", "What is the layout of the navigation menu?").',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
required: ['instruction'],
|
|
168
|
+
}, messageBus, true, // isOutputMarkdown
|
|
169
|
+
false);
|
|
170
|
+
this.browserManager = browserManager;
|
|
171
|
+
this.config = config;
|
|
172
|
+
}
|
|
173
|
+
build(params) {
|
|
174
|
+
return new AnalyzeScreenshotInvocation(this.browserManager, this.config, params, this.messageBus);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Creates the analyze_screenshot tool for the browser agent.
|
|
179
|
+
*/
|
|
180
|
+
export function createAnalyzeScreenshotTool(browserManager, config, messageBus) {
|
|
181
|
+
return new AnalyzeScreenshotTool(browserManager, config, messageBus);
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=analyzeScreenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeScreenshot.js","sourceRoot":"","sources":["../../../../src/agents/browser/analyzeScreenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { createAnalyzeScreenshotTool } from './analyzeScreenshot.js';
|
|
8
|
+
const mockMessageBus = {
|
|
9
|
+
waitForConfirmation: vi.fn().mockResolvedValue({ approved: true }),
|
|
10
|
+
};
|
|
11
|
+
function createMockBrowserManager(callToolResult) {
|
|
12
|
+
return {
|
|
13
|
+
callTool: vi.fn().mockResolvedValue(callToolResult ?? {
|
|
14
|
+
content: [
|
|
15
|
+
{ type: 'text', text: 'Screenshot captured' },
|
|
16
|
+
{
|
|
17
|
+
type: 'image',
|
|
18
|
+
data: 'base64encodeddata',
|
|
19
|
+
mimeType: 'image/png',
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createMockConfig(generateContentResult, generateContentError) {
|
|
26
|
+
const generateContent = generateContentError
|
|
27
|
+
? vi.fn().mockRejectedValue(generateContentError)
|
|
28
|
+
: vi.fn().mockResolvedValue(generateContentResult ?? {
|
|
29
|
+
candidates: [
|
|
30
|
+
{
|
|
31
|
+
content: {
|
|
32
|
+
parts: [
|
|
33
|
+
{
|
|
34
|
+
text: 'The blue submit button is at coordinates (250, 400).',
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
getBrowserAgentConfig: vi.fn().mockReturnValue({
|
|
43
|
+
customConfig: { visualModel: 'test-visual-model' },
|
|
44
|
+
}),
|
|
45
|
+
getContentGenerator: vi.fn().mockReturnValue({
|
|
46
|
+
generateContent,
|
|
47
|
+
}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
describe('analyzeScreenshot', () => {
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
vi.clearAllMocks();
|
|
53
|
+
});
|
|
54
|
+
describe('createAnalyzeScreenshotTool', () => {
|
|
55
|
+
it('creates a tool with the correct name and schema', () => {
|
|
56
|
+
const browserManager = createMockBrowserManager();
|
|
57
|
+
const config = createMockConfig();
|
|
58
|
+
const tool = createAnalyzeScreenshotTool(browserManager, config, mockMessageBus);
|
|
59
|
+
expect(tool.name).toBe('analyze_screenshot');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('AnalyzeScreenshotInvocation', () => {
|
|
63
|
+
it('captures a screenshot and returns visual analysis', async () => {
|
|
64
|
+
const browserManager = createMockBrowserManager();
|
|
65
|
+
const config = createMockConfig();
|
|
66
|
+
const tool = createAnalyzeScreenshotTool(browserManager, config, mockMessageBus);
|
|
67
|
+
const invocation = tool.build({
|
|
68
|
+
instruction: 'Find the blue submit button',
|
|
69
|
+
});
|
|
70
|
+
const result = await invocation.execute(new AbortController().signal);
|
|
71
|
+
// Verify screenshot was captured
|
|
72
|
+
expect(browserManager.callTool).toHaveBeenCalledWith('take_screenshot', {});
|
|
73
|
+
// Verify the visual model was called
|
|
74
|
+
const contentGenerator = config.getContentGenerator();
|
|
75
|
+
expect(contentGenerator.generateContent).toHaveBeenCalledWith(expect.objectContaining({
|
|
76
|
+
model: 'test-visual-model',
|
|
77
|
+
contents: expect.arrayContaining([
|
|
78
|
+
expect.objectContaining({
|
|
79
|
+
role: 'user',
|
|
80
|
+
parts: expect.arrayContaining([
|
|
81
|
+
expect.objectContaining({
|
|
82
|
+
inlineData: {
|
|
83
|
+
mimeType: 'image/png',
|
|
84
|
+
data: 'base64encodeddata',
|
|
85
|
+
},
|
|
86
|
+
}),
|
|
87
|
+
]),
|
|
88
|
+
}),
|
|
89
|
+
]),
|
|
90
|
+
}), 'visual-analysis', 'utility_tool');
|
|
91
|
+
// Verify result
|
|
92
|
+
expect(result.llmContent).toContain('Visual Analysis Result');
|
|
93
|
+
expect(result.llmContent).toContain('The blue submit button is at coordinates (250, 400).');
|
|
94
|
+
expect(result.error).toBeUndefined();
|
|
95
|
+
});
|
|
96
|
+
it('returns an error when screenshot capture fails (no image)', async () => {
|
|
97
|
+
const browserManager = createMockBrowserManager({
|
|
98
|
+
content: [{ type: 'text', text: 'No screenshot available' }],
|
|
99
|
+
});
|
|
100
|
+
const config = createMockConfig();
|
|
101
|
+
const tool = createAnalyzeScreenshotTool(browserManager, config, mockMessageBus);
|
|
102
|
+
const invocation = tool.build({
|
|
103
|
+
instruction: 'Find the button',
|
|
104
|
+
});
|
|
105
|
+
const result = await invocation.execute(new AbortController().signal);
|
|
106
|
+
expect(result.error).toBeDefined();
|
|
107
|
+
expect(result.llmContent).toContain('Failed to capture screenshot');
|
|
108
|
+
// Should NOT call the visual model
|
|
109
|
+
const contentGenerator = config.getContentGenerator();
|
|
110
|
+
expect(contentGenerator.generateContent).not.toHaveBeenCalled();
|
|
111
|
+
});
|
|
112
|
+
it('returns an error when visual model returns empty response', async () => {
|
|
113
|
+
const browserManager = createMockBrowserManager();
|
|
114
|
+
const config = createMockConfig({
|
|
115
|
+
candidates: [{ content: { parts: [] } }],
|
|
116
|
+
});
|
|
117
|
+
const tool = createAnalyzeScreenshotTool(browserManager, config, mockMessageBus);
|
|
118
|
+
const invocation = tool.build({
|
|
119
|
+
instruction: 'Check the layout',
|
|
120
|
+
});
|
|
121
|
+
const result = await invocation.execute(new AbortController().signal);
|
|
122
|
+
expect(result.error).toBeDefined();
|
|
123
|
+
expect(result.llmContent).toContain('Visual model returned no analysis');
|
|
124
|
+
});
|
|
125
|
+
it('returns a model-unavailability fallback for 404 errors', async () => {
|
|
126
|
+
const browserManager = createMockBrowserManager();
|
|
127
|
+
const config = createMockConfig(undefined, new Error('Model not found: 404'));
|
|
128
|
+
const tool = createAnalyzeScreenshotTool(browserManager, config, mockMessageBus);
|
|
129
|
+
const invocation = tool.build({
|
|
130
|
+
instruction: 'Find the red error',
|
|
131
|
+
});
|
|
132
|
+
const result = await invocation.execute(new AbortController().signal);
|
|
133
|
+
expect(result.error).toBeDefined();
|
|
134
|
+
expect(result.llmContent).toContain('Visual analysis model is not available');
|
|
135
|
+
});
|
|
136
|
+
it('returns a model-unavailability fallback for 403 errors', async () => {
|
|
137
|
+
const browserManager = createMockBrowserManager();
|
|
138
|
+
const config = createMockConfig(undefined, new Error('permission denied: 403'));
|
|
139
|
+
const tool = createAnalyzeScreenshotTool(browserManager, config, mockMessageBus);
|
|
140
|
+
const invocation = tool.build({
|
|
141
|
+
instruction: 'Identify the element',
|
|
142
|
+
});
|
|
143
|
+
const result = await invocation.execute(new AbortController().signal);
|
|
144
|
+
expect(result.error).toBeDefined();
|
|
145
|
+
expect(result.llmContent).toContain('Visual analysis model is not available');
|
|
146
|
+
});
|
|
147
|
+
it('returns a generic error for non-model errors', async () => {
|
|
148
|
+
const browserManager = createMockBrowserManager();
|
|
149
|
+
const config = createMockConfig(undefined, new Error('Network timeout'));
|
|
150
|
+
const tool = createAnalyzeScreenshotTool(browserManager, config, mockMessageBus);
|
|
151
|
+
const invocation = tool.build({
|
|
152
|
+
instruction: 'Find something',
|
|
153
|
+
});
|
|
154
|
+
const result = await invocation.execute(new AbortController().signal);
|
|
155
|
+
expect(result.error).toBeDefined();
|
|
156
|
+
expect(result.llmContent).toContain('Visual analysis failed');
|
|
157
|
+
expect(result.llmContent).toContain('Network timeout');
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=analyzeScreenshot.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeScreenshot.test.js","sourceRoot":"","sources":["../../../../src/agents/browser/analyzeScreenshot.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @fileoverview Automation overlay utilities for visual indication during browser automation.
|
|
8
|
+
*
|
|
9
|
+
* Provides functions to inject and remove a pulsating blue border overlay
|
|
10
|
+
* that indicates when the browser is under AI agent control.
|
|
11
|
+
*
|
|
12
|
+
* Uses the Web Animations API instead of injected <style> tags so the
|
|
13
|
+
* animation works on sites with strict Content Security Policies (e.g. google.com).
|
|
14
|
+
*
|
|
15
|
+
* The script strings are passed to chrome-devtools-mcp's evaluate_script tool
|
|
16
|
+
* which expects a plain function expression (NOT an IIFE).
|
|
17
|
+
*/
|
|
18
|
+
import type { BrowserManager } from './browserManager.js';
|
|
19
|
+
/**
|
|
20
|
+
* Injects the automation overlay into the current page.
|
|
21
|
+
*/
|
|
22
|
+
export declare function injectAutomationOverlay(browserManager: BrowserManager, signal?: AbortSignal): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Removes the automation overlay from the current page.
|
|
25
|
+
*/
|
|
26
|
+
export declare function removeAutomationOverlay(browserManager: BrowserManager, signal?: AbortSignal): Promise<void>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { debugLogger } from '../../utils/debugLogger.js';
|
|
7
|
+
const OVERLAY_ELEMENT_ID = '__gemini_automation_overlay';
|
|
8
|
+
/**
|
|
9
|
+
* Builds the JavaScript function string that injects the automation overlay.
|
|
10
|
+
*
|
|
11
|
+
* Returns a plain arrow-function expression (no trailing invocation) because
|
|
12
|
+
* chrome-devtools-mcp's evaluate_script tool invokes it internally.
|
|
13
|
+
*
|
|
14
|
+
* Avoids nested template literals by using string concatenation for cssText.
|
|
15
|
+
*/
|
|
16
|
+
function buildInjectionScript() {
|
|
17
|
+
return `() => {
|
|
18
|
+
const id = '${OVERLAY_ELEMENT_ID}';
|
|
19
|
+
const existing = document.getElementById(id);
|
|
20
|
+
if (existing) existing.remove();
|
|
21
|
+
|
|
22
|
+
const overlay = document.createElement('div');
|
|
23
|
+
overlay.id = id;
|
|
24
|
+
overlay.setAttribute('aria-hidden', 'true');
|
|
25
|
+
overlay.setAttribute('role', 'presentation');
|
|
26
|
+
|
|
27
|
+
Object.assign(overlay.style, {
|
|
28
|
+
position: 'fixed',
|
|
29
|
+
top: '0',
|
|
30
|
+
left: '0',
|
|
31
|
+
right: '0',
|
|
32
|
+
bottom: '0',
|
|
33
|
+
zIndex: '2147483647',
|
|
34
|
+
pointerEvents: 'none',
|
|
35
|
+
border: '6px solid rgba(66, 133, 244, 1.0)',
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
document.documentElement.appendChild(overlay);
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
overlay.animate([
|
|
42
|
+
{ borderColor: 'rgba(66,133,244,0.3)', boxShadow: 'inset 0 0 8px rgba(66,133,244,0.15)' },
|
|
43
|
+
{ borderColor: 'rgba(66,133,244,1.0)', boxShadow: 'inset 0 0 16px rgba(66,133,244,0.5)' },
|
|
44
|
+
{ borderColor: 'rgba(66,133,244,0.3)', boxShadow: 'inset 0 0 8px rgba(66,133,244,0.15)' }
|
|
45
|
+
], { duration: 2000, iterations: Infinity, easing: 'ease-in-out' });
|
|
46
|
+
} catch (e) {
|
|
47
|
+
// Silently ignore animation errors, as they can happen on sites with strict CSP.
|
|
48
|
+
// The border itself is the most important visual indicator.
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return 'overlay-injected';
|
|
52
|
+
}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Builds the JavaScript function string that removes the automation overlay.
|
|
56
|
+
*/
|
|
57
|
+
function buildRemovalScript() {
|
|
58
|
+
return `() => {
|
|
59
|
+
const el = document.getElementById('${OVERLAY_ELEMENT_ID}');
|
|
60
|
+
if (el) el.remove();
|
|
61
|
+
return 'overlay-removed';
|
|
62
|
+
}`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Injects the automation overlay into the current page.
|
|
66
|
+
*/
|
|
67
|
+
export async function injectAutomationOverlay(browserManager, signal) {
|
|
68
|
+
try {
|
|
69
|
+
debugLogger.log('Injecting automation overlay...');
|
|
70
|
+
const result = await browserManager.callTool('evaluate_script', { function: buildInjectionScript() }, signal);
|
|
71
|
+
if (result.isError) {
|
|
72
|
+
debugLogger.warn('Failed to inject automation overlay:', result);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
debugLogger.log('Automation overlay injected successfully');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
debugLogger.warn('Error injecting automation overlay:', error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Removes the automation overlay from the current page.
|
|
84
|
+
*/
|
|
85
|
+
export async function removeAutomationOverlay(browserManager, signal) {
|
|
86
|
+
try {
|
|
87
|
+
debugLogger.log('Removing automation overlay...');
|
|
88
|
+
const result = await browserManager.callTool('evaluate_script', { function: buildRemovalScript() }, signal);
|
|
89
|
+
if (result.isError) {
|
|
90
|
+
debugLogger.warn('Failed to remove automation overlay:', result);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
debugLogger.log('Automation overlay removed successfully');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
debugLogger.warn('Error removing automation overlay:', error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=automationOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automationOverlay.js","sourceRoot":"","sources":["../../../../src/agents/browser/automationOverlay.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;AAEzD;;;;;;;GAOG;AACH,SAAS,oBAAoB;IAC3B,OAAO;kBACS,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkChC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO;0CACiC,kBAAkB;;;IAGxD,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,cAA8B,EAC9B,MAAoB;IAEpB,IAAI,CAAC;QACH,WAAW,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAC1C,iBAAiB,EACjB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,EAAE,EACpC,MAAM,CACP,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,sCAAsC,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,cAA8B,EAC9B,MAAoB;IAEpB,IAAI,CAAC;QACH,WAAW,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAC1C,iBAAiB,EACjB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE,EAClC,MAAM,CACP,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,sCAAsC,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @fileoverview Browser Agent definition following the LocalAgentDefinition pattern.
|
|
8
|
+
*
|
|
9
|
+
* This agent uses LocalAgentExecutor for its reAct loop, like CodebaseInvestigatorAgent.
|
|
10
|
+
* It is available ONLY via delegate_to_agent, NOT as a direct tool.
|
|
11
|
+
*
|
|
12
|
+
* Tools are configured dynamically at invocation time via browserAgentFactory.
|
|
13
|
+
*/
|
|
14
|
+
import type { LocalAgentDefinition } from '../types.js';
|
|
15
|
+
import type { Config } from '../../config/config.js';
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
/** Canonical agent name — used for routing and configuration lookup. */
|
|
18
|
+
export declare const BROWSER_AGENT_NAME = "browser_agent";
|
|
19
|
+
/**
|
|
20
|
+
* Output schema for browser agent results.
|
|
21
|
+
*/
|
|
22
|
+
export declare const BrowserTaskResultSchema: z.ZodObject<{
|
|
23
|
+
success: z.ZodBoolean;
|
|
24
|
+
summary: z.ZodString;
|
|
25
|
+
data: z.ZodOptional<z.ZodUnknown>;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
success: boolean;
|
|
28
|
+
summary: string;
|
|
29
|
+
data?: unknown;
|
|
30
|
+
}, {
|
|
31
|
+
success: boolean;
|
|
32
|
+
summary: string;
|
|
33
|
+
data?: unknown;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* System prompt for the semantic browser agent.
|
|
37
|
+
* Extracted from prototype (computer_use_subagent_cdt branch).
|
|
38
|
+
*
|
|
39
|
+
* @param visionEnabled Whether visual tools (analyze_screenshot, click_at) are available.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildBrowserSystemPrompt(visionEnabled: boolean): string;
|
|
42
|
+
/**
|
|
43
|
+
* Browser Agent Definition Factory.
|
|
44
|
+
*
|
|
45
|
+
* Following the CodebaseInvestigatorAgent pattern:
|
|
46
|
+
* - Returns a factory function that takes Config for dynamic model selection
|
|
47
|
+
* - kind: 'local' for LocalAgentExecutor
|
|
48
|
+
* - toolConfig is set dynamically by browserAgentFactory
|
|
49
|
+
*/
|
|
50
|
+
export declare const BrowserAgentDefinition: (config: Config, visionEnabled?: boolean) => LocalAgentDefinition<typeof BrowserTaskResultSchema>;
|