openchrome-mcp 1.8.8 → 1.8.10

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 (86) hide show
  1. package/dist/browser-state/index.d.ts +8 -0
  2. package/dist/browser-state/index.d.ts.map +1 -0
  3. package/dist/browser-state/index.js +19 -0
  4. package/dist/browser-state/index.js.map +1 -0
  5. package/dist/browser-state/snapshot.d.ts +65 -0
  6. package/dist/browser-state/snapshot.d.ts.map +1 -0
  7. package/dist/browser-state/snapshot.js +169 -0
  8. package/dist/browser-state/snapshot.js.map +1 -0
  9. package/dist/cdp/client.d.ts +20 -0
  10. package/dist/cdp/client.d.ts.map +1 -1
  11. package/dist/cdp/client.js +80 -0
  12. package/dist/cdp/client.js.map +1 -1
  13. package/dist/config/defaults.d.ts +17 -0
  14. package/dist/config/defaults.d.ts.map +1 -1
  15. package/dist/config/defaults.js +19 -1
  16. package/dist/config/defaults.js.map +1 -1
  17. package/dist/config/tool-tiers.d.ts.map +1 -1
  18. package/dist/config/tool-tiers.js +1 -0
  19. package/dist/config/tool-tiers.js.map +1 -1
  20. package/dist/dom/dom-serializer.d.ts.map +1 -1
  21. package/dist/dom/dom-serializer.js +14 -2
  22. package/dist/dom/dom-serializer.js.map +1 -1
  23. package/dist/index.js +76 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp-server.d.ts.map +1 -1
  26. package/dist/mcp-server.js +102 -0
  27. package/dist/mcp-server.js.map +1 -1
  28. package/dist/metrics/collector.d.ts.map +1 -1
  29. package/dist/metrics/collector.js +6 -2
  30. package/dist/metrics/collector.js.map +1 -1
  31. package/dist/session-manager.d.ts +9 -0
  32. package/dist/session-manager.d.ts.map +1 -1
  33. package/dist/session-manager.js +30 -0
  34. package/dist/session-manager.js.map +1 -1
  35. package/dist/tools/computer.d.ts.map +1 -1
  36. package/dist/tools/computer.js +5 -1
  37. package/dist/tools/computer.js.map +1 -1
  38. package/dist/tools/find.d.ts.map +1 -1
  39. package/dist/tools/find.js +5 -1
  40. package/dist/tools/find.js.map +1 -1
  41. package/dist/tools/index.d.ts.map +1 -1
  42. package/dist/tools/index.js +2 -0
  43. package/dist/tools/index.js.map +1 -1
  44. package/dist/tools/interact.d.ts.map +1 -1
  45. package/dist/tools/interact.js +5 -1
  46. package/dist/tools/interact.js.map +1 -1
  47. package/dist/tools/javascript.d.ts.map +1 -1
  48. package/dist/tools/javascript.js +5 -1
  49. package/dist/tools/javascript.js.map +1 -1
  50. package/dist/tools/navigate.d.ts.map +1 -1
  51. package/dist/tools/navigate.js +68 -1
  52. package/dist/tools/navigate.js.map +1 -1
  53. package/dist/tools/page-screenshot.d.ts +6 -0
  54. package/dist/tools/page-screenshot.d.ts.map +1 -0
  55. package/dist/tools/page-screenshot.js +235 -0
  56. package/dist/tools/page-screenshot.js.map +1 -0
  57. package/dist/tools/read-page.d.ts.map +1 -1
  58. package/dist/tools/read-page.js +5 -1
  59. package/dist/tools/read-page.js.map +1 -1
  60. package/dist/transports/http.d.ts +6 -0
  61. package/dist/transports/http.d.ts.map +1 -1
  62. package/dist/transports/http.js +35 -5
  63. package/dist/transports/http.js.map +1 -1
  64. package/dist/utils/pagination-detector.d.ts.map +1 -1
  65. package/dist/utils/pagination-detector.js +3 -2
  66. package/dist/utils/pagination-detector.js.map +1 -1
  67. package/dist/utils/rate-limiter.d.ts +12 -0
  68. package/dist/utils/rate-limiter.d.ts.map +1 -1
  69. package/dist/utils/rate-limiter.js +26 -0
  70. package/dist/utils/rate-limiter.js.map +1 -1
  71. package/dist/watchdog/chrome-monitor.d.ts +29 -0
  72. package/dist/watchdog/chrome-monitor.d.ts.map +1 -0
  73. package/dist/watchdog/chrome-monitor.js +72 -0
  74. package/dist/watchdog/chrome-monitor.js.map +1 -0
  75. package/dist/watchdog/disk-monitor.d.ts.map +1 -1
  76. package/dist/watchdog/disk-monitor.js +2 -1
  77. package/dist/watchdog/disk-monitor.js.map +1 -1
  78. package/dist/watchdog/event-loop-monitor.d.ts +29 -0
  79. package/dist/watchdog/event-loop-monitor.d.ts.map +1 -1
  80. package/dist/watchdog/event-loop-monitor.js +43 -2
  81. package/dist/watchdog/event-loop-monitor.js.map +1 -1
  82. package/dist/watchdog/health-endpoint.d.ts +11 -0
  83. package/dist/watchdog/health-endpoint.d.ts.map +1 -1
  84. package/dist/watchdog/health-endpoint.js +1 -3
  85. package/dist/watchdog/health-endpoint.js.map +1 -1
  86. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Browser State module — singleton access to the BrowserStateManager.
