zan-browser 1.3.5 → 1.3.7
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/ai.d.ts +3 -7
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +20 -70
- package/dist/ai.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +27 -57
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/interceptor.d.ts +4 -1
- package/dist/interceptor.d.ts.map +1 -1
- package/dist/interceptor.js +32 -25
- package/dist/interceptor.js.map +1 -1
- package/dist/observer.d.ts +0 -2
- package/dist/observer.d.ts.map +1 -1
- package/dist/observer.js +16 -41
- package/dist/observer.js.map +1 -1
- package/dist/session.d.ts +4 -9
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +19 -125
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +6 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/ai.d.ts
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import type { ObserveResult, AgentAction } from "./types";
|
|
1
|
+
import type { ObserveResult, AgentAction, SeedValue } from "./types";
|
|
2
2
|
export declare class AIClient {
|
|
3
3
|
private client;
|
|
4
4
|
private model;
|
|
5
5
|
constructor(apiKey: string, model?: string);
|
|
6
|
-
decideFromObservation(goal: string, observation: ObserveResult, history: string[]): Promise<AgentAction>;
|
|
7
|
-
|
|
8
|
-
achieved: boolean;
|
|
9
|
-
summary: string;
|
|
10
|
-
}>;
|
|
11
|
-
decideFromScreenshot(goal: string, screenshotBase64: string, history: string[]): Promise<AgentAction>;
|
|
6
|
+
decideFromObservation(goal: string, observation: ObserveResult, history: string[], seedValues?: SeedValue[]): Promise<AgentAction>;
|
|
7
|
+
decideFromScreenshot(goal: string, screenshotBase64: string, history: string[], seedValues?: SeedValue[]): Promise<AgentAction>;
|
|
12
8
|
private parseAction;
|
|
13
9
|
}
|
|
14
10
|
//# sourceMappingURL=ai.d.ts.map
|
package/dist/ai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMrE,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,SAAgB;IAM3C,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,aAAa,EAC1B,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,CAAC,EAAE,SAAS,EAAE,GACvB,OAAO,CAAC,WAAW,CAAC;IAqDjB,oBAAoB,CACxB,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,CAAC,EAAE,SAAS,EAAE,GACvB,OAAO,CAAC,WAAW,CAAC;IA4DvB,OAAO,CAAC,WAAW;CA2BpB"}
|
package/dist/ai.js
CHANGED
|
@@ -16,15 +16,18 @@ class AIClient {
|
|
|
16
16
|
this.model = model;
|
|
17
17
|
}
|
|
18
18
|
// Decide the next action given the observed DOM state (text first, no screenshot)
|
|
19
|
-
async decideFromObservation(goal, observation, history) {
|
|
19
|
+
async decideFromObservation(goal, observation, history, seedValues) {
|
|
20
20
|
const historyText = history.length > 0
|
|
21
21
|
? `\nPREVIOUS STEPS:\n${history.slice(-5).join("\n")}`
|
|
22
22
|
: "";
|
|
23
|
+
const seedContext = seedValues && seedValues.length > 0
|
|
24
|
+
? `\nINPUT VALUES TO USE:\n${seedValues.map(s => `- ${s.paramName} (${s.description}): use "${s.exampleValue}" when filling any relevant input field`).join("\n")}`
|
|
25
|
+
: "";
|
|
23
26
|
const prompt = `You are controlling a browser to achieve a goal.
|
|
24
27
|
Decide the SINGLE next action to take based on the current page state.
|
|
25
28
|
|
|
26
29
|
GOAL: ${goal}
|
|
27
|
-
${historyText}
|
|
30
|
+
${historyText}${seedContext}
|
|
28
31
|
|
|
29
32
|
CURRENT PAGE STATE:
|
|
30
33
|
${observation.text}
|
|
@@ -34,16 +37,15 @@ IMPORTANT RULES:
|
|
|
34
37
|
- If a modal is open, interact with it first
|
|
35
38
|
- If the page is loading, return a wait action
|
|
36
39
|
- Take the minimum actions needed — stop as soon as the goal is achievable
|
|
40
|
+
- If INPUT VALUES are provided above, use them when filling search boxes or input fields
|
|
37
41
|
- If you cannot achieve the goal, return "impossible"
|
|
38
42
|
- If the goal is achieved, return "done"
|
|
39
|
-
- After a "fill" action on a search/query input, ALWAYS follow with pressKey "Enter" to submit — do not look for a button unless Enter doesn't work
|
|
40
43
|
|
|
41
44
|
Respond with a JSON object (no markdown):
|
|
42
45
|
{
|
|
43
|
-
"type": "click" | "fill" | "
|
|
46
|
+
"type": "click" | "fill" | "scroll" | "wait" | "screenshot" | "done" | "impossible",
|
|
44
47
|
"elementId": "@B3" (required for click/fill),
|
|
45
48
|
"value": "text to type" (required for fill),
|
|
46
|
-
"key": "Enter" (required for pressKey — e.g. "Enter", "Tab", "Escape"),
|
|
47
49
|
"direction": "up" | "down" (required for scroll),
|
|
48
50
|
"amount": 300 (optional for scroll, pixels),
|
|
49
51
|
"ms": 1000 (required for wait),
|
|
@@ -51,65 +53,37 @@ Respond with a JSON object (no markdown):
|
|
|
51
53
|
}`;
|
|
52
54
|
const response = await this.client.messages.create({
|
|
53
55
|
model: this.model,
|
|
54
|
-
max_tokens:
|
|
56
|
+
max_tokens: 256,
|
|
55
57
|
messages: [{ role: "user", content: prompt }],
|
|
56
58
|
});
|
|
57
59
|
const text = response.content[0].type === "text" ? response.content[0].text : "";
|
|
58
60
|
return this.parseAction(text);
|
|
59
61
|
}
|
|
60
|
-
// After a meaningful action (fill, click, pressKey), check if the goal data appeared on screen.
|
|
61
|
-
// This is the Notte approach: correlate screen content with network traffic, don't wait for AI to say "done".
|
|
62
|
-
async checkGoalAchieved(goal, screenshotBase64) {
|
|
63
|
-
const response = await this.client.messages.create({
|
|
64
|
-
model: this.model,
|
|
65
|
-
max_tokens: 256,
|
|
66
|
-
messages: [{
|
|
67
|
-
role: "user",
|
|
68
|
-
content: [
|
|
69
|
-
{
|
|
70
|
-
type: "image",
|
|
71
|
-
source: { type: "base64", media_type: "image/jpeg", data: screenshotBase64 },
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
type: "text",
|
|
75
|
-
text: `GOAL: ${goal}\n\nLook at this screenshot. Has the data we need actually appeared on screen?\nDo NOT say achieved=true just because the page loaded — only if the actual data (numbers, status, results) is visible.\n\nRespond with JSON only: { "achieved": true/false, "summary": "what you see on screen relevant to the goal" }`,
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
}],
|
|
79
|
-
});
|
|
80
|
-
const text = response.content[0].type === "text" ? response.content[0].text : "{}";
|
|
81
|
-
try {
|
|
82
|
-
const cleaned = text.replace(/```json\n?/g, "").replace(/```\n?/g, "").trim();
|
|
83
|
-
const parsed = JSON.parse(cleaned);
|
|
84
|
-
return { achieved: !!parsed.achieved, summary: parsed.summary ?? "" };
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
return { achieved: false, summary: "" };
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
62
|
// Vision fallback — only called when observe() returns ambiguous state
|
|
91
63
|
// e.g. canvas-rendered UI, complex dynamic content
|
|
92
|
-
async decideFromScreenshot(goal, screenshotBase64, history) {
|
|
64
|
+
async decideFromScreenshot(goal, screenshotBase64, history, seedValues) {
|
|
93
65
|
const historyText = history.length > 0
|
|
94
66
|
? `\nPREVIOUS STEPS:\n${history.slice(-3).join("\n")}`
|
|
95
67
|
: "";
|
|
68
|
+
const seedContext = seedValues && seedValues.length > 0
|
|
69
|
+
? `\nINPUT VALUES TO USE:\n${seedValues.map(s => `- ${s.paramName} (${s.description}): use "${s.exampleValue}" when filling any relevant input field`).join("\n")}`
|
|
70
|
+
: "";
|
|
96
71
|
const prompt = `You are controlling a browser to achieve a goal.
|
|
97
72
|
The DOM observer couldn't identify enough elements — you're seeing a screenshot instead.
|
|
98
73
|
Decide the SINGLE next action.
|
|
99
74
|
|
|
100
75
|
GOAL: ${goal}
|
|
101
|
-
${historyText}
|
|
76
|
+
${historyText}${seedContext}
|
|
102
77
|
|
|
103
78
|
RULES: Take minimum actions needed. Return "done" when goal is achievable.
|
|
79
|
+
If INPUT VALUES are provided above, use them when filling search boxes or input fields.
|
|
104
80
|
Return "impossible" if it cannot be done.
|
|
105
|
-
After filling a search/query field, always follow with pressKey "Enter".
|
|
106
81
|
|
|
107
82
|
Respond with JSON (no markdown):
|
|
108
83
|
{
|
|
109
|
-
"type": "click" | "fill" | "
|
|
84
|
+
"type": "click" | "fill" | "scroll" | "wait" | "screenshot" | "done" | "impossible",
|
|
110
85
|
"elementId": "describe the element visually if no ID available",
|
|
111
86
|
"value": "text to type" (for fill),
|
|
112
|
-
"key": "Enter" (for pressKey),
|
|
113
87
|
"direction": "up" | "down" (for scroll),
|
|
114
88
|
"ms": 1000 (for wait),
|
|
115
89
|
"reason": "why"
|
|
@@ -143,23 +117,10 @@ Respond with JSON (no markdown):
|
|
|
143
117
|
const cleaned = raw.replace(/```json\n?/g, "").replace(/```\n?/g, "").trim();
|
|
144
118
|
const parsed = JSON.parse(cleaned);
|
|
145
119
|
switch (parsed.type) {
|
|
146
|
-
case "click":
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
return { type: "impossible", reason: "AI returned click action without a valid elementId" };
|
|
151
|
-
}
|
|
152
|
-
return { type: "click", elementId, reason: parsed.reason ?? "" };
|
|
153
|
-
}
|
|
154
|
-
case "fill": {
|
|
155
|
-
const elementId = (parsed.elementId ?? "").trim();
|
|
156
|
-
if (!elementId) {
|
|
157
|
-
return { type: "impossible", reason: "AI returned fill action without a valid elementId" };
|
|
158
|
-
}
|
|
159
|
-
return { type: "fill", elementId, value: parsed.value ?? "", reason: parsed.reason ?? "" };
|
|
160
|
-
}
|
|
161
|
-
case "pressKey":
|
|
162
|
-
return { type: "pressKey", key: parsed.key ?? "Enter", reason: parsed.reason ?? "" };
|
|
120
|
+
case "click":
|
|
121
|
+
return { type: "click", elementId: parsed.elementId ?? "", reason: parsed.reason ?? "" };
|
|
122
|
+
case "fill":
|
|
123
|
+
return { type: "fill", elementId: parsed.elementId ?? "", value: parsed.value ?? "", reason: parsed.reason ?? "" };
|
|
163
124
|
case "scroll":
|
|
164
125
|
return { type: "scroll", direction: parsed.direction ?? "down", amount: parsed.amount, reason: parsed.reason ?? "" };
|
|
165
126
|
case "wait":
|
|
@@ -175,18 +136,7 @@ Respond with JSON (no markdown):
|
|
|
175
136
|
}
|
|
176
137
|
}
|
|
177
138
|
catch {
|
|
178
|
-
|
|
179
|
-
const lower = raw.toLowerCase();
|
|
180
|
-
if (lower.includes("screenshot"))
|
|
181
|
-
return { type: "screenshot", reason: "extracted from prose" };
|
|
182
|
-
if (lower.includes("scroll down"))
|
|
183
|
-
return { type: "scroll", direction: "down", reason: "extracted from prose" };
|
|
184
|
-
if (lower.includes("done") || lower.includes("goal is achieved"))
|
|
185
|
-
return { type: "done", reason: "extracted from prose" };
|
|
186
|
-
return {
|
|
187
|
-
type: "screenshot",
|
|
188
|
-
reason: `parse failed — taking screenshot to reassess: ${raw.slice(0, 100)}`,
|
|
189
|
-
};
|
|
139
|
+
return { type: "impossible", reason: `failed to parse AI response: ${raw.slice(0, 100)}` };
|
|
190
140
|
}
|
|
191
141
|
}
|
|
192
142
|
}
|
package/dist/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA0C;AAG1C,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,mEAAmE;AACnE,sCAAsC;AACtC,MAAa,QAAQ;IACX,MAAM,CAAY;IAClB,KAAK,CAAS;IAEtB,YAAY,MAAc,EAAE,KAAK,GAAG,aAAa;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,aAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,qBAAqB,CACzB,IAAY,EACZ,WAA0B,EAC1B,OAAiB;
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,EAAE,CAAW;gBAET,MAAM,EAAE,aAAa;IAQ3B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;YAyCtB,wBAAwB;CAoCvC"}
|
package/dist/browser.js
CHANGED
|
@@ -4,8 +4,6 @@ exports.RensanBrowser = void 0;
|
|
|
4
4
|
const playwright_1 = require("playwright");
|
|
5
5
|
const session_1 = require("./session");
|
|
6
6
|
const ai_1 = require("./ai");
|
|
7
|
-
// Delay helper for retry backoff
|
|
8
|
-
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
9
7
|
class RensanBrowser {
|
|
10
8
|
config;
|
|
11
9
|
ai;
|
|
@@ -21,10 +19,7 @@ class RensanBrowser {
|
|
|
21
19
|
let wsEndpoint;
|
|
22
20
|
let viewerUrl;
|
|
23
21
|
if (this.config.session.browserbase) {
|
|
24
|
-
const bb = await this.createBrowserbaseSession(
|
|
25
|
-
...this.config.session.browserbase,
|
|
26
|
-
contextId: this.config.session.browserbase.contextId,
|
|
27
|
-
});
|
|
22
|
+
const bb = await this.createBrowserbaseSession(this.config.session.browserbase);
|
|
28
23
|
wsEndpoint = bb.connectUrl;
|
|
29
24
|
viewerUrl = bb.viewerUrl;
|
|
30
25
|
}
|
|
@@ -34,15 +29,10 @@ class RensanBrowser {
|
|
|
34
29
|
else {
|
|
35
30
|
throw new Error("BrowserConfig requires either wsEndpoint or browserbase config");
|
|
36
31
|
}
|
|
37
|
-
|
|
38
|
-
const isPlaywrightServer = !wsEndpoint.includes('?') && !wsEndpoint.includes('browserbase');
|
|
39
|
-
const browser = isPlaywrightServer
|
|
40
|
-
? await playwright_1.chromium.connect(wsEndpoint)
|
|
41
|
-
: await playwright_1.chromium.connectOverCDP(wsEndpoint);
|
|
32
|
+
const browser = await playwright_1.chromium.connectOverCDP(wsEndpoint);
|
|
42
33
|
const contextOptions = {
|
|
43
34
|
viewport: viewport ?? { width: 1280, height: 800 },
|
|
44
|
-
|
|
45
|
-
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
|
35
|
+
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
46
36
|
locale: "en-US",
|
|
47
37
|
timezoneId: "America/New_York",
|
|
48
38
|
};
|
|
@@ -58,51 +48,31 @@ class RensanBrowser {
|
|
|
58
48
|
return new session_1.Session(page, browser, this.ai, timeout, viewerUrl);
|
|
59
49
|
}
|
|
60
50
|
// ─── Browserbase session creation ─────────────────────────────────────────────
|
|
61
|
-
async createBrowserbaseSession(config
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}),
|
|
80
|
-
signal: AbortSignal.timeout(15_000),
|
|
81
|
-
});
|
|
82
|
-
if (!response.ok) {
|
|
83
|
-
const body = await response.text();
|
|
84
|
-
// Don't retry on client errors (4xx) — they won't resolve on retry
|
|
85
|
-
if (response.status >= 400 && response.status < 500) {
|
|
86
|
-
throw new Error(`Browserbase session creation failed (${response.status}): ${body}`);
|
|
87
|
-
}
|
|
88
|
-
throw new Error(`Browserbase session creation failed (${response.status})`);
|
|
89
|
-
}
|
|
90
|
-
const data = await response.json();
|
|
91
|
-
return {
|
|
92
|
-
id: data.id,
|
|
93
|
-
connectUrl: data.connectUrl,
|
|
94
|
-
viewerUrl: data.debuggerFullscreenUrl ?? data.debuggerUrl ?? `https://www.browserbase.com/sessions/${data.id}`,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
lastError = err;
|
|
99
|
-
if (attempt < maxRetries) {
|
|
100
|
-
// Exponential backoff: 1s, 2s, 4s
|
|
101
|
-
await sleep(1000 * attempt);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
51
|
+
async createBrowserbaseSession(config) {
|
|
52
|
+
const response = await fetch("https://www.browserbase.com/v1/sessions", {
|
|
53
|
+
method: "POST",
|
|
54
|
+
headers: {
|
|
55
|
+
"Content-Type": "application/json",
|
|
56
|
+
"x-bb-api-key": config.apiKey,
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify({
|
|
59
|
+
projectId: config.projectId,
|
|
60
|
+
browserSettings: {
|
|
61
|
+
viewport: this.config.session.viewport ?? { width: 1280, height: 800 },
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
signal: AbortSignal.timeout(15_000),
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const body = await response.text();
|
|
68
|
+
throw new Error(`Browserbase session creation failed (${response.status}): ${body}`);
|
|
104
69
|
}
|
|
105
|
-
|
|
70
|
+
const data = await response.json();
|
|
71
|
+
return {
|
|
72
|
+
id: data.id,
|
|
73
|
+
connectUrl: data.connectUrl,
|
|
74
|
+
viewerUrl: data.debuggerFullscreenUrl ?? data.debuggerUrl ?? `https://www.browserbase.com/sessions/${data.id}`,
|
|
75
|
+
};
|
|
106
76
|
}
|
|
107
77
|
}
|
|
108
78
|
exports.RensanBrowser = RensanBrowser;
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";;;AAAA,2CAAsC;AAEtC,uCAAoC;AACpC,6BAAgC;AAEhC,
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { RensanBrowser } from "./browser";
|
|
2
2
|
export { Session } from "./session";
|
|
3
|
-
export type { ObservedElement, ObserveResult, CapturedRequest, AgentAction, ActResult, FindDataResult, SessionConfig, AIConfig, BrowserConfig, Screenshot, ElementType, } from "./types";
|
|
3
|
+
export type { ObservedElement, ObserveResult, CapturedRequest, SeedValue, AgentAction, ActResult, FindDataResult, SessionConfig, AIConfig, BrowserConfig, Screenshot, ElementType, } from "./types";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,SAAS,EACT,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,SAAS,CAAC"}
|
package/dist/interceptor.d.ts
CHANGED
|
@@ -3,15 +3,18 @@ import type { Page } from "playwright";
|
|
|
3
3
|
import type { CapturedRequest } from "./types";
|
|
4
4
|
export declare class Interceptor extends EventEmitter {
|
|
5
5
|
private captured;
|
|
6
|
-
private
|
|
6
|
+
private requestMap;
|
|
7
7
|
private active;
|
|
8
8
|
private page;
|
|
9
|
+
private lastActionTimestamp;
|
|
9
10
|
constructor(page: Page);
|
|
10
11
|
start(): void;
|
|
11
12
|
stop(): void;
|
|
12
13
|
getAll(): CapturedRequest[];
|
|
13
14
|
getUseful(minScore?: number): CapturedRequest[];
|
|
14
15
|
clear(): void;
|
|
16
|
+
markActionTimestamp(): void;
|
|
17
|
+
getActionTriggered(): CapturedRequest[];
|
|
15
18
|
private onRequest;
|
|
16
19
|
private onResponse;
|
|
17
20
|
private onRequestFailed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAqB,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmD/C,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAA2C;
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAqB,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmD/C,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,IAAI,EAAE,IAAI;IAMtB,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IASZ,MAAM,IAAI,eAAe,EAAE;IAK3B,SAAS,CAAC,QAAQ,SAAI,GAAG,eAAe,EAAE;IAM1C,KAAK,IAAI,IAAI;IAOb,mBAAmB,IAAI,IAAI;IAK3B,kBAAkB,IAAI,eAAe,EAAE;IAMvC,OAAO,CAAC,SAAS,CA0Bf;IAEF,OAAO,CAAC,UAAU,CAkChB;IAEF,OAAO,CAAC,eAAe,CASrB;IAIF,OAAO,CAAC,YAAY;IA8DpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,mBAAmB;CAG5B"}
|
package/dist/interceptor.js
CHANGED
|
@@ -43,15 +43,14 @@ const USEFUL_CONTENT_TYPES = [
|
|
|
43
43
|
"text/plain",
|
|
44
44
|
"application/x-www-form-urlencoded",
|
|
45
45
|
];
|
|
46
|
-
//
|
|
47
|
-
const
|
|
46
|
+
// Window (ms) after a user action during which requests are considered action-triggered
|
|
47
|
+
const ACTION_CORRELATION_WINDOW_MS = 2000;
|
|
48
48
|
class Interceptor extends events_1.EventEmitter {
|
|
49
49
|
captured = new Map();
|
|
50
|
-
|
|
51
|
-
// because response.request() always returns the same object that fired the request event.
|
|
52
|
-
requestIds = new WeakMap();
|
|
50
|
+
requestMap = new Map(); // playwright req id → our id
|
|
53
51
|
active = false;
|
|
54
52
|
page;
|
|
53
|
+
lastActionTimestamp = 0;
|
|
55
54
|
constructor(page) {
|
|
56
55
|
super();
|
|
57
56
|
this.page = page;
|
|
@@ -82,6 +81,16 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
82
81
|
}
|
|
83
82
|
clear() {
|
|
84
83
|
this.captured.clear();
|
|
84
|
+
this.requestMap.clear();
|
|
85
|
+
}
|
|
86
|
+
// Call this immediately before executing any user action (click, fill, scroll)
|
|
87
|
+
// so subsequent requests can be correlated to that action
|
|
88
|
+
markActionTimestamp() {
|
|
89
|
+
this.lastActionTimestamp = Date.now();
|
|
90
|
+
}
|
|
91
|
+
// Returns only requests that fired within the correlation window after a user action
|
|
92
|
+
getActionTriggered() {
|
|
93
|
+
return this.getAll().filter((r) => r.triggeredByAction === true);
|
|
85
94
|
}
|
|
86
95
|
// ─── Private handlers ───────────────────────────────────────────────────────
|
|
87
96
|
onRequest = (request) => {
|
|
@@ -89,11 +98,13 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
89
98
|
if (this.shouldIgnore(url))
|
|
90
99
|
return;
|
|
91
100
|
const id = (0, crypto_1.randomUUID)();
|
|
92
|
-
|
|
93
|
-
|
|
101
|
+
this.requestMap.set(request.url() + request.method(), id);
|
|
102
|
+
const now = Date.now();
|
|
103
|
+
const triggeredByAction = this.lastActionTimestamp > 0 &&
|
|
104
|
+
now - this.lastActionTimestamp <= ACTION_CORRELATION_WINDOW_MS;
|
|
94
105
|
const entry = {
|
|
95
106
|
id,
|
|
96
|
-
timestamp:
|
|
107
|
+
timestamp: now,
|
|
97
108
|
method: request.method(),
|
|
98
109
|
url,
|
|
99
110
|
requestHeaders: request.headers(),
|
|
@@ -101,6 +112,7 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
101
112
|
isXHR: this.isXHR(request),
|
|
102
113
|
isAsset: this.isAsset(url),
|
|
103
114
|
score: 0, // scored when response arrives
|
|
115
|
+
triggeredByAction,
|
|
104
116
|
};
|
|
105
117
|
this.captured.set(id, entry);
|
|
106
118
|
};
|
|
@@ -108,31 +120,22 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
108
120
|
const url = response.url();
|
|
109
121
|
if (this.shouldIgnore(url))
|
|
110
122
|
return;
|
|
111
|
-
|
|
112
|
-
const id = this.
|
|
123
|
+
const key = url + response.request().method();
|
|
124
|
+
const id = this.requestMap.get(key);
|
|
113
125
|
if (!id)
|
|
114
126
|
return;
|
|
115
127
|
const entry = this.captured.get(id);
|
|
116
128
|
if (!entry)
|
|
117
129
|
return;
|
|
118
130
|
const contentType = response.headers()["content-type"] ?? "";
|
|
119
|
-
// Only read body for useful content types
|
|
131
|
+
// Only read body for useful content types to avoid wasting memory
|
|
120
132
|
let body;
|
|
121
133
|
if (this.isUsefulContentType(contentType)) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
// Skip — body is too large to be a useful JSON/XML API response
|
|
125
|
-
body = undefined;
|
|
134
|
+
try {
|
|
135
|
+
body = await response.text();
|
|
126
136
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const raw = await response.text();
|
|
130
|
-
// Hard cap: even if Content-Length was missing or wrong, truncate
|
|
131
|
-
body = raw.length > MAX_BODY_BYTES ? raw.slice(0, MAX_BODY_BYTES) : raw;
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
body = undefined;
|
|
135
|
-
}
|
|
137
|
+
catch {
|
|
138
|
+
body = undefined;
|
|
136
139
|
}
|
|
137
140
|
}
|
|
138
141
|
const updated = {
|
|
@@ -147,7 +150,8 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
147
150
|
this.emit("request", updated); // real-time stream
|
|
148
151
|
};
|
|
149
152
|
onRequestFailed = (request) => {
|
|
150
|
-
const
|
|
153
|
+
const key = request.url() + request.method();
|
|
154
|
+
const id = this.requestMap.get(key);
|
|
151
155
|
if (!id)
|
|
152
156
|
return;
|
|
153
157
|
const entry = this.captured.get(id);
|
|
@@ -210,6 +214,9 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
210
214
|
// access-control-allow-origin: * means it's designed to be called directly
|
|
211
215
|
if (req.responseHeaders?.["access-control-allow-origin"] === "*")
|
|
212
216
|
score += 3;
|
|
217
|
+
// Requests triggered by a user action are much more likely to be the real data API
|
|
218
|
+
if (req.triggeredByAction)
|
|
219
|
+
score += 5;
|
|
213
220
|
return score;
|
|
214
221
|
}
|
|
215
222
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
package/dist/interceptor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AAGtC,mCAAoC;AAEpC,kDAAkD;AAClD,MAAM,iBAAiB,GAAG;IACxB,UAAU;IACV,WAAW;IACX,YAAY;IACZ,WAAW;IACX,WAAW;IACX,SAAS;IACT,WAAW;IACX,UAAU;CACX,CAAC;AAEF,MAAM,qBAAqB,GAAG;IAC5B,aAAa;IACb,aAAa;IACb,YAAY;IACZ,WAAW;IACX,UAAU;IACV,YAAY;IACZ,UAAU;CACX,CAAC;AAEF,mCAAmC;AACnC,MAAM,eAAe,GAAG;IACtB,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU;IACrE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ;CACrD,CAAC;AAEF,wCAAwC;AACxC,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAC/D,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAClE,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,8BAA8B;AAC9B,MAAM,oBAAoB,GAAG;IAC3B,kBAAkB;IAClB,iBAAiB;IACjB,UAAU;IACV,qBAAqB;IACrB,YAAY;IACZ,mCAAmC;CACpC,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
|
package/dist/observer.d.ts
CHANGED
|
@@ -2,14 +2,12 @@ import type { Page } from "playwright";
|
|
|
2
2
|
import type { ObserveResult } from "./types";
|
|
3
3
|
export declare class Observer {
|
|
4
4
|
private page;
|
|
5
|
-
private _lastElements;
|
|
6
5
|
constructor(page: Page);
|
|
7
6
|
observe(): Promise<ObserveResult>;
|
|
8
7
|
resolveElementId(id: string): Promise<{
|
|
9
8
|
x: number;
|
|
10
9
|
y: number;
|
|
11
10
|
} | null>;
|
|
12
|
-
private resolveCoords;
|
|
13
11
|
private resolveType;
|
|
14
12
|
private buildTextRepresentation;
|
|
15
13
|
}
|
package/dist/observer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAmB,aAAa,EAAe,MAAM,SAAS,CAAC;AAc3E,qBAAa,QAAQ;IACnB,OAAO,CAAC,IAAI,CAAO;
|
|
1
|
+
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAmB,aAAa,EAAe,MAAM,SAAS,CAAC;AAc3E,qBAAa,QAAQ;IACnB,OAAO,CAAC,IAAI,CAAO;gBAEP,IAAI,EAAE,IAAI;IAMhB,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAwLjC,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA2B5E,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,uBAAuB;CAkChC"}
|
package/dist/observer.js
CHANGED
|
@@ -14,8 +14,6 @@ const PREFIX = {
|
|
|
14
14
|
};
|
|
15
15
|
class Observer {
|
|
16
16
|
page;
|
|
17
|
-
// Cache the last observation's elements so resolveElementId doesn't need to re-scan the DOM
|
|
18
|
-
_lastElements = [];
|
|
19
17
|
constructor(page) {
|
|
20
18
|
this.page = page;
|
|
21
19
|
}
|
|
@@ -31,8 +29,7 @@ class Observer {
|
|
|
31
29
|
rect.height > 0 &&
|
|
32
30
|
style.display !== "none" &&
|
|
33
31
|
style.visibility !== "hidden" &&
|
|
34
|
-
style.opacity !== "0"
|
|
35
|
-
style.pointerEvents !== "none");
|
|
32
|
+
style.opacity !== "0");
|
|
36
33
|
};
|
|
37
34
|
const getText = (el) => {
|
|
38
35
|
const aria = el.getAttribute("aria-label");
|
|
@@ -123,22 +120,10 @@ class Observer {
|
|
|
123
120
|
"[aria-modal='true']",
|
|
124
121
|
];
|
|
125
122
|
const hasModal = modalSelectors.some((s) => document.querySelector(s) !== null);
|
|
126
|
-
// Cookie banner detection
|
|
127
|
-
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
"[class*='cookie-banner']", "[class*='cookie-consent']", "[class*='gdpr']",
|
|
131
|
-
"[class*='consent-banner']", "[class*='privacy-banner']",
|
|
132
|
-
"[aria-label*='cookie']", "[aria-label*='consent']",
|
|
133
|
-
"[data-testid*='cookie']", "[data-testid*='consent']",
|
|
134
|
-
];
|
|
135
|
-
const hasCookieBanner = cookieBannerSelectors.some((s) => {
|
|
136
|
-
const el = document.querySelector(s);
|
|
137
|
-
if (!el)
|
|
138
|
-
return false;
|
|
139
|
-
const rect = el.getBoundingClientRect();
|
|
140
|
-
return rect.width > 0 && rect.height > 0;
|
|
141
|
-
});
|
|
123
|
+
// Cookie banner detection
|
|
124
|
+
const cookieKeywords = ["cookie", "gdpr", "consent", "accept all"];
|
|
125
|
+
const bodyText = document.body.innerText.toLowerCase();
|
|
126
|
+
const hasCookieBanner = cookieKeywords.some((k) => bodyText.includes(k));
|
|
142
127
|
// Loading detection
|
|
143
128
|
const loadingSelectors = [
|
|
144
129
|
"[aria-busy='true']",
|
|
@@ -174,8 +159,6 @@ class Observer {
|
|
|
174
159
|
visible: raw.visible,
|
|
175
160
|
});
|
|
176
161
|
}
|
|
177
|
-
// Update cache — used by resolveElementId to avoid a second DOM scan
|
|
178
|
-
this._lastElements = typedElements;
|
|
179
162
|
const text = this.buildTextRepresentation(typedElements, result);
|
|
180
163
|
return {
|
|
181
164
|
url: result.url,
|
|
@@ -187,22 +170,13 @@ class Observer {
|
|
|
187
170
|
text,
|
|
188
171
|
};
|
|
189
172
|
}
|
|
190
|
-
// Find an element by ID (@B3, @I1, etc.) and return its
|
|
191
|
-
// Uses the cached elements from the last observe() call — avoids a second full DOM scan.
|
|
192
|
-
// Falls back to a fresh observe() only if the element isn't in cache (DOM may have changed).
|
|
173
|
+
// Find an element by ID (@B3, @I1, etc.) and return its locator
|
|
193
174
|
async resolveElementId(id) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (!el)
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
return this.resolveCoords(el);
|
|
203
|
-
}
|
|
204
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
205
|
-
async resolveCoords(el) {
|
|
175
|
+
const elements = await this.observe();
|
|
176
|
+
const el = elements.elements.find((e) => e.id === id);
|
|
177
|
+
if (!el)
|
|
178
|
+
return null;
|
|
179
|
+
// Get coordinates by re-querying the DOM
|
|
206
180
|
return await this.page.evaluate((targetText) => {
|
|
207
181
|
const all = document.querySelectorAll("button, input, a, select, textarea, [role='button']");
|
|
208
182
|
for (const el of Array.from(all)) {
|
|
@@ -219,6 +193,7 @@ class Observer {
|
|
|
219
193
|
return null;
|
|
220
194
|
}, el.text ?? el.placeholder ?? "");
|
|
221
195
|
}
|
|
196
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
222
197
|
resolveType(tag, inputType) {
|
|
223
198
|
if (tag === "button")
|
|
224
199
|
return "button";
|
|
@@ -247,11 +222,11 @@ class Observer {
|
|
|
247
222
|
`URL: ${meta.url}`,
|
|
248
223
|
];
|
|
249
224
|
if (meta.isLoading)
|
|
250
|
-
lines.push("[PAGE IS LOADING]");
|
|
225
|
+
lines.push("[⏳ PAGE IS LOADING]");
|
|
251
226
|
if (meta.hasModal)
|
|
252
|
-
lines.push("[MODAL IS OPEN — may block interactions]");
|
|
227
|
+
lines.push("[⚠️ MODAL IS OPEN — may block interactions]");
|
|
253
228
|
if (meta.hasCookieBanner)
|
|
254
|
-
lines.push("[COOKIE BANNER DETECTED — dismiss first]");
|
|
229
|
+
lines.push("[🍪 COOKIE BANNER DETECTED — dismiss first]");
|
|
255
230
|
lines.push("", "INTERACTIVE ELEMENTS:");
|
|
256
231
|
const visible = elements.filter((e) => e.visible !== false);
|
|
257
232
|
const hidden = elements.filter((e) => e.visible === false);
|
|
@@ -264,7 +239,7 @@ class Observer {
|
|
|
264
239
|
if (el.value)
|
|
265
240
|
desc += ` value="${el.value}"`;
|
|
266
241
|
if (el.href)
|
|
267
|
-
desc += `
|
|
242
|
+
desc += ` → ${el.href.slice(0, 80)}`;
|
|
268
243
|
if (el.disabled)
|
|
269
244
|
desc += " (disabled)";
|
|
270
245
|
lines.push(desc);
|
package/dist/observer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer.js","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":";;;AAGA,6BAA6B;AAC7B,MAAM,MAAM,GAAgC;IAC1C,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAa,QAAQ;IACX,IAAI,CAAO;
|
|
1
|
+
{"version":3,"file":"observer.js","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Page, Browser } from "playwright";
|
|
2
|
-
import type { ObserveResult, CapturedRequest, ActResult, FindDataResult, Screenshot } from "./types";
|
|
2
|
+
import type { ObserveResult, CapturedRequest, ActResult, FindDataResult, Screenshot, SeedValue } from "./types";
|
|
3
3
|
import { AIClient } from "./ai";
|
|
4
4
|
export declare class Session {
|
|
5
5
|
private page;
|
|
@@ -19,17 +19,12 @@ export declare class Session {
|
|
|
19
19
|
fillById(elementId: string, value: string): Promise<void>;
|
|
20
20
|
getCapturedRequests(): CapturedRequest[];
|
|
21
21
|
getUsefulRequests(minScore?: number): CapturedRequest[];
|
|
22
|
+
getActionTriggeredRequests(): CapturedRequest[];
|
|
22
23
|
onRequest(handler: (req: CapturedRequest) => void): void;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
findData(goal: string, maxSteps?: number): Promise<FindDataResult>;
|
|
26
|
-
extractEmbeddedData(): Promise<{
|
|
27
|
-
source: string;
|
|
28
|
-
data: unknown;
|
|
29
|
-
} | null>;
|
|
24
|
+
act(goal: string, maxSteps?: number, seedValues?: SeedValue[]): Promise<ActResult>;
|
|
25
|
+
findData(goal: string, maxSteps?: number, seedValues?: SeedValue[]): Promise<FindDataResult>;
|
|
30
26
|
close(): Promise<void>;
|
|
31
27
|
closeAll(): Promise<void>;
|
|
32
|
-
private dismissCookieBanner;
|
|
33
28
|
private executeAction;
|
|
34
29
|
}
|
|
35
30
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,SAAS,EACT,cAAc,EAEd,UAAU,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,SAAS,EACT,cAAc,EAEd,UAAU,EACV,SAAS,EACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,cAAc,CAAS;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGrC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,QAAQ,EACZ,OAAO,SAAS,EAChB,SAAS,CAAC,EAAE,MAAM;IAkBd,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,IAAI,GAAG,IAAI,MAAM,CAEhB;IAIK,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAMjC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAYjC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/D,mBAAmB,IAAI,eAAe,EAAE;IAKxC,iBAAiB,CAAC,QAAQ,SAAI,GAAG,eAAe,EAAE;IAKlD,0BAA0B,IAAI,eAAe,EAAE;IAK/C,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAMlD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAK,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAiD9E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAK,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAgBxF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAOjB,aAAa;CAuC5B"}
|
package/dist/session.js
CHANGED
|
@@ -3,8 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Session = void 0;
|
|
4
4
|
const interceptor_1 = require("./interceptor");
|
|
5
5
|
const observer_1 = require("./observer");
|
|
6
|
-
// Maximum entries kept in the AI history array to bound prompt size
|
|
7
|
-
const MAX_HISTORY = 20;
|
|
8
6
|
class Session {
|
|
9
7
|
page;
|
|
10
8
|
browser;
|
|
@@ -60,14 +58,12 @@ class Session {
|
|
|
60
58
|
await this.page.mouse.click(coords.x, coords.y);
|
|
61
59
|
}
|
|
62
60
|
// Fill input by element ID from observe()
|
|
63
|
-
// Uses platform-appropriate select-all shortcut (Meta on macOS, Control elsewhere)
|
|
64
61
|
async fillById(elementId, value) {
|
|
65
62
|
const coords = await this.observer.resolveElementId(elementId);
|
|
66
63
|
if (!coords)
|
|
67
64
|
throw new Error(`Element ${elementId} not found in DOM`);
|
|
68
65
|
await this.page.mouse.click(coords.x, coords.y);
|
|
69
|
-
|
|
70
|
-
await this.page.keyboard.press(`${modifier}+a`);
|
|
66
|
+
await this.page.keyboard.press("Control+a");
|
|
71
67
|
await this.page.keyboard.type(value);
|
|
72
68
|
}
|
|
73
69
|
// ─── Captured requests ────────────────────────────────────────────────────────
|
|
@@ -79,16 +75,16 @@ class Session {
|
|
|
79
75
|
getUsefulRequests(minScore = 1) {
|
|
80
76
|
return this.interceptor.getUseful(minScore);
|
|
81
77
|
}
|
|
78
|
+
// Only requests that fired as a direct result of a user action
|
|
79
|
+
getActionTriggeredRequests() {
|
|
80
|
+
return this.interceptor.getActionTriggered();
|
|
81
|
+
}
|
|
82
82
|
// Listen to requests in real-time as they come in
|
|
83
83
|
onRequest(handler) {
|
|
84
84
|
this.interceptor.on("request", handler);
|
|
85
85
|
}
|
|
86
|
-
// Returns requests that fired within a time window (used for action-triggered correlation)
|
|
87
|
-
getRequestsInWindow(startMs, endMs) {
|
|
88
|
-
return this.interceptor.getAll().filter(r => r.timestamp >= startMs && r.timestamp <= endMs);
|
|
89
|
-
}
|
|
90
86
|
// ─── act() — achieve a goal through multi-step navigation ────────────────────
|
|
91
|
-
async act(goal, maxSteps = 10) {
|
|
87
|
+
async act(goal, maxSteps = 10, seedValues) {
|
|
92
88
|
const steps = [];
|
|
93
89
|
const history = [];
|
|
94
90
|
for (let i = 0; i < maxSteps; i++) {
|
|
@@ -98,51 +94,27 @@ class Session {
|
|
|
98
94
|
let usedScreenshot = false;
|
|
99
95
|
// If observe() gives us enough elements, use text-based decision
|
|
100
96
|
if (observation.elements.filter((e) => e.visible).length > 0) {
|
|
101
|
-
action = await this.ai.decideFromObservation(goal, observation, history);
|
|
97
|
+
action = await this.ai.decideFromObservation(goal, observation, history, seedValues);
|
|
102
98
|
}
|
|
103
99
|
else {
|
|
104
100
|
// Fallback: page has no readable elements (canvas, iframe, etc.) → screenshot
|
|
105
101
|
const shot = await this.screenshot();
|
|
106
|
-
action = await this.ai.decideFromScreenshot(goal, shot.base64, history);
|
|
102
|
+
action = await this.ai.decideFromScreenshot(goal, shot.base64, history, seedValues);
|
|
107
103
|
usedScreenshot = true;
|
|
108
104
|
}
|
|
109
|
-
|
|
105
|
+
steps.push({ action, observeBefore: observation, usedScreenshot });
|
|
110
106
|
history.push(`Step ${i + 1}: ${action.type} — ${action.reason}`);
|
|
111
|
-
if (history.length > MAX_HISTORY)
|
|
112
|
-
history.shift();
|
|
113
107
|
// Terminal states
|
|
114
108
|
if (action.type === "done") {
|
|
115
|
-
steps.push({ action, observeBefore: observation, usedScreenshot, triggeredRequests: [] });
|
|
116
109
|
return { success: true, steps, finalUrl: this.url, reason: action.reason };
|
|
117
110
|
}
|
|
118
111
|
if (action.type === "impossible") {
|
|
119
|
-
steps.push({ action, observeBefore: observation, usedScreenshot, triggeredRequests: [] });
|
|
120
112
|
return { success: false, steps, finalUrl: this.url, reason: action.reason };
|
|
121
113
|
}
|
|
122
|
-
// Execute action
|
|
123
|
-
const actionTs = Date.now();
|
|
114
|
+
// Execute action
|
|
124
115
|
await this.executeAction(action);
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
const isDataAction = action.type === "fill" || action.type === "pressKey" || action.type === "click";
|
|
128
|
-
if (isDataAction) {
|
|
129
|
-
// Wait longer — data needs time to load after interaction
|
|
130
|
-
await this.page.waitForTimeout(1200);
|
|
131
|
-
const shot = await this.screenshot();
|
|
132
|
-
const check = await this.ai.checkGoalAchieved(goal, shot.base64);
|
|
133
|
-
// Capture requests in the window triggered by this action
|
|
134
|
-
const triggeredRequests = this.getRequestsInWindow(actionTs, actionTs + 1400);
|
|
135
|
-
steps.push({ action, observeBefore: observation, usedScreenshot: true, triggeredRequests });
|
|
136
|
-
if (check.achieved) {
|
|
137
|
-
return { success: true, steps, finalUrl: this.url, reason: check.summary };
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
// Non-data actions: short wait, no screenshot check
|
|
142
|
-
await this.page.waitForTimeout(500);
|
|
143
|
-
const triggeredRequests = this.getRequestsInWindow(actionTs, actionTs + 600);
|
|
144
|
-
steps.push({ action, observeBefore: observation, usedScreenshot, triggeredRequests });
|
|
145
|
-
}
|
|
116
|
+
// Short wait after interactions for page to settle
|
|
117
|
+
await this.page.waitForTimeout(500);
|
|
146
118
|
}
|
|
147
119
|
return {
|
|
148
120
|
success: false,
|
|
@@ -152,59 +124,18 @@ class Session {
|
|
|
152
124
|
};
|
|
153
125
|
}
|
|
154
126
|
// ─── findData() — navigate + capture requests until goal achieved ─────────────
|
|
155
|
-
|
|
127
|
+
// seedValues: concrete example inputs to use during discovery (e.g. what to type in a search box)
|
|
128
|
+
async findData(goal, maxSteps = 15, seedValues) {
|
|
156
129
|
// Do NOT clear — requests captured during goto() (t=0) are valuable.
|
|
157
130
|
// Give the page a moment to finish firing initial requests before acting.
|
|
158
131
|
await this.page.waitForTimeout(500);
|
|
159
|
-
|
|
160
|
-
// This runs only when observe() detects hasCookieBanner=true — zero cost otherwise.
|
|
161
|
-
await this.dismissCookieBanner();
|
|
162
|
-
const actResult = await this.act(goal, maxSteps);
|
|
132
|
+
const actResult = await this.act(goal, maxSteps, seedValues);
|
|
163
133
|
const capturedRequests = this.interceptor.getUseful();
|
|
164
134
|
return {
|
|
165
135
|
...actResult,
|
|
166
136
|
capturedRequests,
|
|
167
137
|
};
|
|
168
138
|
}
|
|
169
|
-
// ─── Embedded data extraction ─────────────────────────────────────────────────
|
|
170
|
-
// Finds JSON data baked into the page HTML by SSR frameworks (Next.js, Nuxt, etc.)
|
|
171
|
-
// Useful when a site renders data server-side with no XHR traffic to capture.
|
|
172
|
-
async extractEmbeddedData() {
|
|
173
|
-
return this.page.evaluate(() => {
|
|
174
|
-
// Next.js: <script id="__NEXT_DATA__" type="application/json">
|
|
175
|
-
const nextEl = document.getElementById('__NEXT_DATA__');
|
|
176
|
-
if (nextEl?.textContent) {
|
|
177
|
-
try {
|
|
178
|
-
return { source: '__NEXT_DATA__', data: JSON.parse(nextEl.textContent) };
|
|
179
|
-
}
|
|
180
|
-
catch { /* */ }
|
|
181
|
-
}
|
|
182
|
-
// Nuxt 3: <script id="__NUXT_DATA__"> or inline hydration script
|
|
183
|
-
const nuxtEl = document.getElementById('__NUXT_DATA__') ?? document.querySelector('script[data-nuxt-data]');
|
|
184
|
-
if (nuxtEl?.textContent) {
|
|
185
|
-
try {
|
|
186
|
-
return { source: '__NUXT_DATA__', data: JSON.parse(nuxtEl.textContent) };
|
|
187
|
-
}
|
|
188
|
-
catch { /* */ }
|
|
189
|
-
}
|
|
190
|
-
// JSON-LD: <script type="application/ld+json">
|
|
191
|
-
const ldEl = document.querySelector('script[type="application/ld+json"]');
|
|
192
|
-
if (ldEl?.textContent) {
|
|
193
|
-
try {
|
|
194
|
-
return { source: 'json-ld', data: JSON.parse(ldEl.textContent) };
|
|
195
|
-
}
|
|
196
|
-
catch { /* */ }
|
|
197
|
-
}
|
|
198
|
-
// Generic window state variables common in SPAs
|
|
199
|
-
const win = window;
|
|
200
|
-
for (const key of ['__STATE__', '__INITIAL_STATE__', '__APP_STATE__', '__DATA__', '__REDUX_STATE__', 'APP_DATA']) {
|
|
201
|
-
if (win[key] && typeof win[key] === 'object') {
|
|
202
|
-
return { source: `window.${key}`, data: win[key] };
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return null;
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
139
|
// ─── Cleanup ──────────────────────────────────────────────────────────────────
|
|
209
140
|
async close() {
|
|
210
141
|
this.interceptor.stop();
|
|
@@ -214,61 +145,24 @@ class Session {
|
|
|
214
145
|
this.interceptor.stop();
|
|
215
146
|
await this.browser.close();
|
|
216
147
|
}
|
|
217
|
-
// ─── Cookie banner dismissal ─────────────────────────────────────────────────
|
|
218
|
-
// Called once after page load. Only proceeds if observe() detects a banner.
|
|
219
|
-
// Layer 1: AI-driven (works for any language, any framework, any text).
|
|
220
|
-
// Layer 2: Known framework CSS selectors as fallback.
|
|
221
|
-
async dismissCookieBanner() {
|
|
222
|
-
try {
|
|
223
|
-
const observation = await this.observe();
|
|
224
|
-
if (!observation.hasCookieBanner)
|
|
225
|
-
return;
|
|
226
|
-
const action = await this.ai.decideFromObservation('dismiss the cookie/consent/GDPR banner — click the accept or dismiss button', observation, []);
|
|
227
|
-
if (action.type === 'click') {
|
|
228
|
-
await this.clickById(action.elementId).catch(() => { });
|
|
229
|
-
await this.page.waitForTimeout(400);
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
catch { /* non-fatal */ }
|
|
234
|
-
// Layer 2: framework-specific selectors (OneTrust, CookieBot, etc.)
|
|
235
|
-
const selectors = [
|
|
236
|
-
'#onetrust-accept-btn-handler',
|
|
237
|
-
'#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll',
|
|
238
|
-
'.cc-btn.cc-accept',
|
|
239
|
-
'[data-testid="cookie-accept"]',
|
|
240
|
-
'[id*="cookie"][id*="accept" i]',
|
|
241
|
-
];
|
|
242
|
-
for (const sel of selectors) {
|
|
243
|
-
try {
|
|
244
|
-
const el = this.page.locator(sel).first();
|
|
245
|
-
if (await el.isVisible({ timeout: 300 })) {
|
|
246
|
-
await el.click();
|
|
247
|
-
await this.page.waitForTimeout(400);
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
catch { /* try next */ }
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
148
|
// ─── Execute action ───────────────────────────────────────────────────────────
|
|
255
149
|
async executeAction(action) {
|
|
256
150
|
switch (action.type) {
|
|
257
151
|
case "click":
|
|
152
|
+
this.interceptor.markActionTimestamp();
|
|
258
153
|
await this.clickById(action.elementId).catch(async () => {
|
|
259
154
|
// If ID resolution fails, try clicking by text content
|
|
260
155
|
await this.page.getByText(action.elementId).first().click();
|
|
261
156
|
});
|
|
262
157
|
break;
|
|
263
158
|
case "fill":
|
|
159
|
+
this.interceptor.markActionTimestamp();
|
|
264
160
|
await this.fillById(action.elementId, action.value).catch(async () => {
|
|
265
161
|
await this.page.getByRole("textbox").first().fill(action.value);
|
|
266
162
|
});
|
|
267
163
|
break;
|
|
268
|
-
case "pressKey":
|
|
269
|
-
await this.page.keyboard.press(action.key);
|
|
270
|
-
break;
|
|
271
164
|
case "scroll":
|
|
165
|
+
this.interceptor.markActionTimestamp();
|
|
272
166
|
await this.page.evaluate(({ direction, amount }) => {
|
|
273
167
|
window.scrollBy(0, direction === "down" ? amount : -amount);
|
|
274
168
|
}, { direction: action.direction, amount: action.amount ?? 300 });
|
|
@@ -277,7 +171,7 @@ class Session {
|
|
|
277
171
|
await this.page.waitForTimeout(action.ms);
|
|
278
172
|
break;
|
|
279
173
|
case "screenshot":
|
|
280
|
-
//
|
|
174
|
+
// Already handled in act() loop — screenshot triggers AI vision fallback
|
|
281
175
|
break;
|
|
282
176
|
default:
|
|
283
177
|
break;
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -32,6 +32,12 @@ export interface CapturedRequest {
|
|
|
32
32
|
isXHR: boolean;
|
|
33
33
|
isAsset: boolean;
|
|
34
34
|
score: number;
|
|
35
|
+
triggeredByAction?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface SeedValue {
|
|
38
|
+
paramName: string;
|
|
39
|
+
exampleValue: string;
|
|
40
|
+
description: string;
|
|
35
41
|
}
|
|
36
42
|
export type AgentAction = {
|
|
37
43
|
type: "click";
|
|
@@ -42,10 +48,6 @@ export type AgentAction = {
|
|
|
42
48
|
elementId: string;
|
|
43
49
|
value: string;
|
|
44
50
|
reason: string;
|
|
45
|
-
} | {
|
|
46
|
-
type: "pressKey";
|
|
47
|
-
key: string;
|
|
48
|
-
reason: string;
|
|
49
51
|
} | {
|
|
50
52
|
type: "scroll";
|
|
51
53
|
direction: "up" | "down";
|
|
@@ -71,7 +73,6 @@ export interface ActResult {
|
|
|
71
73
|
action: AgentAction;
|
|
72
74
|
observeBefore: ObserveResult;
|
|
73
75
|
usedScreenshot: boolean;
|
|
74
|
-
triggeredRequests: CapturedRequest[];
|
|
75
76
|
}>;
|
|
76
77
|
finalUrl: string;
|
|
77
78
|
reason: string;
|
|
@@ -84,7 +85,6 @@ export interface SessionConfig {
|
|
|
84
85
|
browserbase?: {
|
|
85
86
|
apiKey: string;
|
|
86
87
|
projectId: string;
|
|
87
|
-
contextId?: string;
|
|
88
88
|
};
|
|
89
89
|
proxy?: {
|
|
90
90
|
server: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,OAAO,GACP,MAAM,GACN,QAAQ,GACR,UAAU,GACV,UAAU,GACV,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|