@monoes/monobrowse 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/dist/src/browser/action-builder/analyzer.d.ts +11 -0
  2. package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -0
  3. package/dist/src/browser/action-builder/analyzer.js +93 -0
  4. package/dist/src/browser/action-builder/analyzer.js.map +1 -0
  5. package/dist/src/browser/action-builder/types.d.ts +46 -0
  6. package/dist/src/browser/action-builder/types.d.ts.map +1 -0
  7. package/dist/src/browser/action-builder/types.js +2 -0
  8. package/dist/src/browser/action-builder/types.js.map +1 -0
  9. package/dist/src/browser/actions.d.ts +29 -0
  10. package/dist/src/browser/actions.d.ts.map +1 -0
  11. package/dist/src/browser/actions.js +398 -0
  12. package/dist/src/browser/actions.js.map +1 -0
  13. package/dist/src/browser/adapters/gemini.d.ts +3 -0
  14. package/dist/src/browser/adapters/gemini.d.ts.map +1 -0
  15. package/dist/src/browser/adapters/gemini.js +13 -0
  16. package/dist/src/browser/adapters/gemini.js.map +1 -0
  17. package/dist/src/browser/adapters/google.d.ts +3 -0
  18. package/dist/src/browser/adapters/google.d.ts.map +1 -0
  19. package/dist/src/browser/adapters/google.js +17 -0
  20. package/dist/src/browser/adapters/google.js.map +1 -0
  21. package/dist/src/browser/adapters/index.d.ts +15 -0
  22. package/dist/src/browser/adapters/index.d.ts.map +1 -0
  23. package/dist/src/browser/adapters/index.js +18 -0
  24. package/dist/src/browser/adapters/index.js.map +1 -0
  25. package/dist/src/browser/adapters/instagram.d.ts +3 -0
  26. package/dist/src/browser/adapters/instagram.d.ts.map +1 -0
  27. package/dist/src/browser/adapters/instagram.js +14 -0
  28. package/dist/src/browser/adapters/instagram.js.map +1 -0
  29. package/dist/src/browser/adapters/linkedin.d.ts +3 -0
  30. package/dist/src/browser/adapters/linkedin.d.ts.map +1 -0
  31. package/dist/src/browser/adapters/linkedin.js +13 -0
  32. package/dist/src/browser/adapters/linkedin.js.map +1 -0
  33. package/dist/src/browser/adapters/microsoft.d.ts +3 -0
  34. package/dist/src/browser/adapters/microsoft.d.ts.map +1 -0
  35. package/dist/src/browser/adapters/microsoft.js +16 -0
  36. package/dist/src/browser/adapters/microsoft.js.map +1 -0
  37. package/dist/src/browser/adapters/x.d.ts +3 -0
  38. package/dist/src/browser/adapters/x.d.ts.map +1 -0
  39. package/dist/src/browser/adapters/x.js +13 -0
  40. package/dist/src/browser/adapters/x.js.map +1 -0
  41. package/dist/src/browser/batch.d.ts +5 -0
  42. package/dist/src/browser/batch.d.ts.map +1 -0
  43. package/dist/src/browser/batch.js +2 -0
  44. package/dist/src/browser/batch.js.map +1 -0
  45. package/dist/src/browser/browser.d.ts +15 -0
  46. package/dist/src/browser/browser.d.ts.map +1 -0
  47. package/dist/src/browser/browser.js +256 -0
  48. package/dist/src/browser/browser.js.map +1 -0
  49. package/dist/src/browser/cdp.d.ts +18 -0
  50. package/dist/src/browser/cdp.d.ts.map +1 -0
  51. package/dist/src/browser/cdp.js +153 -0
  52. package/dist/src/browser/cdp.js.map +1 -0
  53. package/dist/src/browser/console-log.d.ts +23 -0
  54. package/dist/src/browser/console-log.d.ts.map +1 -0
  55. package/dist/src/browser/console-log.js +104 -0
  56. package/dist/src/browser/console-log.js.map +1 -0
  57. package/dist/src/browser/dashboard/api-types.d.ts +50 -0
  58. package/dist/src/browser/dashboard/api-types.d.ts.map +1 -0
  59. package/dist/src/browser/dashboard/api-types.js +14 -0
  60. package/dist/src/browser/dashboard/api-types.js.map +1 -0
  61. package/dist/src/browser/dashboard/server.d.ts +11 -0
  62. package/dist/src/browser/dashboard/server.d.ts.map +1 -0
  63. package/dist/src/browser/dashboard/server.js +191 -0
  64. package/dist/src/browser/dashboard/server.js.map +1 -0
  65. package/dist/src/browser/dialog.d.ts +12 -0
  66. package/dist/src/browser/dialog.d.ts.map +1 -0
  67. package/dist/src/browser/dialog.js +53 -0
  68. package/dist/src/browser/dialog.js.map +1 -0
  69. package/dist/src/browser/emulation.d.ts +15 -0
  70. package/dist/src/browser/emulation.d.ts.map +1 -0
  71. package/dist/src/browser/emulation.js +62 -0
  72. package/dist/src/browser/emulation.js.map +1 -0
  73. package/dist/src/browser/find.d.ts +22 -0
  74. package/dist/src/browser/find.d.ts.map +1 -0
  75. package/dist/src/browser/find.js +169 -0
  76. package/dist/src/browser/find.js.map +1 -0
  77. package/dist/src/browser/har.d.ts +27 -0
  78. package/dist/src/browser/har.d.ts.map +1 -0
  79. package/dist/src/browser/har.js +161 -0
  80. package/dist/src/browser/har.js.map +1 -0
  81. package/dist/src/browser/index.d.ts +23 -0
  82. package/dist/src/browser/index.d.ts.map +1 -0
  83. package/dist/src/browser/index.js +23 -0
  84. package/dist/src/browser/index.js.map +1 -0
  85. package/dist/src/browser/network.d.ts +32 -0
  86. package/dist/src/browser/network.d.ts.map +1 -0
  87. package/dist/src/browser/network.js +214 -0
  88. package/dist/src/browser/network.js.map +1 -0
  89. package/dist/src/browser/pdf.d.ts +15 -0
  90. package/dist/src/browser/pdf.d.ts.map +1 -0
  91. package/dist/src/browser/pdf.js +27 -0
  92. package/dist/src/browser/pdf.js.map +1 -0
  93. package/dist/src/browser/profiler.d.ts +10 -0
  94. package/dist/src/browser/profiler.d.ts.map +1 -0
  95. package/dist/src/browser/profiler.js +77 -0
  96. package/dist/src/browser/profiler.js.map +1 -0
  97. package/dist/src/browser/record.d.ts +21 -0
  98. package/dist/src/browser/record.d.ts.map +1 -0
  99. package/dist/src/browser/record.js +59 -0
  100. package/dist/src/browser/record.js.map +1 -0
  101. package/dist/src/browser/screenshot.d.ts +15 -0
  102. package/dist/src/browser/screenshot.d.ts.map +1 -0
  103. package/dist/src/browser/screenshot.js +38 -0
  104. package/dist/src/browser/screenshot.js.map +1 -0
  105. package/dist/src/browser/session.d.ts +8 -0
  106. package/dist/src/browser/session.d.ts.map +1 -0
  107. package/dist/src/browser/session.js +91 -0
  108. package/dist/src/browser/session.js.map +1 -0
  109. package/dist/src/browser/snapshot.d.ts +12 -0
  110. package/dist/src/browser/snapshot.d.ts.map +1 -0
  111. package/dist/src/browser/snapshot.js +179 -0
  112. package/dist/src/browser/snapshot.js.map +1 -0
  113. package/dist/src/browser/storage.d.ts +12 -0
  114. package/dist/src/browser/storage.d.ts.map +1 -0
  115. package/dist/src/browser/storage.js +46 -0
  116. package/dist/src/browser/storage.js.map +1 -0
  117. package/dist/src/browser/tabs.d.ts +8 -0
  118. package/dist/src/browser/tabs.d.ts.map +1 -0
  119. package/dist/src/browser/tabs.js +25 -0
  120. package/dist/src/browser/tabs.js.map +1 -0
  121. package/dist/src/browser/trace.d.ts +10 -0
  122. package/dist/src/browser/trace.d.ts.map +1 -0
  123. package/dist/src/browser/trace.js +87 -0
  124. package/dist/src/browser/trace.js.map +1 -0
  125. package/dist/src/browser/types.d.ts +111 -0
  126. package/dist/src/browser/types.d.ts.map +1 -0
  127. package/dist/src/browser/types.js +16 -0
  128. package/dist/src/browser/types.js.map +1 -0
  129. package/dist/src/browser/vitals.d.ts +15 -0
  130. package/dist/src/browser/vitals.d.ts.map +1 -0
  131. package/dist/src/browser/vitals.js +116 -0
  132. package/dist/src/browser/vitals.js.map +1 -0
  133. package/dist/src/browser/wait.d.ts +4 -0
  134. package/dist/src/browser/wait.d.ts.map +1 -0
  135. package/dist/src/browser/wait.js +146 -0
  136. package/dist/src/browser/wait.js.map +1 -0
  137. package/dist/src/browser/workflow/builtin-handlers.d.ts +3 -0
  138. package/dist/src/browser/workflow/builtin-handlers.d.ts.map +1 -0
  139. package/dist/src/browser/workflow/builtin-handlers.js +343 -0
  140. package/dist/src/browser/workflow/builtin-handlers.js.map +1 -0
  141. package/dist/src/browser/workflow/engine.d.ts +10 -0
  142. package/dist/src/browser/workflow/engine.d.ts.map +1 -0
  143. package/dist/src/browser/workflow/engine.js +174 -0
  144. package/dist/src/browser/workflow/engine.js.map +1 -0
  145. package/dist/src/browser/workflow/expression.d.ts +4 -0
  146. package/dist/src/browser/workflow/expression.d.ts.map +1 -0
  147. package/dist/src/browser/workflow/expression.js +89 -0
  148. package/dist/src/browser/workflow/expression.js.map +1 -0
  149. package/dist/src/browser/workflow/index.d.ts +6 -0
  150. package/dist/src/browser/workflow/index.d.ts.map +1 -0
  151. package/dist/src/browser/workflow/index.js +6 -0
  152. package/dist/src/browser/workflow/index.js.map +1 -0
  153. package/dist/src/browser/workflow/store.d.ts +8 -0
  154. package/dist/src/browser/workflow/store.d.ts.map +1 -0
  155. package/dist/src/browser/workflow/store.js +87 -0
  156. package/dist/src/browser/workflow/store.js.map +1 -0
  157. package/dist/src/browser/workflow/types.d.ts +62 -0
  158. package/dist/src/browser/workflow/types.d.ts.map +1 -0
  159. package/dist/src/browser/workflow/types.js +2 -0
  160. package/dist/src/browser/workflow/types.js.map +1 -0
  161. package/dist/src/index.d.ts +7 -0
  162. package/dist/src/index.d.ts.map +1 -0
  163. package/dist/src/index.js +7 -0
  164. package/dist/src/index.js.map +1 -0
  165. package/dist/tsconfig.tsbuildinfo +1 -0
  166. package/package.json +56 -0
  167. package/src/browser/action-builder/analyzer.ts +127 -0
  168. package/src/browser/action-builder/types.ts +17 -0
  169. package/src/browser/actions.ts +518 -0
  170. package/src/browser/adapters/gemini.ts +15 -0
  171. package/src/browser/adapters/google.ts +20 -0
  172. package/src/browser/adapters/index.ts +33 -0
  173. package/src/browser/adapters/instagram.ts +16 -0
  174. package/src/browser/adapters/linkedin.ts +15 -0
  175. package/src/browser/adapters/microsoft.ts +19 -0
  176. package/src/browser/adapters/x.ts +15 -0
  177. package/src/browser/batch.ts +4 -0
  178. package/src/browser/browser.ts +265 -0
  179. package/src/browser/cdp.ts +156 -0
  180. package/src/browser/console-log.ts +120 -0
  181. package/src/browser/dashboard/api-types.ts +71 -0
  182. package/src/browser/dashboard/server.ts +206 -0
  183. package/src/browser/dashboard/ui.html +444 -0
  184. package/src/browser/dialog.ts +63 -0
  185. package/src/browser/emulation.ts +94 -0
  186. package/src/browser/find.ts +225 -0
  187. package/src/browser/har.ts +202 -0
  188. package/src/browser/index.ts +22 -0
  189. package/src/browser/network.ts +244 -0
  190. package/src/browser/pdf.ts +41 -0
  191. package/src/browser/profiler.ts +96 -0
  192. package/src/browser/record.ts +92 -0
  193. package/src/browser/screenshot.ts +67 -0
  194. package/src/browser/session.ts +118 -0
  195. package/src/browser/snapshot.ts +248 -0
  196. package/src/browser/storage.ts +54 -0
  197. package/src/browser/tabs.ts +37 -0
  198. package/src/browser/trace.ts +106 -0
  199. package/src/browser/types.ts +135 -0
  200. package/src/browser/vitals.ts +122 -0
  201. package/src/browser/wait.ts +178 -0
  202. package/src/browser/workflow/builtin-handlers.ts +379 -0
  203. package/src/browser/workflow/engine.ts +202 -0
  204. package/src/browser/workflow/expression.ts +107 -0
  205. package/src/browser/workflow/index.ts +5 -0
  206. package/src/browser/workflow/store.ts +87 -0
  207. package/src/browser/workflow/types.ts +62 -0
  208. package/src/index.ts +6 -0
