sentience-ts 0.10.3
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 +193 -0
- package/dist/actions.d.ts +9 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +113 -0
- package/dist/actions.js.map +1 -0
- package/dist/browser.d.ts +24 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +236 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +158 -0
- package/dist/cli.js.map +1 -0
- package/dist/expect.d.ts +16 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +66 -0
- package/dist/expect.js.map +1 -0
- package/dist/generator.d.ts +16 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +205 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector.d.ts +13 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +147 -0
- package/dist/inspector.js.map +1 -0
- package/dist/query.d.ts +8 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +337 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +40 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +86 -0
- package/dist/read.js.map +1 -0
- package/dist/recorder.d.ts +44 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +256 -0
- package/dist/recorder.js.map +1 -0
- package/dist/screenshot.d.ts +17 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +37 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/snapshot.d.ts +20 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +101 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/wait.d.ts +7 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +37 -0
- package/dist/wait.js.map +1 -0
- package/package.json +58 -0
- package/spec/README.md +72 -0
- package/spec/SNAPSHOT_V1.md +208 -0
- package/spec/sdk-types.md +259 -0
- package/spec/snapshot.schema.json +148 -0
package/README.md
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Sentience TypeScript SDK
|
|
2
|
+
|
|
3
|
+
**📜 License**: Apache License 2.0
|
|
4
|
+
|
|
5
|
+
TypeScript SDK for Sentience AI Agent Browser Automation.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
cd sdk-ts
|
|
11
|
+
npm install
|
|
12
|
+
npm run build
|
|
13
|
+
|
|
14
|
+
# Install Playwright browsers (required)
|
|
15
|
+
npx playwright install chromium
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { SentienceBrowser, snapshot, find, click } from './src';
|
|
22
|
+
|
|
23
|
+
async function main() {
|
|
24
|
+
const browser = new SentienceBrowser(undefined, undefined, false);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
await browser.start();
|
|
28
|
+
|
|
29
|
+
await browser.getPage().goto('https://example.com');
|
|
30
|
+
await browser.getPage().waitForLoadState('networkidle');
|
|
31
|
+
|
|
32
|
+
// Take snapshot
|
|
33
|
+
const snap = await snapshot(browser);
|
|
34
|
+
console.log(`Found ${snap.elements.length} elements`);
|
|
35
|
+
|
|
36
|
+
// Find and click a link
|
|
37
|
+
const link = find(snap, 'role=link');
|
|
38
|
+
if (link) {
|
|
39
|
+
const result = await click(browser, link.id);
|
|
40
|
+
console.log(`Click success: ${result.success}`);
|
|
41
|
+
}
|
|
42
|
+
} finally {
|
|
43
|
+
await browser.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Running Examples
|
|
49
|
+
|
|
50
|
+
**⚠️ Important**: You cannot use `node` directly to run TypeScript files. Use one of these methods:
|
|
51
|
+
|
|
52
|
+
**Option 1: Using npm scripts (recommended)**
|
|
53
|
+
```bash
|
|
54
|
+
npm run example:hello
|
|
55
|
+
npm run example:basic
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Option 2: Using ts-node directly**
|
|
59
|
+
```bash
|
|
60
|
+
npx ts-node examples/hello.ts
|
|
61
|
+
# or if ts-node is installed globally:
|
|
62
|
+
ts-node examples/hello.ts
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Option 3: Compile then run (not recommended for examples)**
|
|
66
|
+
```bash
|
|
67
|
+
npm run build
|
|
68
|
+
# Examples would need to be compiled separately
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Features
|
|
72
|
+
|
|
73
|
+
### Day 2: Browser Harness
|
|
74
|
+
- `SentienceBrowser` - Launch Playwright with extension loaded
|
|
75
|
+
- Automatic extension loading and verification
|
|
76
|
+
|
|
77
|
+
### Day 3: Snapshot
|
|
78
|
+
- `snapshot(browser, options)` - Capture page state
|
|
79
|
+
- TypeScript types for type safety
|
|
80
|
+
|
|
81
|
+
### Content Reading & Screenshots
|
|
82
|
+
- `read(browser, options)` - Read page content as text or markdown
|
|
83
|
+
- Enhanced markdown conversion using `turndown` (better than extension's lightweight conversion)
|
|
84
|
+
- Supports `enhance_markdown` option to use improved conversion
|
|
85
|
+
- `screenshot(browser, options)` - Capture standalone screenshot
|
|
86
|
+
- Returns base64-encoded data URL
|
|
87
|
+
- Supports PNG and JPEG formats with quality control
|
|
88
|
+
|
|
89
|
+
### Day 4: Query Engine
|
|
90
|
+
- `query(snapshot, selector)` - Find elements matching selector
|
|
91
|
+
- `find(snapshot, selector)` - Find single best match
|
|
92
|
+
- String DSL: `"role=button text~'Sign in'"`
|
|
93
|
+
- **📖 [Complete DSL Query Guide](docs/QUERY_DSL.md)** - Comprehensive documentation with all operators, fields, and examples
|
|
94
|
+
|
|
95
|
+
### Day 5: Actions
|
|
96
|
+
- `click(browser, elementId)` - Click element
|
|
97
|
+
- `typeText(browser, elementId, text)` - Type into element
|
|
98
|
+
- `press(browser, key)` - Press keyboard key
|
|
99
|
+
|
|
100
|
+
### Day 6: Wait & Assert
|
|
101
|
+
- `waitFor(browser, selector, timeout)` - Wait for element
|
|
102
|
+
- `expect(browser, selector)` - Assertion helper
|
|
103
|
+
- `.toExist()`
|
|
104
|
+
- `.toBeVisible()`
|
|
105
|
+
- `.toHaveText(text)`
|
|
106
|
+
- `.toHaveCount(n)`
|
|
107
|
+
|
|
108
|
+
### Content Reading
|
|
109
|
+
- `read(browser, options)` - Read page content
|
|
110
|
+
- **Default format: `"raw"`** - Returns HTML suitable for Turndown
|
|
111
|
+
- `format: "raw"` - Get cleaned HTML
|
|
112
|
+
- `format: "markdown"` - Get high-quality markdown (uses Turndown internally)
|
|
113
|
+
- `format: "text"` - Get plain text
|
|
114
|
+
|
|
115
|
+
**Examples:**
|
|
116
|
+
```typescript
|
|
117
|
+
import { read } from './src';
|
|
118
|
+
|
|
119
|
+
// Get raw HTML (default)
|
|
120
|
+
const result = await read(browser);
|
|
121
|
+
const html = result.content;
|
|
122
|
+
|
|
123
|
+
// Get high-quality markdown (uses Turndown automatically)
|
|
124
|
+
const result = await read(browser, { format: 'markdown' });
|
|
125
|
+
const markdown = result.content;
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
See `examples/read-markdown.ts` for complete examples.
|
|
129
|
+
|
|
130
|
+
## Examples
|
|
131
|
+
|
|
132
|
+
See `examples/` directory:
|
|
133
|
+
- `hello.ts` - Extension bridge verification
|
|
134
|
+
- `basic-agent.ts` - Basic snapshot
|
|
135
|
+
- `query-demo.ts` - Query engine
|
|
136
|
+
- `wait-and-click.ts` - Wait and actions
|
|
137
|
+
- `read-markdown.ts` - Reading page content and converting to markdown
|
|
138
|
+
|
|
139
|
+
### Content Reading Example
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { SentienceBrowser, read } from './src';
|
|
143
|
+
|
|
144
|
+
const browser = new SentienceBrowser();
|
|
145
|
+
await browser.start();
|
|
146
|
+
|
|
147
|
+
await browser.getPage().goto('https://example.com');
|
|
148
|
+
await browser.getPage().waitForLoadState('networkidle');
|
|
149
|
+
|
|
150
|
+
// Read as enhanced markdown (better quality)
|
|
151
|
+
const result = await read(browser, {
|
|
152
|
+
format: 'markdown',
|
|
153
|
+
enhance_markdown: true
|
|
154
|
+
});
|
|
155
|
+
console.log(result.content); // High-quality markdown
|
|
156
|
+
|
|
157
|
+
await browser.close();
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Screenshot Example
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
import { SentienceBrowser, screenshot } from './src';
|
|
164
|
+
import { writeFileSync } from 'fs';
|
|
165
|
+
|
|
166
|
+
const browser = new SentienceBrowser();
|
|
167
|
+
await browser.start();
|
|
168
|
+
|
|
169
|
+
await browser.getPage().goto('https://example.com');
|
|
170
|
+
await browser.getPage().waitForLoadState('networkidle');
|
|
171
|
+
|
|
172
|
+
// Capture PNG screenshot
|
|
173
|
+
const dataUrl = await screenshot(browser, { format: 'png' });
|
|
174
|
+
|
|
175
|
+
// Save to file
|
|
176
|
+
const base64Data = dataUrl.split(',')[1];
|
|
177
|
+
const imageData = Buffer.from(base64Data, 'base64');
|
|
178
|
+
writeFileSync('screenshot.png', imageData);
|
|
179
|
+
|
|
180
|
+
await browser.close();
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Testing
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npm test
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Documentation
|
|
190
|
+
|
|
191
|
+
- **📖 [Query DSL Guide](docs/QUERY_DSL.md)** - Complete guide to the semantic query language
|
|
192
|
+
- API Contract: `../spec/SNAPSHOT_V1.md`
|
|
193
|
+
- Type Definitions: `../spec/sdk-types.md`
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actions v1 - click, type, press
|
|
3
|
+
*/
|
|
4
|
+
import { SentienceBrowser } from './browser';
|
|
5
|
+
import { ActionResult } from './types';
|
|
6
|
+
export declare function click(browser: SentienceBrowser, elementId: number, takeSnapshot?: boolean): Promise<ActionResult>;
|
|
7
|
+
export declare function typeText(browser: SentienceBrowser, elementId: number, text: string, takeSnapshot?: boolean): Promise<ActionResult>;
|
|
8
|
+
export declare function press(browser: SentienceBrowser, key: string, takeSnapshot?: boolean): Promise<ActionResult>;
|
|
9
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAY,MAAM,SAAS,CAAC;AAGjD,wBAAsB,KAAK,CACzB,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,YAAY,CAAC,CA2CvB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,YAAY,CAAC,CA6CvB;AAED,wBAAsB,KAAK,CACzB,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
|
package/dist/actions.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Actions v1 - click, type, press
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.click = click;
|
|
7
|
+
exports.typeText = typeText;
|
|
8
|
+
exports.press = press;
|
|
9
|
+
const snapshot_1 = require("./snapshot");
|
|
10
|
+
async function click(browser, elementId, takeSnapshot = false) {
|
|
11
|
+
const page = browser.getPage();
|
|
12
|
+
const startTime = Date.now();
|
|
13
|
+
const urlBefore = page.url();
|
|
14
|
+
// Call extension click method
|
|
15
|
+
const success = await page.evaluate((id) => {
|
|
16
|
+
return window.sentience.click(id);
|
|
17
|
+
}, elementId);
|
|
18
|
+
// Wait a bit for navigation/DOM updates
|
|
19
|
+
await page.waitForTimeout(500);
|
|
20
|
+
const durationMs = Date.now() - startTime;
|
|
21
|
+
const urlAfter = page.url();
|
|
22
|
+
const urlChanged = urlBefore !== urlAfter;
|
|
23
|
+
// Determine outcome
|
|
24
|
+
let outcome;
|
|
25
|
+
if (urlChanged) {
|
|
26
|
+
outcome = 'navigated';
|
|
27
|
+
}
|
|
28
|
+
else if (success) {
|
|
29
|
+
outcome = 'dom_updated';
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
outcome = 'error';
|
|
33
|
+
}
|
|
34
|
+
// Optional snapshot after
|
|
35
|
+
let snapshotAfter;
|
|
36
|
+
if (takeSnapshot) {
|
|
37
|
+
snapshotAfter = await (0, snapshot_1.snapshot)(browser);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
success,
|
|
41
|
+
duration_ms: durationMs,
|
|
42
|
+
outcome,
|
|
43
|
+
url_changed: urlChanged,
|
|
44
|
+
snapshot_after: snapshotAfter,
|
|
45
|
+
error: success
|
|
46
|
+
? undefined
|
|
47
|
+
: { code: 'click_failed', reason: 'Element not found or not clickable' },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function typeText(browser, elementId, text, takeSnapshot = false) {
|
|
51
|
+
const page = browser.getPage();
|
|
52
|
+
const startTime = Date.now();
|
|
53
|
+
const urlBefore = page.url();
|
|
54
|
+
// Focus element first
|
|
55
|
+
const focused = await page.evaluate((id) => {
|
|
56
|
+
const el = window.sentience_registry[id];
|
|
57
|
+
if (el) {
|
|
58
|
+
el.focus();
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}, elementId);
|
|
63
|
+
if (!focused) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
duration_ms: Date.now() - startTime,
|
|
67
|
+
outcome: 'error',
|
|
68
|
+
error: { code: 'focus_failed', reason: 'Element not found' },
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// Type using Playwright keyboard
|
|
72
|
+
await page.keyboard.type(text);
|
|
73
|
+
const durationMs = Date.now() - startTime;
|
|
74
|
+
const urlAfter = page.url();
|
|
75
|
+
const urlChanged = urlBefore !== urlAfter;
|
|
76
|
+
const outcome = urlChanged ? 'navigated' : 'dom_updated';
|
|
77
|
+
let snapshotAfter;
|
|
78
|
+
if (takeSnapshot) {
|
|
79
|
+
snapshotAfter = await (0, snapshot_1.snapshot)(browser);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
duration_ms: durationMs,
|
|
84
|
+
outcome,
|
|
85
|
+
url_changed: urlChanged,
|
|
86
|
+
snapshot_after: snapshotAfter,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function press(browser, key, takeSnapshot = false) {
|
|
90
|
+
const page = browser.getPage();
|
|
91
|
+
const startTime = Date.now();
|
|
92
|
+
const urlBefore = page.url();
|
|
93
|
+
// Press key using Playwright
|
|
94
|
+
await page.keyboard.press(key);
|
|
95
|
+
// Wait a bit for navigation/DOM updates
|
|
96
|
+
await page.waitForTimeout(500);
|
|
97
|
+
const durationMs = Date.now() - startTime;
|
|
98
|
+
const urlAfter = page.url();
|
|
99
|
+
const urlChanged = urlBefore !== urlAfter;
|
|
100
|
+
const outcome = urlChanged ? 'navigated' : 'dom_updated';
|
|
101
|
+
let snapshotAfter;
|
|
102
|
+
if (takeSnapshot) {
|
|
103
|
+
snapshotAfter = await (0, snapshot_1.snapshot)(browser);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
success: true,
|
|
107
|
+
duration_ms: durationMs,
|
|
108
|
+
outcome,
|
|
109
|
+
url_changed: urlChanged,
|
|
110
|
+
snapshot_after: snapshotAfter,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright browser harness with extension loading
|
|
3
|
+
*/
|
|
4
|
+
import { Page } from 'playwright';
|
|
5
|
+
export declare class SentienceBrowser {
|
|
6
|
+
private context;
|
|
7
|
+
private browser;
|
|
8
|
+
private page;
|
|
9
|
+
private extensionPath;
|
|
10
|
+
private userDataDir;
|
|
11
|
+
private _apiKey?;
|
|
12
|
+
private _apiUrl?;
|
|
13
|
+
private headless;
|
|
14
|
+
constructor(apiKey?: string, apiUrl?: string, headless?: boolean);
|
|
15
|
+
start(): Promise<void>;
|
|
16
|
+
goto(url: string): Promise<void>;
|
|
17
|
+
private waitForExtension;
|
|
18
|
+
getPage(): Page;
|
|
19
|
+
private _copyRecursive;
|
|
20
|
+
getApiKey(): string | undefined;
|
|
21
|
+
getApiUrl(): string | undefined;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAA4B,IAAI,EAAW,MAAM,YAAY,CAAC;AAKrE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAU;gBAGxB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,OAAO;IAqBd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgFtB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAqBxB,gBAAgB;IAkB9B,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,cAAc;IAYtB,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,SAAS,IAAI,MAAM,GAAG,SAAS;IAIzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA8C7B"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Playwright browser harness with extension loading
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SentienceBrowser = void 0;
|
|
40
|
+
const playwright_1 = require("playwright");
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
class SentienceBrowser {
|
|
45
|
+
constructor(apiKey, apiUrl, headless) {
|
|
46
|
+
this.context = null;
|
|
47
|
+
this.browser = null;
|
|
48
|
+
this.page = null;
|
|
49
|
+
this.extensionPath = null;
|
|
50
|
+
this.userDataDir = null;
|
|
51
|
+
this._apiKey = apiKey;
|
|
52
|
+
// Determine headless mode
|
|
53
|
+
if (headless === undefined) {
|
|
54
|
+
// Default to true in CI, false locally
|
|
55
|
+
const ci = process.env.CI?.toLowerCase();
|
|
56
|
+
this.headless = ci === 'true' || ci === '1' || ci === 'yes';
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
this.headless = headless;
|
|
60
|
+
}
|
|
61
|
+
// Configure API URL
|
|
62
|
+
if (apiKey) {
|
|
63
|
+
this._apiUrl = apiUrl || 'https://api.sentienceapi.com';
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this._apiUrl = undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async start() {
|
|
70
|
+
// 1. Resolve Extension Path
|
|
71
|
+
// Handle: src/extension (local dev), dist/extension (prod), or ../sentience-chrome (monorepo)
|
|
72
|
+
let extensionSource = '';
|
|
73
|
+
const candidates = [
|
|
74
|
+
// Production / Installed Package
|
|
75
|
+
path.resolve(__dirname, '../extension'),
|
|
76
|
+
path.resolve(__dirname, 'extension'),
|
|
77
|
+
// Local Monorepo Dev
|
|
78
|
+
path.resolve(__dirname, '../../sentience-chrome'),
|
|
79
|
+
path.resolve(__dirname, '../../../sentience-chrome'),
|
|
80
|
+
// CI Artifact
|
|
81
|
+
path.resolve(process.cwd(), 'extension')
|
|
82
|
+
];
|
|
83
|
+
for (const loc of candidates) {
|
|
84
|
+
if (fs.existsSync(path.join(loc, 'manifest.json'))) {
|
|
85
|
+
extensionSource = loc;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!extensionSource) {
|
|
90
|
+
throw new Error(`Sentience extension not found. Checked:\n${candidates.map(c => `- ${c}`).join('\n')}\n` +
|
|
91
|
+
'Ensure the extension is built/downloaded.');
|
|
92
|
+
}
|
|
93
|
+
// 2. Setup Temp Profile (Avoids locking issues)
|
|
94
|
+
this.userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sentience-ts-'));
|
|
95
|
+
this.extensionPath = path.join(this.userDataDir, 'extension');
|
|
96
|
+
// Copy extension to temp dir
|
|
97
|
+
this._copyRecursive(extensionSource, this.extensionPath);
|
|
98
|
+
// 3. Build Args
|
|
99
|
+
const args = [
|
|
100
|
+
`--disable-extensions-except=${this.extensionPath}`,
|
|
101
|
+
`--load-extension=${this.extensionPath}`,
|
|
102
|
+
'--disable-blink-features=AutomationControlled',
|
|
103
|
+
'--no-sandbox',
|
|
104
|
+
'--disable-infobars',
|
|
105
|
+
];
|
|
106
|
+
// CRITICAL: Headless Extensions Support
|
|
107
|
+
// headless: true -> NO extensions.
|
|
108
|
+
// headless: false + args: '--headless=new' -> YES extensions.
|
|
109
|
+
if (this.headless) {
|
|
110
|
+
args.push('--headless=new');
|
|
111
|
+
}
|
|
112
|
+
// 4. Launch Browser
|
|
113
|
+
this.context = await playwright_1.chromium.launchPersistentContext(this.userDataDir, {
|
|
114
|
+
headless: false, // Must be false here, handled via args above
|
|
115
|
+
args: args,
|
|
116
|
+
viewport: { width: 1920, height: 1080 },
|
|
117
|
+
// Clean User-Agent to avoid "HeadlessChrome" detection
|
|
118
|
+
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
|
|
119
|
+
});
|
|
120
|
+
this.page = this.context.pages()[0] || await this.context.newPage();
|
|
121
|
+
// 5. Apply Stealth (Basic)
|
|
122
|
+
await this.page.addInitScript(() => {
|
|
123
|
+
Object.defineProperty(navigator, 'webdriver', { get: () => false });
|
|
124
|
+
});
|
|
125
|
+
// Inject API Key if present
|
|
126
|
+
if (this._apiKey) {
|
|
127
|
+
await this.page.addInitScript((key) => {
|
|
128
|
+
window.__SENTIENCE_API_KEY__ = key;
|
|
129
|
+
}, this._apiKey);
|
|
130
|
+
}
|
|
131
|
+
// Wait for extension background pages to spin up
|
|
132
|
+
await new Promise(r => setTimeout(r, 500));
|
|
133
|
+
}
|
|
134
|
+
async goto(url) {
|
|
135
|
+
const page = this.getPage();
|
|
136
|
+
await page.goto(url, { waitUntil: 'domcontentloaded' });
|
|
137
|
+
if (!(await this.waitForExtension(15000))) {
|
|
138
|
+
// Gather Debug Info
|
|
139
|
+
const diag = await page.evaluate(() => ({
|
|
140
|
+
sentience_global: typeof window.sentience !== 'undefined',
|
|
141
|
+
wasm_ready: window.sentience && window.sentience._wasmModule !== null,
|
|
142
|
+
ext_id: document.documentElement.dataset.sentienceExtensionId || 'not set',
|
|
143
|
+
url: window.location.href
|
|
144
|
+
})).catch(e => ({ error: String(e) }));
|
|
145
|
+
throw new Error('Extension failed to load after navigation.\n' +
|
|
146
|
+
`Path: ${this.extensionPath}\n` +
|
|
147
|
+
`Diagnostics: ${JSON.stringify(diag, null, 2)}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async waitForExtension(timeoutMs) {
|
|
151
|
+
const start = Date.now();
|
|
152
|
+
while (Date.now() - start < timeoutMs) {
|
|
153
|
+
try {
|
|
154
|
+
const ready = await this.page.evaluate(() => {
|
|
155
|
+
// Check for API AND Wasm Module (set by injected_api.js)
|
|
156
|
+
const s = window.sentience;
|
|
157
|
+
return s && s._wasmModule !== null; // Strict check for null (it's initialized as null)
|
|
158
|
+
});
|
|
159
|
+
if (ready)
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
// Context invalid errors expected during navigation
|
|
164
|
+
}
|
|
165
|
+
await new Promise(r => setTimeout(r, 100));
|
|
166
|
+
}
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
getPage() {
|
|
170
|
+
if (!this.page) {
|
|
171
|
+
throw new Error('Browser not started. Call start() first.');
|
|
172
|
+
}
|
|
173
|
+
return this.page;
|
|
174
|
+
}
|
|
175
|
+
// Helper for recursive copy (fs.cp is Node 16.7+)
|
|
176
|
+
_copyRecursive(src, dest) {
|
|
177
|
+
if (fs.statSync(src).isDirectory()) {
|
|
178
|
+
if (!fs.existsSync(dest))
|
|
179
|
+
fs.mkdirSync(dest);
|
|
180
|
+
fs.readdirSync(src).forEach(child => {
|
|
181
|
+
this._copyRecursive(path.join(src, child), path.join(dest, child));
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
fs.copyFileSync(src, dest);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Expose API configuration (read-only)
|
|
189
|
+
getApiKey() {
|
|
190
|
+
return this._apiKey;
|
|
191
|
+
}
|
|
192
|
+
getApiUrl() {
|
|
193
|
+
return this._apiUrl;
|
|
194
|
+
}
|
|
195
|
+
async close() {
|
|
196
|
+
const cleanup = [];
|
|
197
|
+
// Close context first (this also closes the browser for persistent contexts)
|
|
198
|
+
if (this.context) {
|
|
199
|
+
cleanup.push(this.context.close().catch(() => {
|
|
200
|
+
// Ignore errors during cleanup
|
|
201
|
+
}));
|
|
202
|
+
this.context = null;
|
|
203
|
+
}
|
|
204
|
+
// Close browser if it exists (for non-persistent contexts)
|
|
205
|
+
if (this.browser) {
|
|
206
|
+
cleanup.push(this.browser.close().catch(() => {
|
|
207
|
+
// Ignore errors during cleanup
|
|
208
|
+
}));
|
|
209
|
+
this.browser = null;
|
|
210
|
+
}
|
|
211
|
+
// Wait for all cleanup to complete
|
|
212
|
+
await Promise.all(cleanup);
|
|
213
|
+
// Clean up extension directory
|
|
214
|
+
if (this.extensionPath && fs.existsSync(this.extensionPath)) {
|
|
215
|
+
try {
|
|
216
|
+
fs.rmSync(this.extensionPath, { recursive: true, force: true });
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
// Ignore cleanup errors
|
|
220
|
+
}
|
|
221
|
+
this.extensionPath = null;
|
|
222
|
+
}
|
|
223
|
+
// Clean up user data directory
|
|
224
|
+
if (this.userDataDir && fs.existsSync(this.userDataDir)) {
|
|
225
|
+
try {
|
|
226
|
+
fs.rmSync(this.userDataDir, { recursive: true, force: true });
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
// Ignore cleanup errors
|
|
230
|
+
}
|
|
231
|
+
this.userDataDir = null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
exports.SentienceBrowser = SentienceBrowser;
|
|
236
|
+
//# 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/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|