@mechris3/glassbox 0.1.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 (162) hide show
  1. package/README.md +213 -0
  2. package/dist/bin/glassbox.d.ts +14 -0
  3. package/dist/bin/glassbox.d.ts.map +1 -0
  4. package/dist/bin/glassbox.js +140 -0
  5. package/dist/bin/glassbox.js.map +1 -0
  6. package/dist/src/adapters/base-adapter.d.ts +70 -0
  7. package/dist/src/adapters/base-adapter.d.ts.map +1 -0
  8. package/dist/src/adapters/base-adapter.js +155 -0
  9. package/dist/src/adapters/base-adapter.js.map +1 -0
  10. package/dist/src/adapters/browser-adapter.interface.d.ts +41 -0
  11. package/dist/src/adapters/browser-adapter.interface.d.ts.map +1 -0
  12. package/dist/src/adapters/browser-adapter.interface.js +7 -0
  13. package/dist/src/adapters/browser-adapter.interface.js.map +1 -0
  14. package/dist/src/adapters/cdp-adapter.d.ts +63 -0
  15. package/dist/src/adapters/cdp-adapter.d.ts.map +1 -0
  16. package/dist/src/adapters/cdp-adapter.js +231 -0
  17. package/dist/src/adapters/cdp-adapter.js.map +1 -0
  18. package/dist/src/ai/collectors.d.ts +35 -0
  19. package/dist/src/ai/collectors.d.ts.map +1 -0
  20. package/dist/src/ai/collectors.js +170 -0
  21. package/dist/src/ai/collectors.js.map +1 -0
  22. package/dist/src/ai/queries.d.ts +21 -0
  23. package/dist/src/ai/queries.d.ts.map +1 -0
  24. package/dist/src/ai/queries.js +59 -0
  25. package/dist/src/ai/queries.js.map +1 -0
  26. package/dist/src/ai/types.d.ts +55 -0
  27. package/dist/src/ai/types.d.ts.map +1 -0
  28. package/dist/src/ai/types.js +6 -0
  29. package/dist/src/ai/types.js.map +1 -0
  30. package/dist/src/cdp/connection.d.ts +37 -0
  31. package/dist/src/cdp/connection.d.ts.map +1 -0
  32. package/dist/src/cdp/connection.js +86 -0
  33. package/dist/src/cdp/connection.js.map +1 -0
  34. package/dist/src/cdp/connection.test.d.ts +6 -0
  35. package/dist/src/cdp/connection.test.d.ts.map +1 -0
  36. package/dist/src/cdp/connection.test.js +93 -0
  37. package/dist/src/cdp/connection.test.js.map +1 -0
  38. package/dist/src/cdp/domains.d.ts +116 -0
  39. package/dist/src/cdp/domains.d.ts.map +1 -0
  40. package/dist/src/cdp/domains.js +153 -0
  41. package/dist/src/cdp/domains.js.map +1 -0
  42. package/dist/src/cdp/launcher.d.ts +26 -0
  43. package/dist/src/cdp/launcher.d.ts.map +1 -0
  44. package/dist/src/cdp/launcher.js +175 -0
  45. package/dist/src/cdp/launcher.js.map +1 -0
  46. package/dist/src/config.d.ts +28 -0
  47. package/dist/src/config.d.ts.map +1 -0
  48. package/dist/src/config.js +72 -0
  49. package/dist/src/config.js.map +1 -0
  50. package/dist/src/config.test.d.ts +5 -0
  51. package/dist/src/config.test.d.ts.map +1 -0
  52. package/dist/src/config.test.js +46 -0
  53. package/dist/src/config.test.js.map +1 -0
  54. package/dist/src/errors.d.ts +26 -0
  55. package/dist/src/errors.d.ts.map +1 -0
  56. package/dist/src/errors.js +27 -0
  57. package/dist/src/errors.js.map +1 -0
  58. package/dist/src/index.d.ts +18 -0
  59. package/dist/src/index.d.ts.map +1 -0
  60. package/dist/src/index.js +28 -0
  61. package/dist/src/index.js.map +1 -0
  62. package/dist/src/journey.d.ts +35 -0
  63. package/dist/src/journey.d.ts.map +1 -0
  64. package/dist/src/journey.js +39 -0
  65. package/dist/src/journey.js.map +1 -0
  66. package/dist/src/mcp/server.d.ts +22 -0
  67. package/dist/src/mcp/server.d.ts.map +1 -0
  68. package/dist/src/mcp/server.js +229 -0
  69. package/dist/src/mcp/server.js.map +1 -0
  70. package/dist/src/page-objects/base.page.d.ts +28 -0
  71. package/dist/src/page-objects/base.page.d.ts.map +1 -0
  72. package/dist/src/page-objects/base.page.js +51 -0
  73. package/dist/src/page-objects/base.page.js.map +1 -0
  74. package/dist/src/page-objects/browser-context.page.d.ts +14 -0
  75. package/dist/src/page-objects/browser-context.page.d.ts.map +1 -0
  76. package/dist/src/page-objects/browser-context.page.js +28 -0
  77. package/dist/src/page-objects/browser-context.page.js.map +1 -0
  78. package/dist/src/runner/lifecycle-hooks.d.ts +43 -0
  79. package/dist/src/runner/lifecycle-hooks.d.ts.map +1 -0
  80. package/dist/src/runner/lifecycle-hooks.js +70 -0
  81. package/dist/src/runner/lifecycle-hooks.js.map +1 -0
  82. package/dist/src/runner/run-all-journeys.d.ts +35 -0
  83. package/dist/src/runner/run-all-journeys.d.ts.map +1 -0
  84. package/dist/src/runner/run-all-journeys.js +167 -0
  85. package/dist/src/runner/run-all-journeys.js.map +1 -0
  86. package/dist/src/runner/run-journey.d.ts +17 -0
  87. package/dist/src/runner/run-journey.d.ts.map +1 -0
  88. package/dist/src/runner/run-journey.js +179 -0
  89. package/dist/src/runner/run-journey.js.map +1 -0
  90. package/dist/src/runner/spawn-journey.d.ts +36 -0
  91. package/dist/src/runner/spawn-journey.d.ts.map +1 -0
  92. package/dist/src/runner/spawn-journey.js +40 -0
  93. package/dist/src/runner/spawn-journey.js.map +1 -0
  94. package/dist/src/server/diagnostic-service.d.ts +69 -0
  95. package/dist/src/server/diagnostic-service.d.ts.map +1 -0
  96. package/dist/src/server/diagnostic-service.js +165 -0
  97. package/dist/src/server/diagnostic-service.js.map +1 -0
  98. package/dist/src/server/diagnostic-service.test.d.ts +5 -0
  99. package/dist/src/server/diagnostic-service.test.d.ts.map +1 -0
  100. package/dist/src/server/diagnostic-service.test.js +82 -0
  101. package/dist/src/server/diagnostic-service.test.js.map +1 -0
  102. package/dist/src/server/index.d.ts +11 -0
  103. package/dist/src/server/index.d.ts.map +1 -0
  104. package/dist/src/server/index.js +167 -0
  105. package/dist/src/server/index.js.map +1 -0
  106. package/dist/src/server/journey-discovery.d.ts +16 -0
  107. package/dist/src/server/journey-discovery.d.ts.map +1 -0
  108. package/dist/src/server/journey-discovery.js +38 -0
  109. package/dist/src/server/journey-discovery.js.map +1 -0
  110. package/dist/src/server/settings-storage.d.ts +27 -0
  111. package/dist/src/server/settings-storage.d.ts.map +1 -0
  112. package/dist/src/server/settings-storage.js +27 -0
  113. package/dist/src/server/settings-storage.js.map +1 -0
  114. package/dist/src/server/test-executor.d.ts +64 -0
  115. package/dist/src/server/test-executor.d.ts.map +1 -0
  116. package/dist/src/server/test-executor.js +279 -0
  117. package/dist/src/server/test-executor.js.map +1 -0
  118. package/dist/src/server/websocket.d.ts +51 -0
  119. package/dist/src/server/websocket.d.ts.map +1 -0
  120. package/dist/src/server/websocket.js +28 -0
  121. package/dist/src/server/websocket.js.map +1 -0
  122. package/dist/src/utils/browser-discovery.d.ts +11 -0
  123. package/dist/src/utils/browser-discovery.d.ts.map +1 -0
  124. package/dist/src/utils/browser-discovery.js +102 -0
  125. package/dist/src/utils/browser-discovery.js.map +1 -0
  126. package/dist/src/utils/error-formatter.d.ts +13 -0
  127. package/dist/src/utils/error-formatter.d.ts.map +1 -0
  128. package/dist/src/utils/error-formatter.js +29 -0
  129. package/dist/src/utils/error-formatter.js.map +1 -0
  130. package/dist/src/utils/escape.d.ts +10 -0
  131. package/dist/src/utils/escape.d.ts.map +1 -0
  132. package/dist/src/utils/escape.js +22 -0
  133. package/dist/src/utils/escape.js.map +1 -0
  134. package/dist/src/utils/escape.test.d.ts +5 -0
  135. package/dist/src/utils/escape.test.d.ts.map +1 -0
  136. package/dist/src/utils/escape.test.js +49 -0
  137. package/dist/src/utils/escape.test.js.map +1 -0
  138. package/dist/src/utils/page-object-error.d.ts +5 -0
  139. package/dist/src/utils/page-object-error.d.ts.map +1 -0
  140. package/dist/src/utils/page-object-error.js +22 -0
  141. package/dist/src/utils/page-object-error.js.map +1 -0
  142. package/dist/src/utils/profile-discovery.d.ts +20 -0
  143. package/dist/src/utils/profile-discovery.d.ts.map +1 -0
  144. package/dist/src/utils/profile-discovery.js +68 -0
  145. package/dist/src/utils/profile-discovery.js.map +1 -0
  146. package/dist/src/utils/wait-utils.d.ts +10 -0
  147. package/dist/src/utils/wait-utils.d.ts.map +1 -0
  148. package/dist/src/utils/wait-utils.js +20 -0
  149. package/dist/src/utils/wait-utils.js.map +1 -0
  150. package/dist/src/utils/wait-utils.test.d.ts +5 -0
  151. package/dist/src/utils/wait-utils.test.d.ts.map +1 -0
  152. package/dist/src/utils/wait-utils.test.js +30 -0
  153. package/dist/src/utils/wait-utils.test.js.map +1 -0
  154. package/package.json +60 -0
  155. package/src/server/static/index.html +541 -0
  156. package/ui/dist/3rdpartylicenses.txt +419 -0
  157. package/ui/dist/browser/assets/logo.svg +29 -0
  158. package/ui/dist/browser/index.html +13 -0
  159. package/ui/dist/browser/main-7OJWN7GZ.js +16 -0
  160. package/ui/dist/browser/polyfills-5CFQRCPP.js +2 -0
  161. package/ui/dist/browser/styles-HMZYQRBV.css +1 -0
  162. package/ui/dist/prerendered-routes.json +3 -0
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * BrowserAdapter interface — the contract that page objects consume.
4
+ * The CDPAdapter is the sole implementation.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=browser-adapter.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-adapter.interface.js","sourceRoot":"","sources":["../../../src/adapters/browser-adapter.interface.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * CDPAdapter — the sole BrowserAdapter implementation.
3
+ * Speaks Chrome DevTools Protocol directly via WebSocket.
4
+ *
5
+ * Uses a wrapAction() helper to eliminate boilerplate across methods,
6
+ * and escapeJS() to prevent selector injection in evaluate calls.
7
+ */
8
+ import { BaseAdapter } from './base-adapter.js';
9
+ import type { DownloadResult } from './browser-adapter.interface.js';
10
+ import { CDPConnection } from '../cdp/connection.js';
11
+ export declare class CDPAdapter extends BaseAdapter {
12
+ private connection;
13
+ private runtime;
14
+ private page;
15
+ private dom;
16
+ private input;
17
+ private network;
18
+ private storage;
19
+ constructor(connection: CDPConnection, sessionId: string);
20
+ /**
21
+ * Wrap an adapter action with the debugger lifecycle:
22
+ * logAndCheckAction → execute → logActionComplete → addSlowModeDelay.
23
+ */
24
+ private wrapAction;
25
+ /** Evaluate a JS expression in the page and return the value. Throws on page-side exceptions. */
26
+ private eval;
27
+ click(selector: string): Promise<void>;
28
+ fill(selector: string, value: string): Promise<void>;
29
+ type(selector: string, value: string, options?: {
30
+ delay?: number;
31
+ }): Promise<void>;
32
+ getText(selector: string): Promise<string>;
33
+ getInputValue(selector: string): Promise<string>;
34
+ getAttribute(selector: string, attribute: string): Promise<string | null>;
35
+ countElements(selector: string): Promise<number>;
36
+ isVisible(selector: string): Promise<boolean>;
37
+ isDisabled(selector: string): Promise<boolean>;
38
+ waitForSelector(selector: string, options?: {
39
+ timeout?: number;
40
+ }): Promise<void>;
41
+ waitForHidden(selector: string, options?: {
42
+ timeout?: number;
43
+ }): Promise<void>;
44
+ waitForTimeout(ms: number): Promise<void>;
45
+ goto(url: string): Promise<void>;
46
+ clickAndWaitForNavigation(selector: string): Promise<void>;
47
+ getCurrentUrl(): Promise<string>;
48
+ evaluate<T = unknown>(script: string | (() => T)): Promise<T>;
49
+ clearSession(origin?: string): Promise<void>;
50
+ readClipboard(): Promise<string>;
51
+ uploadFile(selector: string, filePath: string): Promise<void>;
52
+ selectByIndex(selector: string, index: number): Promise<void>;
53
+ selectByValue(selector: string, value: string): Promise<void>;
54
+ selectByText(selector: string, text: string, exact?: boolean): Promise<void>;
55
+ clickAndDownload(selector: string): Promise<DownloadResult>;
56
+ clearDownloads(): Promise<void>;
57
+ /**
58
+ * Wait for a single Page.loadEventFired, then self-remove the listener.
59
+ * Includes a timeout to prevent hanging on failed navigations.
60
+ */
61
+ private waitForLoadEvent;
62
+ }
63
+ //# sourceMappingURL=cdp-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/cdp-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ /**
3
+ * CDPAdapter — the sole BrowserAdapter implementation.
4
+ * Speaks Chrome DevTools Protocol directly via WebSocket.
5
+ *
6
+ * Uses a wrapAction() helper to eliminate boilerplate across methods,
7
+ * and escapeJS() to prevent selector injection in evaluate calls.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CDPAdapter = void 0;
11
+ const base_adapter_js_1 = require("./base-adapter.js");
12
+ const domains_js_1 = require("../cdp/domains.js");
13
+ const escape_js_1 = require("../utils/escape.js");
14
+ /** Default timeout for navigation events (ms). */
15
+ const NAVIGATION_TIMEOUT = 30_000;
16
+ class CDPAdapter extends base_adapter_js_1.BaseAdapter {
17
+ connection;
18
+ runtime;
19
+ page;
20
+ dom;
21
+ input;
22
+ network;
23
+ storage;
24
+ constructor(connection, sessionId) {
25
+ super();
26
+ this.connection = connection;
27
+ this.runtime = new domains_js_1.RuntimeDomain(connection, sessionId);
28
+ this.page = new domains_js_1.PageDomain(connection, sessionId);
29
+ this.dom = new domains_js_1.DOMDomain(connection, sessionId);
30
+ this.input = new domains_js_1.InputDomain(connection, sessionId);
31
+ this.network = new domains_js_1.NetworkDomain(connection, sessionId);
32
+ this.storage = new domains_js_1.StorageDomain(connection, sessionId);
33
+ }
34
+ // --- Core helper ---
35
+ /**
36
+ * Wrap an adapter action with the debugger lifecycle:
37
+ * logAndCheckAction → execute → logActionComplete → addSlowModeDelay.
38
+ */
39
+ async wrapAction(description, fn) {
40
+ await this.logAndCheckAction(description);
41
+ const result = await fn();
42
+ this.logActionComplete();
43
+ await this.addSlowModeDelay();
44
+ return result;
45
+ }
46
+ /** Evaluate a JS expression in the page and return the value. Throws on page-side exceptions. */
47
+ async eval(expression) {
48
+ const result = await this.runtime.evaluate(expression, { awaitPromise: true, returnByValue: true });
49
+ const response = result;
50
+ if (response.exceptionDetails) {
51
+ const desc = response.exceptionDetails.exception?.description ?? response.exceptionDetails.text ?? 'Unknown page error';
52
+ throw new Error(`Page evaluation failed: ${desc}`);
53
+ }
54
+ return response.result.value;
55
+ }
56
+ // --- Element interaction ---
57
+ async click(selector) {
58
+ return this.wrapAction(`Click: ${selector}`, () => this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}').click()`));
59
+ }
60
+ async fill(selector, value) {
61
+ const s = (0, escape_js_1.escapeJS)(selector);
62
+ const v = (0, escape_js_1.escapeJS)(value);
63
+ return this.wrapAction(`Fill: ${selector}`, () => this.eval(`(() => { const el = document.querySelector('${s}'); el.focus(); el.value = '${v}'; el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); })()`));
64
+ }
65
+ async type(selector, value, options) {
66
+ await this.logAndCheckAction(`Type: ${selector}`);
67
+ await this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}').focus()`);
68
+ const delay = options?.delay ?? 50;
69
+ for (const char of value) {
70
+ await this.input.dispatchKeyEvent('keyDown', { key: char, text: char });
71
+ await this.input.dispatchKeyEvent('char', { text: char });
72
+ await this.input.dispatchKeyEvent('keyUp', { key: char });
73
+ if (delay > 0)
74
+ await new Promise((r) => setTimeout(r, delay));
75
+ }
76
+ this.logActionComplete();
77
+ await this.addSlowModeDelay();
78
+ }
79
+ // --- Element queries ---
80
+ async getText(selector) {
81
+ return this.wrapAction(`Get text: ${selector}`, () => this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}')?.textContent ?? ''`));
82
+ }
83
+ async getInputValue(selector) {
84
+ return this.wrapAction(`Get input value: ${selector}`, () => this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}')?.value ?? ''`));
85
+ }
86
+ async getAttribute(selector, attribute) {
87
+ return this.wrapAction(`Get attribute: ${selector} [${attribute}]`, () => this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}')?.getAttribute('${(0, escape_js_1.escapeJS)(attribute)}')`));
88
+ }
89
+ async countElements(selector) {
90
+ return this.wrapAction(`Count elements: ${selector}`, () => this.eval(`document.querySelectorAll('${(0, escape_js_1.escapeJS)(selector)}').length`));
91
+ }
92
+ async isVisible(selector) {
93
+ return this.wrapAction(`Is visible: ${selector}`, () => this.eval(`(() => { const el = document.querySelector('${(0, escape_js_1.escapeJS)(selector)}'); return el !== null && el.offsetParent !== null; })()`));
94
+ }
95
+ async isDisabled(selector) {
96
+ return this.wrapAction(`Is disabled: ${selector}`, () => this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}')?.disabled ?? false`));
97
+ }
98
+ // --- Waiting ---
99
+ async waitForSelector(selector, options) {
100
+ await this.logAndCheckAction(`Wait for: ${selector}`);
101
+ const timeout = options?.timeout ?? 5000;
102
+ const interval = 100;
103
+ const start = Date.now();
104
+ while (Date.now() - start < timeout) {
105
+ const found = await this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}') !== null`);
106
+ if (found) {
107
+ this.logActionComplete();
108
+ await this.addSlowModeDelay();
109
+ return;
110
+ }
111
+ await new Promise((r) => setTimeout(r, interval));
112
+ }
113
+ throw new Error(`Selector '${selector}' not found within ${timeout}ms`);
114
+ }
115
+ async waitForHidden(selector, options) {
116
+ await this.logAndCheckAction(`Wait for hidden: ${selector}`);
117
+ const timeout = options?.timeout ?? 5000;
118
+ const interval = 100;
119
+ const start = Date.now();
120
+ while (Date.now() - start < timeout) {
121
+ const gone = await this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}') === null`);
122
+ if (gone) {
123
+ this.logActionComplete();
124
+ await this.addSlowModeDelay();
125
+ return;
126
+ }
127
+ await new Promise((r) => setTimeout(r, interval));
128
+ }
129
+ throw new Error(`Selector '${selector}' still visible after ${timeout}ms`);
130
+ }
131
+ async waitForTimeout(ms) {
132
+ await this.logAndCheckAction(`Wait: ${ms}ms`);
133
+ await new Promise((r) => setTimeout(r, ms));
134
+ this.logActionComplete();
135
+ }
136
+ // --- Navigation ---
137
+ async goto(url) {
138
+ const resolved = this.resolveUrl(url);
139
+ return this.wrapAction(`Navigate: ${resolved}`, async () => {
140
+ // Register listener BEFORE navigate to avoid race with fast-loading pages
141
+ const loadPromise = this.waitForLoadEvent();
142
+ await this.page.navigate(resolved);
143
+ await loadPromise;
144
+ });
145
+ }
146
+ async clickAndWaitForNavigation(selector) {
147
+ return this.wrapAction(`Click and navigate: ${selector}`, async () => {
148
+ // Register listener BEFORE click to avoid race with fast navigations
149
+ const loadPromise = this.waitForLoadEvent();
150
+ await this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}').click()`);
151
+ await loadPromise;
152
+ });
153
+ }
154
+ async getCurrentUrl() {
155
+ return this.wrapAction('Get current URL', () => this.eval('window.location.href'));
156
+ }
157
+ // --- Evaluate ---
158
+ async evaluate(script) {
159
+ const expression = typeof script === 'function' ? `(${script.toString()})()` : script;
160
+ return this.wrapAction(`Evaluate: ${expression.slice(0, 60)}...`, () => this.eval(expression));
161
+ }
162
+ // --- Session & context ---
163
+ async clearSession(origin) {
164
+ return this.wrapAction(`Clear session${origin ? `: ${origin}` : ''}`, async () => {
165
+ await this.network.clearBrowserCookies();
166
+ if (origin) {
167
+ await this.storage.clearDataForOrigin(origin);
168
+ }
169
+ });
170
+ }
171
+ async readClipboard() {
172
+ return this.wrapAction('Read clipboard', () => this.eval('navigator.clipboard.readText()'));
173
+ }
174
+ async uploadFile(selector, filePath) {
175
+ return this.wrapAction(`Upload file: ${selector}`, async () => {
176
+ const doc = await this.dom.getDocument();
177
+ const node = await this.dom.querySelector(doc.root.nodeId, selector);
178
+ await this.dom.setFileInputFiles([filePath], node.nodeId);
179
+ });
180
+ }
181
+ // --- Dropdowns ---
182
+ async selectByIndex(selector, index) {
183
+ const s = (0, escape_js_1.escapeJS)(selector);
184
+ return this.wrapAction(`Select by index: ${selector} [${index}]`, () => this.eval(`(() => { const el = document.querySelector('${s}'); el.selectedIndex = ${index}; el.dispatchEvent(new Event('change', { bubbles: true })); })()`));
185
+ }
186
+ async selectByValue(selector, value) {
187
+ const s = (0, escape_js_1.escapeJS)(selector);
188
+ const v = (0, escape_js_1.escapeJS)(value);
189
+ return this.wrapAction(`Select by value: ${selector} [${value}]`, () => this.eval(`(() => { const el = document.querySelector('${s}'); el.value = '${v}'; el.dispatchEvent(new Event('change', { bubbles: true })); })()`));
190
+ }
191
+ async selectByText(selector, text, exact = true) {
192
+ const s = (0, escape_js_1.escapeJS)(selector);
193
+ const t = (0, escape_js_1.escapeJS)(text);
194
+ const matchExpr = exact ? `o.textContent.trim() === '${t}'` : `o.textContent.trim().includes('${t}')`;
195
+ return this.wrapAction(`Select by text: ${selector} [${text}]`, () => this.eval(`(() => { const el = document.querySelector('${s}'); const option = Array.from(el.options).find(o => ${matchExpr}); if (option) { el.value = option.value; el.dispatchEvent(new Event('change', { bubbles: true })); } })()`));
196
+ }
197
+ // --- Downloads ---
198
+ async clickAndDownload(selector) {
199
+ return this.wrapAction(`Click and download: ${selector}`, async () => {
200
+ // TODO: Implement with Page.setDownloadBehavior + filesystem polling
201
+ await this.eval(`document.querySelector('${(0, escape_js_1.escapeJS)(selector)}').click()`);
202
+ return { filePath: '', suggestedFilename: '' };
203
+ });
204
+ }
205
+ async clearDownloads() {
206
+ return this.wrapAction('Clear downloads', async () => {
207
+ // TODO: Clean download directory
208
+ });
209
+ }
210
+ // --- Private helpers ---
211
+ /**
212
+ * Wait for a single Page.loadEventFired, then self-remove the listener.
213
+ * Includes a timeout to prevent hanging on failed navigations.
214
+ */
215
+ waitForLoadEvent() {
216
+ return new Promise((resolve, reject) => {
217
+ const timeout = setTimeout(() => {
218
+ this.connection.off('Page.loadEventFired', handler);
219
+ reject(new Error(`Navigation did not complete within ${NAVIGATION_TIMEOUT}ms`));
220
+ }, NAVIGATION_TIMEOUT);
221
+ const handler = () => {
222
+ clearTimeout(timeout);
223
+ this.connection.off('Page.loadEventFired', handler);
224
+ resolve();
225
+ };
226
+ this.connection.on('Page.loadEventFired', handler);
227
+ });
228
+ }
229
+ }
230
+ exports.CDPAdapter = CDPAdapter;
231
+ //# sourceMappingURL=cdp-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-adapter.js","sourceRoot":"","sources":["../../../src/adapters/cdp-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * DiagnosticCollector — passive CDP event recorder.
3
+ * Runs silently in the background, captures runtime events for debugging and performance monitoring.
4
+ */
5
+ import type { CDPConnection } from '../cdp/connection.js';
6
+ import type { ConsoleError, ExceptionDetail, NetworkRequest, NetworkFailure, MetricsSnapshot, TimelineEntry } from './types.js';
7
+ export declare class DiagnosticCollector {
8
+ private connection;
9
+ private sessionId?;
10
+ private consoleErrors;
11
+ private exceptions;
12
+ private networkRequests;
13
+ private networkFailures;
14
+ private metricsSnapshots;
15
+ private timeline;
16
+ private handlers;
17
+ private registeredHandlers;
18
+ constructor(connection: CDPConnection, sessionId?: string | undefined);
19
+ getConsoleErrors(): ConsoleError[];
20
+ getExceptions(): ExceptionDetail[];
21
+ getNetworkLog(): NetworkRequest[];
22
+ getNetworkFailures(): NetworkFailure[];
23
+ getMetricsReport(): MetricsSnapshot[];
24
+ getTimeline(lastN?: number): TimelineEntry[];
25
+ captureMetricsSnapshot(label: string): Promise<void>;
26
+ reset(): void;
27
+ dispose(): void;
28
+ private handleConsoleCall;
29
+ private handleException;
30
+ private handleRequestSent;
31
+ private handleResponseReceived;
32
+ private handleLoadingFailed;
33
+ private parseStackTrace;
34
+ }
35
+ //# sourceMappingURL=collectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectors.d.ts","sourceRoot":"","sources":["../../../src/ai/collectors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,mBAAmB;IAkBlB,OAAO,CAAC,UAAU;IAAiB,OAAO,CAAC,SAAS,CAAC;IAjBjE,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,QAAQ,CAMb;IAEH,OAAO,CAAC,kBAAkB,CAAkE;gBAExE,UAAU,EAAE,aAAa,EAAU,SAAS,CAAC,EAAE,MAAM,YAAA;IAgBzE,gBAAgB,IAAI,YAAY,EAAE;IAIlC,aAAa,IAAI,eAAe,EAAE;IAIlC,aAAa,IAAI,cAAc,EAAE;IAIjC,kBAAkB,IAAI,cAAc,EAAE;IAItC,gBAAgB,IAAI,eAAe,EAAE;IAIrC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAKtC,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1D,KAAK,IAAI,IAAI;IASb,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * DiagnosticCollector — passive CDP event recorder.
4
+ * Runs silently in the background, captures runtime events for debugging and performance monitoring.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DiagnosticCollector = void 0;
8
+ class DiagnosticCollector {
9
+ connection;
10
+ sessionId;
11
+ consoleErrors = [];
12
+ exceptions = [];
13
+ networkRequests = new Map();
14
+ networkFailures = [];
15
+ metricsSnapshots = [];
16
+ timeline = [];
17
+ handlers = new Map([
18
+ ['Runtime.consoleAPICalled', (params) => this.handleConsoleCall(params)],
19
+ ['Runtime.exceptionThrown', (params) => this.handleException(params)],
20
+ ['Network.requestWillBeSent', (params) => this.handleRequestSent(params)],
21
+ ['Network.responseReceived', (params) => this.handleResponseReceived(params)],
22
+ ['Network.loadingFailed', (params) => this.handleLoadingFailed(params)],
23
+ ]);
24
+ registeredHandlers = [];
25
+ constructor(connection, sessionId) {
26
+ this.connection = connection;
27
+ this.sessionId = sessionId;
28
+ for (const [event, handler] of this.handlers) {
29
+ // Wrap handlers to filter by sessionId when specified
30
+ const wrappedHandler = this.sessionId
31
+ ? (params) => {
32
+ if (params['sessionId'] && params['sessionId'] !== this.sessionId)
33
+ return;
34
+ handler(params);
35
+ }
36
+ : handler;
37
+ this.registeredHandlers.push([event, wrappedHandler]);
38
+ this.connection.on(event, wrappedHandler);
39
+ }
40
+ }
41
+ // --- Getters (data exposure API) ---
42
+ getConsoleErrors() {
43
+ return [...this.consoleErrors];
44
+ }
45
+ getExceptions() {
46
+ return [...this.exceptions];
47
+ }
48
+ getNetworkLog() {
49
+ return [...this.networkRequests.values()];
50
+ }
51
+ getNetworkFailures() {
52
+ return [...this.networkFailures];
53
+ }
54
+ getMetricsReport() {
55
+ return [...this.metricsSnapshots];
56
+ }
57
+ getTimeline(lastN) {
58
+ if (lastN)
59
+ return this.timeline.slice(-lastN);
60
+ return [...this.timeline];
61
+ }
62
+ async captureMetricsSnapshot(label) {
63
+ const result = await this.connection.send('Performance.getMetrics', undefined, this.sessionId);
64
+ const metrics = {};
65
+ for (const m of result.metrics) {
66
+ metrics[m.name] = m.value;
67
+ }
68
+ const snapshot = { label, timestamp: Date.now(), metrics };
69
+ this.metricsSnapshots.push(snapshot);
70
+ this.timeline.push({ type: 'metrics', timestamp: Date.now(), data: snapshot });
71
+ }
72
+ reset() {
73
+ this.consoleErrors = [];
74
+ this.exceptions = [];
75
+ this.networkRequests.clear();
76
+ this.networkFailures = [];
77
+ this.metricsSnapshots = [];
78
+ this.timeline = [];
79
+ }
80
+ dispose() {
81
+ for (const [event, handler] of this.registeredHandlers) {
82
+ this.connection.off(event, handler);
83
+ }
84
+ this.registeredHandlers = [];
85
+ }
86
+ // --- Private handlers ---
87
+ handleConsoleCall(params) {
88
+ const type = params.type;
89
+ if (type !== 'error' && type !== 'warning')
90
+ return;
91
+ const args = params.args ?? [];
92
+ const entry = {
93
+ level: type === 'error' ? 'error' : 'warning',
94
+ text: args.map((a) => a.value ?? a.description ?? '').join(' '),
95
+ args: args.map((a) => a.value ?? a.description ?? ''),
96
+ timestamp: Date.now(),
97
+ stackTrace: this.parseStackTrace(params.stackTrace),
98
+ };
99
+ this.consoleErrors.push(entry);
100
+ this.timeline.push({ type: 'console', timestamp: Date.now(), data: entry });
101
+ }
102
+ handleException(params) {
103
+ const exceptionDetails = params.exceptionDetails;
104
+ if (!exceptionDetails)
105
+ return;
106
+ const exception = exceptionDetails.exception;
107
+ const entry = {
108
+ text: exceptionDetails.text ?? '',
109
+ description: exception?.description ?? '',
110
+ lineNumber: exceptionDetails.lineNumber,
111
+ columnNumber: exceptionDetails.columnNumber,
112
+ url: exceptionDetails.url,
113
+ stackTrace: this.parseStackTrace(exceptionDetails.stackTrace),
114
+ timestamp: Date.now(),
115
+ };
116
+ this.exceptions.push(entry);
117
+ this.timeline.push({ type: 'exception', timestamp: Date.now(), data: entry });
118
+ }
119
+ handleRequestSent(params) {
120
+ const request = params.request;
121
+ const entry = {
122
+ requestId: params.requestId,
123
+ url: request.url,
124
+ method: request.method,
125
+ timestamp: Date.now(),
126
+ type: params.type ?? 'Other',
127
+ };
128
+ this.networkRequests.set(entry.requestId, entry);
129
+ this.timeline.push({ type: 'network-request', timestamp: Date.now(), data: entry });
130
+ }
131
+ handleResponseReceived(params) {
132
+ const response = params.response;
133
+ const requestId = params.requestId;
134
+ const existing = this.networkRequests.get(requestId);
135
+ if (existing) {
136
+ existing.status = response.status;
137
+ existing.statusText = response.statusText;
138
+ }
139
+ this.timeline.push({ type: 'network-response', timestamp: Date.now(), data: { requestId, status: response.status } });
140
+ }
141
+ handleLoadingFailed(params) {
142
+ const entry = {
143
+ requestId: params.requestId,
144
+ url: this.networkRequests.get(params.requestId)?.url ?? 'unknown',
145
+ method: this.networkRequests.get(params.requestId)?.method ?? 'unknown',
146
+ errorText: params.errorText ?? 'Unknown error',
147
+ timestamp: Date.now(),
148
+ };
149
+ const existing = this.networkRequests.get(entry.requestId);
150
+ if (existing) {
151
+ existing.failed = true;
152
+ existing.failureReason = entry.errorText;
153
+ }
154
+ this.networkFailures.push(entry);
155
+ this.timeline.push({ type: 'network-failure', timestamp: Date.now(), data: entry });
156
+ }
157
+ parseStackTrace(stackTrace) {
158
+ if (!stackTrace)
159
+ return [];
160
+ const callFrames = stackTrace.callFrames ?? [];
161
+ return callFrames.map((frame) => ({
162
+ functionName: frame.functionName ?? '',
163
+ url: frame.url ?? '',
164
+ lineNumber: frame.lineNumber ?? 0,
165
+ columnNumber: frame.columnNumber ?? 0,
166
+ }));
167
+ }
168
+ }
169
+ exports.DiagnosticCollector = DiagnosticCollector;
170
+ //# sourceMappingURL=collectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../../src/ai/collectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * On-demand state queries — fetch current browser state when requested.
3
+ */
4
+ import type { CDPConnection } from '../cdp/connection.js';
5
+ export declare class StateQueryService {
6
+ private connection;
7
+ private sessionId?;
8
+ constructor(connection: CDPConnection, sessionId?: string | undefined);
9
+ getDOMSnapshot(selector?: string): Promise<string>;
10
+ getAccessibilityTree(): Promise<unknown>;
11
+ captureScreenshot(options?: {
12
+ selector?: string;
13
+ fullPage?: boolean;
14
+ }): Promise<string>;
15
+ getStorageState(origin?: string): Promise<{
16
+ localStorage: Record<string, string>;
17
+ cookies: unknown[];
18
+ }>;
19
+ getPerformanceMetrics(): Promise<Record<string, number>>;
20
+ }
21
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/ai/queries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,iBAAiB;IAChB,OAAO,CAAC,UAAU;IAAiB,OAAO,CAAC,SAAS,CAAC;gBAA7C,UAAU,EAAE,aAAa,EAAU,SAAS,CAAC,EAAE,MAAM,YAAA;IAEnE,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAalD,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,iBAAiB,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAevF,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAcvG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAU/D"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * On-demand state queries — fetch current browser state when requested.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StateQueryService = void 0;
7
+ class StateQueryService {
8
+ connection;
9
+ sessionId;
10
+ constructor(connection, sessionId) {
11
+ this.connection = connection;
12
+ this.sessionId = sessionId;
13
+ }
14
+ async getDOMSnapshot(selector) {
15
+ const expression = selector
16
+ ? `document.querySelector('${selector}')?.outerHTML ?? 'Element not found'`
17
+ : `document.documentElement.outerHTML`;
18
+ const result = await this.connection.send('Runtime.evaluate', {
19
+ expression,
20
+ returnByValue: true,
21
+ }, this.sessionId);
22
+ return result.result.value;
23
+ }
24
+ async getAccessibilityTree() {
25
+ return this.connection.send('Accessibility.getFullAXTree', undefined, this.sessionId);
26
+ }
27
+ async captureScreenshot(options) {
28
+ if (options?.fullPage) {
29
+ const metrics = await this.connection.send('Page.getLayoutMetrics', undefined, this.sessionId);
30
+ const result = await this.connection.send('Page.captureScreenshot', {
31
+ clip: { x: 0, y: 0, width: metrics.contentSize.width, height: metrics.contentSize.height, scale: 1 },
32
+ }, this.sessionId);
33
+ return result.data;
34
+ }
35
+ const result = await this.connection.send('Page.captureScreenshot', undefined, this.sessionId);
36
+ return result.data;
37
+ }
38
+ async getStorageState(origin) {
39
+ const cookiesResult = await this.connection.send('Network.getCookies', undefined, this.sessionId);
40
+ let localStorage = {};
41
+ if (origin) {
42
+ const storageResult = await this.connection.send('DOMStorage.getDOMStorageItems', {
43
+ storageId: { securityOrigin: origin, isLocalStorage: true },
44
+ }, this.sessionId);
45
+ localStorage = Object.fromEntries(storageResult.entries ?? []);
46
+ }
47
+ return { localStorage, cookies: cookiesResult.cookies };
48
+ }
49
+ async getPerformanceMetrics() {
50
+ const result = await this.connection.send('Performance.getMetrics', undefined, this.sessionId);
51
+ const metrics = {};
52
+ for (const m of result.metrics) {
53
+ metrics[m.name] = m.value;
54
+ }
55
+ return metrics;
56
+ }
57
+ }
58
+ exports.StateQueryService = StateQueryService;
59
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/ai/queries.ts"],"names":[],"mappings":"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"}