@monoes/monomindcli 1.10.29 → 1.10.31

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 (111) hide show
  1. package/.claude/helpers/auto-memory-hook.mjs +39 -4
  2. package/.claude/helpers/handlers/adr-draft-handler.cjs +64 -0
  3. package/.claude/helpers/handlers/agent-start-handler.cjs +99 -0
  4. package/.claude/helpers/handlers/edit-handler.cjs +145 -0
  5. package/.claude/helpers/handlers/graph-status-handler.cjs +38 -0
  6. package/.claude/helpers/handlers/route-handler.cjs +393 -0
  7. package/.claude/helpers/handlers/session-handler.cjs +167 -0
  8. package/.claude/helpers/handlers/session-restore-handler.cjs +348 -0
  9. package/.claude/helpers/handlers/task-handler.cjs +329 -0
  10. package/.claude/helpers/hook-handler.cjs +120 -2431
  11. package/.claude/helpers/intelligence.cjs +21 -2
  12. package/.claude/helpers/learning-service.mjs +166 -8
  13. package/.claude/helpers/memory-palace.cjs +72 -12
  14. package/.claude/helpers/router.cjs +79 -5
  15. package/.claude/helpers/statusline.cjs +193 -399
  16. package/.claude/helpers/utils/micro-agents.cjs +338 -0
  17. package/.claude/helpers/utils/monograph.cjs +349 -0
  18. package/.claude/helpers/utils/telemetry.cjs +144 -0
  19. package/.claude/skills/agent-browser-testing/SKILL.md +3 -2
  20. package/.claude/skills/monomind/browse-agentcore.md +116 -0
  21. package/.claude/skills/monomind/browse-electron.md +189 -0
  22. package/.claude/skills/monomind/browse-qa.md +229 -0
  23. package/.claude/skills/monomind/browse-references/authentication.md +162 -0
  24. package/.claude/skills/monomind/browse-references/trust-boundaries.md +41 -0
  25. package/.claude/skills/monomind/browse-references/video-recording.md +84 -0
  26. package/.claude/skills/monomind/browse-slack.md +189 -0
  27. package/.claude/skills/monomind/browse-vercel.md +240 -0
  28. package/.claude/skills/monomind/browse.md +724 -0
  29. package/dist/src/browser/actions.d.ts +28 -0
  30. package/dist/src/browser/actions.d.ts.map +1 -0
  31. package/dist/src/browser/actions.js +292 -0
  32. package/dist/src/browser/actions.js.map +1 -0
  33. package/dist/src/browser/batch.d.ts +13 -0
  34. package/dist/src/browser/batch.d.ts.map +1 -0
  35. package/dist/src/browser/batch.js +11 -0
  36. package/dist/src/browser/batch.js.map +1 -0
  37. package/dist/src/browser/browser.d.ts +14 -0
  38. package/dist/src/browser/browser.d.ts.map +1 -0
  39. package/dist/src/browser/browser.js +198 -0
  40. package/dist/src/browser/browser.js.map +1 -0
  41. package/dist/src/browser/cdp.d.ts +17 -0
  42. package/dist/src/browser/cdp.d.ts.map +1 -0
  43. package/dist/src/browser/cdp.js +106 -0
  44. package/dist/src/browser/cdp.js.map +1 -0
  45. package/dist/src/browser/console-log.d.ts +22 -0
  46. package/dist/src/browser/console-log.d.ts.map +1 -0
  47. package/dist/src/browser/console-log.js +55 -0
  48. package/dist/src/browser/console-log.js.map +1 -0
  49. package/dist/src/browser/dialog.d.ts +11 -0
  50. package/dist/src/browser/dialog.d.ts.map +1 -0
  51. package/dist/src/browser/dialog.js +36 -0
  52. package/dist/src/browser/dialog.js.map +1 -0
  53. package/dist/src/browser/emulation.d.ts +15 -0
  54. package/dist/src/browser/emulation.d.ts.map +1 -0
  55. package/dist/src/browser/emulation.js +62 -0
  56. package/dist/src/browser/emulation.js.map +1 -0
  57. package/dist/src/browser/find.d.ts +21 -0
  58. package/dist/src/browser/find.d.ts.map +1 -0
  59. package/dist/src/browser/find.js +118 -0
  60. package/dist/src/browser/find.js.map +1 -0
  61. package/dist/src/browser/index.d.ts +18 -0
  62. package/dist/src/browser/index.d.ts.map +1 -0
  63. package/dist/src/browser/index.js +18 -0
  64. package/dist/src/browser/index.js.map +1 -0
  65. package/dist/src/browser/network.d.ts +11 -0
  66. package/dist/src/browser/network.d.ts.map +1 -0
  67. package/dist/src/browser/network.js +81 -0
  68. package/dist/src/browser/network.js.map +1 -0
  69. package/dist/src/browser/pdf.d.ts +15 -0
  70. package/dist/src/browser/pdf.d.ts.map +1 -0
  71. package/dist/src/browser/pdf.js +27 -0
  72. package/dist/src/browser/pdf.js.map +1 -0
  73. package/dist/src/browser/screenshot.d.ts +15 -0
  74. package/dist/src/browser/screenshot.d.ts.map +1 -0
  75. package/dist/src/browser/screenshot.js +36 -0
  76. package/dist/src/browser/screenshot.js.map +1 -0
  77. package/dist/src/browser/session.d.ts +8 -0
  78. package/dist/src/browser/session.d.ts.map +1 -0
  79. package/dist/src/browser/session.js +50 -0
  80. package/dist/src/browser/session.js.map +1 -0
  81. package/dist/src/browser/snapshot.d.ts +12 -0
  82. package/dist/src/browser/snapshot.d.ts.map +1 -0
  83. package/dist/src/browser/snapshot.js +147 -0
  84. package/dist/src/browser/snapshot.js.map +1 -0
  85. package/dist/src/browser/storage.d.ts +11 -0
  86. package/dist/src/browser/storage.d.ts.map +1 -0
  87. package/dist/src/browser/storage.js +43 -0
  88. package/dist/src/browser/storage.js.map +1 -0
  89. package/dist/src/browser/tabs.d.ts +8 -0
  90. package/dist/src/browser/tabs.d.ts.map +1 -0
  91. package/dist/src/browser/tabs.js +25 -0
  92. package/dist/src/browser/tabs.js.map +1 -0
  93. package/dist/src/browser/types.d.ts +109 -0
  94. package/dist/src/browser/types.d.ts.map +1 -0
  95. package/dist/src/browser/types.js +16 -0
  96. package/dist/src/browser/types.js.map +1 -0
  97. package/dist/src/browser/wait.d.ts +4 -0
  98. package/dist/src/browser/wait.d.ts.map +1 -0
  99. package/dist/src/browser/wait.js +122 -0
  100. package/dist/src/browser/wait.js.map +1 -0
  101. package/dist/src/commands/browse.d.ts +8 -0
  102. package/dist/src/commands/browse.d.ts.map +1 -0
  103. package/dist/src/commands/browse.js +1494 -0
  104. package/dist/src/commands/browse.js.map +1 -0
  105. package/dist/src/commands/index.d.ts.map +1 -1
  106. package/dist/src/commands/index.js +2 -0
  107. package/dist/src/commands/index.js.map +1 -1
  108. package/dist/src/ui/dashboard-v2.html +1857 -0
  109. package/dist/src/ui/server.mjs +71 -1
  110. package/dist/tsconfig.tsbuildinfo +1 -1
  111. package/package.json +2 -1
