@browserbasehq/orca 3.2.0-preview.2 → 3.2.0-preview.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/lib/utils.d.ts +0 -1
- package/dist/cjs/lib/utils.js +0 -4
- package/dist/cjs/lib/utils.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +6 -4
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +6 -4
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +6 -4
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/flowLogger.d.ts +103 -62
- package/dist/cjs/lib/v3/flowLogger.js +773 -362
- package/dist/cjs/lib/v3/flowLogger.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +33 -21
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +4 -0
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +31 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +12 -10
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +16 -10
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +0 -5
- package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +12 -3
- package/dist/cjs/lib/v3/understudy/cdp.js +10 -83
- package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.js +17 -32
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +0 -5
- package/dist/cjs/lib/v3/v3.js +157 -174
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +0 -1
- package/dist/esm/lib/utils.js +0 -3
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +7 -5
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +7 -5
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +7 -5
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/flowLogger.d.ts +103 -62
- package/dist/esm/lib/v3/flowLogger.js +762 -356
- package/dist/esm/lib/v3/flowLogger.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +34 -22
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +4 -0
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +32 -2
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +13 -11
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +17 -11
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +0 -5
- package/dist/esm/lib/v3/types/public/options.js.map +1 -1
- package/dist/esm/lib/v3/understudy/cdp.d.ts +12 -3
- package/dist/esm/lib/v3/understudy/cdp.js +10 -83
- package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +18 -33
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +0 -5
- package/dist/esm/lib/v3/v3.js +158 -175
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/lib/v3/eventStore.d.ts +0 -41
- package/dist/cjs/lib/v3/eventStore.js +0 -375
- package/dist/cjs/lib/v3/eventStore.js.map +0 -1
- package/dist/esm/lib/v3/eventStore.d.ts +0 -41
- package/dist/esm/lib/v3/eventStore.js +0 -363
- package/dist/esm/lib/v3/eventStore.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3AgentHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/v3AgentHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { createAgentTools } from \"../agent/tools/index.js\";\nimport { buildAgentSystemPrompt } from \"../agent/prompts/agentSystemPrompt.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { V3 } from \"../v3.js\";\nimport {\n ModelMessage,\n ToolSet,\n wrapLanguageModel,\n stepCountIs,\n LanguageModel,\n type LanguageModelUsage,\n type StepResult,\n type GenerateTextOnStepFinishCallback,\n type StreamTextOnStepFinishCallback,\n type PrepareStepFunction,\n} from \"ai\";\nimport { StagehandZodObject } from \"../zodCompat.js\";\nimport { processMessages } from \"../agent/utils/messageProcessing.js\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { FlowLogger } from \"../flowLogger.js\";\nimport {\n AgentExecuteOptions,\n AgentStreamExecuteOptions,\n AgentExecuteOptionsBase,\n AgentResult,\n AgentContext,\n AgentState,\n AgentStreamResult,\n AgentStreamCallbacks,\n AgentToolMode,\n AgentModelConfig,\n Variables,\n} from \"../types/public/agent.js\";\nimport { V3FunctionName } from \"../types/public/methods.js\";\nimport { mapToolResultToActions } from \"../agent/utils/actionMapping.js\";\nimport {\n MissingLLMConfigurationError,\n MissingEnvironmentVariableError,\n StreamingCallbacksInNonStreamingModeError,\n AgentAbortError,\n} from \"../types/public/sdkErrors.js\";\nimport { handleDoneToolCall } from \"../agent/utils/handleDoneToolCall.js\";\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Prepends a system message with cache control to the messages array.\n * The cache control providerOptions are used by Anthropic and ignored by other providers.\n */\nfunction prependSystemMessage(\n systemPrompt: string,\n messages: ModelMessage[],\n): ModelMessage[] {\n return [\n {\n role: \"system\",\n content: systemPrompt,\n providerOptions: {\n anthropic: {\n cacheControl: { type: \"ephemeral\" },\n },\n },\n },\n ...messages,\n ];\n}\n\nexport class V3AgentHandler {\n private v3: V3;\n private logger: (message: LogLine) => void;\n private llmClient: LLMClient;\n private executionModel?: string | AgentModelConfig;\n private systemInstructions?: string;\n private mcpTools?: ToolSet;\n private mode: AgentToolMode;\n\n constructor(\n v3: V3,\n logger: (message: LogLine) => void,\n llmClient: LLMClient,\n executionModel?: string | AgentModelConfig,\n systemInstructions?: string,\n mcpTools?: ToolSet,\n mode?: AgentToolMode,\n ) {\n this.v3 = v3;\n this.logger = logger;\n this.llmClient = llmClient;\n this.executionModel = executionModel;\n this.systemInstructions = systemInstructions;\n this.mcpTools = mcpTools;\n this.mode = mode ?? \"dom\";\n }\n\n private async prepareAgent(\n instructionOrOptions: string | AgentExecuteOptionsBase,\n ): Promise<AgentContext> {\n try {\n const options =\n typeof instructionOrOptions === \"string\"\n ? { instruction: instructionOrOptions }\n : instructionOrOptions;\n\n const maxSteps = options.maxSteps || 20;\n\n // Get the initial page URL first (needed for the system prompt)\n const initialPageUrl = (await this.v3.context.awaitActivePage()).url();\n\n // Build the system prompt with mode-aware tool guidance\n const systemPrompt = buildAgentSystemPrompt({\n url: initialPageUrl,\n executionInstruction: options.instruction,\n mode: this.mode,\n systemInstructions: this.systemInstructions,\n isBrowserbase: this.v3.isBrowserbase,\n excludeTools: options.excludeTools,\n variables: options.variables,\n useSearch: options.useSearch,\n });\n\n if (options.useSearch) {\n const bbApiKey = this.v3.browserbaseApiKey;\n if (!bbApiKey) {\n throw new MissingEnvironmentVariableError(\n \"BROWSERBASE_API_KEY\",\n \"agent search (useSearch: true)\",\n );\n }\n }\n\n const tools = this.createTools(\n options.excludeTools,\n options.variables,\n options.toolTimeout,\n options.useSearch,\n );\n const allTools: ToolSet = { ...tools, ...this.mcpTools };\n\n // Use provided messages for continuation, or start fresh with the instruction\n const messages: ModelMessage[] = options.messages?.length\n ? [...options.messages, { role: \"user\", content: options.instruction }]\n : [{ role: \"user\", content: options.instruction }];\n\n if (!this.llmClient?.getLanguageModel) {\n throw new MissingLLMConfigurationError();\n }\n const baseModel = this.llmClient.getLanguageModel();\n //to do - we likely do not need middleware anymore\n const wrappedModel = wrapLanguageModel({\n model: baseModel,\n middleware: {\n ...FlowLogger.createLlmLoggingMiddleware(baseModel.modelId),\n },\n });\n\n if (\n this.mode === \"hybrid\" &&\n !baseModel.modelId.includes(\"gemini-3-flash\") &&\n !baseModel.modelId.includes(\"claude\")\n ) {\n this.logger({\n category: \"agent\",\n message: `Warning: \"${baseModel.modelId}\" may not perform well in hybrid mode. See recommended models: https://docs.stagehand.dev/v3/basics/agent#hybrid-mode`,\n level: 0,\n });\n }\n\n return {\n options,\n maxSteps,\n systemPrompt,\n allTools,\n messages,\n wrappedModel,\n initialPageUrl,\n };\n } catch (error) {\n this.logger({\n category: \"agent\",\n message: `failed to prepare agent: ${error}`,\n level: 0,\n });\n throw error;\n }\n }\n private createPrepareStep(\n userCallback?: PrepareStepFunction<ToolSet>,\n ): PrepareStepFunction<ToolSet> {\n return async (options) => {\n processMessages(options.messages);\n if (userCallback) {\n return userCallback(options);\n }\n return options;\n };\n }\n\n private createStepHandler(\n state: AgentState,\n userCallback?:\n | GenerateTextOnStepFinishCallback<ToolSet>\n | StreamTextOnStepFinishCallback<ToolSet>,\n ) {\n return async (event: StepResult<ToolSet>) => {\n this.logger({\n category: \"agent\",\n message: `Step finished: ${event.finishReason}`,\n level: 2,\n });\n\n if (event.toolCalls && event.toolCalls.length > 0) {\n for (let i = 0; i < event.toolCalls.length; i++) {\n const toolCall = event.toolCalls[i];\n const args = toolCall.input;\n const toolResult = event.toolResults?.[i];\n\n if (event.text && event.text.length > 0) {\n state.collectedReasoning.push(event.text);\n this.logger({\n category: \"agent\",\n message: `reasoning: ${event.text}`,\n level: 1,\n });\n }\n\n if (toolCall.toolName === \"done\") {\n state.completed = true;\n if (args?.taskComplete) {\n const doneReasoning = args.reasoning;\n const allReasoning = state.collectedReasoning.join(\" \");\n state.finalMessage = doneReasoning\n ? `${allReasoning} ${doneReasoning}`.trim()\n : allReasoning || \"Task completed successfully\";\n }\n }\n const mappedActions = mapToolResultToActions({\n toolCallName: toolCall.toolName,\n toolResult,\n args,\n reasoning: event.text || undefined,\n });\n\n for (const action of mappedActions) {\n action.pageUrl = state.currentPageUrl;\n action.timestamp = Date.now();\n state.actions.push(action);\n }\n }\n state.currentPageUrl = (await this.v3.context.awaitActivePage()).url();\n }\n\n if (userCallback) {\n await userCallback(event);\n }\n };\n }\n\n public async execute(\n instructionOrOptions: string | AgentExecuteOptions,\n ): Promise<AgentResult> {\n const startTime = Date.now();\n const options =\n typeof instructionOrOptions === \"object\" ? instructionOrOptions : null;\n const signal = options?.signal;\n\n // Highlight cursor defaults to true for hybrid mode, can be overridden\n const shouldHighlightCursor =\n options?.highlightCursor ?? this.mode === \"hybrid\";\n\n const state: AgentState = {\n collectedReasoning: [],\n actions: [],\n finalMessage: \"\",\n completed: false,\n currentPageUrl: \"\",\n };\n\n let messages: ModelMessage[] = [];\n\n try {\n const {\n options: preparedOptions,\n maxSteps,\n systemPrompt,\n allTools,\n messages: preparedMessages,\n wrappedModel,\n initialPageUrl,\n } = await this.prepareAgent(instructionOrOptions);\n\n // Enable cursor overlay for hybrid mode (coordinate-based interactions)\n if (shouldHighlightCursor && this.mode === \"hybrid\") {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay().catch(() => {});\n }\n\n messages = preparedMessages;\n state.currentPageUrl = initialPageUrl;\n\n const callbacks = (instructionOrOptions as AgentExecuteOptions).callbacks;\n\n if (callbacks) {\n const streamingOnlyCallbacks = [\n \"onChunk\",\n \"onFinish\",\n \"onError\",\n \"onAbort\",\n ];\n const invalidCallbacks = streamingOnlyCallbacks.filter(\n (name) => callbacks[name as keyof typeof callbacks] != null,\n );\n if (invalidCallbacks.length > 0) {\n throw new StreamingCallbacksInNonStreamingModeError(invalidCallbacks);\n }\n }\n\n const result = await this.llmClient.generateText({\n model: wrappedModel,\n messages: prependSystemMessage(systemPrompt, messages),\n tools: allTools,\n stopWhen: (result) => this.handleStop(result, maxSteps),\n temperature: 1,\n toolChoice: \"auto\",\n\n prepareStep: this.createPrepareStep(callbacks?.prepareStep),\n onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),\n abortSignal: preparedOptions.signal,\n providerOptions: {\n google: { mediaResolution: \"MEDIA_RESOLUTION_HIGH\" },\n openai: { store: false },\n },\n });\n\n const allMessages = [...messages, ...(result.response?.messages || [])];\n const doneResult = await this.ensureDone(\n state,\n wrappedModel,\n allMessages,\n preparedOptions.instruction,\n preparedOptions.output,\n this.logger,\n );\n\n return this.consolidateMetricsAndResult(\n startTime,\n state,\n doneResult.messages,\n result,\n maxSteps,\n doneResult.output,\n );\n } catch (error) {\n // Re-throw validation errors that should propagate to the caller\n if (\n error instanceof StreamingCallbacksInNonStreamingModeError ||\n error instanceof MissingEnvironmentVariableError\n ) {\n throw error;\n }\n\n // Re-throw abort errors wrapped in AgentAbortError for consistent error typing\n if (signal?.aborted) {\n const reason = signal.reason ? String(signal.reason) : \"aborted\";\n throw new AgentAbortError(reason);\n }\n\n const errorMessage = getErrorMessage(error);\n this.logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n // For non-abort errors, return a failure result instead of throwing\n return {\n success: false,\n actions: state.actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n messages,\n };\n }\n }\n\n public async stream(\n instructionOrOptions: string | AgentStreamExecuteOptions,\n ): Promise<AgentStreamResult> {\n const streamOptions =\n typeof instructionOrOptions === \"object\" ? instructionOrOptions : null;\n\n // Highlight cursor defaults to true for hybrid mode, can be overridden\n const shouldHighlightCursor =\n streamOptions?.highlightCursor ?? this.mode === \"hybrid\";\n\n const {\n options,\n maxSteps,\n systemPrompt,\n allTools,\n messages,\n wrappedModel,\n initialPageUrl,\n } = await this.prepareAgent(instructionOrOptions);\n\n // Enable cursor overlay for hybrid mode (coordinate-based interactions)\n if (shouldHighlightCursor && this.mode === \"hybrid\") {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay().catch(() => {});\n }\n\n const callbacks = (instructionOrOptions as AgentStreamExecuteOptions)\n .callbacks as AgentStreamCallbacks | undefined;\n\n const state: AgentState = {\n collectedReasoning: [],\n actions: [],\n finalMessage: \"\",\n completed: false,\n currentPageUrl: initialPageUrl,\n };\n const startTime = Date.now();\n\n let resolveResult: (value: AgentResult | PromiseLike<AgentResult>) => void;\n let rejectResult: (reason: unknown) => void;\n const resultPromise = new Promise<AgentResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const handleError = (error: unknown) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger({\n category: \"agent\",\n message: `Error during streaming: ${errorMessage}`,\n level: 0,\n });\n rejectResult(error);\n };\n\n const streamResult = this.llmClient.streamText({\n model: wrappedModel,\n messages: prependSystemMessage(systemPrompt, messages),\n tools: allTools,\n stopWhen: (result) => this.handleStop(result, maxSteps),\n temperature: 1,\n toolChoice: \"auto\",\n prepareStep: this.createPrepareStep(callbacks?.prepareStep),\n onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),\n onError: (event) => {\n if (callbacks?.onError) {\n callbacks.onError(event);\n }\n handleError(event.error);\n },\n onChunk: callbacks?.onChunk,\n onFinish: (event) => {\n if (callbacks?.onFinish) {\n callbacks.onFinish(event);\n }\n\n const allMessages = [...messages, ...(event.response?.messages || [])];\n this.ensureDone(\n state,\n wrappedModel,\n allMessages,\n options.instruction,\n options.output,\n this.logger,\n ).then((doneResult) => {\n const result = this.consolidateMetricsAndResult(\n startTime,\n state,\n doneResult.messages,\n event,\n maxSteps,\n doneResult.output,\n );\n resolveResult(result);\n });\n },\n onAbort: (event) => {\n if (callbacks?.onAbort) {\n callbacks.onAbort(event);\n }\n // Reject the result promise with AgentAbortError when stream is aborted\n const reason = options.signal?.reason\n ? String(options.signal.reason)\n : \"Stream was aborted\";\n rejectResult(new AgentAbortError(reason));\n },\n abortSignal: options.signal,\n providerOptions: {\n google: { mediaResolution: \"MEDIA_RESOLUTION_HIGH\" },\n openai: { store: false },\n },\n });\n\n const agentStreamResult = streamResult as AgentStreamResult;\n agentStreamResult.result = resultPromise;\n return agentStreamResult;\n }\n\n private consolidateMetricsAndResult(\n startTime: number,\n state: AgentState,\n inputMessages: ModelMessage[],\n result: {\n text?: string;\n totalUsage?: LanguageModelUsage;\n response?: { messages?: ModelMessage[] };\n steps?: StepResult<ToolSet>[];\n },\n maxSteps?: number,\n output?: Record<string, unknown>,\n ): AgentResult {\n if (!state.finalMessage) {\n const allReasoning = state.collectedReasoning.join(\" \").trim();\n\n if (!state.completed && maxSteps && result.steps?.length >= maxSteps) {\n this.logger({\n category: \"agent\",\n message: `Agent stopped: reached maximum steps (${maxSteps})`,\n level: 1,\n });\n state.finalMessage = `Agent stopped: reached maximum steps (${maxSteps})`;\n } else {\n state.finalMessage = allReasoning || result.text || \"\";\n }\n }\n\n const endTime = Date.now();\n const inferenceTimeMs = endTime - startTime;\n if (result.totalUsage) {\n this.v3.updateMetrics(\n V3FunctionName.AGENT,\n result.totalUsage.inputTokens || 0,\n result.totalUsage.outputTokens || 0,\n result.totalUsage.reasoningTokens || 0,\n result.totalUsage.cachedInputTokens || 0,\n inferenceTimeMs,\n );\n }\n\n return {\n success: state.completed,\n message: state.finalMessage || \"Task execution completed\",\n actions: state.actions,\n completed: state.completed,\n output,\n usage: result.totalUsage\n ? {\n input_tokens: result.totalUsage.inputTokens || 0,\n output_tokens: result.totalUsage.outputTokens || 0,\n reasoning_tokens: result.totalUsage.reasoningTokens || 0,\n cached_input_tokens: result.totalUsage.cachedInputTokens || 0,\n inference_time_ms: inferenceTimeMs,\n }\n : undefined,\n messages: inputMessages,\n };\n }\n\n private createTools(\n excludeTools?: string[],\n variables?: Variables,\n toolTimeout?: number,\n useSearch?: boolean,\n ) {\n const provider = this.llmClient?.getLanguageModel?.()?.provider;\n return createAgentTools(this.v3, {\n executionModel: this.executionModel,\n logger: this.logger,\n mode: this.mode,\n provider,\n excludeTools,\n variables,\n toolTimeout,\n useSearch,\n browserbaseApiKey: useSearch ? this.v3.browserbaseApiKey : undefined,\n });\n }\n\n private handleStop(\n result: Parameters<ReturnType<typeof stepCountIs>>[0],\n maxSteps: number,\n ): boolean | PromiseLike<boolean> {\n const lastStep = result.steps[result.steps.length - 1];\n if (lastStep?.toolCalls?.some((tc) => tc.toolName === \"done\")) {\n return true;\n }\n return stepCountIs(maxSteps)(result);\n }\n\n /**\n * Ensures the done tool is called at the end of agent execution.\n * Returns the messages and any extracted output from the done call.\n */\n private async ensureDone(\n state: AgentState,\n model: LanguageModel,\n messages: ModelMessage[],\n instruction: string,\n outputSchema?: StagehandZodObject,\n logger?: (message: LogLine) => void,\n ): Promise<{ messages: ModelMessage[]; output?: Record<string, unknown> }> {\n if (state.completed) return { messages };\n\n const doneResult = await handleDoneToolCall({\n model,\n inputMessages: messages,\n instruction,\n outputSchema,\n logger,\n });\n\n state.completed = doneResult.taskComplete;\n state.finalMessage = doneResult.reasoning;\n\n const doneAction = mapToolResultToActions({\n toolCallName: \"done\",\n toolResult: {\n success: true,\n reasoning: doneResult.reasoning,\n taskComplete: doneResult.taskComplete,\n },\n args: {\n reasoning: doneResult.reasoning,\n taskComplete: doneResult.taskComplete,\n },\n reasoning: doneResult.reasoning,\n });\n\n for (const action of doneAction) {\n action.pageUrl = state.currentPageUrl;\n action.timestamp = Date.now();\n state.actions.push(action);\n }\n\n return {\n messages: [...messages, ...doneResult.messages],\n output: doneResult.output,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"v3AgentHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/v3AgentHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { createAgentTools } from \"../agent/tools/index.js\";\nimport { buildAgentSystemPrompt } from \"../agent/prompts/agentSystemPrompt.js\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport { V3 } from \"../v3.js\";\nimport {\n ModelMessage,\n ToolSet,\n wrapLanguageModel,\n stepCountIs,\n LanguageModel,\n type LanguageModelUsage,\n type StepResult,\n type GenerateTextOnStepFinishCallback,\n type StreamTextOnStepFinishCallback,\n type PrepareStepFunction,\n} from \"ai\";\nimport { StagehandZodObject } from \"../zodCompat.js\";\nimport { processMessages } from \"../agent/utils/messageProcessing.js\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { SessionFileLogger } from \"../flowLogger.js\";\nimport {\n AgentExecuteOptions,\n AgentStreamExecuteOptions,\n AgentExecuteOptionsBase,\n AgentResult,\n AgentContext,\n AgentState,\n AgentStreamResult,\n AgentStreamCallbacks,\n AgentToolMode,\n AgentModelConfig,\n Variables,\n} from \"../types/public/agent.js\";\nimport { V3FunctionName } from \"../types/public/methods.js\";\nimport { mapToolResultToActions } from \"../agent/utils/actionMapping.js\";\nimport {\n MissingLLMConfigurationError,\n MissingEnvironmentVariableError,\n StreamingCallbacksInNonStreamingModeError,\n AgentAbortError,\n} from \"../types/public/sdkErrors.js\";\nimport { handleDoneToolCall } from \"../agent/utils/handleDoneToolCall.js\";\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Prepends a system message with cache control to the messages array.\n * The cache control providerOptions are used by Anthropic and ignored by other providers.\n */\nfunction prependSystemMessage(\n systemPrompt: string,\n messages: ModelMessage[],\n): ModelMessage[] {\n return [\n {\n role: \"system\",\n content: systemPrompt,\n providerOptions: {\n anthropic: {\n cacheControl: { type: \"ephemeral\" },\n },\n },\n },\n ...messages,\n ];\n}\n\nexport class V3AgentHandler {\n private v3: V3;\n private logger: (message: LogLine) => void;\n private llmClient: LLMClient;\n private executionModel?: string | AgentModelConfig;\n private systemInstructions?: string;\n private mcpTools?: ToolSet;\n private mode: AgentToolMode;\n\n constructor(\n v3: V3,\n logger: (message: LogLine) => void,\n llmClient: LLMClient,\n executionModel?: string | AgentModelConfig,\n systemInstructions?: string,\n mcpTools?: ToolSet,\n mode?: AgentToolMode,\n ) {\n this.v3 = v3;\n this.logger = logger;\n this.llmClient = llmClient;\n this.executionModel = executionModel;\n this.systemInstructions = systemInstructions;\n this.mcpTools = mcpTools;\n this.mode = mode ?? \"dom\";\n }\n\n private async prepareAgent(\n instructionOrOptions: string | AgentExecuteOptionsBase,\n ): Promise<AgentContext> {\n try {\n const options =\n typeof instructionOrOptions === \"string\"\n ? { instruction: instructionOrOptions }\n : instructionOrOptions;\n\n const maxSteps = options.maxSteps || 20;\n\n // Get the initial page URL first (needed for the system prompt)\n const initialPageUrl = (await this.v3.context.awaitActivePage()).url();\n\n // Build the system prompt with mode-aware tool guidance\n const systemPrompt = buildAgentSystemPrompt({\n url: initialPageUrl,\n executionInstruction: options.instruction,\n mode: this.mode,\n systemInstructions: this.systemInstructions,\n isBrowserbase: this.v3.isBrowserbase,\n excludeTools: options.excludeTools,\n variables: options.variables,\n useSearch: options.useSearch,\n });\n\n if (options.useSearch) {\n const bbApiKey = this.v3.browserbaseApiKey;\n if (!bbApiKey) {\n throw new MissingEnvironmentVariableError(\n \"BROWSERBASE_API_KEY\",\n \"agent search (useSearch: true)\",\n );\n }\n }\n\n const tools = this.createTools(\n options.excludeTools,\n options.variables,\n options.toolTimeout,\n options.useSearch,\n );\n const allTools: ToolSet = { ...tools, ...this.mcpTools };\n\n // Use provided messages for continuation, or start fresh with the instruction\n const messages: ModelMessage[] = options.messages?.length\n ? [...options.messages, { role: \"user\", content: options.instruction }]\n : [{ role: \"user\", content: options.instruction }];\n\n if (!this.llmClient?.getLanguageModel) {\n throw new MissingLLMConfigurationError();\n }\n const baseModel = this.llmClient.getLanguageModel();\n //to do - we likely do not need middleware anymore\n const wrappedModel = wrapLanguageModel({\n model: baseModel,\n middleware: {\n ...SessionFileLogger.createLlmLoggingMiddleware(baseModel.modelId),\n },\n });\n\n if (\n this.mode === \"hybrid\" &&\n !baseModel.modelId.includes(\"gemini-3-flash\") &&\n !baseModel.modelId.includes(\"claude\")\n ) {\n this.logger({\n category: \"agent\",\n message: `Warning: \"${baseModel.modelId}\" may not perform well in hybrid mode. See recommended models: https://docs.stagehand.dev/v3/basics/agent#hybrid-mode`,\n level: 0,\n });\n }\n\n return {\n options,\n maxSteps,\n systemPrompt,\n allTools,\n messages,\n wrappedModel,\n initialPageUrl,\n };\n } catch (error) {\n this.logger({\n category: \"agent\",\n message: `failed to prepare agent: ${error}`,\n level: 0,\n });\n throw error;\n }\n }\n private createPrepareStep(\n userCallback?: PrepareStepFunction<ToolSet>,\n ): PrepareStepFunction<ToolSet> {\n return async (options) => {\n processMessages(options.messages);\n if (userCallback) {\n return userCallback(options);\n }\n return options;\n };\n }\n\n private createStepHandler(\n state: AgentState,\n userCallback?:\n | GenerateTextOnStepFinishCallback<ToolSet>\n | StreamTextOnStepFinishCallback<ToolSet>,\n ) {\n return async (event: StepResult<ToolSet>) => {\n this.logger({\n category: \"agent\",\n message: `Step finished: ${event.finishReason}`,\n level: 2,\n });\n\n if (event.toolCalls && event.toolCalls.length > 0) {\n for (let i = 0; i < event.toolCalls.length; i++) {\n const toolCall = event.toolCalls[i];\n const args = toolCall.input;\n const toolResult = event.toolResults?.[i];\n\n if (event.text && event.text.length > 0) {\n state.collectedReasoning.push(event.text);\n this.logger({\n category: \"agent\",\n message: `reasoning: ${event.text}`,\n level: 1,\n });\n }\n\n if (toolCall.toolName === \"done\") {\n state.completed = true;\n if (args?.taskComplete) {\n const doneReasoning = args.reasoning;\n const allReasoning = state.collectedReasoning.join(\" \");\n state.finalMessage = doneReasoning\n ? `${allReasoning} ${doneReasoning}`.trim()\n : allReasoning || \"Task completed successfully\";\n }\n }\n const mappedActions = mapToolResultToActions({\n toolCallName: toolCall.toolName,\n toolResult,\n args,\n reasoning: event.text || undefined,\n });\n\n for (const action of mappedActions) {\n action.pageUrl = state.currentPageUrl;\n action.timestamp = Date.now();\n state.actions.push(action);\n }\n }\n state.currentPageUrl = (await this.v3.context.awaitActivePage()).url();\n\n // Capture screenshot after tool execution (only for evals)\n if (process.env.EVALS === \"true\") {\n try {\n await this.captureAndEmitScreenshot();\n } catch (e) {\n this.logger({\n category: \"agent\",\n message: `Warning: Failed to capture screenshot: ${getErrorMessage(e)}`,\n level: 1,\n });\n }\n }\n }\n\n if (userCallback) {\n await userCallback(event);\n }\n };\n }\n\n public async execute(\n instructionOrOptions: string | AgentExecuteOptions,\n ): Promise<AgentResult> {\n const startTime = Date.now();\n const options =\n typeof instructionOrOptions === \"object\" ? instructionOrOptions : null;\n const signal = options?.signal;\n\n // Highlight cursor defaults to true for hybrid mode, can be overridden\n const shouldHighlightCursor =\n options?.highlightCursor ?? this.mode === \"hybrid\";\n\n const state: AgentState = {\n collectedReasoning: [],\n actions: [],\n finalMessage: \"\",\n completed: false,\n currentPageUrl: \"\",\n };\n\n let messages: ModelMessage[] = [];\n\n try {\n const {\n options: preparedOptions,\n maxSteps,\n systemPrompt,\n allTools,\n messages: preparedMessages,\n wrappedModel,\n initialPageUrl,\n } = await this.prepareAgent(instructionOrOptions);\n\n // Enable cursor overlay for hybrid mode (coordinate-based interactions)\n if (shouldHighlightCursor && this.mode === \"hybrid\") {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay().catch(() => {});\n }\n\n messages = preparedMessages;\n state.currentPageUrl = initialPageUrl;\n\n const callbacks = (instructionOrOptions as AgentExecuteOptions).callbacks;\n\n if (callbacks) {\n const streamingOnlyCallbacks = [\n \"onChunk\",\n \"onFinish\",\n \"onError\",\n \"onAbort\",\n ];\n const invalidCallbacks = streamingOnlyCallbacks.filter(\n (name) => callbacks[name as keyof typeof callbacks] != null,\n );\n if (invalidCallbacks.length > 0) {\n throw new StreamingCallbacksInNonStreamingModeError(invalidCallbacks);\n }\n }\n\n const result = await this.llmClient.generateText({\n model: wrappedModel,\n messages: prependSystemMessage(systemPrompt, messages),\n tools: allTools,\n stopWhen: (result) => this.handleStop(result, maxSteps),\n temperature: 1,\n toolChoice: \"auto\",\n\n prepareStep: this.createPrepareStep(callbacks?.prepareStep),\n onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),\n abortSignal: preparedOptions.signal,\n providerOptions: {\n google: { mediaResolution: \"MEDIA_RESOLUTION_HIGH\" },\n openai: { store: false },\n },\n });\n\n const allMessages = [...messages, ...(result.response?.messages || [])];\n const doneResult = await this.ensureDone(\n state,\n wrappedModel,\n allMessages,\n preparedOptions.instruction,\n preparedOptions.output,\n this.logger,\n );\n\n return this.consolidateMetricsAndResult(\n startTime,\n state,\n doneResult.messages,\n result,\n maxSteps,\n doneResult.output,\n );\n } catch (error) {\n // Re-throw validation errors that should propagate to the caller\n if (\n error instanceof StreamingCallbacksInNonStreamingModeError ||\n error instanceof MissingEnvironmentVariableError\n ) {\n throw error;\n }\n\n // Re-throw abort errors wrapped in AgentAbortError for consistent error typing\n if (signal?.aborted) {\n const reason = signal.reason ? String(signal.reason) : \"aborted\";\n throw new AgentAbortError(reason);\n }\n\n const errorMessage = getErrorMessage(error);\n this.logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n // For non-abort errors, return a failure result instead of throwing\n return {\n success: false,\n actions: state.actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n messages,\n };\n }\n }\n\n public async stream(\n instructionOrOptions: string | AgentStreamExecuteOptions,\n ): Promise<AgentStreamResult> {\n const streamOptions =\n typeof instructionOrOptions === \"object\" ? instructionOrOptions : null;\n\n // Highlight cursor defaults to true for hybrid mode, can be overridden\n const shouldHighlightCursor =\n streamOptions?.highlightCursor ?? this.mode === \"hybrid\";\n\n const {\n options,\n maxSteps,\n systemPrompt,\n allTools,\n messages,\n wrappedModel,\n initialPageUrl,\n } = await this.prepareAgent(instructionOrOptions);\n\n // Enable cursor overlay for hybrid mode (coordinate-based interactions)\n if (shouldHighlightCursor && this.mode === \"hybrid\") {\n const page = await this.v3.context.awaitActivePage();\n await page.enableCursorOverlay().catch(() => {});\n }\n\n const callbacks = (instructionOrOptions as AgentStreamExecuteOptions)\n .callbacks as AgentStreamCallbacks | undefined;\n\n const state: AgentState = {\n collectedReasoning: [],\n actions: [],\n finalMessage: \"\",\n completed: false,\n currentPageUrl: initialPageUrl,\n };\n const startTime = Date.now();\n\n let resolveResult: (value: AgentResult | PromiseLike<AgentResult>) => void;\n let rejectResult: (reason: unknown) => void;\n const resultPromise = new Promise<AgentResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const handleError = (error: unknown) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger({\n category: \"agent\",\n message: `Error during streaming: ${errorMessage}`,\n level: 0,\n });\n rejectResult(error);\n };\n\n const streamResult = this.llmClient.streamText({\n model: wrappedModel,\n messages: prependSystemMessage(systemPrompt, messages),\n tools: allTools,\n stopWhen: (result) => this.handleStop(result, maxSteps),\n temperature: 1,\n toolChoice: \"auto\",\n prepareStep: this.createPrepareStep(callbacks?.prepareStep),\n onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),\n onError: (event) => {\n if (callbacks?.onError) {\n callbacks.onError(event);\n }\n handleError(event.error);\n },\n onChunk: callbacks?.onChunk,\n onFinish: (event) => {\n if (callbacks?.onFinish) {\n callbacks.onFinish(event);\n }\n\n const allMessages = [...messages, ...(event.response?.messages || [])];\n this.ensureDone(\n state,\n wrappedModel,\n allMessages,\n options.instruction,\n options.output,\n this.logger,\n ).then((doneResult) => {\n const result = this.consolidateMetricsAndResult(\n startTime,\n state,\n doneResult.messages,\n event,\n maxSteps,\n doneResult.output,\n );\n resolveResult(result);\n });\n },\n onAbort: (event) => {\n if (callbacks?.onAbort) {\n callbacks.onAbort(event);\n }\n // Reject the result promise with AgentAbortError when stream is aborted\n const reason = options.signal?.reason\n ? String(options.signal.reason)\n : \"Stream was aborted\";\n rejectResult(new AgentAbortError(reason));\n },\n abortSignal: options.signal,\n providerOptions: {\n google: { mediaResolution: \"MEDIA_RESOLUTION_HIGH\" },\n openai: { store: false },\n },\n });\n\n const agentStreamResult = streamResult as AgentStreamResult;\n agentStreamResult.result = resultPromise;\n return agentStreamResult;\n }\n\n private consolidateMetricsAndResult(\n startTime: number,\n state: AgentState,\n inputMessages: ModelMessage[],\n result: {\n text?: string;\n totalUsage?: LanguageModelUsage;\n response?: { messages?: ModelMessage[] };\n steps?: StepResult<ToolSet>[];\n },\n maxSteps?: number,\n output?: Record<string, unknown>,\n ): AgentResult {\n if (!state.finalMessage) {\n const allReasoning = state.collectedReasoning.join(\" \").trim();\n\n if (!state.completed && maxSteps && result.steps?.length >= maxSteps) {\n this.logger({\n category: \"agent\",\n message: `Agent stopped: reached maximum steps (${maxSteps})`,\n level: 1,\n });\n state.finalMessage = `Agent stopped: reached maximum steps (${maxSteps})`;\n } else {\n state.finalMessage = allReasoning || result.text || \"\";\n }\n }\n\n const endTime = Date.now();\n const inferenceTimeMs = endTime - startTime;\n if (result.totalUsage) {\n this.v3.updateMetrics(\n V3FunctionName.AGENT,\n result.totalUsage.inputTokens || 0,\n result.totalUsage.outputTokens || 0,\n result.totalUsage.reasoningTokens || 0,\n result.totalUsage.cachedInputTokens || 0,\n inferenceTimeMs,\n );\n }\n\n return {\n success: state.completed,\n message: state.finalMessage || \"Task execution completed\",\n actions: state.actions,\n completed: state.completed,\n output,\n usage: result.totalUsage\n ? {\n input_tokens: result.totalUsage.inputTokens || 0,\n output_tokens: result.totalUsage.outputTokens || 0,\n reasoning_tokens: result.totalUsage.reasoningTokens || 0,\n cached_input_tokens: result.totalUsage.cachedInputTokens || 0,\n inference_time_ms: inferenceTimeMs,\n }\n : undefined,\n messages: inputMessages,\n };\n }\n\n private createTools(\n excludeTools?: string[],\n variables?: Variables,\n toolTimeout?: number,\n useSearch?: boolean,\n ) {\n const provider = this.llmClient?.getLanguageModel?.()?.provider;\n return createAgentTools(this.v3, {\n executionModel: this.executionModel,\n logger: this.logger,\n mode: this.mode,\n provider,\n excludeTools,\n variables,\n toolTimeout,\n useSearch,\n browserbaseApiKey: useSearch ? this.v3.browserbaseApiKey : undefined,\n });\n }\n\n private handleStop(\n result: Parameters<ReturnType<typeof stepCountIs>>[0],\n maxSteps: number,\n ): boolean | PromiseLike<boolean> {\n const lastStep = result.steps[result.steps.length - 1];\n if (lastStep?.toolCalls?.some((tc) => tc.toolName === \"done\")) {\n return true;\n }\n return stepCountIs(maxSteps)(result);\n }\n\n /**\n * Ensures the done tool is called at the end of agent execution.\n * Returns the messages and any extracted output from the done call.\n */\n private async ensureDone(\n state: AgentState,\n model: LanguageModel,\n messages: ModelMessage[],\n instruction: string,\n outputSchema?: StagehandZodObject,\n logger?: (message: LogLine) => void,\n ): Promise<{ messages: ModelMessage[]; output?: Record<string, unknown> }> {\n if (state.completed) return { messages };\n\n const doneResult = await handleDoneToolCall({\n model,\n inputMessages: messages,\n instruction,\n outputSchema,\n logger,\n });\n\n state.completed = doneResult.taskComplete;\n state.finalMessage = doneResult.reasoning;\n\n const doneAction = mapToolResultToActions({\n toolCallName: \"done\",\n toolResult: {\n success: true,\n reasoning: doneResult.reasoning,\n taskComplete: doneResult.taskComplete,\n },\n args: {\n reasoning: doneResult.reasoning,\n taskComplete: doneResult.taskComplete,\n },\n reasoning: doneResult.reasoning,\n });\n\n for (const action of doneAction) {\n action.pageUrl = state.currentPageUrl;\n action.timestamp = Date.now();\n state.actions.push(action);\n }\n\n return {\n messages: [...messages, ...doneResult.messages],\n output: doneResult.output,\n };\n }\n\n /**\n * Capture a screenshot and emit it via the event bus\n */\n private async captureAndEmitScreenshot(): Promise<void> {\n try {\n const page = await this.v3.context.awaitActivePage();\n const screenshot = await page.screenshot({ fullPage: false });\n this.v3.bus.emit(\"agent_screenshot_taken_event\", screenshot);\n } catch (error) {\n this.logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${getErrorMessage(error)}`,\n level: 0,\n });\n }\n }\n}\n"]}
|
|
@@ -5,8 +5,7 @@ import { OpenAICUAClient } from "../agent/OpenAICUAClient.js";
|
|
|
5
5
|
import { mapKeyToPlaywright } from "../agent/utils/cuaKeyMapping.js";
|
|
6
6
|
import { ensureXPath } from "../agent/utils/xpath.js";
|
|
7
7
|
import { V3FunctionName } from "../types/public/methods.js";
|
|
8
|
-
import {
|
|
9
|
-
import { toTitleCase } from "../../utils.js";
|
|
8
|
+
import { SessionFileLogger } from "../flowLogger.js";
|
|
10
9
|
import { StagehandClosedError } from "../types/public/sdkErrors.js";
|
|
11
10
|
export class V3CuaAgentHandler {
|
|
12
11
|
v3;
|
|
@@ -64,19 +63,20 @@ export class V3CuaAgentHandler {
|
|
|
64
63
|
// Skip logging for screenshot actions - they're no-ops, the actual
|
|
65
64
|
// Page.screenshot in captureAndSendScreenshot() is logged separately
|
|
66
65
|
const shouldLog = action.type !== "screenshot";
|
|
67
|
-
const eventType = `V3Cua${toTitleCase(action.type)}`; // e.g. "V3CuaClick"
|
|
68
66
|
if (shouldLog) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
},
|
|
75
|
-
}, async (loggedAction) => await this.executeAction(loggedAction), [action]);
|
|
67
|
+
SessionFileLogger.logUnderstudyActionEvent({
|
|
68
|
+
actionType: `v3CUA.${action.type}`,
|
|
69
|
+
target: this.computePointerTarget(action),
|
|
70
|
+
args: [action],
|
|
71
|
+
});
|
|
76
72
|
}
|
|
77
|
-
|
|
73
|
+
try {
|
|
78
74
|
await this.executeAction(action);
|
|
79
75
|
}
|
|
76
|
+
finally {
|
|
77
|
+
if (shouldLog)
|
|
78
|
+
SessionFileLogger.logUnderstudyActionCompleted();
|
|
79
|
+
}
|
|
80
80
|
action.timestamp = Date.now();
|
|
81
81
|
await new Promise((r) => setTimeout(r, waitBetween));
|
|
82
82
|
try {
|
|
@@ -498,6 +498,8 @@ export class V3CuaAgentHandler {
|
|
|
498
498
|
try {
|
|
499
499
|
const page = await this.v3.context.awaitActivePage();
|
|
500
500
|
const screenshotBuffer = await page.screenshot({ fullPage: false });
|
|
501
|
+
// Emit screenshot event via the bus
|
|
502
|
+
this.v3.bus.emit("agent_screenshot_taken_event", screenshotBuffer);
|
|
501
503
|
const currentUrl = page.url();
|
|
502
504
|
return await this.agentClient.captureScreenshot({
|
|
503
505
|
base64Image: screenshotBuffer.toString("base64"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3CuaAgentHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/v3CuaAgentHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAIjF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAUtD,OAAO,EAAe,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,OAAO,iBAAiB;IACpB,EAAE,CAAK;IACP,KAAK,CAAc;IACnB,QAAQ,CAAgB;IACxB,MAAM,CAA6B;IACnC,WAAW,CAAc;IACzB,OAAO,CAAsB;IAC7B,eAAe,CAAU;IAEjC,YACE,EAAM,EACN,MAAkC,EAClC,OAA4B,EAC5B,KAAe;QAEf,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CACpC,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,aAAa,IAAI,EAAE,EAC3B,OAAO,CAAC,wBAAwB,EAChC,KAAK,CACN,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;IACtB,CAAC;IAED;;;OAGG;IACK,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,oBAAoB,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,0CAA0C;QAC1C,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,OAAO,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa;QAC3D,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAEjE,MAAM,YAAY,GAAG,GAAG,CAAC;YACzB,MAAM,WAAW,GACd,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,kBAA6B;gBAC1D,YAAY,CAAC;YACf,IAAI,CAAC;gBACH,qDAAqD;gBACrD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC5B,CAAC;oBAAC,MAAM,CAAC;wBACP,mCAAmC;oBACrC,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC7C,mEAAmE;gBACnE,qEAAqE;gBACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC;gBAC/C,MAAM,SAAS,GAAG,QAAQ,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAoB;gBAC1E,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,UAAU,CAAC,cAAc,CAC7B;wBACE,SAAS;wBACT,aAAa,EAAE,GAAG;wBAClB,IAAI,EAAE;4BACJ,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;yBAC1C;qBACF,EACD,KAAK,EAAE,YAA2B,EAAE,EAAE,CACpC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EACxC,CAAC,MAAM,CAAC,CACT,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACnC,CAAC;gBAED,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE9B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBACxC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,MAAM,CAAC;wBACV,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,oDAAoD,MAAM,CAChE,CAAW,EAAE,OAAO,IAAI,CAAC,CAC3B,EAAE;wBACH,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAI,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvD,IAAI,CAAC,MAAM,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,0BAA0B,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE;oBACxD,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;IAC9B,CAAC;IAED,4BAA4B,CAAC,OAAmC;QAC9D,IACE,IAAI,CAAC,WAAW,YAAY,eAAe;YAC3C,IAAI,CAAC,WAAW,YAAY,eAAe,EAC3C,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CACX,oBAAkD;QAElD,MAAM,OAAO,GACX,OAAO,oBAAoB,KAAK,QAAQ;YACtC,CAAC,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE;YACvC,CAAC,CAAC,oBAAoB,CAAC;QAE3B,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAE3E,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC;QAEzD,oBAAoB;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,6DAA6D;gBACtE,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,MAAM,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,qCAAqC,YAAY,8BAA8B;oBACxF,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBACH,oDAAoD;YACtD,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC3C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,CAAC,aAAa,CACnB,cAAc,CAAC,KAAK,EACpB,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,aAAa,EAC1B,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAClC,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,EACrC,eAAe,CAChB,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,MAAmB;QAEnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAChD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;gBACrD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAW,EAAE,CAAW,EAAE;wBACvD,MAAM,EAAG,MAAsC,IAAI,MAAM;wBACzD,UAAU,EAAG,UAAqB,IAAI,CAAC;wBACvC,WAAW,EAAE,IAAI;qBAClB,CAAC,CAAC;oBACH,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,eAAe,GAAW;4BAC9B,QAAQ,EAAE,UAAU;4BACpB,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;4BACtD,MAAM,EAAE,OAAO;4BACf,SAAS,EAAE,EAAE;yBACd,CAAC;wBACF,IAAI,CAAC,gBAAgB,CACnB,MAAM,EACN,CAAC,eAAe,CAAC,EACjB,eAAe,CAAC,WAAW,CAC5B,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,KAAK,CAAC,CAAW,EAAE,CAAW,EAAE;wBACzC,MAAM,EAAG,MAAsC,IAAI,MAAM;wBACzD,UAAU,EAAG,UAAqB,IAAI,CAAC;qBACxC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,cAAc,CAAC;YACpB,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;gBACxB,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAW,EAAE,CAAW,EAAE;wBACvD,MAAM,EAAE,MAAM;wBACd,UAAU,EAAE,CAAC;wBACb,WAAW,EAAE,IAAI;qBAClB,CAAC,CAAC;oBACH,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,eAAe,GAAW;4BAC9B,QAAQ,EAAE,UAAU;4BACpB,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;4BAC7D,MAAM,EAAE,aAAa;4BACrB,SAAS,EAAE,EAAE;yBACd,CAAC;wBACF,IAAI,CAAC,gBAAgB,CACnB,MAAM,EACN,CAAC,eAAe,CAAC,EACjB,eAAe,CAAC,WAAW,CAC5B,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,KAAK,CAAC,CAAW,EAAE,CAAW,EAAE;wBACzC,MAAM,EAAE,MAAM;wBACd,UAAU,EAAE,CAAC;qBACd,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;gBACxB,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAW,EAAE,CAAW,EAAE;wBACvD,MAAM,EAAE,MAAM;wBACd,UAAU,EAAE,CAAC;wBACb,WAAW,EAAE,IAAI;qBAClB,CAAC,CAAC;oBACH,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,eAAe,GAAW;4BAC9B,QAAQ,EAAE,UAAU;4BACpB,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;4BAC7D,MAAM,EAAE,aAAa;4BACrB,SAAS,EAAE,EAAE;yBACd,CAAC;wBACF,IAAI,CAAC,gBAAgB,CACnB,MAAM,EACN,CAAC,eAAe,CAAC,EACjB,eAAe,CAAC,WAAW,CAC5B,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,CAAC,KAAK,CAAC,CAAW,EAAE,CAAW,EAAE;wBACzC,UAAU,EAAE,CAAC;qBACd,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;gBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpC,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,IAAI,CAAC,CAAC;oBACpD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,eAAe,GAAW;4BAC9B,QAAQ,EAAE,UAAU;4BACpB,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;4BACxD,MAAM,EAAE,MAAM;4BACd,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;yBAChC,CAAC;wBACF,IAAI,CAAC,gBAAgB,CACnB,MAAM,EACN,CAAC,eAAe,CAAC,EACjB,eAAe,CAAC,WAAW,CAC5B,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;gBACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,gBAAgB,GAAa,EAAE,CAAC;gBACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;oBACxD,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC5B,IAAI,SAAS,EAAE,CAAC;wBACd,gBAAgB,CAAC,IAAI,CAAC;4BACpB,QAAQ,EAAE,aAAa;4BACvB,WAAW,EAAE,SAAS,MAAM,EAAE;4BAC9B,MAAM,EAAE,OAAO;4BACf,SAAS,EAAE,CAAC,MAAM,CAAC;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,IAAI,SAAS,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC,gBAAgB,CACnB,MAAM,EACN,gBAAgB,EAChB,gBAAgB;yBACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;yBACzB,MAAM,CAAC,OAAO,CAAC;yBACf,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAC5B,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;gBACpD,MAAM,IAAI,CAAC,MAAM,CACd,CAAY,IAAI,CAAC,EACjB,CAAY,IAAI,CAAC,EACjB,QAAmB,IAAI,CAAC,EACxB,QAAmB,IAAI,CAAC,CAC1B,CAAC;gBACF,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC;oBAC5B,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;oBAC7B,MAAM,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;oBAC7B,MAAM,EACJ,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAC5C,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;wBACxC,CAAC,CAAC,SAAS;iBAChB,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;gBACxB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAClC,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;4BACjE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7C,KAAK,EAAE,EAAE;4BACT,WAAW,EAAE,IAAI;yBAClB,CAAC,CAAC;wBACH,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAI,GAAwB,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBACnE,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;wBACpC,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;wBAChC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;4BACf,MAAM,eAAe,GAAW;gCAC9B,QAAQ,EAAE,IAAI;gCACd,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE;gCACtC,MAAM,EAAE,aAAa;gCACrB,SAAS,EAAE,CAAC,EAAE,CAAC;6BAChB,CAAC;4BACF,IAAI,CAAC,gBAAgB,CACnB,MAAM,EACN,CAAC,eAAe,CAAC,EACjB,eAAe,CAAC,WAAW,CAC5B,CAAC;wBACJ,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;4BACrD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;4BAC7C,KAAK,EAAE,EAAE;yBACV,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;gBACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACnD,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC5D,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;wBACtC,IAAI,UAAU,EAAE,CAAC;4BACf,MAAM,eAAe,GAAW;gCAC9B,QAAQ,EAAE,UAAU;gCACpB,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gCACtD,MAAM,EAAE,OAAO;gCACf,SAAS,EAAE,EAAE;6BACd,CAAC;4BACF,IAAI,CAAC,gBAAgB,CACnB,MAAM,EACN,CAAC,eAAe,CAAC,EACjB,eAAe,CAAC,WAAW,CAC5B,CAAC;wBACJ,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC9C,IAAI,IAAI,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxE,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,iFAAiF;gBACjF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;gBACvB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1D,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC;wBAC5B,IAAI,EAAE,MAAM;wBACZ,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;qBACvB,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC;wBAC5B,IAAI,EAAE,MAAM;qBACb,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC;wBAC5B,IAAI,EAAE,SAAS;qBAChB,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,2CAA2C;gBAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,wDAAwD;gBACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD;gBACE,IAAI,CAAC,MAAM,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,wBAAwB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;oBACtD,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,kBAAkB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;iBAC/C,CAAC;QACN,CAAC;IACH,CAAC;IAED,2DAA2D;IACnD,oBAAoB,CAAC,MAAmB;QAC9C,OAAO,OAAO,MAAM,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,CAAC,KAAK,QAAQ;YACjE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG;YAC9B,CAAC,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBACnC,CAAC,CAAC,MAAM,CAAC,QAAQ;gBACjB,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;oBAChC,CAAC,CAAC,MAAM,CAAC,KAAK;oBACd,CAAC,CAAC,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;wBACtC,CAAC,CAAC,MAAM,CAAC,WAAW;wBACpB,CAAC,CAAC,SAAS,CAAC;IACtB,CAAC;IAEO,qBAAqB,CAAC,IAAY,EAAE,CAAU,EAAE,CAAU;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/C,OAAO,GAAG,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CAAC,IAAY;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,OAAO,SAAS,OAAO,GAAG,CAAC;IAC7B,CAAC;IAEO,kBAAkB;QACxB,OAAO,eAAe,CAAC;IACzB,CAAC;IAEO,wBAAwB,CAC9B,WAAwB,EACxB,QAAgB;QAEhB,MAAM,GAAG,GACP,CAAC,OAAO,WAAW,CAAC,MAAM,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrE,CAAC,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ;gBACxC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChD,CAAC;IAEO,gBAAgB,CACtB,WAAwB,EACxB,gBAA0B,EAC1B,QAAgB;QAEhB,IAAI,CAAC,gBAAgB,CAAC,MAAM;YAAE,OAAO;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,WAAW,CAAC;QACpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7C,GAAG,GAAG;YACN,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,WAAW;SAC5C,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC;YAC5B,IAAI,EAAE,KAAK;YACX,WAAW;YACX,OAAO;YACP,iBAAiB,EAAE,WAAW;YAC9B,OAAO,EACL,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ;gBACzC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE;gBAC9B,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC;YACH,uEAAuE;YACvE,yEAAyE;YACzE,IAAI,IAAI,CAAC,WAAW,YAAY,eAAe,EAAE,CAAC;gBAChD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,iBAAiB;oBACpC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;oBAC9B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC;gBAC/B,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,kDAAkD;gBAClD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBACrD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAG7C,mDAAmD,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,EAAE;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,EAAE;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,IAAI,CAAC,MAAM,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,sBAAsB;YAC/B,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAEpE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;gBAC9C,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAChD,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,+BAA+B,MAAM,CAAE,CAAW,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE;gBAC5E,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;CACF","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.js\";\nimport { toTitleCase } from \"../../utils.js\";\nimport { StagehandClosedError } from \"../types/public/sdkErrors.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\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 action.pageUrl = (await this.v3.context.awaitActivePage()).url();\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 const eventType = `V3Cua${toTitleCase(action.type)}`; // e.g. \"V3CuaClick\"\n if (shouldLog) {\n await FlowLogger.runWithLogging(\n {\n eventType,\n eventIdSuffix: \"5\",\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\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 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 const result = await this.agent.execute({ options, logger: this.logger });\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 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 { SessionFileLogger } from \"../flowLogger.js\";\nimport { StagehandClosedError } from \"../types/public/sdkErrors.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\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 action.pageUrl = (await this.v3.context.awaitActivePage()).url();\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 SessionFileLogger.logUnderstudyActionEvent({\n actionType: `v3CUA.${action.type}`,\n target: this.computePointerTarget(action),\n args: [action],\n });\n }\n try {\n await this.executeAction(action);\n } finally {\n if (shouldLog) SessionFileLogger.logUnderstudyActionCompleted();\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\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 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 const result = await this.agent.execute({ options, logger: this.logger });\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 // Emit screenshot event via the bus\n this.v3.bus.emit(\"agent_screenshot_taken_event\", screenshotBuffer);\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 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,7 +1,7 @@
|
|
|
1
1
|
import { generateObject, generateText, NoObjectGeneratedError, } from "ai";
|
|
2
2
|
import { v7 as uuidv7 } from "uuid";
|
|
3
3
|
import { LLMClient } from "./LLMClient.js";
|
|
4
|
-
import {
|
|
4
|
+
import { SessionFileLogger, formatLlmPromptPreview } from "../flowLogger.js";
|
|
5
5
|
import { toJsonSchema } from "../zodCompat.js";
|
|
6
6
|
export class AISdkClient extends LLMClient {
|
|
7
7
|
type = "aisdk";
|
|
@@ -109,13 +109,14 @@ export class AISdkClient extends LLMClient {
|
|
|
109
109
|
if (options.response_model) {
|
|
110
110
|
// Log LLM request for generateObject (extract)
|
|
111
111
|
const llmRequestId = uuidv7();
|
|
112
|
-
const
|
|
112
|
+
const promptPreview = formatLlmPromptPreview(options.messages, {
|
|
113
113
|
hasSchema: true,
|
|
114
114
|
});
|
|
115
|
-
|
|
115
|
+
SessionFileLogger.logLlmRequest({
|
|
116
116
|
requestId: llmRequestId,
|
|
117
117
|
model: this.model.modelId,
|
|
118
|
-
|
|
118
|
+
operation: "generateObject",
|
|
119
|
+
prompt: promptPreview,
|
|
119
120
|
});
|
|
120
121
|
// For models that don't support native structured outputs, add a prompt instruction
|
|
121
122
|
if (needsPromptJsonFallback) {
|
|
@@ -148,9 +149,10 @@ You must respond in JSON format. respond WITH JSON. Do not include any other tex
|
|
|
148
149
|
}
|
|
149
150
|
catch (err) {
|
|
150
151
|
// Log error response to maintain request/response pairing
|
|
151
|
-
|
|
152
|
+
SessionFileLogger.logLlmResponse({
|
|
152
153
|
requestId: llmRequestId,
|
|
153
154
|
model: this.model.modelId,
|
|
155
|
+
operation: "generateObject",
|
|
154
156
|
output: `[error: ${err instanceof Error ? err.message : "unknown"}]`,
|
|
155
157
|
});
|
|
156
158
|
if (NoObjectGeneratedError.isInstance(err)) {
|
|
@@ -200,9 +202,10 @@ You must respond in JSON format. respond WITH JSON. Do not include any other tex
|
|
|
200
202
|
},
|
|
201
203
|
};
|
|
202
204
|
// Log LLM response for generateObject
|
|
203
|
-
|
|
205
|
+
SessionFileLogger.logLlmResponse({
|
|
204
206
|
requestId: llmRequestId,
|
|
205
207
|
model: this.model.modelId,
|
|
208
|
+
operation: "generateObject",
|
|
206
209
|
output: JSON.stringify(objectResponse.object),
|
|
207
210
|
inputTokens: objectResponse.usage.inputTokens,
|
|
208
211
|
outputTokens: objectResponse.usage.outputTokens,
|
|
@@ -241,13 +244,14 @@ You must respond in JSON format. respond WITH JSON. Do not include any other tex
|
|
|
241
244
|
// Log LLM request for generateText (act/observe)
|
|
242
245
|
const llmRequestId = uuidv7();
|
|
243
246
|
const toolCount = Object.keys(tools).length;
|
|
244
|
-
const
|
|
247
|
+
const promptPreview = formatLlmPromptPreview(options.messages, {
|
|
245
248
|
toolCount,
|
|
246
249
|
});
|
|
247
|
-
|
|
250
|
+
SessionFileLogger.logLlmRequest({
|
|
248
251
|
requestId: llmRequestId,
|
|
249
252
|
model: this.model.modelId,
|
|
250
|
-
|
|
253
|
+
operation: "generateText",
|
|
254
|
+
prompt: promptPreview,
|
|
251
255
|
});
|
|
252
256
|
let textResponse;
|
|
253
257
|
try {
|
|
@@ -267,9 +271,10 @@ You must respond in JSON format. respond WITH JSON. Do not include any other tex
|
|
|
267
271
|
}
|
|
268
272
|
catch (err) {
|
|
269
273
|
// Log error response to maintain request/response pairing
|
|
270
|
-
|
|
274
|
+
SessionFileLogger.logLlmResponse({
|
|
271
275
|
requestId: llmRequestId,
|
|
272
276
|
model: this.model.modelId,
|
|
277
|
+
operation: "generateText",
|
|
273
278
|
output: `[error: ${err instanceof Error ? err.message : "unknown"}]`,
|
|
274
279
|
});
|
|
275
280
|
throw err;
|
|
@@ -309,9 +314,10 @@ You must respond in JSON format. respond WITH JSON. Do not include any other tex
|
|
|
309
314
|
},
|
|
310
315
|
};
|
|
311
316
|
// Log LLM response for generateText
|
|
312
|
-
|
|
317
|
+
SessionFileLogger.logLlmResponse({
|
|
313
318
|
requestId: llmRequestId,
|
|
314
319
|
model: this.model.modelId,
|
|
320
|
+
operation: "generateText",
|
|
315
321
|
output: textResponse.text ||
|
|
316
322
|
(transformedToolCalls.length > 0
|
|
317
323
|
? `[${transformedToolCalls.length} tool calls]`
|