@browserbasehq/orca 3.1.0-patch.1 → 3.1.0-patch.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/cli.js +45 -17
- package/dist/cjs/cli.js.map +2 -2
- package/dist/cjs/index.js +192 -123
- package/dist/cjs/index.js.map +3 -3
- package/dist/cjs/lib/logger.d.ts +1 -1
- package/dist/cjs/lib/modelUtils.d.ts +3 -0
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/cjs/lib/v3/api.d.ts +16 -1
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +12 -12
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +2 -2
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +2 -2
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +8 -0
- package/dist/cjs/lib/v3/types/public/index.d.ts +1 -0
- package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/cjs/tests/agent-execution-model.test.js +139 -0
- package/dist/cjs/tests/agent-execution-model.test.js.map +7 -0
- package/dist/cjs/tests/api-multiregion.test.js +73 -0
- package/dist/cjs/tests/api-multiregion.test.js.map +7 -0
- package/dist/cjs/tests/model-utils.test.js +43 -0
- package/dist/cjs/tests/model-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/export-surface.test.js +1 -0
- package/dist/cjs/tests/public-api/export-surface.test.js.map +1 -1
- package/dist/cjs/tests/public-api/llm-and-agents.test.js +1 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/cjs/tests/public-api/public-error-types.test.js +3 -1
- package/dist/cjs/tests/public-api/public-error-types.test.js.map +2 -2
- package/dist/cjs/tests/public-api/v3-core.test.js +1 -0
- package/dist/cjs/tests/public-api/v3-core.test.js.map +1 -1
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js +2 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +1 -1
- package/dist/cjs/tests/understudy-command-exception.test.js +52 -0
- package/dist/cjs/tests/understudy-command-exception.test.js.map +7 -0
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/lib/logger.d.ts +1 -1
- package/dist/esm/lib/modelUtils.d.ts +3 -0
- package/dist/esm/lib/modelUtils.js +7 -2
- package/dist/esm/lib/modelUtils.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +16 -1
- package/dist/esm/lib/v3/api.js +41 -5
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +22 -20
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +5 -2
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisor.js +36 -17
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisorClient.js +2 -1
- package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -1
- package/dist/esm/lib/v3/tests/agent-callbacks.spec.js +12 -12
- package/dist/esm/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/context-addInitScript.spec.js +2 -2
- package/dist/esm/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-content-methods.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-fill.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-fill.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-input-methods.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-select-option.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-select-option.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/page-addInitScript.spec.js +2 -2
- package/dist/esm/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +8 -0
- package/dist/esm/lib/v3/types/public/api.js +5 -3
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/index.d.ts +1 -0
- package/dist/esm/lib/v3/types/public/index.js.map +1 -1
- package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js +12 -6
- package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +7 -8
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/agent-execution-model.test.js +139 -0
- package/dist/esm/tests/agent-execution-model.test.js.map +7 -0
- package/dist/esm/tests/api-multiregion.test.js +73 -0
- package/dist/esm/tests/api-multiregion.test.js.map +7 -0
- package/dist/esm/tests/model-utils.test.js +43 -0
- package/dist/esm/tests/model-utils.test.js.map +7 -0
- package/dist/esm/tests/public-api/export-surface.test.js +1 -0
- package/dist/esm/tests/public-api/export-surface.test.js.map +1 -1
- package/dist/esm/tests/public-api/llm-and-agents.test.js +1 -0
- package/dist/esm/tests/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/esm/tests/public-api/public-error-types.test.js +3 -1
- package/dist/esm/tests/public-api/public-error-types.test.js.map +2 -2
- package/dist/esm/tests/public-api/v3-core.test.js +1 -0
- package/dist/esm/tests/public-api/v3-core.test.js.map +1 -1
- package/dist/esm/tests/snapshot-capture-orchestration.test.js +2 -0
- package/dist/esm/tests/snapshot-capture-orchestration.test.js.map +1 -1
- package/dist/esm/tests/understudy-command-exception.test.js +55 -0
- package/dist/esm/tests/understudy-command-exception.test.js.map +7 -0
- package/package.json +1 -3
|
@@ -150,3 +150,6 @@ export declare class StagehandClosedError extends StagehandError {
|
|
|
150
150
|
export declare class StagehandSnapshotError extends StagehandError {
|
|
151
151
|
constructor(cause?: unknown);
|
|
152
152
|
}
|
|
153
|
+
export declare class UnderstudyCommandException extends StagehandError {
|
|
154
|
+
constructor(message: string, cause?: unknown);
|
|
155
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
var import_vitest = require("vitest");
|
|
2
|
+
var import_act = require("../lib/v3/agent/tools/act.js");
|
|
3
|
+
var import_extract = require("../lib/v3/agent/tools/extract.js");
|
|
4
|
+
var import_fillform = require("../lib/v3/agent/tools/fillform.js");
|
|
5
|
+
function createMockV3() {
|
|
6
|
+
const calls = [];
|
|
7
|
+
const mock = {
|
|
8
|
+
logger: import_vitest.vi.fn(),
|
|
9
|
+
recordAgentReplayStep: import_vitest.vi.fn(),
|
|
10
|
+
act: import_vitest.vi.fn(async (_instruction, options) => {
|
|
11
|
+
calls.push({ method: "act", model: options?.model });
|
|
12
|
+
return {
|
|
13
|
+
success: true,
|
|
14
|
+
message: "ok",
|
|
15
|
+
actionDescription: "clicked",
|
|
16
|
+
actions: []
|
|
17
|
+
};
|
|
18
|
+
}),
|
|
19
|
+
extract: import_vitest.vi.fn(
|
|
20
|
+
async (_instruction, _schema, options) => {
|
|
21
|
+
calls.push({ method: "extract", model: options?.model });
|
|
22
|
+
return { extraction: "data" };
|
|
23
|
+
}
|
|
24
|
+
),
|
|
25
|
+
observe: import_vitest.vi.fn(
|
|
26
|
+
async (_instruction, options) => {
|
|
27
|
+
calls.push({ method: "observe", model: options?.model });
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
),
|
|
31
|
+
calls
|
|
32
|
+
};
|
|
33
|
+
return mock;
|
|
34
|
+
}
|
|
35
|
+
(0, import_vitest.describe)("agent tools pass full executionModel config to v3 methods", () => {
|
|
36
|
+
const modelConfig = {
|
|
37
|
+
modelName: "openai/gpt-4o-mini",
|
|
38
|
+
apiKey: "sk-test-key",
|
|
39
|
+
baseURL: "https://custom.api"
|
|
40
|
+
};
|
|
41
|
+
(0, import_vitest.it)("actTool passes AgentModelConfig object to v3.act()", async () => {
|
|
42
|
+
const v3 = createMockV3();
|
|
43
|
+
const tool = (0, import_act.actTool)(v3, modelConfig);
|
|
44
|
+
await tool.execute(
|
|
45
|
+
{ action: "click the button" },
|
|
46
|
+
{
|
|
47
|
+
toolCallId: "t1",
|
|
48
|
+
messages: [],
|
|
49
|
+
abortSignal: new AbortController().signal
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
(0, import_vitest.expect)(v3.calls).toHaveLength(1);
|
|
53
|
+
(0, import_vitest.expect)(v3.calls[0].method).toBe("act");
|
|
54
|
+
(0, import_vitest.expect)(v3.calls[0].model).toBe(modelConfig);
|
|
55
|
+
});
|
|
56
|
+
(0, import_vitest.it)("extractTool passes AgentModelConfig object to v3.extract()", async () => {
|
|
57
|
+
const v3 = createMockV3();
|
|
58
|
+
const tool = (0, import_extract.extractTool)(v3, modelConfig);
|
|
59
|
+
await tool.execute(
|
|
60
|
+
{ instruction: "get the title", schema: void 0 },
|
|
61
|
+
{
|
|
62
|
+
toolCallId: "t2",
|
|
63
|
+
messages: [],
|
|
64
|
+
abortSignal: new AbortController().signal
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
(0, import_vitest.expect)(v3.calls).toHaveLength(1);
|
|
68
|
+
(0, import_vitest.expect)(v3.calls[0].method).toBe("extract");
|
|
69
|
+
(0, import_vitest.expect)(v3.calls[0].model).toBe(modelConfig);
|
|
70
|
+
});
|
|
71
|
+
(0, import_vitest.it)("fillFormTool passes AgentModelConfig object to v3.observe()", async () => {
|
|
72
|
+
const v3 = createMockV3();
|
|
73
|
+
const tool = (0, import_fillform.fillFormTool)(v3, modelConfig);
|
|
74
|
+
await tool.execute(
|
|
75
|
+
{ fields: [{ action: "type hello into name", value: "hello" }] },
|
|
76
|
+
{
|
|
77
|
+
toolCallId: "t3",
|
|
78
|
+
messages: [],
|
|
79
|
+
abortSignal: new AbortController().signal
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
(0, import_vitest.expect)(v3.calls).toHaveLength(1);
|
|
83
|
+
(0, import_vitest.expect)(v3.calls[0].method).toBe("observe");
|
|
84
|
+
(0, import_vitest.expect)(v3.calls[0].model).toBe(modelConfig);
|
|
85
|
+
});
|
|
86
|
+
(0, import_vitest.it)("actTool passes undefined when no executionModel is set", async () => {
|
|
87
|
+
const v3 = createMockV3();
|
|
88
|
+
const tool = (0, import_act.actTool)(v3, void 0);
|
|
89
|
+
await tool.execute(
|
|
90
|
+
{ action: "click the button" },
|
|
91
|
+
{
|
|
92
|
+
toolCallId: "t4",
|
|
93
|
+
messages: [],
|
|
94
|
+
abortSignal: new AbortController().signal
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
(0, import_vitest.expect)(v3.calls).toHaveLength(1);
|
|
98
|
+
(0, import_vitest.expect)(v3.calls[0].model).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
(0, import_vitest.it)("actTool passes plain string executionModel to v3.act()", async () => {
|
|
101
|
+
const v3 = createMockV3();
|
|
102
|
+
const tool = (0, import_act.actTool)(v3, "openai/gpt-4o-mini");
|
|
103
|
+
await tool.execute(
|
|
104
|
+
{ action: "click the button" },
|
|
105
|
+
{
|
|
106
|
+
toolCallId: "t5",
|
|
107
|
+
messages: [],
|
|
108
|
+
abortSignal: new AbortController().signal
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
(0, import_vitest.expect)(v3.calls).toHaveLength(1);
|
|
112
|
+
(0, import_vitest.expect)(v3.calls[0].model).toBe("openai/gpt-4o-mini");
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
(0, import_vitest.describe)("executionModel fallback logic", () => {
|
|
116
|
+
function resolveExecutionModel(options) {
|
|
117
|
+
return options?.executionModel ?? options?.model;
|
|
118
|
+
}
|
|
119
|
+
(0, import_vitest.it)("prefers explicit executionModel over model", () => {
|
|
120
|
+
const result = resolveExecutionModel({
|
|
121
|
+
executionModel: "openai/gpt-4o-mini",
|
|
122
|
+
model: "anthropic/claude-sonnet-4-20250514"
|
|
123
|
+
});
|
|
124
|
+
(0, import_vitest.expect)(result).toBe("openai/gpt-4o-mini");
|
|
125
|
+
});
|
|
126
|
+
(0, import_vitest.it)("falls back to model when executionModel is not set", () => {
|
|
127
|
+
const modelConfig = {
|
|
128
|
+
modelName: "anthropic/claude-sonnet-4-20250514",
|
|
129
|
+
apiKey: "sk-test"
|
|
130
|
+
};
|
|
131
|
+
const result = resolveExecutionModel({ model: modelConfig });
|
|
132
|
+
(0, import_vitest.expect)(result).toBe(modelConfig);
|
|
133
|
+
});
|
|
134
|
+
(0, import_vitest.it)("returns undefined when neither is set", () => {
|
|
135
|
+
(0, import_vitest.expect)(resolveExecutionModel({})).toBeUndefined();
|
|
136
|
+
(0, import_vitest.expect)(resolveExecutionModel(void 0)).toBeUndefined();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=agent-execution-model.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/agent-execution-model.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it, vi } from \"vitest\";\nimport { actTool } from \"../lib/v3/agent/tools/act.js\";\nimport { extractTool } from \"../lib/v3/agent/tools/extract.js\";\nimport { fillFormTool } from \"../lib/v3/agent/tools/fillform.js\";\nimport type { V3 } from \"../lib/v3/v3.js\";\n\n/**\n * Minimal mock of V3 that captures how tools pass `model` options\n * into v3.act(), v3.extract(), and v3.observe().\n */\nfunction createMockV3() {\n const calls: { method: string; model: unknown }[] = [];\n\n const mock = {\n logger: vi.fn(),\n recordAgentReplayStep: vi.fn(),\n act: vi.fn(async (_instruction: unknown, options?: { model?: unknown }) => {\n calls.push({ method: \"act\", model: options?.model });\n return {\n success: true,\n message: \"ok\",\n actionDescription: \"clicked\",\n actions: [],\n };\n }),\n extract: vi.fn(\n async (\n _instruction: unknown,\n _schema: unknown,\n options?: { model?: unknown },\n ) => {\n calls.push({ method: \"extract\", model: options?.model });\n return { extraction: \"data\" };\n },\n ),\n observe: vi.fn(\n async (_instruction: unknown, options?: { model?: unknown }) => {\n calls.push({ method: \"observe\", model: options?.model });\n return [];\n },\n ),\n calls,\n };\n\n return mock as unknown as V3 & { calls: typeof calls };\n}\n\ndescribe(\"agent tools pass full executionModel config to v3 methods\", () => {\n const modelConfig = {\n modelName: \"openai/gpt-4o-mini\",\n apiKey: \"sk-test-key\",\n baseURL: \"https://custom.api\",\n };\n\n it(\"actTool passes AgentModelConfig object to v3.act()\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, modelConfig);\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t1\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"act\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"extractTool passes AgentModelConfig object to v3.extract()\", async () => {\n const v3 = createMockV3();\n const tool = extractTool(v3, modelConfig);\n await tool.execute!(\n { instruction: \"get the title\", schema: undefined },\n {\n toolCallId: \"t2\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"extract\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"fillFormTool passes AgentModelConfig object to v3.observe()\", async () => {\n const v3 = createMockV3();\n const tool = fillFormTool(v3, modelConfig);\n await tool.execute!(\n { fields: [{ action: \"type hello into name\", value: \"hello\" }] },\n {\n toolCallId: \"t3\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"observe\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"actTool passes undefined when no executionModel is set\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, undefined);\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t4\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].model).toBeUndefined();\n });\n\n it(\"actTool passes plain string executionModel to v3.act()\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, \"openai/gpt-4o-mini\");\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t5\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].model).toBe(\"openai/gpt-4o-mini\");\n });\n});\n\ndescribe(\"executionModel fallback logic\", () => {\n // This mirrors the resolution in V3.prepareAgentExecution (v3.ts:1682):\n // const resolvedExecutionModel = options?.executionModel ?? options?.model;\n function resolveExecutionModel(options?: {\n executionModel?: string | { modelName: string };\n model?: string | { modelName: string };\n }) {\n return options?.executionModel ?? options?.model;\n }\n\n it(\"prefers explicit executionModel over model\", () => {\n const result = resolveExecutionModel({\n executionModel: \"openai/gpt-4o-mini\",\n model: \"anthropic/claude-sonnet-4-20250514\",\n });\n expect(result).toBe(\"openai/gpt-4o-mini\");\n });\n\n it(\"falls back to model when executionModel is not set\", () => {\n const modelConfig = {\n modelName: \"anthropic/claude-sonnet-4-20250514\",\n apiKey: \"sk-test\",\n };\n const result = resolveExecutionModel({ model: modelConfig });\n expect(result).toBe(modelConfig);\n });\n\n it(\"returns undefined when neither is set\", () => {\n expect(resolveExecutionModel({})).toBeUndefined();\n expect(resolveExecutionModel(undefined)).toBeUndefined();\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
var import_vitest = require("vitest");
|
|
2
|
+
var import_api = require("../lib/v3/api");
|
|
3
|
+
(0, import_vitest.describe)("Multi-region API URL mapping", () => {
|
|
4
|
+
(0, import_vitest.describe)("REGION_API_URLS constant", () => {
|
|
5
|
+
(0, import_vitest.it)("should have the correct URL for us-west-2 (default)", () => {
|
|
6
|
+
(0, import_vitest.expect)(import_api.REGION_API_URLS["us-west-2"]).toBe(
|
|
7
|
+
"https://api.stagehand.browserbase.com"
|
|
8
|
+
);
|
|
9
|
+
});
|
|
10
|
+
(0, import_vitest.it)("should have the correct URL for us-east-1", () => {
|
|
11
|
+
(0, import_vitest.expect)(import_api.REGION_API_URLS["us-east-1"]).toBe(
|
|
12
|
+
"https://api.use1.stagehand.browserbase.com"
|
|
13
|
+
);
|
|
14
|
+
});
|
|
15
|
+
(0, import_vitest.it)("should have the correct URL for eu-central-1", () => {
|
|
16
|
+
(0, import_vitest.expect)(import_api.REGION_API_URLS["eu-central-1"]).toBe(
|
|
17
|
+
"https://api.euc1.stagehand.browserbase.com"
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
(0, import_vitest.it)("should have the correct URL for ap-southeast-1", () => {
|
|
21
|
+
(0, import_vitest.expect)(import_api.REGION_API_URLS["ap-southeast-1"]).toBe(
|
|
22
|
+
"https://api.apse1.stagehand.browserbase.com"
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
(0, import_vitest.describe)("getApiUrlForRegion", () => {
|
|
27
|
+
(0, import_vitest.it)("should return the correct URL for us-west-2", () => {
|
|
28
|
+
(0, import_vitest.expect)((0, import_api.getApiUrlForRegion)("us-west-2")).toBe(
|
|
29
|
+
"https://api.stagehand.browserbase.com/v1"
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
(0, import_vitest.it)("should return the correct URL for us-east-1", () => {
|
|
33
|
+
(0, import_vitest.expect)((0, import_api.getApiUrlForRegion)("us-east-1")).toBe(
|
|
34
|
+
"https://api.use1.stagehand.browserbase.com/v1"
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
(0, import_vitest.it)("should return the correct URL for eu-central-1", () => {
|
|
38
|
+
(0, import_vitest.expect)((0, import_api.getApiUrlForRegion)("eu-central-1")).toBe(
|
|
39
|
+
"https://api.euc1.stagehand.browserbase.com/v1"
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
(0, import_vitest.it)("should return the correct URL for ap-southeast-1", () => {
|
|
43
|
+
(0, import_vitest.expect)((0, import_api.getApiUrlForRegion)("ap-southeast-1")).toBe(
|
|
44
|
+
"https://api.apse1.stagehand.browserbase.com/v1"
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
(0, import_vitest.it)("should return the default us-west-2 URL when no region is specified", () => {
|
|
48
|
+
(0, import_vitest.expect)((0, import_api.getApiUrlForRegion)(void 0)).toBe(
|
|
49
|
+
"https://api.stagehand.browserbase.com/v1"
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
(0, import_vitest.it)("should return the default us-west-2 URL for unknown regions", () => {
|
|
53
|
+
(0, import_vitest.expect)((0, import_api.getApiUrlForRegion)("invalid-region")).toBe(
|
|
54
|
+
"https://api.stagehand.browserbase.com/v1"
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
(0, import_vitest.describe)("URL /v1 suffix handling", () => {
|
|
59
|
+
(0, import_vitest.it)("getApiUrlForRegion always includes /v1 suffix for consistency", () => {
|
|
60
|
+
const url = (0, import_api.getApiUrlForRegion)("us-west-2");
|
|
61
|
+
(0, import_vitest.expect)(url.endsWith("/v1")).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
(0, import_vitest.it)("all regional URLs should be base URLs without /v1 in REGION_API_URLS", () => {
|
|
64
|
+
for (const [region, baseUrl] of Object.entries(import_api.REGION_API_URLS)) {
|
|
65
|
+
(0, import_vitest.expect)(baseUrl.endsWith("/v1")).toBe(false);
|
|
66
|
+
(0, import_vitest.expect)((0, import_api.getApiUrlForRegion)(region)).toBe(
|
|
67
|
+
`${baseUrl}/v1`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=api-multiregion.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/api-multiregion.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\nimport { getApiUrlForRegion, REGION_API_URLS } from \"../lib/v3/api\";\n\ndescribe(\"Multi-region API URL mapping\", () => {\n describe(\"REGION_API_URLS constant\", () => {\n it(\"should have the correct URL for us-west-2 (default)\", () => {\n expect(REGION_API_URLS[\"us-west-2\"]).toBe(\n \"https://api.stagehand.browserbase.com\",\n );\n });\n\n it(\"should have the correct URL for us-east-1\", () => {\n expect(REGION_API_URLS[\"us-east-1\"]).toBe(\n \"https://api.use1.stagehand.browserbase.com\",\n );\n });\n\n it(\"should have the correct URL for eu-central-1\", () => {\n expect(REGION_API_URLS[\"eu-central-1\"]).toBe(\n \"https://api.euc1.stagehand.browserbase.com\",\n );\n });\n\n it(\"should have the correct URL for ap-southeast-1\", () => {\n expect(REGION_API_URLS[\"ap-southeast-1\"]).toBe(\n \"https://api.apse1.stagehand.browserbase.com\",\n );\n });\n });\n\n describe(\"getApiUrlForRegion\", () => {\n it(\"should return the correct URL for us-west-2\", () => {\n expect(getApiUrlForRegion(\"us-west-2\")).toBe(\n \"https://api.stagehand.browserbase.com/v1\",\n );\n });\n\n it(\"should return the correct URL for us-east-1\", () => {\n expect(getApiUrlForRegion(\"us-east-1\")).toBe(\n \"https://api.use1.stagehand.browserbase.com/v1\",\n );\n });\n\n it(\"should return the correct URL for eu-central-1\", () => {\n expect(getApiUrlForRegion(\"eu-central-1\")).toBe(\n \"https://api.euc1.stagehand.browserbase.com/v1\",\n );\n });\n\n it(\"should return the correct URL for ap-southeast-1\", () => {\n expect(getApiUrlForRegion(\"ap-southeast-1\")).toBe(\n \"https://api.apse1.stagehand.browserbase.com/v1\",\n );\n });\n\n it(\"should return the default us-west-2 URL when no region is specified\", () => {\n expect(getApiUrlForRegion(undefined)).toBe(\n \"https://api.stagehand.browserbase.com/v1\",\n );\n });\n\n it(\"should return the default us-west-2 URL for unknown regions\", () => {\n // @ts-expect-error - testing invalid region\n expect(getApiUrlForRegion(\"invalid-region\")).toBe(\n \"https://api.stagehand.browserbase.com/v1\",\n );\n });\n });\n\n describe(\"URL /v1 suffix handling\", () => {\n it(\"getApiUrlForRegion always includes /v1 suffix for consistency\", () => {\n // getApiUrlForRegion returns a URL with /v1\n // This documents the expected contract that all API base URLs include /v1\n const url = getApiUrlForRegion(\"us-west-2\");\n expect(url.endsWith(\"/v1\")).toBe(true);\n });\n\n it(\"all regional URLs should be base URLs without /v1 in REGION_API_URLS\", () => {\n // Verify REGION_API_URLS contains base URLs (without /v1)\n // The /v1 suffix is added by getApiUrlForRegion\n for (const [region, baseUrl] of Object.entries(REGION_API_URLS)) {\n expect(baseUrl.endsWith(\"/v1\")).toBe(false);\n expect(getApiUrlForRegion(region as keyof typeof REGION_API_URLS)).toBe(\n `${baseUrl}/v1`,\n );\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,oBAAqC;AACrC,iBAAoD;AAAA,IAEpD,wBAAS,gCAAgC,MAAM;AAC7C,8BAAS,4BAA4B,MAAM;AACzC,0BAAG,uDAAuD,MAAM;AAC9D,gCAAO,2BAAgB,WAAW,CAAC,EAAE;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,6CAA6C,MAAM;AACpD,gCAAO,2BAAgB,WAAW,CAAC,EAAE;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,gDAAgD,MAAM;AACvD,gCAAO,2BAAgB,cAAc,CAAC,EAAE;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,kDAAkD,MAAM;AACzD,gCAAO,2BAAgB,gBAAgB,CAAC,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,sBAAsB,MAAM;AACnC,0BAAG,+CAA+C,MAAM;AACtD,oCAAO,+BAAmB,WAAW,CAAC,EAAE;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,+CAA+C,MAAM;AACtD,oCAAO,+BAAmB,WAAW,CAAC,EAAE;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,kDAAkD,MAAM;AACzD,oCAAO,+BAAmB,cAAc,CAAC,EAAE;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,oDAAoD,MAAM;AAC3D,oCAAO,+BAAmB,gBAAgB,CAAC,EAAE;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,uEAAuE,MAAM;AAC9E,oCAAO,+BAAmB,MAAS,CAAC,EAAE;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC;AAED,0BAAG,+DAA+D,MAAM;AAEtE,oCAAO,+BAAmB,gBAAgB,CAAC,EAAE;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,2BAA2B,MAAM;AACxC,0BAAG,iEAAiE,MAAM;AAGxE,YAAM,UAAM,+BAAmB,WAAW;AAC1C,gCAAO,IAAI,SAAS,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,IACvC,CAAC;AAED,0BAAG,wEAAwE,MAAM;AAG/E,iBAAW,CAAC,QAAQ,OAAO,KAAK,OAAO,QAAQ,0BAAe,GAAG;AAC/D,kCAAO,QAAQ,SAAS,KAAK,CAAC,EAAE,KAAK,KAAK;AAC1C,sCAAO,+BAAmB,MAAsC,CAAC,EAAE;AAAA,UACjE,GAAG,OAAO;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
var import_vitest = require("vitest");
|
|
2
|
+
var import_modelUtils = require("../lib/modelUtils.js");
|
|
3
|
+
(0, import_vitest.describe)("extractModelName", () => {
|
|
4
|
+
(0, import_vitest.it)("returns undefined for undefined input", () => {
|
|
5
|
+
(0, import_vitest.expect)((0, import_modelUtils.extractModelName)(void 0)).toBeUndefined();
|
|
6
|
+
});
|
|
7
|
+
(0, import_vitest.it)("returns the string as-is for a string input", () => {
|
|
8
|
+
(0, import_vitest.expect)((0, import_modelUtils.extractModelName)("openai/gpt-4o")).toBe("openai/gpt-4o");
|
|
9
|
+
});
|
|
10
|
+
(0, import_vitest.it)("returns modelName from an object input", () => {
|
|
11
|
+
(0, import_vitest.expect)(
|
|
12
|
+
(0, import_modelUtils.extractModelName)({ modelName: "anthropic/claude-sonnet-4-20250514" })
|
|
13
|
+
).toBe("anthropic/claude-sonnet-4-20250514");
|
|
14
|
+
});
|
|
15
|
+
(0, import_vitest.it)("returns modelName from an object with extra properties", () => {
|
|
16
|
+
(0, import_vitest.expect)(
|
|
17
|
+
(0, import_modelUtils.extractModelName)({
|
|
18
|
+
modelName: "openai/gpt-4o-mini",
|
|
19
|
+
apiKey: "sk-test",
|
|
20
|
+
baseURL: "https://custom.endpoint"
|
|
21
|
+
})
|
|
22
|
+
).toBe("openai/gpt-4o-mini");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
(0, import_vitest.describe)("resolveModel", () => {
|
|
26
|
+
(0, import_vitest.it)("extracts provider and modelName from a string", () => {
|
|
27
|
+
const result = (0, import_modelUtils.resolveModel)("openai/gpt-4o");
|
|
28
|
+
(0, import_vitest.expect)(result.provider).toBe("openai");
|
|
29
|
+
(0, import_vitest.expect)(result.modelName).toBe("gpt-4o");
|
|
30
|
+
(0, import_vitest.expect)(result.clientOptions).toEqual({});
|
|
31
|
+
});
|
|
32
|
+
(0, import_vitest.it)("extracts clientOptions from an object config", () => {
|
|
33
|
+
const result = (0, import_modelUtils.resolveModel)({
|
|
34
|
+
modelName: "openai/gpt-4o",
|
|
35
|
+
apiKey: "sk-test"
|
|
36
|
+
});
|
|
37
|
+
(0, import_vitest.expect)(result.provider).toBe("openai");
|
|
38
|
+
(0, import_vitest.expect)(result.modelName).toBe("gpt-4o");
|
|
39
|
+
(0, import_vitest.expect)(result.clientOptions).toMatchObject({ apiKey: "sk-test" });
|
|
40
|
+
(0, import_vitest.expect)(result.clientOptions).not.toHaveProperty("modelName");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=model-utils.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/model-utils.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\nimport { extractModelName, resolveModel } from \"../lib/modelUtils.js\";\n\ndescribe(\"extractModelName\", () => {\n it(\"returns undefined for undefined input\", () => {\n expect(extractModelName(undefined)).toBeUndefined();\n });\n\n it(\"returns the string as-is for a string input\", () => {\n expect(extractModelName(\"openai/gpt-4o\")).toBe(\"openai/gpt-4o\");\n });\n\n it(\"returns modelName from an object input\", () => {\n expect(\n extractModelName({ modelName: \"anthropic/claude-sonnet-4-20250514\" }),\n ).toBe(\"anthropic/claude-sonnet-4-20250514\");\n });\n\n it(\"returns modelName from an object with extra properties\", () => {\n expect(\n extractModelName({\n modelName: \"openai/gpt-4o-mini\",\n apiKey: \"sk-test\",\n baseURL: \"https://custom.endpoint\",\n }),\n ).toBe(\"openai/gpt-4o-mini\");\n });\n});\n\ndescribe(\"resolveModel\", () => {\n it(\"extracts provider and modelName from a string\", () => {\n const result = resolveModel(\"openai/gpt-4o\");\n expect(result.provider).toBe(\"openai\");\n expect(result.modelName).toBe(\"gpt-4o\");\n expect(result.clientOptions).toEqual({});\n });\n\n it(\"extracts clientOptions from an object config\", () => {\n const result = resolveModel({\n modelName: \"openai/gpt-4o\" as never,\n apiKey: \"sk-test\",\n });\n expect(result.provider).toBe(\"openai\");\n expect(result.modelName).toBe(\"gpt-4o\");\n expect(result.clientOptions).toMatchObject({ apiKey: \"sk-test\" });\n // modelName should not leak into clientOptions\n expect(result.clientOptions).not.toHaveProperty(\"modelName\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,oBAAqC;AACrC,wBAA+C;AAAA,IAE/C,wBAAS,oBAAoB,MAAM;AACjC,wBAAG,yCAAyC,MAAM;AAChD,kCAAO,oCAAiB,MAAS,CAAC,EAAE,cAAc;AAAA,EACpD,CAAC;AAED,wBAAG,+CAA+C,MAAM;AACtD,kCAAO,oCAAiB,eAAe,CAAC,EAAE,KAAK,eAAe;AAAA,EAChE,CAAC;AAED,wBAAG,0CAA0C,MAAM;AACjD;AAAA,UACE,oCAAiB,EAAE,WAAW,qCAAqC,CAAC;AAAA,IACtE,EAAE,KAAK,oCAAoC;AAAA,EAC7C,CAAC;AAED,wBAAG,0DAA0D,MAAM;AACjE;AAAA,UACE,oCAAiB;AAAA,QACf,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH,EAAE,KAAK,oBAAoB;AAAA,EAC7B,CAAC;AACH,CAAC;AAAA,IAED,wBAAS,gBAAgB,MAAM;AAC7B,wBAAG,iDAAiD,MAAM;AACxD,UAAM,aAAS,gCAAa,eAAe;AAC3C,8BAAO,OAAO,QAAQ,EAAE,KAAK,QAAQ;AACrC,8BAAO,OAAO,SAAS,EAAE,KAAK,QAAQ;AACtC,8BAAO,OAAO,aAAa,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,CAAC;AAED,wBAAG,gDAAgD,MAAM;AACvD,UAAM,aAAS,gCAAa;AAAA,MAC1B,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AACD,8BAAO,OAAO,QAAQ,EAAE,KAAK,QAAQ;AACrC,8BAAO,OAAO,SAAS,EAAE,KAAK,QAAQ;AACtC,8BAAO,OAAO,aAAa,EAAE,cAAc,EAAE,QAAQ,UAAU,CAAC;AAEhE,8BAAO,OAAO,aAAa,EAAE,IAAI,eAAe,WAAW;AAAA,EAC7D,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -66,6 +66,7 @@ const publicApiShape = {
|
|
|
66
66
|
(0, import_vitest.describe)("Stagehand public API export surface", () => {
|
|
67
67
|
(0, import_vitest.it)("public API shape matches module exports", () => {
|
|
68
68
|
const _check = publicApiShape;
|
|
69
|
+
void _check;
|
|
69
70
|
});
|
|
70
71
|
(0, import_vitest.it)("does not expose unexpected top-level exports", () => {
|
|
71
72
|
const expected = Object.keys(publicApiShape).sort();
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../tests/public-api/export-surface.test.ts"],
|
|
4
4
|
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\nimport StagehandDefaultExport, * as Stagehand from \"@browserbasehq/stagehand\";\nimport { publicErrorTypes } from \"./public-error-types.test.js\";\n\n// Type matcher guidelines:\n//\n// toEqualTypeOf \u2013 Default. Assert full, deep type equality; any type change should fail.\n// e.g. expectTypeOf<ReturnType<typeof foo>>().toEqualTypeOf<FooResult>()\n//\n// toMatchObjectType \u2013 Assert (part of) an object's shape while allowing extra fields.\n// e.g. expectTypeOf(user).toMatchObjectType<{ id: string; email: string }>()\n//\n// toExtend \u2013 Assert that a type is compatible with a broader contract (assignable/extends).\n// e.g. expectTypeOf<User>().toExtend<BaseUser>()\n\nconst publicApiShape = {\n __internalMaybeRunShutdownSupervisorFromArgv:\n Stagehand.__internalMaybeRunShutdownSupervisorFromArgv,\n __internalCreateInMemoryAgentCacheHandle:\n Stagehand.__internalCreateInMemoryAgentCacheHandle,\n AISdkClient: Stagehand.AISdkClient,\n Api: Stagehand.Api,\n AVAILABLE_CUA_MODELS: Stagehand.AVAILABLE_CUA_MODELS,\n AgentProvider: Stagehand.AgentProvider,\n AnnotatedScreenshotText: Stagehand.AnnotatedScreenshotText,\n ConsoleMessage: Stagehand.ConsoleMessage,\n CustomOpenAIClient: Stagehand.CustomOpenAIClient,\n LLMClient: Stagehand.LLMClient,\n LOG_LEVEL_NAMES: Stagehand.LOG_LEVEL_NAMES,\n Response: Stagehand.Response,\n Stagehand: Stagehand.Stagehand,\n V3: Stagehand.V3,\n V3Evaluator: Stagehand.V3Evaluator,\n V3FunctionName: Stagehand.V3FunctionName,\n connectToMCPServer: Stagehand.connectToMCPServer,\n default: StagehandDefaultExport,\n defaultExtractSchema: Stagehand.defaultExtractSchema,\n getAISDKLanguageModel: Stagehand.getAISDKLanguageModel,\n getZodType: Stagehand.getZodType,\n injectUrls: Stagehand.injectUrls,\n isRunningInBun: Stagehand.isRunningInBun,\n isZod3Schema: Stagehand.isZod3Schema,\n isZod4Schema: Stagehand.isZod4Schema,\n jsonSchemaToZod: Stagehand.jsonSchemaToZod,\n loadApiKeyFromEnv: Stagehand.loadApiKeyFromEnv,\n localBrowserLaunchOptionsSchema: Stagehand.localBrowserLaunchOptionsSchema,\n modelToAgentProviderMap: Stagehand.modelToAgentProviderMap,\n pageTextSchema: Stagehand.pageTextSchema,\n providerEnvVarMap: Stagehand.providerEnvVarMap,\n toGeminiSchema: Stagehand.toGeminiSchema,\n toJsonSchema: Stagehand.toJsonSchema,\n tool: Stagehand.tool,\n transformSchema: Stagehand.transformSchema,\n trimTrailingTextNode: Stagehand.trimTrailingTextNode,\n validateZodSchema: Stagehand.validateZodSchema,\n ...publicErrorTypes,\n} as const;\n\ntype StagehandExports = typeof Stagehand & {\n default: typeof StagehandDefaultExport;\n};\n\ntype PublicAPI = {\n [K in keyof typeof publicApiShape]: StagehandExports[K];\n};\n\ndescribe(\"Stagehand public API export surface\", () => {\n it(\"public API shape matches module exports\", () => {\n const _check: PublicAPI = publicApiShape;\n void _check;\n });\n\n it(\"does not expose unexpected top-level exports\", () => {\n const expected = Object.keys(publicApiShape).sort();\n const actual = Object.keys(Stagehand).sort();\n expect(actual).toStrictEqual(expected);\n });\n});\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAqC;AACrC,gBAAmD;AACnD,qCAAiC;AAajC,MAAM,iBAAiB;AAAA,EACrB,8CACE,UAAU;AAAA,EACZ,0CACE,UAAU;AAAA,EACZ,aAAa,UAAU;AAAA,EACvB,KAAK,UAAU;AAAA,EACf,sBAAsB,UAAU;AAAA,EAChC,eAAe,UAAU;AAAA,EACzB,yBAAyB,UAAU;AAAA,EACnC,gBAAgB,UAAU;AAAA,EAC1B,oBAAoB,UAAU;AAAA,EAC9B,WAAW,UAAU;AAAA,EACrB,iBAAiB,UAAU;AAAA,EAC3B,UAAU,UAAU;AAAA,EACpB,WAAW,UAAU;AAAA,EACrB,IAAI,UAAU;AAAA,EACd,aAAa,UAAU;AAAA,EACvB,gBAAgB,UAAU;AAAA,EAC1B,oBAAoB,UAAU;AAAA,EAC9B,SAAS,UAAAA;AAAA,EACT,sBAAsB,UAAU;AAAA,EAChC,uBAAuB,UAAU;AAAA,EACjC,YAAY,UAAU;AAAA,EACtB,YAAY,UAAU;AAAA,EACtB,gBAAgB,UAAU;AAAA,EAC1B,cAAc,UAAU;AAAA,EACxB,cAAc,UAAU;AAAA,EACxB,iBAAiB,UAAU;AAAA,EAC3B,mBAAmB,UAAU;AAAA,EAC7B,iCAAiC,UAAU;AAAA,EAC3C,yBAAyB,UAAU;AAAA,EACnC,gBAAgB,UAAU;AAAA,EAC1B,mBAAmB,UAAU;AAAA,EAC7B,gBAAgB,UAAU;AAAA,EAC1B,cAAc,UAAU;AAAA,EACxB,MAAM,UAAU;AAAA,EAChB,iBAAiB,UAAU;AAAA,EAC3B,sBAAsB,UAAU;AAAA,EAChC,mBAAmB,UAAU;AAAA,EAC7B,GAAG;AACL;AAAA,IAUA,wBAAS,uCAAuC,MAAM;AACpD,wBAAG,2CAA2C,MAAM;AAClD,UAAM,SAAoB;AAAA,
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAqC;AACrC,gBAAmD;AACnD,qCAAiC;AAajC,MAAM,iBAAiB;AAAA,EACrB,8CACE,UAAU;AAAA,EACZ,0CACE,UAAU;AAAA,EACZ,aAAa,UAAU;AAAA,EACvB,KAAK,UAAU;AAAA,EACf,sBAAsB,UAAU;AAAA,EAChC,eAAe,UAAU;AAAA,EACzB,yBAAyB,UAAU;AAAA,EACnC,gBAAgB,UAAU;AAAA,EAC1B,oBAAoB,UAAU;AAAA,EAC9B,WAAW,UAAU;AAAA,EACrB,iBAAiB,UAAU;AAAA,EAC3B,UAAU,UAAU;AAAA,EACpB,WAAW,UAAU;AAAA,EACrB,IAAI,UAAU;AAAA,EACd,aAAa,UAAU;AAAA,EACvB,gBAAgB,UAAU;AAAA,EAC1B,oBAAoB,UAAU;AAAA,EAC9B,SAAS,UAAAA;AAAA,EACT,sBAAsB,UAAU;AAAA,EAChC,uBAAuB,UAAU;AAAA,EACjC,YAAY,UAAU;AAAA,EACtB,YAAY,UAAU;AAAA,EACtB,gBAAgB,UAAU;AAAA,EAC1B,cAAc,UAAU;AAAA,EACxB,cAAc,UAAU;AAAA,EACxB,iBAAiB,UAAU;AAAA,EAC3B,mBAAmB,UAAU;AAAA,EAC7B,iCAAiC,UAAU;AAAA,EAC3C,yBAAyB,UAAU;AAAA,EACnC,gBAAgB,UAAU;AAAA,EAC1B,mBAAmB,UAAU;AAAA,EAC7B,gBAAgB,UAAU;AAAA,EAC1B,cAAc,UAAU;AAAA,EACxB,MAAM,UAAU;AAAA,EAChB,iBAAiB,UAAU;AAAA,EAC3B,sBAAsB,UAAU;AAAA,EAChC,mBAAmB,UAAU;AAAA,EAC7B,GAAG;AACL;AAAA,IAUA,wBAAS,uCAAuC,MAAM;AACpD,wBAAG,2CAA2C,MAAM;AAClD,UAAM,SAAoB;AAC1B,SAAK;AAAA,EACP,CAAC;AAED,wBAAG,gDAAgD,MAAM;AACvD,UAAM,WAAW,OAAO,KAAK,cAAc,EAAE,KAAK;AAClD,UAAM,SAAS,OAAO,KAAK,SAAS,EAAE,KAAK;AAC3C,8BAAO,MAAM,EAAE,cAAc,QAAQ;AAAA,EACvC,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": ["StagehandDefaultExport"]
|
|
7
7
|
}
|
|
@@ -51,6 +51,7 @@ var Stagehand = __toESM(require("@browserbasehq/stagehand"), 1);
|
|
|
51
51
|
];
|
|
52
52
|
(0, import_vitest.it)("AvailableCuaModel matches the known literals", () => {
|
|
53
53
|
(0, import_vitest.expectTypeOf)().toEqualTypeOf();
|
|
54
|
+
void expectedModels;
|
|
54
55
|
});
|
|
55
56
|
});
|
|
56
57
|
(0, import_vitest.describe)("AgentProvider", () => {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../tests/public-api/llm-and-agents.test.ts"],
|
|
4
4
|
"sourcesContent": ["import { describe, expect, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\ndescribe(\"LLM and Agents public API types\", () => {\n describe(\"AISdkClient\", () => {\n type AISdkClientInstance = InstanceType<typeof Stagehand.AISdkClient>;\n\n it(\"is exported\", () => {\n expect(Stagehand.AISdkClient).toBeDefined();\n });\n\n it(\"extends LLMClient\", () => {\n expectTypeOf<AISdkClientInstance>().toExtend<Stagehand.LLMClient>();\n });\n\n it(\"constructor accepts model parameter\", () => {\n // AISdkClient constructor takes { model: LanguageModelV2 }\n type CtorParams = ConstructorParameters<typeof Stagehand.AISdkClient>;\n expectTypeOf<CtorParams[\"length\"]>().toEqualTypeOf<1>();\n });\n });\n\n describe(\"AVAILABLE_CUA_MODELS\", () => {\n const expectedModels = [\n \"openai/computer-use-preview\",\n \"openai/computer-use-preview-2025-03-11\",\n \"anthropic/claude-3-7-sonnet-latest\",\n \"anthropic/claude-opus-4-5-20251101\",\n \"anthropic/claude-opus-4-6\",\n \"anthropic/claude-haiku-4-5-20251001\",\n \"anthropic/claude-sonnet-4-20250514\",\n \"anthropic/claude-sonnet-4-5-20250929\",\n \"google/gemini-2.5-computer-use-preview-10-2025\",\n \"google/gemini-3-flash-preview\",\n \"google/gemini-3-pro-preview\",\n \"microsoft/fara-7b\",\n ] as const;\n\n it(\"AvailableCuaModel matches the known literals\", () => {\n expectTypeOf<Stagehand.AvailableCuaModel>().toEqualTypeOf<\n (typeof expectedModels)[number]\n >();\n void expectedModels; // Mark as used to satisfy ESLint\n });\n });\n\n describe(\"AgentProvider\", () => {\n type AgentProviderInstance = InstanceType<typeof Stagehand.AgentProvider>;\n\n it(\"is exported\", () => {\n expect(Stagehand.AgentProvider).toBeDefined();\n });\n\n it(\"has getClient method\", () => {\n expectTypeOf<AgentProviderInstance[\"getClient\"]>().toBeCallableWith(\n \"test-model\",\n );\n });\n\n it(\"constructor accepts logger parameter\", () => {\n expectTypeOf<\n ConstructorParameters<typeof Stagehand.AgentProvider>\n >().toEqualTypeOf<[(message: Stagehand.LogLine) => void]>();\n });\n });\n\n describe(\"AnnotatedScreenshotText\", () => {\n type ExpectedAnnotatedScreenshotText = string;\n\n it(\"is a string literal\", () => {\n expectTypeOf<\n typeof Stagehand.AnnotatedScreenshotText\n >().toExtend<ExpectedAnnotatedScreenshotText>();\n });\n });\n\n describe(\"ConsoleMessage\", () => {\n type ExpectedShape = {\n type: () => string;\n text: () => string;\n args: () => unknown[];\n location: () => {\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n };\n page: () => unknown;\n timestamp: () => number | undefined;\n raw: () => unknown;\n toString: () => string;\n };\n\n type ConsoleMessageInstance = InstanceType<typeof Stagehand.ConsoleMessage>;\n\n it(\"has correct public interface shape\", () => {\n expectTypeOf<ConsoleMessageInstance>().toExtend<ExpectedShape>();\n });\n });\n\n describe(\"AgentClient\", () => {\n type AgentProviderInstance = InstanceType<typeof Stagehand.AgentProvider>;\n type GetClientReturn = ReturnType<AgentProviderInstance[\"getClient\"]>;\n\n it(\"getClient returns object with expected methods\", () => {\n type ExpectedShape = {\n execute: (\n options: Stagehand.AgentExecutionOptions,\n ) => Promise<Stagehand.AgentResult>;\n captureScreenshot: (\n options?: Record<string, unknown>,\n ) => Promise<unknown>;\n setViewport: (width: number, height: number) => void;\n setCurrentUrl: (url: string) => void;\n setScreenshotProvider: (provider: () => Promise<string>) => void;\n setActionHandler: (\n handler: (action: Stagehand.AgentAction) => Promise<void>,\n ) => void;\n };\n expectTypeOf<GetClientReturn>().toExtend<ExpectedShape>();\n });\n });\n\n describe(\"LLMClient\", () => {\n type ExpectedShape = {\n type: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {});\n modelName: Stagehand.AvailableModel | (string & {});\n hasVision: boolean;\n clientOptions: Stagehand.ClientOptions;\n userProvidedInstructions?: string;\n };\n\n type ExpectedCtorParams = [Stagehand.AvailableModel, string?];\n\n type ExpectedBasicOptions = {\n options: {\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string | Array<unknown>;\n }>;\n };\n logger: (message: unknown) => void;\n retries?: number;\n };\n\n type ExpectedWithResponseModel = ExpectedBasicOptions & {\n options: ExpectedBasicOptions[\"options\"] & {\n response_model: {\n name: string;\n schema: Stagehand.StagehandZodSchema;\n };\n };\n };\n\n type LLMClientInstance = InstanceType<typeof Stagehand.LLMClient>;\n\n it(\"has correct public interface shape\", () => {\n expectTypeOf<LLMClientInstance>().toExtend<ExpectedShape>();\n });\n\n it(\"constructor parameters match expected signature\", () => {\n expectTypeOf<\n ConstructorParameters<typeof Stagehand.LLMClient>\n >().toEqualTypeOf<ExpectedCtorParams>();\n });\n\n it(\"createChatCompletion can be called with basic options\", () => {\n expectTypeOf<\n LLMClientInstance[\"createChatCompletion\"]\n >().toBeCallableWith({\n options: {\n messages: [\n {\n role: \"user\",\n content: \"Hello\",\n },\n ],\n },\n logger: () => {},\n } satisfies ExpectedBasicOptions);\n });\n\n it(\"createChatCompletion can be called with response_model\", () => {\n const mockSchema = {} as Stagehand.StagehandZodSchema;\n expectTypeOf<\n LLMClientInstance[\"createChatCompletion\"]\n >().toBeCallableWith({\n options: {\n messages: [\n {\n role: \"user\",\n content: \"Extract data\",\n },\n ],\n response_model: {\n name: \"extracted\",\n schema: mockSchema,\n },\n },\n logger: () => {},\n } satisfies ExpectedWithResponseModel);\n });\n\n it(\"createChatCompletion supports generic return type\", () => {\n type Result = { custom: string };\n type ExpectedSignature = (\n options: Stagehand.CreateChatCompletionOptions,\n ) => Promise<Result>;\n\n expectTypeOf<\n LLMClientInstance[\"createChatCompletion\"]\n >().toExtend<ExpectedSignature>();\n });\n\n it(\"has additional methods\", () => {\n // These methods exist on LLMClient but have complex signatures from the 'ai' library\n // We verify they exist by checking they're functions\n expectTypeOf<LLMClientInstance[\"generateText\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"generateObject\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"streamText\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"streamObject\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"generateImage\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"embed\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"embedMany\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"transcribe\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n expectTypeOf<LLMClientInstance[\"generateSpeech\"]>().toExtend<\n (...args: unknown[]) => unknown\n >();\n });\n });\n\n describe(\"modelToAgentProviderMap\", () => {\n type ExpectedModelToAgentProviderMap = Record<\n string,\n Stagehand.AgentProviderType\n >;\n\n it(\"only stores valid provider types\", () => {\n expectTypeOf<\n typeof Stagehand.modelToAgentProviderMap\n >().toExtend<ExpectedModelToAgentProviderMap>();\n });\n });\n\n describe(\"Response\", () => {\n type ExpectedShape = {\n url: () => string;\n status: () => number;\n statusText: () => string;\n ok: () => boolean;\n frame: () => unknown;\n fromServiceWorker: () => boolean;\n securityDetails: () => Promise<unknown>;\n serverAddr: () => Promise<unknown>;\n headers: () => Record<string, string>;\n allHeaders: () => Promise<Record<string, string>>;\n headerValue: (name: string) => Promise<string | null>;\n headerValues: (name: string) => Promise<string[]>;\n headersArray: () => Promise<Array<{ name: string; value: string }>>;\n body: () => Promise<Buffer>;\n text: () => Promise<string>;\n json: <T = unknown>() => Promise<T>;\n finished: () => Promise<null | Error>;\n markFinished: (error: Error | null) => void;\n applyExtraInfo: (info: unknown) => void;\n };\n\n type ResponseInstance = InstanceType<typeof Stagehand.Response>;\n\n it(\"has correct public interface shape\", () => {\n expectTypeOf<ResponseInstance>().toExtend<ExpectedShape>();\n });\n });\n});\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAmD;AACnD,gBAA2B;AAAA,IAE3B,wBAAS,mCAAmC,MAAM;AAChD,8BAAS,eAAe,MAAM;AAG5B,0BAAG,eAAe,MAAM;AACtB,gCAAO,UAAU,WAAW,EAAE,YAAY;AAAA,IAC5C,CAAC;AAED,0BAAG,qBAAqB,MAAM;AAC5B,sCAAkC,EAAE,SAA8B;AAAA,IACpE,CAAC;AAED,0BAAG,uCAAuC,MAAM;AAG9C,sCAAmC,EAAE,cAAiB;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,wBAAwB,MAAM;AACrC,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,0BAAG,gDAAgD,MAAM;AACvD,sCAA0C,EAAE,cAE1C;AAAA,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -86,7 +86,8 @@ const publicErrorTypes = {
|
|
|
86
86
|
ZodSchemaValidationError: Stagehand.ZodSchemaValidationError,
|
|
87
87
|
ActTimeoutError: Stagehand.ActTimeoutError,
|
|
88
88
|
ObserveTimeoutError: Stagehand.ObserveTimeoutError,
|
|
89
|
-
ExtractTimeoutError: Stagehand.ExtractTimeoutError
|
|
89
|
+
ExtractTimeoutError: Stagehand.ExtractTimeoutError,
|
|
90
|
+
UnderstudyCommandException: Stagehand.UnderstudyCommandException
|
|
90
91
|
};
|
|
91
92
|
const errorTypes = Object.keys(publicErrorTypes);
|
|
92
93
|
(0, import_vitest.describe)("Stagehand public error types", () => {
|
|
@@ -94,6 +95,7 @@ const errorTypes = Object.keys(publicErrorTypes);
|
|
|
94
95
|
import_vitest.it.each(errorTypes)("%s extends Error", (errorTypeName) => {
|
|
95
96
|
const ErrorClass = Stagehand[errorTypeName];
|
|
96
97
|
(0, import_vitest.expectTypeOf)().toExtend();
|
|
98
|
+
void ErrorClass;
|
|
97
99
|
});
|
|
98
100
|
});
|
|
99
101
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../tests/public-api/public-error-types.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { describe, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\nexport const publicErrorTypes = {\n AgentAbortError: Stagehand.AgentAbortError,\n AgentScreenshotProviderError: Stagehand.AgentScreenshotProviderError,\n BrowserbaseSessionNotFoundError: Stagehand.BrowserbaseSessionNotFoundError,\n CaptchaTimeoutError: Stagehand.CaptchaTimeoutError,\n ConnectionTimeoutError: Stagehand.ConnectionTimeoutError,\n ContentFrameNotFoundError: Stagehand.ContentFrameNotFoundError,\n CreateChatCompletionResponseError:\n Stagehand.CreateChatCompletionResponseError,\n CuaModelRequiredError: Stagehand.CuaModelRequiredError,\n ElementNotVisibleError: Stagehand.ElementNotVisibleError,\n ExperimentalApiConflictError: Stagehand.ExperimentalApiConflictError,\n ExperimentalNotConfiguredError: Stagehand.ExperimentalNotConfiguredError,\n HandlerNotInitializedError: Stagehand.HandlerNotInitializedError,\n InvalidAISDKModelFormatError: Stagehand.InvalidAISDKModelFormatError,\n LLMResponseError: Stagehand.LLMResponseError,\n MCPConnectionError: Stagehand.MCPConnectionError,\n MissingEnvironmentVariableError: Stagehand.MissingEnvironmentVariableError,\n MissingLLMConfigurationError: Stagehand.MissingLLMConfigurationError,\n PageNotFoundError: Stagehand.PageNotFoundError,\n ResponseBodyError: Stagehand.ResponseBodyError,\n ResponseParseError: Stagehand.ResponseParseError,\n StagehandAPIError: Stagehand.StagehandAPIError,\n StagehandAPIUnauthorizedError: Stagehand.StagehandAPIUnauthorizedError,\n StagehandClickError: Stagehand.StagehandClickError,\n StagehandClosedError: Stagehand.StagehandClosedError,\n StagehandDefaultError: Stagehand.StagehandDefaultError,\n StagehandDomProcessError: Stagehand.StagehandDomProcessError,\n StagehandElementNotFoundError: Stagehand.StagehandElementNotFoundError,\n StagehandEnvironmentError: Stagehand.StagehandEnvironmentError,\n StagehandError: Stagehand.StagehandError,\n StagehandEvalError: Stagehand.StagehandEvalError,\n StagehandHttpError: Stagehand.StagehandHttpError,\n StagehandIframeError: Stagehand.StagehandIframeError,\n StagehandInitError: Stagehand.StagehandInitError,\n StagehandInvalidArgumentError: Stagehand.StagehandInvalidArgumentError,\n StagehandLocatorError: Stagehand.StagehandLocatorError,\n StagehandMissingArgumentError: Stagehand.StagehandMissingArgumentError,\n StagehandNotInitializedError: Stagehand.StagehandNotInitializedError,\n StagehandResponseBodyError: Stagehand.StagehandResponseBodyError,\n StagehandResponseParseError: Stagehand.StagehandResponseParseError,\n StagehandServerError: Stagehand.StagehandServerError,\n StagehandShadowRootMissingError: Stagehand.StagehandShadowRootMissingError,\n StagehandShadowSegmentEmptyError: Stagehand.StagehandShadowSegmentEmptyError,\n StagehandShadowSegmentNotFoundError:\n Stagehand.StagehandShadowSegmentNotFoundError,\n StreamingCallbacksInNonStreamingModeError:\n Stagehand.StreamingCallbacksInNonStreamingModeError,\n StagehandSnapshotError: Stagehand.StagehandSnapshotError,\n TimeoutError: Stagehand.TimeoutError,\n UnsupportedAISDKModelProviderError:\n Stagehand.UnsupportedAISDKModelProviderError,\n UnsupportedModelError: Stagehand.UnsupportedModelError,\n UnsupportedModelProviderError: Stagehand.UnsupportedModelProviderError,\n XPathResolutionError: Stagehand.XPathResolutionError,\n ZodSchemaValidationError: Stagehand.ZodSchemaValidationError,\n ActTimeoutError: Stagehand.ActTimeoutError,\n ObserveTimeoutError: Stagehand.ObserveTimeoutError,\n ExtractTimeoutError: Stagehand.ExtractTimeoutError,\n} as const;\n\nconst errorTypes = Object.keys(publicErrorTypes) as Array<\n keyof typeof publicErrorTypes\n>;\n\ndescribe(\"Stagehand public error types\", () => {\n describe(\"errors\", () => {\n it.each(errorTypes)(\"%s extends Error\", (errorTypeName) => {\n const ErrorClass = Stagehand[errorTypeName];\n type ErrorClassType = typeof ErrorClass;\n expectTypeOf<InstanceType<ErrorClassType>>().toExtend<Error>();\n void ErrorClass; // Mark as used to satisfy ESLint\n });\n });\n});\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA2C;AAC3C,gBAA2B;AAEpB,MAAM,mBAAmB;AAAA,EAC9B,iBAAiB,UAAU;AAAA,EAC3B,8BAA8B,UAAU;AAAA,EACxC,iCAAiC,UAAU;AAAA,EAC3C,qBAAqB,UAAU;AAAA,EAC/B,wBAAwB,UAAU;AAAA,EAClC,2BAA2B,UAAU;AAAA,EACrC,mCACE,UAAU;AAAA,EACZ,uBAAuB,UAAU;AAAA,EACjC,wBAAwB,UAAU;AAAA,EAClC,8BAA8B,UAAU;AAAA,EACxC,gCAAgC,UAAU;AAAA,EAC1C,4BAA4B,UAAU;AAAA,EACtC,8BAA8B,UAAU;AAAA,EACxC,kBAAkB,UAAU;AAAA,EAC5B,oBAAoB,UAAU;AAAA,EAC9B,iCAAiC,UAAU;AAAA,EAC3C,8BAA8B,UAAU;AAAA,EACxC,mBAAmB,UAAU;AAAA,EAC7B,mBAAmB,UAAU;AAAA,EAC7B,oBAAoB,UAAU;AAAA,EAC9B,mBAAmB,UAAU;AAAA,EAC7B,+BAA+B,UAAU;AAAA,EACzC,qBAAqB,UAAU;AAAA,EAC/B,sBAAsB,UAAU;AAAA,EAChC,uBAAuB,UAAU;AAAA,EACjC,0BAA0B,UAAU;AAAA,EACpC,+BAA+B,UAAU;AAAA,EACzC,2BAA2B,UAAU;AAAA,EACrC,gBAAgB,UAAU;AAAA,EAC1B,oBAAoB,UAAU;AAAA,EAC9B,oBAAoB,UAAU;AAAA,EAC9B,sBAAsB,UAAU;AAAA,EAChC,oBAAoB,UAAU;AAAA,EAC9B,+BAA+B,UAAU;AAAA,EACzC,uBAAuB,UAAU;AAAA,EACjC,+BAA+B,UAAU;AAAA,EACzC,8BAA8B,UAAU;AAAA,EACxC,4BAA4B,UAAU;AAAA,EACtC,6BAA6B,UAAU;AAAA,EACvC,sBAAsB,UAAU;AAAA,EAChC,iCAAiC,UAAU;AAAA,EAC3C,kCAAkC,UAAU;AAAA,EAC5C,qCACE,UAAU;AAAA,EACZ,2CACE,UAAU;AAAA,EACZ,wBAAwB,UAAU;AAAA,EAClC,cAAc,UAAU;AAAA,EACxB,oCACE,UAAU;AAAA,EACZ,uBAAuB,UAAU;AAAA,EACjC,+BAA+B,UAAU;AAAA,EACzC,sBAAsB,UAAU;AAAA,EAChC,0BAA0B,UAAU;AAAA,EACpC,iBAAiB,UAAU;AAAA,EAC3B,qBAAqB,UAAU;AAAA,EAC/B,qBAAqB,UAAU;
|
|
4
|
+
"sourcesContent": ["import { describe, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\nexport const publicErrorTypes = {\n AgentAbortError: Stagehand.AgentAbortError,\n AgentScreenshotProviderError: Stagehand.AgentScreenshotProviderError,\n BrowserbaseSessionNotFoundError: Stagehand.BrowserbaseSessionNotFoundError,\n CaptchaTimeoutError: Stagehand.CaptchaTimeoutError,\n ConnectionTimeoutError: Stagehand.ConnectionTimeoutError,\n ContentFrameNotFoundError: Stagehand.ContentFrameNotFoundError,\n CreateChatCompletionResponseError:\n Stagehand.CreateChatCompletionResponseError,\n CuaModelRequiredError: Stagehand.CuaModelRequiredError,\n ElementNotVisibleError: Stagehand.ElementNotVisibleError,\n ExperimentalApiConflictError: Stagehand.ExperimentalApiConflictError,\n ExperimentalNotConfiguredError: Stagehand.ExperimentalNotConfiguredError,\n HandlerNotInitializedError: Stagehand.HandlerNotInitializedError,\n InvalidAISDKModelFormatError: Stagehand.InvalidAISDKModelFormatError,\n LLMResponseError: Stagehand.LLMResponseError,\n MCPConnectionError: Stagehand.MCPConnectionError,\n MissingEnvironmentVariableError: Stagehand.MissingEnvironmentVariableError,\n MissingLLMConfigurationError: Stagehand.MissingLLMConfigurationError,\n PageNotFoundError: Stagehand.PageNotFoundError,\n ResponseBodyError: Stagehand.ResponseBodyError,\n ResponseParseError: Stagehand.ResponseParseError,\n StagehandAPIError: Stagehand.StagehandAPIError,\n StagehandAPIUnauthorizedError: Stagehand.StagehandAPIUnauthorizedError,\n StagehandClickError: Stagehand.StagehandClickError,\n StagehandClosedError: Stagehand.StagehandClosedError,\n StagehandDefaultError: Stagehand.StagehandDefaultError,\n StagehandDomProcessError: Stagehand.StagehandDomProcessError,\n StagehandElementNotFoundError: Stagehand.StagehandElementNotFoundError,\n StagehandEnvironmentError: Stagehand.StagehandEnvironmentError,\n StagehandError: Stagehand.StagehandError,\n StagehandEvalError: Stagehand.StagehandEvalError,\n StagehandHttpError: Stagehand.StagehandHttpError,\n StagehandIframeError: Stagehand.StagehandIframeError,\n StagehandInitError: Stagehand.StagehandInitError,\n StagehandInvalidArgumentError: Stagehand.StagehandInvalidArgumentError,\n StagehandLocatorError: Stagehand.StagehandLocatorError,\n StagehandMissingArgumentError: Stagehand.StagehandMissingArgumentError,\n StagehandNotInitializedError: Stagehand.StagehandNotInitializedError,\n StagehandResponseBodyError: Stagehand.StagehandResponseBodyError,\n StagehandResponseParseError: Stagehand.StagehandResponseParseError,\n StagehandServerError: Stagehand.StagehandServerError,\n StagehandShadowRootMissingError: Stagehand.StagehandShadowRootMissingError,\n StagehandShadowSegmentEmptyError: Stagehand.StagehandShadowSegmentEmptyError,\n StagehandShadowSegmentNotFoundError:\n Stagehand.StagehandShadowSegmentNotFoundError,\n StreamingCallbacksInNonStreamingModeError:\n Stagehand.StreamingCallbacksInNonStreamingModeError,\n StagehandSnapshotError: Stagehand.StagehandSnapshotError,\n TimeoutError: Stagehand.TimeoutError,\n UnsupportedAISDKModelProviderError:\n Stagehand.UnsupportedAISDKModelProviderError,\n UnsupportedModelError: Stagehand.UnsupportedModelError,\n UnsupportedModelProviderError: Stagehand.UnsupportedModelProviderError,\n XPathResolutionError: Stagehand.XPathResolutionError,\n ZodSchemaValidationError: Stagehand.ZodSchemaValidationError,\n ActTimeoutError: Stagehand.ActTimeoutError,\n ObserveTimeoutError: Stagehand.ObserveTimeoutError,\n ExtractTimeoutError: Stagehand.ExtractTimeoutError,\n UnderstudyCommandException: Stagehand.UnderstudyCommandException,\n} as const;\n\nconst errorTypes = Object.keys(publicErrorTypes) as Array<\n keyof typeof publicErrorTypes\n>;\n\ndescribe(\"Stagehand public error types\", () => {\n describe(\"errors\", () => {\n it.each(errorTypes)(\"%s extends Error\", (errorTypeName) => {\n const ErrorClass = Stagehand[errorTypeName];\n type ErrorClassType = typeof ErrorClass;\n expectTypeOf<InstanceType<ErrorClassType>>().toExtend<Error>();\n void ErrorClass; // Mark as used to satisfy ESLint\n });\n });\n});\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA2C;AAC3C,gBAA2B;AAEpB,MAAM,mBAAmB;AAAA,EAC9B,iBAAiB,UAAU;AAAA,EAC3B,8BAA8B,UAAU;AAAA,EACxC,iCAAiC,UAAU;AAAA,EAC3C,qBAAqB,UAAU;AAAA,EAC/B,wBAAwB,UAAU;AAAA,EAClC,2BAA2B,UAAU;AAAA,EACrC,mCACE,UAAU;AAAA,EACZ,uBAAuB,UAAU;AAAA,EACjC,wBAAwB,UAAU;AAAA,EAClC,8BAA8B,UAAU;AAAA,EACxC,gCAAgC,UAAU;AAAA,EAC1C,4BAA4B,UAAU;AAAA,EACtC,8BAA8B,UAAU;AAAA,EACxC,kBAAkB,UAAU;AAAA,EAC5B,oBAAoB,UAAU;AAAA,EAC9B,iCAAiC,UAAU;AAAA,EAC3C,8BAA8B,UAAU;AAAA,EACxC,mBAAmB,UAAU;AAAA,EAC7B,mBAAmB,UAAU;AAAA,EAC7B,oBAAoB,UAAU;AAAA,EAC9B,mBAAmB,UAAU;AAAA,EAC7B,+BAA+B,UAAU;AAAA,EACzC,qBAAqB,UAAU;AAAA,EAC/B,sBAAsB,UAAU;AAAA,EAChC,uBAAuB,UAAU;AAAA,EACjC,0BAA0B,UAAU;AAAA,EACpC,+BAA+B,UAAU;AAAA,EACzC,2BAA2B,UAAU;AAAA,EACrC,gBAAgB,UAAU;AAAA,EAC1B,oBAAoB,UAAU;AAAA,EAC9B,oBAAoB,UAAU;AAAA,EAC9B,sBAAsB,UAAU;AAAA,EAChC,oBAAoB,UAAU;AAAA,EAC9B,+BAA+B,UAAU;AAAA,EACzC,uBAAuB,UAAU;AAAA,EACjC,+BAA+B,UAAU;AAAA,EACzC,8BAA8B,UAAU;AAAA,EACxC,4BAA4B,UAAU;AAAA,EACtC,6BAA6B,UAAU;AAAA,EACvC,sBAAsB,UAAU;AAAA,EAChC,iCAAiC,UAAU;AAAA,EAC3C,kCAAkC,UAAU;AAAA,EAC5C,qCACE,UAAU;AAAA,EACZ,2CACE,UAAU;AAAA,EACZ,wBAAwB,UAAU;AAAA,EAClC,cAAc,UAAU;AAAA,EACxB,oCACE,UAAU;AAAA,EACZ,uBAAuB,UAAU;AAAA,EACjC,+BAA+B,UAAU;AAAA,EACzC,sBAAsB,UAAU;AAAA,EAChC,0BAA0B,UAAU;AAAA,EACpC,iBAAiB,UAAU;AAAA,EAC3B,qBAAqB,UAAU;AAAA,EAC/B,qBAAqB,UAAU;AAAA,EAC/B,4BAA4B,UAAU;AACxC;AAEA,MAAM,aAAa,OAAO,KAAK,gBAAgB;AAAA,IAI/C,wBAAS,gCAAgC,MAAM;AAC7C,8BAAS,UAAU,MAAM;AACvB,qBAAG,KAAK,UAAU,EAAE,oBAAoB,CAAC,kBAAkB;AACzD,YAAM,aAAa,UAAU,aAAa;AAE1C,sCAA2C,EAAE,SAAgB;AAC7D,WAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -86,6 +86,7 @@ var Stagehand = __toESM(require("@browserbasehq/stagehand"), 1);
|
|
|
86
86
|
];
|
|
87
87
|
(0, import_vitest.it)("matches the known function name literals", () => {
|
|
88
88
|
(0, import_vitest.expectTypeOf)().toExtend();
|
|
89
|
+
void expectedFunctionNames;
|
|
89
90
|
});
|
|
90
91
|
});
|
|
91
92
|
(0, import_vitest.describe)("connectToMCPServer", () => {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../tests/public-api/v3-core.test.ts"],
|
|
4
4
|
"sourcesContent": ["import { describe, expect, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\ndescribe(\"V3 Core public API types\", () => {\n describe(\"Stagehand\", () => {\n type ExpectedShape = {\n init: () => Promise<void>;\n close: (opts?: { force?: boolean }) => Promise<void>;\n act: (\n input: string | Stagehand.Action,\n options?: Stagehand.ActOptions,\n ) => Promise<Stagehand.ActResult>;\n extract: (...args: unknown[]) => Promise<unknown>;\n observe: (...args: unknown[]) => Promise<Stagehand.Action[]>;\n agent: (config?: Stagehand.AgentConfig) => {\n execute: (\n instructionOrOptions: string | Stagehand.AgentExecuteOptions,\n ) => Promise<Stagehand.AgentResult>;\n };\n connectURL: () => string;\n context: unknown;\n metrics: Promise<Stagehand.StagehandMetrics>;\n history: Promise<ReadonlyArray<Stagehand.HistoryEntry>>;\n llmClient: Stagehand.LLMClient;\n browserbaseSessionID: string | undefined;\n browserbaseSessionURL: string | undefined;\n browserbaseDebugURL: string | undefined;\n experimental: boolean;\n logInferenceToFile: boolean;\n verbose: 0 | 1 | 2;\n logger: (logLine: Stagehand.LogLine) => void;\n isAgentReplayActive: () => boolean;\n recordAgentReplayStep: (step: unknown) => void;\n };\n\n type StagehandInstance = InstanceType<typeof Stagehand.Stagehand>;\n\n it(\"has correct public interface shape\", () => {\n expectTypeOf<StagehandInstance>().toExtend<ExpectedShape>();\n });\n\n it(\"act accepts Action as first parameter\", () => {\n const mockAction = {} as Stagehand.Action;\n expectTypeOf<StagehandInstance[\"act\"]>().toBeCallableWith(\n mockAction,\n {} as Stagehand.ActOptions,\n );\n });\n\n it(\"extract accepts instruction and schema\", () => {\n const mockSchema = {} as Stagehand.StagehandZodSchema;\n expectTypeOf<StagehandInstance[\"extract\"]>().toBeCallableWith(\n \"instruction\",\n mockSchema,\n {} as Stagehand.ExtractOptions,\n );\n });\n\n it(\"observe accepts instruction and options\", () => {\n expectTypeOf<StagehandInstance[\"observe\"]>().toBeCallableWith(\n \"instruction\",\n {} as Stagehand.ObserveOptions,\n );\n });\n\n it(\"agent execute accepts page option\", () => {\n type AgentReturn = ReturnType<StagehandInstance[\"agent\"]>;\n const mockPage = {} as Stagehand.AnyPage;\n expectTypeOf<AgentReturn[\"execute\"]>().toBeCallableWith({\n instruction: \"test\",\n page: mockPage,\n } satisfies Stagehand.AgentExecuteOptions);\n });\n });\n\n describe(\"StagehandMetrics\", () => {\n type ExpectedStagehandMetrics = {\n actPromptTokens: number;\n actCompletionTokens: number;\n actReasoningTokens: number;\n actCachedInputTokens: number;\n actInferenceTimeMs: number;\n extractPromptTokens: number;\n extractCompletionTokens: number;\n extractReasoningTokens: number;\n extractCachedInputTokens: number;\n extractInferenceTimeMs: number;\n observePromptTokens: number;\n observeCompletionTokens: number;\n observeReasoningTokens: number;\n observeCachedInputTokens: number;\n observeInferenceTimeMs: number;\n agentPromptTokens: number;\n agentCompletionTokens: number;\n agentReasoningTokens: number;\n agentCachedInputTokens: number;\n agentInferenceTimeMs: number;\n totalPromptTokens: number;\n totalCompletionTokens: number;\n totalReasoningTokens: number;\n totalCachedInputTokens: number;\n totalInferenceTimeMs: number;\n };\n\n it(\"matches the published metrics shape\", () => {\n expectTypeOf<Stagehand.StagehandMetrics>().toEqualTypeOf<ExpectedStagehandMetrics>();\n });\n });\n\n describe(\"V3\", () => {\n // V3 is the same class as Stagehand, just re-exported with a different name.\n // The public interface shape is already tested in the \"Stagehand\" test above.\n it(\"is exported\", () => {\n expect(Stagehand.V3).toBeDefined();\n });\n });\n\n describe(\"V3Evaluator\", () => {\n type V3EvaluatorInstance = InstanceType<typeof Stagehand.V3Evaluator>;\n\n it(\"is exported\", () => {\n expect(Stagehand.V3Evaluator).toBeDefined();\n });\n\n it(\"has ask method\", () => {\n expectTypeOf<V3EvaluatorInstance[\"ask\"]>().toExtend<\n (options: unknown) => Promise<unknown>\n >();\n });\n\n it(\"has batchAsk method\", () => {\n expectTypeOf<V3EvaluatorInstance[\"batchAsk\"]>().toExtend<\n (options: unknown) => Promise<unknown[]>\n >();\n });\n });\n\n describe(\"V3FunctionName\", () => {\n const expectedFunctionNames = [\n \"ACT\",\n \"EXTRACT\",\n \"OBSERVE\",\n \"AGENT\",\n ] as const;\n\n it(\"matches the known function name literals\", () => {\n expectTypeOf<Stagehand.V3FunctionName>().toExtend<\n (typeof expectedFunctionNames)[number]\n >();\n void expectedFunctionNames; // Mark as used to satisfy ESLint\n });\n });\n\n describe(\"connectToMCPServer\", () => {\n type ExpectedServerConfig =\n | string\n | URL\n | { command: string; args?: string[]; env?: Record<string, string> }\n | { serverUrl: string | URL; clientOptions?: unknown };\n\n it(\"has correct parameter types\", () => {\n expectTypeOf(\n Stagehand.connectToMCPServer,\n ).parameters.branded.toEqualTypeOf<[ExpectedServerConfig]>();\n });\n });\n\n describe(\"LOG_LEVEL_NAMES\", () => {\n type ExpectedLOG_LEVEL_NAMES = Record<Stagehand.LogLevel, string>;\n\n it(\"maps numeric levels to strings\", () => {\n expectTypeOf<\n typeof Stagehand.LOG_LEVEL_NAMES\n >().toExtend<ExpectedLOG_LEVEL_NAMES>();\n });\n });\n});\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAmD;AACnD,gBAA2B;AAAA,IAE3B,wBAAS,4BAA4B,MAAM;AACzC,8BAAS,aAAa,MAAM;AAiC1B,0BAAG,sCAAsC,MAAM;AAC7C,sCAAgC,EAAE,SAAwB;AAAA,IAC5D,CAAC;AAED,0BAAG,yCAAyC,MAAM;AAChD,YAAM,aAAa,CAAC;AACpB,sCAAuC,EAAE;AAAA,QACvC;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,0BAAG,0CAA0C,MAAM;AACjD,YAAM,aAAa,CAAC;AACpB,sCAA2C,EAAE;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,0BAAG,2CAA2C,MAAM;AAClD,sCAA2C,EAAE;AAAA,QAC3C;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,0BAAG,qCAAqC,MAAM;AAE5C,YAAM,WAAW,CAAC;AAClB,sCAAqC,EAAE,iBAAiB;AAAA,QACtD,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAyC;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,oBAAoB,MAAM;AA6BjC,0BAAG,uCAAuC,MAAM;AAC9C,sCAAyC,EAAE,cAAwC;AAAA,IACrF,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,MAAM,MAAM;AAGnB,0BAAG,eAAe,MAAM;AACtB,gCAAO,UAAU,EAAE,EAAE,YAAY;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,eAAe,MAAM;AAG5B,0BAAG,eAAe,MAAM;AACtB,gCAAO,UAAU,WAAW,EAAE,YAAY;AAAA,IAC5C,CAAC;AAED,0BAAG,kBAAkB,MAAM;AACzB,sCAAyC,EAAE,SAEzC;AAAA,IACJ,CAAC;AAED,0BAAG,uBAAuB,MAAM;AAC9B,sCAA8C,EAAE,SAE9C;AAAA,IACJ,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,kBAAkB,MAAM;AAC/B,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,0BAAG,4CAA4C,MAAM;AACnD,sCAAuC,EAAE,SAEvC;AAAA,
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAmD;AACnD,gBAA2B;AAAA,IAE3B,wBAAS,4BAA4B,MAAM;AACzC,8BAAS,aAAa,MAAM;AAiC1B,0BAAG,sCAAsC,MAAM;AAC7C,sCAAgC,EAAE,SAAwB;AAAA,IAC5D,CAAC;AAED,0BAAG,yCAAyC,MAAM;AAChD,YAAM,aAAa,CAAC;AACpB,sCAAuC,EAAE;AAAA,QACvC;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,0BAAG,0CAA0C,MAAM;AACjD,YAAM,aAAa,CAAC;AACpB,sCAA2C,EAAE;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,0BAAG,2CAA2C,MAAM;AAClD,sCAA2C,EAAE;AAAA,QAC3C;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,0BAAG,qCAAqC,MAAM;AAE5C,YAAM,WAAW,CAAC;AAClB,sCAAqC,EAAE,iBAAiB;AAAA,QACtD,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAyC;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,oBAAoB,MAAM;AA6BjC,0BAAG,uCAAuC,MAAM;AAC9C,sCAAyC,EAAE,cAAwC;AAAA,IACrF,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,MAAM,MAAM;AAGnB,0BAAG,eAAe,MAAM;AACtB,gCAAO,UAAU,EAAE,EAAE,YAAY;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,eAAe,MAAM;AAG5B,0BAAG,eAAe,MAAM;AACtB,gCAAO,UAAU,WAAW,EAAE,YAAY;AAAA,IAC5C,CAAC;AAED,0BAAG,kBAAkB,MAAM;AACzB,sCAAyC,EAAE,SAEzC;AAAA,IACJ,CAAC;AAED,0BAAG,uBAAuB,MAAM;AAC9B,sCAA8C,EAAE,SAE9C;AAAA,IACJ,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,kBAAkB,MAAM;AAC/B,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,0BAAG,4CAA4C,MAAM;AACnD,sCAAuC,EAAE,SAEvC;AACF,WAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,sBAAsB,MAAM;AAOnC,0BAAG,+BAA+B,MAAM;AACtC;AAAA,QACE,UAAU;AAAA,MACZ,EAAE,WAAW,QAAQ,cAAsC;AAAA,IAC7D,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,mBAAmB,MAAM;AAGhC,0BAAG,kCAAkC,MAAM;AACzC,sCAEE,EAAE,SAAkC;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../tests/snapshot-capture-orchestration.test.ts"],
|
|
4
4
|
"sourcesContent": ["import type { Protocol } from \"devtools-protocol\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { CDPSessionLike } from \"../lib/v3/understudy/cdp.js\";\nimport type { Page } from \"../lib/v3/understudy/page.js\";\nimport type {\n FrameContext,\n SessionDomIndex,\n} from \"../lib/v3/types/private/index.js\";\nimport * as capture from \"../lib/v3/understudy/a11y/snapshot/capture.js\";\nimport * as a11yTree from \"../lib/v3/understudy/a11y/snapshot/a11yTree.js\";\nimport * as domTree from \"../lib/v3/understudy/a11y/snapshot/domTree.js\";\nimport * as focusSelectors from \"../lib/v3/understudy/a11y/snapshot/focusSelectors.js\";\nimport { MockCDPSession } from \"./helpers/mockCDPSession.js\";\n\nconst makeProtocolFrame = (id: string): Protocol.Page.Frame =>\n ({\n id,\n loaderId: `${id}-loader`,\n url: \"https://example.com\",\n securityOrigin: \"https://example.com\",\n mimeType: \"text/html\",\n }) as unknown as Protocol.Page.Frame;\n\nconst makeFrameTree = (\n id: string,\n children: Protocol.Page.FrameTree[] = [],\n): Protocol.Page.FrameTree => ({\n frame: makeProtocolFrame(id),\n childFrames: children,\n});\n\ntype PageStub = Pick<\n Page,\n | \"mainFrameId\"\n | \"asProtocolFrameTree\"\n | \"listAllFrameIds\"\n | \"getSessionForFrame\"\n | \"getOrdinal\"\n>;\n\nconst makePage = (overrides: Partial<PageStub> = {}): Page => {\n const defaultSession = new MockCDPSession({}, \"default-session\");\n const base: PageStub = {\n mainFrameId: () => \"frame-1\",\n asProtocolFrameTree: () => makeFrameTree(\"frame-1\"),\n listAllFrameIds: () => [\"frame-1\"],\n getSessionForFrame: () => defaultSession,\n getOrdinal: () => 0,\n };\n return { ...base, ...overrides } as unknown as Page;\n};\n\nconst makeSessionIndex = (): SessionDomIndex => ({\n rootBackend: 100,\n absByBe: new Map([\n [100, \"/\"],\n [101, \"/html[1]\"],\n [102, \"/html[1]/body[1]\"],\n [150, \"/html[1]/body[1]/iframe[1]\"],\n [200, \"/html[1]/body[1]/iframe[1]\"],\n [201, \"/html[1]/body[1]/iframe[1]/div[1]\"],\n ]),\n tagByBe: new Map([\n [100, \"#document\"],\n [101, \"html\"],\n [102, \"body\"],\n [150, \"iframe\"],\n [200, \"#document\"],\n [201, \"div\"],\n ]),\n scrollByBe: new Map([[201, true]]),\n docRootOf: new Map([\n [100, 100],\n [101, 100],\n [102, 100],\n [150, 100],\n [200, 200],\n [201, 200],\n ]),\n contentDocRootByIframe: new Map([[150, 200]]),\n});\n\nbeforeEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"buildFrameContext\", () => {\n it(\"indexes parent relationships from the frame tree\", () => {\n const frameTree = makeFrameTree(\"frame-1\", [\n makeFrameTree(\"frame-2\", [makeFrameTree(\"frame-3\")]),\n makeFrameTree(\"frame-4\"),\n ]);\n const page = makePage({\n asProtocolFrameTree: () => frameTree,\n listAllFrameIds: () => [\"frame-1\", \"frame-2\", \"frame-3\", \"frame-4\"],\n });\n\n const context = capture.buildFrameContext(page);\n\n expect(context.rootId).toBe(\"frame-1\");\n expect(context.frames).toEqual([\n \"frame-1\",\n \"frame-2\",\n \"frame-3\",\n \"frame-4\",\n ]);\n expect(context.parentByFrame.get(\"frame-1\")).toBeNull();\n expect(context.parentByFrame.get(\"frame-2\")).toBe(\"frame-1\");\n expect(context.parentByFrame.get(\"frame-3\")).toBe(\"frame-2\");\n expect(context.parentByFrame.get(\"frame-4\")).toBe(\"frame-1\");\n });\n});\n\ndescribe(\"buildSessionIndexes\", () => {\n it(\"deduplicates frames that share the same CDP session id\", async () => {\n const session = new MockCDPSession({}, \"session-a\");\n const page = makePage({\n // Every frame lookup returns the same session instance, so buildSessionIndexes\n // should call buildSessionDomIndex only once and reuse the result.\n getSessionForFrame: () => session,\n });\n const idx = makeSessionIndex();\n const spy = vi\n .spyOn(domTree, \"buildSessionDomIndex\")\n .mockResolvedValue(idx);\n\n const result = await capture.buildSessionIndexes(\n page,\n [\"frame-1\", \"frame-2\"],\n true,\n );\n\n expect(spy).toHaveBeenCalledTimes(1); // only one DOM.getDocument per session id\n expect(spy).toHaveBeenCalledWith(session, true);\n expect(result.get(\"session-a\")).toBe(idx);\n });\n\n it(\"builds indexes for sessions without ids using the 'root' key\", async () => {\n const sessionWithoutId: CDPSessionLike = {\n id: undefined,\n async send<R = unknown>(\n _method: string,\n _params?: Record<string, unknown>,\n ): Promise<R> {\n void _method;\n void _params;\n return {} as R;\n },\n on() {},\n off() {},\n async close() {},\n };\n const sessionWithId = new MockCDPSession({}, \"child-session\");\n const page = makePage({\n getSessionForFrame: (frameId: string) =>\n frameId === \"frame-1\" ? sessionWithoutId : sessionWithId,\n });\n\n const idxA = makeSessionIndex();\n const idxB = makeSessionIndex();\n const spy = vi\n .spyOn(domTree, \"buildSessionDomIndex\")\n .mockResolvedValueOnce(idxA)\n .mockResolvedValueOnce(idxB);\n\n const result = await capture.buildSessionIndexes(\n page,\n [\"frame-1\", \"frame-2\"],\n false,\n );\n\n // Verifies the helper invokes buildSessionDomIndex once for each unique session,\n // keying anonymous sessions as \"root\" so downstream lookups remain stable.\n expect(spy).toHaveBeenNthCalledWith(1, sessionWithoutId, false);\n expect(spy).toHaveBeenNthCalledWith(2, sessionWithId, false);\n expect(result.get(\"root\")).toBe(idxA);\n expect(result.get(\"child-session\")).toBe(idxB);\n });\n});\n\ndescribe(\"collectPerFrameMaps\", () => {\n it(\"builds per-frame xpath/tag maps and outlines from a shared session index\", async () => {\n const session = new MockCDPSession(\n {\n \"DOM.getFrameOwner\": async () => ({ backendNodeId: 150 }),\n },\n \"session-a\",\n );\n const page = makePage({\n getSessionForFrame: () => session,\n getOrdinal: (frameId: string) => (frameId === \"frame-1\" ? 0 : 1),\n });\n const context: FrameContext = {\n rootId: \"frame-1\",\n frames: [\"frame-1\", \"frame-2\"],\n parentByFrame: new Map([\n [\"frame-1\", null],\n [\"frame-2\", \"frame-1\"],\n ]),\n };\n const sessionIndex = makeSessionIndex();\n const sessionToIndex = new Map([[session.id, sessionIndex]]);\n\n vi.spyOn(a11yTree, \"a11yForFrame\").mockImplementation(\n async (_sess, frameId) => ({\n outline: `outline-${frameId}`,\n urlMap: { [`url-${frameId}`]: `https://${frameId}.test` },\n scopeApplied: false,\n }),\n );\n\n const result = await capture.collectPerFrameMaps(\n page,\n context,\n sessionToIndex,\n { experimental: true },\n true,\n context.frames,\n );\n\n expect(result.perFrameOutlines).toEqual([\n { frameId: \"frame-1\", outline: \"outline-frame-1\" },\n { frameId: \"frame-2\", outline: \"outline-frame-2\" },\n ]);\n const rootMaps = result.perFrameMaps.get(\"frame-1\");\n expect(rootMaps?.xpathMap[\"0-100\"]).toBe(\"/\");\n expect(rootMaps?.xpathMap[\"0-101\"]).toBe(\"/html[1]\");\n expect(rootMaps?.xpathMap[\"0-102\"]).toBe(\"/html[1]/body[1]\");\n const childMaps = result.perFrameMaps.get(\"frame-2\");\n expect(childMaps?.xpathMap[\"1-200\"]).toBe(\"/\");\n expect(childMaps?.xpathMap[\"1-201\"]).toBe(\"/div[1]\");\n expect(childMaps?.scrollableMap[\"1-201\"]).toBe(true);\n expect(childMaps?.urlMap).toEqual({\n \"url-frame-2\": \"https://frame-2.test\",\n });\n expect(session.callsFor(\"DOM.getFrameOwner\")).toHaveLength(1);\n });\n\n it(\"builds a missing session index on demand and memoizes it\", async () => {\n const session = new MockCDPSession({}, \"new-session\");\n const page = makePage({\n getSessionForFrame: () => session,\n getOrdinal: () => 2,\n });\n const context: FrameContext = {\n rootId: \"frame-9\",\n frames: [\"frame-9\"],\n parentByFrame: new Map([[\"frame-9\", null]]),\n };\n const idx = makeSessionIndex();\n const buildSpy = vi\n .spyOn(domTree, \"buildSessionDomIndex\")\n .mockResolvedValue(idx);\n vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"outline\",\n urlMap: {},\n scopeApplied: false,\n });\n\n const sessionToIndex = new Map<string, SessionDomIndex>();\n const result = await capture.collectPerFrameMaps(\n page,\n context,\n sessionToIndex,\n undefined,\n false,\n context.frames,\n );\n\n expect(buildSpy).toHaveBeenCalledWith(session, false);\n expect(sessionToIndex.get(\"new-session\")).toBe(idx);\n expect(result.perFrameMaps.get(\"frame-9\")?.xpathMap[\"2-100\"]).toBe(\"/\");\n });\n\n it(\"skips frames that are not listed in the frameIds argument\", async () => {\n const session = new MockCDPSession({}, \"session-a\");\n const page = makePage({\n getSessionForFrame: () => session,\n getOrdinal: (frameId: string) => (frameId === \"frame-1\" ? 0 : 1),\n });\n const context: FrameContext = {\n rootId: \"frame-1\",\n frames: [\"frame-1\", \"frame-2\"],\n parentByFrame: new Map([\n [\"frame-1\", null],\n [\"frame-2\", \"frame-1\"],\n ]),\n };\n const sessionIndex = makeSessionIndex();\n const sessionToIndex = new Map([[session.id, sessionIndex]]);\n\n const a11ySpy = vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"outline\",\n urlMap: {},\n scopeApplied: false,\n });\n\n const result = await capture.collectPerFrameMaps(\n page,\n context,\n sessionToIndex,\n undefined,\n true,\n [\"frame-1\"],\n );\n\n expect(a11ySpy).toHaveBeenCalledTimes(1);\n expect(result.perFrameMaps.has(\"frame-2\")).toBe(false);\n expect(result.perFrameOutlines.map((o) => o.frameId)).toEqual([\"frame-1\"]);\n });\n});\n\ndescribe(\"captureHybridSnapshot\", () => {\n it(\"returns early when the scoped snapshot path succeeds\", async () => {\n const session = new MockCDPSession({}, \"session-a\");\n const page = makePage({\n getSessionForFrame: () => session,\n });\n const options = { focusSelector: \"/html\" };\n\n vi.spyOn(focusSelectors, \"resolveFocusFrameAndTail\").mockResolvedValue({\n targetFrameId: \"frame-1\",\n tailXPath: \"\",\n absPrefix: \"\",\n });\n const domMapsSpy = vi\n .spyOn(domTree, \"domMapsForSession\")\n .mockResolvedValue({\n tagNameMap: { \"0-100\": \"#document\" },\n xpathMap: { \"0-100\": \"/\" },\n scrollableMap: {},\n });\n const a11ySpy = vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"scoped outline\",\n urlMap: { \"0-100\": \"https://frame-1.test\" },\n scopeApplied: true,\n });\n const buildIndexSpy = vi\n .spyOn(domTree, \"buildSessionDomIndex\")\n .mockImplementation(() => {\n throw new Error(\"should not build session index when scoped\");\n });\n\n const result = await capture.captureHybridSnapshot(page, options);\n\n expect(result.combinedTree).toBe(\"scoped outline\");\n expect(result.combinedUrlMap[\"0-100\"]).toBe(\"https://frame-1.test\");\n expect(domMapsSpy).toHaveBeenCalled();\n expect(a11ySpy).toHaveBeenCalled();\n expect(buildIndexSpy).not.toHaveBeenCalled();\n });\n\n it(\"scoped snapshot still succeeds when iframe inclusion is disabled\", async () => {\n const session = new MockCDPSession({}, \"session-a\");\n const page = makePage({\n getSessionForFrame: () => session,\n });\n const options = { focusSelector: \"/html\", includeIframes: false };\n\n vi.spyOn(focusSelectors, \"resolveFocusFrameAndTail\").mockResolvedValue({\n targetFrameId: \"frame-1\",\n tailXPath: \"\",\n absPrefix: \"\",\n });\n const domMapsSpy = vi\n .spyOn(domTree, \"domMapsForSession\")\n .mockResolvedValue({\n tagNameMap: { \"0-100\": \"#document\" },\n xpathMap: { \"0-100\": \"/\" },\n scrollableMap: {},\n });\n const a11ySpy = vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"scoped outline\",\n urlMap: { \"0-100\": \"https://frame-1.test\" },\n scopeApplied: true,\n });\n const buildIndexSpy = vi\n .spyOn(domTree, \"buildSessionDomIndex\")\n .mockImplementation(() => {\n throw new Error(\"should not build session index when scoped\");\n });\n\n const result = await capture.captureHybridSnapshot(page, options);\n\n expect(result.combinedTree).toBe(\"scoped outline\");\n expect(result.combinedUrlMap[\"0-100\"]).toBe(\"https://frame-1.test\");\n expect(domMapsSpy).toHaveBeenCalled();\n expect(a11ySpy).toHaveBeenCalled();\n expect(buildIndexSpy).not.toHaveBeenCalled();\n });\n\n it(\"collects per-frame data and merges it when no scoped snapshot is available\", async () => {\n const session = new MockCDPSession(\n {\n \"DOM.getFrameOwner\": async () => ({ backendNodeId: 150 }),\n },\n \"session-a\",\n );\n const page = makePage({\n asProtocolFrameTree: () =>\n makeFrameTree(\"frame-1\", [makeFrameTree(\"frame-2\")]),\n listAllFrameIds: () => [\"frame-1\", \"frame-2\"],\n getSessionForFrame: () => session,\n getOrdinal: (frameId: string) => (frameId === \"frame-1\" ? 0 : 1),\n });\n\n const idx = makeSessionIndex();\n vi.spyOn(domTree, \"buildSessionDomIndex\").mockResolvedValue(idx);\n vi.spyOn(a11yTree, \"a11yForFrame\").mockImplementation(\n async (_sess, frameId) => ({\n outline:\n frameId === \"frame-1\"\n ? \"[0-150] iframe host\"\n : \"[1-200] child subtree\",\n urlMap: { [`url-${frameId}`]: `https://${frameId}.test` },\n scopeApplied: false,\n }),\n );\n\n const snapshot = await capture.captureHybridSnapshot(page);\n\n expect(snapshot.combinedTree).toContain(\"[1-200] child subtree\");\n expect(snapshot.combinedXpathMap[\"0-100\"]).toBe(\"/\");\n expect(snapshot.combinedXpathMap[\"1-201\"]).toBe(\n \"/html[1]/body[1]/iframe[1]/div[1]\",\n );\n expect(snapshot.combinedUrlMap[\"url-frame-2\"]).toBe(\"https://frame-2.test\");\n expect(snapshot.perFrame?.map((pf) => pf.frameId)).toEqual([\n \"frame-1\",\n \"frame-2\",\n ]);\n });\n\n it(\"omits iframe frames when includeIframes is false\", async () => {\n const session = new MockCDPSession(\n {\n \"DOM.getFrameOwner\": async () => ({ backendNodeId: 150 }),\n },\n \"session-a\",\n );\n const page = makePage({\n asProtocolFrameTree: () =>\n makeFrameTree(\"frame-1\", [makeFrameTree(\"frame-2\")]),\n listAllFrameIds: () => [\"frame-1\", \"frame-2\"],\n getSessionForFrame: () => session,\n getOrdinal: (frameId: string) => (frameId === \"frame-1\" ? 0 : 1),\n });\n\n const idx = makeSessionIndex();\n vi.spyOn(domTree, \"buildSessionDomIndex\").mockResolvedValue(idx);\n const a11ySpy = vi\n .spyOn(a11yTree, \"a11yForFrame\")\n .mockImplementation(async (_sess, frameId) => ({\n outline:\n frameId === \"frame-1\"\n ? \"[0-150] iframe host\"\n : \"[1-200] child subtree\",\n urlMap: { [`url-${frameId}`]: `https://${frameId}.test` },\n scopeApplied: false,\n }));\n\n const snapshot = await capture.captureHybridSnapshot(page, {\n includeIframes: false,\n });\n\n expect(a11ySpy).toHaveBeenCalledTimes(1);\n expect(session.callsFor(\"DOM.getFrameOwner\")).toHaveLength(0);\n expect(snapshot.perFrame?.map((pf) => pf.frameId)).toEqual([\"frame-1\"]);\n expect(snapshot.combinedXpathMap[\"1-201\"]).toBeUndefined();\n expect(snapshot.combinedTree).not.toContain(\"[1-200] child subtree\");\n });\n});\n"],
|
|
5
|
-
"mappings": "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
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|