@browserbasehq/orca 3.2.0-middleware.1 → 3.2.0-middleware.2
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/inference.d.ts +3 -1
- package/dist/cjs/lib/inference.js +3 -3
- package/dist/cjs/lib/inference.js.map +1 -1
- package/dist/cjs/lib/prompt.d.ts +1 -1
- package/dist/cjs/lib/prompt.js +24 -18
- package/dist/cjs/lib/prompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +6 -2
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +40 -10
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +4 -5
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.js +2 -2
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/variables.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/utils/variables.js +9 -0
- package/dist/cjs/lib/v3/agent/utils/variables.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/observeHandler.js +2 -1
- package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.js +1 -0
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +13 -11
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/handlers.d.ts +1 -0
- package/dist/cjs/lib/v3/types/private/handlers.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +20 -7
- package/dist/cjs/lib/v3/types/public/api.js +33 -14
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/methods.d.ts +1 -0
- package/dist/cjs/lib/v3/types/public/methods.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +2 -0
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/variables.d.ts +7 -0
- package/dist/cjs/lib/v3/types/public/variables.js +22 -0
- package/dist/cjs/lib/v3/types/public/variables.js.map +1 -0
- package/dist/cjs/lib/v3/understudy/context.js +6 -2
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.js +1 -1
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.js +9 -1
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/lib/version.d.ts +1 -1
- package/dist/cjs/lib/version.js +1 -1
- package/dist/cjs/lib/version.js.map +1 -1
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/cjs/tests/unit/agent-execution-model.test.js +24 -2
- package/dist/cjs/tests/unit/agent-execution-model.test.js.map +1 -1
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js +23 -0
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
- package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js +153 -0
- package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.js +86 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.js +37 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.js.map +1 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.js +19 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/cjs/tests/unit/timeout-handlers.test.js +50 -0
- package/dist/cjs/tests/unit/timeout-handlers.test.js.map +1 -1
- package/dist/esm/lib/inference.d.ts +3 -1
- package/dist/esm/lib/inference.js +3 -3
- package/dist/esm/lib/inference.js.map +1 -1
- package/dist/esm/lib/prompt.d.ts +1 -1
- package/dist/esm/lib/prompt.js +24 -18
- package/dist/esm/lib/prompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +6 -2
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +40 -10
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +4 -5
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js +2 -2
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/variables.d.ts +5 -0
- package/dist/esm/lib/v3/agent/utils/variables.js +8 -0
- package/dist/esm/lib/v3/agent/utils/variables.js.map +1 -1
- package/dist/esm/lib/v3/handlers/observeHandler.js +2 -1
- package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.js +1 -0
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/esm/lib/v3/llm/aisdk.js +13 -11
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/private/handlers.d.ts +1 -0
- package/dist/esm/lib/v3/types/private/handlers.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +20 -7
- package/dist/esm/lib/v3/types/public/api.js +28 -12
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/methods.d.ts +1 -0
- package/dist/esm/lib/v3/types/public/methods.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +2 -0
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/variables.d.ts +7 -0
- package/dist/esm/lib/v3/types/public/variables.js +19 -0
- package/dist/esm/lib/v3/types/public/variables.js.map +1 -0
- package/dist/esm/lib/v3/understudy/context.js +6 -2
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +1 -1
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +9 -1
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/lib/version.d.ts +1 -1
- package/dist/esm/lib/version.js +1 -1
- package/dist/esm/lib/version.js.map +1 -1
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/esm/tests/unit/agent-execution-model.test.js +24 -2
- package/dist/esm/tests/unit/agent-execution-model.test.js.map +1 -1
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.js +21 -0
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
- package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js +118 -0
- package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.js +84 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/api-variables-schema.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-variables-schema.test.js +35 -0
- package/dist/esm/tests/unit/api-variables-schema.test.js.map +1 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.js +17 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/esm/tests/unit/timeout-handlers.test.js +50 -0
- package/dist/esm/tests/unit/timeout-handlers.test.js.map +1 -1
- package/package.json +2 -2
package/dist/cjs/lib/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../lib/version.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,iBAAiB,GAAG,OAAgB,CAAC","sourcesContent":["/**\n * AUTO-GENERATED — DO NOT EDIT BY HAND\n * Run `pnpm run gen-version` to refresh.\n */\nexport const STAGEHAND_VERSION = \"3.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../lib/version.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,iBAAiB,GAAG,OAAgB,CAAC","sourcesContent":["/**\n * AUTO-GENERATED — DO NOT EDIT BY HAND\n * Run `pnpm run gen-version` to refresh.\n */\nexport const STAGEHAND_VERSION = \"3.1.0\" as const;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const test_1 = require("@playwright/test");
|
|
4
|
+
const v3_js_1 = require("../../lib/v3/v3.js");
|
|
5
|
+
const v3_dynamic_config_js_1 = require("./v3.dynamic.config.js");
|
|
6
|
+
const testUtils_js_1 = require("./testUtils.js");
|
|
7
|
+
test_1.test.describe("V3 chrome:// new-tab page tracking", () => {
|
|
8
|
+
let v3;
|
|
9
|
+
test_1.test.beforeEach(async () => {
|
|
10
|
+
v3 = new v3_js_1.V3(v3_dynamic_config_js_1.v3DynamicTestConfig);
|
|
11
|
+
await v3.init();
|
|
12
|
+
});
|
|
13
|
+
test_1.test.afterEach(async () => {
|
|
14
|
+
await (0, testUtils_js_1.closeV3)(v3);
|
|
15
|
+
});
|
|
16
|
+
(0, test_1.test)("pages() includes a tab opened via chrome://newtab/", async () => {
|
|
17
|
+
const ctx = v3.context;
|
|
18
|
+
const initialPages = ctx.pages();
|
|
19
|
+
(0, test_1.expect)(initialPages.length).toBe(1);
|
|
20
|
+
// Simulate a manually-opened tab by creating a target at chrome://newtab/.
|
|
21
|
+
// This is the same CDP path the browser takes when the user presses Ctrl+T.
|
|
22
|
+
const { targetId } = await ctx.conn.send("Target.createTarget", { url: "chrome://newtab/" });
|
|
23
|
+
// Wait for the page to be registered (onAttachedToTarget is async).
|
|
24
|
+
const deadline = Date.now() + 5000;
|
|
25
|
+
while (Date.now() < deadline) {
|
|
26
|
+
if (ctx.pages().length >= 2)
|
|
27
|
+
break;
|
|
28
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
29
|
+
}
|
|
30
|
+
const pages = ctx.pages();
|
|
31
|
+
(0, test_1.expect)(pages.length).toBe(2);
|
|
32
|
+
// The new page's target should match the one we created.
|
|
33
|
+
const newPage = pages.find((p) => p.targetId() === targetId);
|
|
34
|
+
(0, test_1.expect)(newPage).toBeTruthy();
|
|
35
|
+
});
|
|
36
|
+
(0, test_1.test)("chrome://newtab/ tab becomes usable after navigating to a web URL", async () => {
|
|
37
|
+
const ctx = v3.context;
|
|
38
|
+
// Create a tab at chrome://newtab/ (same as user pressing Ctrl+T).
|
|
39
|
+
const { targetId } = await ctx.conn.send("Target.createTarget", { url: "chrome://newtab/" });
|
|
40
|
+
// Wait for registration.
|
|
41
|
+
const deadline = Date.now() + 5000;
|
|
42
|
+
while (Date.now() < deadline) {
|
|
43
|
+
if (ctx.pages().some((p) => p.targetId() === targetId))
|
|
44
|
+
break;
|
|
45
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
46
|
+
}
|
|
47
|
+
const newPage = ctx.pages().find((p) => p.targetId() === targetId);
|
|
48
|
+
(0, test_1.expect)(newPage).toBeTruthy();
|
|
49
|
+
// Navigate the new tab to a real web page.
|
|
50
|
+
await newPage.goto("https://example.com/", {
|
|
51
|
+
waitUntil: "domcontentloaded",
|
|
52
|
+
});
|
|
53
|
+
(0, test_1.expect)(newPage.url()).toContain("example.com");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=chrome-newtab-page-tracking.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome-newtab-page-tracking.spec.js","sourceRoot":"","sources":["../../../../tests/integration/chrome-newtab-page-tracking.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { closeV3 } from \"./testUtils.js\";\n\ntest.describe(\"V3 chrome:// new-tab page tracking\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"pages() includes a tab opened via chrome://newtab/\", async () => {\n const ctx = v3.context;\n const initialPages = ctx.pages();\n expect(initialPages.length).toBe(1);\n\n // Simulate a manually-opened tab by creating a target at chrome://newtab/.\n // This is the same CDP path the browser takes when the user presses Ctrl+T.\n const { targetId } = await ctx.conn.send<{ targetId: string }>(\n \"Target.createTarget\",\n { url: \"chrome://newtab/\" },\n );\n\n // Wait for the page to be registered (onAttachedToTarget is async).\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (ctx.pages().length >= 2) break;\n await new Promise((r) => setTimeout(r, 50));\n }\n\n const pages = ctx.pages();\n expect(pages.length).toBe(2);\n\n // The new page's target should match the one we created.\n const newPage = pages.find((p) => p.targetId() === targetId);\n expect(newPage).toBeTruthy();\n });\n\n test(\"chrome://newtab/ tab becomes usable after navigating to a web URL\", async () => {\n const ctx = v3.context;\n\n // Create a tab at chrome://newtab/ (same as user pressing Ctrl+T).\n const { targetId } = await ctx.conn.send<{ targetId: string }>(\n \"Target.createTarget\",\n { url: \"chrome://newtab/\" },\n );\n\n // Wait for registration.\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (ctx.pages().some((p) => p.targetId() === targetId)) break;\n await new Promise((r) => setTimeout(r, 50));\n }\n\n const newPage = ctx.pages().find((p) => p.targetId() === targetId);\n expect(newPage).toBeTruthy();\n\n // Navigate the new tab to a real web page.\n await newPage!.goto(\"https://example.com/\", {\n waitUntil: \"domcontentloaded\",\n });\n\n expect(newPage!.url()).toContain(\"example.com\");\n });\n});\n"]}
|
|
@@ -6,7 +6,7 @@ const extract_js_1 = require("../../lib/v3/agent/tools/extract.js");
|
|
|
6
6
|
const fillform_js_1 = require("../../lib/v3/agent/tools/fillform.js");
|
|
7
7
|
/**
|
|
8
8
|
* Minimal mock of V3 that captures how tools pass `model` options
|
|
9
|
-
* into v3.act(), v3.extract(), and v3.observe().
|
|
9
|
+
* into v3.act(), v3.extract(), and v3.observe(), plus observe variables.
|
|
10
10
|
*/
|
|
11
11
|
function createMockV3() {
|
|
12
12
|
const calls = [];
|
|
@@ -27,7 +27,11 @@ function createMockV3() {
|
|
|
27
27
|
return { extraction: "data" };
|
|
28
28
|
}),
|
|
29
29
|
observe: vitest_1.vi.fn(async (_instruction, options) => {
|
|
30
|
-
calls.push({
|
|
30
|
+
calls.push({
|
|
31
|
+
method: "observe",
|
|
32
|
+
model: options?.model,
|
|
33
|
+
variables: options?.variables,
|
|
34
|
+
});
|
|
31
35
|
return [];
|
|
32
36
|
}),
|
|
33
37
|
calls,
|
|
@@ -76,6 +80,24 @@ function createMockV3() {
|
|
|
76
80
|
(0, vitest_1.expect)(v3.calls[0].method).toBe("observe");
|
|
77
81
|
(0, vitest_1.expect)(v3.calls[0].model).toBe(modelConfig);
|
|
78
82
|
});
|
|
83
|
+
(0, vitest_1.it)("fillFormTool passes variables through to v3.observe()", async () => {
|
|
84
|
+
const v3 = createMockV3();
|
|
85
|
+
const variables = {
|
|
86
|
+
username: {
|
|
87
|
+
value: "john@example.com",
|
|
88
|
+
description: "The login email",
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const tool = (0, fillform_js_1.fillFormTool)(v3, undefined, variables);
|
|
92
|
+
await tool.execute({ fields: [{ action: "type %username% into the email field" }] }, {
|
|
93
|
+
toolCallId: "t3-variables",
|
|
94
|
+
messages: [],
|
|
95
|
+
abortSignal: new AbortController().signal,
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.expect)(v3.calls).toHaveLength(1);
|
|
98
|
+
(0, vitest_1.expect)(v3.calls[0].method).toBe("observe");
|
|
99
|
+
(0, vitest_1.expect)(v3.calls[0].variables).toBe(variables);
|
|
100
|
+
});
|
|
79
101
|
(0, vitest_1.it)("actTool passes undefined when no executionModel is set", async () => {
|
|
80
102
|
const v3 = createMockV3();
|
|
81
103
|
const tool = (0, act_js_1.actTool)(v3, undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-execution-model.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-execution-model.test.ts"],"names":[],"mappings":"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","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\" }] },\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"]}
|
|
1
|
+
{"version":3,"file":"agent-execution-model.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-execution-model.test.ts"],"names":[],"mappings":"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","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(), plus observe variables.\n */\nfunction createMockV3() {\n const calls: { method: string; model: unknown; variables?: 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 (\n _instruction: unknown,\n options?: { model?: unknown; variables?: unknown },\n ) => {\n calls.push({\n method: \"observe\",\n model: options?.model,\n variables: options?.variables,\n });\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\" }] },\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(\"fillFormTool passes variables through to v3.observe()\", async () => {\n const v3 = createMockV3();\n const variables = {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n };\n const tool = fillFormTool(v3, undefined, variables);\n await tool.execute!(\n { fields: [{ action: \"type %username% into the email field\" }] },\n {\n toolCallId: \"t3-variables\",\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].variables).toBe(variables);\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const agentSystemPrompt_js_1 = require("../../lib/v3/agent/prompts/agentSystemPrompt.js");
|
|
5
|
+
(0, vitest_1.describe)("buildAgentSystemPrompt variables", () => {
|
|
6
|
+
(0, vitest_1.it)("includes variable descriptions when present", () => {
|
|
7
|
+
const prompt = (0, agentSystemPrompt_js_1.buildAgentSystemPrompt)({
|
|
8
|
+
url: "https://example.com",
|
|
9
|
+
executionInstruction: "Fill the form",
|
|
10
|
+
mode: "dom",
|
|
11
|
+
variables: {
|
|
12
|
+
username: {
|
|
13
|
+
value: "john@example.com",
|
|
14
|
+
description: "The login email",
|
|
15
|
+
},
|
|
16
|
+
password: "secret123",
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.expect)(prompt).toContain('<variable name="username">The login email</variable>');
|
|
20
|
+
(0, vitest_1.expect)(prompt).toContain('<variable name="password" />');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=agent-system-prompt-variables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-system-prompt-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-system-prompt-variables.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,0FAAyF;AAEzF,IAAA,iBAAQ,EAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAA,6CAAsB,EAAC;YACpC,GAAG,EAAE,qBAAqB;YAC1B,oBAAoB,EAAE,eAAe;YACrC,IAAI,EAAE,KAAK;YACX,SAAS,EAAE;gBACT,QAAQ,EAAE;oBACR,KAAK,EAAE,kBAAkB;oBACzB,WAAW,EAAE,iBAAiB;iBAC/B;gBACD,QAAQ,EAAE,WAAW;aACtB;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,sDAAsD,CACvD,CAAC;QACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { buildAgentSystemPrompt } from \"../../lib/v3/agent/prompts/agentSystemPrompt.js\";\n\ndescribe(\"buildAgentSystemPrompt variables\", () => {\n it(\"includes variable descriptions when present\", () => {\n const prompt = buildAgentSystemPrompt({\n url: \"https://example.com\",\n executionInstruction: \"Fill the form\",\n mode: \"dom\",\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret123\",\n },\n });\n\n expect(prompt).toContain(\n '<variable name=\"username\">The login email</variable>',\n );\n expect(prompt).toContain('<variable name=\"password\" />');\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vitest_1 = require("vitest");
|
|
37
|
+
const aisdk_js_1 = require("../../lib/v3/llm/aisdk.js");
|
|
38
|
+
/**
|
|
39
|
+
* Creates a mock LanguageModelV2 that records doGenerate calls and returns
|
|
40
|
+
* a valid JSON response so generateObject / generateText succeed.
|
|
41
|
+
*/
|
|
42
|
+
function createCapturingModel(modelId) {
|
|
43
|
+
const calls = [];
|
|
44
|
+
const model = {
|
|
45
|
+
provider: "mock",
|
|
46
|
+
modelId,
|
|
47
|
+
specificationVersion: "v2",
|
|
48
|
+
supportedUrls: {},
|
|
49
|
+
doGenerate: vitest_1.vi.fn(async (options) => {
|
|
50
|
+
calls.push(options);
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: "text", text: '{"value":"ok"}' }],
|
|
53
|
+
finishReason: "stop",
|
|
54
|
+
usage: {
|
|
55
|
+
inputTokens: 1,
|
|
56
|
+
outputTokens: 1,
|
|
57
|
+
totalTokens: 2,
|
|
58
|
+
reasoningTokens: 0,
|
|
59
|
+
cachedInputTokens: 0,
|
|
60
|
+
},
|
|
61
|
+
warnings: [],
|
|
62
|
+
};
|
|
63
|
+
}),
|
|
64
|
+
doStream: vitest_1.vi.fn(),
|
|
65
|
+
};
|
|
66
|
+
return { model, calls };
|
|
67
|
+
}
|
|
68
|
+
async function callWithSchema(client) {
|
|
69
|
+
const { z } = await Promise.resolve().then(() => __importStar(require("zod")));
|
|
70
|
+
await client.createChatCompletion({
|
|
71
|
+
options: {
|
|
72
|
+
messages: [{ role: "user", content: "test" }],
|
|
73
|
+
response_model: {
|
|
74
|
+
name: "Test",
|
|
75
|
+
schema: z.object({ value: z.string() }),
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
logger: () => { },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
(0, vitest_1.describe)("AISdkClient reasoning effort resolution", () => {
|
|
82
|
+
(0, vitest_1.it)("defaults to 'none' for GPT-5.x sub-models", async () => {
|
|
83
|
+
const { model, calls } = createCapturingModel("gpt-5.1-nano");
|
|
84
|
+
const client = new aisdk_js_1.AISdkClient({ model });
|
|
85
|
+
await callWithSchema(client);
|
|
86
|
+
(0, vitest_1.expect)(calls[0].providerOptions).toEqual({
|
|
87
|
+
openai: {
|
|
88
|
+
textVerbosity: "low",
|
|
89
|
+
reasoningEffort: "none",
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.it)("does not set providerOptions for base gpt-5", async () => {
|
|
94
|
+
const { model, calls } = createCapturingModel("gpt-5");
|
|
95
|
+
const client = new aisdk_js_1.AISdkClient({ model });
|
|
96
|
+
await callWithSchema(client);
|
|
97
|
+
(0, vitest_1.expect)(calls[0].providerOptions).toBeUndefined();
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)("does not set providerOptions for codex models (gpt-5.x variant)", async () => {
|
|
100
|
+
const { model, calls } = createCapturingModel("codex-gpt-5.1");
|
|
101
|
+
const client = new aisdk_js_1.AISdkClient({ model });
|
|
102
|
+
await callWithSchema(client);
|
|
103
|
+
(0, vitest_1.expect)(calls[0].providerOptions).toBeUndefined();
|
|
104
|
+
});
|
|
105
|
+
(0, vitest_1.it)("does not set providerOptions for non-GPT-5 models by default", async () => {
|
|
106
|
+
const { model, calls } = createCapturingModel("openai/gpt-4o");
|
|
107
|
+
const client = new aisdk_js_1.AISdkClient({ model });
|
|
108
|
+
await callWithSchema(client);
|
|
109
|
+
(0, vitest_1.expect)(calls[0].providerOptions).toBeUndefined();
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.it)("user override applies to GPT-5.x sub-models", async () => {
|
|
112
|
+
const { model, calls } = createCapturingModel("gpt-5.1-nano");
|
|
113
|
+
const client = new aisdk_js_1.AISdkClient({
|
|
114
|
+
model,
|
|
115
|
+
clientOptions: { reasoningEffort: "medium" },
|
|
116
|
+
});
|
|
117
|
+
await callWithSchema(client);
|
|
118
|
+
(0, vitest_1.expect)(calls[0].providerOptions).toEqual({
|
|
119
|
+
openai: {
|
|
120
|
+
textVerbosity: "low",
|
|
121
|
+
reasoningEffort: "medium",
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
(0, vitest_1.it)("user override applies to non-GPT-5 models", async () => {
|
|
126
|
+
const { model, calls } = createCapturingModel("openai/o4-mini");
|
|
127
|
+
const client = new aisdk_js_1.AISdkClient({
|
|
128
|
+
model,
|
|
129
|
+
clientOptions: { reasoningEffort: "high" },
|
|
130
|
+
});
|
|
131
|
+
await callWithSchema(client);
|
|
132
|
+
(0, vitest_1.expect)(calls[0].providerOptions).toEqual({
|
|
133
|
+
openai: {
|
|
134
|
+
reasoningEffort: "high",
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)("user override applies to base gpt-5", async () => {
|
|
139
|
+
const { model, calls } = createCapturingModel("gpt-5");
|
|
140
|
+
const client = new aisdk_js_1.AISdkClient({
|
|
141
|
+
model,
|
|
142
|
+
clientOptions: { reasoningEffort: "low" },
|
|
143
|
+
});
|
|
144
|
+
await callWithSchema(client);
|
|
145
|
+
(0, vitest_1.expect)(calls[0].providerOptions).toEqual({
|
|
146
|
+
openai: {
|
|
147
|
+
textVerbosity: "low",
|
|
148
|
+
reasoningEffort: "low",
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=aisdk-reasoning-effort.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aisdk-reasoning-effort.test.js","sourceRoot":"","sources":["../../../../tests/unit/aisdk-reasoning-effort.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n} from \"@ai-sdk/provider\";\nimport { AISdkClient } from \"../../lib/v3/llm/aisdk.js\";\n\n/**\n * Creates a mock LanguageModelV2 that records doGenerate calls and returns\n * a valid JSON response so generateObject / generateText succeed.\n */\nfunction createCapturingModel(modelId: string) {\n const calls: LanguageModelV2CallOptions[] = [];\n\n const model: LanguageModelV2 = {\n provider: \"mock\",\n modelId,\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: vi.fn(async (options: LanguageModelV2CallOptions) => {\n calls.push(options);\n return {\n content: [{ type: \"text\" as const, text: '{\"value\":\"ok\"}' }],\n finishReason: \"stop\" as const,\n usage: {\n inputTokens: 1,\n outputTokens: 1,\n totalTokens: 2,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n },\n warnings: [],\n };\n }),\n doStream: vi.fn(),\n } as unknown as LanguageModelV2;\n\n return { model, calls };\n}\n\nasync function callWithSchema(client: AISdkClient) {\n const { z } = await import(\"zod\");\n await client.createChatCompletion({\n options: {\n messages: [{ role: \"user\", content: \"test\" }],\n response_model: {\n name: \"Test\",\n schema: z.object({ value: z.string() }),\n },\n },\n logger: () => {},\n });\n}\n\ndescribe(\"AISdkClient reasoning effort resolution\", () => {\n it(\"defaults to 'none' for GPT-5.x sub-models\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5.1-nano\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"none\",\n },\n });\n });\n\n it(\"does not set providerOptions for base gpt-5\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"does not set providerOptions for codex models (gpt-5.x variant)\", async () => {\n const { model, calls } = createCapturingModel(\"codex-gpt-5.1\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"does not set providerOptions for non-GPT-5 models by default\", async () => {\n const { model, calls } = createCapturingModel(\"openai/gpt-4o\");\n const client = new AISdkClient({ model });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toBeUndefined();\n });\n\n it(\"user override applies to GPT-5.x sub-models\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5.1-nano\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"medium\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"medium\",\n },\n });\n });\n\n it(\"user override applies to non-GPT-5 models\", async () => {\n const { model, calls } = createCapturingModel(\"openai/o4-mini\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"high\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n reasoningEffort: \"high\",\n },\n });\n });\n\n it(\"user override applies to base gpt-5\", async () => {\n const { model, calls } = createCapturingModel(\"gpt-5\");\n const client = new AISdkClient({\n model,\n clientOptions: { reasoningEffort: \"low\" },\n });\n await callWithSchema(client);\n\n expect(calls[0].providerOptions).toEqual({\n openai: {\n textVerbosity: \"low\",\n reasoningEffort: \"low\",\n },\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const api_js_1 = require("../../lib/v3/api.js");
|
|
5
|
+
(0, vitest_1.describe)("StagehandAPIClient variable serialization", () => {
|
|
6
|
+
(0, vitest_1.it)("preserves rich variables when sending the act request", async () => {
|
|
7
|
+
const client = new api_js_1.StagehandAPIClient({
|
|
8
|
+
apiKey: "bb-test",
|
|
9
|
+
logger: vitest_1.vi.fn(),
|
|
10
|
+
});
|
|
11
|
+
const executeMock = vitest_1.vi.fn().mockResolvedValue({
|
|
12
|
+
success: true,
|
|
13
|
+
message: "ok",
|
|
14
|
+
actionDescription: "typed",
|
|
15
|
+
actions: [],
|
|
16
|
+
});
|
|
17
|
+
client.execute = executeMock;
|
|
18
|
+
await client.act({
|
|
19
|
+
input: "type %username% into the email field",
|
|
20
|
+
options: {
|
|
21
|
+
variables: {
|
|
22
|
+
username: {
|
|
23
|
+
value: "john@example.com",
|
|
24
|
+
description: "The login email",
|
|
25
|
+
},
|
|
26
|
+
password: "secret",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.expect)(executeMock).toHaveBeenCalledWith({
|
|
31
|
+
method: "act",
|
|
32
|
+
args: {
|
|
33
|
+
input: "type %username% into the email field",
|
|
34
|
+
options: {
|
|
35
|
+
variables: {
|
|
36
|
+
username: {
|
|
37
|
+
value: "john@example.com",
|
|
38
|
+
description: "The login email",
|
|
39
|
+
},
|
|
40
|
+
password: "secret",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
frameId: undefined,
|
|
44
|
+
},
|
|
45
|
+
serverCache: undefined,
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)("preserves rich variables when sending the observe request", async () => {
|
|
49
|
+
const client = new api_js_1.StagehandAPIClient({
|
|
50
|
+
apiKey: "bb-test",
|
|
51
|
+
logger: vitest_1.vi.fn(),
|
|
52
|
+
});
|
|
53
|
+
const executeMock = vitest_1.vi.fn().mockResolvedValue([]);
|
|
54
|
+
client.execute = executeMock;
|
|
55
|
+
await client.observe({
|
|
56
|
+
instruction: "find the field where %username% should be entered",
|
|
57
|
+
options: {
|
|
58
|
+
variables: {
|
|
59
|
+
username: {
|
|
60
|
+
value: "john@example.com",
|
|
61
|
+
description: "The login email",
|
|
62
|
+
},
|
|
63
|
+
password: "secret",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.expect)(executeMock).toHaveBeenCalledWith({
|
|
68
|
+
method: "observe",
|
|
69
|
+
args: {
|
|
70
|
+
instruction: "find the field where %username% should be entered",
|
|
71
|
+
options: {
|
|
72
|
+
variables: {
|
|
73
|
+
username: {
|
|
74
|
+
value: "john@example.com",
|
|
75
|
+
description: "The login email",
|
|
76
|
+
},
|
|
77
|
+
password: "secret",
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
frameId: undefined,
|
|
81
|
+
},
|
|
82
|
+
serverCache: undefined,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=api-client-observe-variables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client-observe-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/api-client-observe-variables.test.ts"],"names":[],"mappings":";;AAAA,mCAAkD;AAClD,gDAAyD;AAEzD,IAAA,iBAAQ,EAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,IAAA,WAAE,EAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,2BAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,OAAO;YAC1B,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QAGD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,GAAG,CAAC;YACf,KAAK,EAAE,sCAAsC;YAC7C,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE;gBACJ,KAAK,EAAE,sCAAsC;gBAC7C,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,IAAI,2BAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAGhD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE;gBACJ,WAAW,EAAE,mDAAmD;gBAChE,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { StagehandAPIClient } from \"../../lib/v3/api.js\";\n\ndescribe(\"StagehandAPIClient variable serialization\", () => {\n it(\"preserves rich variables when sending the act request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue({\n success: true,\n message: \"ok\",\n actionDescription: \"typed\",\n actions: [],\n });\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.act({\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"act\",\n args: {\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n\n it(\"preserves rich variables when sending the observe request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue([]);\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.observe({\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"observe\",\n args: {\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const index_js_1 = require("../../lib/v3/types/public/index.js");
|
|
5
|
+
(0, vitest_1.describe)("API variable schemas", () => {
|
|
6
|
+
(0, vitest_1.it)("accepts rich variables for act requests", () => {
|
|
7
|
+
const result = index_js_1.Api.ActRequestSchema.safeParse({
|
|
8
|
+
input: "type %username% into the email field",
|
|
9
|
+
options: {
|
|
10
|
+
variables: {
|
|
11
|
+
username: {
|
|
12
|
+
value: "john@example.com",
|
|
13
|
+
description: "The login email",
|
|
14
|
+
},
|
|
15
|
+
rememberMe: true,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)("accepts rich variables for observe requests", () => {
|
|
22
|
+
const result = index_js_1.Api.ObserveRequestSchema.safeParse({
|
|
23
|
+
instruction: "find the field where %username% should be entered",
|
|
24
|
+
options: {
|
|
25
|
+
variables: {
|
|
26
|
+
username: {
|
|
27
|
+
value: "john@example.com",
|
|
28
|
+
description: "The login email",
|
|
29
|
+
},
|
|
30
|
+
rememberMe: true,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=api-variables-schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-variables-schema.test.js","sourceRoot":"","sources":["../../../../tests/unit/api-variables-schema.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,iEAAyD;AAEzD,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,cAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAC5C,KAAK,EAAE,sCAAsC;YAC7C,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,UAAU,EAAE,IAAI;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,cAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC;YAChD,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,UAAU,EAAE,IAAI;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { Api } from \"../../lib/v3/types/public/index.js\";\n\ndescribe(\"API variable schemas\", () => {\n it(\"accepts rich variables for act requests\", () => {\n const result = Api.ActRequestSchema.safeParse({\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n rememberMe: true,\n },\n },\n });\n\n expect(result.success).toBe(true);\n });\n\n it(\"accepts rich variables for observe requests\", () => {\n const result = Api.ObserveRequestSchema.safeParse({\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n rememberMe: true,\n },\n },\n });\n\n expect(result.success).toBe(true);\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const prompt_js_1 = require("../../lib/prompt.js");
|
|
5
|
+
(0, vitest_1.describe)("buildObserveSystemPrompt", () => {
|
|
6
|
+
(0, vitest_1.it)("includes variable descriptions when present", () => {
|
|
7
|
+
const prompt = (0, prompt_js_1.buildObserveSystemPrompt)(undefined, ["click", "fill"], {
|
|
8
|
+
username: {
|
|
9
|
+
value: "john@example.com",
|
|
10
|
+
description: "The login email",
|
|
11
|
+
},
|
|
12
|
+
password: "secret123",
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.expect)(prompt.content).toContain("Supported actions: click, fill");
|
|
15
|
+
(0, vitest_1.expect)(prompt.content).toContain("Available variables: %username% (The login email), %password%");
|
|
16
|
+
(0, vitest_1.expect)(prompt.content).toContain("return the matching %variableName% placeholder");
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=prompt-observe-variables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-observe-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/prompt-observe-variables.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,mDAA+D;AAE/D,IAAA,iBAAQ,EAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAA,oCAAwB,EAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;YACpE,QAAQ,EAAE;gBACR,KAAK,EAAE,kBAAkB;gBACzB,WAAW,EAAE,iBAAiB;aAC/B;YACD,QAAQ,EAAE,WAAW;SACtB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAC9B,+DAA+D,CAChE,CAAC;QACF,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAC9B,gDAAgD,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { buildObserveSystemPrompt } from \"../../lib/prompt.js\";\n\ndescribe(\"buildObserveSystemPrompt\", () => {\n it(\"includes variable descriptions when present\", () => {\n const prompt = buildObserveSystemPrompt(undefined, [\"click\", \"fill\"], {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret123\",\n });\n\n expect(prompt.content).toContain(\"Supported actions: click, fill\");\n expect(prompt.content).toContain(\n \"Available variables: %username% (The login email), %password%\",\n );\n expect(prompt.content).toContain(\n \"return the matching %variableName% placeholder\",\n );\n });\n});\n"]}
|