cbrowser 10.5.0 → 10.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
  2. package/dist/analysis/accessibility-empathy.js +2 -2
  3. package/dist/analysis/accessibility-empathy.js.map +1 -1
  4. package/dist/analysis/agent-ready-audit.d.ts +1 -1
  5. package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
  6. package/dist/analysis/agent-ready-audit.js +2 -2
  7. package/dist/analysis/agent-ready-audit.js.map +1 -1
  8. package/dist/analysis/bug-hunter.js +2 -2
  9. package/dist/analysis/bug-hunter.js.map +1 -1
  10. package/dist/analysis/competitive-benchmark.d.ts.map +1 -1
  11. package/dist/analysis/competitive-benchmark.js +1 -1
  12. package/dist/analysis/competitive-benchmark.js.map +1 -1
  13. package/dist/analysis/natural-language.js +1 -1
  14. package/dist/analysis/natural-language.js.map +1 -1
  15. package/dist/browser/index.d.ts +12 -0
  16. package/dist/browser/index.d.ts.map +1 -0
  17. package/dist/browser/index.js +9 -0
  18. package/dist/browser/index.js.map +1 -0
  19. package/dist/browser/overlay-handler.d.ts +42 -0
  20. package/dist/browser/overlay-handler.d.ts.map +1 -0
  21. package/dist/browser/overlay-handler.js +334 -0
  22. package/dist/browser/overlay-handler.js.map +1 -0
  23. package/dist/browser/selector-cache.d.ts +69 -0
  24. package/dist/browser/selector-cache.d.ts.map +1 -0
  25. package/dist/browser/selector-cache.js +193 -0
  26. package/dist/browser/selector-cache.js.map +1 -0
  27. package/dist/browser/session-manager.d.ts +60 -0
  28. package/dist/browser/session-manager.d.ts.map +1 -0
  29. package/dist/browser/session-manager.js +261 -0
  30. package/dist/browser/session-manager.js.map +1 -0
  31. package/dist/browser.d.ts +8 -39
  32. package/dist/browser.d.ts.map +1 -1
  33. package/dist/browser.js +65 -642
  34. package/dist/browser.js.map +1 -1
  35. package/dist/cli.js +2 -2
  36. package/dist/cli.js.map +1 -1
  37. package/dist/cognitive/focus-hierarchies.d.ts.map +1 -1
  38. package/dist/cognitive/focus-hierarchies.js +1 -1
  39. package/dist/cognitive/focus-hierarchies.js.map +1 -1
  40. package/dist/cognitive/index.d.ts.map +1 -1
  41. package/dist/cognitive/index.js +1 -1
  42. package/dist/cognitive/index.js.map +1 -1
  43. package/dist/daemon.js.map +1 -1
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +4 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/mcp-server-remote.d.ts.map +1 -1
  49. package/dist/mcp-server-remote.js.map +1 -1
  50. package/dist/mcp-server.d.ts.map +1 -1
  51. package/dist/mcp-server.js.map +1 -1
  52. package/dist/performance/metrics.js +1 -1
  53. package/dist/performance/metrics.js.map +1 -1
  54. package/dist/personas.d.ts.map +1 -1
  55. package/dist/testing/coverage.d.ts.map +1 -1
  56. package/dist/testing/coverage.js +1 -1
  57. package/dist/testing/coverage.js.map +1 -1
  58. package/dist/testing/test-repair.js +2 -2
  59. package/dist/testing/test-repair.js.map +1 -1
  60. package/dist/version.js.map +1 -1
  61. package/dist/visual/cross-browser.js +1 -1
  62. package/dist/visual/cross-browser.js.map +1 -1
  63. package/dist/visual/regression.js +1 -1
  64. package/dist/visual/regression.js.map +1 -1
  65. package/dist/visual/responsive.js +1 -1
  66. package/dist/visual/responsive.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Selector Cache - Self-healing selector persistence