3
+ * Gap 2 (#416): Browser State Snapshot & Restore.
4
+ */
5
+ export { BrowserStateManager, BrowserSnapshot } from './snapshot';
6
+ import { BrowserStateManager } from './snapshot';
7
+ export declare function getBrowserStateManager(): BrowserStateManager;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-state/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIjD,wBAAgB,sBAAsB,IAAI,mBAAmB,CAK5D"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ /**
3
+ * Browser State module — singleton access to the BrowserStateManager.
4
+ * Gap 2 (#416): Browser State Snapshot & Restore.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BrowserStateManager = void 0;
8
+ exports.getBrowserStateManager = getBrowserStateManager;
9
+ var snapshot_1 = require("./snapshot");
10
+ Object.defineProperty(exports, "BrowserStateManager", { enumerable: true, get: function () { return snapshot_1.BrowserStateManager; } });
11
+ const snapshot_2 = require("./snapshot");
12
+ let instance = null;
13
+ function getBrowserStateManager() {
14
+ if (!instance) {
15
+ instance = new snapshot_2.BrowserStateManager();
16
+ }
17
+ return instance;
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser-state/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,wDAKC;AAXD,uCAAkE;AAAzD,+GAAA,mBAAmB,OAAA;AAE5B,yCAAiD;AAEjD,IAAI,QAAQ,GAA+B,IAAI,CAAC;AAEhD,SAAgB,sBAAsB;IACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,8BAAmB,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Browser State Snapshot Manager — Gap 2 (#416)
3
+ *
4
+ * Periodically snapshots browser cookies and tab URLs to disk so they
5
+ * can be restored after a Chrome crash + auto-reconnect. This is the
6
+ * most critical gap for long-running session reliability: without state
7
+ * restoration, a Chrome crash effectively fails the entire task.
8
+ *
9
+ * Design:
10
+ * - Cookie/tab retrieval is injected via provider functions to decouple
11
+ * from CDP internals and avoid circular dependencies.
12
+ * - Snapshots are plain JSON files in ~/.openchrome/snapshots/.
13
+ * - Old snapshots are pruned to keep disk usage bounded.
14
+ * - All restore operations are best-effort (try/catch, non-fatal).
15
+ */
16
+ export interface BrowserSnapshot {
17
+ timestamp: number;
18
+ cookies: Array<{
19
+ name: string;
20
+ value: string;
21
+ domain: string;
22
+ path: string;
23
+ expires: number;
24
+ httpOnly: boolean;
25
+ secure: boolean;
26
+ sameSite?: string;
27
+ }>;
28
+ tabUrls: string[];
29
+ }
30
+ export declare class BrowserStateManager {
31
+ private timer;
32
+ private readonly intervalMs;
33
+ private readonly maxSnapshots;
34
+ private readonly snapshotDir;
35
+ private lastSnapshotAt;
36
+ private snapshotCount;
37
+ private getCookiesFn;
38
+ private getTabUrlsFn;
39
+ constructor(opts?: {
40
+ intervalMs?: number;
41
+ maxSnapshots?: number;
42
+ });
43
+ /**
44
+ * Register the cookie retrieval function (called from index.ts after CDP client is ready).
45
+ * This decouples snapshot logic from CDP internals.
46
+ */
47
+ setCookieProvider(fn: () => Promise<any[]>): void;
48
+ /**
49
+ * Register the tab URL retrieval function.
50
+ */
51
+ setTabUrlProvider(fn: () => Promise<string[]>): void;
52
+ start(): Promise<void>;
53
+ stop(): void;
54
+ takeSnapshot(): Promise<void>;
55
+ /**
56
+ * Load the latest snapshot's cookies (raw data for the caller to apply via CDP).
57
+ */
58
+ getLatestCookies(): Promise<any[] | null>;
59
+ private pruneSnapshots;
60
+ getStatus(): {
61
+ lastSnapshotAt: number;
62
+ snapshotCount: number;
63
+ };
64
+ }
65
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/browser-state/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,YAAY,CAA0C;gBAElD,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAMjE;;;OAGG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI;IAIjD;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;IAI9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,IAAI,IAAI,IAAI;IAON,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BnC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAmBjC,cAAc;IAkB5B,SAAS,IAAI;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;CAG/D"}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /**
3
+ * Browser State Snapshot Manager — Gap 2 (#416)
4
+ *
5
+ * Periodically snapshots browser cookies and tab URLs to disk so they
6
+ * can be restored after a Chrome crash + auto-reconnect. This is the
7
+ * most critical gap for long-running session reliability: without state
8
+ * restoration, a Chrome crash effectively fails the entire task.
9
+ *
10
+ * Design:
11
+ * - Cookie/tab retrieval is injected via provider functions to decouple
12
+ * from CDP internals and avoid circular dependencies.
13
+ * - Snapshots are plain JSON files in ~/.openchrome/snapshots/.
14
+ * - Old snapshots are pruned to keep disk usage bounded.
15
+ * - All restore operations are best-effort (try/catch, non-fatal).
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.BrowserStateManager = void 0;
52
+ const path = __importStar(require("path"));
53
+ const os = __importStar(require("os"));
54
+ const fs = __importStar(require("fs/promises"));
55
+ const defaults_1 = require("../config/defaults");
56
+ class BrowserStateManager {
57
+ timer = null;
58
+ intervalMs;
59
+ maxSnapshots;
60
+ snapshotDir;
61
+ lastSnapshotAt = 0;
62
+ snapshotCount = 0;
63
+ getCookiesFn = null;
64
+ getTabUrlsFn = null;
65
+ constructor(opts) {
66
+ this.intervalMs = opts?.intervalMs ?? defaults_1.DEFAULT_SNAPSHOT_INTERVAL_MS;
67
+ this.maxSnapshots = opts?.maxSnapshots ?? defaults_1.DEFAULT_SNAPSHOT_MAX_COUNT;
68
+ this.snapshotDir = path.join(os.homedir(), '.openchrome', 'snapshots');
69
+ }
70
+ /**
71
+ * Register the cookie retrieval function (called from index.ts after CDP client is ready).
72
+ * This decouples snapshot logic from CDP internals.
73
+ */
74
+ setCookieProvider(fn) {
75
+ this.getCookiesFn = fn;
76
+ }
77
+ /**
78
+ * Register the tab URL retrieval function.
79
+ */
80
+ setTabUrlProvider(fn) {
81
+ this.getTabUrlsFn = fn;
82
+ }
83
+ async start() {
84
+ this.stop();
85
+ await fs.mkdir(this.snapshotDir, { recursive: true });
86
+ // Don't take immediate snapshot — wait for first interval
87
+ this.timer = setInterval(() => {
88
+ this.takeSnapshot().catch(err => {
89
+ console.error('[BrowserState] Snapshot failed:', err);
90
+ });
91
+ }, this.intervalMs);
92
+ this.timer.unref();
93
+ console.error(`[BrowserState] Snapshot service started (interval: ${this.intervalMs}ms, dir: ${this.snapshotDir})`);
94
+ }
95
+ stop() {
96
+ if (this.timer) {
97
+ clearInterval(this.timer);
98
+ this.timer = null;
99
+ }
100
+ }
101
+ async takeSnapshot() {
102
+ if (!this.getCookiesFn)
103
+ return;
104
+ try {
105
+ const cookies = await this.getCookiesFn();
106
+ const tabUrls = this.getTabUrlsFn ? await this.getTabUrlsFn() : [];
107
+ const snapshot = {
108
+ timestamp: Date.now(),
109
+ cookies,
110
+ tabUrls,
111
+ };
112
+ const filename = `snapshot-${Date.now()}.json`;
113
+ const filepath = path.join(this.snapshotDir, filename);
114
+ await fs.writeFile(filepath, JSON.stringify(snapshot), 'utf-8');
115
+ await fs.chmod(filepath, 0o600);
116
+ this.lastSnapshotAt = Date.now();
117
+ this.snapshotCount++;
118
+ // Prune old snapshots
119
+ await this.pruneSnapshots();
120
+ console.error(`[BrowserState] Snapshot saved: ${cookies.length} cookies, ${tabUrls.length} tabs`);
121
+ }
122
+ catch (err) {
123
+ console.error('[BrowserState] Failed to take snapshot:', err);
124
+ }
125
+ }
126
+ /**
127
+ * Load the latest snapshot's cookies (raw data for the caller to apply via CDP).
128
+ */
129
+ async getLatestCookies() {
130
+ try {
131
+ const files = await fs.readdir(this.snapshotDir);
132
+ const snapshotFiles = files
133
+ .filter(f => f.startsWith('snapshot-') && f.endsWith('.json'))
134
+ .sort()
135
+ .reverse();
136
+ if (snapshotFiles.length === 0)
137
+ return null;
138
+ const latestPath = path.join(this.snapshotDir, snapshotFiles[0]);
139
+ const content = await fs.readFile(latestPath, 'utf-8');
140
+ const snapshot = JSON.parse(content);
141
+ return snapshot.cookies;
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ async pruneSnapshots() {
148
+ try {
149
+ const files = await fs.readdir(this.snapshotDir);
150
+ const snapshotFiles = files
151
+ .filter(f => f.startsWith('snapshot-') && f.endsWith('.json'))
152
+ .sort()
153
+ .reverse();
154
+ // Keep only maxSnapshots newest
155
+ const toDelete = snapshotFiles.slice(this.maxSnapshots);
156
+ for (const file of toDelete) {
157
+ await fs.unlink(path.join(this.snapshotDir, file));
158
+ }
159
+ }
160
+ catch {
161
+ // best-effort pruning
162
+ }
163
+ }
164
+ getStatus() {
165
+ return { lastSnapshotAt: this.lastSnapshotAt, snapshotCount: this.snapshotCount };
166
+ }
167
+ }
168
+ exports.BrowserStateManager = BrowserStateManager;
169
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/browser-state/snapshot.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,15 @@ export declare class CDPClient {
56
56
  * Get current connection state
57
57
  */
58
58
  getConnectionState(): ConnectionState;
59
+ /**
60
+ * Whether the client is currently in a reconnection loop.
61
+ */
62
+ isReconnecting(): boolean;
63
+ /**
64
+ * Estimated milliseconds until the next reconnection attempt completes.
65
+ * Returns 0 if not reconnecting.
66
+ */
67
+ estimatedRetryMs(): number;
59
68
  /**
60
69
  * Add connection event listener
61
70
  */
@@ -107,6 +116,11 @@ export declare class CDPClient {
107
116
  * Get current heartbeat mode.
108
117
  */
109
118
  getHeartbeatMode(): 'idle' | 'active' | 'heavy' | 'recovery';
119
+ /**
120
+ * Get the Chrome process PID, if available.
121
+ * Returns null when connecting to an already-running Chrome (no process spawned by puppeteer).
122
+ */
123
+ getChromePid(): number | null;
110
124
  /**
111
125
  * Get connection health metrics.
112
126
  */
@@ -152,6 +166,12 @@ export declare class CDPClient {
152
166
  * hang until protocolTimeout (30s).
153
167
  */
154
168
  forceReconnect(): Promise<void>;
169
+ /**
170
+ * Restore cookies to the browser after reconnection.
171
+ * Filters out about:blank and chrome:// pages before selecting the CDP target
172
+ * to avoid setting cookies on ghost tabs or pool placeholders.
173
+ */
174
+ private restoreCookiesAfterReconnect;
155
175
  /**
156
176
  * Disconnect from Chrome
157
177
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAkB,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAuC9F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,kBAAkB,CAAC;IACzF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,wBAAwB,CAAmD;IACnF,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,4BAA4B,CAAK;IACzC,OAAO,CAAC,6BAA6B,CAAK;IAC1C,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,iBAAiB,CAAmE;IAC5F,OAAO,CAAC,eAAe,CAAyE;IAChG,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,mBAAmB,CAAkD;IAC7E,wFAAwF;IACxF,OAAO,CAAC,cAAc,CAA8B;IACpD,wFAAwF;IACxF,OAAO,CAAC,cAAc,CAAK;IAG3B,OAAO,CAAC,aAAa,CAAsD;IAC3E,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,kBAAkB,CAA+B;IAGzD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAE9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAGlD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,oBAAoB,CAAK;gBAErB,OAAO,GAAE,gBAAqB;IAU1C;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;;OAGG;IACH,gBAAgB,IAAI,MAAM;IAO1B;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAIvE;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAO1E;;OAEG;IACH,0BAA0B,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAInF;;OAEG;IACH,6BAA6B,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAOtF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,cAAc;IA4BtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI;IA2BtE;;OAEG;IACH,OAAO,CAAC,6BAA6B;IASrC;;;;;OAKG;IACH,qBAAqB,IAAI,IAAI;IAO7B;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU;IAI5D;;;OAGG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,oBAAoB,IAAI;QACtB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,sBAAsB,EAAE,MAAM,CAAC;KAChC;IAoBD;;;;OAIG;YACW,eAAe;IAyD7B;;OAEG;YACW,gBAAgB;IA2H9B;;OAEG;YACW,eAAe;IAyI7B;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D9B;;;;;;;;OAQG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDrC;;;;OAIG;YACW,4BAA4B;IAqB1C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC;;OAEG;IACH,UAAU,IAAI,OAAO;IAQrB,MAAM,CAAC,QAAQ,CAAC,gBAAgB;;;MAAoB;IAEpD;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC;IAOrD;;OAEG;IACG,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;;;;;;;OAQG;IACG,6BAA6B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA0BlF;;;;OAIG;YACW,gCAAgC;IA6G9C;;;;OAIG;IACG,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IA6GhF;;;;;OAKG;IACG,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,EAAE,gBAAgB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgF1G;;;;;;;;;OASG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IA+L1G;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAwK7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAKjC;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAsB7C;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA+B/D;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAapD;;;OAGG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IASb;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS;CAG1E;AAKD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAKlE;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAqC;IAEpD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS;IAShE;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC;;OAEG;IACH,MAAM,IAAI,SAAS,EAAE;IAIrB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CASrC;AAKD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD"}
@@ -50,6 +50,7 @@ const puppeteer_helpers_1 = require("../utils/puppeteer-helpers");
50
50
  const ref_id_manager_1 = require("../utils/ref-id-manager");
51
51
  const defaults_1 = require("../config/defaults");
52
52
  const with_timeout_1 = require("../utils/with-timeout");
53
+ const collector_1 = require("../metrics/collector");
53
54
  function parseEnvInt(name, fallback) {
54
55
  const raw = process.env[name];
55
56
  if (raw === undefined)
@@ -117,6 +118,23 @@ class CDPClient {
117
118
  getConnectionState() {
118
119
  return this.connectionState;
119
120
  }
121
+ /**
122
+ * Whether the client is currently in a reconnection loop.
123
+ */
124
+ isReconnecting() {
125
+ return this.reconnecting || this.connectionState === 'reconnecting';
126
+ }
127
+ /**
128
+ * Estimated milliseconds until the next reconnection attempt completes.
129
+ * Returns 0 if not reconnecting.
130
+ */
131
+ estimatedRetryMs() {
132
+ if (!this.isReconnecting())
133
+ return 0;
134
+ return this.reconnectNextRetryAt > 0
135
+ ? Math.max(0, this.reconnectNextRetryAt - Date.now())
136
+ : this.reconnectDelayMs; // fallback to base delay
137
+ }
120
138
  /**
121
139
  * Add connection event listener
122
140
  */
@@ -279,6 +297,13 @@ class CDPClient {
279
297
  getHeartbeatMode() {
280
298
  return this.heartbeatMode;
281
299
  }
300
+ /**
301
+ * Get the Chrome process PID, if available.
302
+ * Returns null when connecting to an already-running Chrome (no process spawned by puppeteer).
303
+ */
304
+ getChromePid() {
305
+ return this.browser?.process()?.pid ?? null;
306
+ }
282
307
  /**
283
308
  * Get connection health metrics.
284
309
  */
@@ -422,7 +447,23 @@ class CDPClient {
422
447
  this.reconnectingAttempt = 0;
423
448
  this.reconnectNextRetryAt = 0;
424
449
  this.reconnectCount++;
450
+ try {
451
+ (0, collector_1.getMetricsCollector)().inc('openchrome_reconnect_total');
452
+ }
453
+ catch { /* best-effort */ }
425
454
  this.setHeartbeatMode('recovery');
455
+ // Restore browser state (cookies) from last snapshot after reconnection.
456
+ // Uses dynamic import() to avoid circular dependency with browser-state module.
457
+ // Restore is best-effort — failure must not block reconnection.
458
+ try {
459
+ const { getBrowserStateManager } = await Promise.resolve().then(() => __importStar(require('../browser-state')));
460
+ const stateManager = getBrowserStateManager();
461
+ const cookies = await stateManager.getLatestCookies();
462
+ await this.restoreCookiesAfterReconnect(cookies);
463
+ }
464
+ catch (err) {
465
+ console.error('[CDPClient] Cookie restore after reconnection failed (non-fatal):', err);
466
+ }
426
467
  this.emitConnectionEvent({
427
468
  type: 'reconnected',
428
469
  timestamp: Date.now(),
@@ -692,6 +733,16 @@ class CDPClient {
692
733
  this.startHeartbeat();
693
734
  this.emitConnectionEvent({ type: 'reconnected', timestamp: Date.now() });
694
735
  console.error('[CDPClient] Reconnected to Chrome');
736
+ // Restore cookies from snapshot after reconnection (best-effort)
737
+ try {
738
+ const { getBrowserStateManager } = await Promise.resolve().then(() => __importStar(require('../browser-state')));
739
+ const stateManager = getBrowserStateManager();
740
+ const cookies = await stateManager.getLatestCookies();
741
+ await this.restoreCookiesAfterReconnect(cookies);
742
+ }
743
+ catch (err) {
744
+ console.error('[CDPClient] Cookie restore after reconnection failed (non-fatal):', err);
745
+ }
695
746
  }
696
747
  catch (err) {
697
748
  this.connectionState = 'disconnected';
@@ -703,6 +754,35 @@ class CDPClient {
703
754
  throw err;
704
755
  }
705
756
  }
757
+ /**
758
+ * Restore cookies to the browser after reconnection.
759
+ * Filters out about:blank and chrome:// pages before selecting the CDP target
760
+ * to avoid setting cookies on ghost tabs or pool placeholders.
761
+ */
762
+ async restoreCookiesAfterReconnect(cookies) {
763
+ if (!cookies || cookies.length === 0)
764
+ return;
765
+ try {
766
+ const pages = await this.browser.pages();
767
+ const validPage = pages.find(p => {
768
+ const url = p.url();
769
+ return url && url !== 'about:blank' && !url.startsWith('chrome://');
770
+ }) || pages[0]; // fallback to pages[0] if no valid page
771
+ if (!validPage)
772
+ return;
773
+ const client = await validPage.createCDPSession();
774
+ try {
775
+ await client.send('Network.setCookies', { cookies });
776
+ console.error(`[CDPClient] Restored ${cookies.length} cookies from snapshot after reconnection`);
777
+ }
778
+ finally {
779
+ await client.detach();
780
+ }
781
+ }
782
+ catch (err) {
783
+ console.error('[CDPClient] Cookie restore failed:', err);
784
+ }
785
+ }
706
786
  /**
707
787
  * Disconnect from Chrome
708
788
  */