agent-browser 0.0.0 → 0.1.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 (54) hide show
  1. package/.prettierrc +7 -0
  2. package/LICENSE +201 -0
  3. package/README.md +274 -1
  4. package/bin/agent-browser +2 -0
  5. package/dist/actions.d.ts +7 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +1138 -0
  8. package/dist/actions.js.map +1 -0
  9. package/dist/browser.d.ts +232 -0
  10. package/dist/browser.d.ts.map +1 -0
  11. package/dist/browser.js +477 -0
  12. package/dist/browser.js.map +1 -0
  13. package/dist/browser.test.d.ts +2 -0
  14. package/dist/browser.test.d.ts.map +1 -0
  15. package/dist/browser.test.js +136 -0
  16. package/dist/browser.test.js.map +1 -0
  17. package/dist/client.d.ts +17 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +133 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/daemon.d.ts +29 -0
  22. package/dist/daemon.d.ts.map +1 -0
  23. package/dist/daemon.js +165 -0
  24. package/dist/daemon.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +1158 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/protocol.d.ts +26 -0
  30. package/dist/protocol.d.ts.map +1 -0
  31. package/dist/protocol.js +717 -0
  32. package/dist/protocol.js.map +1 -0
  33. package/dist/protocol.test.d.ts +2 -0
  34. package/dist/protocol.test.d.ts.map +1 -0
  35. package/dist/protocol.test.js +176 -0
  36. package/dist/protocol.test.js.map +1 -0
  37. package/dist/types.d.ts +604 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +2 -0
  40. package/dist/types.js.map +1 -0
  41. package/package.json +39 -8
  42. package/scripts/postinstall.js +17 -0
  43. package/src/actions.ts +1658 -0
  44. package/src/browser.test.ts +157 -0
  45. package/src/browser.ts +586 -0
  46. package/src/client.ts +150 -0
  47. package/src/daemon.ts +187 -0
  48. package/src/index.ts +1180 -0
  49. package/src/protocol.test.ts +216 -0
  50. package/src/protocol.ts +848 -0
  51. package/src/types.ts +913 -0
  52. package/tsconfig.json +19 -0
  53. package/vitest.config.ts +9 -0
  54. package/index.js +0 -2