3
+ *
4
+ * Stores working selector alternatives for faster element finding.
5
+ * Extracted from CBrowser class for better modularity.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync } from "fs";
8
+ import { join } from "path";
9
+ /**
10
+ * Manages self-healing selector cache for faster element finding.
11
+ */
12
+ export class SelectorCacheManager {
13
+ config;
14
+ cache = null;
15
+ currentDomain = "unknown";
16
+ constructor(config) {
17
+ this.config = config;
18
+ }
19
+ /**
20
+ * Set current domain for cache key generation.
21
+ */
22
+ setCurrentDomain(domain) {
23
+ this.currentDomain = domain;
24
+ }
25
+ /**
26
+ * Get current domain.
27
+ */
28
+ getCurrentDomain() {
29
+ return this.currentDomain;
30
+ }
31
+ /**
32
+ * Get the cache file path.
33
+ */
34
+ getCachePath() {
35
+ return join(this.config.dataDir, "selector-cache.json");
36
+ }
37
+ /**
38
+ * Load the cache from disk.
39
+ */
40
+ load() {
41
+ if (this.cache)
42
+ return this.cache;
43
+ const cachePath = this.getCachePath();
44
+ if (existsSync(cachePath)) {
45
+ try {
46
+ const data = readFileSync(cachePath, "utf-8");
47
+ this.cache = JSON.parse(data);
48
+ return this.cache;
49
+ }
50
+ catch (e) {
51
+ if (this.config.verbose) {
52
+ console.debug(`[CBrowser] Corrupted selector cache, starting fresh: ${e.message}`);
53
+ }
54
+ }
55
+ }
56
+ this.cache = { version: 1, entries: {} };
57
+ return this.cache;
58
+ }
59
+ /**
60
+ * Save the cache to disk.
61
+ */
62
+ save() {
63
+ if (!this.cache)
64
+ return;
65
+ const cachePath = this.getCachePath();
66
+ writeFileSync(cachePath, JSON.stringify(this.cache, null, 2));
67
+ }
68
+ /**
69
+ * Get cache key for a selector.
70
+ */
71
+ getKey(selector, domain) {
72
+ const d = domain || this.currentDomain;
73
+ return `${d}::${selector.toLowerCase()}`;
74
+ }
75
+ /**
76
+ * Cache a working alternative selector.
77
+ */
78
+ cacheAlternative(original, working, reason = "Alternative found") {
79
+ // Reject empty or meaningless selectors
80
+ if (!working || working.trim() === "" || working === 'text=""' || working === "text=''") {
81
+ if (this.config.verbose) {
82
+ console.log(`⚠️ Rejected invalid selector for caching: "${working}"`);
83
+ }
84
+ return;
85
+ }
86
+ const cache = this.load();
87
+ const key = this.getKey(original);
88
+ const domain = this.currentDomain;
89
+ cache.entries[key] = {
90
+ originalSelector: original,
91
+ workingSelector: working,
92
+ domain,
93
+ successCount: 1,
94
+ failCount: 0,
95
+ lastUsed: new Date().toISOString(),
96
+ reason,
97
+ };
98
+ this.save();
99
+ if (this.config.verbose) {
100
+ console.log(`📦 Cached healed selector: "${original}" → "${working}"`);
101
+ }
102
+ }
103
+ /**
104
+ * Get a cached alternative selector if available.
105
+ */
106
+ getCached(original) {
107
+ const cache = this.load();
108
+ const key = this.getKey(original);
109
+ const entry = cache.entries[key] || null;
110
+ if (entry && (entry.workingSelector === 'text=""' || entry.workingSelector === "text=''" || entry.workingSelector.trim() === "")) {
111
+ return null; // Reject invalid cached selectors
112
+ }
113
+ return entry;
114
+ }
115
+ /**
116
+ * Update cache entry statistics.
117
+ */
118
+ updateStats(original, success) {
119
+ const cache = this.load();
120
+ const key = this.getKey(original);
121
+ const entry = cache.entries[key];
122
+ if (entry) {
123
+ if (success) {
124
+ entry.successCount++;
125
+ }
126
+ else {
127
+ entry.failCount++;
128
+ }
129
+ entry.lastUsed = new Date().toISOString();
130
+ this.save();
131
+ }
132
+ }
133
+ /**
134
+ * Get cache statistics.
135
+ */
136
+ getStats() {
137
+ const cache = this.load();
138
+ const entries = Object.values(cache.entries);
139
+ const byDomain = {};
140
+ for (const entry of entries) {
141
+ byDomain[entry.domain] = (byDomain[entry.domain] || 0) + 1;
142
+ }
143
+ const topHealedSelectors = entries
144
+ .sort((a, b) => b.successCount - a.successCount)
145
+ .slice(0, 10)
146
+ .map((e) => ({
147
+ original: e.originalSelector,
148
+ working: e.workingSelector,
149
+ heals: e.successCount,
150
+ }));
151
+ return {
152
+ totalEntries: entries.length,
153
+ totalHeals: entries.reduce((sum, e) => sum + e.successCount, 0),
154
+ byDomain,
155
+ topHealedSelectors,
156
+ };
157
+ }
158
+ /**
159
+ * Clear the cache.
160
+ */
161
+ clear(domain) {
162
+ const cache = this.load();
163
+ let cleared = 0;
164
+ if (domain) {
165
+ // Clear only for specific domain
166
+ for (const [key, entry] of Object.entries(cache.entries)) {
167
+ if (entry.domain === domain) {
168
+ delete cache.entries[key];
169
+ cleared++;
170
+ }
171
+ }
172
+ }
173
+ else {
174
+ // Clear all
175
+ cleared = Object.keys(cache.entries).length;
176
+ cache.entries = {};
177
+ }
178
+ this.save();
179
+ return cleared;
180
+ }
181
+ /**
182
+ * List all cached selectors.
183
+ */
184
+ list(domain) {
185
+ const cache = this.load();
186
+ let entries = Object.values(cache.entries);
187
+ if (domain) {
188
+ entries = entries.filter((e) => e.domain === domain);
189
+ }
190
+ return entries.sort((a, b) => b.successCount - a.successCount);
191
+ }
192
+ }
193
+ //# sourceMappingURL=selector-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector-cache.js","sourceRoot":"","sources":["../../src/browser/selector-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Session Manager - Handles browser session persistence
3
+ *
4
+ * Extracted from CBrowser class for better modularity.
5
+ */
6
+ import type { Page, BrowserContext } from "playwright";
7
+ import type { SavedSession, LoadSessionResult, SessionMetadata } from "../types.js";
8
+ export interface SessionManagerConfig {
9
+ sessionsDir: string;
10
+ viewportWidth: number;
11
+ viewportHeight: number;
12
+ verbose?: boolean;
13
+ }
14
+ /**
15
+ * Manages browser session persistence - save, load, list, delete sessions.
16
+ */
17
+ export declare class SessionManager {
18
+ private config;
19
+ constructor(config: SessionManagerConfig);
20
+ /**
21
+ * Save the current session to disk.
22
+ */
23
+ save(name: string, page: Page, context: BrowserContext): Promise<void>;
24
+ /**
25
+ * Load a saved session from disk.
26
+ */
27
+ load(name: string, page: Page, context: BrowserContext): Promise<LoadSessionResult>;
28
+ /**
29
+ * List all saved session names.
30
+ */
31
+ list(): string[];
32
+ /**
33
+ * List all saved sessions with rich metadata.
34
+ */
35
+ listDetailed(): SessionMetadata[];
36
+ /**
37
+ * Get detailed info for a single session.
38
+ */
39
+ getDetails(name: string): SavedSession | null;
40
+ /**
41
+ * Delete a saved session.
42
+ */
43
+ delete(name: string): boolean;
44
+ /**
45
+ * Delete sessions older than a given number of days.
46
+ */
47
+ cleanup(olderThanDays: number): {
48
+ deleted: string[];
49
+ kept: string[];
50
+ };
51
+ /**
52
+ * Export a session to a portable JSON file.
53
+ */
54
+ export(name: string, outputPath: string): boolean;
55
+ /**
56
+ * Import a session from a JSON file.
57
+ */
58
+ import(inputPath: string, name: string): boolean;
59
+ }
60
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/browser/session-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAU,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAIxC;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IAoDhB;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IAoE7B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAOhB;;OAEG;IACH,YAAY,IAAI,eAAe,EAAE;IAiCjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAa7C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAS7B;;OAEG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IA4BrE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAQjD;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;CAajD"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Session Manager - Handles browser session persistence
3
+ *
4
+ * Extracted from CBrowser class for better modularity.
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, unlinkSync } from "fs";
7
+ import { join } from "path";
8
+ /**
9
+ * Manages browser session persistence - save, load, list, delete sessions.
10
+ */
11
+ export class SessionManager {
12
+ config;
13
+ constructor(config) {
14
+ this.config = config;
15
+ }
16
+ /**
17
+ * Save the current session to disk.
18
+ */
19
+ async save(name, page, context) {
20
+ const cookies = await context.cookies();
21
+ let localStorage = {};
22
+ try {
23
+ localStorage = await page.evaluate(() => {
24
+ const data = {};
25
+ for (let i = 0; i < window.localStorage.length; i++) {
26
+ const key = window.localStorage.key(i);
27
+ if (key)
28
+ data[key] = window.localStorage.getItem(key) || "";
29
+ }
30
+ return data;
31
+ });
32
+ }
33
+ catch (e) {
34
+ console.debug(`[CBrowser] localStorage inaccessible: ${e.message}`);
35
+ }
36
+ let sessionStorage = {};
37
+ try {
38
+ sessionStorage = await page.evaluate(() => {
39
+ const data = {};
40
+ for (let i = 0; i < window.sessionStorage.length; i++) {
41
+ const key = window.sessionStorage.key(i);
42
+ if (key)
43
+ data[key] = window.sessionStorage.getItem(key) || "";
44
+ }
45
+ return data;
46
+ });
47
+ }
48
+ catch (e) {
49
+ console.debug(`[CBrowser] sessionStorage inaccessible: ${e.message}`);
50
+ }
51
+ const url = page.url();
52
+ const domain = new URL(url).hostname;
53
+ const session = {
54
+ name,
55
+ created: new Date().toISOString(),
56
+ lastUsed: new Date().toISOString(),
57
+ domain,
58
+ url,
59
+ viewport: {
60
+ width: this.config.viewportWidth,
61
+ height: this.config.viewportHeight,
62
+ },
63
+ cookies: cookies,
64
+ localStorage,
65
+ sessionStorage,
66
+ };
67
+ const sessionPath = join(this.config.sessionsDir, `${name}.json`);
68
+ writeFileSync(sessionPath, JSON.stringify(session, null, 2));
69
+ }
70
+ /**
71
+ * Load a saved session from disk.
72
+ */
73
+ async load(name, page, context) {
74
+ const sessionPath = join(this.config.sessionsDir, `${name}.json`);
75
+ if (!existsSync(sessionPath)) {
76
+ return {
77
+ success: false,
78
+ name,
79
+ cookiesRestored: 0,
80
+ localStorageKeysRestored: 0,
81
+ sessionStorageKeysRestored: 0,
82
+ };
83
+ }
84
+ const session = JSON.parse(readFileSync(sessionPath, "utf-8"));
85
+ const result = {
86
+ success: true,
87
+ name,
88
+ cookiesRestored: session.cookies.length,
89
+ localStorageKeysRestored: Object.keys(session.localStorage).length,
90
+ sessionStorageKeysRestored: Object.keys(session.sessionStorage).length,
91
+ };
92
+ // Cross-domain warning
93
+ const currentUrl = page.url();
94
+ if (currentUrl && currentUrl !== "about:blank") {
95
+ try {
96
+ const currentDomain = new URL(currentUrl).hostname;
97
+ if (session.domain && currentDomain !== session.domain) {
98
+ result.warning = `Session '${name}' was saved for ${session.domain} but current page is ${currentDomain}. Some cookies may not apply.`;
99
+ }
100
+ }
101
+ catch (e) {
102
+ console.debug(`[CBrowser] URL parsing failed: ${e.message}`);
103
+ }
104
+ }
105
+ // Restore cookies
106
+ if (session.cookies.length > 0) {
107
+ await context.addCookies(session.cookies);
108
+ }
109
+ // Navigate to saved URL
110
+ await page.goto(session.url, { waitUntil: "networkidle" });
111
+ // Restore localStorage
112
+ await page.evaluate((data) => {
113
+ for (const [key, value] of Object.entries(data)) {
114
+ window.localStorage.setItem(key, value);
115
+ }
116
+ }, session.localStorage);
117
+ // Restore sessionStorage
118
+ await page.evaluate((data) => {
119
+ for (const [key, value] of Object.entries(data)) {
120
+ window.sessionStorage.setItem(key, value);
121
+ }
122
+ }, session.sessionStorage);
123
+ // Refresh to apply storage
124
+ await page.reload({ waitUntil: "networkidle" });
125
+ // Update lastUsed
126
+ session.lastUsed = new Date().toISOString();
127
+ writeFileSync(sessionPath, JSON.stringify(session, null, 2));
128
+ return result;
129
+ }
130
+ /**
131
+ * List all saved session names.
132
+ */
133
+ list() {
134
+ const files = readdirSync(this.config.sessionsDir);
135
+ return files
136
+ .filter((f) => f.endsWith(".json") && f !== "last-session.json")
137
+ .map((f) => f.replace(".json", ""));
138
+ }
139
+ /**
140
+ * List all saved sessions with rich metadata.
141
+ */
142
+ listDetailed() {
143
+ const files = readdirSync(this.config.sessionsDir);
144
+ const sessions = [];
145
+ for (const file of files) {
146
+ if (!file.endsWith(".json") || file === "last-session.json")
147
+ continue;
148
+ const filePath = join(this.config.sessionsDir, file);
149
+ try {
150
+ const data = JSON.parse(readFileSync(filePath, "utf-8"));
151
+ const stats = statSync(filePath);
152
+ sessions.push({
153
+ name: data.name || file.replace(".json", ""),
154
+ created: data.created,
155
+ lastUsed: data.lastUsed,
156
+ domain: data.domain,
157
+ url: data.url,
158
+ cookies: data.cookies?.length || 0,
159
+ localStorageKeys: Object.keys(data.localStorage || {}).length,
160
+ sessionStorageKeys: Object.keys(data.sessionStorage || {}).length,
161
+ sizeBytes: stats.size,
162
+ });
163
+ }
164
+ catch (e) {
165
+ if (this.config.verbose) {
166
+ console.debug(`[CBrowser] Skipping malformed session file ${file}: ${e.message}`);
167
+ }
168
+ }
169
+ }
170
+ return sessions.sort((a, b) => new Date(b.lastUsed).getTime() - new Date(a.lastUsed).getTime());
171
+ }
172
+ /**
173
+ * Get detailed info for a single session.
174
+ */
175
+ getDetails(name) {
176
+ const sessionPath = join(this.config.sessionsDir, `${name}.json`);
177
+ if (!existsSync(sessionPath))
178
+ return null;
179
+ try {
180
+ return JSON.parse(readFileSync(sessionPath, "utf-8"));
181
+ }
182
+ catch (e) {
183
+ if (this.config.verbose) {
184
+ console.debug(`[CBrowser] Failed to load session ${name}: ${e.message}`);
185
+ }
186
+ return null;
187
+ }
188
+ }
189
+ /**
190
+ * Delete a saved session.
191
+ */
192
+ delete(name) {
193
+ const sessionPath = join(this.config.sessionsDir, `${name}.json`);
194
+ if (existsSync(sessionPath)) {
195
+ unlinkSync(sessionPath);
196
+ return true;
197
+ }
198
+ return false;
199
+ }
200
+ /**
201
+ * Delete sessions older than a given number of days.
202
+ */
203
+ cleanup(olderThanDays) {
204
+ const cutoff = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;
205
+ const deleted = [];
206
+ const kept = [];
207
+ const files = readdirSync(this.config.sessionsDir);
208
+ for (const file of files) {
209
+ if (!file.endsWith(".json") || file === "last-session.json")
210
+ continue;
211
+ const filePath = join(this.config.sessionsDir, file);
212
+ const name = file.replace(".json", "");
213
+ try {
214
+ const data = JSON.parse(readFileSync(filePath, "utf-8"));
215
+ const lastUsed = new Date(data.lastUsed).getTime();
216
+ if (lastUsed < cutoff) {
217
+ unlinkSync(filePath);
218
+ deleted.push(name);
219
+ }
220
+ else {
221
+ kept.push(name);
222
+ }
223
+ }
224
+ catch (e) {
225
+ console.debug(`[CBrowser] Session cleanup error for ${name}: ${e.message}`);
226
+ kept.push(name);
227
+ }
228
+ }
229
+ return { deleted, kept };
230
+ }
231
+ /**
232
+ * Export a session to a portable JSON file.
233
+ */
234
+ export(name, outputPath) {
235
+ const sessionPath = join(this.config.sessionsDir, `${name}.json`);
236
+ if (!existsSync(sessionPath))
237
+ return false;
238
+ const data = readFileSync(sessionPath, "utf-8");
239
+ writeFileSync(outputPath, data);
240
+ return true;
241
+ }
242
+ /**
243
+ * Import a session from a JSON file.
244
+ */
245
+ import(inputPath, name) {
246
+ if (!existsSync(inputPath))
247
+ return false;
248
+ try {
249
+ const data = JSON.parse(readFileSync(inputPath, "utf-8"));
250
+ data.name = name;
251
+ const sessionPath = join(this.config.sessionsDir, `${name}.json`);
252
+ writeFileSync(sessionPath, JSON.stringify(data, null, 2));
253
+ return true;
254
+ }
255
+ catch (e) {
256
+ console.debug(`[CBrowser] Import failed: ${e.message}`);
257
+ return false;
258
+ }
259
+ }
260
+ }
261
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/browser/session-manager.ts"],"names":[],"mappings":"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"}
package/dist/browser.d.ts CHANGED
@@ -18,6 +18,9 @@ export declare class CBrowser {
18
18
  private harEntries;
19
19
  private isRecordingHar;
20
20
  private skipSessionRestore;
21
+ private sessionManager;
22
+ private selectorCacheManager;
23
+ private overlayHandler;
21
24
  constructor(userConfig?: Partial<CBrowserConfig>);
22
25
  private get sessionStateFile();
23
26
  private saveSessionState;
@@ -233,7 +236,7 @@ export declare class CBrowser {
233
236
  * Handle filling a custom input (hidden input with custom UI).
234
237
  * Handles autocomplete, datepickers, custom text inputs, etc.
235
238
  */
236
- handleCustomInput(hiddenInput: Locator, value: string, options?: {
239
+ handleCustomInput(hiddenInput: Locator, value: string, _options?: {
237
240
  verbose?: boolean;
238
241
  }): Promise<{
239
242
  success: boolean;
@@ -249,57 +252,23 @@ export declare class CBrowser {
249
252
  retryDelay?: number;
250
253
  dismissOverlays?: boolean;
251
254
  }): Promise<SmartRetryResult>;
252
- /** Common overlay patterns for detection */
253
- private static readonly OVERLAY_PATTERNS;
254
255
  /**
255
256
  * Detect and dismiss overlays (cookie consent, age verification, newsletter popups).
256
257
  * Constitutional safety: Yellow zone - logs all dismissed overlays.
257
258
  */
258
259
  dismissOverlay(options?: DismissOverlayOptions): Promise<DismissOverlayResult>;
259
- /** Text content keywords for overlay type classification */
260
- private static readonly OVERLAY_TEXT_PATTERNS;
261
- /**
262
- * Classify an overlay by its text content.
263
- */
264
- private classifyOverlayType;
265
- /**
266
- * Detect overlays on the page by analyzing position, z-index, pattern matching, and text content.
267
- * Returns overlays sorted by z-index (highest first) so the topmost blocking overlay is dismissed first.
268
- */
269
- private detectOverlays;
270
- /**
271
- * Try clicking a button, with force fallback if another element intercepts.
272
- */
273
- private tryClickOverlayButton;
274
- /**
275
- * Attempt to dismiss a single detected overlay.
276
- */
277
- private tryDismissOverlay;
278
260
  /**
279
261
  * Find alternative selectors for an element.
280
262
  */
281
263
  private findAlternativeSelectors;
282
- private selectorCache;
283
264
  /**
284
- * Get the selector cache file path.
265
+ * Get current page domain for cache key generation.
285
266
  */
286
- private getSelectorCachePath;
287
- /**
288
- * Load the selector cache from disk.
289
- */
290
- private loadSelectorCache;
291
- /**
292
- * Save the selector cache to disk.
293
- */
294
- private saveSelectorCache;
295
- /**
296
- * Get cache key for a selector (includes domain for context).
297
- */
298
- private getSelectorCacheKey;
267
+ private getCurrentDomain;
299
268
  /**
300
- * Get current page domain.
269
+ * Sync the current domain to the selector cache manager.
301
270
  */
302
- private getCurrentDomain;
271
+ private syncCacheDomain;
303
272
  /**
304
273
  * Cache a working alternative selector for future use.
305
274
  */