@browserbasehq/orca 3.2.0-preview.5 → 3.2.1-preview.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/README.md +2 -2
- package/dist/cjs/lib/inference.js +29 -22
- package/dist/cjs/lib/inference.js.map +1 -1
- package/dist/cjs/lib/prompt.js +18 -21
- package/dist/cjs/lib/prompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +1 -0
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +60 -9
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +15 -0
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +103 -49
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.js +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/keys.js +57 -49
- package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js +3 -5
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
- package/dist/cjs/lib/v3/api.d.ts +5 -3
- package/dist/cjs/lib/v3/api.js +3 -6
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/cache/AgentCache.js +5 -3
- package/dist/cjs/lib/v3/cache/AgentCache.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
- package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -6
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/llm/OpenAIClient.js +1 -0
- package/dist/cjs/lib/v3/llm/OpenAIClient.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +67 -17
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -3
- package/dist/cjs/lib/v3/types/public/agent.js +1 -0
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +30 -0
- package/dist/cjs/lib/v3/types/public/api.js +6 -2
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +32 -2
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/context.js +11 -3
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.js +1 -1
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +18 -2
- package/dist/cjs/lib/v3/v3.js +92 -9
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/cjs/tests/integration/flowLogger.spec.js +12 -8
- package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -1
- package/dist/cjs/tests/integration/testUtils.js +1 -1
- package/dist/cjs/tests/integration/testUtils.js.map +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js +6 -4
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +56 -0
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -1
- package/dist/cjs/tests/unit/agent-metrics.test.d.ts +1 -0
- package/dist/cjs/tests/unit/agent-metrics.test.js +112 -0
- package/dist/cjs/tests/unit/agent-metrics.test.js.map +1 -0
- package/dist/cjs/tests/unit/aisdk-clients.test.d.ts +1 -0
- package/dist/cjs/tests/unit/aisdk-clients.test.js +90 -0
- package/dist/cjs/tests/unit/aisdk-clients.test.js.map +1 -0
- package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
- package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js +250 -0
- package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-optional-model-api-key.test.js +95 -0
- package/dist/cjs/tests/unit/api-optional-model-api-key.test.js.map +1 -0
- package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +20 -0
- package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
- package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
- package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
- package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
- package/dist/cjs/tests/unit/microsoft-cua-client.test.d.ts +1 -0
- package/dist/cjs/tests/unit/microsoft-cua-client.test.js +86 -0
- package/dist/cjs/tests/unit/microsoft-cua-client.test.js.map +1 -0
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +1 -0
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/esm/lib/inference.js +29 -22
- package/dist/esm/lib/inference.js.map +1 -1
- package/dist/esm/lib/prompt.js +18 -21
- package/dist/esm/lib/prompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +1 -0
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +60 -9
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +15 -0
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +103 -49
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.js +1 -1
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/keys.js +57 -49
- package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js +3 -5
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +5 -3
- package/dist/esm/lib/v3/api.js +3 -6
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/cache/AgentCache.js +5 -3
- package/dist/esm/lib/v3/cache/AgentCache.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
- package/dist/esm/lib/v3/llm/LLMProvider.js +15 -7
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/llm/OpenAIClient.js +1 -0
- package/dist/esm/lib/v3/llm/OpenAIClient.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/esm/lib/v3/llm/aisdk.js +67 -17
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +8 -3
- package/dist/esm/lib/v3/types/public/agent.js +1 -0
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +30 -0
- package/dist/esm/lib/v3/types/public/api.js +6 -2
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +32 -2
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/understudy/context.js +11 -3
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +1 -1
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +18 -2
- package/dist/esm/lib/v3/v3.js +92 -10
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/esm/tests/integration/flowLogger.spec.js +12 -8
- package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -1
- package/dist/esm/tests/integration/testUtils.js +1 -1
- package/dist/esm/tests/integration/testUtils.js.map +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js +6 -4
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/agent-captcha-hooks.test.js +56 -0
- package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -1
- package/dist/esm/tests/unit/agent-metrics.test.d.ts +1 -0
- package/dist/esm/tests/unit/agent-metrics.test.js +110 -0
- package/dist/esm/tests/unit/agent-metrics.test.js.map +1 -0
- package/dist/esm/tests/unit/aisdk-clients.test.d.ts +1 -0
- package/dist/esm/tests/unit/aisdk-clients.test.js +88 -0
- package/dist/esm/tests/unit/aisdk-clients.test.js.map +1 -0
- package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
- package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js +245 -0
- package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
- package/dist/esm/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-optional-model-api-key.test.js +93 -0
- package/dist/esm/tests/unit/api-optional-model-api-key.test.js.map +1 -0
- package/dist/esm/tests/unit/browserbase-session-accessors.test.js +20 -0
- package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
- package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
- package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
- package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
- package/dist/esm/tests/unit/microsoft-cua-client.test.d.ts +1 -0
- package/dist/esm/tests/unit/microsoft-cua-client.test.js +84 -0
- package/dist/esm/tests/unit/microsoft-cua-client.test.js.map +1 -0
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +1 -0
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/package.json +4 -8
- package/dist/cjs/lib/v3/dom/build/rerender-index.js +0 -1
- package/dist/cjs/lib/v3/dom/build/v3-index.js +0 -1
- package/dist/esm/lib/v3/dom/build/rerender-index.js +0 -1
- package/dist/esm/lib/v3/dom/build/v3-index.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentCache.js","sourceRoot":"","sources":["../../../../../lib/v3/cache/AgentCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport type { ActHandler } from \"../handlers/actHandler.js\";\nimport type { LLMClient } from \"../llm/LLMClient.js\";\nimport type {\n AgentReplayActStep,\n AgentReplayFillFormStep,\n AgentReplayGotoStep,\n AgentReplayKeysStep,\n AgentReplayNavBackStep,\n AgentReplayScrollStep,\n AgentReplayStep,\n AgentReplayWaitStep,\n CachedAgentEntry,\n SanitizedAgentExecuteOptions,\n ActFn,\n AgentCacheContext,\n AgentCacheDeps,\n AgentCacheTransferPayload,\n} from \"../types/private/index.js\";\nimport type {\n Action,\n AgentResult,\n AgentStreamResult,\n AgentConfig,\n AgentExecuteOptionsBase,\n AvailableModel,\n Logger,\n} from \"../types/public/index.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport type { V3Context } from \"../understudy/context.js\";\nimport { CacheStorage } from \"./CacheStorage.js\";\nimport {\n cloneForCache,\n safeGetPageUrl,\n waitForCachedSelector,\n} from \"./utils.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"apikey\", \"api_key\", \"api-key\"]);\n\nexport class AgentCache {\n private readonly storage: CacheStorage;\n private readonly logger: Logger;\n private readonly getActHandler: () => ActHandler | null;\n private readonly getContext: () => V3Context | null;\n private readonly getDefaultLlmClient: () => LLMClient;\n private readonly getBaseModelName: () => AvailableModel;\n private readonly getSystemPrompt: () => string | undefined;\n private readonly domSettleTimeoutMs?: number;\n private readonly act: ActFn;\n private readonly bufferLatestEntry: boolean;\n\n private recording: AgentReplayStep[] | null = null;\n private latestEntry: AgentCacheTransferPayload | null = null;\n\n constructor({\n storage,\n logger,\n getActHandler,\n getContext,\n getDefaultLlmClient,\n getBaseModelName,\n getSystemPrompt,\n domSettleTimeoutMs,\n act,\n bufferLatestEntry,\n }: AgentCacheDeps) {\n this.storage = storage;\n this.logger = logger;\n this.getActHandler = getActHandler;\n this.getContext = getContext;\n this.getDefaultLlmClient = getDefaultLlmClient;\n this.getBaseModelName = getBaseModelName;\n this.getSystemPrompt = getSystemPrompt;\n this.domSettleTimeoutMs = domSettleTimeoutMs;\n this.act = act;\n this.bufferLatestEntry = bufferLatestEntry ?? false;\n }\n\n get enabled(): boolean {\n return this.storage.enabled;\n }\n\n shouldAttemptCache(instruction: string): boolean {\n return this.enabled && instruction.trim().length > 0;\n }\n\n sanitizeExecuteOptions(\n options?: AgentExecuteOptionsBase,\n ): SanitizedAgentExecuteOptions {\n if (!options) return {};\n const sanitized: SanitizedAgentExecuteOptions = {};\n if (typeof options.maxSteps === \"number\") {\n sanitized.maxSteps = options.maxSteps;\n }\n if (\n \"highlightCursor\" in options &&\n typeof (options as { highlightCursor?: unknown }).highlightCursor ===\n \"boolean\"\n ) {\n sanitized.highlightCursor = (\n options as { highlightCursor?: boolean }\n ).highlightCursor;\n }\n return sanitized;\n }\n\n buildConfigSignature(agentOptions?: AgentConfig): string {\n const toolKeys = agentOptions?.tools\n ? Object.keys(agentOptions.tools).sort()\n : undefined;\n const integrationSignatures = agentOptions?.integrations\n ? agentOptions.integrations.map((integration) =>\n typeof integration === \"string\" ? integration : \"client\",\n )\n : undefined;\n const serializedModel = this.serializeAgentModelForCache(\n agentOptions?.model,\n );\n const serializedExecutionModel = this.serializeAgentModelForCache(\n agentOptions?.executionModel,\n );\n\n const isCuaMode =\n agentOptions?.mode !== undefined\n ? agentOptions.mode === \"cua\"\n : agentOptions?.cua === true;\n\n return JSON.stringify({\n v3Model: this.getBaseModelName(),\n systemPrompt: this.getSystemPrompt() ?? \"\",\n agent: {\n cua: isCuaMode,\n model: serializedModel ?? null,\n executionModel: isCuaMode ? null : serializedExecutionModel,\n systemPrompt: agentOptions?.systemPrompt ?? null,\n toolKeys,\n integrations: integrationSignatures,\n },\n });\n }\n\n async prepareContext(params: {\n instruction: string;\n options: SanitizedAgentExecuteOptions;\n configSignature: string;\n page: Page;\n variables?: Record<string, string>;\n }): Promise<AgentCacheContext | null> {\n if (!this.shouldAttemptCache(params.instruction)) {\n return null;\n }\n const instruction = params.instruction.trim();\n const startUrl = await safeGetPageUrl(params.page);\n const variableKeys = params.variables\n ? Object.keys(params.variables).sort()\n : [];\n const cacheKey = this.buildAgentCacheKey(\n instruction,\n startUrl,\n params.options,\n params.configSignature,\n variableKeys,\n );\n return {\n instruction,\n startUrl,\n options: params.options,\n configSignature: params.configSignature,\n cacheKey,\n variableKeys,\n variables: params.variables,\n };\n }\n\n async tryReplay(\n context: AgentCacheContext,\n llmClientOverride?: LLMClient,\n ): Promise<AgentResult | null> {\n if (!this.enabled) return null;\n\n const {\n value: entry,\n error,\n path,\n } = await this.storage.readJson<CachedAgentEntry>(\n `agent-${context.cacheKey}.json`,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: `failed to read agent cache entry: ${path}`,\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return null;\n }\n if (!entry || entry.version !== 1) {\n return null;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache hit\",\n level: 1,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.startUrl, type: \"string\" },\n },\n });\n\n return await this.replayAgentCacheEntry(context, entry, llmClientOverride);\n }\n\n /**\n * Attempts to replay a cached agent execution and returns it as a stream result.\n *\n * This method exists because the agent API exposes two execution modes:\n * - `execute()` - Returns a Promise<AgentResult> directly\n * - `stream()` - Returns an AgentStreamResult with async iterables for real-time output\n *\n * When a cache hit occurs, we need to return the appropriate type for each mode:\n * - For `execute()`, we use `tryReplay()` which returns AgentResult\n * - For `stream()`, we use `tryReplayAsStream()` which wraps the result in a\n * stream-compatible interface\n *\n * This ensures consumers using `stream()` can still iterate over `textStream`\n * and await `result` even when the response comes from cache, maintaining\n * API consistency regardless of whether the result was cached or live.\n */\n async tryReplayAsStream(\n context: AgentCacheContext,\n llmClientOverride?: LLMClient,\n ): Promise<AgentStreamResult | null> {\n const result = await this.tryReplay(context, llmClientOverride);\n if (!result) return null;\n return this.createCachedStreamResult(result);\n }\n\n /**\n * Creates a mock AgentStreamResult that wraps a cached AgentResult.\n *\n * AgentStreamResult (from the AI SDK) is a complex type with multiple async\n * iterables and promises. When serving from cache, we don't have an actual\n * LLM stream to consume - we just have the final result. This method creates\n * a \"fake\" stream\n\n * This approach lets cached responses be transparent to the consumer -\n * they can use the same iteration patterns whether the result is live or cached.\n */\n private createCachedStreamResult(\n cachedResult: AgentResult,\n ): AgentStreamResult {\n const message = cachedResult.message ?? \"\";\n\n async function* textStreamGenerator(): AsyncGenerator<string> {\n yield message;\n }\n\n async function* fullStreamGenerator(): AsyncGenerator<{\n type: string;\n textDelta?: string;\n }> {\n yield { type: \"text-delta\", textDelta: message };\n yield { type: \"finish\" };\n }\n\n const mockStreamResult = {\n textStream: textStreamGenerator(),\n fullStream: fullStreamGenerator(),\n result: Promise.resolve(cachedResult),\n text: Promise.resolve(message),\n usage: Promise.resolve({\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n }),\n finishReason: Promise.resolve(\"stop\" as const),\n experimental_providerMetadata: Promise.resolve(undefined),\n response: Promise.resolve({\n id: \"cached\",\n timestamp: new Date(),\n modelId: \"cached\",\n }),\n rawResponse: Promise.resolve({ headers: {} }),\n warnings: Promise.resolve([]),\n steps: Promise.resolve([]),\n toolCalls: Promise.resolve([]),\n toolResults: Promise.resolve([]),\n [Symbol.asyncIterator]: () => textStreamGenerator(),\n } as unknown as AgentStreamResult;\n\n return mockStreamResult;\n }\n\n /**\n * Wraps an AgentStreamResult with caching logic.\n *\n * This method handles the complexity of caching for streaming responses:\n * 1. Begins recording agent replay steps\n * 2. Wraps the stream's result promise to capture completion\n * 3. On success: ends recording and stores the cache entry\n * 4. On error: discards the recording\n *\n * This keeps the caching orchestration in AgentCache rather than\n * spreading it across the V3 class.\n *\n * @param context - The cache context for this execution\n * @param streamResult - The stream result from the agent handler\n * @param beginRecording - Callback to start recording (from V3)\n * @param endRecording - Callback to end recording and get steps (from V3)\n * @param discardRecording - Callback to discard recording on error (from V3)\n * @returns The wrapped stream result with caching enabled\n */\n wrapStreamForCaching(\n context: AgentCacheContext,\n streamResult: AgentStreamResult,\n beginRecording: () => void,\n endRecording: () => AgentReplayStep[],\n discardRecording: () => void,\n ): AgentStreamResult {\n beginRecording();\n\n const originalResultPromise = streamResult.result;\n const wrappedResultPromise = originalResultPromise.then(\n async (result) => {\n const agentSteps = endRecording();\n\n if (result.success && agentSteps.length > 0) {\n await this.store(context, agentSteps, result);\n }\n\n return result;\n },\n (error) => {\n discardRecording();\n throw error;\n },\n );\n\n streamResult.result = wrappedResultPromise;\n return streamResult;\n }\n\n async store(\n context: AgentCacheContext,\n steps: AgentReplayStep[],\n result: AgentResult,\n ): Promise<void> {\n if (!this.enabled) return;\n\n const entry: CachedAgentEntry = {\n version: 1,\n instruction: context.instruction,\n startUrl: context.startUrl,\n options: context.options,\n configSignature: context.configSignature,\n steps: cloneForCache(steps),\n result: this.pruneAgentResult(result),\n timestamp: new Date().toISOString(),\n };\n\n const { error, path } = await this.storage.writeJson(\n `agent-${context.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to write agent cache entry\",\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache stored\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n steps: { value: String(steps.length), type: \"string\" },\n },\n });\n\n if (this.bufferLatestEntry) {\n this.latestEntry = {\n cacheKey: context.cacheKey,\n entry: cloneForCache(entry),\n };\n }\n }\n\n consumeBufferedEntry(): AgentCacheTransferPayload | null {\n if (!this.bufferLatestEntry || !this.latestEntry) {\n return null;\n }\n\n const payload = this.latestEntry;\n this.latestEntry = null;\n return payload;\n }\n\n async storeTransferredEntry(\n payload: AgentCacheTransferPayload | null,\n ): Promise<void> {\n if (!this.enabled || !payload) return;\n\n const entry = cloneForCache(payload.entry);\n const { error, path } = await this.storage.writeJson(\n `agent-${payload.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to import remote agent cache entry\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache imported from server\",\n level: 2,\n auxiliary: {\n instruction: { value: entry.instruction, type: \"string\" },\n steps: { value: String(entry.steps?.length ?? 0), type: \"string\" },\n },\n });\n }\n\n /**\n * Clone the agent result and prune bulky fields (e.g. screenshot base64 blobs)\n * before persisting it to disk. This keeps cache entries compact without\n * mutating the live AgentResult returned to callers.\n */\n private pruneAgentResult(result: AgentResult): AgentResult {\n const cloned = cloneForCache(result);\n if (!Array.isArray(cloned.actions)) {\n return cloned;\n }\n\n for (const action of cloned.actions) {\n if (action?.type === \"screenshot\") {\n delete action.base64;\n }\n }\n\n return cloned;\n }\n\n beginRecording(): void {\n this.recording = [];\n }\n\n endRecording(): AgentReplayStep[] {\n if (!this.recording) return [];\n const steps = cloneForCache(this.recording);\n this.recording = null;\n return steps;\n }\n\n discardRecording(): void {\n this.recording = null;\n }\n\n isRecording(): boolean {\n return Array.isArray(this.recording);\n }\n\n recordStep(step: AgentReplayStep): void {\n if (!this.isRecording()) return;\n try {\n this.recording!.push(cloneForCache(step));\n } catch (err) {\n this.logger({\n category: \"cache\",\n message: \"failed to record agent replay step\",\n level: 2,\n auxiliary: {\n error: { value: String(err), type: \"string\" },\n },\n });\n }\n }\n\n isReplayActive(): boolean {\n return this.isRecording();\n }\n\n private serializeAgentModelForCache(\n model?: AgentConfig[\"model\"],\n ): null | string | { modelName: string; options?: Record<string, unknown> } {\n if (!model) return null;\n if (typeof model === \"string\") return model;\n\n const { modelName, ...modelOptions } = model;\n const sanitizedOptions =\n Object.keys(modelOptions).length > 0\n ? this.sanitizeModelOptionsForCache(\n modelOptions as Record<string, unknown>,\n )\n : undefined;\n return sanitizedOptions\n ? { modelName, options: sanitizedOptions }\n : modelName;\n }\n\n private buildAgentCacheKey(\n instruction: string,\n startUrl: string,\n options: SanitizedAgentExecuteOptions,\n configSignature: string,\n variableKeys?: string[],\n ): string {\n const payload = {\n instruction,\n startUrl,\n options,\n configSignature,\n variableKeys: variableKeys ?? [],\n };\n return createHash(\"sha256\").update(JSON.stringify(payload)).digest(\"hex\");\n }\n\n private sanitizeModelOptionsForCache(\n value: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n const sanitizedEntries: Record<string, unknown> = {};\n for (const [key, rawValue] of Object.entries(value)) {\n if (SENSITIVE_CONFIG_KEYS.has(key.toLowerCase())) {\n continue;\n }\n\n const sanitizedValue = this.sanitizeModelValueForCache(rawValue);\n if (sanitizedValue !== undefined) {\n sanitizedEntries[key] = sanitizedValue;\n }\n }\n\n return Object.keys(sanitizedEntries).length > 0\n ? sanitizedEntries\n : undefined;\n }\n\n private sanitizeModelValueForCache(value: unknown): unknown {\n if (Array.isArray(value)) {\n const sanitizedArray = value\n .map((item) => this.sanitizeModelValueForCache(item))\n .filter((item) => item !== undefined);\n return sanitizedArray;\n }\n\n if (value && typeof value === \"object\") {\n return this.sanitizeModelOptionsForCache(\n value as Record<string, unknown>,\n );\n }\n\n return value;\n }\n\n private async replayAgentCacheEntry(\n context: AgentCacheContext,\n entry: CachedAgentEntry,\n llmClientOverride?: LLMClient,\n ): Promise<AgentResult | null> {\n const ctx = this.getContext();\n const handler = this.getActHandler();\n if (!ctx || !handler) return null;\n const effectiveClient = llmClientOverride ?? this.getDefaultLlmClient();\n try {\n const updatedSteps: AgentReplayStep[] = [];\n let stepsChanged = false;\n for (const step of entry.steps ?? []) {\n const replayedStep =\n (await this.executeAgentReplayStep(\n step,\n ctx,\n handler,\n effectiveClient,\n context.variables,\n )) ?? step;\n stepsChanged ||= replayedStep !== step;\n updatedSteps.push(replayedStep);\n }\n const result = cloneForCache(entry.result);\n result.usage = {\n input_tokens: 0,\n output_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n inference_time_ms: 0,\n };\n result.metadata = {\n ...(result.metadata ?? {}),\n cacheHit: true,\n cacheTimestamp: entry.timestamp,\n };\n if (stepsChanged) {\n await this.refreshAgentCacheEntry(context, entry, updatedSteps);\n }\n return result;\n } catch (err) {\n this.logger({\n category: \"cache\",\n message: \"agent cache replay failed\",\n level: 1,\n auxiliary: {\n error: { value: String(err), type: \"string\" },\n },\n });\n return null;\n }\n }\n\n private async executeAgentReplayStep(\n step: AgentReplayStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n variables?: Record<string, string>,\n ): Promise<AgentReplayStep> {\n switch (step.type) {\n case \"act\":\n return await this.replayAgentActStep(\n step as AgentReplayActStep,\n ctx,\n handler,\n llmClient,\n variables,\n );\n case \"fillForm\":\n return await this.replayAgentFillFormStep(\n step as AgentReplayFillFormStep,\n ctx,\n handler,\n llmClient,\n variables,\n );\n case \"goto\":\n await this.replayAgentGotoStep(step as AgentReplayGotoStep, ctx);\n return step;\n case \"scroll\":\n await this.replayAgentScrollStep(step as AgentReplayScrollStep, ctx);\n return step;\n case \"wait\":\n await this.replayAgentWaitStep(step as AgentReplayWaitStep);\n return step;\n case \"navback\":\n await this.replayAgentNavBackStep(step as AgentReplayNavBackStep, ctx);\n return step;\n case \"keys\":\n await this.replayAgentKeysStep(step as AgentReplayKeysStep, ctx);\n return step;\n case \"done\":\n case \"extract\":\n case \"screenshot\":\n case \"ariaTree\":\n return step;\n default:\n this.logger({\n category: \"cache\",\n message: `agent cache skipping step type: ${step.type}`,\n level: 2,\n });\n return step;\n }\n }\n\n private async replayAgentActStep(\n step: AgentReplayActStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n variables?: Record<string, string>,\n ): Promise<AgentReplayActStep> {\n const actions = Array.isArray(step.actions) ? step.actions : [];\n if (actions.length > 0) {\n const page = await ctx.awaitActivePage();\n const updatedActions: Action[] = [];\n for (const action of actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"agent act\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n llmClient,\n undefined,\n variables,\n );\n if (result.success && Array.isArray(result.actions)) {\n updatedActions.push(...cloneForCache(result.actions));\n } else {\n updatedActions.push(cloneForCache(action));\n }\n }\n if (this.haveActionsChanged(actions, updatedActions)) {\n return { ...step, actions: updatedActions };\n }\n return step;\n }\n await this.act(step.instruction, { timeout: step.timeout, variables });\n return step;\n }\n\n private async replayAgentFillFormStep(\n step: AgentReplayFillFormStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n variables?: Record<string, string>,\n ): Promise<AgentReplayFillFormStep> {\n const actions =\n Array.isArray(step.actions) && step.actions.length > 0\n ? step.actions\n : (step.observeResults ?? []);\n if (!Array.isArray(actions) || actions.length === 0) {\n return step;\n }\n const page = await ctx.awaitActivePage();\n const updatedActions: Action[] = [];\n for (const action of actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"fillForm\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n llmClient,\n undefined, // ensureTimeRemaining is not used in this context\n variables,\n );\n if (result.success && Array.isArray(result.actions)) {\n updatedActions.push(...cloneForCache(result.actions));\n } else {\n updatedActions.push(cloneForCache(action));\n }\n }\n if (this.haveActionsChanged(actions, updatedActions)) {\n return { ...step, actions: updatedActions };\n }\n return step;\n }\n\n private async replayAgentGotoStep(\n step: AgentReplayGotoStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n await page.goto(step.url, { waitUntil: step.waitUntil ?? \"load\" });\n }\n\n private async replayAgentScrollStep(\n step: AgentReplayScrollStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n let anchor = step.anchor;\n if (!anchor) {\n anchor = await page\n .mainFrame()\n .evaluate<{ x: number; y: number }>(() => ({\n x: Math.max(0, Math.floor(window.innerWidth / 2)),\n y: Math.max(0, Math.floor(window.innerHeight / 2)),\n }));\n }\n const deltaX = step.deltaX ?? 0;\n const deltaY = step.deltaY ?? 0;\n await page.scroll(\n Math.round(anchor.x ?? 0),\n Math.round(anchor.y ?? 0),\n deltaX,\n deltaY,\n );\n }\n\n private async replayAgentWaitStep(step: AgentReplayWaitStep): Promise<void> {\n if (!step.timeMs || step.timeMs <= 0) return;\n await new Promise((resolve) => setTimeout(resolve, step.timeMs));\n }\n\n private async replayAgentNavBackStep(\n step: AgentReplayNavBackStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n await page.goBack({ waitUntil: step.waitUntil ?? \"domcontentloaded\" });\n }\n\n private async replayAgentKeysStep(\n step: AgentReplayKeysStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n const { method, text, keys, times } = step.playwrightArguments;\n const repeatCount = Math.max(1, times ?? 1);\n\n if (method === \"type\" && text) {\n for (let i = 0; i < repeatCount; i++) {\n await page.type(text, { delay: 100 });\n }\n } else if (method === \"press\" && keys) {\n for (let i = 0; i < repeatCount; i++) {\n await page.keyPress(keys, { delay: 100 });\n }\n }\n }\n\n private haveActionsChanged(original: Action[], updated: Action[]): boolean {\n if (original.length !== updated.length) {\n return true;\n }\n for (let i = 0; i < original.length; i += 1) {\n const orig = original[i];\n const next = updated[i];\n if (!orig || !next) {\n return true;\n }\n if (orig.selector !== next.selector) {\n return true;\n }\n if ((orig.description ?? \"\") !== (next.description ?? \"\")) {\n return true;\n }\n if ((orig.method ?? \"\") !== (next.method ?? \"\")) {\n return true;\n }\n const origArgs = Array.isArray(orig.arguments) ? orig.arguments : [];\n const nextArgs = Array.isArray(next.arguments) ? next.arguments : [];\n if (origArgs.length !== nextArgs.length) {\n return true;\n }\n for (let j = 0; j < origArgs.length; j += 1) {\n if (origArgs[j] !== nextArgs[j]) {\n return true;\n }\n }\n }\n return false;\n }\n\n private async refreshAgentCacheEntry(\n context: AgentCacheContext,\n entry: CachedAgentEntry,\n updatedSteps: AgentReplayStep[],\n ): Promise<void> {\n const updatedEntry: CachedAgentEntry = {\n ...entry,\n steps: cloneForCache(updatedSteps),\n timestamp: new Date().toISOString(),\n };\n const { error, path } = await this.storage.writeJson(\n `agent-${context.cacheKey}.json`,\n updatedEntry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to update agent cache entry after self-heal\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n this.logger({\n category: \"cache\",\n message: \"agent cache entry updated after self-heal\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n steps: { value: String(updatedSteps.length), type: \"string\" },\n },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentCache.js","sourceRoot":"","sources":["../../../../../lib/v3/cache/AgentCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport type { ActHandler } from \"../handlers/actHandler.js\";\nimport type { LLMClient } from \"../llm/LLMClient.js\";\nimport type {\n AgentReplayActStep,\n AgentReplayFillFormStep,\n AgentReplayGotoStep,\n AgentReplayKeysStep,\n AgentReplayNavBackStep,\n AgentReplayScrollStep,\n AgentReplayStep,\n AgentReplayWaitStep,\n CachedAgentEntry,\n SanitizedAgentExecuteOptions,\n ActFn,\n AgentCacheContext,\n AgentCacheDeps,\n AgentCacheTransferPayload,\n} from \"../types/private/index.js\";\nimport type {\n Action,\n AgentResult,\n AgentStreamResult,\n AgentConfig,\n AgentExecuteOptionsBase,\n AvailableModel,\n Logger,\n} from \"../types/public/index.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport type { V3Context } from \"../understudy/context.js\";\nimport { CacheStorage } from \"./CacheStorage.js\";\nimport {\n cloneForCache,\n safeGetPageUrl,\n waitForCachedSelector,\n} from \"./utils.js\";\nimport { substituteVariables } from \"../agent/utils/variables.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"apikey\", \"api_key\", \"api-key\"]);\n\nexport class AgentCache {\n private readonly storage: CacheStorage;\n private readonly logger: Logger;\n private readonly getActHandler: () => ActHandler | null;\n private readonly getContext: () => V3Context | null;\n private readonly getDefaultLlmClient: () => LLMClient;\n private readonly getBaseModelName: () => AvailableModel;\n private readonly getSystemPrompt: () => string | undefined;\n private readonly domSettleTimeoutMs?: number;\n private readonly act: ActFn;\n private readonly bufferLatestEntry: boolean;\n\n private recording: AgentReplayStep[] | null = null;\n private latestEntry: AgentCacheTransferPayload | null = null;\n\n constructor({\n storage,\n logger,\n getActHandler,\n getContext,\n getDefaultLlmClient,\n getBaseModelName,\n getSystemPrompt,\n domSettleTimeoutMs,\n act,\n bufferLatestEntry,\n }: AgentCacheDeps) {\n this.storage = storage;\n this.logger = logger;\n this.getActHandler = getActHandler;\n this.getContext = getContext;\n this.getDefaultLlmClient = getDefaultLlmClient;\n this.getBaseModelName = getBaseModelName;\n this.getSystemPrompt = getSystemPrompt;\n this.domSettleTimeoutMs = domSettleTimeoutMs;\n this.act = act;\n this.bufferLatestEntry = bufferLatestEntry ?? false;\n }\n\n get enabled(): boolean {\n return this.storage.enabled;\n }\n\n shouldAttemptCache(instruction: string): boolean {\n return this.enabled && instruction.trim().length > 0;\n }\n\n sanitizeExecuteOptions(\n options?: AgentExecuteOptionsBase,\n ): SanitizedAgentExecuteOptions {\n if (!options) return {};\n const sanitized: SanitizedAgentExecuteOptions = {};\n if (typeof options.maxSteps === \"number\") {\n sanitized.maxSteps = options.maxSteps;\n }\n if (\n \"highlightCursor\" in options &&\n typeof (options as { highlightCursor?: unknown }).highlightCursor ===\n \"boolean\"\n ) {\n sanitized.highlightCursor = (\n options as { highlightCursor?: boolean }\n ).highlightCursor;\n }\n return sanitized;\n }\n\n buildConfigSignature(agentOptions?: AgentConfig): string {\n const toolKeys = agentOptions?.tools\n ? Object.keys(agentOptions.tools).sort()\n : undefined;\n const integrationSignatures = agentOptions?.integrations\n ? agentOptions.integrations.map((integration) =>\n typeof integration === \"string\" ? integration : \"client\",\n )\n : undefined;\n const serializedModel = this.serializeAgentModelForCache(\n agentOptions?.model,\n );\n const serializedExecutionModel = this.serializeAgentModelForCache(\n agentOptions?.executionModel,\n );\n\n const isCuaMode =\n agentOptions?.mode !== undefined\n ? agentOptions.mode === \"cua\"\n : agentOptions?.cua === true;\n\n return JSON.stringify({\n v3Model: this.getBaseModelName(),\n systemPrompt: this.getSystemPrompt() ?? \"\",\n agent: {\n cua: isCuaMode,\n model: serializedModel ?? null,\n executionModel: isCuaMode ? null : serializedExecutionModel,\n systemPrompt: agentOptions?.systemPrompt ?? null,\n toolKeys,\n integrations: integrationSignatures,\n },\n });\n }\n\n async prepareContext(params: {\n instruction: string;\n options: SanitizedAgentExecuteOptions;\n configSignature: string;\n page: Page;\n variables?: Record<string, string>;\n }): Promise<AgentCacheContext | null> {\n if (!this.shouldAttemptCache(params.instruction)) {\n return null;\n }\n const instruction = params.instruction.trim();\n const startUrl = await safeGetPageUrl(params.page);\n const variableKeys = params.variables\n ? Object.keys(params.variables).sort()\n : [];\n const cacheKey = this.buildAgentCacheKey(\n instruction,\n startUrl,\n params.options,\n params.configSignature,\n variableKeys,\n );\n return {\n instruction,\n startUrl,\n options: params.options,\n configSignature: params.configSignature,\n cacheKey,\n variableKeys,\n variables: params.variables,\n };\n }\n\n async tryReplay(\n context: AgentCacheContext,\n llmClientOverride?: LLMClient,\n ): Promise<AgentResult | null> {\n if (!this.enabled) return null;\n\n const {\n value: entry,\n error,\n path,\n } = await this.storage.readJson<CachedAgentEntry>(\n `agent-${context.cacheKey}.json`,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: `failed to read agent cache entry: ${path}`,\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return null;\n }\n if (!entry || entry.version !== 1) {\n return null;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache hit\",\n level: 1,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.startUrl, type: \"string\" },\n },\n });\n\n return await this.replayAgentCacheEntry(context, entry, llmClientOverride);\n }\n\n /**\n * Attempts to replay a cached agent execution and returns it as a stream result.\n *\n * This method exists because the agent API exposes two execution modes:\n * - `execute()` - Returns a Promise<AgentResult> directly\n * - `stream()` - Returns an AgentStreamResult with async iterables for real-time output\n *\n * When a cache hit occurs, we need to return the appropriate type for each mode:\n * - For `execute()`, we use `tryReplay()` which returns AgentResult\n * - For `stream()`, we use `tryReplayAsStream()` which wraps the result in a\n * stream-compatible interface\n *\n * This ensures consumers using `stream()` can still iterate over `textStream`\n * and await `result` even when the response comes from cache, maintaining\n * API consistency regardless of whether the result was cached or live.\n */\n async tryReplayAsStream(\n context: AgentCacheContext,\n llmClientOverride?: LLMClient,\n ): Promise<AgentStreamResult | null> {\n const result = await this.tryReplay(context, llmClientOverride);\n if (!result) return null;\n return this.createCachedStreamResult(result);\n }\n\n /**\n * Creates a mock AgentStreamResult that wraps a cached AgentResult.\n *\n * AgentStreamResult (from the AI SDK) is a complex type with multiple async\n * iterables and promises. When serving from cache, we don't have an actual\n * LLM stream to consume - we just have the final result. This method creates\n * a \"fake\" stream\n\n * This approach lets cached responses be transparent to the consumer -\n * they can use the same iteration patterns whether the result is live or cached.\n */\n private createCachedStreamResult(\n cachedResult: AgentResult,\n ): AgentStreamResult {\n const message = cachedResult.message ?? \"\";\n\n async function* textStreamGenerator(): AsyncGenerator<string> {\n yield message;\n }\n\n async function* fullStreamGenerator(): AsyncGenerator<{\n type: string;\n textDelta?: string;\n }> {\n yield { type: \"text-delta\", textDelta: message };\n yield { type: \"finish\" };\n }\n\n const mockStreamResult = {\n textStream: textStreamGenerator(),\n fullStream: fullStreamGenerator(),\n result: Promise.resolve(cachedResult),\n text: Promise.resolve(message),\n usage: Promise.resolve({\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n }),\n finishReason: Promise.resolve(\"stop\" as const),\n experimental_providerMetadata: Promise.resolve(undefined),\n response: Promise.resolve({\n id: \"cached\",\n timestamp: new Date(),\n modelId: \"cached\",\n }),\n rawResponse: Promise.resolve({ headers: {} }),\n warnings: Promise.resolve([]),\n steps: Promise.resolve([]),\n toolCalls: Promise.resolve([]),\n toolResults: Promise.resolve([]),\n [Symbol.asyncIterator]: () => textStreamGenerator(),\n } as unknown as AgentStreamResult;\n\n return mockStreamResult;\n }\n\n /**\n * Wraps an AgentStreamResult with caching logic.\n *\n * This method handles the complexity of caching for streaming responses:\n * 1. Begins recording agent replay steps\n * 2. Wraps the stream's result promise to capture completion\n * 3. On success: ends recording and stores the cache entry\n * 4. On error: discards the recording\n *\n * This keeps the caching orchestration in AgentCache rather than\n * spreading it across the V3 class.\n *\n * @param context - The cache context for this execution\n * @param streamResult - The stream result from the agent handler\n * @param beginRecording - Callback to start recording (from V3)\n * @param endRecording - Callback to end recording and get steps (from V3)\n * @param discardRecording - Callback to discard recording on error (from V3)\n * @returns The wrapped stream result with caching enabled\n */\n wrapStreamForCaching(\n context: AgentCacheContext,\n streamResult: AgentStreamResult,\n beginRecording: () => void,\n endRecording: () => AgentReplayStep[],\n discardRecording: () => void,\n ): AgentStreamResult {\n beginRecording();\n\n const originalResultPromise = streamResult.result;\n const wrappedResultPromise = originalResultPromise.then(\n async (result) => {\n const agentSteps = endRecording();\n\n if (result.success && agentSteps.length > 0) {\n await this.store(context, agentSteps, result);\n }\n\n return result;\n },\n (error) => {\n discardRecording();\n throw error;\n },\n );\n\n streamResult.result = wrappedResultPromise;\n return streamResult;\n }\n\n async store(\n context: AgentCacheContext,\n steps: AgentReplayStep[],\n result: AgentResult,\n ): Promise<void> {\n if (!this.enabled) return;\n\n const entry: CachedAgentEntry = {\n version: 1,\n instruction: context.instruction,\n startUrl: context.startUrl,\n options: context.options,\n configSignature: context.configSignature,\n steps: cloneForCache(steps),\n result: this.pruneAgentResult(result),\n timestamp: new Date().toISOString(),\n };\n\n const { error, path } = await this.storage.writeJson(\n `agent-${context.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to write agent cache entry\",\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache stored\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n steps: { value: String(steps.length), type: \"string\" },\n },\n });\n\n if (this.bufferLatestEntry) {\n this.latestEntry = {\n cacheKey: context.cacheKey,\n entry: cloneForCache(entry),\n };\n }\n }\n\n consumeBufferedEntry(): AgentCacheTransferPayload | null {\n if (!this.bufferLatestEntry || !this.latestEntry) {\n return null;\n }\n\n const payload = this.latestEntry;\n this.latestEntry = null;\n return payload;\n }\n\n async storeTransferredEntry(\n payload: AgentCacheTransferPayload | null,\n ): Promise<void> {\n if (!this.enabled || !payload) return;\n\n const entry = cloneForCache(payload.entry);\n const { error, path } = await this.storage.writeJson(\n `agent-${payload.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to import remote agent cache entry\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"agent cache imported from server\",\n level: 2,\n auxiliary: {\n instruction: { value: entry.instruction, type: \"string\" },\n steps: { value: String(entry.steps?.length ?? 0), type: \"string\" },\n },\n });\n }\n\n /**\n * Clone the agent result and prune bulky fields (e.g. screenshot base64 blobs)\n * before persisting it to disk. This keeps cache entries compact without\n * mutating the live AgentResult returned to callers.\n */\n private pruneAgentResult(result: AgentResult): AgentResult {\n const cloned = cloneForCache(result);\n if (!Array.isArray(cloned.actions)) {\n return cloned;\n }\n\n for (const action of cloned.actions) {\n if (action?.type === \"screenshot\") {\n delete action.base64;\n }\n }\n\n return cloned;\n }\n\n beginRecording(): void {\n this.recording = [];\n }\n\n endRecording(): AgentReplayStep[] {\n if (!this.recording) return [];\n const steps = cloneForCache(this.recording);\n this.recording = null;\n return steps;\n }\n\n discardRecording(): void {\n this.recording = null;\n }\n\n isRecording(): boolean {\n return Array.isArray(this.recording);\n }\n\n recordStep(step: AgentReplayStep): void {\n if (!this.isRecording()) return;\n try {\n this.recording!.push(cloneForCache(step));\n } catch (err) {\n this.logger({\n category: \"cache\",\n message: \"failed to record agent replay step\",\n level: 2,\n auxiliary: {\n error: { value: String(err), type: \"string\" },\n },\n });\n }\n }\n\n isReplayActive(): boolean {\n return this.isRecording();\n }\n\n private serializeAgentModelForCache(\n model?: AgentConfig[\"model\"],\n ): null | string | { modelName: string; options?: Record<string, unknown> } {\n if (!model) return null;\n if (typeof model === \"string\") return model;\n\n const { modelName, ...modelOptions } = model;\n const sanitizedOptions =\n Object.keys(modelOptions).length > 0\n ? this.sanitizeModelOptionsForCache(\n modelOptions as Record<string, unknown>,\n )\n : undefined;\n return sanitizedOptions\n ? { modelName, options: sanitizedOptions }\n : modelName;\n }\n\n private buildAgentCacheKey(\n instruction: string,\n startUrl: string,\n options: SanitizedAgentExecuteOptions,\n configSignature: string,\n variableKeys?: string[],\n ): string {\n const payload = {\n instruction,\n startUrl,\n options,\n configSignature,\n variableKeys: variableKeys ?? [],\n };\n return createHash(\"sha256\").update(JSON.stringify(payload)).digest(\"hex\");\n }\n\n private sanitizeModelOptionsForCache(\n value: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n const sanitizedEntries: Record<string, unknown> = {};\n for (const [key, rawValue] of Object.entries(value)) {\n if (SENSITIVE_CONFIG_KEYS.has(key.toLowerCase())) {\n continue;\n }\n\n const sanitizedValue = this.sanitizeModelValueForCache(rawValue);\n if (sanitizedValue !== undefined) {\n sanitizedEntries[key] = sanitizedValue;\n }\n }\n\n return Object.keys(sanitizedEntries).length > 0\n ? sanitizedEntries\n : undefined;\n }\n\n private sanitizeModelValueForCache(value: unknown): unknown {\n if (Array.isArray(value)) {\n const sanitizedArray = value\n .map((item) => this.sanitizeModelValueForCache(item))\n .filter((item) => item !== undefined);\n return sanitizedArray;\n }\n\n if (value && typeof value === \"object\") {\n return this.sanitizeModelOptionsForCache(\n value as Record<string, unknown>,\n );\n }\n\n return value;\n }\n\n private async replayAgentCacheEntry(\n context: AgentCacheContext,\n entry: CachedAgentEntry,\n llmClientOverride?: LLMClient,\n ): Promise<AgentResult | null> {\n const ctx = this.getContext();\n const handler = this.getActHandler();\n if (!ctx || !handler) return null;\n const effectiveClient = llmClientOverride ?? this.getDefaultLlmClient();\n try {\n const updatedSteps: AgentReplayStep[] = [];\n let stepsChanged = false;\n for (const step of entry.steps ?? []) {\n const replayedStep =\n (await this.executeAgentReplayStep(\n step,\n ctx,\n handler,\n effectiveClient,\n context.variables,\n )) ?? step;\n stepsChanged ||= replayedStep !== step;\n updatedSteps.push(replayedStep);\n }\n const result = cloneForCache(entry.result);\n result.usage = {\n input_tokens: 0,\n output_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n inference_time_ms: 0,\n };\n result.metadata = {\n ...(result.metadata ?? {}),\n cacheHit: true,\n cacheTimestamp: entry.timestamp,\n };\n if (stepsChanged) {\n await this.refreshAgentCacheEntry(context, entry, updatedSteps);\n }\n return result;\n } catch (err) {\n this.logger({\n category: \"cache\",\n message: \"agent cache replay failed\",\n level: 1,\n auxiliary: {\n error: { value: String(err), type: \"string\" },\n },\n });\n return null;\n }\n }\n\n private async executeAgentReplayStep(\n step: AgentReplayStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n variables?: Record<string, string>,\n ): Promise<AgentReplayStep> {\n switch (step.type) {\n case \"act\":\n return await this.replayAgentActStep(\n step as AgentReplayActStep,\n ctx,\n handler,\n llmClient,\n variables,\n );\n case \"fillForm\":\n return await this.replayAgentFillFormStep(\n step as AgentReplayFillFormStep,\n ctx,\n handler,\n llmClient,\n variables,\n );\n case \"goto\":\n await this.replayAgentGotoStep(step as AgentReplayGotoStep, ctx);\n return step;\n case \"scroll\":\n await this.replayAgentScrollStep(step as AgentReplayScrollStep, ctx);\n return step;\n case \"wait\":\n await this.replayAgentWaitStep(step as AgentReplayWaitStep);\n return step;\n case \"navback\":\n await this.replayAgentNavBackStep(step as AgentReplayNavBackStep, ctx);\n return step;\n case \"keys\":\n await this.replayAgentKeysStep(\n step as AgentReplayKeysStep,\n ctx,\n variables,\n );\n return step;\n case \"done\":\n case \"extract\":\n case \"screenshot\":\n case \"ariaTree\":\n return step;\n default:\n this.logger({\n category: \"cache\",\n message: `agent cache skipping step type: ${step.type}`,\n level: 2,\n });\n return step;\n }\n }\n\n private async replayAgentActStep(\n step: AgentReplayActStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n variables?: Record<string, string>,\n ): Promise<AgentReplayActStep> {\n const actions = Array.isArray(step.actions) ? step.actions : [];\n if (actions.length > 0) {\n const page = await ctx.awaitActivePage();\n const updatedActions: Action[] = [];\n for (const action of actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"agent act\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n llmClient,\n undefined,\n variables,\n );\n if (result.success && Array.isArray(result.actions)) {\n updatedActions.push(...cloneForCache(result.actions));\n } else {\n updatedActions.push(cloneForCache(action));\n }\n }\n if (this.haveActionsChanged(actions, updatedActions)) {\n return { ...step, actions: updatedActions };\n }\n return step;\n }\n await this.act(step.instruction, { timeout: step.timeout, variables });\n return step;\n }\n\n private async replayAgentFillFormStep(\n step: AgentReplayFillFormStep,\n ctx: V3Context,\n handler: ActHandler,\n llmClient: LLMClient,\n variables?: Record<string, string>,\n ): Promise<AgentReplayFillFormStep> {\n const actions =\n Array.isArray(step.actions) && step.actions.length > 0\n ? step.actions\n : (step.observeResults ?? []);\n if (!Array.isArray(actions) || actions.length === 0) {\n return step;\n }\n const page = await ctx.awaitActivePage();\n const updatedActions: Action[] = [];\n for (const action of actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"fillForm\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n llmClient,\n undefined, // ensureTimeRemaining is not used in this context\n variables,\n );\n if (result.success && Array.isArray(result.actions)) {\n updatedActions.push(...cloneForCache(result.actions));\n } else {\n updatedActions.push(cloneForCache(action));\n }\n }\n if (this.haveActionsChanged(actions, updatedActions)) {\n return { ...step, actions: updatedActions };\n }\n return step;\n }\n\n private async replayAgentGotoStep(\n step: AgentReplayGotoStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n await page.goto(step.url, { waitUntil: step.waitUntil ?? \"load\" });\n }\n\n private async replayAgentScrollStep(\n step: AgentReplayScrollStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n let anchor = step.anchor;\n if (!anchor) {\n anchor = await page\n .mainFrame()\n .evaluate<{ x: number; y: number }>(() => ({\n x: Math.max(0, Math.floor(window.innerWidth / 2)),\n y: Math.max(0, Math.floor(window.innerHeight / 2)),\n }));\n }\n const deltaX = step.deltaX ?? 0;\n const deltaY = step.deltaY ?? 0;\n await page.scroll(\n Math.round(anchor.x ?? 0),\n Math.round(anchor.y ?? 0),\n deltaX,\n deltaY,\n );\n }\n\n private async replayAgentWaitStep(step: AgentReplayWaitStep): Promise<void> {\n if (!step.timeMs || step.timeMs <= 0) return;\n await new Promise((resolve) => setTimeout(resolve, step.timeMs));\n }\n\n private async replayAgentNavBackStep(\n step: AgentReplayNavBackStep,\n ctx: V3Context,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n await page.goBack({ waitUntil: step.waitUntil ?? \"domcontentloaded\" });\n }\n\n private async replayAgentKeysStep(\n step: AgentReplayKeysStep,\n ctx: V3Context,\n variables?: Record<string, string>,\n ): Promise<void> {\n const page = await ctx.awaitActivePage();\n const { method, text, keys, times } = step.playwrightArguments;\n const repeatCount = Math.max(1, times ?? 1);\n\n if (method === \"type\" && text) {\n const resolvedText = substituteVariables(text, variables);\n for (let i = 0; i < repeatCount; i++) {\n await page.type(resolvedText, { delay: 100 });\n }\n } else if (method === \"press\" && keys) {\n for (let i = 0; i < repeatCount; i++) {\n await page.keyPress(keys, { delay: 100 });\n }\n }\n }\n\n private haveActionsChanged(original: Action[], updated: Action[]): boolean {\n if (original.length !== updated.length) {\n return true;\n }\n for (let i = 0; i < original.length; i += 1) {\n const orig = original[i];\n const next = updated[i];\n if (!orig || !next) {\n return true;\n }\n if (orig.selector !== next.selector) {\n return true;\n }\n if ((orig.description ?? \"\") !== (next.description ?? \"\")) {\n return true;\n }\n if ((orig.method ?? \"\") !== (next.method ?? \"\")) {\n return true;\n }\n const origArgs = Array.isArray(orig.arguments) ? orig.arguments : [];\n const nextArgs = Array.isArray(next.arguments) ? next.arguments : [];\n if (origArgs.length !== nextArgs.length) {\n return true;\n }\n for (let j = 0; j < origArgs.length; j += 1) {\n if (origArgs[j] !== nextArgs[j]) {\n return true;\n }\n }\n }\n return false;\n }\n\n private async refreshAgentCacheEntry(\n context: AgentCacheContext,\n entry: CachedAgentEntry,\n updatedSteps: AgentReplayStep[],\n ): Promise<void> {\n const updatedEntry: CachedAgentEntry = {\n ...entry,\n steps: cloneForCache(updatedSteps),\n timestamp: new Date().toISOString(),\n };\n const { error, path } = await this.storage.writeJson(\n `agent-${context.cacheKey}.json`,\n updatedEntry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to update agent cache entry after self-heal\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n this.logger({\n category: \"cache\",\n message: \"agent cache entry updated after self-heal\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n steps: { value: String(updatedSteps.length), type: \"string\" },\n },\n });\n }\n}\n"]}
|
|
@@ -90,8 +90,8 @@ class V3CuaAgentHandler {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
await new Promise((r) => setTimeout(r, 300));
|
|
93
|
-
// Skip logging for screenshot actions - they're no-ops
|
|
94
|
-
//
|
|
93
|
+
// Skip logging for screenshot actions - they're no-ops; the CUA client
|
|
94
|
+
// takes its own screenshot via screenshotProvider between API turns.
|
|
95
95
|
const shouldLog = action.type !== "screenshot";
|
|
96
96
|
if (shouldLog) {
|
|
97
97
|
await FlowLogger_js_1.FlowLogger.runWithLogging({
|
|
@@ -106,16 +106,6 @@ class V3CuaAgentHandler {
|
|
|
106
106
|
}
|
|
107
107
|
action.timestamp = Date.now();
|
|
108
108
|
await new Promise((r) => setTimeout(r, waitBetween));
|
|
109
|
-
try {
|
|
110
|
-
await this.captureAndSendScreenshot();
|
|
111
|
-
}
|
|
112
|
-
catch (e) {
|
|
113
|
-
this.logger({
|
|
114
|
-
category: "agent",
|
|
115
|
-
message: `Warning: Failed to take screenshot after action: ${String(e?.message ?? e)}`,
|
|
116
|
-
level: 1,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
109
|
}
|
|
120
110
|
catch (error) {
|
|
121
111
|
const msg = error?.message ?? String(error);
|
|
@@ -404,7 +394,8 @@ class V3CuaAgentHandler {
|
|
|
404
394
|
return { success: true };
|
|
405
395
|
}
|
|
406
396
|
case "screenshot": {
|
|
407
|
-
// No-op -
|
|
397
|
+
// No-op - the CUA client captures a screenshot itself after each
|
|
398
|
+
// computer_call (or batch of actions) for the next request.
|
|
408
399
|
return { success: true };
|
|
409
400
|
}
|
|
410
401
|
case "goto": {
|
|
@@ -512,9 +503,9 @@ class V3CuaAgentHandler {
|
|
|
512
503
|
async updateClientViewport() {
|
|
513
504
|
try {
|
|
514
505
|
// For Google CUA, use configured viewport for coordinate normalization
|
|
515
|
-
//
|
|
506
|
+
// Browserbase managed fingerprinting uses a fixed 1288x711 fallback.
|
|
516
507
|
if (this.agentClient instanceof GoogleCUAClient_js_1.GoogleCUAClient) {
|
|
517
|
-
const dims = this.v3.
|
|
508
|
+
const dims = this.v3.isVerified
|
|
518
509
|
? { width: 1288, height: 711 }
|
|
519
510
|
: this.v3.configuredViewport;
|
|
520
511
|
this.agentClient.setViewport(dims.width, dims.height);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3CuaAgentHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/v3CuaAgentHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { computeActiveElementXpath } from \"../understudy/a11y/snapshot/index.js\";\nimport { V3 } from \"../v3.js\";\nimport { ToolSet } from \"ai\";\nimport { AgentClient } from \"../agent/AgentClient.js\";\nimport { AgentProvider } from \"../agent/AgentProvider.js\";\nimport { GoogleCUAClient } from \"../agent/GoogleCUAClient.js\";\nimport { OpenAICUAClient } from \"../agent/OpenAICUAClient.js\";\nimport { mapKeyToPlaywright } from \"../agent/utils/cuaKeyMapping.js\";\nimport { ensureXPath } from \"../agent/utils/xpath.js\";\nimport {\n ActionExecutionResult,\n AgentAction,\n AgentExecuteOptions,\n AgentHandlerOptions,\n AgentResult,\n SafetyConfirmationHandler,\n} from \"../types/public/agent.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { type Action, V3FunctionName } from \"../types/public/methods.js\";\nimport { FlowLogger } from \"../flowlogger/FlowLogger.js\";\nimport { toTitleCase } from \"../../utils.js\";\nimport { StagehandClosedError } from \"../types/public/sdkErrors.js\";\nimport {\n CaptchaSolver,\n CAPTCHA_SOLVED_MSG,\n CAPTCHA_ERRORED_MSG,\n} from \"../agent/utils/captchaSolver.js\";\n\nexport class V3CuaAgentHandler {\n private v3: V3;\n private agent: AgentClient;\n private provider: AgentProvider;\n private logger: (message: LogLine) => void;\n private agentClient: AgentClient;\n private options: AgentHandlerOptions;\n private highlightCursor: boolean;\n private captchaSolver: CaptchaSolver | null = null;\n private captchaClickGuardRemaining = 0;\n private currentInstruction = \"\";\n\n constructor(\n v3: V3,\n logger: (message: LogLine) => void,\n options: AgentHandlerOptions,\n tools?: ToolSet,\n ) {\n this.v3 = v3;\n this.logger = logger;\n this.options = options;\n\n this.provider = new AgentProvider(logger);\n const client = this.provider.getClient(\n options.modelName,\n options.clientOptions || {},\n options.userProvidedInstructions,\n tools,\n );\n this.agentClient = client;\n this.setupAgentClient();\n this.agent = client;\n }\n\n /**\n * Ensures the V3 context is still available (not closed).\n * Throws StagehandClosedError if stagehand.close() was called.\n */\n private ensureNotClosed(): void {\n if (!this.v3.context) {\n throw new StagehandClosedError();\n }\n }\n\n private setupAgentClient(): void {\n // Provide screenshots to the agent client\n this.agentClient.setScreenshotProvider(async () => {\n this.ensureNotClosed();\n const page = await this.v3.context.awaitActivePage();\n const screenshotBuffer = await page.screenshot({ fullPage: false });\n return screenshotBuffer.toString(\"base64\"); // base64 png\n });\n\n // Provide action executor\n this.agentClient.setActionHandler(async (action) => {\n this.ensureNotClosed();\n\n // Wait for captcha solver to finish before executing action\n if (this.captchaSolver) {\n if (this.captchaSolver.isSolving()) {\n this.logger({\n category: \"agent\",\n message:\n \"Captcha detected — waiting for Browserbase to solve it before continuing\",\n level: 1,\n });\n }\n await this.captchaSolver.waitIfSolving();\n this.handleCaptchaSolveResult(this.captchaSolver.consumeSolveResult());\n }\n\n action.pageUrl = (await this.v3.context.awaitActivePage()).url();\n if (await this.shouldSkipSolvedCaptchaInteraction(action)) {\n this.captchaClickGuardRemaining = Math.max(\n 0,\n this.captchaClickGuardRemaining - 1,\n );\n this.agentClient.addContextNote(\n `The captcha has already been solved automatically. Do not click the captcha checkbox, widget, or challenge again. Continue with the original task outside the captcha area. Original task: ${this.currentInstruction}`,\n );\n this.logger({\n category: \"agent\",\n message:\n \"Skipped click on solved captcha widget — injected follow-up guidance\",\n level: 1,\n });\n return;\n }\n\n const defaultDelay = 500;\n const waitBetween =\n (this.options.clientOptions?.waitBetweenActions as number) ||\n defaultDelay;\n try {\n // Try to inject cursor before each action if enabled\n if (this.highlightCursor) {\n try {\n await this.injectCursor();\n } catch {\n // Ignore cursor injection failures\n }\n }\n await new Promise((r) => setTimeout(r, 300));\n // Skip logging for screenshot actions - they're no-ops, the actual\n // Page.screenshot in captureAndSendScreenshot() is logged separately\n const shouldLog = action.type !== \"screenshot\";\n if (shouldLog) {\n await FlowLogger.runWithLogging(\n {\n eventType: `V3Cua${toTitleCase(action.type)}`, // e.g. \"V3CuaClick\"\n data: {\n target: this.computePointerTarget(action),\n },\n },\n async (loggedAction: typeof action) =>\n await this.executeAction(loggedAction),\n [action],\n );\n } else {\n await this.executeAction(action);\n }\n\n action.timestamp = Date.now();\n\n await new Promise((r) => setTimeout(r, waitBetween));\n try {\n await this.captureAndSendScreenshot();\n } catch (e) {\n this.logger({\n category: \"agent\",\n message: `Warning: Failed to take screenshot after action: ${String(\n (e as Error)?.message ?? e,\n )}`,\n level: 1,\n });\n }\n } catch (error) {\n const msg = (error as Error)?.message ?? String(error);\n this.logger({\n category: \"agent\",\n message: `Error executing action ${action.type}: ${msg}`,\n level: 0,\n });\n throw error;\n }\n });\n\n void this.updateClientViewport();\n void this.updateClientUrl();\n }\n\n setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void {\n if (\n this.agentClient instanceof GoogleCUAClient ||\n this.agentClient instanceof OpenAICUAClient\n ) {\n this.agentClient.setSafetyConfirmationHandler(handler);\n }\n }\n\n async execute(\n optionsOrInstruction: AgentExecuteOptions | string,\n ): Promise<AgentResult> {\n const options =\n typeof optionsOrInstruction === \"string\"\n ? { instruction: optionsOrInstruction }\n : optionsOrInstruction;\n\n this.setSafetyConfirmationHandler(options.callbacks?.onSafetyConfirmation);\n\n this.highlightCursor = options.highlightCursor !== false;\n this.currentInstruction = options.instruction;\n\n // Redirect if blank\n const page = await this.v3.context.awaitActivePage();\n const currentUrl = page.url();\n if (!currentUrl || currentUrl === \"about:blank\") {\n this.logger({\n category: \"agent\",\n message: `Page URL is empty. Navigating to https://www.google.com ...`,\n level: 1,\n });\n await page.goto(\"https://www.google.com\", { waitUntil: \"load\" });\n }\n\n // Set up captcha solver for Browserbase environments\n if (this.v3.isCaptchaAutoSolveEnabled) {\n this.captchaSolver = new CaptchaSolver();\n this.captchaSolver.init(() => this.v3.context.awaitActivePage());\n\n // Block the CUA agent loop before each step while a captcha is being solved\n this.agentClient.setPreStepHook(async () => {\n if (this.captchaSolver?.isSolving()) {\n this.logger({\n category: \"agent\",\n message:\n \"Captcha detected — waiting for Browserbase to solve it before continuing\",\n level: 1,\n });\n }\n await this.captchaSolver?.waitIfSolving();\n this.handleCaptchaSolveResult(this.captchaSolver?.consumeSolveResult());\n });\n }\n\n if (this.highlightCursor) {\n try {\n await this.injectCursor();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger({\n category: \"agent\",\n message: `Warning: Failed to inject cursor: ${errorMessage}. Continuing with execution.`,\n level: 1,\n });\n // Continue execution even if cursor injection fails\n }\n }\n\n const start = Date.now();\n let result: AgentResult;\n try {\n result = await this.agent.execute({ options, logger: this.logger });\n } finally {\n this.captchaSolver?.dispose();\n this.captchaSolver = null;\n }\n const inferenceTimeMs = Date.now() - start;\n if (result.usage) {\n this.v3.updateMetrics(\n V3FunctionName.AGENT,\n result.usage.input_tokens,\n result.usage.output_tokens,\n result.usage.reasoning_tokens ?? 0,\n result.usage.cached_input_tokens ?? 0,\n inferenceTimeMs,\n );\n }\n return result;\n }\n\n private async executeAction(\n action: AgentAction,\n ): Promise<ActionExecutionResult> {\n const page = await this.v3.context.awaitActivePage();\n const recording = this.v3.isAgentReplayActive();\n switch (action.type) {\n case \"click\": {\n const { x, y, button = \"left\", clickCount } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: (button as \"left\" | \"right\" | \"middle\") ?? \"left\",\n clickCount: (clickCount as number) ?? 1,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"click\", x, y),\n method: \"click\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n button: (button as \"left\" | \"right\" | \"middle\") ?? \"left\",\n clickCount: (clickCount as number) ?? 1,\n });\n }\n return { success: true };\n }\n case \"double_click\":\n case \"doubleClick\": {\n const { x, y } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 2,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"double click\", x, y),\n method: \"doubleClick\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 2,\n });\n }\n return { success: true };\n }\n case \"tripleClick\": {\n const { x, y } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 3,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"triple click\", x, y),\n method: \"tripleClick\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n clickCount: 3,\n });\n }\n return { success: true };\n }\n case \"type\": {\n const { text } = action;\n await page.type(String(text ?? \"\"));\n if (recording) {\n const xpath = await computeActiveElementXpath(page);\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describeTypeAction(String(text ?? \"\")),\n method: \"type\",\n arguments: [String(text ?? \"\")],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n }\n return { success: true };\n }\n case \"keypress\": {\n const { keys } = action;\n const keyList = Array.isArray(keys) ? keys : [keys];\n const stagehandActions: Action[] = [];\n for (const rawKey of keyList) {\n const mapped = mapKeyToPlaywright(String(rawKey ?? \"\"));\n await page.keyPress(mapped);\n if (recording) {\n stagehandActions.push({\n selector: \"xpath=/html\",\n description: `press ${mapped}`,\n method: \"press\",\n arguments: [mapped],\n });\n }\n }\n if (recording && stagehandActions.length > 0) {\n this.recordCuaActStep(\n action,\n stagehandActions,\n stagehandActions\n .map((a) => a.description)\n .filter(Boolean)\n .join(\", \") || \"keypress\",\n );\n }\n return { success: true };\n }\n case \"scroll\": {\n const { x, y, scroll_x = 0, scroll_y = 0 } = action;\n await page.scroll(\n (x as number) ?? 0,\n (y as number) ?? 0,\n (scroll_x as number) ?? 0,\n (scroll_y as number) ?? 0,\n );\n this.v3.recordAgentReplayStep({\n type: \"scroll\",\n deltaX: Number(scroll_x ?? 0),\n deltaY: Number(scroll_y ?? 0),\n anchor:\n typeof x === \"number\" && typeof y === \"number\"\n ? { x: Math.round(x), y: Math.round(y) }\n : undefined,\n });\n return { success: true };\n }\n case \"drag\": {\n const { path } = action;\n if (Array.isArray(path) && path.length >= 2) {\n const start = path[0];\n const end = path[path.length - 1];\n if (recording) {\n const xps = await page.dragAndDrop(start.x, start.y, end.x, end.y, {\n steps: Math.min(20, Math.max(5, path.length)),\n delay: 10,\n returnXpath: true,\n });\n const [fromXpath, toXpath] = (xps as [string, string]) || [\"\", \"\"];\n const from = ensureXPath(fromXpath);\n const to = ensureXPath(toXpath);\n if (from && to) {\n const stagehandAction: Action = {\n selector: from,\n description: this.describeDragAction(),\n method: \"dragAndDrop\",\n arguments: [to],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.dragAndDrop(start.x, start.y, end.x, end.y, {\n steps: Math.min(20, Math.max(5, path.length)),\n delay: 10,\n });\n }\n }\n return { success: true };\n }\n case \"move\": {\n const { x, y } = action;\n if (typeof x === \"number\" && typeof y === \"number\") {\n if (recording) {\n const xpath = await page.hover(x, y, { returnXpath: true });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"hover\", x, y),\n method: \"hover\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.hover(x, y);\n }\n }\n return { success: true };\n }\n case \"wait\": {\n const time = action?.timeMs ?? 1000;\n await new Promise((r) => setTimeout(r, time));\n if (time > 0 && recording) {\n this.v3.recordAgentReplayStep({ type: \"wait\", timeMs: Number(time) });\n }\n return { success: true };\n }\n case \"screenshot\": {\n // No-op - screenshot is captured by captureAndSendScreenshot() after all actions\n return { success: true };\n }\n case \"goto\": {\n const { url } = action;\n await page.goto(String(url ?? \"\"), { waitUntil: \"load\" });\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"goto\",\n url: String(url ?? \"\"),\n });\n }\n return { success: true };\n }\n case \"back\": {\n await page.goBack();\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"back\",\n });\n }\n return { success: true };\n }\n case \"forward\": {\n await page.goForward();\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"forward\",\n });\n }\n return { success: true };\n }\n case \"open_web_browser\": {\n // Browser is already open, this is a no-op\n return { success: true };\n }\n case \"custom_tool\": {\n // Custom tools are handled by the agent client directly\n return { success: true };\n }\n default:\n this.logger({\n category: \"agent\",\n message: `Unknown action type: ${String(action.type)}`,\n level: 1,\n });\n return {\n success: false,\n error: `Unknown action ${String(action.type)}`,\n };\n }\n }\n\n // helper to make pointer target human-readable for logging\n private computePointerTarget(action: AgentAction): string | undefined {\n return typeof action.x === \"number\" && typeof action.y === \"number\"\n ? `(${action.x}, ${action.y})`\n : typeof action.selector === \"string\"\n ? action.selector\n : typeof action.input === \"string\"\n ? action.input\n : typeof action.description === \"string\"\n ? action.description\n : undefined;\n }\n\n private describePointerAction(kind: string, x: unknown, y: unknown): string {\n const nx = Number(x);\n const ny = Number(y);\n if (Number.isFinite(nx) && Number.isFinite(ny)) {\n return `${kind} at (${Math.round(nx)}, ${Math.round(ny)})`;\n }\n return kind;\n }\n\n private describeTypeAction(text: string): string {\n const snippet = text.length > 30 ? `${text.slice(0, 27)}...` : text;\n return `type \"${snippet}\"`;\n }\n\n private describeDragAction(): string {\n return \"drag and drop\";\n }\n\n private buildInstructionFallback(\n agentAction: AgentAction,\n fallback: string,\n ): string {\n const raw =\n (typeof agentAction.action === \"string\" && agentAction.action.trim()) ||\n (typeof agentAction.reasoning === \"string\" &&\n agentAction.reasoning.trim());\n return raw && raw.length > 0 ? raw : fallback;\n }\n\n private recordCuaActStep(\n agentAction: AgentAction,\n stagehandActions: Action[],\n fallback: string,\n ): void {\n if (!stagehandActions.length) return;\n const instruction = this.buildInstructionFallback(agentAction, fallback);\n const description = stagehandActions[0]?.description || instruction;\n const actions = stagehandActions.map((act) => ({\n ...act,\n description: act.description || description,\n }));\n this.v3.recordAgentReplayStep({\n type: \"act\",\n instruction,\n actions,\n actionDescription: description,\n message:\n typeof agentAction.reasoning === \"string\" &&\n agentAction.reasoning.trim().length > 0\n ? agentAction.reasoning.trim()\n : undefined,\n });\n }\n\n private async updateClientViewport(): Promise<void> {\n try {\n // For Google CUA, use configured viewport for coordinate normalization\n // advancedStealth uses fixed 1288x711, otherwise use configured viewport\n if (this.agentClient instanceof GoogleCUAClient) {\n const dims = this.v3.isAdvancedStealth\n ? { width: 1288, height: 711 }\n : this.v3.configuredViewport;\n this.agentClient.setViewport(dims.width, dims.height);\n } else {\n // For other clients, use actual window dimensions\n const page = await this.v3.context.awaitActivePage();\n const { w, h } = await page.mainFrame().evaluate<{\n w: number;\n h: number;\n }>(\"({ w: window.innerWidth, h: window.innerHeight })\");\n if (w && h) this.agentClient.setViewport(w, h);\n }\n } catch {\n //\n }\n }\n\n private async updateClientUrl(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n const url = page.url();\n this.agentClient.setCurrentUrl(url);\n } catch {\n //\n }\n }\n\n async captureAndSendScreenshot(): Promise<unknown> {\n this.logger({\n category: \"agent\",\n message: \"Capturing screenshot\",\n level: 1,\n });\n try {\n const page = await this.v3.context.awaitActivePage();\n const screenshotBuffer = await page.screenshot({ fullPage: false });\n\n const currentUrl = page.url();\n return await this.agentClient.captureScreenshot({\n base64Image: screenshotBuffer.toString(\"base64\"),\n currentUrl,\n });\n } catch (e) {\n this.logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String((e as Error)?.message ?? e)}`,\n level: 0,\n });\n return null;\n }\n }\n\n private handleCaptchaSolveResult(result?: {\n solved: boolean;\n errored: boolean;\n }): void {\n if (!result) return;\n\n if (result.solved) {\n this.captchaClickGuardRemaining = 3;\n this.agentClient.addContextNote(CAPTCHA_SOLVED_MSG);\n this.logger({\n category: \"agent\",\n message: \"Captcha solved — continuing with task\",\n level: 1,\n });\n }\n\n if (result.errored) {\n this.captchaClickGuardRemaining = 0;\n this.agentClient.addContextNote(CAPTCHA_ERRORED_MSG);\n this.logger({\n category: \"agent\",\n message: \"Captcha solver failed or errored\",\n level: 1,\n });\n }\n }\n\n private async shouldSkipSolvedCaptchaInteraction(\n action: AgentAction,\n ): Promise<boolean> {\n if (this.captchaClickGuardRemaining <= 0) {\n return false;\n }\n\n if (action.type !== \"click\") {\n return false;\n }\n\n const x = action.x;\n const y = action.y;\n if (typeof x !== \"number\" || typeof y !== \"number\") {\n return false;\n }\n\n try {\n const page = await this.v3.context.awaitActivePage();\n const boxes = await page.evaluate<\n Array<{ left: number; top: number; right: number; bottom: number }>\n >(() => {\n const selectors = [\n 'iframe[title*=\"reCAPTCHA\"]',\n 'iframe[src*=\"recaptcha\"]',\n 'iframe[src*=\"hcaptcha\"]',\n 'iframe[src*=\"turnstile\"]',\n \".g-recaptcha\",\n \"[data-sitekey]\",\n '[class*=\"captcha\"]',\n '[id*=\"captcha\"]',\n ];\n\n const seen = new Set<Element>();\n const bounds: Array<{\n left: number;\n top: number;\n right: number;\n bottom: number;\n }> = [];\n\n for (const selector of selectors) {\n for (const element of document.querySelectorAll(selector)) {\n if (seen.has(element)) continue;\n seen.add(element);\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) continue;\n bounds.push({\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n });\n }\n }\n\n return bounds;\n });\n\n return boxes.some(\n (box) =>\n x >= box.left && x <= box.right && y >= box.top && y <= box.bottom,\n );\n } catch {\n return false;\n }\n }\n\n private async injectCursor(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay();\n } catch {\n // Best-effort only\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"v3CuaAgentHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/v3CuaAgentHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { computeActiveElementXpath } from \"../understudy/a11y/snapshot/index.js\";\nimport { V3 } from \"../v3.js\";\nimport { ToolSet } from \"ai\";\nimport { AgentClient } from \"../agent/AgentClient.js\";\nimport { AgentProvider } from \"../agent/AgentProvider.js\";\nimport { GoogleCUAClient } from \"../agent/GoogleCUAClient.js\";\nimport { OpenAICUAClient } from \"../agent/OpenAICUAClient.js\";\nimport { mapKeyToPlaywright } from \"../agent/utils/cuaKeyMapping.js\";\nimport { ensureXPath } from \"../agent/utils/xpath.js\";\nimport {\n ActionExecutionResult,\n AgentAction,\n AgentExecuteOptions,\n AgentHandlerOptions,\n AgentResult,\n SafetyConfirmationHandler,\n} from \"../types/public/agent.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { type Action, V3FunctionName } from \"../types/public/methods.js\";\nimport { FlowLogger } from \"../flowlogger/FlowLogger.js\";\nimport { toTitleCase } from \"../../utils.js\";\nimport { StagehandClosedError } from \"../types/public/sdkErrors.js\";\nimport {\n CaptchaSolver,\n CAPTCHA_SOLVED_MSG,\n CAPTCHA_ERRORED_MSG,\n} from \"../agent/utils/captchaSolver.js\";\n\nexport class V3CuaAgentHandler {\n private v3: V3;\n private agent: AgentClient;\n private provider: AgentProvider;\n private logger: (message: LogLine) => void;\n private agentClient: AgentClient;\n private options: AgentHandlerOptions;\n private highlightCursor: boolean;\n private captchaSolver: CaptchaSolver | null = null;\n private captchaClickGuardRemaining = 0;\n private currentInstruction = \"\";\n\n constructor(\n v3: V3,\n logger: (message: LogLine) => void,\n options: AgentHandlerOptions,\n tools?: ToolSet,\n ) {\n this.v3 = v3;\n this.logger = logger;\n this.options = options;\n\n this.provider = new AgentProvider(logger);\n const client = this.provider.getClient(\n options.modelName,\n options.clientOptions || {},\n options.userProvidedInstructions,\n tools,\n );\n this.agentClient = client;\n this.setupAgentClient();\n this.agent = client;\n }\n\n /**\n * Ensures the V3 context is still available (not closed).\n * Throws StagehandClosedError if stagehand.close() was called.\n */\n private ensureNotClosed(): void {\n if (!this.v3.context) {\n throw new StagehandClosedError();\n }\n }\n\n private setupAgentClient(): void {\n // Provide screenshots to the agent client\n this.agentClient.setScreenshotProvider(async () => {\n this.ensureNotClosed();\n const page = await this.v3.context.awaitActivePage();\n const screenshotBuffer = await page.screenshot({ fullPage: false });\n return screenshotBuffer.toString(\"base64\"); // base64 png\n });\n\n // Provide action executor\n this.agentClient.setActionHandler(async (action) => {\n this.ensureNotClosed();\n\n // Wait for captcha solver to finish before executing action\n if (this.captchaSolver) {\n if (this.captchaSolver.isSolving()) {\n this.logger({\n category: \"agent\",\n message:\n \"Captcha detected — waiting for Browserbase to solve it before continuing\",\n level: 1,\n });\n }\n await this.captchaSolver.waitIfSolving();\n this.handleCaptchaSolveResult(this.captchaSolver.consumeSolveResult());\n }\n\n action.pageUrl = (await this.v3.context.awaitActivePage()).url();\n if (await this.shouldSkipSolvedCaptchaInteraction(action)) {\n this.captchaClickGuardRemaining = Math.max(\n 0,\n this.captchaClickGuardRemaining - 1,\n );\n this.agentClient.addContextNote(\n `The captcha has already been solved automatically. Do not click the captcha checkbox, widget, or challenge again. Continue with the original task outside the captcha area. Original task: ${this.currentInstruction}`,\n );\n this.logger({\n category: \"agent\",\n message:\n \"Skipped click on solved captcha widget — injected follow-up guidance\",\n level: 1,\n });\n return;\n }\n\n const defaultDelay = 500;\n const waitBetween =\n (this.options.clientOptions?.waitBetweenActions as number) ||\n defaultDelay;\n try {\n // Try to inject cursor before each action if enabled\n if (this.highlightCursor) {\n try {\n await this.injectCursor();\n } catch {\n // Ignore cursor injection failures\n }\n }\n await new Promise((r) => setTimeout(r, 300));\n // Skip logging for screenshot actions - they're no-ops; the CUA client\n // takes its own screenshot via screenshotProvider between API turns.\n const shouldLog = action.type !== \"screenshot\";\n if (shouldLog) {\n await FlowLogger.runWithLogging(\n {\n eventType: `V3Cua${toTitleCase(action.type)}`, // e.g. \"V3CuaClick\"\n data: {\n target: this.computePointerTarget(action),\n },\n },\n async (loggedAction: typeof action) =>\n await this.executeAction(loggedAction),\n [action],\n );\n } else {\n await this.executeAction(action);\n }\n\n action.timestamp = Date.now();\n\n await new Promise((r) => setTimeout(r, waitBetween));\n } catch (error) {\n const msg = (error as Error)?.message ?? String(error);\n this.logger({\n category: \"agent\",\n message: `Error executing action ${action.type}: ${msg}`,\n level: 0,\n });\n throw error;\n }\n });\n\n void this.updateClientViewport();\n void this.updateClientUrl();\n }\n\n setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void {\n if (\n this.agentClient instanceof GoogleCUAClient ||\n this.agentClient instanceof OpenAICUAClient\n ) {\n this.agentClient.setSafetyConfirmationHandler(handler);\n }\n }\n\n async execute(\n optionsOrInstruction: AgentExecuteOptions | string,\n ): Promise<AgentResult> {\n const options =\n typeof optionsOrInstruction === \"string\"\n ? { instruction: optionsOrInstruction }\n : optionsOrInstruction;\n\n this.setSafetyConfirmationHandler(options.callbacks?.onSafetyConfirmation);\n\n this.highlightCursor = options.highlightCursor !== false;\n this.currentInstruction = options.instruction;\n\n // Redirect if blank\n const page = await this.v3.context.awaitActivePage();\n const currentUrl = page.url();\n if (!currentUrl || currentUrl === \"about:blank\") {\n this.logger({\n category: \"agent\",\n message: `Page URL is empty. Navigating to https://www.google.com ...`,\n level: 1,\n });\n await page.goto(\"https://www.google.com\", { waitUntil: \"load\" });\n }\n\n // Set up captcha solver for Browserbase environments\n if (this.v3.isCaptchaAutoSolveEnabled) {\n this.captchaSolver = new CaptchaSolver();\n this.captchaSolver.init(() => this.v3.context.awaitActivePage());\n\n // Block the CUA agent loop before each step while a captcha is being solved\n this.agentClient.setPreStepHook(async () => {\n if (this.captchaSolver?.isSolving()) {\n this.logger({\n category: \"agent\",\n message:\n \"Captcha detected — waiting for Browserbase to solve it before continuing\",\n level: 1,\n });\n }\n await this.captchaSolver?.waitIfSolving();\n this.handleCaptchaSolveResult(this.captchaSolver?.consumeSolveResult());\n });\n }\n\n if (this.highlightCursor) {\n try {\n await this.injectCursor();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger({\n category: \"agent\",\n message: `Warning: Failed to inject cursor: ${errorMessage}. Continuing with execution.`,\n level: 1,\n });\n // Continue execution even if cursor injection fails\n }\n }\n\n const start = Date.now();\n let result: AgentResult;\n try {\n result = await this.agent.execute({ options, logger: this.logger });\n } finally {\n this.captchaSolver?.dispose();\n this.captchaSolver = null;\n }\n const inferenceTimeMs = Date.now() - start;\n if (result.usage) {\n this.v3.updateMetrics(\n V3FunctionName.AGENT,\n result.usage.input_tokens,\n result.usage.output_tokens,\n result.usage.reasoning_tokens ?? 0,\n result.usage.cached_input_tokens ?? 0,\n inferenceTimeMs,\n );\n }\n return result;\n }\n\n private async executeAction(\n action: AgentAction,\n ): Promise<ActionExecutionResult> {\n const page = await this.v3.context.awaitActivePage();\n const recording = this.v3.isAgentReplayActive();\n switch (action.type) {\n case \"click\": {\n const { x, y, button = \"left\", clickCount } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: (button as \"left\" | \"right\" | \"middle\") ?? \"left\",\n clickCount: (clickCount as number) ?? 1,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"click\", x, y),\n method: \"click\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n button: (button as \"left\" | \"right\" | \"middle\") ?? \"left\",\n clickCount: (clickCount as number) ?? 1,\n });\n }\n return { success: true };\n }\n case \"double_click\":\n case \"doubleClick\": {\n const { x, y } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 2,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"double click\", x, y),\n method: \"doubleClick\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 2,\n });\n }\n return { success: true };\n }\n case \"tripleClick\": {\n const { x, y } = action;\n if (recording) {\n const xpath = await page.click(x as number, y as number, {\n button: \"left\",\n clickCount: 3,\n returnXpath: true,\n });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"triple click\", x, y),\n method: \"tripleClick\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.click(x as number, y as number, {\n clickCount: 3,\n });\n }\n return { success: true };\n }\n case \"type\": {\n const { text } = action;\n await page.type(String(text ?? \"\"));\n if (recording) {\n const xpath = await computeActiveElementXpath(page);\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describeTypeAction(String(text ?? \"\")),\n method: \"type\",\n arguments: [String(text ?? \"\")],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n }\n return { success: true };\n }\n case \"keypress\": {\n const { keys } = action;\n const keyList = Array.isArray(keys) ? keys : [keys];\n const stagehandActions: Action[] = [];\n for (const rawKey of keyList) {\n const mapped = mapKeyToPlaywright(String(rawKey ?? \"\"));\n await page.keyPress(mapped);\n if (recording) {\n stagehandActions.push({\n selector: \"xpath=/html\",\n description: `press ${mapped}`,\n method: \"press\",\n arguments: [mapped],\n });\n }\n }\n if (recording && stagehandActions.length > 0) {\n this.recordCuaActStep(\n action,\n stagehandActions,\n stagehandActions\n .map((a) => a.description)\n .filter(Boolean)\n .join(\", \") || \"keypress\",\n );\n }\n return { success: true };\n }\n case \"scroll\": {\n const { x, y, scroll_x = 0, scroll_y = 0 } = action;\n await page.scroll(\n (x as number) ?? 0,\n (y as number) ?? 0,\n (scroll_x as number) ?? 0,\n (scroll_y as number) ?? 0,\n );\n this.v3.recordAgentReplayStep({\n type: \"scroll\",\n deltaX: Number(scroll_x ?? 0),\n deltaY: Number(scroll_y ?? 0),\n anchor:\n typeof x === \"number\" && typeof y === \"number\"\n ? { x: Math.round(x), y: Math.round(y) }\n : undefined,\n });\n return { success: true };\n }\n case \"drag\": {\n const { path } = action;\n if (Array.isArray(path) && path.length >= 2) {\n const start = path[0];\n const end = path[path.length - 1];\n if (recording) {\n const xps = await page.dragAndDrop(start.x, start.y, end.x, end.y, {\n steps: Math.min(20, Math.max(5, path.length)),\n delay: 10,\n returnXpath: true,\n });\n const [fromXpath, toXpath] = (xps as [string, string]) || [\"\", \"\"];\n const from = ensureXPath(fromXpath);\n const to = ensureXPath(toXpath);\n if (from && to) {\n const stagehandAction: Action = {\n selector: from,\n description: this.describeDragAction(),\n method: \"dragAndDrop\",\n arguments: [to],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.dragAndDrop(start.x, start.y, end.x, end.y, {\n steps: Math.min(20, Math.max(5, path.length)),\n delay: 10,\n });\n }\n }\n return { success: true };\n }\n case \"move\": {\n const { x, y } = action;\n if (typeof x === \"number\" && typeof y === \"number\") {\n if (recording) {\n const xpath = await page.hover(x, y, { returnXpath: true });\n const normalized = ensureXPath(xpath);\n if (normalized) {\n const stagehandAction: Action = {\n selector: normalized,\n description: this.describePointerAction(\"hover\", x, y),\n method: \"hover\",\n arguments: [],\n };\n this.recordCuaActStep(\n action,\n [stagehandAction],\n stagehandAction.description,\n );\n }\n } else {\n await page.hover(x, y);\n }\n }\n return { success: true };\n }\n case \"wait\": {\n const time = action?.timeMs ?? 1000;\n await new Promise((r) => setTimeout(r, time));\n if (time > 0 && recording) {\n this.v3.recordAgentReplayStep({ type: \"wait\", timeMs: Number(time) });\n }\n return { success: true };\n }\n case \"screenshot\": {\n // No-op - the CUA client captures a screenshot itself after each\n // computer_call (or batch of actions) for the next request.\n return { success: true };\n }\n case \"goto\": {\n const { url } = action;\n await page.goto(String(url ?? \"\"), { waitUntil: \"load\" });\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"goto\",\n url: String(url ?? \"\"),\n });\n }\n return { success: true };\n }\n case \"back\": {\n await page.goBack();\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"back\",\n });\n }\n return { success: true };\n }\n case \"forward\": {\n await page.goForward();\n if (recording) {\n this.v3.recordAgentReplayStep({\n type: \"forward\",\n });\n }\n return { success: true };\n }\n case \"open_web_browser\": {\n // Browser is already open, this is a no-op\n return { success: true };\n }\n case \"custom_tool\": {\n // Custom tools are handled by the agent client directly\n return { success: true };\n }\n default:\n this.logger({\n category: \"agent\",\n message: `Unknown action type: ${String(action.type)}`,\n level: 1,\n });\n return {\n success: false,\n error: `Unknown action ${String(action.type)}`,\n };\n }\n }\n\n // helper to make pointer target human-readable for logging\n private computePointerTarget(action: AgentAction): string | undefined {\n return typeof action.x === \"number\" && typeof action.y === \"number\"\n ? `(${action.x}, ${action.y})`\n : typeof action.selector === \"string\"\n ? action.selector\n : typeof action.input === \"string\"\n ? action.input\n : typeof action.description === \"string\"\n ? action.description\n : undefined;\n }\n\n private describePointerAction(kind: string, x: unknown, y: unknown): string {\n const nx = Number(x);\n const ny = Number(y);\n if (Number.isFinite(nx) && Number.isFinite(ny)) {\n return `${kind} at (${Math.round(nx)}, ${Math.round(ny)})`;\n }\n return kind;\n }\n\n private describeTypeAction(text: string): string {\n const snippet = text.length > 30 ? `${text.slice(0, 27)}...` : text;\n return `type \"${snippet}\"`;\n }\n\n private describeDragAction(): string {\n return \"drag and drop\";\n }\n\n private buildInstructionFallback(\n agentAction: AgentAction,\n fallback: string,\n ): string {\n const raw =\n (typeof agentAction.action === \"string\" && agentAction.action.trim()) ||\n (typeof agentAction.reasoning === \"string\" &&\n agentAction.reasoning.trim());\n return raw && raw.length > 0 ? raw : fallback;\n }\n\n private recordCuaActStep(\n agentAction: AgentAction,\n stagehandActions: Action[],\n fallback: string,\n ): void {\n if (!stagehandActions.length) return;\n const instruction = this.buildInstructionFallback(agentAction, fallback);\n const description = stagehandActions[0]?.description || instruction;\n const actions = stagehandActions.map((act) => ({\n ...act,\n description: act.description || description,\n }));\n this.v3.recordAgentReplayStep({\n type: \"act\",\n instruction,\n actions,\n actionDescription: description,\n message:\n typeof agentAction.reasoning === \"string\" &&\n agentAction.reasoning.trim().length > 0\n ? agentAction.reasoning.trim()\n : undefined,\n });\n }\n\n private async updateClientViewport(): Promise<void> {\n try {\n // For Google CUA, use configured viewport for coordinate normalization\n // Browserbase managed fingerprinting uses a fixed 1288x711 fallback.\n if (this.agentClient instanceof GoogleCUAClient) {\n const dims = this.v3.isVerified\n ? { width: 1288, height: 711 }\n : this.v3.configuredViewport;\n this.agentClient.setViewport(dims.width, dims.height);\n } else {\n // For other clients, use actual window dimensions\n const page = await this.v3.context.awaitActivePage();\n const { w, h } = await page.mainFrame().evaluate<{\n w: number;\n h: number;\n }>(\"({ w: window.innerWidth, h: window.innerHeight })\");\n if (w && h) this.agentClient.setViewport(w, h);\n }\n } catch {\n //\n }\n }\n\n private async updateClientUrl(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n const url = page.url();\n this.agentClient.setCurrentUrl(url);\n } catch {\n //\n }\n }\n\n async captureAndSendScreenshot(): Promise<unknown> {\n this.logger({\n category: \"agent\",\n message: \"Capturing screenshot\",\n level: 1,\n });\n try {\n const page = await this.v3.context.awaitActivePage();\n const screenshotBuffer = await page.screenshot({ fullPage: false });\n\n const currentUrl = page.url();\n return await this.agentClient.captureScreenshot({\n base64Image: screenshotBuffer.toString(\"base64\"),\n currentUrl,\n });\n } catch (e) {\n this.logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String((e as Error)?.message ?? e)}`,\n level: 0,\n });\n return null;\n }\n }\n\n private handleCaptchaSolveResult(result?: {\n solved: boolean;\n errored: boolean;\n }): void {\n if (!result) return;\n\n if (result.solved) {\n this.captchaClickGuardRemaining = 3;\n this.agentClient.addContextNote(CAPTCHA_SOLVED_MSG);\n this.logger({\n category: \"agent\",\n message: \"Captcha solved — continuing with task\",\n level: 1,\n });\n }\n\n if (result.errored) {\n this.captchaClickGuardRemaining = 0;\n this.agentClient.addContextNote(CAPTCHA_ERRORED_MSG);\n this.logger({\n category: \"agent\",\n message: \"Captcha solver failed or errored\",\n level: 1,\n });\n }\n }\n\n private async shouldSkipSolvedCaptchaInteraction(\n action: AgentAction,\n ): Promise<boolean> {\n if (this.captchaClickGuardRemaining <= 0) {\n return false;\n }\n\n if (action.type !== \"click\") {\n return false;\n }\n\n const x = action.x;\n const y = action.y;\n if (typeof x !== \"number\" || typeof y !== \"number\") {\n return false;\n }\n\n try {\n const page = await this.v3.context.awaitActivePage();\n const boxes = await page.evaluate<\n Array<{ left: number; top: number; right: number; bottom: number }>\n >(() => {\n const selectors = [\n 'iframe[title*=\"reCAPTCHA\"]',\n 'iframe[src*=\"recaptcha\"]',\n 'iframe[src*=\"hcaptcha\"]',\n 'iframe[src*=\"turnstile\"]',\n \".g-recaptcha\",\n \"[data-sitekey]\",\n '[class*=\"captcha\"]',\n '[id*=\"captcha\"]',\n ];\n\n const seen = new Set<Element>();\n const bounds: Array<{\n left: number;\n top: number;\n right: number;\n bottom: number;\n }> = [];\n\n for (const selector of selectors) {\n for (const element of document.querySelectorAll(selector)) {\n if (seen.has(element)) continue;\n seen.add(element);\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) continue;\n bounds.push({\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n });\n }\n }\n\n return bounds;\n });\n\n return boxes.some(\n (box) =>\n x >= box.left && x <= box.right && y >= box.top && y <= box.bottom,\n );\n } catch {\n return false;\n }\n }\n\n private async injectCursor(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay();\n } catch {\n // Best-effort only\n }\n }\n}\n"]}
|
|
@@ -57,7 +57,7 @@ declare const StagehandDefault: {
|
|
|
57
57
|
Api: typeof PublicApi.Api;
|
|
58
58
|
AISdkClient: typeof PublicApi.AISdkClient;
|
|
59
59
|
CustomOpenAIClient: typeof PublicApi.CustomOpenAIClient;
|
|
60
|
-
AVAILABLE_CUA_MODELS: readonly ["openai/computer-use-preview", "openai/computer-use-preview-2025-03-11", "anthropic/claude-opus-4-5-20251101", "anthropic/claude-opus-4-6", "anthropic/claude-sonnet-4-6", "anthropic/claude-haiku-4-5-20251001", "anthropic/claude-sonnet-4-20250514", "anthropic/claude-sonnet-4-5-20250929", "google/gemini-2.5-computer-use-preview-10-2025", "google/gemini-3-flash-preview", "google/gemini-3-pro-preview", "microsoft/fara-7b"];
|
|
60
|
+
AVAILABLE_CUA_MODELS: readonly ["openai/gpt-5.4", "openai/computer-use-preview", "openai/computer-use-preview-2025-03-11", "anthropic/claude-opus-4-5-20251101", "anthropic/claude-opus-4-6", "anthropic/claude-sonnet-4-6", "anthropic/claude-haiku-4-5-20251001", "anthropic/claude-sonnet-4-20250514", "anthropic/claude-sonnet-4-5-20250929", "google/gemini-2.5-computer-use-preview-10-2025", "google/gemini-3-flash-preview", "google/gemini-3-pro-preview", "microsoft/fara-7b"];
|
|
61
61
|
StagehandAPIError: typeof PublicApi.StagehandAPIError;
|
|
62
62
|
StagehandAPIUnauthorizedError: typeof PublicApi.StagehandAPIUnauthorizedError;
|
|
63
63
|
StagehandHttpError: typeof PublicApi.StagehandHttpError;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
import type { LanguageModelV2Middleware } from "@ai-sdk/provider";
|
|
1
2
|
import { LogLine } from "../types/public/logs.js";
|
|
2
3
|
import { AvailableModel, ClientOptions, ModelProvider } from "../types/public/model.js";
|
|
3
4
|
import { LLMClient } from "./LLMClient.js";
|
|
4
|
-
export declare function getAISDKLanguageModel(subProvider: string, subModelName: string, clientOptions?: ClientOptions): import("@ai-sdk/provider").LanguageModelV2;
|
|
5
|
+
export declare function getAISDKLanguageModel(subProvider: string, subModelName: string, clientOptions?: ClientOptions, middleware?: LanguageModelV2Middleware): import("@ai-sdk/provider").LanguageModelV2;
|
|
5
6
|
export declare class LLMProvider {
|
|
6
7
|
private logger;
|
|
7
|
-
|
|
8
|
+
private middleware?;
|
|
9
|
+
constructor(logger: (message: LogLine) => void, middleware?: LanguageModelV2Middleware);
|
|
8
10
|
getClient(modelName: AvailableModel, clientOptions?: ClientOptions, options?: {
|
|
9
11
|
experimental?: boolean;
|
|
10
12
|
disableAPI?: boolean;
|
|
13
|
+
middleware?: LanguageModelV2Middleware;
|
|
11
14
|
}): LLMClient;
|
|
12
15
|
static getModelProvider(modelName: AvailableModel): ModelProvider;
|
|
13
16
|
}
|
|
@@ -87,30 +87,36 @@ const modelToProviderMap = {
|
|
|
87
87
|
"gemini-2.5-flash-preview-04-17": "google",
|
|
88
88
|
"gemini-2.5-pro-preview-03-25": "google",
|
|
89
89
|
};
|
|
90
|
-
function getAISDKLanguageModel(subProvider, subModelName, clientOptions) {
|
|
90
|
+
function getAISDKLanguageModel(subProvider, subModelName, clientOptions, middleware) {
|
|
91
91
|
const hasValidOptions = clientOptions &&
|
|
92
92
|
Object.values(clientOptions).some((v) => v !== undefined && v !== null);
|
|
93
|
+
let model;
|
|
93
94
|
if (hasValidOptions) {
|
|
94
95
|
const creator = AISDKProvidersWithAPIKey[subProvider];
|
|
95
96
|
if (!creator) {
|
|
96
97
|
throw new sdkErrors_js_1.UnsupportedAISDKModelProviderError(subProvider, Object.keys(AISDKProvidersWithAPIKey));
|
|
97
98
|
}
|
|
98
99
|
const provider = creator(clientOptions);
|
|
99
|
-
|
|
100
|
-
return provider(subModelName);
|
|
100
|
+
model = provider(subModelName);
|
|
101
101
|
}
|
|
102
102
|
else {
|
|
103
103
|
const provider = AISDKProviders[subProvider];
|
|
104
104
|
if (!provider) {
|
|
105
105
|
throw new sdkErrors_js_1.UnsupportedAISDKModelProviderError(subProvider, Object.keys(AISDKProviders));
|
|
106
106
|
}
|
|
107
|
-
|
|
107
|
+
model = provider(subModelName);
|
|
108
108
|
}
|
|
109
|
+
if (middleware) {
|
|
110
|
+
return (0, ai_1.wrapLanguageModel)({ model, middleware });
|
|
111
|
+
}
|
|
112
|
+
return model;
|
|
109
113
|
}
|
|
110
114
|
class LLMProvider {
|
|
111
115
|
logger;
|
|
112
|
-
|
|
116
|
+
middleware;
|
|
117
|
+
constructor(logger, middleware) {
|
|
113
118
|
this.logger = logger;
|
|
119
|
+
this.middleware = middleware;
|
|
114
120
|
}
|
|
115
121
|
getClient(modelName, clientOptions, options) {
|
|
116
122
|
if (modelName.includes("/")) {
|
|
@@ -122,10 +128,12 @@ class LLMProvider {
|
|
|
122
128
|
!options?.experimental) {
|
|
123
129
|
throw new sdkErrors_js_1.ExperimentalNotConfiguredError("Vertex provider");
|
|
124
130
|
}
|
|
125
|
-
const
|
|
131
|
+
const effectiveMiddleware = options?.middleware ?? this.middleware;
|
|
132
|
+
const languageModel = getAISDKLanguageModel(subProvider, subModelName, clientOptions, effectiveMiddleware);
|
|
126
133
|
return new aisdk_js_1.AISdkClient({
|
|
127
134
|
model: languageModel,
|
|
128
135
|
logger: this.logger,
|
|
136
|
+
clientOptions,
|
|
129
137
|
});
|
|
130
138
|
}
|
|
131
139
|
// Model name doesn't include "/" - this format is deprecated
|