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.
Files changed (62) hide show
  1. package/README.md +193 -0
  2. package/dist/actions.d.ts +9 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +113 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/browser.d.ts +24 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +236 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/cli.d.ts +5 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +158 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/expect.d.ts +16 -0
  15. package/dist/expect.d.ts.map +1 -0
  16. package/dist/expect.js +66 -0
  17. package/dist/expect.js.map +1 -0
  18. package/dist/generator.d.ts +16 -0
  19. package/dist/generator.d.ts.map +1 -0
  20. package/dist/generator.js +205 -0
  21. package/dist/generator.js.map +1 -0
  22. package/dist/index.d.ts +16 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +52 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/inspector.d.ts +13 -0
  27. package/dist/inspector.d.ts.map +1 -0
  28. package/dist/inspector.js +147 -0
  29. package/dist/inspector.js.map +1 -0
  30. package/dist/query.d.ts +8 -0
  31. package/dist/query.d.ts.map +1 -0
  32. package/dist/query.js +337 -0
  33. package/dist/query.js.map +1 -0
  34. package/dist/read.d.ts +40 -0
  35. package/dist/read.d.ts.map +1 -0
  36. package/dist/read.js +86 -0
  37. package/dist/read.js.map +1 -0
  38. package/dist/recorder.d.ts +44 -0
  39. package/dist/recorder.d.ts.map +1 -0
  40. package/dist/recorder.js +256 -0
  41. package/dist/recorder.js.map +1 -0
  42. package/dist/screenshot.d.ts +17 -0
  43. package/dist/screenshot.d.ts.map +1 -0
  44. package/dist/screenshot.js +37 -0
  45. package/dist/screenshot.js.map +1 -0
  46. package/dist/snapshot.d.ts +20 -0
  47. package/dist/snapshot.d.ts.map +1 -0
  48. package/dist/snapshot.js +101 -0
  49. package/dist/snapshot.js.map +1 -0
  50. package/dist/types.d.ts +71 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +6 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/wait.d.ts +7 -0
  55. package/dist/wait.d.ts.map +1 -0
  56. package/dist/wait.js +37 -0
  57. package/dist/wait.js.map +1 -0
  58. package/package.json +58 -0
  59. package/spec/README.md +72 -0
  60. package/spec/SNAPSHOT_V1.md +208 -0
  61. package/spec/sdk-types.md +259 -0
  62. 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"}
@@ -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"}
@@ -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,5 @@
1
+ /**
2
+ * CLI commands for Sentience SDK
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;GAEG"}