sentienceapi 0.90.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE.md +43 -0
  2. package/README.md +946 -0
  3. package/dist/actions.d.ts +54 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +349 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/agent.d.ts +157 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +437 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/browser.d.ts +46 -0
  12. package/dist/browser.d.ts.map +1 -0
  13. package/dist/browser.js +622 -0
  14. package/dist/browser.js.map +1 -0
  15. package/dist/cli.d.ts +5 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +174 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/conversational-agent.d.ts +123 -0
  20. package/dist/conversational-agent.d.ts.map +1 -0
  21. package/dist/conversational-agent.js +327 -0
  22. package/dist/conversational-agent.js.map +1 -0
  23. package/dist/expect.d.ts +16 -0
  24. package/dist/expect.d.ts.map +1 -0
  25. package/dist/expect.js +66 -0
  26. package/dist/expect.js.map +1 -0
  27. package/dist/generator.d.ts +16 -0
  28. package/dist/generator.d.ts.map +1 -0
  29. package/dist/generator.js +205 -0
  30. package/dist/generator.js.map +1 -0
  31. package/dist/index.d.ts +21 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +70 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/inspector.d.ts +13 -0
  36. package/dist/inspector.d.ts.map +1 -0
  37. package/dist/inspector.js +147 -0
  38. package/dist/inspector.js.map +1 -0
  39. package/dist/llm-provider.d.ts +60 -0
  40. package/dist/llm-provider.d.ts.map +1 -0
  41. package/dist/llm-provider.js +106 -0
  42. package/dist/llm-provider.js.map +1 -0
  43. package/dist/query.d.ts +8 -0
  44. package/dist/query.d.ts.map +1 -0
  45. package/dist/query.js +337 -0
  46. package/dist/query.js.map +1 -0
  47. package/dist/read.d.ts +40 -0
  48. package/dist/read.d.ts.map +1 -0
  49. package/dist/read.js +86 -0
  50. package/dist/read.js.map +1 -0
  51. package/dist/recorder.d.ts +44 -0
  52. package/dist/recorder.d.ts.map +1 -0
  53. package/dist/recorder.js +256 -0
  54. package/dist/recorder.js.map +1 -0
  55. package/dist/screenshot.d.ts +17 -0
  56. package/dist/screenshot.d.ts.map +1 -0
  57. package/dist/screenshot.js +37 -0
  58. package/dist/screenshot.js.map +1 -0
  59. package/dist/snapshot.d.ts +23 -0
  60. package/dist/snapshot.d.ts.map +1 -0
  61. package/dist/snapshot.js +187 -0
  62. package/dist/snapshot.js.map +1 -0
  63. package/dist/tracing/cloud-sink.d.ts +74 -0
  64. package/dist/tracing/cloud-sink.d.ts.map +1 -0
  65. package/dist/tracing/cloud-sink.js +262 -0
  66. package/dist/tracing/cloud-sink.js.map +1 -0
  67. package/dist/tracing/index.d.ts +12 -0
  68. package/dist/tracing/index.d.ts.map +1 -0
  69. package/dist/tracing/index.js +28 -0
  70. package/dist/tracing/index.js.map +1 -0
  71. package/dist/tracing/jsonl-sink.d.ts +41 -0
  72. package/dist/tracing/jsonl-sink.d.ts.map +1 -0
  73. package/dist/tracing/jsonl-sink.js +168 -0
  74. package/dist/tracing/jsonl-sink.js.map +1 -0
  75. package/dist/tracing/sink.d.ts +24 -0
  76. package/dist/tracing/sink.d.ts.map +1 -0
  77. package/dist/tracing/sink.js +15 -0
  78. package/dist/tracing/sink.js.map +1 -0
  79. package/dist/tracing/tracer-factory.d.ts +57 -0
  80. package/dist/tracing/tracer-factory.d.ts.map +1 -0
  81. package/dist/tracing/tracer-factory.js +274 -0
  82. package/dist/tracing/tracer-factory.js.map +1 -0
  83. package/dist/tracing/tracer.d.ts +74 -0
  84. package/dist/tracing/tracer.d.ts.map +1 -0
  85. package/dist/tracing/tracer.js +131 -0
  86. package/dist/tracing/tracer.js.map +1 -0
  87. package/dist/tracing/types.d.ts +63 -0
  88. package/dist/tracing/types.d.ts.map +1 -0
  89. package/dist/tracing/types.js +8 -0
  90. package/dist/tracing/types.js.map +1 -0
  91. package/dist/types.d.ts +110 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +6 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils.d.ts +29 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +74 -0
  98. package/dist/utils.js.map +1 -0
  99. package/dist/wait.d.ts +20 -0
  100. package/dist/wait.d.ts.map +1 -0
  101. package/dist/wait.js +63 -0
  102. package/dist/wait.js.map +1 -0
  103. package/package.json +72 -0
  104. package/spec/README.md +72 -0
  105. package/spec/SNAPSHOT_V1.md +208 -0
  106. package/spec/sdk-types.md +259 -0
  107. package/spec/snapshot.schema.json +148 -0
