zan-browser 1.3.38 → 2.0.1
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 -16
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +101 -208
- package/dist/ai.js.map +1 -1
- package/dist/blacklist.d.ts +2 -0
- package/dist/blacklist.d.ts.map +1 -0
- package/dist/blacklist.js +115 -0
- package/dist/blacklist.js.map +1 -0
- package/dist/browser-provider.d.ts +81 -0
- package/dist/browser-provider.d.ts.map +1 -0
- package/dist/browser-provider.js +6 -0
- package/dist/browser-provider.js.map +1 -0
- package/dist/browser.d.ts +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +57 -59
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/interceptor.d.ts +6 -3
- package/dist/interceptor.d.ts.map +1 -1
- package/dist/interceptor.js +61 -21
- package/dist/interceptor.js.map +1 -1
- package/dist/navigator.d.ts +40 -0
- package/dist/navigator.d.ts.map +1 -0
- package/dist/navigator.js +506 -0
- package/dist/navigator.js.map +1 -0
- package/dist/observer.d.ts +23 -3
- package/dist/observer.d.ts.map +1 -1
- package/dist/observer.js +310 -270
- package/dist/observer.js.map +1 -1
- package/dist/perception.d.ts +42 -0
- package/dist/perception.d.ts.map +1 -0
- package/dist/perception.js +140 -0
- package/dist/perception.js.map +1 -0
- package/dist/providers/browserbase.d.ts +12 -0
- package/dist/providers/browserbase.d.ts.map +1 -0
- package/dist/providers/browserbase.js +226 -0
- package/dist/providers/browserbase.js.map +1 -0
- package/dist/providers/puppeteer-local.d.ts +5 -0
- package/dist/providers/puppeteer-local.d.ts.map +1 -0
- package/dist/providers/puppeteer-local.js +218 -0
- package/dist/providers/puppeteer-local.js.map +1 -0
- package/dist/session.d.ts +17 -23
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +123 -407
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +1 -32
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-provider.d.ts","sourceRoot":"","sources":["../src/browser-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─── Browser provider abstraction ──────────────────────────────────────────────
|
|
3
|
+
// Unified interface over Puppeteer (local) and Playwright (Browserbase).
|
|
4
|
+
// Allows swapping the browser backend without changing any upstream code.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
//# sourceMappingURL=browser-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-provider.js","sourceRoot":"","sources":["../src/browser-provider.ts"],"names":[],"mappings":";AAAA,kFAAkF;AAClF,yEAAyE;AACzE,0EAA0E"}
|
package/dist/browser.d.ts
CHANGED
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,SAAS,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,EAAE,CAAW;gBAET,MAAM,EAAE,aAAa;IAO3B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA6CpC,OAAO,CAAC,eAAe;CAmBxB"}
|
package/dist/browser.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RensanBrowser = void 0;
|
|
4
|
-
const playwright_1 = require("playwright");
|
|
5
4
|
const session_1 = require("./session");
|
|
6
5
|
const ai_1 = require("./ai");
|
|
6
|
+
const puppeteer_local_1 = require("./providers/puppeteer-local");
|
|
7
|
+
const browserbase_1 = require("./providers/browserbase");
|
|
7
8
|
class RensanBrowser {
|
|
8
9
|
config;
|
|
9
10
|
ai;
|
|
@@ -11,72 +12,69 @@ class RensanBrowser {
|
|
|
11
12
|
this.config = config;
|
|
12
13
|
this.ai = new ai_1.AIClient(config.ai.apiKey, config.ai.model);
|
|
13
14
|
}
|
|
14
|
-
// Create a new browser session.
|
|
15
|
-
//
|
|
16
|
-
// and returns the viewerUrl so the frontend can watch in real time.
|
|
15
|
+
// Create a new browser session using the configured provider.
|
|
16
|
+
// Provider selection: puppeteer-local (default for dev) → browserbase (production)
|
|
17
17
|
async newSession() {
|
|
18
18
|
const { proxy, viewport, timeout } = this.config.session;
|
|
19
|
-
|
|
20
|
-
let
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
const providerType = this.resolveProvider();
|
|
20
|
+
let browserHandle;
|
|
21
|
+
if (providerType === "browserbase") {
|
|
22
|
+
if (!this.config.session.browserbase) {
|
|
23
|
+
throw new Error("BrowserConfig requires browserbase config when provider=browserbase");
|
|
24
|
+
}
|
|
25
|
+
const provider = new browserbase_1.BrowserbaseProvider(this.config.session.browserbase);
|
|
26
|
+
browserHandle = await provider.launch({
|
|
27
|
+
viewport: viewport ?? { width: 1280, height: 800 },
|
|
28
|
+
proxy,
|
|
29
|
+
timeout: timeout ?? 30_000,
|
|
30
|
+
});
|
|
25
31
|
}
|
|
26
|
-
else if (
|
|
27
|
-
|
|
32
|
+
else if (providerType === "puppeteer-local") {
|
|
33
|
+
const provider = new puppeteer_local_1.PuppeteerLocalProvider();
|
|
34
|
+
browserHandle = await provider.launch({
|
|
35
|
+
viewport: viewport ?? { width: 1280, height: 800 },
|
|
36
|
+
proxy,
|
|
37
|
+
timeout: timeout ?? 30_000,
|
|
38
|
+
headless: this.config.session.headless ?? true,
|
|
39
|
+
});
|
|
28
40
|
}
|
|
29
41
|
else {
|
|
30
|
-
|
|
42
|
+
// ws-endpoint: use Browserbase provider with custom wsEndpoint
|
|
43
|
+
// For backwards compat — wraps Playwright connectOverCDP
|
|
44
|
+
if (!this.config.session.wsEndpoint) {
|
|
45
|
+
throw new Error("BrowserConfig requires wsEndpoint when provider=ws-endpoint");
|
|
46
|
+
}
|
|
47
|
+
// Use Puppeteer local as fallback for ws-endpoint (connect via CDP)
|
|
48
|
+
const provider = new puppeteer_local_1.PuppeteerLocalProvider();
|
|
49
|
+
browserHandle = await provider.launch({
|
|
50
|
+
viewport: viewport ?? { width: 1280, height: 800 },
|
|
51
|
+
proxy,
|
|
52
|
+
timeout: timeout ?? 30_000,
|
|
53
|
+
});
|
|
31
54
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const browser = this.config.session.browserbase
|
|
35
|
-
? await playwright_1.chromium.connectOverCDP(wsEndpoint, { timeout: 30_000 })
|
|
36
|
-
: await playwright_1.chromium.connectOverCDP(wsEndpoint, { timeout: 30_000 });
|
|
37
|
-
const contextOptions = {
|
|
38
|
-
viewport: viewport ?? { width: 1280, height: 800 },
|
|
39
|
-
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
40
|
-
locale: "en-US",
|
|
41
|
-
timezoneId: "America/New_York",
|
|
42
|
-
};
|
|
43
|
-
if (proxy) {
|
|
44
|
-
contextOptions.proxy = {
|
|
45
|
-
server: proxy.server,
|
|
46
|
-
username: proxy.username,
|
|
47
|
-
password: proxy.password,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
const context = await browser.newContext(contextOptions);
|
|
51
|
-
const page = await context.newPage();
|
|
52
|
-
return new session_1.Session(page, browser, this.ai, timeout, viewerUrl);
|
|
55
|
+
const page = await browserHandle.newPage();
|
|
56
|
+
return new session_1.Session(page, browserHandle, this.ai, timeout, browserHandle.viewerUrl);
|
|
53
57
|
}
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
},
|
|
67
|
-
}),
|
|
68
|
-
signal: AbortSignal.timeout(15_000),
|
|
69
|
-
});
|
|
70
|
-
if (!response.ok) {
|
|
71
|
-
const body = await response.text();
|
|
72
|
-
throw new Error(`Browserbase session creation failed (${response.status}): ${body}`);
|
|
58
|
+
// Determine which provider to use based on config + env
|
|
59
|
+
resolveProvider() {
|
|
60
|
+
// Explicit env override
|
|
61
|
+
const envProvider = process.env.BROWSER_PROVIDER;
|
|
62
|
+
if (envProvider) {
|
|
63
|
+
const valid = ["puppeteer-local", "browserbase", "ws-endpoint"];
|
|
64
|
+
if (!valid.includes(envProvider)) {
|
|
65
|
+
console.warn(`[RensanBrowser] Invalid BROWSER_PROVIDER="${envProvider}", falling back to auto-detect`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
return envProvider;
|
|
69
|
+
}
|
|
73
70
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
71
|
+
// Auto-detect from config
|
|
72
|
+
if (this.config.session.browserbase)
|
|
73
|
+
return "browserbase";
|
|
74
|
+
if (this.config.session.wsEndpoint)
|
|
75
|
+
return "ws-endpoint";
|
|
76
|
+
// Default: local Puppeteer
|
|
77
|
+
return "puppeteer-local";
|
|
80
78
|
}
|
|
81
79
|
}
|
|
82
80
|
exports.RensanBrowser = RensanBrowser;
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";;;
|
|
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,10 @@
|
|
|
1
1
|
export { RensanBrowser } from "./browser";
|
|
2
2
|
export { Session } from "./session";
|
|
3
|
-
export
|
|
3
|
+
export { SmartNavigator } from "./navigator";
|
|
4
|
+
export type { ObservedElement, ObserveResult, CapturedRequest, SeedValue, AgentAction, ActResult, FindDataResult, SessionConfig, AIConfig, BrowserConfig, Screenshot, ElementType, } from "./types";
|
|
5
|
+
export type { PageHandle, BrowserHandle, BrowserProvider, ProviderType, } from "./browser-provider";
|
|
6
|
+
export type { NavigationConfig, NavigationResult, NavigationStrategy, } from "./navigator";
|
|
7
|
+
export type { Perception, StepContext, StepRecord, } from "./perception";
|
|
8
|
+
export type { DetectedForm, AutocompleteItem, } from "./observer";
|
|
9
|
+
export { isBlacklisted } from "./blacklist";
|
|
4
10
|
//# 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,SAAS,EACT,QAAQ,EACR,WAAW,
|
|
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,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,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;AACjB,YAAY,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Session = exports.RensanBrowser = void 0;
|
|
3
|
+
exports.isBlacklisted = exports.SmartNavigator = exports.Session = exports.RensanBrowser = void 0;
|
|
4
4
|
var browser_1 = require("./browser");
|
|
5
5
|
Object.defineProperty(exports, "RensanBrowser", { enumerable: true, get: function () { return browser_1.RensanBrowser; } });
|
|
6
6
|
var session_1 = require("./session");
|
|
7
7
|
Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return session_1.Session; } });
|
|
8
|
+
var navigator_1 = require("./navigator");
|
|
9
|
+
Object.defineProperty(exports, "SmartNavigator", { enumerable: true, get: function () { return navigator_1.SmartNavigator; } });
|
|
10
|
+
var blacklist_1 = require("./blacklist");
|
|
11
|
+
Object.defineProperty(exports, "isBlacklisted", { enumerable: true, get: function () { return blacklist_1.isBlacklisted; } });
|
|
8
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AAmCvB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA"}
|
package/dist/interceptor.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { EventEmitter } from "events";
|
|
2
|
-
import type {
|
|
2
|
+
import type { PageHandle } from "./browser-provider";
|
|
3
3
|
import type { CapturedRequest } from "./types";
|
|
4
4
|
export declare class Interceptor extends EventEmitter {
|
|
5
5
|
private captured;
|
|
6
6
|
private requestMap;
|
|
7
|
+
private requestCounter;
|
|
7
8
|
private active;
|
|
8
9
|
private page;
|
|
9
10
|
private lastActionTimestamp;
|
|
10
|
-
constructor(page:
|
|
11
|
+
constructor(page: PageHandle);
|
|
11
12
|
start(): void;
|
|
12
13
|
stop(): void;
|
|
13
14
|
getAll(): CapturedRequest[];
|
|
@@ -15,13 +16,15 @@ export declare class Interceptor extends EventEmitter {
|
|
|
15
16
|
clear(): void;
|
|
16
17
|
markActionTimestamp(): void;
|
|
17
18
|
getActionTriggered(): CapturedRequest[];
|
|
19
|
+
hasSeedValueInResponses(seedValues: string[]): boolean;
|
|
18
20
|
private onRequest;
|
|
21
|
+
private responseCounter;
|
|
19
22
|
private onResponse;
|
|
23
|
+
private failedCounter;
|
|
20
24
|
private onRequestFailed;
|
|
21
25
|
private scoreRequest;
|
|
22
26
|
private shouldIgnore;
|
|
23
27
|
private isAsset;
|
|
24
|
-
private isXHR;
|
|
25
28
|
private isUsefulContentType;
|
|
26
29
|
}
|
|
27
30
|
//# sourceMappingURL=interceptor.d.ts.map
|
|
@@ -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,
|
|
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,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAoD/C,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,IAAI,EAAE,UAAU;IAM5B,KAAK,IAAI,IAAI;IAUb,IAAI,IAAI,IAAI;IASZ,MAAM,IAAI,eAAe,EAAE;IAK3B,SAAS,CAAC,QAAQ,SAAI,GAAG,eAAe,EAAE;IAM1C,KAAK,IAAI,IAAI;IASb,mBAAmB,IAAI,IAAI;IAK3B,kBAAkB,IAAI,eAAe,EAAE;IAKvC,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO;IAgBtD,OAAO,CAAC,SAAS,CAsCf;IAEF,OAAO,CAAC,eAAe,CAAkC;IAEzD,OAAO,CAAC,UAAU,CAkDhB;IAEF,OAAO,CAAC,aAAa,CAAkC;IAEvD,OAAO,CAAC,eAAe,CAarB;IAIF,OAAO,CAAC,YAAY;IA8DpB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,mBAAmB;CAG5B"}
|
package/dist/interceptor.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Interceptor = void 0;
|
|
4
4
|
const events_1 = require("events");
|
|
5
|
+
const blacklist_1 = require("./blacklist");
|
|
5
6
|
const crypto_1 = require("crypto");
|
|
6
7
|
// Patterns that strongly indicate a real data API
|
|
7
8
|
const API_PATH_PATTERNS = [
|
|
@@ -47,7 +48,8 @@ const USEFUL_CONTENT_TYPES = [
|
|
|
47
48
|
const ACTION_CORRELATION_WINDOW_MS = 2000;
|
|
48
49
|
class Interceptor extends events_1.EventEmitter {
|
|
49
50
|
captured = new Map();
|
|
50
|
-
requestMap = new Map(); //
|
|
51
|
+
requestMap = new Map(); // req key → our id
|
|
52
|
+
requestCounter = new Map(); // url+method → counter (avoids collision)
|
|
51
53
|
active = false;
|
|
52
54
|
page;
|
|
53
55
|
lastActionTimestamp = 0;
|
|
@@ -60,6 +62,7 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
60
62
|
if (this.active)
|
|
61
63
|
return;
|
|
62
64
|
this.active = true;
|
|
65
|
+
// Works for both Puppeteer and Playwright — they both emit 'request' and 'response'
|
|
63
66
|
this.page.on("request", this.onRequest);
|
|
64
67
|
this.page.on("response", this.onResponse);
|
|
65
68
|
this.page.on("requestfailed", this.onRequestFailed);
|
|
@@ -82,6 +85,8 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
82
85
|
clear() {
|
|
83
86
|
this.captured.clear();
|
|
84
87
|
this.requestMap.clear();
|
|
88
|
+
this.requestCounter.clear();
|
|
89
|
+
this.responseCounter.clear();
|
|
85
90
|
}
|
|
86
91
|
// Call this immediately before executing any user action (click, fill, scroll)
|
|
87
92
|
// so subsequent requests can be correlated to that action
|
|
@@ -92,49 +97,81 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
92
97
|
getActionTriggered() {
|
|
93
98
|
return this.getAll().filter((r) => r.triggeredByAction === true);
|
|
94
99
|
}
|
|
100
|
+
// Check if any captured response body contains one of the seed values
|
|
101
|
+
hasSeedValueInResponses(seedValues) {
|
|
102
|
+
if (seedValues.length === 0)
|
|
103
|
+
return false;
|
|
104
|
+
const lowerSeeds = seedValues.map((s) => s.toLowerCase());
|
|
105
|
+
for (const r of this.captured.values()) {
|
|
106
|
+
if (!r.responseBody || r.responseBody.length < 50)
|
|
107
|
+
continue;
|
|
108
|
+
const body = r.responseBody.toLowerCase();
|
|
109
|
+
if (lowerSeeds.some((sv) => body.includes(sv)))
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
95
114
|
// ─── Private handlers ───────────────────────────────────────────────────────
|
|
115
|
+
// These handlers receive the raw Puppeteer/Playwright request/response objects.
|
|
116
|
+
// We access them through their common API surface.
|
|
96
117
|
onRequest = (request) => {
|
|
97
118
|
const url = request.url();
|
|
98
119
|
if (this.shouldIgnore(url))
|
|
99
120
|
return;
|
|
100
121
|
const id = (0, crypto_1.randomUUID)();
|
|
101
|
-
|
|
122
|
+
const method = request.method();
|
|
123
|
+
// Use counter to avoid collision when same url+method fires twice rapidly
|
|
124
|
+
const baseKey = url + method;
|
|
125
|
+
const count = (this.requestCounter.get(baseKey) ?? 0) + 1;
|
|
126
|
+
this.requestCounter.set(baseKey, count);
|
|
127
|
+
this.requestMap.set(baseKey + "#" + count, id);
|
|
102
128
|
const now = Date.now();
|
|
103
129
|
const triggeredByAction = this.lastActionTimestamp > 0 &&
|
|
104
130
|
now - this.lastActionTimestamp <= ACTION_CORRELATION_WINDOW_MS;
|
|
131
|
+
const resourceType = request.resourceType();
|
|
105
132
|
const entry = {
|
|
106
133
|
id,
|
|
107
134
|
timestamp: now,
|
|
108
|
-
method
|
|
135
|
+
method,
|
|
109
136
|
url,
|
|
110
137
|
requestHeaders: request.headers(),
|
|
111
|
-
requestBody: request.postData() ?? undefined,
|
|
112
|
-
isXHR:
|
|
138
|
+
requestBody: request.postData?.() ?? undefined,
|
|
139
|
+
isXHR: resourceType === "xhr" || resourceType === "fetch",
|
|
113
140
|
isAsset: this.isAsset(url),
|
|
114
141
|
score: 0, // scored when response arrives
|
|
115
142
|
triggeredByAction,
|
|
116
143
|
};
|
|
117
144
|
this.captured.set(id, entry);
|
|
145
|
+
// Puppeteer requires request.continue() when interception is enabled
|
|
146
|
+
if (typeof request.continue === "function") {
|
|
147
|
+
request.continue().catch(() => { });
|
|
148
|
+
}
|
|
118
149
|
};
|
|
150
|
+
responseCounter = new Map();
|
|
119
151
|
onResponse = async (response) => {
|
|
120
152
|
const url = response.url();
|
|
121
153
|
if (this.shouldIgnore(url))
|
|
122
154
|
return;
|
|
123
|
-
const
|
|
124
|
-
const
|
|
155
|
+
const method = response.request().method();
|
|
156
|
+
const baseKey = url + method;
|
|
157
|
+
// Match response to request using same counter sequence
|
|
158
|
+
const count = (this.responseCounter.get(baseKey) ?? 0) + 1;
|
|
159
|
+
this.responseCounter.set(baseKey, count);
|
|
160
|
+
const id = this.requestMap.get(baseKey + "#" + count);
|
|
125
161
|
if (!id)
|
|
126
162
|
return;
|
|
127
163
|
const entry = this.captured.get(id);
|
|
128
164
|
if (!entry)
|
|
129
165
|
return;
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
166
|
+
const headers = response.headers();
|
|
167
|
+
const contentType = headers["content-type"] ?? "";
|
|
168
|
+
const status = response.status();
|
|
169
|
+
// For XHR/fetch requests always try to read the body
|
|
133
170
|
let body;
|
|
134
171
|
if (entry.isXHR && !entry.isAsset) {
|
|
135
172
|
try {
|
|
136
173
|
body = await response.text();
|
|
137
|
-
// Discard if clearly
|
|
174
|
+
// Discard if clearly HTML
|
|
138
175
|
if (body && (body.trimStart().startsWith("<!DOCTYPE") || body.trimStart().startsWith("<html"))) {
|
|
139
176
|
body = undefined;
|
|
140
177
|
}
|
|
@@ -153,18 +190,23 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
153
190
|
}
|
|
154
191
|
const updated = {
|
|
155
192
|
...entry,
|
|
156
|
-
status
|
|
157
|
-
responseHeaders:
|
|
193
|
+
status,
|
|
194
|
+
responseHeaders: headers,
|
|
158
195
|
responseBody: body,
|
|
159
196
|
contentType,
|
|
160
|
-
score: this.scoreRequest(entry,
|
|
197
|
+
score: this.scoreRequest(entry, status, contentType, body),
|
|
161
198
|
};
|
|
162
199
|
this.captured.set(id, updated);
|
|
163
200
|
this.emit("request", updated); // real-time stream
|
|
164
201
|
};
|
|
202
|
+
failedCounter = new Map();
|
|
165
203
|
onRequestFailed = (request) => {
|
|
166
|
-
const
|
|
167
|
-
const
|
|
204
|
+
const url = request.url();
|
|
205
|
+
const method = request.method();
|
|
206
|
+
const baseKey = url + method;
|
|
207
|
+
const count = (this.failedCounter.get(baseKey) ?? 0) + 1;
|
|
208
|
+
this.failedCounter.set(baseKey, count);
|
|
209
|
+
const id = this.requestMap.get(baseKey + "#" + count);
|
|
168
210
|
if (!id)
|
|
169
211
|
return;
|
|
170
212
|
const entry = this.captured.get(id);
|
|
@@ -234,7 +276,9 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
234
276
|
}
|
|
235
277
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
236
278
|
shouldIgnore(url) {
|
|
237
|
-
|
|
279
|
+
if (url.startsWith("data:") || url.startsWith("blob:"))
|
|
280
|
+
return true;
|
|
281
|
+
return (0, blacklist_1.isBlacklisted)(url);
|
|
238
282
|
}
|
|
239
283
|
isAsset(url) {
|
|
240
284
|
try {
|
|
@@ -245,10 +289,6 @@ class Interceptor extends events_1.EventEmitter {
|
|
|
245
289
|
return false;
|
|
246
290
|
}
|
|
247
291
|
}
|
|
248
|
-
isXHR(request) {
|
|
249
|
-
const type = request.resourceType();
|
|
250
|
-
return type === "xhr" || type === "fetch";
|
|
251
|
-
}
|
|
252
292
|
isUsefulContentType(contentType) {
|
|
253
293
|
return USEFUL_CONTENT_TYPES.some((t) => contentType.includes(t));
|
|
254
294
|
}
|
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,wFAAwF;AACxF,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAE1C,MAAa,WAAY,SAAQ,qBAAY;IACnC,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IACnD,UAAU,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PageHandle } from "./browser-provider";
|
|
2
|
+
import type { CapturedRequest, SeedValue } from "./types";
|
|
3
|
+
import type { Observer } from "./observer";
|
|
4
|
+
import type { Interceptor } from "./interceptor";
|
|
5
|
+
import type { AIClient } from "./ai";
|
|
6
|
+
import { type StepRecord } from "./perception";
|
|
7
|
+
export type NavigationStrategy = "load-capture" | "search" | "multi-step" | "auto";
|
|
8
|
+
export interface NavigationConfig {
|
|
9
|
+
url: string;
|
|
10
|
+
navigationGoal: string;
|
|
11
|
+
seedValues: SeedValue[];
|
|
12
|
+
strategy: NavigationStrategy;
|
|
13
|
+
hypothesis?: string;
|
|
14
|
+
maxSteps: number;
|
|
15
|
+
onProgress?: (msg: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface NavigationResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
requests: CapturedRequest[];
|
|
20
|
+
steps: StepRecord[];
|
|
21
|
+
finalUrl: string;
|
|
22
|
+
reason: string;
|
|
23
|
+
earlyTerminated: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare class SmartNavigator {
|
|
26
|
+
private page;
|
|
27
|
+
private observer;
|
|
28
|
+
private interceptor;
|
|
29
|
+
private ai;
|
|
30
|
+
constructor(page: PageHandle, observer: Observer, interceptor: Interceptor, ai: AIClient);
|
|
31
|
+
navigate(config: NavigationConfig): Promise<NavigationResult>;
|
|
32
|
+
private strategyLoadAndCapture;
|
|
33
|
+
private strategySearchInteraction;
|
|
34
|
+
private strategyMultiStep;
|
|
35
|
+
private executeAction;
|
|
36
|
+
private tryClickAutocomplete;
|
|
37
|
+
private waitForNetworkSettle;
|
|
38
|
+
private inferStrategy;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=navigator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../src/navigator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAe,MAAM,SAAS,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAItB,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B;AAyBD,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,EAAE,CAAW;gBAGnB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,QAAQ;IAUR,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAuBrD,sBAAsB;YAyCtB,yBAAyB;YAmNzB,iBAAiB;YAgIjB,aAAa;YAiEb,oBAAoB;YAkBpB,oBAAoB;IAuBlC,OAAO,CAAC,aAAa;CAetB"}
|