@@ -0,0 +1,81 @@
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
+ export async function setupRoutes(client, sessionId, routes) {
20
+ if (routes.length === 0)
21
+ return;
22
+ await client.send('Fetch.enable', {
23
+ patterns: routes.map((r) => ({ urlPattern: globToFetchPattern(r.pattern), requestStage: 'Request' })),
24
+ }, sessionId);
25
+ client.on('Fetch.requestPaused', async (params, sid) => {
26
+ if (sid !== sessionId)
27
+ return;
28
+ const { requestId, request } = params;
29
+ const matchedRoute = routes.find((r) => globToRegex(r.pattern).test(request.url));
30
+ if (!matchedRoute) {
31
+ await client.send('Fetch.continueRequest', { requestId }, sessionId);
32
+ return;
33
+ }
34
+ switch (matchedRoute.action) {
35
+ case 'abort':
36
+ await client.send('Fetch.failRequest', { requestId, errorReason: 'Failed' }, sessionId);
37
+ break;
38
+ case 'fulfill':
39
+ await client.send('Fetch.fulfillRequest', {
40
+ requestId,
41
+ responseCode: matchedRoute.response?.status ?? 200,
42
+ responseHeaders: Object.entries(matchedRoute.response?.headers ?? {}).map(([name, value]) => ({ name, value })),
43
+ body: matchedRoute.response?.body ? Buffer.from(matchedRoute.response.body).toString('base64') : '',
44
+ }, sessionId);
45
+ break;
46
+ case 'continue':
47
+ default:
48
+ await client.send('Fetch.continueRequest', { requestId }, sessionId);
49
+ break;
50
+ }
51
+ });
52
+ }
53
+ export async function getLocalStorage(client, sessionId) {
54
+ const result = await client.send('Runtime.evaluate', {
55
+ expression: 'JSON.stringify(Object.fromEntries(Object.entries(localStorage)))',
56
+ returnByValue: true,
57
+ }, sessionId);
58
+ try {
59
+ return JSON.parse(result.result?.value ?? '{}');
60
+ }
61
+ catch {
62
+ return {};
63
+ }
64
+ }
65
+ export async function setLocalStorage(client, sessionId, data) {
66
+ const script = Object.entries(data)
67
+ .map(([k, v]) => `localStorage.setItem(${JSON.stringify(k)}, ${JSON.stringify(v)})`)
68
+ .join('; ');
69
+ await client.send('Runtime.evaluate', { expression: script }, sessionId);
70
+ }
71
+ function globToRegex(pattern) {
72
+ const escaped = pattern
73
+ .replace(/[-[\]{}()+?.,\\^$|#\s]/g, '\\$&')
74
+ .replace(/\*\*/g, '.*')
75
+ .replace(/\*/g, '[^/]*');
76
+ return new RegExp(escaped);
77
+ }
78
+ function globToFetchPattern(pattern) {
79
+ return pattern.replace(/\*\*/g, '*');
80
+ }
81
+ //# 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,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,CAyB5C;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,36 @@
1
+ import { writeFile } from 'fs/promises';
2
+ import { join } 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
+ }
18
+ const result = await client.send('Page.captureScreenshot', params, sessionId);
19
+ const data = result.data;
20
+ const dataUrl = `data:image/${format};base64,${data}`;
21
+ const outputPath = options.path ?? join(tmpdir(), `monomind-screenshot-${Date.now()}.${format}`);
22
+ await writeFile(outputPath, Buffer.from(data, 'base64'));
23
+ return { path: outputPath, dataUrl };
24
+ }
25
+ export async function setViewport(client, sessionId, width, height) {
26
+ await client.send('Emulation.setDeviceMetricsOverride', {
27
+ width,
28
+ height,
29
+ deviceScaleFactor: 1,
30
+ mobile: false,
31
+ }, sessionId);
32
+ }
33
+ export async function setUserAgent(client, sessionId, userAgent) {
34
+ await client.send('Emulation.setUserAgentOverride', { userAgent }, sessionId);
35
+ }
36
+ //# 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,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,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;IAC9D,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,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":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,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,CAUjB;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAavB;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,CAKf;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAQvB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAKtD"}
@@ -0,0 +1,50 @@
1
+ import { readFile, writeFile, mkdir } from 'fs/promises';
2
+ import { existsSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ import { getCookies, setCookies, getLocalStorage, setLocalStorage } from './network.js';
6
+ const SESSION_DIR = join(homedir(), '.monomind', 'browser-sessions');
7
+ export async function saveSession(client, sessionId, targetId, name, url, title) {
8
+ await mkdir(SESSION_DIR, { recursive: true });
9
+ const cookies = await getCookies(client, sessionId);
10
+ const localStorage = await getLocalStorage(client, sessionId);
11
+ const state = { targetId, sessionId, url, title, cookies, localStorage };
12
+ const filePath = join(SESSION_DIR, `${name}.json`);
13
+ await writeFile(filePath, JSON.stringify(state, null, 2));
14
+ return filePath;
15
+ }
16
+ export async function loadSession(client, sessionId, name) {
17
+ const filePath = join(SESSION_DIR, `${name}.json`);
18
+ if (!existsSync(filePath))
19
+ throw new Error(`Session not found: ${name}`);
20
+ const raw = await readFile(filePath, 'utf8');
21
+ const state = JSON.parse(raw);
22
+ await setCookies(client, sessionId, state.cookies);
23
+ if (state.localStorage) {
24
+ await setLocalStorage(client, sessionId, state.localStorage);
25
+ }
26
+ return state;
27
+ }
28
+ export async function saveStateFile(client, sessionId, targetId, filePath, url, title) {
29
+ const cookies = await getCookies(client, sessionId);
30
+ const localStorage = await getLocalStorage(client, sessionId);
31
+ const state = { targetId, sessionId, url, title, cookies, localStorage };
32
+ await writeFile(filePath, JSON.stringify(state, null, 2));
33
+ }
34
+ export async function loadStateFile(client, sessionId, filePath) {
35
+ const raw = await readFile(filePath, 'utf8');
36
+ const state = JSON.parse(raw);
37
+ await setCookies(client, sessionId, state.cookies);
38
+ if (state.localStorage) {
39
+ await setLocalStorage(client, sessionId, state.localStorage);
40
+ }
41
+ return state;
42
+ }
43
+ export async function listSessions() {
44
+ if (!existsSync(SESSION_DIR))
45
+ return [];
46
+ const { readdir } = await import('fs/promises');
47
+ const files = await readdir(SESSION_DIR);
48
+ return files.filter((f) => f.endsWith('.json')).map((f) => f.replace(/\.json$/, ''));
49
+ }
50
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/browser/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ import type { ElementRef, SnapshotOptions, SnapshotResult } from './types.js';
3
+ export declare function captureSnapshot(client: CdpClient, sessionId: string, options?: SnapshotOptions): Promise<SnapshotResult>;
4
+ export declare function resolveRef(client: CdpClient, sessionId: string, refs: Map<string, ElementRef>, refKey: string): Promise<ElementRef>;
5
+ export declare function getObjectIdForRef(client: CdpClient, sessionId: string, ref: ElementRef): Promise<string | null>;
6
+ export declare function getElementBox(client: CdpClient, sessionId: string, ref: ElementRef): Promise<{
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ } | null>;
12
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/browser/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkB9E,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA4FzB;AA2CD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC7B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAwBzE"}
@@ -0,0 +1,147 @@
1
+ import { INTERACTIVE_ROLES } from './types.js';
2
+ import { getCurrentUrl, getCurrentTitle } from './browser.js';
3
+ export async function captureSnapshot(client, sessionId, options = {}) {
4
+ const { interactiveOnly = false, compact = false } = options;
5
+ const { nodes } = await client.send('Accessibility.getFullAXTree', {}, sessionId);
6
+ const url = await getCurrentUrl(client, sessionId);
7
+ const title = await getCurrentTitle(client, sessionId);
8
+ const refs = new Map();
9
+ const nodeMap = new Map();
10
+ for (const node of nodes)
11
+ nodeMap.set(node.nodeId, node);
12
+ let refCounter = 1;
13
+ const lines = [];
14
+ const processNode = (node, depth) => {
15
+ if (node.ignored)
16
+ return;
17
+ const role = node.role?.value ?? 'generic';
18
+ const name = node.name?.value ?? '';
19
+ const description = node.description?.value;
20
+ if (role === 'none' || role === 'generic' || role === 'InlineTextBox') {
21
+ if (node.childIds) {
22
+ for (const childId of node.childIds) {
23
+ const child = nodeMap.get(childId);
24
+ if (child)
25
+ processNode(child, depth);
26
+ }
27
+ }
28
+ return;
29
+ }
30
+ const isInteractive = INTERACTIVE_ROLES.has(role.toLowerCase());
31
+ if (interactiveOnly && !isInteractive) {
32
+ if (node.childIds) {
33
+ for (const childId of node.childIds) {
34
+ const child = nodeMap.get(childId);
35
+ if (child)
36
+ processNode(child, depth);
37
+ }
38
+ }
39
+ return;
40
+ }
41
+ const props = extractProperties(node);
42
+ const refKey = `e${refCounter++}`;
43
+ const elemRef = {
44
+ ref: refKey,
45
+ role,
46
+ name,
47
+ description,
48
+ value: props.value,
49
+ disabled: props.disabled,
50
+ checked: props.checked,
51
+ expanded: props.expanded,
52
+ nodeId: node.nodeId,
53
+ backendDOMNodeId: node.backendDOMNodeId,
54
+ };
55
+ refs.set(refKey, elemRef);
56
+ const indent = compact ? '' : ' '.repeat(depth);
57
+ const attrParts = [`ref=${refKey}`];
58
+ if (props.value !== undefined)
59
+ attrParts.push(`value="${props.value}"`);
60
+ if (props.disabled)
61
+ attrParts.push('disabled');
62
+ if (props.checked !== undefined)
63
+ attrParts.push(`checked=${props.checked}`);
64
+ if (props.expanded !== undefined)
65
+ attrParts.push(`expanded=${props.expanded}`);
66
+ if (props.placeholder)
67
+ attrParts.push(`placeholder="${props.placeholder}"`);
68
+ if (props.required)
69
+ attrParts.push('required');
70
+ const nameStr = name ? ` "${name}"` : '';
71
+ const descStr = description && !compact ? ` (${description})` : '';
72
+ const attrsStr = ` [${attrParts.join(', ')}]`;
73
+ lines.push(`${indent}${role}${nameStr}${descStr}${attrsStr}`);
74
+ if (!isInteractive && node.childIds) {
75
+ for (const childId of node.childIds) {
76
+ const child = nodeMap.get(childId);
77
+ if (child)
78
+ processNode(child, depth + 1);
79
+ }
80
+ }
81
+ };
82
+ // Find root node
83
+ const root = nodes.find((n) => !n.parentId);
84
+ if (root)
85
+ processNode(root, 0);
86
+ return { text: lines.join('\n'), refs, url, title };
87
+ }
88
+ function extractProperties(node) {
89
+ const result = {};
90
+ if (!node.properties)
91
+ return result;
92
+ for (const prop of node.properties) {
93
+ switch (prop.name) {
94
+ case 'value':
95
+ result.value = String(prop.value.value ?? '');
96
+ break;
97
+ case 'disabled':
98
+ result.disabled = Boolean(prop.value.value);
99
+ break;
100
+ case 'checked':
101
+ result.checked = prop.value.value === 'true' || prop.value.value === true;
102
+ break;
103
+ case 'expanded':
104
+ result.expanded = prop.value.value === 'true' || prop.value.value === true;
105
+ break;
106
+ case 'placeholder':
107
+ result.placeholder = String(prop.value.value ?? '');
108
+ break;
109
+ case 'required':
110
+ result.required = Boolean(prop.value.value);
111
+ break;
112
+ }
113
+ }
114
+ if (node.value?.value !== undefined && result.value === undefined) {
115
+ result.value = String(node.value.value);
116
+ }
117
+ return result;
118
+ }
119
+ export async function resolveRef(client, sessionId, refs, refKey) {
120
+ const ref = refs.get(refKey);
121
+ if (!ref)
122
+ throw new Error(`Element ref @${refKey} not found. Run snapshot first.`);
123
+ return ref;
124
+ }
125
+ export async function getObjectIdForRef(client, sessionId, ref) {
126
+ if (!ref.backendDOMNodeId)
127
+ return null;
128
+ const result = await client.send('DOM.resolveNode', { backendNodeId: ref.backendDOMNodeId }, sessionId);
129
+ return result.object?.objectId ?? null;
130
+ }
131
+ export async function getElementBox(client, sessionId, ref) {
132
+ if (!ref.backendDOMNodeId)
133
+ return null;
134
+ try {
135
+ const result = await client.send('DOM.getBoxModel', { backendNodeId: ref.backendDOMNodeId }, sessionId);
136
+ const content = result.model?.content;
137
+ if (!content || content.length < 8)
138
+ return null;
139
+ const x = (content[0] + content[2]) / 2;
140
+ const y = (content[1] + content[5]) / 2;
141
+ return { x, y, width: result.model.width, height: result.model.height };
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/browser/snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAgB9D,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAiB,EACjB,SAAiB,EACjB,UAA2B,EAAE;IAE7B,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAE7D,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CACjC,6BAA6B,EAC7B,EAAE,EACF,SAAS,CACV,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEzD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;QAClD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;QAE5C,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACtE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACnC,IAAI,KAAK;wBAAE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAEhE,IAAI,eAAe,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACnC,IAAI,KAAK;wBAAE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;QAClC,MAAM,OAAO,GAAe;YAC1B,GAAG,EAAE,MAAM;YACX,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,SAAS,GAAa,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QACxE,IAAI,KAAK,CAAC,QAAQ;YAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,IAAI,KAAK,CAAC,WAAW;YAAE,SAAS,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,QAAQ;YAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAE9C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACnC,IAAI,KAAK;oBAAE,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,iBAAiB;IACjB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,IAAI;QAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAE/B,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IAQrC,MAAM,MAAM,GAAyC,EAAE,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5C,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;gBAC1E,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;gBAC3E,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5C,MAAM;QACV,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAiB,EACjB,SAAiB,EACjB,IAA6B,EAC7B,MAAc;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,iCAAiC,CAAC,CAAC;IACnF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAiB,EACjB,SAAiB,EACjB,GAAe;IAEf,IAAI,CAAC,GAAG,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAC9B,iBAAiB,EACjB,EAAE,aAAa,EAAE,GAAG,CAAC,gBAAgB,EAAE,EACvC,SAAS,CACV,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAiB,EACjB,SAAiB,EACjB,GAAe;IAEf,IAAI,CAAC,GAAG,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAS7B,iBAAiB,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,gBAAgB,EAAE,EAAE,SAAS,CAAC,CAAC;QAE1E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ export declare function getLocalStorageKey(client: CdpClient, sessionId: string, key: string): Promise<string | null>;
3
+ export declare function setLocalStorageKey(client: CdpClient, sessionId: string, key: string, value: string): Promise<void>;
4
+ export declare function removeLocalStorageKey(client: CdpClient, sessionId: string, key: string): Promise<void>;
5
+ export declare function clearLocalStorage(client: CdpClient, sessionId: string): Promise<void>;
6
+ export declare function getAllLocalStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>>;
7
+ export declare function getSessionStorageKey(client: CdpClient, sessionId: string, key: string): Promise<string | null>;
8
+ export declare function setSessionStorageKey(client: CdpClient, sessionId: string, key: string, value: string): Promise<void>;
9
+ export declare function clearSessionStorage(client: CdpClient, sessionId: string): Promise<void>;
10
+ export declare function getAllSessionStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>>;
11
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/browser/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGlH;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExH;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5G;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAO9G;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGpH;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1H;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOhH"}
@@ -0,0 +1,43 @@
1
+ import { evaluateJs } from './actions.js';
2
+ export async function getLocalStorageKey(client, sessionId, key) {
3
+ const result = await evaluateJs(client, sessionId, `localStorage.getItem(${JSON.stringify(key)})`);
4
+ return result;
5
+ }
6
+ export async function setLocalStorageKey(client, sessionId, key, value) {
7
+ await evaluateJs(client, sessionId, `localStorage.setItem(${JSON.stringify(key)}, ${JSON.stringify(value)})`);
8
+ }
9
+ export async function removeLocalStorageKey(client, sessionId, key) {
10
+ await evaluateJs(client, sessionId, `localStorage.removeItem(${JSON.stringify(key)})`);
11
+ }
12
+ export async function clearLocalStorage(client, sessionId) {
13
+ await evaluateJs(client, sessionId, 'localStorage.clear()');
14
+ }
15
+ export async function getAllLocalStorage(client, sessionId) {
16
+ const result = await evaluateJs(client, sessionId, 'JSON.stringify(Object.fromEntries(Object.entries(localStorage)))');
17
+ try {
18
+ return JSON.parse(result);
19
+ }
20
+ catch {
21
+ return {};
22
+ }
23
+ }
24
+ export async function getSessionStorageKey(client, sessionId, key) {
25
+ const result = await evaluateJs(client, sessionId, `sessionStorage.getItem(${JSON.stringify(key)})`);
26
+ return result;
27
+ }
28
+ export async function setSessionStorageKey(client, sessionId, key, value) {
29
+ await evaluateJs(client, sessionId, `sessionStorage.setItem(${JSON.stringify(key)}, ${JSON.stringify(value)})`);
30
+ }
31
+ export async function clearSessionStorage(client, sessionId) {
32
+ await evaluateJs(client, sessionId, 'sessionStorage.clear()');
33
+ }
34
+ export async function getAllSessionStorage(client, sessionId) {
35
+ const result = await evaluateJs(client, sessionId, 'JSON.stringify(Object.fromEntries(Object.entries(sessionStorage)))');
36
+ try {
37
+ return JSON.parse(result);
38
+ }
39
+ catch {
40
+ return {};
41
+ }
42
+ }
43
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/browser/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW;IACxF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnG,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW,EAAE,KAAa;IACvG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAChH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW;IAC3F,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,2BAA2B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAiB,EAAE,SAAiB;IAC1E,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAiB;IAC3E,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,MAAM,EACN,SAAS,EACT,kEAAkE,CACnE,CAAC;IACF,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAgB,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW;IAC1F,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,0BAA0B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrG,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW,EAAE,KAAa;IACzG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,0BAA0B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiB,EAAE,SAAiB;IAC5E,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,wBAAwB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAiB;IAC7E,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,MAAM,EACN,SAAS,EACT,oEAAoE,CACrE,CAAC;IACF,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAgB,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CdpClient } from './cdp.js';
2
+ import type { CdpTarget } from './types.js';
3
+ export declare function listTabs(port: number): Promise<CdpTarget[]>;
4
+ export declare function newTab(port: number, url?: string): Promise<CdpTarget>;
5
+ export declare function closeTab(client: CdpClient, sessionId: string, targetId: string): Promise<void>;
6
+ export declare function activateTab(client: CdpClient, sessionId: string, targetId: string): Promise<void>;
7
+ export declare function switchToFrame(client: CdpClient, sessionId: string, frameSelector: string): Promise<string | null>;
8
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/browser/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGjE;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAElF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpG;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvG;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB"}
@@ -0,0 +1,25 @@
1
+ import { fetchTargets, fetchNewTarget } from './cdp.js';
2
+ export async function listTabs(port) {
3
+ const targets = await fetchTargets(port);
4
+ return targets.filter((t) => t.type === 'page');
5
+ }
6
+ export async function newTab(port, url = 'about:blank') {
7
+ return fetchNewTarget(port, url);
8
+ }
9
+ export async function closeTab(client, sessionId, targetId) {
10
+ await client.send('Target.closeTarget', { targetId }, sessionId);
11
+ }
12
+ export async function activateTab(client, sessionId, targetId) {
13
+ await client.send('Target.activateTarget', { targetId }, sessionId);
14
+ }
15
+ export async function switchToFrame(client, sessionId, frameSelector) {
16
+ const result = await client.send('Runtime.evaluate', {
17
+ expression: `
18
+ const frame = document.querySelector(${JSON.stringify(frameSelector)});
19
+ frame ? frame.src || frame.name || null : null
20
+ `,
21
+ returnByValue: true,
22
+ }, sessionId);
23
+ return result.result?.value ?? null;
24
+ }
25
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/browser/tabs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,GAAG,GAAG,aAAa;IAC5D,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAiB,EAAE,SAAiB,EAAE,QAAgB;IACnF,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB,EAAE,SAAiB,EAAE,QAAgB;IACtF,MAAM,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAiB,EACjB,SAAiB,EACjB,aAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiC,kBAAkB,EAAE;QACnF,UAAU,EAAE;6CAC6B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;;KAErE;QACD,aAAa,EAAE,IAAI;KACpB,EAAE,SAAS,CAAC,CAAC;IACd,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;AACtC,CAAC"}