b4n1-web 0.3.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/README.md +146 -0
- package/dist/browser.d.ts +70 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +174 -0
- package/dist/browser.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/security.d.ts +65 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +121 -0
- package/dist/security.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# B4n1Web JavaScript/TypeScript SDK
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<a href="https://www.npmjs.com/package/b4n1-web"><img src="https://img.shields.io/npm/v/b4n1-web.svg" alt="NPM version"></a>
|
|
5
|
+
<a href="https://www.npmjs.com/package/b4n1-web"><img src="https://img.shields.io/npm/dt/b4n1-web.svg" alt="NPM downloads"></a>
|
|
6
|
+
<a href="https://github.com/B4N1-com/b4n1-web"><img src="https://img.shields.io/github/stars/B4N1-com/b4n1web?style=flat" alt="GitHub stars"></a>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
TypeScript/JavaScript bindings for B4n1Web: The Agentic Browser Engine.
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
### 1. Install the B4n1Web Binary
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
curl -sL https://web.b4n1.com/install | bash
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 2. Install the JavaScript SDK
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install b4n1-web
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or with yarn:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
yarn add b4n1-web
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Or with pnpm:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpm add b4n1-web
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { AgentBrowser, BrowserMode, Page } from 'b4n1-web';
|
|
41
|
+
|
|
42
|
+
// Create a browser instance
|
|
43
|
+
const browser = new AgentBrowser({ mode: BrowserMode.LIGHT });
|
|
44
|
+
|
|
45
|
+
// Navigate to a page
|
|
46
|
+
const page = await browser.goto('https://example.com');
|
|
47
|
+
|
|
48
|
+
// Access structured data
|
|
49
|
+
console.log('Page content:', page.markdown);
|
|
50
|
+
console.log('Found', page.links.length, 'links');
|
|
51
|
+
|
|
52
|
+
// Extract main content
|
|
53
|
+
const mainContent = page.getMainContent();
|
|
54
|
+
console.log('Main content:', mainContent.substring(0, 200) + '...');
|
|
55
|
+
|
|
56
|
+
// Find specific links
|
|
57
|
+
const githubLinks = page.findLinksByText('github');
|
|
58
|
+
console.log('GitHub links:', githubLinks);
|
|
59
|
+
|
|
60
|
+
// Close browser when done
|
|
61
|
+
browser.close();
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Browser Modes
|
|
65
|
+
|
|
66
|
+
### Light Mode (Default)
|
|
67
|
+
|
|
68
|
+
- **Use case**: Reading articles, scraping static content, extracting links
|
|
69
|
+
- **Performance**: < 15MB RAM, instant startup
|
|
70
|
+
- **Capabilities**: HTML parsing, markdown conversion, link extraction
|
|
71
|
+
- **Limitations**: No JavaScript execution
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const browser = new AgentBrowser({ mode: BrowserMode.LIGHT });
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### JS Mode
|
|
78
|
+
|
|
79
|
+
- **Use case**: Extracting JavaScript from pages, SPA analysis
|
|
80
|
+
- **Performance**: Same as Light, instant startup
|
|
81
|
+
- **Capabilities**: HTML parsing + JavaScript tag extraction
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const browser = new AgentBrowser({ mode: BrowserMode.JS });
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Render Mode (Coming Soon)
|
|
88
|
+
|
|
89
|
+
- **Use case**: SPAs, form filling, visual verification, E2E testing
|
|
90
|
+
- **Status**: Coming in v0.3.0
|
|
91
|
+
|
|
92
|
+
## API Reference
|
|
93
|
+
|
|
94
|
+
### AgentBrowser
|
|
95
|
+
|
|
96
|
+
Main browser class for web automation.
|
|
97
|
+
|
|
98
|
+
#### Constructor Options
|
|
99
|
+
|
|
100
|
+
- `mode`: BrowserMode.LIGHT, BrowserMode.JS, or BrowserMode.RENDER
|
|
101
|
+
- `timeout`: Request timeout in seconds (default: 30)
|
|
102
|
+
- `userAgent`: Custom user agent string
|
|
103
|
+
|
|
104
|
+
#### Methods
|
|
105
|
+
|
|
106
|
+
- `goto(url: string)`: Navigate to URL and return structured page data
|
|
107
|
+
- `close()`: Close the browser session
|
|
108
|
+
|
|
109
|
+
### Page
|
|
110
|
+
|
|
111
|
+
Structured data from a web page.
|
|
112
|
+
|
|
113
|
+
#### Properties
|
|
114
|
+
|
|
115
|
+
- `url: string`: The page URL
|
|
116
|
+
- `markdown: string`: Clean markdown content
|
|
117
|
+
- `links: string[]`: Extracted links
|
|
118
|
+
- `screenshot?: string`: Base64-encoded screenshot (render mode only)
|
|
119
|
+
|
|
120
|
+
#### Methods
|
|
121
|
+
|
|
122
|
+
- `getMainContent()`: Extract main content, skipping headers/footers
|
|
123
|
+
- `findLinksByText(text: string)`: Find links containing specific text
|
|
124
|
+
|
|
125
|
+
## SecurityShield
|
|
126
|
+
|
|
127
|
+
Optional security validation with caching:
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
import { SecurityShield, navigate } from 'b4n1-web';
|
|
131
|
+
|
|
132
|
+
// With security check
|
|
133
|
+
const result = await navigate('https://example.com');
|
|
134
|
+
|
|
135
|
+
// With custom shield
|
|
136
|
+
const shield = new SecurityShield({ cacheDays: 30 });
|
|
137
|
+
const { isSafe, needsApiCheck } = shield.isUrlSafe('https://example.com');
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## TypeScript
|
|
141
|
+
|
|
142
|
+
This package includes TypeScript type definitions. No additional installation needed.
|
|
143
|
+
|
|
144
|
+
## License
|
|
145
|
+
|
|
146
|
+
MIT
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web Browser - JavaScript/TypeScript Implementation
|
|
3
|
+
*/
|
|
4
|
+
import { type BrowserOptions, type PageData } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Get B4n1Web binary version
|
|
7
|
+
*/
|
|
8
|
+
export declare function getB4n1webVersion(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Page data returned by B4n1Web
|
|
11
|
+
*/
|
|
12
|
+
export declare class Page implements PageData {
|
|
13
|
+
url: string;
|
|
14
|
+
markdown: string;
|
|
15
|
+
links: string[];
|
|
16
|
+
screenshot?: string;
|
|
17
|
+
constructor(data: PageData);
|
|
18
|
+
/**
|
|
19
|
+
* Extract main content from markdown, skipping headers
|
|
20
|
+
*/
|
|
21
|
+
getMainContent(): string;
|
|
22
|
+
/**
|
|
23
|
+
* Find links containing specific text
|
|
24
|
+
*/
|
|
25
|
+
findLinksByText(text: string): string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* B4n1Web Agent Browser
|
|
29
|
+
*
|
|
30
|
+
* A browser instance optimized for AI agent workflows.
|
|
31
|
+
* Requires B4n1Web binary to be installed.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* import { AgentBrowser, BrowserMode } from 'b4n1-web';
|
|
36
|
+
*
|
|
37
|
+
* const browser = new AgentBrowser({ mode: BrowserMode.LIGHT });
|
|
38
|
+
* const page = await browser.goto('https://example.com');
|
|
39
|
+
* console.log(page.markdown);
|
|
40
|
+
* browser.close();
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare class AgentBrowser {
|
|
44
|
+
private mode;
|
|
45
|
+
private timeout;
|
|
46
|
+
private userAgent;
|
|
47
|
+
private binaryPath;
|
|
48
|
+
constructor(options?: BrowserOptions);
|
|
49
|
+
/**
|
|
50
|
+
* Navigate to a URL and extract structured content
|
|
51
|
+
*/
|
|
52
|
+
goto(url: string): Promise<Page>;
|
|
53
|
+
/**
|
|
54
|
+
* Parse text output from the binary
|
|
55
|
+
*/
|
|
56
|
+
private parseOutput;
|
|
57
|
+
/**
|
|
58
|
+
* Close the browser session
|
|
59
|
+
*/
|
|
60
|
+
close(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Use as async context manager
|
|
63
|
+
*/
|
|
64
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create a browser and navigate in one go
|
|
68
|
+
*/
|
|
69
|
+
export declare function createBrowserAndGoto(url: string, options?: BrowserOptions): Promise<Page>;
|
|
70
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAe,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAuB,MAAM,SAAS,CAAC;AA0B/F;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAW1C;AAED;;GAEG;AACH,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;gBAER,IAAI,EAAE,QAAQ;IAO1B;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;CAIxC;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAU;gBAEhB,OAAO,GAAE,cAAmB;IAYxC;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBtC;;OAEG;IACH,OAAO,CAAC,WAAW;IA2BnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACG,CAAC,MAAM,CAAC,YAAY,CAAC;CAG5B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web Browser - JavaScript/TypeScript Implementation
|
|
3
|
+
*/
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import { BrowserMode, BinaryNotFoundError } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Find the b4n1web binary in common locations
|
|
8
|
+
*/
|
|
9
|
+
function getB4n1webBinary() {
|
|
10
|
+
const possiblePaths = [
|
|
11
|
+
'/usr/local/bin/b4n1web',
|
|
12
|
+
'/usr/bin/b4n1web',
|
|
13
|
+
process.env.HOME + '/.local/bin/b4n1web',
|
|
14
|
+
process.env.HOME + '/.b4n1web/bin/b4n1web',
|
|
15
|
+
];
|
|
16
|
+
for (const path of possiblePaths) {
|
|
17
|
+
try {
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
if (fs.existsSync(path) && fs.accessSync(path, fs.constants.X_OK)) {
|
|
20
|
+
return path;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Path doesn't exist or not executable
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get B4n1Web binary version
|
|
31
|
+
*/
|
|
32
|
+
export function getB4n1webVersion() {
|
|
33
|
+
const binaryPath = getB4n1webBinary();
|
|
34
|
+
if (!binaryPath) {
|
|
35
|
+
return 'unknown';
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const version = execSync(`${binaryPath} --version`, { timeout: 5000 }).toString().trim();
|
|
39
|
+
return version || 'unknown';
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return 'unknown';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Page data returned by B4n1Web
|
|
47
|
+
*/
|
|
48
|
+
export class Page {
|
|
49
|
+
constructor(data) {
|
|
50
|
+
this.url = data.url;
|
|
51
|
+
this.markdown = data.markdown;
|
|
52
|
+
this.links = data.links;
|
|
53
|
+
this.screenshot = data.screenshot;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Extract main content from markdown, skipping headers
|
|
57
|
+
*/
|
|
58
|
+
getMainContent() {
|
|
59
|
+
const lines = this.markdown.split('\n');
|
|
60
|
+
const contentLines = lines.length > 2 ? lines.slice(2) : lines;
|
|
61
|
+
return contentLines.join('\n').trim();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Find links containing specific text
|
|
65
|
+
*/
|
|
66
|
+
findLinksByText(text) {
|
|
67
|
+
const lowerText = text.toLowerCase();
|
|
68
|
+
return this.links.filter(link => link.toLowerCase().includes(lowerText));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* B4n1Web Agent Browser
|
|
73
|
+
*
|
|
74
|
+
* A browser instance optimized for AI agent workflows.
|
|
75
|
+
* Requires B4n1Web binary to be installed.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* import { AgentBrowser, BrowserMode } from 'b4n1-web';
|
|
80
|
+
*
|
|
81
|
+
* const browser = new AgentBrowser({ mode: BrowserMode.LIGHT });
|
|
82
|
+
* const page = await browser.goto('https://example.com');
|
|
83
|
+
* console.log(page.markdown);
|
|
84
|
+
* browser.close();
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export class AgentBrowser {
|
|
88
|
+
constructor(options = {}) {
|
|
89
|
+
this.mode = options.mode ?? BrowserMode.LIGHT;
|
|
90
|
+
this.timeout = options.timeout ?? 30;
|
|
91
|
+
this.userAgent = options.userAgent ?? 'B4n1Web-Agent/1.0';
|
|
92
|
+
const binary = getB4n1webBinary();
|
|
93
|
+
if (!binary) {
|
|
94
|
+
throw new BinaryNotFoundError('b4n1web binary not found. Run: curl -sL https://web.b4n1.com/install | bash');
|
|
95
|
+
}
|
|
96
|
+
this.binaryPath = binary;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Navigate to a URL and extract structured content
|
|
100
|
+
*/
|
|
101
|
+
async goto(url) {
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
try {
|
|
104
|
+
const output = execSync(`${this.binaryPath} goto ${url} --mode ${this.mode}`, { timeout: this.timeout * 1000 }).toString();
|
|
105
|
+
const page = this.parseOutput(url, output);
|
|
106
|
+
resolve(page);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error.message?.includes('timed out')) {
|
|
110
|
+
reject(new Error(`Binary timed out after ${this.timeout}s`));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
reject(new Error(`Binary error: ${error.message}`));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parse text output from the binary
|
|
120
|
+
*/
|
|
121
|
+
parseOutput(url, output) {
|
|
122
|
+
let markdown = '';
|
|
123
|
+
let links = [];
|
|
124
|
+
for (const line of output.split('\n')) {
|
|
125
|
+
if (line.startsWith('URL:')) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
else if (line.startsWith('Markdown:')) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
else if (line.startsWith('Links:')) {
|
|
132
|
+
try {
|
|
133
|
+
links = eval(line.slice(6).trim()); // Safe: we control the output format
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
links = [];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
markdown += line + '\n';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return new Page({
|
|
144
|
+
url,
|
|
145
|
+
markdown: markdown.trim(),
|
|
146
|
+
links,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Close the browser session
|
|
151
|
+
*/
|
|
152
|
+
close() {
|
|
153
|
+
// No persistent session to close in current implementation
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Use as async context manager
|
|
157
|
+
*/
|
|
158
|
+
async [Symbol.asyncDispose]() {
|
|
159
|
+
this.close();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create a browser and navigate in one go
|
|
164
|
+
*/
|
|
165
|
+
export async function createBrowserAndGoto(url, options = {}) {
|
|
166
|
+
const browser = new AgentBrowser(options);
|
|
167
|
+
try {
|
|
168
|
+
return await browser.goto(url);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
browser.close();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web Errors
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when B4n1Web binary is not found
|
|
6
|
+
*/
|
|
7
|
+
export declare class BinaryNotFoundError extends Error {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown when navigation fails
|
|
12
|
+
*/
|
|
13
|
+
export declare class NavigationError extends Error {
|
|
14
|
+
readonly url: string;
|
|
15
|
+
constructor(message: string, url: string);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Error thrown when binary execution fails
|
|
19
|
+
*/
|
|
20
|
+
export declare class BinaryError extends Error {
|
|
21
|
+
readonly stderr: string;
|
|
22
|
+
constructor(message: string, stderr: string);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAuG;CAK3H;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aACK,GAAG,EAAE,MAAM;gBAA5C,OAAO,EAAE,MAAM,EAAkB,GAAG,EAAE,MAAM;CAKzD;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;aACS,MAAM,EAAE,MAAM;gBAA/C,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM;CAK5D"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web Errors
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when B4n1Web binary is not found
|
|
6
|
+
*/
|
|
7
|
+
export class BinaryNotFoundError extends Error {
|
|
8
|
+
constructor(message = 'B4n1Web binary not found. Please install it first:\n curl -sL https://web.b4n1.com/install | bash') {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'BinaryNotFoundError';
|
|
11
|
+
Error.captureStackTrace(this, BinaryNotFoundError);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when navigation fails
|
|
16
|
+
*/
|
|
17
|
+
export class NavigationError extends Error {
|
|
18
|
+
constructor(message, url) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.url = url;
|
|
21
|
+
this.name = 'NavigationError';
|
|
22
|
+
Error.captureStackTrace(this, NavigationError);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Error thrown when binary execution fails
|
|
27
|
+
*/
|
|
28
|
+
export class BinaryError extends Error {
|
|
29
|
+
constructor(message, stderr) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.stderr = stderr;
|
|
32
|
+
this.name = 'BinaryError';
|
|
33
|
+
Error.captureStackTrace(this, BinaryError);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,OAAO,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;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,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;AAED;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
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 } from './browser';
|
|
8
|
+
export { BrowserMode } from './types';
|
|
9
|
+
export { BinaryNotFoundError } from './errors';
|
|
10
|
+
export { SecurityShield, navigate } from './security';
|
|
11
|
+
export type { BrowserOptions, PageData, NavigateResult, SecurityShieldOptions } from './types';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
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 } from './browser';
|
|
8
|
+
export { BrowserMode } from './types';
|
|
9
|
+
export { BinaryNotFoundError } from './errors';
|
|
10
|
+
export { SecurityShield, navigate } from './security';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web SecurityShield - URL Security Validation
|
|
3
|
+
*
|
|
4
|
+
* Provides URL security validation with caching.
|
|
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
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { SecurityShield, navigate } from 'b4n1-web';
|
|
14
|
+
*
|
|
15
|
+
* // Simple usage
|
|
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
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class SecurityShield {
|
|
24
|
+
private dbPath;
|
|
25
|
+
private cacheDays;
|
|
26
|
+
private cache;
|
|
27
|
+
constructor(options?: SecurityShieldOptions);
|
|
28
|
+
/**
|
|
29
|
+
* Extract domain from URL
|
|
30
|
+
*/
|
|
31
|
+
private extractDomain;
|
|
32
|
+
/**
|
|
33
|
+
* Check if URL is safe to navigate
|
|
34
|
+
*/
|
|
35
|
+
isUrlSafe(url: string): SecurityCheckResult;
|
|
36
|
+
/**
|
|
37
|
+
* Mark a domain as safe or unsafe
|
|
38
|
+
*/
|
|
39
|
+
markDomain(domain: string, isSafe: boolean): void;
|
|
40
|
+
/**
|
|
41
|
+
* Clear all cached domains
|
|
42
|
+
*/
|
|
43
|
+
clearCache(): void;
|
|
44
|
+
}
|
|
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
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE1E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAoD;gBAErD,OAAO,GAAE,qBAA0B;IAM/C;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB;IAkB3C;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAMjD;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,cAAc,GAAE,OAAe,EAC/B,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC;IACT,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,CAAC,CAkCD"}
|
package/dist/security.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web SecurityShield - URL Security Validation
|
|
3
|
+
*
|
|
4
|
+
* Provides URL security validation with caching.
|
|
5
|
+
* Fall-safe: returns safe=true if any error occurs.
|
|
6
|
+
*/
|
|
7
|
+
import { AgentBrowser } from './browser';
|
|
8
|
+
import { BrowserMode } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* SecurityShield - Domain safety validation with caching
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { SecurityShield, navigate } from 'b4n1-web';
|
|
15
|
+
*
|
|
16
|
+
* // Simple usage
|
|
17
|
+
* const result = await navigate('https://example.com');
|
|
18
|
+
*
|
|
19
|
+
* // With custom shield
|
|
20
|
+
* const shield = new SecurityShield({ cacheDays: 30 });
|
|
21
|
+
* const { isSafe, needsApiCheck } = shield.isUrlSafe('https://example.com');
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export class SecurityShield {
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
this.dbPath = options.dbPath ?? `${process.env.HOME}/.b4n1web/security.db`;
|
|
27
|
+
this.cacheDays = options.cacheDays ?? 7;
|
|
28
|
+
this.cache = new Map();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract domain from URL
|
|
32
|
+
*/
|
|
33
|
+
extractDomain(url) {
|
|
34
|
+
try {
|
|
35
|
+
const parsed = new URL(url);
|
|
36
|
+
return parsed.hostname.toLowerCase();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if URL is safe to navigate
|
|
44
|
+
*/
|
|
45
|
+
isUrlSafe(url) {
|
|
46
|
+
const domain = this.extractDomain(url);
|
|
47
|
+
if (!domain) {
|
|
48
|
+
return { isSafe: true, needsApiCheck: false };
|
|
49
|
+
}
|
|
50
|
+
const cached = this.cache.get(domain);
|
|
51
|
+
if (cached) {
|
|
52
|
+
if (Date.now() > cached.expires) {
|
|
53
|
+
this.cache.delete(domain);
|
|
54
|
+
return { isSafe: true, needsApiCheck: true };
|
|
55
|
+
}
|
|
56
|
+
return { isSafe: cached.isSafe, needsApiCheck: false };
|
|
57
|
+
}
|
|
58
|
+
return { isSafe: true, needsApiCheck: true };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Mark a domain as safe or unsafe
|
|
62
|
+
*/
|
|
63
|
+
markDomain(domain, isSafe) {
|
|
64
|
+
const normalizedDomain = domain.toLowerCase();
|
|
65
|
+
const expires = Date.now() + this.cacheDays * 24 * 60 * 60 * 1000;
|
|
66
|
+
this.cache.set(normalizedDomain, { isSafe, expires });
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Clear all cached domains
|
|
70
|
+
*/
|
|
71
|
+
clearCache() {
|
|
72
|
+
this.cache.clear();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Navigate to URL with optional security check
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* import { navigate } from 'b4n1-web';
|
|
81
|
+
*
|
|
82
|
+
* const result = await navigate('https://example.com');
|
|
83
|
+
* if (result.success) {
|
|
84
|
+
* console.log(result.markdown);
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export async function navigate(url, ignoreSecurity = false, securityShield) {
|
|
89
|
+
if (!securityShield) {
|
|
90
|
+
securityShield = new SecurityShield();
|
|
91
|
+
}
|
|
92
|
+
if (!ignoreSecurity) {
|
|
93
|
+
const { isSafe } = securityShield.isUrlSafe(url);
|
|
94
|
+
if (!isSafe) {
|
|
95
|
+
return {
|
|
96
|
+
url,
|
|
97
|
+
success: false,
|
|
98
|
+
error: 'URL flagged as unsafe by security check',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const browser = new AgentBrowser({ mode: BrowserMode.LIGHT });
|
|
104
|
+
const page = await browser.goto(url);
|
|
105
|
+
browser.close();
|
|
106
|
+
return {
|
|
107
|
+
url: page.url,
|
|
108
|
+
success: true,
|
|
109
|
+
markdown: page.markdown,
|
|
110
|
+
links: page.links,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
return {
|
|
115
|
+
url,
|
|
116
|
+
success: false,
|
|
117
|
+
error: error.message,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAa,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,cAAc;IAKzB,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,uBAAuB,CAAC;QAC3E,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,GAAW;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAChD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YAC/C,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACzD,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc,EAAE,MAAe;QACxC,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,iBAA0B,KAAK,EAC/B,cAA+B;IAQ/B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yCAAyC;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAS,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,GAAG;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web TypeScript Types
|
|
3
|
+
*/
|
|
4
|
+
export declare enum BrowserMode {
|
|
5
|
+
LIGHT = "light",
|
|
6
|
+
JS = "js",
|
|
7
|
+
RENDER = "render"
|
|
8
|
+
}
|
|
9
|
+
export interface BrowserOptions {
|
|
10
|
+
mode?: BrowserMode;
|
|
11
|
+
timeout?: number;
|
|
12
|
+
userAgent?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface PageData {
|
|
15
|
+
url: string;
|
|
16
|
+
markdown: string;
|
|
17
|
+
links: string[];
|
|
18
|
+
screenshot?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface NavigateResult {
|
|
21
|
+
url: string;
|
|
22
|
+
success: boolean;
|
|
23
|
+
markdown?: string;
|
|
24
|
+
links?: string[];
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface SecurityShieldOptions {
|
|
28
|
+
dbPath?: string;
|
|
29
|
+
cacheDays?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface SecurityCheckResult {
|
|
32
|
+
isSafe: boolean;
|
|
33
|
+
needsApiCheck: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare class BinaryNotFoundError extends Error {
|
|
36
|
+
constructor(message?: string);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,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;CACrB;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,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAuG;CAI3H"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B4n1Web TypeScript Types
|
|
3
|
+
*/
|
|
4
|
+
export var BrowserMode;
|
|
5
|
+
(function (BrowserMode) {
|
|
6
|
+
BrowserMode["LIGHT"] = "light";
|
|
7
|
+
BrowserMode["JS"] = "js";
|
|
8
|
+
BrowserMode["RENDER"] = "render";
|
|
9
|
+
})(BrowserMode || (BrowserMode = {}));
|
|
10
|
+
export class BinaryNotFoundError extends Error {
|
|
11
|
+
constructor(message = 'B4n1Web binary not found. Please install it first:\n curl -sL https://web.b4n1.com/install | bash') {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'BinaryNotFoundError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,wBAAS,CAAA;IACT,gCAAiB,CAAA;AACnB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAiCD,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,oGAAoG;QACxH,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "b4n1-web",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "B4n1Web SDK for JavaScript/TypeScript - Agentic Browser Engine",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"prepublishOnly": "npm run build"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"browser",
|
|
27
|
+
"agent",
|
|
28
|
+
"automation",
|
|
29
|
+
"web-scraping",
|
|
30
|
+
"headless"
|
|
31
|
+
],
|
|
32
|
+
"author": "Bani Montoya <banimontoya@gmail.com>",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"homepage": "https://web.b4n1.com",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/B4N1-com/b4n1-web.git"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"undici": "^6.0.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^20.0.0",
|
|
44
|
+
"jest": "^29.7.0",
|
|
45
|
+
"typescript": "^5.0.0",
|
|
46
|
+
"vitest": "^4.1.2"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=18.0.0"
|
|
50
|
+
}
|
|
51
|
+
}
|