@browserbasehq/orca 3.2.0-preview.1 → 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/v3/agent/prompts/agentSystemPrompt.d.ts +2 -0
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +2 -2
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
- package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js +70 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +14 -3
- package/dist/cjs/lib/v3/agent/tools/index.js +7 -3
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +13 -3
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +16 -2
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +5 -0
- package/dist/cjs/lib/v3/v3.js +7 -0
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +2 -0
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +2 -2
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
- package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js +66 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/index.d.ts +14 -3
- package/dist/esm/lib/v3/agent/tools/index.js +7 -3
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +14 -4
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +16 -2
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +5 -0
- package/dist/esm/lib/v3/v3.js +7 -0
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
- package/package.json +1 -3
- package/dist/cjs/lib/v3/agent/tools/search.js.map +0 -1
- package/dist/cjs/tests/unit/rerender-missing-shadows.test.d.ts +0 -1
- package/dist/cjs/tests/unit/rerender-missing-shadows.test.js +0 -209
- package/dist/cjs/tests/unit/rerender-missing-shadows.test.js.map +0 -1
- package/dist/esm/lib/v3/agent/tools/search.js.map +0 -1
- package/dist/esm/tests/unit/rerender-missing-shadows.test.d.ts +0 -1
- package/dist/esm/tests/unit/rerender-missing-shadows.test.js +0 -207
- package/dist/esm/tests/unit/rerender-missing-shadows.test.js.map +0 -1
- /package/dist/cjs/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
- /package/dist/esm/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-types.test.js","sourceRoot":"","sources":["../../../../../tests/unit/public-api/public-types.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\n// Type-level manifest of all expected exported types\n// Since these types don't exist at runtime, we currently need to manually add new publicly exported types\n// to this list ourselves - it's not automatically going to catch changes like our export-surface.test.ts does.\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype ExpectedExportedTypes = {\n // Types from model.ts\n AvailableModel: Stagehand.AvailableModel;\n AvailableCuaModel: Stagehand.AvailableCuaModel;\n ModelProvider: Stagehand.ModelProvider;\n ClientOptions: Stagehand.ClientOptions;\n ModelConfiguration: Stagehand.ModelConfiguration;\n AnthropicJsonSchemaObject: Stagehand.AnthropicJsonSchemaObject;\n AISDKProvider: Stagehand.AISDKProvider;\n AISDKCustomProvider: Stagehand.AISDKCustomProvider;\n LLMTool: Stagehand.LLMTool;\n // Types from methods.ts\n ActOptions: Stagehand.ActOptions;\n ActResult: Stagehand.ActResult;\n ExtractResult: Stagehand.ExtractResult<Stagehand.StagehandZodSchema>;\n Action: Stagehand.Action;\n HistoryEntry: Stagehand.HistoryEntry;\n ExtractOptions: Stagehand.ExtractOptions;\n ObserveOptions: Stagehand.ObserveOptions;\n ObserveResult: Stagehand.ObserveResult;\n V3FunctionName: Stagehand.V3FunctionName;\n // Types from agent.ts\n Tool: Stagehand.Tool;\n AgentAction: Stagehand.AgentAction;\n AgentResult: Stagehand.AgentResult;\n AgentExecuteOptions: Stagehand.AgentExecuteOptions;\n AgentType: Stagehand.AgentType;\n AgentExecutionOptions: Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>;\n AgentHandlerOptions: Stagehand.AgentHandlerOptions;\n ActionExecutionResult: Stagehand.ActionExecutionResult;\n ToolUseItem: Stagehand.ToolUseItem;\n AnthropicMessage: Stagehand.AnthropicMessage;\n AnthropicContentBlock: Stagehand.AnthropicContentBlock;\n AnthropicTextBlock: Stagehand.AnthropicTextBlock;\n AnthropicToolResult: Stagehand.AnthropicToolResult;\n ResponseItem: Stagehand.ResponseItem;\n ComputerCallItem: Stagehand.ComputerCallItem;\n FunctionCallItem: Stagehand.FunctionCallItem;\n ResponseInputItem: Stagehand.ResponseInputItem;\n AgentInstance: Stagehand.AgentInstance;\n AgentProviderType: Stagehand.AgentProviderType;\n AgentModelConfig: Stagehand.AgentModelConfig;\n AgentConfig: Stagehand.AgentConfig;\n AgentToolMode: Stagehand.AgentToolMode;\n VariableValue: Stagehand.VariableValue;\n Variables: Stagehand.Variables;\n AgentCallbacks: Stagehand.AgentCallbacks;\n AgentExecuteCallbacks: Stagehand.AgentExecuteCallbacks;\n AgentStreamCallbacks: Stagehand.AgentStreamCallbacks;\n AgentExecuteOptionsBase: Stagehand.AgentExecuteOptionsBase;\n AgentStreamExecuteOptions: Stagehand.AgentStreamExecuteOptions;\n ModelMessage: Stagehand.ModelMessage;\n // Types from agent/tools\n AgentTools: Stagehand.AgentTools;\n AgentToolTypesMap: Stagehand.AgentToolTypesMap;\n AgentUITools: Stagehand.AgentUITools;\n AgentToolCall: Stagehand.AgentToolCall;\n AgentToolResult: Stagehand.AgentToolResult;\n // Types from logs.ts\n LogLevel: Stagehand.LogLevel;\n LogLine: Stagehand.LogLine;\n Logger: Stagehand.Logger;\n // Types from metrics.ts\n StagehandMetrics: Stagehand.StagehandMetrics;\n // Types from options.ts\n V3Env: Stagehand.V3Env;\n LocalBrowserLaunchOptions: Stagehand.LocalBrowserLaunchOptions;\n V3Options: Stagehand.V3Options;\n // Types from page.ts\n AnyPage: Stagehand.AnyPage;\n Page: Stagehand.Page;\n PlaywrightPage: Stagehand.PlaywrightPage;\n PatchrightPage: Stagehand.PatchrightPage;\n PuppeteerPage: Stagehand.PuppeteerPage;\n ConsoleListener: Stagehand.ConsoleListener;\n LoadState: Stagehand.LoadState;\n // Types from LLMClient.ts\n ChatMessage: Stagehand.ChatMessage;\n ChatMessageContent: Stagehand.ChatMessageContent;\n ChatMessageImageContent: Stagehand.ChatMessageImageContent;\n ChatMessageTextContent: Stagehand.ChatMessageTextContent;\n ChatCompletionOptions: Stagehand.ChatCompletionOptions;\n LLMResponse: Stagehand.LLMResponse;\n CreateChatCompletionOptions: Stagehand.CreateChatCompletionOptions;\n LLMUsage: Stagehand.LLMUsage;\n LLMParsedResponse: Stagehand.LLMParsedResponse<Record<string, unknown>>;\n // Types from zodCompat.ts\n StagehandZodSchema: Stagehand.StagehandZodSchema;\n StagehandZodObject: Stagehand.StagehandZodObject;\n InferStagehandSchema: Stagehand.InferStagehandSchema<Stagehand.StagehandZodSchema>;\n JsonSchemaDocument: Stagehand.JsonSchemaDocument;\n // Types from utils.ts\n JsonSchema: Stagehand.JsonSchema;\n JsonSchemaProperty: Stagehand.JsonSchemaProperty;\n // Types from cookies.ts\n Cookie: Stagehand.Cookie;\n CookieParam: Stagehand.CookieParam;\n ClearCookieOptions: Stagehand.ClearCookieOptions;\n};\n\ndescribe(\"Stagehand public API types\", () => {\n describe(\"AnyPage\", () => {\n type ExpectedAnyPage =\n | Stagehand.PlaywrightPage\n | Stagehand.PuppeteerPage\n | Stagehand.PatchrightPage\n | Stagehand.Page;\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AnyPage>().toEqualTypeOf<ExpectedAnyPage>();\n });\n });\n\n describe(\"ActOptions\", () => {\n type ExpectedActOptions = {\n model?: Stagehand.ModelConfiguration;\n variables?: Stagehand.Variables;\n timeout?: number;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActOptions>().toEqualTypeOf<ExpectedActOptions>();\n });\n });\n\n describe(\"ActResult\", () => {\n type ExpectedActResult = {\n success: boolean;\n message: string;\n actionDescription: string;\n actions: Stagehand.Action[];\n cacheStatus?: \"HIT\" | \"MISS\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActResult>().toEqualTypeOf<ExpectedActResult>();\n });\n });\n\n describe(\"ExtractOptions\", () => {\n type ExpectedExtractOptions = {\n model?: Stagehand.ModelConfiguration;\n timeout?: number;\n selector?: string;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ExtractOptions>().toEqualTypeOf<ExpectedExtractOptions>();\n });\n });\n\n describe(\"ObserveOptions\", () => {\n type ExpectedObserveOptions = {\n model?: Stagehand.ModelConfiguration;\n timeout?: number;\n selector?: string;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ObserveOptions>().toEqualTypeOf<ExpectedObserveOptions>();\n });\n });\n\n describe(\"ObserveResult\", () => {\n it(\"is an Action array with optional cacheStatus\", () => {\n expectTypeOf<Stagehand.ObserveResult>().toExtend<Stagehand.Action[]>();\n expectTypeOf<Stagehand.ObserveResult[\"cacheStatus\"]>().toEqualTypeOf<\n \"HIT\" | \"MISS\" | undefined\n >();\n });\n });\n\n describe(\"Action\", () => {\n type ExpectedAction = {\n selector: string;\n description: string;\n method?: string;\n arguments?: string[];\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Action>().toEqualTypeOf<ExpectedAction>();\n });\n });\n\n describe(\"AgentAction\", () => {\n // AgentAction is a separate type from Action, not an extension\n // It has additional fields like type, reasoning, taskCompleted, etc.\n it(\"has type field\", () => {\n type TestAction = { type: string } & Stagehand.AgentAction;\n expectTypeOf<TestAction[\"type\"]>().toEqualTypeOf<string>();\n });\n });\n\n describe(\"AgentExecuteOptions\", () => {\n type ExpectedAgentExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentExecuteCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentExecuteOptions>().toEqualTypeOf<ExpectedAgentExecuteOptions>();\n });\n });\n\n describe(\"AgentStreamExecuteOptions\", () => {\n type ExpectedAgentStreamExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentStreamCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentStreamExecuteOptions>().toEqualTypeOf<ExpectedAgentStreamExecuteOptions>();\n });\n });\n\n describe(\"AgentExecutionOptions\", () => {\n type ExpectedAgentExecutionOptions<T = Stagehand.AgentExecuteOptions> = {\n options: T;\n logger: (message: Stagehand.LogLine) => void;\n retries?: number;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<\n Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >().toEqualTypeOf<\n ExpectedAgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >();\n });\n });\n\n describe(\"AgentResult\", () => {\n type ExpectedAgentResult = {\n success: boolean;\n message: string;\n actions: Stagehand.AgentAction[];\n completed: boolean;\n metadata?: Record<string, unknown>;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n };\n messages?: Stagehand.ModelMessage[];\n output?: Record<string, unknown>;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentResult>().toEqualTypeOf<ExpectedAgentResult>();\n });\n });\n\n describe(\"AgentConfig\", () => {\n type ExpectedAgentConfig = {\n systemPrompt?: string;\n integrations?: (unknown | string)[];\n tools?: unknown;\n cua?: boolean;\n model?: string | Stagehand.AgentModelConfig<string>;\n executionModel?: string | Stagehand.AgentModelConfig<string>;\n stream?: boolean;\n mode?: Stagehand.AgentToolMode;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentConfig>().toExtend<ExpectedAgentConfig>();\n });\n });\n\n describe(\"AgentToolMode\", () => {\n type ExpectedAgentToolMode = \"dom\" | \"hybrid\" | \"cua\";\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentToolMode>().toEqualTypeOf<ExpectedAgentToolMode>();\n });\n });\n\n describe(\"HistoryEntry\", () => {\n type ExpectedHistoryEntry = {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"agent\";\n parameters: unknown;\n result: unknown;\n timestamp: string;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.HistoryEntry>().toEqualTypeOf<ExpectedHistoryEntry>();\n });\n });\n\n describe(\"Cookie\", () => {\n type ExpectedCookie = {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Cookie>().toEqualTypeOf<ExpectedCookie>();\n });\n });\n\n describe(\"CookieParam\", () => {\n type ExpectedCookieParam = {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n expires?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.CookieParam>().toEqualTypeOf<ExpectedCookieParam>();\n });\n });\n\n describe(\"ClearCookieOptions\", () => {\n type ExpectedClearCookieOptions = {\n name?: string | RegExp;\n domain?: string | RegExp;\n path?: string | RegExp;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ClearCookieOptions>().toEqualTypeOf<ExpectedClearCookieOptions>();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"public-types.test.js","sourceRoot":"","sources":["../../../../../tests/unit/public-api/public-types.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\n// Type-level manifest of all expected exported types\n// Since these types don't exist at runtime, we currently need to manually add new publicly exported types\n// to this list ourselves - it's not automatically going to catch changes like our export-surface.test.ts does.\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype ExpectedExportedTypes = {\n // Types from model.ts\n AvailableModel: Stagehand.AvailableModel;\n AvailableCuaModel: Stagehand.AvailableCuaModel;\n ModelProvider: Stagehand.ModelProvider;\n ClientOptions: Stagehand.ClientOptions;\n ModelConfiguration: Stagehand.ModelConfiguration;\n AnthropicJsonSchemaObject: Stagehand.AnthropicJsonSchemaObject;\n AISDKProvider: Stagehand.AISDKProvider;\n AISDKCustomProvider: Stagehand.AISDKCustomProvider;\n LLMTool: Stagehand.LLMTool;\n // Types from methods.ts\n ActOptions: Stagehand.ActOptions;\n ActResult: Stagehand.ActResult;\n ExtractResult: Stagehand.ExtractResult<Stagehand.StagehandZodSchema>;\n Action: Stagehand.Action;\n HistoryEntry: Stagehand.HistoryEntry;\n ExtractOptions: Stagehand.ExtractOptions;\n ObserveOptions: Stagehand.ObserveOptions;\n ObserveResult: Stagehand.ObserveResult;\n V3FunctionName: Stagehand.V3FunctionName;\n // Types from agent.ts\n Tool: Stagehand.Tool;\n AgentAction: Stagehand.AgentAction;\n AgentResult: Stagehand.AgentResult;\n AgentExecuteOptions: Stagehand.AgentExecuteOptions;\n AgentType: Stagehand.AgentType;\n AgentExecutionOptions: Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>;\n AgentHandlerOptions: Stagehand.AgentHandlerOptions;\n ActionExecutionResult: Stagehand.ActionExecutionResult;\n ToolUseItem: Stagehand.ToolUseItem;\n AnthropicMessage: Stagehand.AnthropicMessage;\n AnthropicContentBlock: Stagehand.AnthropicContentBlock;\n AnthropicTextBlock: Stagehand.AnthropicTextBlock;\n AnthropicToolResult: Stagehand.AnthropicToolResult;\n ResponseItem: Stagehand.ResponseItem;\n ComputerCallItem: Stagehand.ComputerCallItem;\n FunctionCallItem: Stagehand.FunctionCallItem;\n ResponseInputItem: Stagehand.ResponseInputItem;\n AgentInstance: Stagehand.AgentInstance;\n AgentProviderType: Stagehand.AgentProviderType;\n AgentModelConfig: Stagehand.AgentModelConfig;\n AgentConfig: Stagehand.AgentConfig;\n AgentToolMode: Stagehand.AgentToolMode;\n VariableValue: Stagehand.VariableValue;\n Variables: Stagehand.Variables;\n AgentCallbacks: Stagehand.AgentCallbacks;\n AgentExecuteCallbacks: Stagehand.AgentExecuteCallbacks;\n AgentStreamCallbacks: Stagehand.AgentStreamCallbacks;\n AgentExecuteOptionsBase: Stagehand.AgentExecuteOptionsBase;\n AgentStreamExecuteOptions: Stagehand.AgentStreamExecuteOptions;\n ModelMessage: Stagehand.ModelMessage;\n // Types from agent/tools\n AgentTools: Stagehand.AgentTools;\n AgentToolTypesMap: Stagehand.AgentToolTypesMap;\n AgentUITools: Stagehand.AgentUITools;\n AgentToolCall: Stagehand.AgentToolCall;\n AgentToolResult: Stagehand.AgentToolResult;\n // Types from logs.ts\n LogLevel: Stagehand.LogLevel;\n LogLine: Stagehand.LogLine;\n Logger: Stagehand.Logger;\n // Types from metrics.ts\n StagehandMetrics: Stagehand.StagehandMetrics;\n // Types from options.ts\n V3Env: Stagehand.V3Env;\n LocalBrowserLaunchOptions: Stagehand.LocalBrowserLaunchOptions;\n V3Options: Stagehand.V3Options;\n // Types from page.ts\n AnyPage: Stagehand.AnyPage;\n Page: Stagehand.Page;\n PlaywrightPage: Stagehand.PlaywrightPage;\n PatchrightPage: Stagehand.PatchrightPage;\n PuppeteerPage: Stagehand.PuppeteerPage;\n ConsoleListener: Stagehand.ConsoleListener;\n LoadState: Stagehand.LoadState;\n // Types from LLMClient.ts\n ChatMessage: Stagehand.ChatMessage;\n ChatMessageContent: Stagehand.ChatMessageContent;\n ChatMessageImageContent: Stagehand.ChatMessageImageContent;\n ChatMessageTextContent: Stagehand.ChatMessageTextContent;\n ChatCompletionOptions: Stagehand.ChatCompletionOptions;\n LLMResponse: Stagehand.LLMResponse;\n CreateChatCompletionOptions: Stagehand.CreateChatCompletionOptions;\n LLMUsage: Stagehand.LLMUsage;\n LLMParsedResponse: Stagehand.LLMParsedResponse<Record<string, unknown>>;\n // Types from zodCompat.ts\n StagehandZodSchema: Stagehand.StagehandZodSchema;\n StagehandZodObject: Stagehand.StagehandZodObject;\n InferStagehandSchema: Stagehand.InferStagehandSchema<Stagehand.StagehandZodSchema>;\n JsonSchemaDocument: Stagehand.JsonSchemaDocument;\n // Types from utils.ts\n JsonSchema: Stagehand.JsonSchema;\n JsonSchemaProperty: Stagehand.JsonSchemaProperty;\n // Types from cookies.ts\n Cookie: Stagehand.Cookie;\n CookieParam: Stagehand.CookieParam;\n ClearCookieOptions: Stagehand.ClearCookieOptions;\n};\n\ndescribe(\"Stagehand public API types\", () => {\n describe(\"AnyPage\", () => {\n type ExpectedAnyPage =\n | Stagehand.PlaywrightPage\n | Stagehand.PuppeteerPage\n | Stagehand.PatchrightPage\n | Stagehand.Page;\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AnyPage>().toEqualTypeOf<ExpectedAnyPage>();\n });\n });\n\n describe(\"ActOptions\", () => {\n type ExpectedActOptions = {\n model?: Stagehand.ModelConfiguration;\n variables?: Stagehand.Variables;\n timeout?: number;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActOptions>().toEqualTypeOf<ExpectedActOptions>();\n });\n });\n\n describe(\"ActResult\", () => {\n type ExpectedActResult = {\n success: boolean;\n message: string;\n actionDescription: string;\n actions: Stagehand.Action[];\n cacheStatus?: \"HIT\" | \"MISS\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActResult>().toEqualTypeOf<ExpectedActResult>();\n });\n });\n\n describe(\"ExtractOptions\", () => {\n type ExpectedExtractOptions = {\n model?: Stagehand.ModelConfiguration;\n timeout?: number;\n selector?: string;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ExtractOptions>().toEqualTypeOf<ExpectedExtractOptions>();\n });\n });\n\n describe(\"ObserveOptions\", () => {\n type ExpectedObserveOptions = {\n model?: Stagehand.ModelConfiguration;\n timeout?: number;\n selector?: string;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ObserveOptions>().toEqualTypeOf<ExpectedObserveOptions>();\n });\n });\n\n describe(\"ObserveResult\", () => {\n it(\"is an Action array with optional cacheStatus\", () => {\n expectTypeOf<Stagehand.ObserveResult>().toExtend<Stagehand.Action[]>();\n expectTypeOf<Stagehand.ObserveResult[\"cacheStatus\"]>().toEqualTypeOf<\n \"HIT\" | \"MISS\" | undefined\n >();\n });\n });\n\n describe(\"Action\", () => {\n type ExpectedAction = {\n selector: string;\n description: string;\n method?: string;\n arguments?: string[];\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Action>().toEqualTypeOf<ExpectedAction>();\n });\n });\n\n describe(\"AgentAction\", () => {\n // AgentAction is a separate type from Action, not an extension\n // It has additional fields like type, reasoning, taskCompleted, etc.\n it(\"has type field\", () => {\n type TestAction = { type: string } & Stagehand.AgentAction;\n expectTypeOf<TestAction[\"type\"]>().toEqualTypeOf<string>();\n });\n });\n\n describe(\"AgentExecuteOptions\", () => {\n type ExpectedAgentExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentExecuteCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n useSearch?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentExecuteOptions>().toEqualTypeOf<ExpectedAgentExecuteOptions>();\n });\n });\n\n describe(\"AgentStreamExecuteOptions\", () => {\n type ExpectedAgentStreamExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentStreamCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n useSearch?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentStreamExecuteOptions>().toEqualTypeOf<ExpectedAgentStreamExecuteOptions>();\n });\n });\n\n describe(\"AgentExecutionOptions\", () => {\n type ExpectedAgentExecutionOptions<T = Stagehand.AgentExecuteOptions> = {\n options: T;\n logger: (message: Stagehand.LogLine) => void;\n retries?: number;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<\n Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >().toEqualTypeOf<\n ExpectedAgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >();\n });\n });\n\n describe(\"AgentResult\", () => {\n type ExpectedAgentResult = {\n success: boolean;\n message: string;\n actions: Stagehand.AgentAction[];\n completed: boolean;\n metadata?: Record<string, unknown>;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n };\n messages?: Stagehand.ModelMessage[];\n output?: Record<string, unknown>;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentResult>().toEqualTypeOf<ExpectedAgentResult>();\n });\n });\n\n describe(\"AgentConfig\", () => {\n type ExpectedAgentConfig = {\n systemPrompt?: string;\n integrations?: (unknown | string)[];\n tools?: unknown;\n cua?: boolean;\n model?: string | Stagehand.AgentModelConfig<string>;\n executionModel?: string | Stagehand.AgentModelConfig<string>;\n stream?: boolean;\n mode?: Stagehand.AgentToolMode;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentConfig>().toExtend<ExpectedAgentConfig>();\n });\n });\n\n describe(\"AgentToolMode\", () => {\n type ExpectedAgentToolMode = \"dom\" | \"hybrid\" | \"cua\";\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentToolMode>().toEqualTypeOf<ExpectedAgentToolMode>();\n });\n });\n\n describe(\"HistoryEntry\", () => {\n type ExpectedHistoryEntry = {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"agent\";\n parameters: unknown;\n result: unknown;\n timestamp: string;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.HistoryEntry>().toEqualTypeOf<ExpectedHistoryEntry>();\n });\n });\n\n describe(\"Cookie\", () => {\n type ExpectedCookie = {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Cookie>().toEqualTypeOf<ExpectedCookie>();\n });\n });\n\n describe(\"CookieParam\", () => {\n type ExpectedCookieParam = {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n expires?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.CookieParam>().toEqualTypeOf<ExpectedCookieParam>();\n });\n });\n\n describe(\"ClearCookieOptions\", () => {\n type ExpectedClearCookieOptions = {\n name?: string | RegExp;\n domain?: string | RegExp;\n path?: string | RegExp;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ClearCookieOptions>().toEqualTypeOf<ExpectedClearCookieOptions>();\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@browserbasehq/orca",
|
|
3
|
-
"version": "3.2.0-preview.
|
|
3
|
+
"version": "3.2.0-preview.3",
|
|
4
4
|
"description": "An AI web browsing framework focused on simplicity and extensibility.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -71,7 +71,6 @@
|
|
|
71
71
|
"@anthropic-ai/sdk": "0.39.0",
|
|
72
72
|
"@browserbasehq/sdk": "^2.7.0",
|
|
73
73
|
"@google/genai": "^1.22.0",
|
|
74
|
-
"@langchain/openai": "^0.4.4",
|
|
75
74
|
"@modelcontextprotocol/sdk": "^1.17.2",
|
|
76
75
|
"ai": "^5.0.133",
|
|
77
76
|
"devtools-protocol": "^0.0.1464554",
|
|
@@ -97,7 +96,6 @@
|
|
|
97
96
|
"@ai-sdk/perplexity": "^2.0.13",
|
|
98
97
|
"@ai-sdk/togetherai": "^1.0.23",
|
|
99
98
|
"@ai-sdk/xai": "^2.0.26",
|
|
100
|
-
"@langchain/core": "^0.3.40",
|
|
101
99
|
"bufferutil": "^4.0.9",
|
|
102
100
|
"chrome-launcher": "^1.2.0",
|
|
103
101
|
"ollama-ai-provider-v2": "^1.5.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../../lib/v3/agent/tools/search.ts"],"names":[],"mappings":"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","sourcesContent":["import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport interface BraveSearchResult {\n title: string;\n url: string;\n description?: string;\n}\n\ninterface SearchResponse {\n data?: {\n results: BraveSearchResult[];\n };\n error?: string;\n}\n\ninterface BraveWebResult {\n title?: string;\n url?: string;\n description?: string;\n age?: string;\n meta_url?: {\n favicon?: string;\n };\n}\n\ninterface BraveApiResponse {\n web?: {\n results?: BraveWebResult[];\n };\n}\n\nasync function performBraveSearch(query: string): Promise<SearchResponse> {\n try {\n const encodedQuery = encodeURIComponent(query);\n const response = await fetch(\n `https://api.search.brave.com/res/v1/web/search?q=${encodedQuery}`,\n {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Accept-Encoding\": \"gzip\",\n \"X-Subscription-Token\": process.env.BRAVE_API_KEY!,\n },\n },\n );\n\n if (!response.ok) {\n return {\n error: `Brave API error: ${response.status} ${response.statusText}`,\n data: { results: [] },\n };\n }\n\n const data = (await response.json()) as BraveApiResponse;\n const results: BraveSearchResult[] = [];\n\n if (data?.web?.results && Array.isArray(data.web.results)) {\n for (const item of data.web.results.slice(0, 5)) {\n if (item.title && item.url) {\n results.push({\n title: item.title,\n url: item.url,\n description: item.description,\n });\n }\n }\n }\n\n return { data: { results } };\n } catch (error) {\n console.error(\"Search error\", error);\n return {\n error: `Error performing search: ${(error as Error).message}`,\n data: { results: [] },\n };\n }\n}\n\nexport const searchTool = (v3: V3) =>\n tool({\n description:\n \"Perform a web search and returns results. Use this tool when you need information from the web or when you are unsure of the exact URL you want to navigate to. This can be used to find the ideal entry point, resulting in a task that is easier to complete due to starting further in the process.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query to look for on the web\"),\n }),\n execute: async ({ query }) => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: search`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ query }),\n type: \"object\",\n },\n },\n });\n\n const result = await performBraveSearch(query);\n\n v3.recordAgentReplayStep({\n type: \"search\",\n instruction: query,\n playwrightArguments: { query },\n message:\n result.error ?? `Found ${result.data?.results.length ?? 0} results`,\n });\n\n return {\n ...result,\n timestamp: Date.now(),\n };\n },\n });\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const jsdom_1 = require("jsdom");
|
|
4
|
-
const vitest_1 = require("vitest");
|
|
5
|
-
const rerenderMissingShadows_runtime_js_1 = require("../../lib/v3/dom/rerenderMissingShadows.runtime.js");
|
|
6
|
-
const globalRef = globalThis;
|
|
7
|
-
const originalGlobals = {
|
|
8
|
-
window: globalRef.window,
|
|
9
|
-
document: globalRef.document,
|
|
10
|
-
Node: globalRef.Node,
|
|
11
|
-
NodeFilter: globalRef.NodeFilter,
|
|
12
|
-
Element: globalRef.Element,
|
|
13
|
-
HTMLElement: globalRef.HTMLElement,
|
|
14
|
-
Document: globalRef.Document,
|
|
15
|
-
DocumentFragment: globalRef.DocumentFragment,
|
|
16
|
-
ShadowRoot: globalRef.ShadowRoot,
|
|
17
|
-
customElements: globalRef.customElements,
|
|
18
|
-
};
|
|
19
|
-
let dom;
|
|
20
|
-
const installDomGlobals = () => {
|
|
21
|
-
const win = dom.window;
|
|
22
|
-
globalRef.window = win;
|
|
23
|
-
globalRef.document = win.document;
|
|
24
|
-
globalRef.Node = win.Node;
|
|
25
|
-
globalRef.NodeFilter = win.NodeFilter;
|
|
26
|
-
globalRef.Element = win.Element;
|
|
27
|
-
globalRef.HTMLElement = win.HTMLElement;
|
|
28
|
-
globalRef.Document = win.Document;
|
|
29
|
-
globalRef.DocumentFragment =
|
|
30
|
-
win.DocumentFragment;
|
|
31
|
-
globalRef.ShadowRoot = win.ShadowRoot;
|
|
32
|
-
globalRef.customElements =
|
|
33
|
-
win.customElements;
|
|
34
|
-
};
|
|
35
|
-
const restoreDomGlobals = () => {
|
|
36
|
-
for (const [key, value] of Object.entries(originalGlobals)) {
|
|
37
|
-
if (value === undefined) {
|
|
38
|
-
delete globalRef[key];
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
globalRef[key] = value;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.
|
|
47
|
-
* Returns the WeakMap so tests can inspect tracked roots.
|
|
48
|
-
*/
|
|
49
|
-
function installFakePiercer() {
|
|
50
|
-
const closedRoots = new WeakMap();
|
|
51
|
-
const win = globalRef.window;
|
|
52
|
-
win.__stagehandV3__ = {
|
|
53
|
-
getClosedRoot: (el) => closedRoots.get(el) ?? null,
|
|
54
|
-
stats: false,
|
|
55
|
-
};
|
|
56
|
-
return closedRoots;
|
|
57
|
-
}
|
|
58
|
-
(0, vitest_1.describe)("rerenderMissingShadowHosts", () => {
|
|
59
|
-
(0, vitest_1.beforeAll)(() => {
|
|
60
|
-
dom = new jsdom_1.JSDOM("<!doctype html><html><body></body></html>");
|
|
61
|
-
installDomGlobals();
|
|
62
|
-
});
|
|
63
|
-
(0, vitest_1.afterAll)(() => {
|
|
64
|
-
dom.window.close();
|
|
65
|
-
restoreDomGlobals();
|
|
66
|
-
});
|
|
67
|
-
(0, vitest_1.beforeEach)(() => {
|
|
68
|
-
document.body.innerHTML = "";
|
|
69
|
-
// Clean up any stale custom element registrations by recreating the DOM
|
|
70
|
-
// (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)
|
|
71
|
-
});
|
|
72
|
-
(0, vitest_1.it)("re-renders a custom element with closed shadow so piercer can track it", () => {
|
|
73
|
-
const closedRoots = installFakePiercer();
|
|
74
|
-
const tag = "test-closed-a";
|
|
75
|
-
let constructorCalled = 0;
|
|
76
|
-
customElements.define(tag, class extends HTMLElement {
|
|
77
|
-
constructor() {
|
|
78
|
-
super();
|
|
79
|
-
constructorCalled++;
|
|
80
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
81
|
-
root.innerHTML = "<span>shadow</span>";
|
|
82
|
-
// Simulate piercer intercepting attachShadow
|
|
83
|
-
closedRoots.set(this, root);
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
// Manually insert via innerHTML so the constructor fires once for the original
|
|
87
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
88
|
-
const original = document.querySelector(tag);
|
|
89
|
-
// The original was created by innerHTML which does call the constructor in JSDOM
|
|
90
|
-
const callsBefore = constructorCalled;
|
|
91
|
-
// Remove the tracked root to simulate "created before piercer was installed"
|
|
92
|
-
closedRoots.delete(original);
|
|
93
|
-
(0, rerenderMissingShadows_runtime_js_1.rerenderMissingShadowHosts)();
|
|
94
|
-
const fresh = document.querySelector(tag);
|
|
95
|
-
// Constructor was called again for the fresh element
|
|
96
|
-
(0, vitest_1.expect)(constructorCalled).toBe(callsBefore + 1);
|
|
97
|
-
// Piercer now tracks the new element's closed root
|
|
98
|
-
(0, vitest_1.expect)(closedRoots.has(fresh)).toBe(true);
|
|
99
|
-
});
|
|
100
|
-
(0, vitest_1.it)("skips elements that already have an open shadow root", () => {
|
|
101
|
-
installFakePiercer();
|
|
102
|
-
const tag = "test-open-b";
|
|
103
|
-
customElements.define(tag, class extends HTMLElement {
|
|
104
|
-
constructor() {
|
|
105
|
-
super();
|
|
106
|
-
this.attachShadow({ mode: "open" });
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
110
|
-
const original = document.querySelector(tag);
|
|
111
|
-
(0, rerenderMissingShadows_runtime_js_1.rerenderMissingShadowHosts)();
|
|
112
|
-
// Element should NOT have been replaced
|
|
113
|
-
(0, vitest_1.expect)(document.querySelector(tag)).toBe(original);
|
|
114
|
-
});
|
|
115
|
-
(0, vitest_1.it)("skips elements whose closed root is already tracked by piercer", () => {
|
|
116
|
-
const closedRoots = installFakePiercer();
|
|
117
|
-
const tag = "test-tracked-c";
|
|
118
|
-
customElements.define(tag, class extends HTMLElement {
|
|
119
|
-
constructor() {
|
|
120
|
-
super();
|
|
121
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
122
|
-
closedRoots.set(this, root);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
126
|
-
const original = document.querySelector(tag);
|
|
127
|
-
(0, rerenderMissingShadows_runtime_js_1.rerenderMissingShadowHosts)();
|
|
128
|
-
// Element should NOT have been replaced since piercer already knows about it
|
|
129
|
-
(0, vitest_1.expect)(document.querySelector(tag)).toBe(original);
|
|
130
|
-
});
|
|
131
|
-
(0, vitest_1.it)("transfers attributes to the fresh element", () => {
|
|
132
|
-
const closedRoots = installFakePiercer();
|
|
133
|
-
const tag = "test-attrs-d";
|
|
134
|
-
customElements.define(tag, class extends HTMLElement {
|
|
135
|
-
constructor() {
|
|
136
|
-
super();
|
|
137
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
138
|
-
closedRoots.set(this, root);
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
document.body.innerHTML = `<${tag} id="myid" class="foo bar" data-x="123"></${tag}>`;
|
|
142
|
-
const original = document.querySelector(tag);
|
|
143
|
-
// Remove tracking to force re-render
|
|
144
|
-
closedRoots.delete(original);
|
|
145
|
-
(0, rerenderMissingShadows_runtime_js_1.rerenderMissingShadowHosts)();
|
|
146
|
-
const fresh = document.querySelector(tag);
|
|
147
|
-
(0, vitest_1.expect)(fresh).not.toBe(original);
|
|
148
|
-
(0, vitest_1.expect)(fresh.getAttribute("id")).toBe("myid");
|
|
149
|
-
(0, vitest_1.expect)(fresh.getAttribute("class")).toBe("foo bar");
|
|
150
|
-
(0, vitest_1.expect)(fresh.getAttribute("data-x")).toBe("123");
|
|
151
|
-
});
|
|
152
|
-
(0, vitest_1.it)("moves light DOM children to the fresh element", () => {
|
|
153
|
-
const closedRoots = installFakePiercer();
|
|
154
|
-
const tag = "test-children-e";
|
|
155
|
-
customElements.define(tag, class extends HTMLElement {
|
|
156
|
-
constructor() {
|
|
157
|
-
super();
|
|
158
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
159
|
-
root.innerHTML = "<slot></slot>";
|
|
160
|
-
closedRoots.set(this, root);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
document.body.innerHTML = `<${tag}><span class="child1">A</span><span class="child2">B</span></${tag}>`;
|
|
164
|
-
const original = document.querySelector(tag);
|
|
165
|
-
const child1 = original.querySelector(".child1");
|
|
166
|
-
const child2 = original.querySelector(".child2");
|
|
167
|
-
// Remove tracking to force re-render
|
|
168
|
-
closedRoots.delete(original);
|
|
169
|
-
(0, rerenderMissingShadows_runtime_js_1.rerenderMissingShadowHosts)();
|
|
170
|
-
const fresh = document.querySelector(tag);
|
|
171
|
-
(0, vitest_1.expect)(fresh).not.toBe(original);
|
|
172
|
-
// Children should have been moved (same DOM nodes, not cloned)
|
|
173
|
-
(0, vitest_1.expect)(fresh.querySelector(".child1")).toBe(child1);
|
|
174
|
-
(0, vitest_1.expect)(fresh.querySelector(".child2")).toBe(child2);
|
|
175
|
-
(0, vitest_1.expect)(fresh.children.length).toBe(2);
|
|
176
|
-
});
|
|
177
|
-
(0, vitest_1.it)("skips elements whose constructor throws without breaking the rest", () => {
|
|
178
|
-
const closedRoots = installFakePiercer();
|
|
179
|
-
const tagBad = "test-throws-f";
|
|
180
|
-
const tagGood = "test-good-f";
|
|
181
|
-
let badCreated = false;
|
|
182
|
-
customElements.define(tagBad, class extends HTMLElement {
|
|
183
|
-
constructor() {
|
|
184
|
-
super();
|
|
185
|
-
if (badCreated) {
|
|
186
|
-
throw new Error("constructor boom");
|
|
187
|
-
}
|
|
188
|
-
badCreated = true;
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
customElements.define(tagGood, class extends HTMLElement {
|
|
192
|
-
constructor() {
|
|
193
|
-
super();
|
|
194
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
195
|
-
closedRoots.set(this, root);
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;
|
|
199
|
-
// Remove tracking from the good element so it needs re-render
|
|
200
|
-
const goodOriginal = document.querySelector(tagGood);
|
|
201
|
-
closedRoots.delete(goodOriginal);
|
|
202
|
-
// Should not throw even though tagBad's constructor will throw on re-create
|
|
203
|
-
(0, vitest_1.expect)(() => (0, rerenderMissingShadows_runtime_js_1.rerenderMissingShadowHosts)()).not.toThrow();
|
|
204
|
-
// The good element should have been re-rendered successfully
|
|
205
|
-
const freshGood = document.querySelector(tagGood);
|
|
206
|
-
(0, vitest_1.expect)(closedRoots.has(freshGood)).toBe(true);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
//# sourceMappingURL=rerender-missing-shadows.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rerender-missing-shadows.test.js","sourceRoot":"","sources":["../../../../tests/unit/rerender-missing-shadows.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { JSDOM } from \"jsdom\";\nimport { afterAll, beforeAll, beforeEach, describe, expect, it } from \"vitest\";\nimport { rerenderMissingShadowHosts } from \"../../lib/v3/dom/rerenderMissingShadows.runtime.js\";\n\ntype DomGlobals = {\n window: Window & typeof globalThis;\n document: Document;\n Node: typeof Node;\n NodeFilter: typeof NodeFilter;\n Element: typeof Element;\n HTMLElement: typeof HTMLElement;\n Document: typeof Document;\n DocumentFragment: typeof DocumentFragment;\n ShadowRoot: typeof ShadowRoot;\n customElements: CustomElementRegistry;\n};\n\nconst globalRef = globalThis as typeof globalThis & Partial<DomGlobals>;\nconst originalGlobals: Partial<DomGlobals> = {\n window: globalRef.window,\n document: globalRef.document,\n Node: globalRef.Node,\n NodeFilter: globalRef.NodeFilter,\n Element: globalRef.Element,\n HTMLElement: globalRef.HTMLElement,\n Document: globalRef.Document,\n DocumentFragment: globalRef.DocumentFragment,\n ShadowRoot: globalRef.ShadowRoot,\n customElements: globalRef.customElements,\n};\n\nlet dom: JSDOM;\n\nconst installDomGlobals = () => {\n const win = dom.window;\n globalRef.window = win as unknown as Window & typeof globalThis;\n globalRef.document = win.document;\n globalRef.Node = win.Node as unknown as typeof Node;\n globalRef.NodeFilter = win.NodeFilter as unknown as typeof NodeFilter;\n globalRef.Element = win.Element as unknown as typeof Element;\n globalRef.HTMLElement = win.HTMLElement as unknown as typeof HTMLElement;\n globalRef.Document = win.Document as unknown as typeof Document;\n globalRef.DocumentFragment =\n win.DocumentFragment as unknown as typeof DocumentFragment;\n globalRef.ShadowRoot = win.ShadowRoot as unknown as typeof ShadowRoot;\n globalRef.customElements =\n win.customElements as unknown as CustomElementRegistry;\n};\n\nconst restoreDomGlobals = () => {\n for (const [key, value] of Object.entries(originalGlobals)) {\n if (value === undefined) {\n delete (globalRef as Record<string, unknown>)[key];\n } else {\n (globalRef as Record<string, unknown>)[key] = value;\n }\n }\n};\n\n/**\n * Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.\n * Returns the WeakMap so tests can inspect tracked roots.\n */\nfunction installFakePiercer(): WeakMap<Element, ShadowRoot> {\n const closedRoots = new WeakMap<Element, ShadowRoot>();\n const win = globalRef.window as unknown as Record<string, unknown>;\n win.__stagehandV3__ = {\n getClosedRoot: (el: Element) => closedRoots.get(el) ?? null,\n stats: false,\n };\n return closedRoots;\n}\n\ndescribe(\"rerenderMissingShadowHosts\", () => {\n beforeAll(() => {\n dom = new JSDOM(\"<!doctype html><html><body></body></html>\");\n installDomGlobals();\n });\n\n afterAll(() => {\n dom.window.close();\n restoreDomGlobals();\n });\n\n beforeEach(() => {\n document.body.innerHTML = \"\";\n // Clean up any stale custom element registrations by recreating the DOM\n // (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)\n });\n\n it(\"re-renders a custom element with closed shadow so piercer can track it\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-closed-a\";\n let constructorCalled = 0;\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n constructorCalled++;\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<span>shadow</span>\";\n // Simulate piercer intercepting attachShadow\n closedRoots.set(this, root);\n }\n },\n );\n\n // Manually insert via innerHTML so the constructor fires once for the original\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n // The original was created by innerHTML which does call the constructor in JSDOM\n const callsBefore = constructorCalled;\n\n // Remove the tracked root to simulate \"created before piercer was installed\"\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n // Constructor was called again for the fresh element\n expect(constructorCalled).toBe(callsBefore + 1);\n // Piercer now tracks the new element's closed root\n expect(closedRoots.has(fresh)).toBe(true);\n });\n\n it(\"skips elements that already have an open shadow root\", () => {\n installFakePiercer();\n const tag = \"test-open-b\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"skips elements whose closed root is already tracked by piercer\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-tracked-c\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced since piercer already knows about it\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"transfers attributes to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-attrs-d\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag} id=\"myid\" class=\"foo bar\" data-x=\"123\"></${tag}>`;\n const original = document.querySelector(tag)!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n expect(fresh.getAttribute(\"id\")).toBe(\"myid\");\n expect(fresh.getAttribute(\"class\")).toBe(\"foo bar\");\n expect(fresh.getAttribute(\"data-x\")).toBe(\"123\");\n });\n\n it(\"moves light DOM children to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-children-e\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<slot></slot>\";\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}><span class=\"child1\">A</span><span class=\"child2\">B</span></${tag}>`;\n const original = document.querySelector(tag)!;\n const child1 = original.querySelector(\".child1\")!;\n const child2 = original.querySelector(\".child2\")!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n // Children should have been moved (same DOM nodes, not cloned)\n expect(fresh.querySelector(\".child1\")).toBe(child1);\n expect(fresh.querySelector(\".child2\")).toBe(child2);\n expect(fresh.children.length).toBe(2);\n });\n\n it(\"skips elements whose constructor throws without breaking the rest\", () => {\n const closedRoots = installFakePiercer();\n const tagBad = \"test-throws-f\";\n const tagGood = \"test-good-f\";\n let badCreated = false;\n\n customElements.define(\n tagBad,\n class extends HTMLElement {\n constructor() {\n super();\n if (badCreated) {\n throw new Error(\"constructor boom\");\n }\n badCreated = true;\n }\n },\n );\n\n customElements.define(\n tagGood,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;\n // Remove tracking from the good element so it needs re-render\n const goodOriginal = document.querySelector(tagGood)!;\n closedRoots.delete(goodOriginal);\n\n // Should not throw even though tagBad's constructor will throw on re-create\n expect(() => rerenderMissingShadowHosts()).not.toThrow();\n\n // The good element should have been re-rendered successfully\n const freshGood = document.querySelector(tagGood)!;\n expect(closedRoots.has(freshGood)).toBe(true);\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../../lib/v3/agent/tools/search.ts"],"names":[],"mappings":"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","sourcesContent":["import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { V3 } from \"../../v3.js\";\n\nexport interface BraveSearchResult {\n title: string;\n url: string;\n description?: string;\n}\n\ninterface SearchResponse {\n data?: {\n results: BraveSearchResult[];\n };\n error?: string;\n}\n\ninterface BraveWebResult {\n title?: string;\n url?: string;\n description?: string;\n age?: string;\n meta_url?: {\n favicon?: string;\n };\n}\n\ninterface BraveApiResponse {\n web?: {\n results?: BraveWebResult[];\n };\n}\n\nasync function performBraveSearch(query: string): Promise<SearchResponse> {\n try {\n const encodedQuery = encodeURIComponent(query);\n const response = await fetch(\n `https://api.search.brave.com/res/v1/web/search?q=${encodedQuery}`,\n {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Accept-Encoding\": \"gzip\",\n \"X-Subscription-Token\": process.env.BRAVE_API_KEY!,\n },\n },\n );\n\n if (!response.ok) {\n return {\n error: `Brave API error: ${response.status} ${response.statusText}`,\n data: { results: [] },\n };\n }\n\n const data = (await response.json()) as BraveApiResponse;\n const results: BraveSearchResult[] = [];\n\n if (data?.web?.results && Array.isArray(data.web.results)) {\n for (const item of data.web.results.slice(0, 5)) {\n if (item.title && item.url) {\n results.push({\n title: item.title,\n url: item.url,\n description: item.description,\n });\n }\n }\n }\n\n return { data: { results } };\n } catch (error) {\n console.error(\"Search error\", error);\n return {\n error: `Error performing search: ${(error as Error).message}`,\n data: { results: [] },\n };\n }\n}\n\nexport const searchTool = (v3: V3) =>\n tool({\n description:\n \"Perform a web search and returns results. Use this tool when you need information from the web or when you are unsure of the exact URL you want to navigate to. This can be used to find the ideal entry point, resulting in a task that is easier to complete due to starting further in the process.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query to look for on the web\"),\n }),\n execute: async ({ query }) => {\n v3.logger({\n category: \"agent\",\n message: `Agent calling tool: search`,\n level: 1,\n auxiliary: {\n arguments: {\n value: JSON.stringify({ query }),\n type: \"object\",\n },\n },\n });\n\n const result = await performBraveSearch(query);\n\n v3.recordAgentReplayStep({\n type: \"search\",\n instruction: query,\n playwrightArguments: { query },\n message:\n result.error ?? `Found ${result.data?.results.length ?? 0} results`,\n });\n\n return {\n ...result,\n timestamp: Date.now(),\n };\n },\n });\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { JSDOM } from "jsdom";
|
|
2
|
-
import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
|
3
|
-
import { rerenderMissingShadowHosts } from "../../lib/v3/dom/rerenderMissingShadows.runtime.js";
|
|
4
|
-
const globalRef = globalThis;
|
|
5
|
-
const originalGlobals = {
|
|
6
|
-
window: globalRef.window,
|
|
7
|
-
document: globalRef.document,
|
|
8
|
-
Node: globalRef.Node,
|
|
9
|
-
NodeFilter: globalRef.NodeFilter,
|
|
10
|
-
Element: globalRef.Element,
|
|
11
|
-
HTMLElement: globalRef.HTMLElement,
|
|
12
|
-
Document: globalRef.Document,
|
|
13
|
-
DocumentFragment: globalRef.DocumentFragment,
|
|
14
|
-
ShadowRoot: globalRef.ShadowRoot,
|
|
15
|
-
customElements: globalRef.customElements,
|
|
16
|
-
};
|
|
17
|
-
let dom;
|
|
18
|
-
const installDomGlobals = () => {
|
|
19
|
-
const win = dom.window;
|
|
20
|
-
globalRef.window = win;
|
|
21
|
-
globalRef.document = win.document;
|
|
22
|
-
globalRef.Node = win.Node;
|
|
23
|
-
globalRef.NodeFilter = win.NodeFilter;
|
|
24
|
-
globalRef.Element = win.Element;
|
|
25
|
-
globalRef.HTMLElement = win.HTMLElement;
|
|
26
|
-
globalRef.Document = win.Document;
|
|
27
|
-
globalRef.DocumentFragment =
|
|
28
|
-
win.DocumentFragment;
|
|
29
|
-
globalRef.ShadowRoot = win.ShadowRoot;
|
|
30
|
-
globalRef.customElements =
|
|
31
|
-
win.customElements;
|
|
32
|
-
};
|
|
33
|
-
const restoreDomGlobals = () => {
|
|
34
|
-
for (const [key, value] of Object.entries(originalGlobals)) {
|
|
35
|
-
if (value === undefined) {
|
|
36
|
-
delete globalRef[key];
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
globalRef[key] = value;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.
|
|
45
|
-
* Returns the WeakMap so tests can inspect tracked roots.
|
|
46
|
-
*/
|
|
47
|
-
function installFakePiercer() {
|
|
48
|
-
const closedRoots = new WeakMap();
|
|
49
|
-
const win = globalRef.window;
|
|
50
|
-
win.__stagehandV3__ = {
|
|
51
|
-
getClosedRoot: (el) => closedRoots.get(el) ?? null,
|
|
52
|
-
stats: false,
|
|
53
|
-
};
|
|
54
|
-
return closedRoots;
|
|
55
|
-
}
|
|
56
|
-
describe("rerenderMissingShadowHosts", () => {
|
|
57
|
-
beforeAll(() => {
|
|
58
|
-
dom = new JSDOM("<!doctype html><html><body></body></html>");
|
|
59
|
-
installDomGlobals();
|
|
60
|
-
});
|
|
61
|
-
afterAll(() => {
|
|
62
|
-
dom.window.close();
|
|
63
|
-
restoreDomGlobals();
|
|
64
|
-
});
|
|
65
|
-
beforeEach(() => {
|
|
66
|
-
document.body.innerHTML = "";
|
|
67
|
-
// Clean up any stale custom element registrations by recreating the DOM
|
|
68
|
-
// (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)
|
|
69
|
-
});
|
|
70
|
-
it("re-renders a custom element with closed shadow so piercer can track it", () => {
|
|
71
|
-
const closedRoots = installFakePiercer();
|
|
72
|
-
const tag = "test-closed-a";
|
|
73
|
-
let constructorCalled = 0;
|
|
74
|
-
customElements.define(tag, class extends HTMLElement {
|
|
75
|
-
constructor() {
|
|
76
|
-
super();
|
|
77
|
-
constructorCalled++;
|
|
78
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
79
|
-
root.innerHTML = "<span>shadow</span>";
|
|
80
|
-
// Simulate piercer intercepting attachShadow
|
|
81
|
-
closedRoots.set(this, root);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
// Manually insert via innerHTML so the constructor fires once for the original
|
|
85
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
86
|
-
const original = document.querySelector(tag);
|
|
87
|
-
// The original was created by innerHTML which does call the constructor in JSDOM
|
|
88
|
-
const callsBefore = constructorCalled;
|
|
89
|
-
// Remove the tracked root to simulate "created before piercer was installed"
|
|
90
|
-
closedRoots.delete(original);
|
|
91
|
-
rerenderMissingShadowHosts();
|
|
92
|
-
const fresh = document.querySelector(tag);
|
|
93
|
-
// Constructor was called again for the fresh element
|
|
94
|
-
expect(constructorCalled).toBe(callsBefore + 1);
|
|
95
|
-
// Piercer now tracks the new element's closed root
|
|
96
|
-
expect(closedRoots.has(fresh)).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
it("skips elements that already have an open shadow root", () => {
|
|
99
|
-
installFakePiercer();
|
|
100
|
-
const tag = "test-open-b";
|
|
101
|
-
customElements.define(tag, class extends HTMLElement {
|
|
102
|
-
constructor() {
|
|
103
|
-
super();
|
|
104
|
-
this.attachShadow({ mode: "open" });
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
108
|
-
const original = document.querySelector(tag);
|
|
109
|
-
rerenderMissingShadowHosts();
|
|
110
|
-
// Element should NOT have been replaced
|
|
111
|
-
expect(document.querySelector(tag)).toBe(original);
|
|
112
|
-
});
|
|
113
|
-
it("skips elements whose closed root is already tracked by piercer", () => {
|
|
114
|
-
const closedRoots = installFakePiercer();
|
|
115
|
-
const tag = "test-tracked-c";
|
|
116
|
-
customElements.define(tag, class extends HTMLElement {
|
|
117
|
-
constructor() {
|
|
118
|
-
super();
|
|
119
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
120
|
-
closedRoots.set(this, root);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
124
|
-
const original = document.querySelector(tag);
|
|
125
|
-
rerenderMissingShadowHosts();
|
|
126
|
-
// Element should NOT have been replaced since piercer already knows about it
|
|
127
|
-
expect(document.querySelector(tag)).toBe(original);
|
|
128
|
-
});
|
|
129
|
-
it("transfers attributes to the fresh element", () => {
|
|
130
|
-
const closedRoots = installFakePiercer();
|
|
131
|
-
const tag = "test-attrs-d";
|
|
132
|
-
customElements.define(tag, class extends HTMLElement {
|
|
133
|
-
constructor() {
|
|
134
|
-
super();
|
|
135
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
136
|
-
closedRoots.set(this, root);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
document.body.innerHTML = `<${tag} id="myid" class="foo bar" data-x="123"></${tag}>`;
|
|
140
|
-
const original = document.querySelector(tag);
|
|
141
|
-
// Remove tracking to force re-render
|
|
142
|
-
closedRoots.delete(original);
|
|
143
|
-
rerenderMissingShadowHosts();
|
|
144
|
-
const fresh = document.querySelector(tag);
|
|
145
|
-
expect(fresh).not.toBe(original);
|
|
146
|
-
expect(fresh.getAttribute("id")).toBe("myid");
|
|
147
|
-
expect(fresh.getAttribute("class")).toBe("foo bar");
|
|
148
|
-
expect(fresh.getAttribute("data-x")).toBe("123");
|
|
149
|
-
});
|
|
150
|
-
it("moves light DOM children to the fresh element", () => {
|
|
151
|
-
const closedRoots = installFakePiercer();
|
|
152
|
-
const tag = "test-children-e";
|
|
153
|
-
customElements.define(tag, class extends HTMLElement {
|
|
154
|
-
constructor() {
|
|
155
|
-
super();
|
|
156
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
157
|
-
root.innerHTML = "<slot></slot>";
|
|
158
|
-
closedRoots.set(this, root);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
document.body.innerHTML = `<${tag}><span class="child1">A</span><span class="child2">B</span></${tag}>`;
|
|
162
|
-
const original = document.querySelector(tag);
|
|
163
|
-
const child1 = original.querySelector(".child1");
|
|
164
|
-
const child2 = original.querySelector(".child2");
|
|
165
|
-
// Remove tracking to force re-render
|
|
166
|
-
closedRoots.delete(original);
|
|
167
|
-
rerenderMissingShadowHosts();
|
|
168
|
-
const fresh = document.querySelector(tag);
|
|
169
|
-
expect(fresh).not.toBe(original);
|
|
170
|
-
// Children should have been moved (same DOM nodes, not cloned)
|
|
171
|
-
expect(fresh.querySelector(".child1")).toBe(child1);
|
|
172
|
-
expect(fresh.querySelector(".child2")).toBe(child2);
|
|
173
|
-
expect(fresh.children.length).toBe(2);
|
|
174
|
-
});
|
|
175
|
-
it("skips elements whose constructor throws without breaking the rest", () => {
|
|
176
|
-
const closedRoots = installFakePiercer();
|
|
177
|
-
const tagBad = "test-throws-f";
|
|
178
|
-
const tagGood = "test-good-f";
|
|
179
|
-
let badCreated = false;
|
|
180
|
-
customElements.define(tagBad, class extends HTMLElement {
|
|
181
|
-
constructor() {
|
|
182
|
-
super();
|
|
183
|
-
if (badCreated) {
|
|
184
|
-
throw new Error("constructor boom");
|
|
185
|
-
}
|
|
186
|
-
badCreated = true;
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
customElements.define(tagGood, class extends HTMLElement {
|
|
190
|
-
constructor() {
|
|
191
|
-
super();
|
|
192
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
193
|
-
closedRoots.set(this, root);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;
|
|
197
|
-
// Remove tracking from the good element so it needs re-render
|
|
198
|
-
const goodOriginal = document.querySelector(tagGood);
|
|
199
|
-
closedRoots.delete(goodOriginal);
|
|
200
|
-
// Should not throw even though tagBad's constructor will throw on re-create
|
|
201
|
-
expect(() => rerenderMissingShadowHosts()).not.toThrow();
|
|
202
|
-
// The good element should have been re-rendered successfully
|
|
203
|
-
const freshGood = document.querySelector(tagGood);
|
|
204
|
-
expect(closedRoots.has(freshGood)).toBe(true);
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
//# sourceMappingURL=rerender-missing-shadows.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rerender-missing-shadows.test.js","sourceRoot":"","sources":["../../../../tests/unit/rerender-missing-shadows.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { JSDOM } from \"jsdom\";\nimport { afterAll, beforeAll, beforeEach, describe, expect, it } from \"vitest\";\nimport { rerenderMissingShadowHosts } from \"../../lib/v3/dom/rerenderMissingShadows.runtime.js\";\n\ntype DomGlobals = {\n window: Window & typeof globalThis;\n document: Document;\n Node: typeof Node;\n NodeFilter: typeof NodeFilter;\n Element: typeof Element;\n HTMLElement: typeof HTMLElement;\n Document: typeof Document;\n DocumentFragment: typeof DocumentFragment;\n ShadowRoot: typeof ShadowRoot;\n customElements: CustomElementRegistry;\n};\n\nconst globalRef = globalThis as typeof globalThis & Partial<DomGlobals>;\nconst originalGlobals: Partial<DomGlobals> = {\n window: globalRef.window,\n document: globalRef.document,\n Node: globalRef.Node,\n NodeFilter: globalRef.NodeFilter,\n Element: globalRef.Element,\n HTMLElement: globalRef.HTMLElement,\n Document: globalRef.Document,\n DocumentFragment: globalRef.DocumentFragment,\n ShadowRoot: globalRef.ShadowRoot,\n customElements: globalRef.customElements,\n};\n\nlet dom: JSDOM;\n\nconst installDomGlobals = () => {\n const win = dom.window;\n globalRef.window = win as unknown as Window & typeof globalThis;\n globalRef.document = win.document;\n globalRef.Node = win.Node as unknown as typeof Node;\n globalRef.NodeFilter = win.NodeFilter as unknown as typeof NodeFilter;\n globalRef.Element = win.Element as unknown as typeof Element;\n globalRef.HTMLElement = win.HTMLElement as unknown as typeof HTMLElement;\n globalRef.Document = win.Document as unknown as typeof Document;\n globalRef.DocumentFragment =\n win.DocumentFragment as unknown as typeof DocumentFragment;\n globalRef.ShadowRoot = win.ShadowRoot as unknown as typeof ShadowRoot;\n globalRef.customElements =\n win.customElements as unknown as CustomElementRegistry;\n};\n\nconst restoreDomGlobals = () => {\n for (const [key, value] of Object.entries(originalGlobals)) {\n if (value === undefined) {\n delete (globalRef as Record<string, unknown>)[key];\n } else {\n (globalRef as Record<string, unknown>)[key] = value;\n }\n }\n};\n\n/**\n * Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.\n * Returns the WeakMap so tests can inspect tracked roots.\n */\nfunction installFakePiercer(): WeakMap<Element, ShadowRoot> {\n const closedRoots = new WeakMap<Element, ShadowRoot>();\n const win = globalRef.window as unknown as Record<string, unknown>;\n win.__stagehandV3__ = {\n getClosedRoot: (el: Element) => closedRoots.get(el) ?? null,\n stats: false,\n };\n return closedRoots;\n}\n\ndescribe(\"rerenderMissingShadowHosts\", () => {\n beforeAll(() => {\n dom = new JSDOM(\"<!doctype html><html><body></body></html>\");\n installDomGlobals();\n });\n\n afterAll(() => {\n dom.window.close();\n restoreDomGlobals();\n });\n\n beforeEach(() => {\n document.body.innerHTML = \"\";\n // Clean up any stale custom element registrations by recreating the DOM\n // (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)\n });\n\n it(\"re-renders a custom element with closed shadow so piercer can track it\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-closed-a\";\n let constructorCalled = 0;\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n constructorCalled++;\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<span>shadow</span>\";\n // Simulate piercer intercepting attachShadow\n closedRoots.set(this, root);\n }\n },\n );\n\n // Manually insert via innerHTML so the constructor fires once for the original\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n // The original was created by innerHTML which does call the constructor in JSDOM\n const callsBefore = constructorCalled;\n\n // Remove the tracked root to simulate \"created before piercer was installed\"\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n // Constructor was called again for the fresh element\n expect(constructorCalled).toBe(callsBefore + 1);\n // Piercer now tracks the new element's closed root\n expect(closedRoots.has(fresh)).toBe(true);\n });\n\n it(\"skips elements that already have an open shadow root\", () => {\n installFakePiercer();\n const tag = \"test-open-b\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"skips elements whose closed root is already tracked by piercer\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-tracked-c\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced since piercer already knows about it\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"transfers attributes to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-attrs-d\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag} id=\"myid\" class=\"foo bar\" data-x=\"123\"></${tag}>`;\n const original = document.querySelector(tag)!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n expect(fresh.getAttribute(\"id\")).toBe(\"myid\");\n expect(fresh.getAttribute(\"class\")).toBe(\"foo bar\");\n expect(fresh.getAttribute(\"data-x\")).toBe(\"123\");\n });\n\n it(\"moves light DOM children to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-children-e\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<slot></slot>\";\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}><span class=\"child1\">A</span><span class=\"child2\">B</span></${tag}>`;\n const original = document.querySelector(tag)!;\n const child1 = original.querySelector(\".child1\")!;\n const child2 = original.querySelector(\".child2\")!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n // Children should have been moved (same DOM nodes, not cloned)\n expect(fresh.querySelector(\".child1\")).toBe(child1);\n expect(fresh.querySelector(\".child2\")).toBe(child2);\n expect(fresh.children.length).toBe(2);\n });\n\n it(\"skips elements whose constructor throws without breaking the rest\", () => {\n const closedRoots = installFakePiercer();\n const tagBad = \"test-throws-f\";\n const tagGood = \"test-good-f\";\n let badCreated = false;\n\n customElements.define(\n tagBad,\n class extends HTMLElement {\n constructor() {\n super();\n if (badCreated) {\n throw new Error(\"constructor boom\");\n }\n badCreated = true;\n }\n },\n );\n\n customElements.define(\n tagGood,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;\n // Remove tracking from the good element so it needs re-render\n const goodOriginal = document.querySelector(tagGood)!;\n closedRoots.delete(goodOriginal);\n\n // Should not throw even though tagBad's constructor will throw on re-create\n expect(() => rerenderMissingShadowHosts()).not.toThrow();\n\n // The good element should have been re-rendered successfully\n const freshGood = document.querySelector(tagGood)!;\n expect(closedRoots.has(freshGood)).toBe(true);\n });\n});\n"]}
|
|
File without changes
|