package/dist/agent.js ADDED
@@ -0,0 +1,437 @@
1
+ "use strict";
2
+ /**
3
+ * Sentience Agent: High-level automation agent using LLM + SDK
4
+ * Implements observe-think-act loop for natural language commands
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SentienceAgent = void 0;
8
+ const snapshot_1 = require("./snapshot");
9
+ const actions_1 = require("./actions");
10
+ const crypto_1 = require("crypto");
11
+ /**
12
+ * High-level agent that combines Sentience SDK with any LLM provider.
13
+ *
14
+ * Uses observe-think-act loop to execute natural language commands:
15
+ * 1. OBSERVE: Get snapshot of current page state
16
+ * 2. THINK: Query LLM to decide next action
17
+ * 3. ACT: Execute action using SDK
18
+ *
19
+ * Example:
20
+ * ```typescript
21
+ * import { SentienceBrowser, SentienceAgent, OpenAIProvider } from 'sentience-ts';
22
+ *
23
+ * const browser = await SentienceBrowser.create({ apiKey: 'sentience_key' });
24
+ * const llm = new OpenAIProvider('openai_key', 'gpt-4o');
25
+ * const agent = new SentienceAgent(browser, llm);
26
+ *
27
+ * await browser.getPage().goto('https://google.com');
28
+ * await agent.act('Click the search box');
29
+ * await agent.act("Type 'magic mouse' into the search field");
30
+ * await agent.act('Press Enter key');
31
+ * ```
32
+ */
33
+ class SentienceAgent {
34
+ /**
35
+ * Initialize Sentience Agent
36
+ * @param browser - SentienceBrowser instance
37
+ * @param llm - LLM provider (OpenAIProvider, AnthropicProvider, etc.)
38
+ * @param snapshotLimit - Maximum elements to include in context (default: 50)
39
+ * @param verbose - Print execution logs (default: true)
40
+ * @param tracer - Optional tracer for recording execution (default: undefined)
41
+ */
42
+ constructor(browser, llm, snapshotLimit = 50, verbose = true, tracer) {
43
+ this.browser = browser;
44
+ this.llm = llm;
45
+ this.snapshotLimit = snapshotLimit;
46
+ this.verbose = verbose;
47
+ this.tracer = tracer;
48
+ this.stepCount = 0;
49
+ this.history = [];
50
+ this.tokenUsage = {
51
+ totalPromptTokens: 0,
52
+ totalCompletionTokens: 0,
53
+ totalTokens: 0,
54
+ byAction: []
55
+ };
56
+ }
57
+ /**
58
+ * Execute a high-level goal using observe → think → act loop
59
+ * @param goal - Natural language instruction (e.g., "Click the Sign In button")
60
+ * @param maxRetries - Number of retries on failure (default: 2)
61
+ * @param snapshotOptions - Optional snapshot parameters (limit, filter, etc.)
62
+ * @returns Result dict with status, action_taken, reasoning, and execution data
63
+ *
64
+ * Example:
65
+ * ```typescript
66
+ * const result = await agent.act('Click the search box');
67
+ * console.log(result);
68
+ * // { success: true, action: 'click', elementId: 42, ... }
69
+ * ```
70
+ */
71
+ async act(goal, maxRetries = 2, snapshotOptions) {
72
+ if (this.verbose) {
73
+ console.log('\n' + '='.repeat(70));
74
+ console.log(`🤖 Agent Goal: ${goal}`);
75
+ console.log('='.repeat(70));
76
+ }
77
+ // Increment step counter and generate step ID
78
+ this.stepCount += 1;
79
+ const stepId = (0, crypto_1.randomUUID)();
80
+ // Emit step_start event
81
+ if (this.tracer) {
82
+ const currentUrl = this.browser.getPage().url();
83
+ this.tracer.emitStepStart(stepId, this.stepCount, goal, 0, currentUrl);
84
+ }
85
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
86
+ try {
87
+ // 1. OBSERVE: Get refined semantic snapshot
88
+ const startTime = Date.now();
89
+ const snapOpts = {
90
+ ...snapshotOptions,
91
+ goal: snapshotOptions?.goal ?? goal,
92
+ limit: snapshotOptions?.limit || this.snapshotLimit,
93
+ };
94
+ const snap = await (0, snapshot_1.snapshot)(this.browser, snapOpts);
95
+ if (snap.status !== 'success') {
96
+ throw new Error(`Snapshot failed: ${snap.error}`);
97
+ }
98
+ // Apply element filtering based on goal
99
+ const filteredElements = this.filterElements(snap, goal);
100
+ // Create filtered snapshot
101
+ const filteredSnap = {
102
+ ...snap,
103
+ elements: filteredElements
104
+ };
105
+ // Emit snapshot event
106
+ if (this.tracer) {
107
+ this.tracer.emit('snapshot', {
108
+ url: filteredSnap.url,
109
+ elements: filteredSnap.elements.slice(0, 50).map(el => ({
110
+ id: el.id,
111
+ bbox: el.bbox,
112
+ role: el.role,
113
+ text: el.text?.substring(0, 100),
114
+ }))
115
+ }, stepId);
116
+ }
117
+ // 2. GROUND: Format elements for LLM context
118
+ const context = this.buildContext(filteredSnap, goal);
119
+ // 3. THINK: Query LLM for next action
120
+ const llmResponse = await this.queryLLM(context, goal);
121
+ if (this.verbose) {
122
+ console.log(`🧠 LLM Decision: ${llmResponse.content}`);
123
+ }
124
+ // Emit LLM response event
125
+ if (this.tracer) {
126
+ this.tracer.emit('llm_response', {
127
+ model: llmResponse.modelName,
128
+ prompt_tokens: llmResponse.promptTokens,
129
+ completion_tokens: llmResponse.completionTokens,
130
+ response_text: llmResponse.content.substring(0, 500),
131
+ }, stepId);
132
+ }
133
+ // Track token usage
134
+ this.trackTokens(goal, llmResponse);
135
+ // Parse action from LLM response
136
+ const actionStr = llmResponse.content.trim();
137
+ // 4. EXECUTE: Parse and run action
138
+ const result = await this.executeAction(actionStr, filteredSnap);
139
+ const durationMs = Date.now() - startTime;
140
+ result.durationMs = durationMs;
141
+ result.attempt = attempt;
142
+ result.goal = goal;
143
+ // Emit action event
144
+ if (this.tracer) {
145
+ this.tracer.emit('action', {
146
+ action_type: result.action,
147
+ element_id: result.elementId,
148
+ text: result.text,
149
+ key: result.key,
150
+ success: result.success,
151
+ }, stepId);
152
+ }
153
+ // 5. RECORD: Track history
154
+ this.history.push({
155
+ goal,
156
+ action: actionStr,
157
+ result,
158
+ success: result.success,
159
+ attempt,
160
+ durationMs
161
+ });
162
+ if (this.verbose) {
163
+ const status = result.success ? '✅' : '❌';
164
+ console.log(`${status} Completed in ${durationMs}ms`);
165
+ }
166
+ return result;
167
+ }
168
+ catch (error) {
169
+ // Emit error event
170
+ if (this.tracer) {
171
+ this.tracer.emitError(stepId, error.message, attempt);
172
+ }
173
+ if (attempt < maxRetries) {
174
+ if (this.verbose) {
175
+ console.log(`⚠️ Retry ${attempt + 1}/${maxRetries}: ${error.message}`);
176
+ }
177
+ await new Promise(resolve => setTimeout(resolve, 1000));
178
+ continue;
179
+ }
180
+ else {
181
+ const errorResult = {
182
+ success: false,
183
+ goal,
184
+ error: error.message,
185
+ attempt,
186
+ durationMs: 0
187
+ };
188
+ this.history.push(errorResult);
189
+ throw new Error(`Failed after ${maxRetries} retries: ${error.message}`);
190
+ }
191
+ }
192
+ }
193
+ throw new Error('Unexpected: loop should have returned or thrown');
194
+ }
195
+ /**
196
+ * Filter elements from snapshot based on goal context.
197
+ * Applies goal-based keyword matching to boost relevant elements and filters out irrelevant ones.
198
+ */
199
+ filterElements(snap, goal) {
200
+ let elements = snap.elements;
201
+ // If no goal provided, return all elements (up to limit)
202
+ if (!goal) {
203
+ return elements.slice(0, this.snapshotLimit);
204
+ }
205
+ const goalLower = goal.toLowerCase();
206
+ // Extract keywords from goal
207
+ const keywords = this.extractKeywords(goalLower);
208
+ // Boost elements matching goal keywords
209
+ const scoredElements = [];
210
+ for (const el of elements) {
211
+ let score = el.importance;
212
+ // Boost if element text matches goal
213
+ if (el.text && keywords.some(kw => el.text.toLowerCase().includes(kw))) {
214
+ score += 0.3;
215
+ }
216
+ // Boost if role matches goal intent
217
+ if (goalLower.includes('click') && el.visual_cues.is_clickable) {
218
+ score += 0.2;
219
+ }
220
+ if (goalLower.includes('type') && (el.role === 'textbox' || el.role === 'searchbox')) {
221
+ score += 0.2;
222
+ }
223
+ if (goalLower.includes('search')) {
224
+ // Filter out non-interactive elements for search tasks
225
+ if ((el.role === 'link' || el.role === 'img') && !el.visual_cues.is_primary) {
226
+ score -= 0.5;
227
+ }
228
+ }
229
+ scoredElements.push([score, el]);
230
+ }
231
+ // Re-sort by boosted score
232
+ scoredElements.sort((a, b) => b[0] - a[0]);
233
+ elements = scoredElements.map(([, el]) => el);
234
+ return elements.slice(0, this.snapshotLimit);
235
+ }
236
+ /**
237
+ * Extract meaningful keywords from goal text
238
+ */
239
+ extractKeywords(text) {
240
+ const stopwords = new Set([
241
+ 'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
242
+ 'of', 'with', 'by', 'from', 'as', 'is', 'was'
243
+ ]);
244
+ const words = text.split(/\s+/);
245
+ return words.filter(w => !stopwords.has(w) && w.length > 2);
246
+ }
247
+ /**
248
+ * Convert snapshot elements to token-efficient prompt string
249
+ * Format: [ID] <role> "text" {cues} @ (x,y) (Imp:score)
250
+ * Note: elements are already filtered by filterElements() in act()
251
+ */
252
+ buildContext(snap, goal) {
253
+ const lines = [];
254
+ for (const el of snap.elements) {
255
+ // Extract visual cues
256
+ const cues = [];
257
+ if (el.visual_cues.is_primary)
258
+ cues.push('PRIMARY');
259
+ if (el.visual_cues.is_clickable)
260
+ cues.push('CLICKABLE');
261
+ if (el.visual_cues.background_color_name) {
262
+ cues.push(`color:${el.visual_cues.background_color_name}`);
263
+ }
264
+ // Format element line
265
+ const cuesStr = cues.length > 0 ? ` {${cues.join(',')}}` : '';
266
+ const text = el.text || '';
267
+ const textPreview = text.length > 50 ? text.substring(0, 50) + '...' : text;
268
+ lines.push(`[${el.id}] <${el.role}> "${textPreview}"${cuesStr} ` +
269
+ `@ (${Math.floor(el.bbox.x)},${Math.floor(el.bbox.y)}) (Imp:${el.importance})`);
270
+ }
271
+ return lines.join('\n');
272
+ }
273
+ /**
274
+ * Query LLM with standardized prompt template
275
+ */
276
+ async queryLLM(domContext, goal) {
277
+ const systemPrompt = `You are an AI web automation agent.
278
+
279
+ GOAL: ${goal}
280
+
281
+ VISIBLE ELEMENTS (sorted by importance, max ${this.snapshotLimit}):
282
+ ${domContext}
283
+
284
+ VISUAL CUES EXPLAINED:
285
+ - {PRIMARY}: Main call-to-action element on the page
286
+ - {CLICKABLE}: Element is clickable
287
+ - {color:X}: Background color name
288
+
289
+ RESPONSE FORMAT:
290
+ Return ONLY the function call, no explanation or markdown.
291
+
292
+ Available actions:
293
+ - CLICK(id) - Click element by ID
294
+ - TYPE(id, "text") - Type text into element
295
+ - PRESS("key") - Press keyboard key (Enter, Escape, Tab, ArrowDown, etc)
296
+ - FINISH() - Task complete
297
+
298
+ Examples:
299
+ - CLICK(42)
300
+ - TYPE(15, "magic mouse")
301
+ - PRESS("Enter")
302
+ - FINISH()
303
+ `;
304
+ const userPrompt = 'What is the next step to achieve the goal?';
305
+ return await this.llm.generate(systemPrompt, userPrompt, { temperature: 0.0 });
306
+ }
307
+ /**
308
+ * Parse action string and execute SDK call
309
+ */
310
+ async executeAction(actionStr, snap) {
311
+ // Parse CLICK(42)
312
+ let match = actionStr.match(/CLICK\s*\(\s*(\d+)\s*\)/i);
313
+ if (match) {
314
+ const elementId = parseInt(match[1], 10);
315
+ const result = await (0, actions_1.click)(this.browser, elementId);
316
+ return {
317
+ success: result.success,
318
+ action: 'click',
319
+ elementId,
320
+ outcome: result.outcome,
321
+ urlChanged: result.url_changed,
322
+ durationMs: 0,
323
+ attempt: 0,
324
+ goal: ''
325
+ };
326
+ }
327
+ // Parse TYPE(42, "hello world")
328
+ match = actionStr.match(/TYPE\s*\(\s*(\d+)\s*,\s*["']([^"']*)["']\s*\)/i);
329
+ if (match) {
330
+ const elementId = parseInt(match[1], 10);
331
+ const text = match[2];
332
+ const result = await (0, actions_1.typeText)(this.browser, elementId, text);
333
+ return {
334
+ success: result.success,
335
+ action: 'type',
336
+ elementId,
337
+ text,
338
+ outcome: result.outcome,
339
+ durationMs: 0,
340
+ attempt: 0,
341
+ goal: ''
342
+ };
343
+ }
344
+ // Parse PRESS("Enter")
345
+ match = actionStr.match(/PRESS\s*\(\s*["']([^"']+)["']\s*\)/i);
346
+ if (match) {
347
+ const key = match[1];
348
+ const result = await (0, actions_1.press)(this.browser, key);
349
+ return {
350
+ success: result.success,
351
+ action: 'press',
352
+ key,
353
+ outcome: result.outcome,
354
+ durationMs: 0,
355
+ attempt: 0,
356
+ goal: ''
357
+ };
358
+ }
359
+ // Parse FINISH()
360
+ if (/FINISH\s*\(\s*\)/i.test(actionStr)) {
361
+ return {
362
+ success: true,
363
+ action: 'finish',
364
+ message: 'Task marked as complete',
365
+ durationMs: 0,
366
+ attempt: 0,
367
+ goal: ''
368
+ };
369
+ }
370
+ throw new Error(`Unknown action format: ${actionStr}\n` +
371
+ `Expected: CLICK(id), TYPE(id, "text"), PRESS("key"), or FINISH()`);
372
+ }
373
+ /**
374
+ * Track token usage for analytics
375
+ */
376
+ trackTokens(goal, llmResponse) {
377
+ if (llmResponse.promptTokens) {
378
+ this.tokenUsage.totalPromptTokens += llmResponse.promptTokens;
379
+ }
380
+ if (llmResponse.completionTokens) {
381
+ this.tokenUsage.totalCompletionTokens += llmResponse.completionTokens;
382
+ }
383
+ if (llmResponse.totalTokens) {
384
+ this.tokenUsage.totalTokens += llmResponse.totalTokens;
385
+ }
386
+ this.tokenUsage.byAction.push({
387
+ goal,
388
+ promptTokens: llmResponse.promptTokens,
389
+ completionTokens: llmResponse.completionTokens,
390
+ totalTokens: llmResponse.totalTokens,
391
+ model: llmResponse.modelName
392
+ });
393
+ }
394
+ /**
395
+ * Get token usage statistics
396
+ * @returns Dictionary with token usage breakdown
397
+ */
398
+ getTokenStats() {
399
+ return { ...this.tokenUsage };
400
+ }
401
+ /**
402
+ * Get execution history
403
+ * @returns List of all actions taken with results
404
+ */
405
+ getHistory() {
406
+ return [...this.history];
407
+ }
408
+ /**
409
+ * Clear execution history and reset token counters
410
+ */
411
+ clearHistory() {
412
+ this.history = [];
413
+ this.stepCount = 0;
414
+ this.tokenUsage = {
415
+ totalPromptTokens: 0,
416
+ totalCompletionTokens: 0,
417
+ totalTokens: 0,
418
+ byAction: []
419
+ };
420
+ }
421
+ /**
422
+ * Close the tracer and flush events to disk
423
+ */
424
+ async closeTracer() {
425
+ if (this.tracer) {
426
+ await this.tracer.close();
427
+ }
428
+ }
429
+ /**
430
+ * Get the tracer instance (if any)
431
+ */
432
+ getTracer() {
433
+ return this.tracer;
434
+ }
435
+ }
436
+ exports.SentienceAgent = SentienceAgent;
437
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Playwright browser harness with extension loading
3
+ */
4
+ import { BrowserContext, Page } from 'playwright';
5
+ import { StorageState } from './types';
6
+ export declare class SentienceBrowser {
7
+ private context;
8
+ private browser;
9
+ private page;
10
+ private extensionPath;
11
+ private userDataDir;
12
+ private _apiKey?;
13
+ private _apiUrl?;
14
+ private headless;
15
+ private _proxy?;
16
+ private _userDataDir?;
17
+ private _storageState?;
18
+ constructor(apiKey?: string, apiUrl?: string, headless?: boolean, proxy?: string, userDataDir?: string, storageState?: string | StorageState | object);
19
+ start(): Promise<void>;
20
+ goto(url: string): Promise<void>;
21
+ private waitForExtension;
22
+ getPage(): Page;
23
+ private _copyRecursive;
24
+ getApiKey(): string | undefined;
25
+ getApiUrl(): string | undefined;
26
+ /**
27
+ * Parse proxy connection string into Playwright format.
28
+ *
29
+ * @param proxyString - Standard format "http://username:password@host:port"
30
+ * or "socks5://user:pass@host:port"
31
+ * @returns Playwright proxy object or undefined if invalid
32
+ */
33
+ private parseProxy;
34
+ /**
35
+ * Inject storage state (cookies + localStorage) into browser context.
36
+ *
37
+ * @param storageState - Path to JSON file, StorageState object, or plain object
38
+ */
39
+ private injectStorageState;
40
+ /**
41
+ * Get the browser context (for utilities like saveStorageState)
42
+ */
43
+ getContext(): BrowserContext;
44
+ close(): Promise<void>;
45
+ }
46
+ //# 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,EAAY,cAAc,EAAE,IAAI,EAAW,MAAM,YAAY,CAAC;AAKrE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,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;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAiC;gBAGrD,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,OAAO,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM;IA4BzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6VtB,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;IAI/B;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAsClB;;;;OAIG;YACW,kBAAkB;IA0FhC;;OAEG;IACH,UAAU,IAAI,cAAc;IAOtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAmD7B"}