b4n1-web 0.6.2 → 0.9.0
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/bin/b4n1web +0 -0
- package/bin/b4n1web-linux +0 -0
- package/dist/browser.d.ts +23 -54
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +210 -65
- package/dist/browser.js.map +1 -1
- package/dist/errors.d.ts +3 -12
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +11 -13
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +3 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/security.d.ts +46 -46
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +128 -94
- package/dist/security.js.map +1 -1
- package/dist/types.d.ts +6 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/bin/b4n1web
ADDED
|
Binary file
|
package/bin/b4n1web-linux
CHANGED
|
Binary file
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,78 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
* B4n1Web Browser - JavaScript/TypeScript Implementation
|
|
3
|
-
*/
|
|
4
|
-
import { type BrowserOptions, type PageData } from './types';
|
|
5
|
-
/**
|
|
6
|
-
* Find the b4n1web binary in bundled location or system install
|
|
7
|
-
*/
|
|
1
|
+
import { BrowserMode, type BrowserOptions, type PageData, type IframeInfo } from './types';
|
|
8
2
|
export declare function getB4n1webBinary(): string | null;
|
|
9
|
-
/**
|
|
10
|
-
* Get B4n1Web binary version
|
|
11
|
-
*/
|
|
12
3
|
export declare function getB4n1webVersion(): string | null;
|
|
13
|
-
/**
|
|
14
|
-
* Check version compatibility and warn if mismatch
|
|
15
|
-
*/
|
|
16
4
|
export declare function checkVersionCompatibility(): string | null;
|
|
17
|
-
/**
|
|
18
|
-
* Page data returned by B4n1Web
|
|
19
|
-
*/
|
|
20
5
|
export declare class Page implements PageData {
|
|
21
6
|
url: string;
|
|
22
7
|
markdown: string;
|
|
23
8
|
links: string[];
|
|
24
9
|
screenshot?: string;
|
|
10
|
+
jsOutput?: string;
|
|
25
11
|
constructor(data: PageData);
|
|
26
|
-
/**
|
|
27
|
-
* Extract main content from markdown, skipping headers
|
|
28
|
-
*/
|
|
29
12
|
getMainContent(): string;
|
|
30
|
-
/**
|
|
31
|
-
* Find links containing specific text
|
|
32
|
-
*/
|
|
33
13
|
findLinksByText(text: string): string[];
|
|
34
14
|
}
|
|
35
|
-
/**
|
|
36
|
-
* B4n1Web Agent Browser
|
|
37
|
-
*
|
|
38
|
-
* A browser instance optimized for AI agent workflows.
|
|
39
|
-
* Requires B4n1Web binary to be installed.
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```typescript
|
|
43
|
-
* import { AgentBrowser, BrowserMode } from 'b4n1-web';
|
|
44
|
-
*
|
|
45
|
-
* const browser = new AgentBrowser({ mode: BrowserMode.LIGHT });
|
|
46
|
-
* const page = await browser.goto('https://example.com');
|
|
47
|
-
* console.log(page.markdown);
|
|
48
|
-
* browser.close();
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
15
|
export declare class AgentBrowser {
|
|
52
16
|
private mode;
|
|
53
17
|
private timeout;
|
|
54
18
|
private userAgent;
|
|
55
19
|
private binaryPath;
|
|
20
|
+
private currentUrl;
|
|
21
|
+
private sessionId;
|
|
22
|
+
private sessionStarted;
|
|
23
|
+
private viewportWidth;
|
|
24
|
+
private viewportHeight;
|
|
25
|
+
private emulatedDevice;
|
|
56
26
|
constructor(options?: BrowserOptions);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
goto(url: string): Promise<Page>;
|
|
61
|
-
/**
|
|
62
|
-
* Parse text output from the binary
|
|
63
|
-
*/
|
|
27
|
+
private escapeArg;
|
|
28
|
+
private runSessionCommand;
|
|
29
|
+
private ensureSession;
|
|
30
|
+
goto(url: string, waitFor?: string): Promise<Page>;
|
|
64
31
|
private parseOutput;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
32
|
+
click(selector: string): Promise<void>;
|
|
33
|
+
typeText(selector: string, text: string, clearFirst?: boolean): Promise<void>;
|
|
34
|
+
waitForSelector(selector: string, timeoutMs?: number): Promise<boolean>;
|
|
35
|
+
screenshot(url?: string): Promise<string>;
|
|
36
|
+
frames(): Promise<IframeInfo[]>;
|
|
37
|
+
iframeText(index: number): Promise<string>;
|
|
38
|
+
setViewport(width: number, height: number): Promise<void>;
|
|
39
|
+
emulateDevice(device: string): Promise<void>;
|
|
40
|
+
getLinks(): string[];
|
|
41
|
+
static getLinksFromPage(url: string, mode?: BrowserMode): Promise<string[]>;
|
|
42
|
+
static findBinary(): string | null;
|
|
68
43
|
close(): void;
|
|
69
|
-
/**
|
|
70
|
-
* Use as async context manager
|
|
71
|
-
*/
|
|
72
44
|
[Symbol.asyncDispose](): Promise<void>;
|
|
73
45
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Create a browser and navigate in one go
|
|
76
|
-
*/
|
|
77
46
|
export declare function createBrowserAndGoto(url: string, options?: BrowserOptions): Promise<Page>;
|
|
78
47
|
//# sourceMappingURL=browser.d.ts.map
|
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":"AAGA,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAuB,MAAM,SAAS,CAAC;AAEhH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAyChD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAejD;AAID,wBAAgB,yBAAyB,IAAI,MAAM,GAAG,IAAI,CAczD;AAED,qBAAa,IAAK,YAAW,QAAQ;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAEN,IAAI,EAAE,QAAQ;IAQ1B,cAAc,IAAI,MAAM;IAMxB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;CAIxC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,GAAE,cAAmB;IAuBxC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,aAAa;IAaf,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxD,OAAO,CAAC,WAAW;IAyCb,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAetC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpF,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB9E,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBzC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAa/B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAezD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD,QAAQ,IAAI,MAAM,EAAE;WAmBP,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAA+B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUpG,MAAM,CAAC,UAAU,IAAI,MAAM,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAUP,CAAC,MAAM,CAAC,YAAY,CAAC;CAG5B;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
package/dist/browser.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* B4n1Web Browser - JavaScript/TypeScript Implementation
|
|
4
|
-
*/
|
|
5
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
3
|
if (k2 === undefined) k2 = k;
|
|
7
4
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -45,13 +42,9 @@ const child_process_1 = require("child_process");
|
|
|
45
42
|
const fs = __importStar(require("fs"));
|
|
46
43
|
const path = __importStar(require("path"));
|
|
47
44
|
const types_1 = require("./types");
|
|
48
|
-
/**
|
|
49
|
-
* Find the b4n1web binary in bundled location or system install
|
|
50
|
-
*/
|
|
51
45
|
function getB4n1webBinary() {
|
|
52
46
|
const home = process.env.HOME || process.env.USERPROFILE || '/home/' + process.env.USER;
|
|
53
47
|
const paths = [];
|
|
54
|
-
// 1. Check bundled binary (bundled with npm package)
|
|
55
48
|
const bundledBinary = path.join(__dirname, '..', 'bin', 'b4n1web-linux');
|
|
56
49
|
if (fs.existsSync(bundledBinary)) {
|
|
57
50
|
try {
|
|
@@ -59,12 +52,12 @@ function getB4n1webBinary() {
|
|
|
59
52
|
return bundledBinary;
|
|
60
53
|
}
|
|
61
54
|
catch {
|
|
62
|
-
// Not executable, continue searching
|
|
63
55
|
}
|
|
64
56
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
const envBinary = process.env.B4N1WEB_BINARY;
|
|
58
|
+
if (envBinary)
|
|
59
|
+
paths.push(envBinary);
|
|
60
|
+
paths.push(home + '/.local/bin/b4n1web', home + '/.b4n1web/bin/b4n1web', '/usr/local/bin/b4n1web', '/usr/bin/b4n1web');
|
|
68
61
|
const pathEnv = process.env.PATH || '';
|
|
69
62
|
const pathDirs = pathEnv.split(':').filter(p => p);
|
|
70
63
|
for (const dir of pathDirs) {
|
|
@@ -80,14 +73,10 @@ function getB4n1webBinary() {
|
|
|
80
73
|
}
|
|
81
74
|
}
|
|
82
75
|
catch {
|
|
83
|
-
// Path doesn't exist or not executable
|
|
84
76
|
}
|
|
85
77
|
}
|
|
86
78
|
return null;
|
|
87
79
|
}
|
|
88
|
-
/**
|
|
89
|
-
* Get B4n1Web binary version
|
|
90
|
-
*/
|
|
91
80
|
function getB4n1webVersion() {
|
|
92
81
|
const binaryPath = getB4n1webBinary();
|
|
93
82
|
if (!binaryPath) {
|
|
@@ -105,70 +94,59 @@ function getB4n1webVersion() {
|
|
|
105
94
|
return null;
|
|
106
95
|
}
|
|
107
96
|
}
|
|
108
|
-
const SDK_VERSION = '0.
|
|
109
|
-
/**
|
|
110
|
-
* Check version compatibility and warn if mismatch
|
|
111
|
-
*/
|
|
97
|
+
const SDK_VERSION = '0.8.0';
|
|
112
98
|
function checkVersionCompatibility() {
|
|
113
99
|
const binaryVersion = getB4n1webVersion();
|
|
114
100
|
if (!binaryVersion) {
|
|
115
101
|
return null;
|
|
116
102
|
}
|
|
117
103
|
if (binaryVersion !== SDK_VERSION) {
|
|
118
|
-
console.warn(
|
|
104
|
+
console.warn(`Warning: Version mismatch: SDK v${SDK_VERSION} requires binary v${SDK_VERSION}, ` +
|
|
119
105
|
`but found v${binaryVersion}. Some features may not work correctly. ` +
|
|
120
106
|
`To update: curl -sL https://web.b4n1.com/install | bash`);
|
|
121
107
|
}
|
|
122
108
|
return binaryVersion;
|
|
123
109
|
}
|
|
124
|
-
/**
|
|
125
|
-
* Page data returned by B4n1Web
|
|
126
|
-
*/
|
|
127
110
|
class Page {
|
|
111
|
+
url;
|
|
112
|
+
markdown;
|
|
113
|
+
links;
|
|
114
|
+
screenshot;
|
|
115
|
+
jsOutput;
|
|
128
116
|
constructor(data) {
|
|
129
117
|
this.url = data.url;
|
|
130
118
|
this.markdown = data.markdown;
|
|
131
119
|
this.links = data.links;
|
|
132
120
|
this.screenshot = data.screenshot;
|
|
121
|
+
this.jsOutput = data.jsOutput;
|
|
133
122
|
}
|
|
134
|
-
/**
|
|
135
|
-
* Extract main content from markdown, skipping headers
|
|
136
|
-
*/
|
|
137
123
|
getMainContent() {
|
|
138
124
|
const lines = this.markdown.split('\n');
|
|
139
125
|
const contentLines = lines.length > 2 ? lines.slice(2) : lines;
|
|
140
126
|
return contentLines.join('\n').trim();
|
|
141
127
|
}
|
|
142
|
-
/**
|
|
143
|
-
* Find links containing specific text
|
|
144
|
-
*/
|
|
145
128
|
findLinksByText(text) {
|
|
146
129
|
const lowerText = text.toLowerCase();
|
|
147
130
|
return this.links.filter(link => link.toLowerCase().includes(lowerText));
|
|
148
131
|
}
|
|
149
132
|
}
|
|
150
133
|
exports.Page = Page;
|
|
151
|
-
/**
|
|
152
|
-
* B4n1Web Agent Browser
|
|
153
|
-
*
|
|
154
|
-
* A browser instance optimized for AI agent workflows.
|
|
155
|
-
* Requires B4n1Web binary to be installed.
|
|
156
|
-
*
|
|
157
|
-
* @example
|
|
158
|
-
* ```typescript
|
|
159
|
-
* import { AgentBrowser, BrowserMode } from 'b4n1-web';
|
|
160
|
-
*
|
|
161
|
-
* const browser = new AgentBrowser({ mode: BrowserMode.LIGHT });
|
|
162
|
-
* const page = await browser.goto('https://example.com');
|
|
163
|
-
* console.log(page.markdown);
|
|
164
|
-
* browser.close();
|
|
165
|
-
* ```
|
|
166
|
-
*/
|
|
167
134
|
class AgentBrowser {
|
|
135
|
+
mode;
|
|
136
|
+
timeout;
|
|
137
|
+
userAgent;
|
|
138
|
+
binaryPath;
|
|
139
|
+
currentUrl = null;
|
|
140
|
+
sessionId;
|
|
141
|
+
sessionStarted = false;
|
|
142
|
+
viewportWidth = 1280;
|
|
143
|
+
viewportHeight = 720;
|
|
144
|
+
emulatedDevice = null;
|
|
168
145
|
constructor(options = {}) {
|
|
169
146
|
this.mode = options.mode ?? types_1.BrowserMode.LIGHT;
|
|
170
147
|
this.timeout = options.timeout ?? 30;
|
|
171
148
|
this.userAgent = options.userAgent ?? 'B4n1Web-Agent/1.0';
|
|
149
|
+
this.sessionId = `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
172
150
|
const binary = getB4n1webBinary();
|
|
173
151
|
if (!binary) {
|
|
174
152
|
const home = process.env.HOME || '';
|
|
@@ -183,13 +161,38 @@ class AgentBrowser {
|
|
|
183
161
|
}
|
|
184
162
|
this.binaryPath = binary;
|
|
185
163
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
164
|
+
escapeArg(arg) {
|
|
165
|
+
return JSON.stringify(arg);
|
|
166
|
+
}
|
|
167
|
+
runSessionCommand(subcommand, ...args) {
|
|
168
|
+
try {
|
|
169
|
+
return (0, child_process_1.execSync)(`${this.binaryPath} session ${subcommand} ${this.sessionId} ${args.join(' ')}`, { timeout: this.timeout * 1000 }).toString().trim();
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error.message?.includes('timed out')) {
|
|
173
|
+
throw new Error(`Session command timed out after ${this.timeout}s`);
|
|
174
|
+
}
|
|
175
|
+
throw new Error(`Session command "${subcommand}" failed: ${error.message}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
ensureSession(url) {
|
|
179
|
+
if (!this.sessionStarted) {
|
|
180
|
+
(0, child_process_1.execSync)(`${this.binaryPath} session start ${this.sessionId}`, { timeout: 10000 });
|
|
181
|
+
this.sessionStarted = true;
|
|
182
|
+
}
|
|
183
|
+
if (url) {
|
|
184
|
+
(0, child_process_1.execSync)(`${this.binaryPath} session goto ${this.sessionId} ${this.escapeArg(url)}`, { timeout: this.timeout * 1000 });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async goto(url, waitFor) {
|
|
188
|
+
this.currentUrl = url;
|
|
190
189
|
return new Promise((resolve, reject) => {
|
|
191
190
|
try {
|
|
192
|
-
|
|
191
|
+
let cmd = `${this.binaryPath} goto ${url} --mode ${this.mode}`;
|
|
192
|
+
if (waitFor) {
|
|
193
|
+
cmd += ` --wait-for ${JSON.stringify(waitFor)}`;
|
|
194
|
+
}
|
|
195
|
+
const output = (0, child_process_1.execSync)(cmd, { timeout: this.timeout * 1000 }).toString();
|
|
193
196
|
const page = this.parseOutput(url, output);
|
|
194
197
|
resolve(page);
|
|
195
198
|
}
|
|
@@ -203,13 +206,11 @@ class AgentBrowser {
|
|
|
203
206
|
}
|
|
204
207
|
});
|
|
205
208
|
}
|
|
206
|
-
/**
|
|
207
|
-
* Parse text output from the binary
|
|
208
|
-
*/
|
|
209
209
|
parseOutput(url, output) {
|
|
210
210
|
let markdown = '';
|
|
211
211
|
let links = [];
|
|
212
212
|
let screenshot;
|
|
213
|
+
let jsOutput;
|
|
213
214
|
for (const line of output.split('\n')) {
|
|
214
215
|
if (line.startsWith('URL:')) {
|
|
215
216
|
continue;
|
|
@@ -219,14 +220,23 @@ class AgentBrowser {
|
|
|
219
220
|
}
|
|
220
221
|
else if (line.startsWith('Links:')) {
|
|
221
222
|
try {
|
|
222
|
-
links =
|
|
223
|
+
links = JSON.parse(line.slice(6).trim());
|
|
223
224
|
}
|
|
224
225
|
catch {
|
|
225
226
|
links = [];
|
|
226
227
|
}
|
|
227
228
|
}
|
|
228
229
|
else if (line.startsWith('Screenshot:')) {
|
|
229
|
-
screenshot = line.slice(
|
|
230
|
+
screenshot = line.slice(11).trim();
|
|
231
|
+
if (screenshot === '') {
|
|
232
|
+
screenshot = undefined;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else if (line.startsWith('js_output:')) {
|
|
236
|
+
jsOutput = line.slice(10).trim();
|
|
237
|
+
if (jsOutput === '') {
|
|
238
|
+
jsOutput = undefined;
|
|
239
|
+
}
|
|
230
240
|
}
|
|
231
241
|
else {
|
|
232
242
|
markdown += line + '\n';
|
|
@@ -237,25 +247,160 @@ class AgentBrowser {
|
|
|
237
247
|
markdown: markdown.trim(),
|
|
238
248
|
links,
|
|
239
249
|
screenshot,
|
|
250
|
+
jsOutput,
|
|
240
251
|
});
|
|
241
252
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
253
|
+
async click(selector) {
|
|
254
|
+
if (!this.currentUrl) {
|
|
255
|
+
throw new Error('No page loaded. Call goto() first.');
|
|
256
|
+
}
|
|
257
|
+
this.ensureSession(this.currentUrl);
|
|
258
|
+
try {
|
|
259
|
+
(0, child_process_1.execSync)(`${this.binaryPath} session click ${this.sessionId} ${this.escapeArg(selector)}`, { timeout: this.timeout * 1000 });
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
throw new Error(`Click failed on "${selector}": ${error.message}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async typeText(selector, text, clearFirst = false) {
|
|
266
|
+
if (!this.currentUrl) {
|
|
267
|
+
throw new Error('No page loaded. Call goto() first.');
|
|
268
|
+
}
|
|
269
|
+
this.ensureSession(this.currentUrl);
|
|
270
|
+
try {
|
|
271
|
+
let cmd = `${this.binaryPath} session type ${this.sessionId} ${this.escapeArg(selector)} ${this.escapeArg(text)}`;
|
|
272
|
+
if (clearFirst) {
|
|
273
|
+
cmd += ' --clear-first';
|
|
274
|
+
}
|
|
275
|
+
(0, child_process_1.execSync)(cmd, { timeout: this.timeout * 1000 });
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
throw new Error(`Type text failed on "${selector}": ${error.message}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
async waitForSelector(selector, timeoutMs = 10000) {
|
|
282
|
+
if (!this.currentUrl) {
|
|
283
|
+
throw new Error('No page loaded. Call goto() first.');
|
|
284
|
+
}
|
|
285
|
+
this.ensureSession(this.currentUrl);
|
|
286
|
+
try {
|
|
287
|
+
const output = (0, child_process_1.execSync)(`${this.binaryPath} session wait ${this.sessionId} ${this.escapeArg(selector)} --timeout-ms ${timeoutMs}`, { timeout: Math.ceil(timeoutMs / 1000) + 5 }).toString().trim();
|
|
288
|
+
return output === 'true';
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async screenshot(url) {
|
|
295
|
+
const targetUrl = url || this.currentUrl;
|
|
296
|
+
if (!targetUrl) {
|
|
297
|
+
throw new Error('No URL provided. Pass a URL or call goto() first.');
|
|
298
|
+
}
|
|
299
|
+
this.ensureSession(targetUrl);
|
|
300
|
+
try {
|
|
301
|
+
const output = (0, child_process_1.execSync)(`${this.binaryPath} session screenshot ${this.sessionId} ${this.escapeArg(targetUrl)}`, { timeout: this.timeout * 1000 }).toString().trim();
|
|
302
|
+
return output;
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
if (error.message?.includes('timed out')) {
|
|
306
|
+
throw new Error(`Screenshot timed out after ${this.timeout}s`);
|
|
307
|
+
}
|
|
308
|
+
throw new Error(`Screenshot failed: ${error.message}`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async frames() {
|
|
312
|
+
if (!this.currentUrl) {
|
|
313
|
+
throw new Error('No page loaded. Call goto() first.');
|
|
314
|
+
}
|
|
315
|
+
this.ensureSession(this.currentUrl);
|
|
316
|
+
try {
|
|
317
|
+
const output = this.runSessionCommand('frames');
|
|
318
|
+
return JSON.parse(output);
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
throw new Error(`Failed to list frames: ${error.message}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
async iframeText(index) {
|
|
325
|
+
if (!this.currentUrl) {
|
|
326
|
+
throw new Error('No page loaded. Call goto() first.');
|
|
327
|
+
}
|
|
328
|
+
this.ensureSession(this.currentUrl);
|
|
329
|
+
try {
|
|
330
|
+
return this.runSessionCommand('iframe-text', String(index));
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
throw new Error(`Failed to get iframe text at index ${index}: ${error.message}`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async setViewport(width, height) {
|
|
337
|
+
this.viewportWidth = width;
|
|
338
|
+
this.viewportHeight = height;
|
|
339
|
+
if (this.sessionStarted && this.currentUrl) {
|
|
340
|
+
try {
|
|
341
|
+
(0, child_process_1.execSync)(`${this.binaryPath} session goto ${this.sessionId} ${this.escapeArg(this.currentUrl)} --viewport-width ${width} --viewport-height ${height}`, { timeout: this.timeout * 1000 });
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
throw new Error(`setViewport failed: ${error.message}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
async emulateDevice(device) {
|
|
349
|
+
this.emulatedDevice = device;
|
|
350
|
+
if (this.sessionStarted && this.currentUrl) {
|
|
351
|
+
try {
|
|
352
|
+
(0, child_process_1.execSync)(`${this.binaryPath} session goto ${this.sessionId} ${this.escapeArg(this.currentUrl)} --emulate ${this.escapeArg(device)}`, { timeout: this.timeout * 1000 });
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
throw new Error(`emulateDevice failed: ${error.message}`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
getLinks() {
|
|
360
|
+
if (!this.currentUrl) {
|
|
361
|
+
throw new Error('No page loaded. Call goto() first.');
|
|
362
|
+
}
|
|
363
|
+
try {
|
|
364
|
+
const output = (0, child_process_1.execSync)(`${this.binaryPath} get-links --url ${this.currentUrl} --mode ${this.mode}`, { timeout: this.timeout * 1000 }).toString().trim();
|
|
365
|
+
try {
|
|
366
|
+
return JSON.parse(output);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
return [];
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return [];
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
static async getLinksFromPage(url, mode = types_1.BrowserMode.LIGHT) {
|
|
377
|
+
const browser = new AgentBrowser({ mode });
|
|
378
|
+
try {
|
|
379
|
+
const page = await browser.goto(url);
|
|
380
|
+
return page.links;
|
|
381
|
+
}
|
|
382
|
+
finally {
|
|
383
|
+
browser.close();
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
static findBinary() {
|
|
387
|
+
return getB4n1webBinary();
|
|
388
|
+
}
|
|
245
389
|
close() {
|
|
246
|
-
|
|
390
|
+
if (this.sessionStarted) {
|
|
391
|
+
try {
|
|
392
|
+
(0, child_process_1.execSync)(`${this.binaryPath} session close ${this.sessionId}`, { timeout: 5000 });
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
}
|
|
396
|
+
this.sessionStarted = false;
|
|
397
|
+
}
|
|
247
398
|
}
|
|
248
|
-
/**
|
|
249
|
-
* Use as async context manager
|
|
250
|
-
*/
|
|
251
399
|
async [Symbol.asyncDispose]() {
|
|
252
400
|
this.close();
|
|
253
401
|
}
|
|
254
402
|
}
|
|
255
403
|
exports.AgentBrowser = AgentBrowser;
|
|
256
|
-
/**
|
|
257
|
-
* Create a browser and navigate in one go
|
|
258
|
-
*/
|
|
259
404
|
async function createBrowserAndGoto(url, options = {}) {
|
|
260
405
|
const browser = new AgentBrowser(options);
|
|
261
406
|
try {
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* B4n1Web Errors
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Error thrown when B4n1Web binary is not found
|
|
6
|
-
*/
|
|
7
1
|
export declare class BinaryNotFoundError extends Error {
|
|
8
2
|
constructor(message?: string);
|
|
9
3
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Error thrown when navigation fails
|
|
12
|
-
*/
|
|
13
4
|
export declare class NavigationError extends Error {
|
|
14
5
|
readonly url: string;
|
|
15
6
|
constructor(message: string, url: string);
|
|
16
7
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Error thrown when binary execution fails
|
|
19
|
-
*/
|
|
20
8
|
export declare class BinaryError extends Error {
|
|
21
9
|
readonly stderr: string;
|
|
22
10
|
constructor(message: string, stderr: string);
|
|
23
11
|
}
|
|
12
|
+
export declare class SelectorTimeoutError extends Error {
|
|
13
|
+
constructor(selector: string, timeoutMs: number);
|
|
14
|
+
}
|
|
24
15
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAuG;CAK3H;AAED,qBAAa,eAAgB,SAAQ,KAAK;aACK,GAAG,EAAE,MAAM;gBAA5C,OAAO,EAAE,MAAM,EAAkB,GAAG,EAAE,MAAM;CAKzD;AAED,qBAAa,WAAY,SAAQ,KAAK;aACS,MAAM,EAAE,MAAM;gBAA/C,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM;CAK5D;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAKhD"}
|
package/dist/errors.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* B4n1Web Errors
|
|
4
|
-
*/
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.BinaryError = exports.NavigationError = exports.BinaryNotFoundError = void 0;
|
|
7
|
-
/**
|
|
8
|
-
* Error thrown when B4n1Web binary is not found
|
|
9
|
-
*/
|
|
3
|
+
exports.SelectorTimeoutError = exports.BinaryError = exports.NavigationError = exports.BinaryNotFoundError = void 0;
|
|
10
4
|
class BinaryNotFoundError extends Error {
|
|
11
5
|
constructor(message = 'B4n1Web binary not found. Please install it first:\n curl -sL https://web.b4n1.com/install | bash') {
|
|
12
6
|
super(message);
|
|
@@ -15,10 +9,8 @@ class BinaryNotFoundError extends Error {
|
|
|
15
9
|
}
|
|
16
10
|
}
|
|
17
11
|
exports.BinaryNotFoundError = BinaryNotFoundError;
|
|
18
|
-
/**
|
|
19
|
-
* Error thrown when navigation fails
|
|
20
|
-
*/
|
|
21
12
|
class NavigationError extends Error {
|
|
13
|
+
url;
|
|
22
14
|
constructor(message, url) {
|
|
23
15
|
super(message);
|
|
24
16
|
this.url = url;
|
|
@@ -27,10 +19,8 @@ class NavigationError extends Error {
|
|
|
27
19
|
}
|
|
28
20
|
}
|
|
29
21
|
exports.NavigationError = NavigationError;
|
|
30
|
-
/**
|
|
31
|
-
* Error thrown when binary execution fails
|
|
32
|
-
*/
|
|
33
22
|
class BinaryError extends Error {
|
|
23
|
+
stderr;
|
|
34
24
|
constructor(message, stderr) {
|
|
35
25
|
super(message);
|
|
36
26
|
this.stderr = stderr;
|
|
@@ -39,4 +29,12 @@ class BinaryError extends Error {
|
|
|
39
29
|
}
|
|
40
30
|
}
|
|
41
31
|
exports.BinaryError = BinaryError;
|
|
32
|
+
class SelectorTimeoutError extends Error {
|
|
33
|
+
constructor(selector, timeoutMs) {
|
|
34
|
+
super(`Selector "${selector}" not found within ${timeoutMs}ms`);
|
|
35
|
+
this.name = 'SelectorTimeoutError';
|
|
36
|
+
Error.captureStackTrace(this, SelectorTimeoutError);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.SelectorTimeoutError = SelectorTimeoutError;
|
|
42
40
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,oGAAoG;QACxH,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACrD,CAAC;CACF;AAND,kDAMC;AAED,MAAa,eAAgB,SAAQ,KAAK;IACK;IAA7C,YAAY,OAAe,EAAkB,GAAW;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,QAAG,GAAH,GAAG,CAAQ;QAEtD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACjD,CAAC;CACF;AAND,0CAMC;AAED,MAAa,WAAY,SAAQ,KAAK;IACS;IAA7C,YAAY,OAAe,EAAkB,MAAc;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,WAAM,GAAN,MAAM,CAAQ;QAEzD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;CACF;AAND,kCAMC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,QAAgB,EAAE,SAAiB;QAC7C,KAAK,CAAC,aAAa,QAAQ,sBAAsB,SAAS,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACtD,CAAC;CACF;AAND,oDAMC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
* B4n1Web SDK for JavaScript/TypeScript
|
|
3
|
-
* Zero-overhead, high-speed web execution for sovereign AI agents.
|
|
4
|
-
*
|
|
5
|
-
* @module b4n1web
|
|
6
|
-
*/
|
|
7
|
-
export { AgentBrowser, Page, getB4n1webBinary, getB4n1webVersion, checkVersionCompatibility } from './browser';
|
|
1
|
+
export { AgentBrowser, Page, getB4n1webBinary, getB4n1webVersion, checkVersionCompatibility, createBrowserAndGoto } from './browser';
|
|
8
2
|
export { BrowserMode } from './types';
|
|
9
|
-
export { BinaryNotFoundError } from './errors';
|
|
3
|
+
export { BinaryNotFoundError, NavigationError, BinaryError, SelectorTimeoutError } from './errors';
|
|
4
|
+
export { SecurityShield } from './security';
|
|
10
5
|
//# 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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACrI,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* B4n1Web SDK for JavaScript/TypeScript
|
|
4
|
-
* Zero-overhead, high-speed web execution for sovereign AI agents.
|
|
5
|
-
*
|
|
6
|
-
* @module b4n1web
|
|
7
|
-
*/
|
|
8
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.BinaryNotFoundError = exports.BrowserMode = exports.checkVersionCompatibility = exports.getB4n1webVersion = exports.getB4n1webBinary = exports.Page = exports.AgentBrowser = void 0;
|
|
3
|
+
exports.SecurityShield = exports.SelectorTimeoutError = exports.BinaryError = exports.NavigationError = exports.BinaryNotFoundError = exports.BrowserMode = exports.createBrowserAndGoto = exports.checkVersionCompatibility = exports.getB4n1webVersion = exports.getB4n1webBinary = exports.Page = exports.AgentBrowser = void 0;
|
|
10
4
|
var browser_1 = require("./browser");
|
|
11
5
|
Object.defineProperty(exports, "AgentBrowser", { enumerable: true, get: function () { return browser_1.AgentBrowser; } });
|
|
12
6
|
Object.defineProperty(exports, "Page", { enumerable: true, get: function () { return browser_1.Page; } });
|
|
13
7
|
Object.defineProperty(exports, "getB4n1webBinary", { enumerable: true, get: function () { return browser_1.getB4n1webBinary; } });
|
|
14
8
|
Object.defineProperty(exports, "getB4n1webVersion", { enumerable: true, get: function () { return browser_1.getB4n1webVersion; } });
|
|
15
9
|
Object.defineProperty(exports, "checkVersionCompatibility", { enumerable: true, get: function () { return browser_1.checkVersionCompatibility; } });
|
|
10
|
+
Object.defineProperty(exports, "createBrowserAndGoto", { enumerable: true, get: function () { return browser_1.createBrowserAndGoto; } });
|
|
16
11
|
var types_1 = require("./types");
|
|
17
12
|
Object.defineProperty(exports, "BrowserMode", { enumerable: true, get: function () { return types_1.BrowserMode; } });
|
|
18
13
|
var errors_1 = require("./errors");
|
|
19
14
|
Object.defineProperty(exports, "BinaryNotFoundError", { enumerable: true, get: function () { return errors_1.BinaryNotFoundError; } });
|
|
15
|
+
Object.defineProperty(exports, "NavigationError", { enumerable: true, get: function () { return errors_1.NavigationError; } });
|
|
16
|
+
Object.defineProperty(exports, "BinaryError", { enumerable: true, get: function () { return errors_1.BinaryError; } });
|
|
17
|
+
Object.defineProperty(exports, "SelectorTimeoutError", { enumerable: true, get: function () { return errors_1.SelectorTimeoutError; } });
|
|
18
|
+
var security_1 = require("./security");
|
|
19
|
+
Object.defineProperty(exports, "SecurityShield", { enumerable: true, get: function () { return security_1.SecurityShield; } });
|
|
20
20
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAqI;AAA5H,uGAAA,YAAY,OAAA;AAAE,+FAAA,IAAI,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAAE,oHAAA,yBAAyB,OAAA;AAAE,+GAAA,oBAAoB,OAAA;AACjH,iCAAsC;AAA7B,oGAAA,WAAW,OAAA;AACpB,mCAAmG;AAA1F,6GAAA,mBAAmB,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAChF,uCAA4C;AAAnC,0GAAA,cAAc,OAAA"}
|
package/dist/security.d.ts
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* B4n1Web SecurityShield
|
|
2
|
+
* B4n1Web SecurityShield — URL security validation with in-memory cache.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* Fall-safe: returns safe=true if any error occurs.
|
|
6
|
-
*/
|
|
7
|
-
import type { SecurityShieldOptions, SecurityCheckResult } from './types';
|
|
8
|
-
/**
|
|
9
|
-
* SecurityShield - Domain safety validation with caching
|
|
4
|
+
* SecurityShield provides URL safety checking for agentic browser navigation.
|
|
10
5
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* const result = await navigate('https://example.com');
|
|
17
|
-
*
|
|
18
|
-
* // With custom shield
|
|
19
|
-
* const shield = new SecurityShield({ cacheDays: 30 });
|
|
20
|
-
* const { isSafe, needsApiCheck } = shield.isUrlSafe('https://example.com');
|
|
21
|
-
* ```
|
|
6
|
+
* API:
|
|
7
|
+
* new SecurityShield({ dbPath?, cacheDays? })
|
|
8
|
+
* shield.isUrlSafe(url) → { isSafe: boolean, needsApiCheck: boolean }
|
|
9
|
+
* shield.markDomain(domain, isSafe)
|
|
10
|
+
* shield.clearCache()
|
|
22
11
|
*/
|
|
12
|
+
import type { SecurityShieldOptions, SecurityCheckResult } from './types';
|
|
23
13
|
export declare class SecurityShield {
|
|
24
|
-
private dbPath;
|
|
25
14
|
private cacheDays;
|
|
26
15
|
private cache;
|
|
27
|
-
constructor(options?: SecurityShieldOptions);
|
|
28
16
|
/**
|
|
29
|
-
*
|
|
17
|
+
* Create a SecurityShield instance.
|
|
18
|
+
* @param opts - Optional configuration
|
|
19
|
+
* @param opts.cacheDays - TTL of a cached result in days (default 7)
|
|
30
20
|
*/
|
|
31
|
-
|
|
21
|
+
constructor(opts?: SecurityShieldOptions);
|
|
32
22
|
/**
|
|
33
|
-
* Check
|
|
23
|
+
* Check whether a URL is safe to navigate.
|
|
24
|
+
*
|
|
25
|
+
* @param rawURL - The URL to check.
|
|
26
|
+
* @returns `{ isSafe, needsApiCheck }`
|
|
27
|
+
* isSafe — `true` if the domain is not blacklisted.
|
|
28
|
+
* needsApiCheck — `false` when the result was previously cached.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* const { isSafe, needsApiCheck } = shield.isUrlSafe('https://unknown.com');
|
|
32
|
+
* // → isSafe=true, needsApiCheck=true (unknown domain, needs screening)
|
|
33
|
+
*
|
|
34
|
+
* shield.markDomain('evil.com', false);
|
|
35
|
+
* shield.isUrlSafe('https://evil.com');
|
|
36
|
+
* // → isSafe=false, needsApiCheck=false (explicitly blacklisted)
|
|
34
37
|
*/
|
|
35
|
-
isUrlSafe(
|
|
38
|
+
isUrlSafe(rawURL: string): SecurityCheckResult;
|
|
36
39
|
/**
|
|
37
|
-
*
|
|
40
|
+
* Explicitly mark a domain as safe (whitelist) or unsafe (blacklist).
|
|
41
|
+
* Overwrites any previous entry and resets the TTL timer.
|
|
42
|
+
*
|
|
43
|
+
* @param domain - The domain to mark, e.g. `"example.com"`
|
|
44
|
+
* @param isSafe - `true` to whitelist, `false` to blacklist
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* shield.markDomain('trusted.com', true); // always allow
|
|
48
|
+
* shield.markDomain('malware.com', false); // always block
|
|
38
49
|
*/
|
|
39
50
|
markDomain(domain: string, isSafe: boolean): void;
|
|
40
51
|
/**
|
|
41
|
-
*
|
|
52
|
+
* Remove all cached domain entries.
|
|
53
|
+
* After clearing, every next `isUrlSafe()` call for a previously-known domain
|
|
54
|
+
* will return `needsApiCheck=true` again.
|
|
42
55
|
*/
|
|
43
56
|
clearCache(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Extract the hostname from a URL string.
|
|
59
|
+
* Returns `''` for invalid / missing URLs.
|
|
60
|
+
* @internal — exposed for testing as `extractDomain`.
|
|
61
|
+
*/
|
|
62
|
+
extractDomain(rawURL: string): string | null;
|
|
63
|
+
private _extractHost;
|
|
44
64
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Navigate to URL with optional security check
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```typescript
|
|
50
|
-
* import { navigate } from 'b4n1-web';
|
|
51
|
-
*
|
|
52
|
-
* const result = await navigate('https://example.com');
|
|
53
|
-
* if (result.success) {
|
|
54
|
-
* console.log(result.markdown);
|
|
55
|
-
* }
|
|
56
|
-
* ```
|
|
57
|
-
*/
|
|
58
|
-
export declare function navigate(url: string, ignoreSecurity?: boolean, securityShield?: SecurityShield): Promise<{
|
|
59
|
-
url: string;
|
|
60
|
-
success: boolean;
|
|
61
|
-
markdown?: string;
|
|
62
|
-
links?: string[];
|
|
63
|
-
error?: string;
|
|
64
|
-
}>;
|
|
65
65
|
//# sourceMappingURL=security.d.ts.map
|
package/dist/security.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAQ1E,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA0B;IAEvC;;;;OAIG;gBACS,IAAI,GAAE,qBAA0B;IAK5C;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAsB9C;;;;;;;;;;OAUG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAMjD;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAMlB;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsD5C,OAAO,CAAC,YAAY;CAIrB"}
|
package/dist/security.js
CHANGED
|
@@ -1,126 +1,160 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* B4n1Web SecurityShield
|
|
3
|
+
* B4n1Web SecurityShield — URL security validation with in-memory cache.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* SecurityShield provides URL safety checking for agentic browser navigation.
|
|
6
|
+
*
|
|
7
|
+
* API:
|
|
8
|
+
* new SecurityShield({ dbPath?, cacheDays? })
|
|
9
|
+
* shield.isUrlSafe(url) → { isSafe: boolean, needsApiCheck: boolean }
|
|
10
|
+
* shield.markDomain(domain, isSafe)
|
|
11
|
+
* shield.clearCache()
|
|
7
12
|
*/
|
|
8
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
14
|
exports.SecurityShield = void 0;
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
const types_1 = require("./types");
|
|
13
|
-
/**
|
|
14
|
-
* SecurityShield - Domain safety validation with caching
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* import { SecurityShield, navigate } from 'b4n1-web';
|
|
19
|
-
*
|
|
20
|
-
* // Simple usage
|
|
21
|
-
* const result = await navigate('https://example.com');
|
|
22
|
-
*
|
|
23
|
-
* // With custom shield
|
|
24
|
-
* const shield = new SecurityShield({ cacheDays: 30 });
|
|
25
|
-
* const { isSafe, needsApiCheck } = shield.isUrlSafe('https://example.com');
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
15
|
+
/** Default cache TTL in days */
|
|
16
|
+
const DEFAULT_CACHE_DAYS = 7;
|
|
28
17
|
class SecurityShield {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
this.cacheDays = options.cacheDays ?? 7;
|
|
32
|
-
this.cache = new Map();
|
|
33
|
-
}
|
|
18
|
+
cacheDays;
|
|
19
|
+
cache;
|
|
34
20
|
/**
|
|
35
|
-
*
|
|
21
|
+
* Create a SecurityShield instance.
|
|
22
|
+
* @param opts - Optional configuration
|
|
23
|
+
* @param opts.cacheDays - TTL of a cached result in days (default 7)
|
|
36
24
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return parsed.hostname.toLowerCase();
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
25
|
+
constructor(opts = {}) {
|
|
26
|
+
this.cacheDays = opts.cacheDays ?? DEFAULT_CACHE_DAYS;
|
|
27
|
+
this.cache = new Map();
|
|
45
28
|
}
|
|
46
29
|
/**
|
|
47
|
-
* Check
|
|
30
|
+
* Check whether a URL is safe to navigate.
|
|
31
|
+
*
|
|
32
|
+
* @param rawURL - The URL to check.
|
|
33
|
+
* @returns `{ isSafe, needsApiCheck }`
|
|
34
|
+
* isSafe — `true` if the domain is not blacklisted.
|
|
35
|
+
* needsApiCheck — `false` when the result was previously cached.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* const { isSafe, needsApiCheck } = shield.isUrlSafe('https://unknown.com');
|
|
39
|
+
* // → isSafe=true, needsApiCheck=true (unknown domain, needs screening)
|
|
40
|
+
*
|
|
41
|
+
* shield.markDomain('evil.com', false);
|
|
42
|
+
* shield.isUrlSafe('https://evil.com');
|
|
43
|
+
* // → isSafe=false, needsApiCheck=false (explicitly blacklisted)
|
|
48
44
|
*/
|
|
49
|
-
isUrlSafe(
|
|
50
|
-
const
|
|
51
|
-
if (!
|
|
45
|
+
isUrlSafe(rawURL) {
|
|
46
|
+
const host = this._extractHost(rawURL);
|
|
47
|
+
if (!host) {
|
|
48
|
+
// Invalid URL — safe default, no API check needed
|
|
52
49
|
return { isSafe: true, needsApiCheck: false };
|
|
53
50
|
}
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
const entry = this.cache.get(host);
|
|
53
|
+
if (entry) {
|
|
54
|
+
if (now < entry.expires) {
|
|
55
|
+
// Cached and fresh — does not need an external API call
|
|
56
|
+
return { isSafe: entry.isSafe, needsApiCheck: false };
|
|
59
57
|
}
|
|
60
|
-
|
|
58
|
+
// Expired — re-check
|
|
59
|
+
this.cache.delete(host);
|
|
61
60
|
}
|
|
61
|
+
// New domain — safe but needs external API verification
|
|
62
62
|
return { isSafe: true, needsApiCheck: true };
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
|
-
*
|
|
65
|
+
* Explicitly mark a domain as safe (whitelist) or unsafe (blacklist).
|
|
66
|
+
* Overwrites any previous entry and resets the TTL timer.
|
|
67
|
+
*
|
|
68
|
+
* @param domain - The domain to mark, e.g. `"example.com"`
|
|
69
|
+
* @param isSafe - `true` to whitelist, `false` to blacklist
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* shield.markDomain('trusted.com', true); // always allow
|
|
73
|
+
* shield.markDomain('malware.com', false); // always block
|
|
66
74
|
*/
|
|
67
75
|
markDomain(domain, isSafe) {
|
|
68
|
-
const
|
|
69
|
-
const expires = Date.now() + this.cacheDays *
|
|
70
|
-
this.cache.set(
|
|
76
|
+
const normalized = domain.toLowerCase().trim();
|
|
77
|
+
const expires = Date.now() + this.cacheDays * 86400_000; // days → ms
|
|
78
|
+
this.cache.set(normalized, { isSafe, expires });
|
|
71
79
|
}
|
|
72
80
|
/**
|
|
73
|
-
*
|
|
81
|
+
* Remove all cached domain entries.
|
|
82
|
+
* After clearing, every next `isUrlSafe()` call for a previously-known domain
|
|
83
|
+
* will return `needsApiCheck=true` again.
|
|
74
84
|
*/
|
|
75
85
|
clearCache() {
|
|
76
86
|
this.cache.clear();
|
|
77
87
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
88
|
+
// ── helpers ────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Extract the hostname from a URL string.
|
|
91
|
+
* Returns `''` for invalid / missing URLs.
|
|
92
|
+
* @internal — exposed for testing as `extractDomain`.
|
|
93
|
+
*/
|
|
94
|
+
extractDomain(rawURL) {
|
|
95
|
+
try {
|
|
96
|
+
const url = rawURL?.trim();
|
|
97
|
+
if (!url)
|
|
98
|
+
return null;
|
|
99
|
+
let rest;
|
|
100
|
+
// Check for scheme (handles both :// and : schemes like data:, javascript:)
|
|
101
|
+
const schemeIndex = url.indexOf(':');
|
|
102
|
+
if (schemeIndex === -1) {
|
|
103
|
+
// no scheme
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const scheme = url.slice(0, schemeIndex);
|
|
107
|
+
rest = url.slice(schemeIndex + 1);
|
|
108
|
+
// Handle special cases for schemes
|
|
109
|
+
if (scheme === 'data' || scheme === 'javascript') {
|
|
110
|
+
return '';
|
|
111
|
+
}
|
|
112
|
+
// Handle // authority format (like //example.com/path)
|
|
113
|
+
if (rest.startsWith('//')) {
|
|
114
|
+
rest = rest.slice(2);
|
|
115
|
+
}
|
|
116
|
+
// For other schemes like http:, https:, ftp:, etc., we already removed the scheme above
|
|
117
|
+
// Strip userinfo "user:pass@"
|
|
118
|
+
const atIdx = rest.lastIndexOf('@');
|
|
119
|
+
const afterAuth = atIdx >= 0 ? rest.slice(atIdx + 1) : rest;
|
|
120
|
+
// Strip path/query/fragment
|
|
121
|
+
const [rawHost, ..._] = afterAuth.split(/[\/?#]/, 1);
|
|
122
|
+
if (!rawHost)
|
|
123
|
+
return null;
|
|
124
|
+
let host = rawHost.trim();
|
|
125
|
+
if (!host)
|
|
126
|
+
return null;
|
|
127
|
+
// IPv6 in brackets: [::1]:8080 → ::
|
|
128
|
+
if (host.startsWith('[')) {
|
|
129
|
+
const bracketEnd = host.indexOf(']');
|
|
130
|
+
if (bracketEnd === -1)
|
|
131
|
+
return null;
|
|
132
|
+
host = host.slice(1, bracketEnd); // Extract content between brackets
|
|
133
|
+
return host.toLowerCase(); // ::1 is final, no port to strip
|
|
134
|
+
}
|
|
135
|
+
// Strip port after last ':' — works for 'example.com:8080'
|
|
136
|
+
const colonIdx = host.lastIndexOf(':');
|
|
137
|
+
if (colonIdx > 0) {
|
|
138
|
+
host = host.slice(0, colonIdx);
|
|
139
|
+
}
|
|
140
|
+
// Accept localhost / single-label hosts too
|
|
141
|
+
return host.toLowerCase() || null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
105
145
|
}
|
|
106
146
|
}
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
browser.close();
|
|
111
|
-
return {
|
|
112
|
-
url: page.url,
|
|
113
|
-
success: true,
|
|
114
|
-
markdown: page.markdown,
|
|
115
|
-
links: page.links,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
return {
|
|
120
|
-
url,
|
|
121
|
-
success: false,
|
|
122
|
-
error: error.message,
|
|
123
|
-
};
|
|
147
|
+
_extractHost(rawURL) {
|
|
148
|
+
const r = this.extractDomain(rawURL);
|
|
149
|
+
return r ?? '';
|
|
124
150
|
}
|
|
125
151
|
}
|
|
152
|
+
exports.SecurityShield = SecurityShield;
|
|
153
|
+
function _stripPort(host) {
|
|
154
|
+
const at = host.indexOf('@');
|
|
155
|
+
const colon = host.indexOf(':', at >= 0 ? at + 1 : 0);
|
|
156
|
+
if (colon >= 0)
|
|
157
|
+
return host.slice(0, colon);
|
|
158
|
+
return host;
|
|
159
|
+
}
|
|
126
160
|
//# sourceMappingURL=security.js.map
|
package/dist/security.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* B4n1Web TypeScript Types
|
|
3
|
-
*/
|
|
4
1
|
export declare enum BrowserMode {
|
|
5
2
|
LIGHT = "light",
|
|
6
3
|
JS = "js",
|
|
@@ -16,6 +13,7 @@ export interface PageData {
|
|
|
16
13
|
markdown: string;
|
|
17
14
|
links: string[];
|
|
18
15
|
screenshot?: string;
|
|
16
|
+
jsOutput?: string;
|
|
19
17
|
}
|
|
20
18
|
export interface NavigateResult {
|
|
21
19
|
url: string;
|
|
@@ -32,6 +30,11 @@ export interface SecurityCheckResult {
|
|
|
32
30
|
isSafe: boolean;
|
|
33
31
|
needsApiCheck: boolean;
|
|
34
32
|
}
|
|
33
|
+
export interface IframeInfo {
|
|
34
|
+
index: number;
|
|
35
|
+
src?: string;
|
|
36
|
+
title?: string;
|
|
37
|
+
}
|
|
35
38
|
export declare class BinaryNotFoundError extends Error {
|
|
36
39
|
constructor(message?: string);
|
|
37
40
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,EAAE,OAAO;IACT,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAuG;CAI3H"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,wBAAS,CAAA;IACT,gCAAiB,CAAA;AACnB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAwCD,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,oGAAoG;QACxH,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "b4n1-web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "B4n1Web SDK for JavaScript/TypeScript - Agentic Browser Engine with bundled binary",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^20.0.0",
|
|
41
41
|
"typescript": "^5.0.0",
|
|
42
|
-
"vitest": "^1.
|
|
42
|
+
"vitest": "^4.1.7"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=18.0.0"
|