@@ -0,0 +1,32 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ import type { CdpCookie, NetworkRoute } from './types.js';
3
+ export declare function getCookies(client: CdpClient, sessionId: string): Promise<CdpCookie[]>;
4
+ export declare function setCookies(client: CdpClient, sessionId: string, cookies: CdpCookie[]): Promise<void>;
5
+ export declare function clearCookies(client: CdpClient, sessionId: string): Promise<void>;
6
+ export declare function setExtraHeaders(client: CdpClient, sessionId: string, headers: Record<string, string>): Promise<void>;
7
+ export declare function enableInterception(client: CdpClient, sessionId: string): Promise<void>;
8
+ export declare function setupRoutes(client: CdpClient, sessionId: string, routes: NetworkRoute[]): Promise<void>;
9
+ type CapturedRequest = {
10
+ id: string;
11
+ url: string;
12
+ method: string;
13
+ status?: number;
14
+ mimeType?: string;
15
+ requestHeaders?: Record<string, string>;
16
+ responseHeaders?: Record<string, string>;
17
+ startTime: number;
18
+ endTime?: number;
19
+ encodedSize?: number;
20
+ };
21
+ export declare function startRequestCapture(client: CdpClient, sessionId: string): void;
22
+ export declare function stopRequestCapture(sessionId: string): void;
23
+ export declare function getCapturedRequests(sessionId: string): CapturedRequest[];
24
+ export declare function clearCapturedRequests(sessionId: string): void;
25
+ export declare function disableInterception(client: CdpClient, sessionId: string): Promise<void>;
26
+ export declare function teardownRouteInterception(sessionId: string): void;
27
+ export declare function getLocalStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>>;
28
+ export declare function setLocalStorage(client: CdpClient, sessionId: string, data: Record<string, string>): Promise<void>;
29
+ export declare function getSessionStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>>;
30
+ export declare function setSessionStorage(client: CdpClient, sessionId: string, data: Record<string, string>): Promise<void>;
31
+ export {};
32
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../src/browser/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAG3F;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1G;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtF;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5F;AAID,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAsDf;AAED,KAAK,eAAe,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClF,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC3D,CAAC;AAMF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoC9E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAExE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAW3G;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAW7G;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,214 @@
1
+ export async function getCookies(client, sessionId) {
2
+ const result = await client.send('Network.getAllCookies', {}, sessionId);
3
+ return result.cookies ?? [];
4
+ }
5
+ export async function setCookies(client, sessionId, cookies) {
6
+ await client.send('Network.setCookies', { cookies }, sessionId);
7
+ }
8
+ export async function clearCookies(client, sessionId) {
9
+ await client.send('Network.clearBrowserCookies', {}, sessionId);
10
+ }
11
+ export async function setExtraHeaders(client, sessionId, headers) {
12
+ await client.send('Network.setExtraHTTPHeaders', { headers }, sessionId);
13
+ }
14
+ export async function enableInterception(client, sessionId) {
15
+ await client.send('Fetch.enable', {
16
+ patterns: [{ requestStage: 'Request' }],
17
+ }, sessionId);
18
+ }
19
+ const _routeListeners = new Map();
20
+ export async function setupRoutes(client, sessionId, routes) {
21
+ // Remove previous route listener for this session before registering a new one
22
+ const prevOff = _routeListeners.get(sessionId);
23
+ if (prevOff) {
24
+ prevOff();
25
+ _routeListeners.delete(sessionId);
26
+ }
27
+ if (routes.length === 0) {
28
+ await client.send('Fetch.disable', {}, sessionId).catch(() => { });
29
+ return;
30
+ }
31
+ // Pre-compile route regexes once — avoids creating new RegExp on every paused request
32
+ const compiledRoutes = routes.map((r) => ({ route: r, regex: globToRegex(r.pattern) }));
33
+ // Register listener BEFORE Fetch.enable to avoid race where Chrome emits
34
+ // Fetch.requestPaused before the handler is in place, leaving requests hung
35
+ const off = client.on('Fetch.requestPaused', async (params, sid) => {
36
+ if (sid !== sessionId)
37
+ return;
38
+ const { requestId, request } = params;
39
+ try {
40
+ const matchedRoute = compiledRoutes.find((e) => e.regex.test(request.url))?.route;
41
+ if (!matchedRoute) {
42
+ await client.send('Fetch.continueRequest', { requestId }, sessionId);
43
+ return;
44
+ }
45
+ switch (matchedRoute.action) {
46
+ case 'abort':
47
+ await client.send('Fetch.failRequest', { requestId, errorReason: 'Failed' }, sessionId);
48
+ break;
49
+ case 'fulfill':
50
+ await client.send('Fetch.fulfillRequest', {
51
+ requestId,
52
+ responseCode: matchedRoute.response?.status ?? 200,
53
+ responseHeaders: Object.entries(matchedRoute.response?.headers ?? {}).map(([name, value]) => ({ name, value })),
54
+ body: matchedRoute.response?.body ? Buffer.from(matchedRoute.response.body).toString('base64') : '',
55
+ }, sessionId);
56
+ break;
57
+ case 'continue':
58
+ default:
59
+ await client.send('Fetch.continueRequest', { requestId }, sessionId);
60
+ break;
61
+ }
62
+ }
63
+ catch {
64
+ // Best-effort: resume the request so it doesn't hang in Chrome
65
+ await client.send('Fetch.continueRequest', { requestId }, sessionId).catch(() => { });
66
+ }
67
+ });
68
+ _routeListeners.set(sessionId, off);
69
+ await client.send('Fetch.enable', {
70
+ patterns: routes.map((r) => ({ urlPattern: globToFetchPattern(r.pattern), requestStage: 'Request' })),
71
+ }, sessionId);
72
+ }
73
+ const _capturedRequests = new Map();
74
+ const _captureListeners = new Map();
75
+ export function startRequestCapture(client, sessionId) {
76
+ stopRequestCapture(sessionId);
77
+ _capturedRequests.set(sessionId, new Map());
78
+ client.send('Network.enable', {}, sessionId).catch(() => { });
79
+ // Use indirection so clearCapturedRequests (which replaces the Map) affects live listeners
80
+ const idx = () => _capturedRequests.get(sessionId);
81
+ const offReq = client.on('Network.requestWillBeSent', (params, sid) => {
82
+ if (sid !== sessionId)
83
+ return;
84
+ const p = params;
85
+ idx().set(p.requestId, { id: p.requestId, url: p.request.url, method: p.request.method, requestHeaders: p.request.headers, startTime: p.timestamp * 1000 });
86
+ });
87
+ const offResp = client.on('Network.responseReceived', (params, sid) => {
88
+ if (sid !== sessionId)
89
+ return;
90
+ const p = params;
91
+ const entry = idx().get(p.requestId);
92
+ if (entry) {
93
+ entry.status = p.response.status;
94
+ entry.mimeType = p.response.mimeType;
95
+ entry.responseHeaders = p.response.headers;
96
+ entry.endTime = p.timestamp * 1000;
97
+ }
98
+ });
99
+ const offFinished = client.on('Network.loadingFinished', (params, sid) => {
100
+ if (sid !== sessionId)
101
+ return;
102
+ const p = params;
103
+ const entry = idx().get(p.requestId);
104
+ if (entry) {
105
+ entry.encodedSize = p.encodedDataLength;
106
+ entry.endTime = p.timestamp * 1000;
107
+ }
108
+ });
109
+ const offFailed = client.on('Network.loadingFailed', (params, sid) => {
110
+ if (sid !== sessionId)
111
+ return;
112
+ const p = params;
113
+ const entry = idx().get(p.requestId);
114
+ if (entry) {
115
+ entry.endTime = p.timestamp * 1000;
116
+ }
117
+ });
118
+ _captureListeners.set(sessionId, [offReq, offResp, offFinished, offFailed]);
119
+ }
120
+ export function stopRequestCapture(sessionId) {
121
+ const offs = _captureListeners.get(sessionId);
122
+ if (offs) {
123
+ for (const off of offs)
124
+ off();
125
+ _captureListeners.delete(sessionId);
126
+ }
127
+ _capturedRequests.delete(sessionId);
128
+ }
129
+ export function getCapturedRequests(sessionId) {
130
+ return [...(_capturedRequests.get(sessionId)?.values() ?? [])];
131
+ }
132
+ export function clearCapturedRequests(sessionId) {
133
+ _capturedRequests.set(sessionId, new Map());
134
+ }
135
+ export async function disableInterception(client, sessionId) {
136
+ const prevOff = _routeListeners.get(sessionId);
137
+ if (prevOff) {
138
+ prevOff();
139
+ _routeListeners.delete(sessionId);
140
+ }
141
+ await client.send('Fetch.disable', {}, sessionId);
142
+ }
143
+ export function teardownRouteInterception(sessionId) {
144
+ const prevOff = _routeListeners.get(sessionId);
145
+ if (prevOff) {
146
+ prevOff();
147
+ _routeListeners.delete(sessionId);
148
+ }
149
+ }
150
+ export async function getLocalStorage(client, sessionId) {
151
+ const result = await client.send('Runtime.evaluate', {
152
+ expression: 'JSON.stringify(Object.fromEntries(Object.entries(localStorage)))',
153
+ returnByValue: true,
154
+ }, sessionId);
155
+ if (result.exceptionDetails)
156
+ return {};
157
+ try {
158
+ return JSON.parse(result.result?.value ?? '{}');
159
+ }
160
+ catch {
161
+ return {};
162
+ }
163
+ }
164
+ export async function setLocalStorage(client, sessionId, data) {
165
+ const script = Object.entries(data)
166
+ .map(([k, v]) => `localStorage.setItem(${JSON.stringify(k)}, ${JSON.stringify(v)})`)
167
+ .join('; ');
168
+ if (script) {
169
+ const result = await client.send('Runtime.evaluate', { expression: script, returnByValue: true }, sessionId);
170
+ if (result.exceptionDetails) {
171
+ throw new Error(`setLocalStorage failed: ${result.exceptionDetails.exception?.description ?? result.exceptionDetails.text}`);
172
+ }
173
+ }
174
+ }
175
+ export async function getSessionStorage(client, sessionId) {
176
+ const result = await client.send('Runtime.evaluate', {
177
+ expression: 'JSON.stringify(Object.fromEntries(Object.entries(sessionStorage)))',
178
+ returnByValue: true,
179
+ }, sessionId);
180
+ if (result.exceptionDetails)
181
+ return {};
182
+ try {
183
+ return JSON.parse(result.result?.value ?? '{}');
184
+ }
185
+ catch {
186
+ return {};
187
+ }
188
+ }
189
+ export async function setSessionStorage(client, sessionId, data) {
190
+ const script = Object.entries(data)
191
+ .map(([k, v]) => `sessionStorage.setItem(${JSON.stringify(k)}, ${JSON.stringify(v)})`)
192
+ .join('; ');
193
+ if (script) {
194
+ const result = await client.send('Runtime.evaluate', { expression: script, returnByValue: true }, sessionId);
195
+ if (result.exceptionDetails) {
196
+ throw new Error(`setSessionStorage failed: ${result.exceptionDetails.exception?.description ?? result.exceptionDetails.text}`);
197
+ }
198
+ }
199
+ }
200
+ function globToRegex(pattern) {
201
+ // Chrome's Fetch urlPattern treats '*' as matching everything including '/'
202
+ // and '?' as any single character — match both behaviors here to avoid divergence
203
+ const escaped = pattern
204
+ .replace(/[-[\]{}()+.,\\^$|#\s]/g, '\\$&')
205
+ .replace(/\*\*/g, '\x00')
206
+ .replace(/\*/g, '[^/]*')
207
+ .replace(/\x00/g, '.*')
208
+ .replace(/\?/g, '[^/]');
209
+ return new RegExp(`^${escaped}$`);
210
+ }
211
+ function globToFetchPattern(pattern) {
212
+ return pattern.replace(/\*\*/g, '*');
213
+ }
214
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/browser/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ export interface PdfOptions {
3
+ path?: string;
4
+ landscape?: boolean;
5
+ paperWidth?: number;
6
+ paperHeight?: number;
7
+ marginTop?: number;
8
+ marginBottom?: number;
9
+ marginLeft?: number;
10
+ marginRight?: number;
11
+ printBackground?: boolean;
12
+ scale?: number;
13
+ }
14
+ export declare function capturePdf(client: CdpClient, sessionId: string, options?: PdfOptions): Promise<string>;
15
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/browser/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -0,0 +1,27 @@
1
+ import { writeFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { tmpdir } from 'os';
4
+ export async function capturePdf(client, sessionId, options = {}) {
5
+ const params = {
6
+ landscape: options.landscape ?? false,
7
+ printBackground: options.printBackground ?? true,
8
+ scale: options.scale ?? 1,
9
+ };
10
+ if (options.paperWidth)
11
+ params.paperWidth = options.paperWidth;
12
+ if (options.paperHeight)
13
+ params.paperHeight = options.paperHeight;
14
+ if (options.marginTop !== undefined)
15
+ params.marginTop = options.marginTop;
16
+ if (options.marginBottom !== undefined)
17
+ params.marginBottom = options.marginBottom;
18
+ if (options.marginLeft !== undefined)
19
+ params.marginLeft = options.marginLeft;
20
+ if (options.marginRight !== undefined)
21
+ params.marginRight = options.marginRight;
22
+ const result = await client.send('Page.printToPDF', params, sessionId);
23
+ const outputPath = options.path ?? join(tmpdir(), `monomind-pdf-${Date.now()}.pdf`);
24
+ await writeFile(outputPath, Buffer.from(result.data, 'base64'));
25
+ return outputPath;
26
+ }
27
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/browser/pdf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAe5B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAiB,EACjB,SAAiB,EACjB,UAAsB,EAAE;IAExB,MAAM,MAAM,GAA4B;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;QACrC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;QAChD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;KAC1B,CAAC;IAEF,IAAI,OAAO,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAC/D,IAAI,OAAO,CAAC,WAAW;QAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAClE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAC1E,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAAE,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACnF,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAC7E,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAEhF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAmB,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpF,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ export interface ProfilerOptions {
3
+ path?: string;
4
+ samplingInterval?: number;
5
+ }
6
+ export declare function startCpuProfile(client: CdpClient, sessionId: string, options?: ProfilerOptions): Promise<void>;
7
+ export declare function stopCpuProfile(client: CdpClient, sessionId: string, outputPath?: string): Promise<string>;
8
+ export declare function isProfilingActive(sessionId: string): boolean;
9
+ export declare function startHeapSnapshot(client: CdpClient, sessionId: string, outputPath?: string): Promise<string>;
10
+ //# sourceMappingURL=profiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../../src/browser/profiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAKD,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -0,0 +1,77 @@
1
+ import { writeFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { tmpdir } from 'os';
4
+ const _sessions = new Set();
5
+ const _heapSessions = new Set();
6
+ export async function startCpuProfile(client, sessionId, options = {}) {
7
+ if (_sessions.has(sessionId)) {
8
+ throw new Error('CPU profiler already running for this session');
9
+ }
10
+ await client.send('Profiler.enable', {}, sessionId);
11
+ if (options.samplingInterval !== undefined) {
12
+ await client.send('Profiler.setSamplingInterval', { interval: options.samplingInterval }, sessionId);
13
+ }
14
+ await client.send('Profiler.start', {}, sessionId);
15
+ _sessions.add(sessionId);
16
+ }
17
+ export async function stopCpuProfile(client, sessionId, outputPath) {
18
+ if (!_sessions.has(sessionId)) {
19
+ throw new Error('No active CPU profiler for this session');
20
+ }
21
+ let result;
22
+ try {
23
+ result = await client.send('Profiler.stop', {}, sessionId);
24
+ }
25
+ finally {
26
+ _sessions.delete(sessionId);
27
+ }
28
+ // Disable after capturing the profile so a disable failure doesn't discard valid data
29
+ await client.send('Profiler.disable', {}, sessionId).catch(() => { });
30
+ const path = outputPath ?? join(tmpdir(), `monomind-profile-${Date.now()}.cpuprofile`);
31
+ await writeFile(path, JSON.stringify(result.profile));
32
+ return path;
33
+ }
34
+ export function isProfilingActive(sessionId) {
35
+ return _sessions.has(sessionId);
36
+ }
37
+ export async function startHeapSnapshot(client, sessionId, outputPath) {
38
+ if (_heapSessions.has(sessionId)) {
39
+ throw new Error('Heap snapshot already in progress for this session');
40
+ }
41
+ _heapSessions.add(sessionId);
42
+ await client.send('HeapProfiler.enable', {}, sessionId);
43
+ const chunks = [];
44
+ const off = client.on('HeapProfiler.addHeapSnapshotChunk', (params, sid) => {
45
+ if (sid !== sessionId)
46
+ return;
47
+ chunks.push(params.chunk);
48
+ });
49
+ try {
50
+ await new Promise((resolve, reject) => {
51
+ const timeoutHandle = setTimeout(() => {
52
+ off2();
53
+ reject(new Error('Timeout waiting for heap snapshot (120s)'));
54
+ }, 120_000);
55
+ const off2 = client.on('HeapProfiler.reportHeapSnapshotProgress', (params, sid) => {
56
+ if (sid !== sessionId)
57
+ return;
58
+ if (params.finished) {
59
+ clearTimeout(timeoutHandle);
60
+ off2();
61
+ resolve();
62
+ }
63
+ });
64
+ client.send('HeapProfiler.takeHeapSnapshot', { reportProgress: true }, sessionId)
65
+ .catch((err) => { clearTimeout(timeoutHandle); off2(); reject(err); });
66
+ });
67
+ }
68
+ finally {
69
+ off();
70
+ _heapSessions.delete(sessionId);
71
+ await client.send('HeapProfiler.disable', {}, sessionId).catch(() => { });
72
+ }
73
+ const path = outputPath ?? join(tmpdir(), `monomind-heap-${Date.now()}.heapsnapshot`);
74
+ await writeFile(path, chunks.join(''));
75
+ return path;
76
+ }
77
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.js","sourceRoot":"","sources":["../../../src/browser/profiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ export interface RecordOptions {
3
+ path?: string;
4
+ format?: 'jpeg' | 'png' | 'webp';
5
+ quality?: number;
6
+ everyNthFrame?: number;
7
+ maxWidth?: number;
8
+ maxHeight?: number;
9
+ }
10
+ export interface RecordingState {
11
+ frames: string[];
12
+ offScreencast: (() => void) | null;
13
+ }
14
+ export declare function startRecording(client: CdpClient, sessionId: string, options?: RecordOptions): Promise<void>;
15
+ export declare function stopRecording(client: CdpClient, sessionId: string, outputPath?: string): Promise<string>;
16
+ export declare function getRecordingStatus(sessionId: string): {
17
+ recording: boolean;
18
+ frames: number;
19
+ };
20
+ export declare function saveFrameAsPng(client: CdpClient, sessionId: string, frameIndex: number, outputPath: string): Promise<void>;
21
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/browser/record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;CACpC;AAID,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAG5F;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,59 @@
1
+ import { writeFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { tmpdir } from 'os';
4
+ const _sessions = new Map();
5
+ export async function startRecording(client, sessionId, options = {}) {
6
+ if (_sessions.has(sessionId)) {
7
+ throw new Error('Recording already in progress for this session');
8
+ }
9
+ const state = { frames: [], offScreencast: null };
10
+ _sessions.set(sessionId, state);
11
+ state.offScreencast = client.on('Page.screencastFrame', async (params, sid) => {
12
+ if (sid !== sessionId)
13
+ return;
14
+ const { data, sessionId: frameSessionId } = params;
15
+ state.frames.push(data);
16
+ await client.send('Page.screencastFrameAck', { sessionId: frameSessionId }, sessionId).catch(() => { });
17
+ });
18
+ try {
19
+ await client.send('Page.startScreencast', {
20
+ format: options.format ?? 'jpeg',
21
+ quality: options.quality ?? 80,
22
+ everyNthFrame: options.everyNthFrame ?? 1,
23
+ ...(options.maxWidth ? { maxWidth: options.maxWidth } : {}),
24
+ ...(options.maxHeight ? { maxHeight: options.maxHeight } : {}),
25
+ }, sessionId);
26
+ }
27
+ catch (err) {
28
+ state.offScreencast?.();
29
+ _sessions.delete(sessionId);
30
+ throw err;
31
+ }
32
+ }
33
+ export async function stopRecording(client, sessionId, outputPath) {
34
+ const state = _sessions.get(sessionId);
35
+ if (!state)
36
+ throw new Error('No active recording for this session');
37
+ try {
38
+ await client.send('Page.stopScreencast', {}, sessionId);
39
+ }
40
+ finally {
41
+ state.offScreencast?.();
42
+ _sessions.delete(sessionId);
43
+ }
44
+ const path = outputPath ?? join(tmpdir(), `monomind-screencast-${Date.now()}.frames.json`);
45
+ await writeFile(path, JSON.stringify({ frameCount: state.frames.length, frames: state.frames }));
46
+ return path;
47
+ }
48
+ export function getRecordingStatus(sessionId) {
49
+ const state = _sessions.get(sessionId);
50
+ return { recording: !!state, frames: state?.frames.length ?? 0 };
51
+ }
52
+ export async function saveFrameAsPng(client, sessionId, frameIndex, outputPath) {
53
+ const state = _sessions.get(sessionId);
54
+ if (!state || frameIndex >= state.frames.length) {
55
+ throw new Error(`Frame ${frameIndex} not available`);
56
+ }
57
+ await writeFile(outputPath, Buffer.from(state.frames[frameIndex], 'base64'));
58
+ }
59
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/browser/record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ export interface ScreenshotOptions {
3
+ path?: string;
4
+ fullPage?: boolean;
5
+ quality?: number;
6
+ format?: 'jpeg' | 'png' | 'webp';
7
+ annotate?: boolean;
8
+ }
9
+ export declare function captureScreenshot(client: CdpClient, sessionId: string, options?: ScreenshotOptions): Promise<{
10
+ path: string;
11
+ dataUrl: string;
12
+ }>;
13
+ export declare function setViewport(client: CdpClient, sessionId: string, width: number, height: number): Promise<void>;
14
+ export declare function setUserAgent(client: CdpClient, sessionId: string, userAgent: string): Promise<void>;
15
+ //# sourceMappingURL=screenshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../src/browser/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B5C;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,38 @@
1
+ import { writeFile, mkdir } from 'fs/promises';
2
+ import { join, dirname } from 'path';
3
+ import { tmpdir } from 'os';
4
+ export async function captureScreenshot(client, sessionId, options = {}) {
5
+ const format = options.format ?? 'png';
6
+ const params = { format };
7
+ if (format === 'jpeg' || format === 'webp') {
8
+ params.quality = options.quality ?? 80;
9
+ }
10
+ if (options.fullPage) {
11
+ const dims = await client.send('Runtime.evaluate', {
12
+ expression: 'JSON.stringify({w: document.documentElement.scrollWidth, h: document.documentElement.scrollHeight})',
13
+ returnByValue: true,
14
+ }, sessionId);
15
+ const { w, h } = JSON.parse(dims.result?.value ?? '{"w":1280,"h":720}');
16
+ params.clip = { x: 0, y: 0, width: w, height: h, scale: 1 };
17
+ params.captureBeyondViewport = true;
18
+ }
19
+ const result = await client.send('Page.captureScreenshot', params, sessionId);
20
+ const data = result.data;
21
+ const dataUrl = `data:image/${format};base64,${data}`;
22
+ const outputPath = options.path ?? join(tmpdir(), `monomind-screenshot-${Date.now()}.${format}`);
23
+ await mkdir(dirname(outputPath), { recursive: true });
24
+ await writeFile(outputPath, Buffer.from(data, 'base64'));
25
+ return { path: outputPath, dataUrl };
26
+ }
27
+ export async function setViewport(client, sessionId, width, height) {
28
+ await client.send('Emulation.setDeviceMetricsOverride', {
29
+ width,
30
+ height,
31
+ deviceScaleFactor: 1,
32
+ mobile: false,
33
+ }, sessionId);
34
+ }
35
+ export async function setUserAgent(client, sessionId, userAgent) {
36
+ await client.send('Emulation.setUserAgentOverride', { userAgent }, sessionId);
37
+ }
38
+ //# sourceMappingURL=screenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/browser/screenshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAU5B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAiB,EACjB,SAAiB,EACjB,UAA6B,EAAE;IAE/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACvC,MAAM,MAAM,GAA4B,EAAE,MAAM,EAAE,CAAC;IAEnD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAgC,kBAAkB,EAAE;YAChF,UAAU,EAAE,qGAAqG;YACjH,aAAa,EAAE,IAAI;SACpB,EAAE,SAAS,CAAC,CAAC;QACd,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,oBAAoB,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAmB,wBAAwB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,cAAc,MAAM,WAAW,IAAI,EAAE,CAAC;IAEtD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,EAAE,CAAC,CAAC;IACjG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEzD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAiB,EACjB,SAAiB,EACjB,KAAa,EACb,MAAc;IAEd,MAAM,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;QACtD,KAAK;QACL,MAAM;QACN,iBAAiB,EAAE,CAAC;QACpB,MAAM,EAAE,KAAK;KACd,EAAE,SAAS,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAiB,EACjB,SAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SessionState } from './types.js';
2
+ import type { CdpClient } from './cdp.js';
3
+ export declare function saveSession(client: CdpClient, sessionId: string, targetId: string, name: string, url: string, title: string): Promise<string>;
4
+ export declare function loadSession(client: CdpClient, sessionId: string, name: string): Promise<SessionState>;
5
+ export declare function saveStateFile(client: CdpClient, sessionId: string, targetId: string, filePath: string, url: string, title: string): Promise<void>;
6
+ export declare function loadStateFile(client: CdpClient, sessionId: string, filePath: string): Promise<SessionState>;
7
+ export declare function listSessions(): Promise<string[]>;
8
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/browser/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAoB1C,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAqBvB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAevB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAOtD"}