@@ -0,0 +1,477 @@
1
+ import { chromium, firefox, webkit, devices, } from 'playwright-core';
2
+ /**
3
+ * Manages the Playwright browser lifecycle with multiple tabs/windows
4
+ */
5
+ export class BrowserManager {
6
+ browser = null;
7
+ contexts = [];
8
+ pages = [];
9
+ activePageIndex = 0;
10
+ activeFrame = null;
11
+ dialogHandler = null;
12
+ trackedRequests = [];
13
+ routes = new Map();
14
+ consoleMessages = [];
15
+ pageErrors = [];
16
+ isRecordingHar = false;
17
+ /**
18
+ * Check if browser is launched
19
+ */
20
+ isLaunched() {
21
+ return this.browser !== null;
22
+ }
23
+ /**
24
+ * Get the current active page, throws if not launched
25
+ */
26
+ getPage() {
27
+ if (this.pages.length === 0) {
28
+ throw new Error('Browser not launched. Call launch first.');
29
+ }
30
+ return this.pages[this.activePageIndex];
31
+ }
32
+ /**
33
+ * Get the current frame (or page's main frame if no frame is selected)
34
+ */
35
+ getFrame() {
36
+ if (this.activeFrame) {
37
+ return this.activeFrame;
38
+ }
39
+ return this.getPage().mainFrame();
40
+ }
41
+ /**
42
+ * Switch to a frame by selector, name, or URL
43
+ */
44
+ async switchToFrame(options) {
45
+ const page = this.getPage();
46
+ if (options.selector) {
47
+ const frameElement = await page.$(options.selector);
48
+ if (!frameElement) {
49
+ throw new Error(`Frame not found: ${options.selector}`);
50
+ }
51
+ const frame = await frameElement.contentFrame();
52
+ if (!frame) {
53
+ throw new Error(`Element is not a frame: ${options.selector}`);
54
+ }
55
+ this.activeFrame = frame;
56
+ }
57
+ else if (options.name) {
58
+ const frame = page.frame({ name: options.name });
59
+ if (!frame) {
60
+ throw new Error(`Frame not found with name: ${options.name}`);
61
+ }
62
+ this.activeFrame = frame;
63
+ }
64
+ else if (options.url) {
65
+ const frame = page.frame({ url: options.url });
66
+ if (!frame) {
67
+ throw new Error(`Frame not found with URL: ${options.url}`);
68
+ }
69
+ this.activeFrame = frame;
70
+ }
71
+ }
72
+ /**
73
+ * Switch back to main frame
74
+ */
75
+ switchToMainFrame() {
76
+ this.activeFrame = null;
77
+ }
78
+ /**
79
+ * Set up dialog handler
80
+ */
81
+ setDialogHandler(response, promptText) {
82
+ const page = this.getPage();
83
+ // Remove existing handler if any
84
+ if (this.dialogHandler) {
85
+ page.removeListener('dialog', this.dialogHandler);
86
+ }
87
+ this.dialogHandler = async (dialog) => {
88
+ if (response === 'accept') {
89
+ await dialog.accept(promptText);
90
+ }
91
+ else {
92
+ await dialog.dismiss();
93
+ }
94
+ };
95
+ page.on('dialog', this.dialogHandler);
96
+ }
97
+ /**
98
+ * Clear dialog handler
99
+ */
100
+ clearDialogHandler() {
101
+ if (this.dialogHandler) {
102
+ const page = this.getPage();
103
+ page.removeListener('dialog', this.dialogHandler);
104
+ this.dialogHandler = null;
105
+ }
106
+ }
107
+ /**
108
+ * Start tracking requests
109
+ */
110
+ startRequestTracking() {
111
+ const page = this.getPage();
112
+ page.on('request', (request) => {
113
+ this.trackedRequests.push({
114
+ url: request.url(),
115
+ method: request.method(),
116
+ headers: request.headers(),
117
+ timestamp: Date.now(),
118
+ resourceType: request.resourceType(),
119
+ });
120
+ });
121
+ }
122
+ /**
123
+ * Get tracked requests
124
+ */
125
+ getRequests(filter) {
126
+ if (filter) {
127
+ return this.trackedRequests.filter((r) => r.url.includes(filter));
128
+ }
129
+ return this.trackedRequests;
130
+ }
131
+ /**
132
+ * Clear tracked requests
133
+ */
134
+ clearRequests() {
135
+ this.trackedRequests = [];
136
+ }
137
+ /**
138
+ * Add a route to intercept requests
139
+ */
140
+ async addRoute(url, options) {
141
+ const page = this.getPage();
142
+ const handler = async (route) => {
143
+ if (options.abort) {
144
+ await route.abort();
145
+ }
146
+ else if (options.response) {
147
+ await route.fulfill({
148
+ status: options.response.status ?? 200,
149
+ body: options.response.body ?? '',
150
+ contentType: options.response.contentType ?? 'text/plain',
151
+ headers: options.response.headers,
152
+ });
153
+ }
154
+ else {
155
+ await route.continue();
156
+ }
157
+ };
158
+ this.routes.set(url, handler);
159
+ await page.route(url, handler);
160
+ }
161
+ /**
162
+ * Remove a route
163
+ */
164
+ async removeRoute(url) {
165
+ const page = this.getPage();
166
+ if (url) {
167
+ const handler = this.routes.get(url);
168
+ if (handler) {
169
+ await page.unroute(url, handler);
170
+ this.routes.delete(url);
171
+ }
172
+ }
173
+ else {
174
+ // Remove all routes
175
+ for (const [routeUrl, handler] of this.routes) {
176
+ await page.unroute(routeUrl, handler);
177
+ }
178
+ this.routes.clear();
179
+ }
180
+ }
181
+ /**
182
+ * Set geolocation
183
+ */
184
+ async setGeolocation(latitude, longitude, accuracy) {
185
+ const context = this.contexts[0];
186
+ if (context) {
187
+ await context.setGeolocation({ latitude, longitude, accuracy });
188
+ }
189
+ }
190
+ /**
191
+ * Set permissions
192
+ */
193
+ async setPermissions(permissions, grant) {
194
+ const context = this.contexts[0];
195
+ if (context) {
196
+ if (grant) {
197
+ await context.grantPermissions(permissions);
198
+ }
199
+ else {
200
+ await context.clearPermissions();
201
+ }
202
+ }
203
+ }
204
+ /**
205
+ * Set viewport
206
+ */
207
+ async setViewport(width, height) {
208
+ const page = this.getPage();
209
+ await page.setViewportSize({ width, height });
210
+ }
211
+ /**
212
+ * Get device descriptor
213
+ */
214
+ getDevice(deviceName) {
215
+ return devices[deviceName];
216
+ }
217
+ /**
218
+ * List available devices
219
+ */
220
+ listDevices() {
221
+ return Object.keys(devices);
222
+ }
223
+ /**
224
+ * Start console message tracking
225
+ */
226
+ startConsoleTracking() {
227
+ const page = this.getPage();
228
+ page.on('console', (msg) => {
229
+ this.consoleMessages.push({
230
+ type: msg.type(),
231
+ text: msg.text(),
232
+ timestamp: Date.now(),
233
+ });
234
+ });
235
+ }
236
+ /**
237
+ * Get console messages
238
+ */
239
+ getConsoleMessages() {
240
+ return this.consoleMessages;
241
+ }
242
+ /**
243
+ * Clear console messages
244
+ */
245
+ clearConsoleMessages() {
246
+ this.consoleMessages = [];
247
+ }
248
+ /**
249
+ * Start error tracking
250
+ */
251
+ startErrorTracking() {
252
+ const page = this.getPage();
253
+ page.on('pageerror', (error) => {
254
+ this.pageErrors.push({
255
+ message: error.message,
256
+ timestamp: Date.now(),
257
+ });
258
+ });
259
+ }
260
+ /**
261
+ * Get page errors
262
+ */
263
+ getPageErrors() {
264
+ return this.pageErrors;
265
+ }
266
+ /**
267
+ * Clear page errors
268
+ */
269
+ clearPageErrors() {
270
+ this.pageErrors = [];
271
+ }
272
+ /**
273
+ * Start HAR recording
274
+ */
275
+ async startHarRecording() {
276
+ // HAR is started at context level, flag for tracking
277
+ this.isRecordingHar = true;
278
+ }
279
+ /**
280
+ * Check if HAR recording
281
+ */
282
+ isHarRecording() {
283
+ return this.isRecordingHar;
284
+ }
285
+ /**
286
+ * Set offline mode
287
+ */
288
+ async setOffline(offline) {
289
+ const context = this.contexts[0];
290
+ if (context) {
291
+ await context.setOffline(offline);
292
+ }
293
+ }
294
+ /**
295
+ * Set extra HTTP headers
296
+ */
297
+ async setExtraHeaders(headers) {
298
+ const context = this.contexts[0];
299
+ if (context) {
300
+ await context.setExtraHTTPHeaders(headers);
301
+ }
302
+ }
303
+ /**
304
+ * Start tracing
305
+ */
306
+ async startTracing(options) {
307
+ const context = this.contexts[0];
308
+ if (context) {
309
+ await context.tracing.start({
310
+ screenshots: options.screenshots ?? true,
311
+ snapshots: options.snapshots ?? true,
312
+ });
313
+ }
314
+ }
315
+ /**
316
+ * Stop tracing and save
317
+ */
318
+ async stopTracing(path) {
319
+ const context = this.contexts[0];
320
+ if (context) {
321
+ await context.tracing.stop({ path });
322
+ }
323
+ }
324
+ /**
325
+ * Save storage state (cookies, localStorage, etc.)
326
+ */
327
+ async saveStorageState(path) {
328
+ const context = this.contexts[0];
329
+ if (context) {
330
+ await context.storageState({ path });
331
+ }
332
+ }
333
+ /**
334
+ * Get all pages
335
+ */
336
+ getPages() {
337
+ return this.pages;
338
+ }
339
+ /**
340
+ * Get current page index
341
+ */
342
+ getActiveIndex() {
343
+ return this.activePageIndex;
344
+ }
345
+ /**
346
+ * Get the current browser instance
347
+ */
348
+ getBrowser() {
349
+ return this.browser;
350
+ }
351
+ /**
352
+ * Launch the browser with the specified options
353
+ */
354
+ async launch(options) {
355
+ // Close existing browser if any
356
+ if (this.browser) {
357
+ await this.close();
358
+ }
359
+ // Select browser type
360
+ const browserType = options.browser ?? 'chromium';
361
+ const launcher = browserType === 'firefox' ? firefox : browserType === 'webkit' ? webkit : chromium;
362
+ // Launch browser
363
+ this.browser = await launcher.launch({
364
+ headless: options.headless ?? true,
365
+ });
366
+ // Create context with viewport
367
+ const context = await this.browser.newContext({
368
+ viewport: options.viewport ?? { width: 1280, height: 720 },
369
+ });
370
+ // Set default timeout to 10 seconds (Playwright default is 30s)
371
+ context.setDefaultTimeout(10000);
372
+ this.contexts.push(context);
373
+ // Create initial page
374
+ const page = await context.newPage();
375
+ this.pages.push(page);
376
+ this.activePageIndex = 0;
377
+ }
378
+ /**
379
+ * Create a new tab in the current context
380
+ */
381
+ async newTab() {
382
+ if (!this.browser || this.contexts.length === 0) {
383
+ throw new Error('Browser not launched');
384
+ }
385
+ const context = this.contexts[0]; // Use first context for tabs
386
+ const page = await context.newPage();
387
+ this.pages.push(page);
388
+ this.activePageIndex = this.pages.length - 1;
389
+ return { index: this.activePageIndex, total: this.pages.length };
390
+ }
391
+ /**
392
+ * Create a new window (new context)
393
+ */
394
+ async newWindow(viewport) {
395
+ if (!this.browser) {
396
+ throw new Error('Browser not launched');
397
+ }
398
+ const context = await this.browser.newContext({
399
+ viewport: viewport ?? { width: 1280, height: 720 },
400
+ });
401
+ context.setDefaultTimeout(10000);
402
+ this.contexts.push(context);
403
+ const page = await context.newPage();
404
+ this.pages.push(page);
405
+ this.activePageIndex = this.pages.length - 1;
406
+ return { index: this.activePageIndex, total: this.pages.length };
407
+ }
408
+ /**
409
+ * Switch to a specific tab/page by index
410
+ */
411
+ switchTo(index) {
412
+ if (index < 0 || index >= this.pages.length) {
413
+ throw new Error(`Invalid tab index: ${index}. Available: 0-${this.pages.length - 1}`);
414
+ }
415
+ this.activePageIndex = index;
416
+ const page = this.pages[index];
417
+ return {
418
+ index: this.activePageIndex,
419
+ url: page.url(),
420
+ title: '', // Title requires async, will be fetched separately
421
+ };
422
+ }
423
+ /**
424
+ * Close a specific tab/page
425
+ */
426
+ async closeTab(index) {
427
+ const targetIndex = index ?? this.activePageIndex;
428
+ if (targetIndex < 0 || targetIndex >= this.pages.length) {
429
+ throw new Error(`Invalid tab index: ${targetIndex}`);
430
+ }
431
+ if (this.pages.length === 1) {
432
+ throw new Error('Cannot close the last tab. Use "close" to close the browser.');
433
+ }
434
+ const page = this.pages[targetIndex];
435
+ await page.close();
436
+ this.pages.splice(targetIndex, 1);
437
+ // Adjust active index if needed
438
+ if (this.activePageIndex >= this.pages.length) {
439
+ this.activePageIndex = this.pages.length - 1;
440
+ }
441
+ else if (this.activePageIndex > targetIndex) {
442
+ this.activePageIndex--;
443
+ }
444
+ return { closed: targetIndex, remaining: this.pages.length };
445
+ }
446
+ /**
447
+ * List all tabs with their info
448
+ */
449
+ async listTabs() {
450
+ const tabs = await Promise.all(this.pages.map(async (page, index) => ({
451
+ index,
452
+ url: page.url(),
453
+ title: await page.title().catch(() => ''),
454
+ active: index === this.activePageIndex,
455
+ })));
456
+ return tabs;
457
+ }
458
+ /**
459
+ * Close the browser and clean up
460
+ */
461
+ async close() {
462
+ for (const page of this.pages) {
463
+ await page.close().catch(() => { });
464
+ }
465
+ this.pages = [];
466
+ for (const context of this.contexts) {
467
+ await context.close().catch(() => { });
468
+ }
469
+ this.contexts = [];
470
+ if (this.browser) {
471
+ await this.browser.close().catch(() => { });
472
+ this.browser = null;
473
+ }
474
+ this.activePageIndex = 0;
475
+ }
476
+ }
477
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.test.d.ts","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,136 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import { BrowserManager } from './browser.js';
3
+ describe('BrowserManager', () => {
4
+ let browser;
5
+ beforeAll(async () => {
6
+ browser = new BrowserManager();
7
+ await browser.launch({ headless: true });
8
+ });
9
+ afterAll(async () => {
10
+ await browser.close();
11
+ });
12
+ describe('launch and close', () => {
13
+ it('should report as launched', () => {
14
+ expect(browser.isLaunched()).toBe(true);
15
+ });
16
+ it('should have a page', () => {
17
+ const page = browser.getPage();
18
+ expect(page).toBeDefined();
19
+ });
20
+ });
21
+ describe('navigation', () => {
22
+ it('should navigate to URL', async () => {
23
+ const page = browser.getPage();
24
+ await page.goto('https://example.com');
25
+ expect(page.url()).toBe('https://example.com/');
26
+ });
27
+ it('should get page title', async () => {
28
+ const page = browser.getPage();
29
+ const title = await page.title();
30
+ expect(title).toBe('Example Domain');
31
+ });
32
+ });
33
+ describe('element interaction', () => {
34
+ it('should find element by selector', async () => {
35
+ const page = browser.getPage();
36
+ const heading = await page.locator('h1').textContent();
37
+ expect(heading).toBe('Example Domain');
38
+ });
39
+ it('should check element visibility', async () => {
40
+ const page = browser.getPage();
41
+ const isVisible = await page.locator('h1').isVisible();
42
+ expect(isVisible).toBe(true);
43
+ });
44
+ it('should count elements', async () => {
45
+ const page = browser.getPage();
46
+ const count = await page.locator('p').count();
47
+ expect(count).toBeGreaterThan(0);
48
+ });
49
+ });
50
+ describe('screenshots', () => {
51
+ it('should take screenshot as buffer', async () => {
52
+ const page = browser.getPage();
53
+ const buffer = await page.screenshot();
54
+ expect(buffer).toBeInstanceOf(Buffer);
55
+ expect(buffer.length).toBeGreaterThan(0);
56
+ });
57
+ });
58
+ describe('evaluate', () => {
59
+ it('should evaluate JavaScript', async () => {
60
+ const page = browser.getPage();
61
+ const result = await page.evaluate(() => document.title);
62
+ expect(result).toBe('Example Domain');
63
+ });
64
+ it('should evaluate with arguments', async () => {
65
+ const page = browser.getPage();
66
+ const result = await page.evaluate((x) => x * 2, 5);
67
+ expect(result).toBe(10);
68
+ });
69
+ });
70
+ describe('tabs', () => {
71
+ it('should create new tab', async () => {
72
+ const result = await browser.newTab();
73
+ expect(result.index).toBe(1);
74
+ expect(result.total).toBe(2);
75
+ });
76
+ it('should list tabs', async () => {
77
+ const tabs = await browser.listTabs();
78
+ expect(tabs.length).toBe(2);
79
+ });
80
+ it('should close tab', async () => {
81
+ // Switch to second tab and close it
82
+ const page = browser.getPage();
83
+ const tabs = await browser.listTabs();
84
+ if (tabs.length > 1) {
85
+ const result = await browser.closeTab(1);
86
+ expect(result.remaining).toBe(1);
87
+ }
88
+ });
89
+ });
90
+ describe('context operations', () => {
91
+ it('should get cookies from context', async () => {
92
+ const page = browser.getPage();
93
+ const cookies = await page.context().cookies();
94
+ expect(Array.isArray(cookies)).toBe(true);
95
+ });
96
+ it('should set and get cookies', async () => {
97
+ const page = browser.getPage();
98
+ const context = page.context();
99
+ await context.addCookies([{ name: 'test', value: 'value', url: 'https://example.com' }]);
100
+ const cookies = await context.cookies();
101
+ const testCookie = cookies.find((c) => c.name === 'test');
102
+ expect(testCookie?.value).toBe('value');
103
+ });
104
+ it('should clear cookies', async () => {
105
+ const page = browser.getPage();
106
+ const context = page.context();
107
+ await context.clearCookies();
108
+ const cookies = await context.cookies();
109
+ expect(cookies.length).toBe(0);
110
+ });
111
+ });
112
+ describe('storage via evaluate', () => {
113
+ it('should set and get localStorage', async () => {
114
+ const page = browser.getPage();
115
+ await page.evaluate(() => localStorage.setItem('testKey', 'testValue'));
116
+ const value = await page.evaluate(() => localStorage.getItem('testKey'));
117
+ expect(value).toBe('testValue');
118
+ });
119
+ it('should clear localStorage', async () => {
120
+ const page = browser.getPage();
121
+ await page.evaluate(() => localStorage.clear());
122
+ const value = await page.evaluate(() => localStorage.getItem('testKey'));
123
+ expect(value).toBeNull();
124
+ });
125
+ });
126
+ describe('viewport', () => {
127
+ it('should set viewport', async () => {
128
+ await browser.setViewport(1920, 1080);
129
+ const page = browser.getPage();
130
+ const size = page.viewportSize();
131
+ expect(size?.width).toBe(1920);
132
+ expect(size?.height).toBe(1080);
133
+ });
134
+ });
135
+ });
136
+ //# sourceMappingURL=browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,OAAuB,CAAC;IAE5B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAC/B,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAChC,oCAAoC;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACnC,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { setSession, getSession } from './daemon.js';
2
+ import type { Response } from './types.js';
3
+ export declare function setDebug(enabled: boolean): void;
4
+ export { setSession, getSession };
5
+ /**
6
+ * Ensure daemon is running, start if not
7
+ */
8
+ export declare function ensureDaemon(): Promise<void>;
9
+ /**
10
+ * Send a command to the daemon
11
+ */
12
+ export declare function sendCommand(command: Record<string, unknown>): Promise<Response>;
13
+ /**
14
+ * Send a command, ensuring daemon is running first
15
+ */
16
+ export declare function send(command: Record<string, unknown>): Promise<Response>;
17
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkC,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE/C;AAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAyBlC;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBlD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkErF;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAK9E"}