openchrome-mcp 1.7.16 → 1.8.4
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.
- package/dist/cdp/client.d.ts +36 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +212 -8
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/tab-health-monitor.d.ts +63 -0
- package/dist/cdp/tab-health-monitor.d.ts.map +1 -0
- package/dist/cdp/tab-health-monitor.js +131 -0
- package/dist/cdp/tab-health-monitor.js.map +1 -0
- package/dist/chrome/launcher.d.ts +11 -0
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +17 -0
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/chrome/pool.d.ts +17 -0
- package/dist/chrome/pool.d.ts.map +1 -1
- package/dist/chrome/pool.js +85 -2
- package/dist/chrome/pool.js.map +1 -1
- package/dist/chrome/process-watchdog.d.ts +63 -0
- package/dist/chrome/process-watchdog.d.ts.map +1 -0
- package/dist/chrome/process-watchdog.js +121 -0
- package/dist/chrome/process-watchdog.js.map +1 -0
- package/dist/cli/index.js +0 -0
- package/dist/config/defaults.d.ts +59 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +62 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/tool-tiers.d.ts.map +1 -1
- package/dist/config/tool-tiers.js +3 -0
- package/dist/config/tool-tiers.js.map +1 -1
- package/dist/dom/dom-serializer.js +1 -1
- package/dist/dom/dom-serializer.js.map +1 -1
- package/dist/index.js +111 -0
- package/dist/index.js.map +1 -1
- package/dist/journal/task-journal.d.ts +79 -0
- package/dist/journal/task-journal.d.ts.map +1 -0
- package/dist/journal/task-journal.js +246 -0
- package/dist/journal/task-journal.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +129 -7
- package/dist/mcp-server.js.map +1 -1
- package/dist/self-healing.d.ts +14 -0
- package/dist/self-healing.d.ts.map +1 -0
- package/dist/self-healing.js +17 -0
- package/dist/self-healing.js.map +1 -0
- package/dist/session-manager.d.ts +14 -3
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +98 -27
- package/dist/session-manager.js.map +1 -1
- package/dist/session-state-persistence.d.ts +92 -0
- package/dist/session-state-persistence.d.ts.map +1 -0
- package/dist/session-state-persistence.js +206 -0
- package/dist/session-state-persistence.js.map +1 -0
- package/dist/storage-state/storage-state-manager.d.ts +1 -1
- package/dist/storage-state/storage-state-manager.d.ts.map +1 -1
- package/dist/storage-state/storage-state-manager.js +40 -16
- package/dist/storage-state/storage-state-manager.js.map +1 -1
- package/dist/tools/click-element.d.ts.map +1 -1
- package/dist/tools/click-element.js +59 -2
- package/dist/tools/click-element.js.map +1 -1
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +27 -0
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interact.d.ts.map +1 -1
- package/dist/tools/interact.js +93 -2
- package/dist/tools/interact.js.map +1 -1
- package/dist/tools/journal.d.ts +8 -0
- package/dist/tools/journal.d.ts.map +1 -0
- package/dist/tools/journal.js +112 -0
- package/dist/tools/journal.js.map +1 -0
- package/dist/tools/list-profiles.d.ts.map +1 -1
- package/dist/tools/list-profiles.js +2 -1
- package/dist/tools/list-profiles.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +42 -7
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/profile-status.d.ts.map +1 -1
- package/dist/tools/profile-status.js +18 -0
- package/dist/tools/profile-status.js.map +1 -1
- package/dist/tools/session-resume.d.ts +42 -0
- package/dist/tools/session-resume.d.ts.map +1 -0
- package/dist/tools/session-resume.js +248 -0
- package/dist/tools/session-resume.js.map +1 -0
- package/dist/tools/session-snapshot.d.ts +35 -0
- package/dist/tools/session-snapshot.d.ts.map +1 -0
- package/dist/tools/session-snapshot.js +232 -0
- package/dist/tools/session-snapshot.js.map +1 -0
- package/dist/tools/tabs-create.d.ts.map +1 -1
- package/dist/tools/tabs-create.js +13 -2
- package/dist/tools/tabs-create.js.map +1 -1
- package/dist/tools/wait-and-click.d.ts.map +1 -1
- package/dist/tools/wait-and-click.js +47 -4
- package/dist/tools/wait-and-click.js.map +1 -1
- package/dist/types/session.d.ts +2 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/utils/ax-element-resolver.d.ts +96 -0
- package/dist/utils/ax-element-resolver.d.ts.map +1 -0
- package/dist/utils/ax-element-resolver.js +256 -0
- package/dist/utils/ax-element-resolver.js.map +1 -0
- package/dist/utils/element-discovery.d.ts.map +1 -1
- package/dist/utils/element-discovery.js +4 -0
- package/dist/utils/element-discovery.js.map +1 -1
- package/dist/utils/ralph/circuit-breaker.d.ts +99 -0
- package/dist/utils/ralph/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/ralph/circuit-breaker.js +234 -0
- package/dist/utils/ralph/circuit-breaker.js.map +1 -0
- package/dist/utils/ralph/hitl-escalation.d.ts +51 -0
- package/dist/utils/ralph/hitl-escalation.d.ts.map +1 -0
- package/dist/utils/ralph/hitl-escalation.js +114 -0
- package/dist/utils/ralph/hitl-escalation.js.map +1 -0
- package/dist/utils/ralph/outcome-classifier.d.ts +44 -0
- package/dist/utils/ralph/outcome-classifier.d.ts.map +1 -0
- package/dist/utils/ralph/outcome-classifier.js +123 -0
- package/dist/utils/ralph/outcome-classifier.js.map +1 -0
- package/dist/utils/ralph/ralph-engine.d.ts +50 -0
- package/dist/utils/ralph/ralph-engine.d.ts.map +1 -0
- package/dist/utils/ralph/ralph-engine.js +341 -0
- package/dist/utils/ralph/ralph-engine.js.map +1 -0
- package/dist/utils/ralph/strategy-learner.d.ts +40 -0
- package/dist/utils/ralph/strategy-learner.d.ts.map +1 -0
- package/dist/utils/ralph/strategy-learner.js +80 -0
- package/dist/utils/ralph/strategy-learner.js.map +1 -0
- package/dist/utils/ralph/timeout-budget.d.ts +43 -0
- package/dist/utils/ralph/timeout-budget.d.ts.map +1 -0
- package/dist/utils/ralph/timeout-budget.js +80 -0
- package/dist/utils/ralph/timeout-budget.js.map +1 -0
- package/dist/watchdog/event-loop-monitor.d.ts +58 -0
- package/dist/watchdog/event-loop-monitor.d.ts.map +1 -0
- package/dist/watchdog/event-loop-monitor.js +85 -0
- package/dist/watchdog/event-loop-monitor.js.map +1 -0
- package/dist/watchdog/health-endpoint.d.ts +44 -0
- package/dist/watchdog/health-endpoint.d.ts.map +1 -0
- package/dist/watchdog/health-endpoint.js +119 -0
- package/dist/watchdog/health-endpoint.js.map +1 -0
- package/package.json +3 -2
- package/dist/chrome/sqlite-cookie-copy.d.ts +0 -46
- package/dist/chrome/sqlite-cookie-copy.d.ts.map +0 -1
- package/dist/chrome/sqlite-cookie-copy.js +0 -151
- package/dist/chrome/sqlite-cookie-copy.js.map +0 -1
- package/dist/config/config-recovery.d.ts +0 -69
- package/dist/config/config-recovery.d.ts.map +0 -1
- package/dist/config/config-recovery.js +0 -302
- package/dist/config/config-recovery.js.map +0 -1
- package/dist/config/session-isolator.d.ts +0 -76
- package/dist/config/session-isolator.d.ts.map +0 -1
- package/dist/config/session-isolator.js +0 -268
- package/dist/config/session-isolator.js.map +0 -1
- package/dist/tools/selector-query.d.ts +0 -6
- package/dist/tools/selector-query.d.ts.map +0 -1
- package/dist/tools/selector-query.js +0 -214
- package/dist/tools/selector-query.js.map +0 -1
- package/dist/tools/worker-create.d.ts +0 -7
- package/dist/tools/worker-create.d.ts.map +0 -1
- package/dist/tools/worker-create.js +0 -62
- package/dist/tools/worker-create.js.map +0 -1
- package/dist/tools/worker-delete.d.ts +0 -6
- package/dist/tools/worker-delete.d.ts.map +0 -1
- package/dist/tools/worker-delete.js +0 -80
- package/dist/tools/worker-delete.js.map +0 -1
- package/dist/tools/worker-list.d.ts +0 -6
- package/dist/tools/worker-list.d.ts.map +0 -1
- package/dist/tools/worker-list.js +0 -67
- package/dist/tools/worker-list.js.map +0 -1
- package/dist/tools/xpath-query.d.ts +0 -6
- package/dist/tools/xpath-query.d.ts.map +0 -1
- package/dist/tools/xpath-query.js +0 -225
- package/dist/tools/xpath-query.js.map +0 -1
package/dist/chrome/pool.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ChromePool - Manages multiple Chrome instances on different ports
|
|
3
3
|
* to solve the CDP same-origin renderer process contention issue.
|
|
4
|
+
* Also supports profile-aware instance routing for multi-profile workflows.
|
|
4
5
|
*/
|
|
5
6
|
import { ChromeLauncher } from './launcher';
|
|
6
7
|
export interface ChromePoolConfig {
|
|
@@ -14,20 +15,34 @@ export interface PooledInstance {
|
|
|
14
15
|
origins: Set<string>;
|
|
15
16
|
tabCount: number;
|
|
16
17
|
isPreExisting: boolean;
|
|
18
|
+
profileDirectory?: string;
|
|
17
19
|
}
|
|
18
20
|
export declare class ChromePool {
|
|
19
21
|
private config;
|
|
20
22
|
private instances;
|
|
23
|
+
private profileLaunchInFlight;
|
|
21
24
|
constructor(config?: Partial<ChromePoolConfig>);
|
|
22
25
|
/**
|
|
23
26
|
* Acquire a Chrome instance that does NOT already have a tab open to the given origin.
|
|
24
27
|
* If all instances have the origin, launch a new one (up to maxInstances).
|
|
25
28
|
*/
|
|
26
29
|
acquireInstance(origin: string): Promise<PooledInstance>;
|
|
30
|
+
/**
|
|
31
|
+
* Acquire a Chrome instance running a specific profile.
|
|
32
|
+
* Returns an existing instance if one is already running this profile,
|
|
33
|
+
* otherwise launches a new Chrome process with --profile-directory.
|
|
34
|
+
* Uses in-flight deduplication to prevent concurrent launches for the same profile.
|
|
35
|
+
*/
|
|
36
|
+
acquireInstanceForProfile(profileDirectory: string, origin?: string): Promise<PooledInstance>;
|
|
27
37
|
/**
|
|
28
38
|
* Mark that an origin is no longer using a port.
|
|
29
39
|
*/
|
|
30
40
|
releaseInstance(port: number, origin: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Decrement tab count for a profile instance (P1-2 fix).
|
|
43
|
+
* Used when a profile worker is deleted but has no poolOrigin.
|
|
44
|
+
*/
|
|
45
|
+
releaseProfileInstance(port: number): void;
|
|
31
46
|
/**
|
|
32
47
|
* Close all instances we launched (not pre-existing ones).
|
|
33
48
|
*/
|
|
@@ -40,4 +55,6 @@ export declare class ChromePool {
|
|
|
40
55
|
private nextAvailablePort;
|
|
41
56
|
}
|
|
42
57
|
export declare function getChromePool(config?: Partial<ChromePoolConfig>): ChromePool;
|
|
58
|
+
/** Reset the singleton — for tests only. */
|
|
59
|
+
export declare function resetChromePool(): void;
|
|
43
60
|
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/chrome/pool.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/chrome/pool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,cAAc,EAAiC,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2CD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAA0C;IAE3D,OAAO,CAAC,qBAAqB,CAAmD;gBAEpE,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAIlD;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6C9D;;;;;OAKG;IACG,yBAAyB,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA+CnG;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAenD;;;OAGG;IACH,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB9B;;OAEG;IACH,YAAY,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;YAQrC,iBAAiB;IA+C/B,OAAO,CAAC,iBAAiB;CAW1B;AAQD,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAQ5E;AAED,4CAA4C;AAC5C,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
package/dist/chrome/pool.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* ChromePool - Manages multiple Chrome instances on different ports
|
|
4
4
|
* to solve the CDP same-origin renderer process contention issue.
|
|
5
|
+
* Also supports profile-aware instance routing for multi-profile workflows.
|
|
5
6
|
*/
|
|
6
7
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
8
|
if (k2 === undefined) k2 = k;
|
|
@@ -39,7 +40,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
40
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
41
|
exports.ChromePool = void 0;
|
|
41
42
|
exports.getChromePool = getChromePool;
|
|
43
|
+
exports.resetChromePool = resetChromePool;
|
|
42
44
|
const http = __importStar(require("http"));
|
|
45
|
+
const os = __importStar(require("os"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
43
47
|
const launcher_1 = require("./launcher");
|
|
44
48
|
const DEFAULT_POOL_CONFIG = {
|
|
45
49
|
maxInstances: 5,
|
|
@@ -81,6 +85,8 @@ async function checkDebugPort(port) {
|
|
|
81
85
|
class ChromePool {
|
|
82
86
|
config;
|
|
83
87
|
instances = new Map();
|
|
88
|
+
// In-flight dedup: prevent concurrent launches for the same profile (P1-3 fix)
|
|
89
|
+
profileLaunchInFlight = new Map();
|
|
84
90
|
constructor(config = {}) {
|
|
85
91
|
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
86
92
|
}
|
|
@@ -122,6 +128,51 @@ class ChromePool {
|
|
|
122
128
|
leastLoaded.tabCount++;
|
|
123
129
|
return leastLoaded;
|
|
124
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Acquire a Chrome instance running a specific profile.
|
|
133
|
+
* Returns an existing instance if one is already running this profile,
|
|
134
|
+
* otherwise launches a new Chrome process with --profile-directory.
|
|
135
|
+
* Uses in-flight deduplication to prevent concurrent launches for the same profile.
|
|
136
|
+
*/
|
|
137
|
+
async acquireInstanceForProfile(profileDirectory, origin) {
|
|
138
|
+
// 1. Find an existing instance already running this profile
|
|
139
|
+
for (const [, instance] of this.instances) {
|
|
140
|
+
if (instance.profileDirectory === profileDirectory) {
|
|
141
|
+
if (origin)
|
|
142
|
+
instance.origins.add(origin);
|
|
143
|
+
instance.tabCount++;
|
|
144
|
+
console.error(`[ChromePool] Reusing existing instance on port ${instance.port} for profile "${profileDirectory}"`);
|
|
145
|
+
return instance;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// 2. Check for in-flight launch of the same profile (P1-3: race condition fix)
|
|
149
|
+
const inflight = this.profileLaunchInFlight.get(profileDirectory);
|
|
150
|
+
if (inflight) {
|
|
151
|
+
console.error(`[ChromePool] Waiting for in-flight launch of profile "${profileDirectory}"`);
|
|
152
|
+
const inst = await inflight;
|
|
153
|
+
if (origin)
|
|
154
|
+
inst.origins.add(origin);
|
|
155
|
+
inst.tabCount++;
|
|
156
|
+
return inst;
|
|
157
|
+
}
|
|
158
|
+
// 3. No instance with this profile — launch a new one
|
|
159
|
+
if (this.instances.size >= this.config.maxInstances) {
|
|
160
|
+
throw new Error(`[ChromePool] Cannot launch Chrome for profile "${profileDirectory}": ` +
|
|
161
|
+
`pool is at max capacity (${this.config.maxInstances} instances). ` +
|
|
162
|
+
`Close unused profiles first.`);
|
|
163
|
+
}
|
|
164
|
+
// Set in-flight guard before async launch
|
|
165
|
+
const launchPromise = this.launchNewInstance(profileDirectory).finally(() => {
|
|
166
|
+
this.profileLaunchInFlight.delete(profileDirectory);
|
|
167
|
+
});
|
|
168
|
+
this.profileLaunchInFlight.set(profileDirectory, launchPromise);
|
|
169
|
+
const newInstance = await launchPromise;
|
|
170
|
+
if (origin)
|
|
171
|
+
newInstance.origins.add(origin);
|
|
172
|
+
newInstance.tabCount++;
|
|
173
|
+
console.error(`[ChromePool] Launched new instance on port ${newInstance.port} for profile "${profileDirectory}"`);
|
|
174
|
+
return newInstance;
|
|
175
|
+
}
|
|
125
176
|
/**
|
|
126
177
|
* Mark that an origin is no longer using a port.
|
|
127
178
|
*/
|
|
@@ -137,6 +188,19 @@ class ChromePool {
|
|
|
137
188
|
console.error(`[ChromePool] Released origin "${origin}" from port ${port}. ` +
|
|
138
189
|
`Remaining origins: ${instance.tabCount}`);
|
|
139
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Decrement tab count for a profile instance (P1-2 fix).
|
|
193
|
+
* Used when a profile worker is deleted but has no poolOrigin.
|
|
194
|
+
*/
|
|
195
|
+
releaseProfileInstance(port) {
|
|
196
|
+
const instance = this.instances.get(port);
|
|
197
|
+
if (!instance)
|
|
198
|
+
return;
|
|
199
|
+
if (instance.tabCount > 0) {
|
|
200
|
+
instance.tabCount--;
|
|
201
|
+
}
|
|
202
|
+
console.error(`[ChromePool] Released profile instance on port ${port}. Tab count: ${instance.tabCount}`);
|
|
203
|
+
}
|
|
140
204
|
/**
|
|
141
205
|
* Close all instances we launched (not pre-existing ones).
|
|
142
206
|
*/
|
|
@@ -153,6 +217,7 @@ class ChromePool {
|
|
|
153
217
|
}
|
|
154
218
|
await Promise.all(closurePromises);
|
|
155
219
|
this.instances.clear();
|
|
220
|
+
this.profileLaunchInFlight.clear();
|
|
156
221
|
console.error('[ChromePool] Cleanup complete.');
|
|
157
222
|
}
|
|
158
223
|
/**
|
|
@@ -164,12 +229,21 @@ class ChromePool {
|
|
|
164
229
|
// ---------------------------------------------------------------------------
|
|
165
230
|
// Private helpers
|
|
166
231
|
// ---------------------------------------------------------------------------
|
|
167
|
-
async launchNewInstance() {
|
|
232
|
+
async launchNewInstance(profileDirectory) {
|
|
168
233
|
const port = this.nextAvailablePort();
|
|
169
234
|
const launcher = new launcher_1.ChromeLauncher(port);
|
|
235
|
+
// SingletonLock isolation: Chrome's SingletonLock is per --user-data-dir,
|
|
236
|
+
// NOT per --profile-directory. Two Chrome processes sharing the same
|
|
237
|
+
// --user-data-dir will conflict even with different --profile-directory.
|
|
238
|
+
// Each profile instance gets its own isolated user-data-dir.
|
|
239
|
+
const profileUserDataDir = profileDirectory
|
|
240
|
+
? path.join(os.homedir(), '.openchrome', 'profiles', profileDirectory.replace(/[^a-zA-Z0-9_\- ]/g, '_'))
|
|
241
|
+
: undefined;
|
|
170
242
|
const launchOptions = {
|
|
171
243
|
port,
|
|
172
|
-
autoLaunch: this.config.autoLaunch,
|
|
244
|
+
autoLaunch: profileDirectory ? true : this.config.autoLaunch,
|
|
245
|
+
...(profileDirectory && { profileDirectory }),
|
|
246
|
+
...(profileUserDataDir && { userDataDir: profileUserDataDir }),
|
|
173
247
|
};
|
|
174
248
|
let isPreExisting = false;
|
|
175
249
|
// Check if something is already on this port
|
|
@@ -189,6 +263,7 @@ class ChromePool {
|
|
|
189
263
|
origins: new Set(),
|
|
190
264
|
tabCount: 0,
|
|
191
265
|
isPreExisting,
|
|
266
|
+
profileDirectory,
|
|
192
267
|
};
|
|
193
268
|
this.instances.set(port, pooled);
|
|
194
269
|
return pooled;
|
|
@@ -214,6 +289,14 @@ function getChromePool(config) {
|
|
|
214
289
|
if (!poolInstance) {
|
|
215
290
|
poolInstance = new ChromePool(config);
|
|
216
291
|
}
|
|
292
|
+
else if (config && Object.keys(config).length > 0) {
|
|
293
|
+
// P1-5: warn when config is passed to an already-initialized singleton
|
|
294
|
+
console.error('[ChromePool] Warning: getChromePool called with config after initialization; config ignored.');
|
|
295
|
+
}
|
|
217
296
|
return poolInstance;
|
|
218
297
|
}
|
|
298
|
+
/** Reset the singleton — for tests only. */
|
|
299
|
+
function resetChromePool() {
|
|
300
|
+
poolInstance = null;
|
|
301
|
+
}
|
|
219
302
|
//# sourceMappingURL=pool.js.map
|
package/dist/chrome/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/chrome/pool.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/chrome/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrome Process Watchdog — monitors Chrome process health.
|
|
3
|
+
* Detects Chrome crashes within intervalMs and emits events for recovery.
|
|
4
|
+
* Part of #347 Layer 3: Chrome Process Supervisor.
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import { ChromeLauncher } from './launcher';
|
|
8
|
+
export interface ProcessWatchdogOptions {
|
|
9
|
+
/** Check interval in milliseconds. Default: 10000 (10s) */
|
|
10
|
+
intervalMs?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ProcessWatchdogEvents {
|
|
13
|
+
'chrome-died': {
|
|
14
|
+
pid: number;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
};
|
|
17
|
+
'chrome-relaunched': {
|
|
18
|
+
pid: number;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
};
|
|
21
|
+
'relaunch-failed': {
|
|
22
|
+
error: Error;
|
|
23
|
+
timestamp: number;
|
|
24
|
+
};
|
|
25
|
+
'watchdog-exhausted': {
|
|
26
|
+
count: number;
|
|
27
|
+
timestamp: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare class ChromeProcessWatchdog extends EventEmitter {
|
|
31
|
+
private timer;
|
|
32
|
+
private readonly intervalMs;
|
|
33
|
+
private readonly launcher;
|
|
34
|
+
private lastKnownPid;
|
|
35
|
+
private relaunching;
|
|
36
|
+
private cooldownUntil;
|
|
37
|
+
private relaunchCount;
|
|
38
|
+
private readonly maxRelaunchCycles;
|
|
39
|
+
constructor(launcher: ChromeLauncher, opts?: ProcessWatchdogOptions);
|
|
40
|
+
/**
|
|
41
|
+
* Start monitoring Chrome process.
|
|
42
|
+
* Timer is .unref()'d so it doesn't prevent process exit.
|
|
43
|
+
*/
|
|
44
|
+
start(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Stop monitoring.
|
|
47
|
+
*/
|
|
48
|
+
stop(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Check if Chrome process is still alive.
|
|
51
|
+
* Uses process.kill(pid, 0) — signal 0 checks existence without killing.
|
|
52
|
+
*/
|
|
53
|
+
private check;
|
|
54
|
+
/**
|
|
55
|
+
* Whether the watchdog is currently running.
|
|
56
|
+
*/
|
|
57
|
+
isRunning(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Get the last known Chrome PID being monitored.
|
|
60
|
+
*/
|
|
61
|
+
getLastKnownPid(): number | null;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=process-watchdog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-watchdog.d.ts","sourceRoot":"","sources":["../../src/chrome/process-watchdog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,mBAAmB,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,iBAAiB,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,oBAAoB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAM;gBAE5B,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,sBAAsB;IAMnE;;;OAGG;IACH,KAAK,IAAI,IAAI;IAWb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;YACW,KAAK;IAyDnB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;CAGjC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chrome Process Watchdog — monitors Chrome process health.
|
|
4
|
+
* Detects Chrome crashes within intervalMs and emits events for recovery.
|
|
5
|
+
* Part of #347 Layer 3: Chrome Process Supervisor.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ChromeProcessWatchdog = void 0;
|
|
9
|
+
const events_1 = require("events");
|
|
10
|
+
class ChromeProcessWatchdog extends events_1.EventEmitter {
|
|
11
|
+
timer = null;
|
|
12
|
+
intervalMs;
|
|
13
|
+
launcher;
|
|
14
|
+
lastKnownPid = null;
|
|
15
|
+
relaunching = false;
|
|
16
|
+
cooldownUntil = 0;
|
|
17
|
+
relaunchCount = 0;
|
|
18
|
+
maxRelaunchCycles = 10;
|
|
19
|
+
constructor(launcher, opts) {
|
|
20
|
+
super();
|
|
21
|
+
this.launcher = launcher;
|
|
22
|
+
this.intervalMs = opts?.intervalMs ?? 10000;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Start monitoring Chrome process.
|
|
26
|
+
* Timer is .unref()'d so it doesn't prevent process exit.
|
|
27
|
+
*/
|
|
28
|
+
start() {
|
|
29
|
+
this.stop(); // clear any existing timer
|
|
30
|
+
this.timer = setInterval(() => {
|
|
31
|
+
this.check().catch((err) => {
|
|
32
|
+
console.error('[ProcessWatchdog] Unexpected error in check():', err);
|
|
33
|
+
});
|
|
34
|
+
}, this.intervalMs);
|
|
35
|
+
this.timer.unref();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Stop monitoring.
|
|
39
|
+
*/
|
|
40
|
+
stop() {
|
|
41
|
+
if (this.timer) {
|
|
42
|
+
clearInterval(this.timer);
|
|
43
|
+
this.timer = null;
|
|
44
|
+
}
|
|
45
|
+
// Do NOT reset relaunching — async check() may still be in-flight
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if Chrome process is still alive.
|
|
49
|
+
* Uses process.kill(pid, 0) — signal 0 checks existence without killing.
|
|
50
|
+
*/
|
|
51
|
+
async check() {
|
|
52
|
+
if (this.relaunching)
|
|
53
|
+
return; // already handling a crash
|
|
54
|
+
// Cooldown after recent relaunch to let CDPClient fully reconnect
|
|
55
|
+
if (Date.now() < this.cooldownUntil) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (this.launcher.intentionalStop)
|
|
59
|
+
return; // Chrome was stopped intentionally — do not relaunch
|
|
60
|
+
const instance = this.launcher.getInstance();
|
|
61
|
+
if (!instance)
|
|
62
|
+
return; // Chrome not launched by us — nothing to watch
|
|
63
|
+
const pid = instance.process?.pid;
|
|
64
|
+
if (!pid)
|
|
65
|
+
return; // no PID tracked
|
|
66
|
+
this.lastKnownPid = pid;
|
|
67
|
+
try {
|
|
68
|
+
process.kill(pid, 0); // signal 0 = check existence only
|
|
69
|
+
return; // process alive
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err?.code === 'EPERM') {
|
|
73
|
+
return; // process exists but owned by another user (Windows)
|
|
74
|
+
}
|
|
75
|
+
// ESRCH = process truly dead, continue to relaunch
|
|
76
|
+
}
|
|
77
|
+
// Process is dead
|
|
78
|
+
console.error(`[ProcessWatchdog] Chrome process (PID ${pid}) is dead, attempting relaunch...`);
|
|
79
|
+
this.emit('chrome-died', { pid, timestamp: Date.now() });
|
|
80
|
+
this.relaunching = true;
|
|
81
|
+
try {
|
|
82
|
+
await this.launcher.ensureChrome({ autoLaunch: true });
|
|
83
|
+
const newInstance = this.launcher.getInstance();
|
|
84
|
+
const newPid = newInstance?.process?.pid;
|
|
85
|
+
console.error(`[ProcessWatchdog] Chrome relaunched successfully (PID ${newPid})`);
|
|
86
|
+
this.emit('chrome-relaunched', { pid: newPid ?? 0, timestamp: Date.now() });
|
|
87
|
+
this.relaunchCount++;
|
|
88
|
+
// Cooldown: skip 3 check intervals to let CDPClient reconnect
|
|
89
|
+
this.cooldownUntil = Date.now() + this.intervalMs * 3;
|
|
90
|
+
if (this.relaunchCount >= this.maxRelaunchCycles) {
|
|
91
|
+
console.error(`[ProcessWatchdog] Relaunch limit (${this.maxRelaunchCycles}) reached, stopping watchdog`);
|
|
92
|
+
this.emit('watchdog-exhausted', { count: this.relaunchCount, timestamp: Date.now() });
|
|
93
|
+
this.stop();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error('[ProcessWatchdog] Chrome relaunch failed:', error);
|
|
98
|
+
this.emit('relaunch-failed', {
|
|
99
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
100
|
+
timestamp: Date.now(),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
this.relaunching = false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Whether the watchdog is currently running.
|
|
109
|
+
*/
|
|
110
|
+
isRunning() {
|
|
111
|
+
return this.timer !== null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get the last known Chrome PID being monitored.
|
|
115
|
+
*/
|
|
116
|
+
getLastKnownPid() {
|
|
117
|
+
return this.lastKnownPid;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.ChromeProcessWatchdog = ChromeProcessWatchdog;
|
|
121
|
+
//# sourceMappingURL=process-watchdog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-watchdog.js","sourceRoot":"","sources":["../../src/chrome/process-watchdog.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
File without changes
|
|
@@ -52,6 +52,10 @@ export declare const DEFAULT_PAGE_CONFIG_TIMEOUT_MS = 5000;
|
|
|
52
52
|
export declare const DEFAULT_COOKIE_CONTEXT_TIMEOUT_MS = 5000;
|
|
53
53
|
/** Storage state restore timeout in milliseconds. */
|
|
54
54
|
export declare const DEFAULT_STORAGE_STATE_RESTORE_TIMEOUT_MS = 10000;
|
|
55
|
+
/** Storage state watchdog interval in milliseconds.
|
|
56
|
+
* How frequently cookies and localStorage are persisted to disk.
|
|
57
|
+
* Override with OPENCHROME_WATCHDOG_INTERVAL_MS environment variable. */
|
|
58
|
+
export declare const DEFAULT_WATCHDOG_INTERVAL_MS = 30000;
|
|
55
59
|
/** createTarget aggregate timeout in milliseconds. Safety net for entire tab creation chain. */
|
|
56
60
|
export declare const DEFAULT_CREATE_TARGET_TIMEOUT_MS = 60000;
|
|
57
61
|
/** CDP session operation timeout for direct createCDPSession calls. */
|
|
@@ -69,6 +73,18 @@ export declare const DEFAULT_CHROME_LAUNCH_TIMEOUT_MS = 60000;
|
|
|
69
73
|
* Must be LONGER than DEFAULT_CHROME_LAUNCH_TIMEOUT_MS (60s) to allow the launcher's
|
|
70
74
|
* own error (with stderr diagnostics) to propagate instead of a generic timeout. */
|
|
71
75
|
export declare const DEFAULT_SESSION_INIT_TIMEOUT_AUTO_LAUNCH_MS = 75000;
|
|
76
|
+
/** Heartbeat interval in milliseconds. How frequently the CDP connection health is probed.
|
|
77
|
+
* Override with OPENCHROME_HEARTBEAT_INTERVAL_MS environment variable.
|
|
78
|
+
* Lower values detect disconnects faster but increase Chrome CPU overhead. */
|
|
79
|
+
export declare const DEFAULT_HEARTBEAT_INTERVAL_MS = 5000;
|
|
80
|
+
/** Maximum number of reconnection attempts after a disconnect.
|
|
81
|
+
* Override with OPENCHROME_MAX_RECONNECT_ATTEMPTS environment variable.
|
|
82
|
+
* Set higher for long-running sessions where transient failures are expected. */
|
|
83
|
+
export declare const DEFAULT_MAX_RECONNECT_ATTEMPTS = 5;
|
|
84
|
+
/** Base delay between reconnection attempts in milliseconds.
|
|
85
|
+
* Actual delay uses exponential backoff: baseDelay * 2^(attempt-1) + jitter.
|
|
86
|
+
* Override with OPENCHROME_RECONNECT_DELAY_MS environment variable. */
|
|
87
|
+
export declare const DEFAULT_RECONNECT_DELAY_MS = 1000;
|
|
72
88
|
/** Heartbeat active ping timeout in milliseconds.
|
|
73
89
|
* Sends Browser.getVersion to detect half-open WebSocket connections
|
|
74
90
|
* (e.g., after macOS sleep/wake) that browser.isConnected() misses.
|
|
@@ -99,9 +115,52 @@ export declare const DEFAULT_COMPRESSION_LEVEL = "light";
|
|
|
99
115
|
export declare const DEFAULT_VERBOSITY = "normal";
|
|
100
116
|
/** Minimum response size in bytes before compression is applied. */
|
|
101
117
|
export declare const COMPRESSION_MIN_BYTES = 500;
|
|
118
|
+
/** Per-call timeout for CDPClient.send() in milliseconds.
|
|
119
|
+
* Prevents a hung Chrome renderer from blocking indefinitely.
|
|
120
|
+
* The 120s tool execution timeout is the outer safety net, but this
|
|
121
|
+
* catches hangs at the individual CDP command level (15s). */
|
|
122
|
+
export declare const DEFAULT_CDP_SEND_TIMEOUT_MS = 15000;
|
|
102
123
|
/** Completion lock acquisition timeout in milliseconds.
|
|
103
124
|
* Safety net for the promise-based mutex in WorkflowEngine.
|
|
104
125
|
* If a previous lock holder's release() is never called (e.g. due to an
|
|
105
126
|
* unhandled exception outside the try/finally), this prevents permanent deadlock. */
|
|
106
127
|
export declare const DEFAULT_COMPLETION_LOCK_TIMEOUT_MS = 30000;
|
|
128
|
+
/** Chrome process watchdog check interval in milliseconds.
|
|
129
|
+
* How often to verify Chrome PID is still alive.
|
|
130
|
+
* Override with OPENCHROME_PROCESS_WATCHDOG_INTERVAL_MS environment variable. */
|
|
131
|
+
export declare const DEFAULT_PROCESS_WATCHDOG_INTERVAL_MS = 10000;
|
|
132
|
+
/** Per-tab renderer health probe interval in milliseconds.
|
|
133
|
+
* How often to check idle tabs for frozen/crashed renderers.
|
|
134
|
+
* Override with OPENCHROME_TAB_HEALTH_PROBE_INTERVAL_MS environment variable. */
|
|
135
|
+
export declare const DEFAULT_TAB_HEALTH_PROBE_INTERVAL_MS = 60000;
|
|
136
|
+
/** Per-tab renderer health probe timeout in milliseconds.
|
|
137
|
+
* Maximum time to wait for a tab's page.evaluate('1') to respond. */
|
|
138
|
+
export declare const DEFAULT_TAB_HEALTH_PROBE_TIMEOUT_MS = 5000;
|
|
139
|
+
/** Consecutive tab probe failures before marking as unhealthy. */
|
|
140
|
+
export declare const DEFAULT_TAB_UNHEALTHY_THRESHOLD = 3;
|
|
141
|
+
/** Consecutive tab probe failures before auto-eviction. */
|
|
142
|
+
export declare const DEFAULT_TAB_EVICTION_THRESHOLD = 5;
|
|
143
|
+
/** Session state persistence debounce interval in milliseconds.
|
|
144
|
+
* How long to wait after a session mutation before saving to disk. */
|
|
145
|
+
export declare const DEFAULT_SESSION_PERSIST_DEBOUNCE_MS = 5000;
|
|
146
|
+
/** Event loop monitor check interval in milliseconds. */
|
|
147
|
+
export declare const DEFAULT_EVENT_LOOP_CHECK_INTERVAL_MS = 200;
|
|
148
|
+
/** Event loop block warning threshold in milliseconds.
|
|
149
|
+
* Emit warning when blocked longer than this.
|
|
150
|
+
* Low enough to catch stalls before CDP commands time out. */
|
|
151
|
+
export declare const DEFAULT_EVENT_LOOP_WARN_THRESHOLD_MS = 200;
|
|
152
|
+
/** Health endpoint HTTP port. Avoids conflict with Node.js inspector (9229) and Chrome DevTools (9222).
|
|
153
|
+
* Override with OPENCHROME_HEALTH_PORT environment variable. */
|
|
154
|
+
export declare const DEFAULT_HEALTH_ENDPOINT_PORT = 9090;
|
|
155
|
+
/** Idle timeout for adaptive heartbeat mode transition in milliseconds.
|
|
156
|
+
* Switch to idle heartbeat mode after this long without tool calls. */
|
|
157
|
+
export declare const DEFAULT_HEARTBEAT_IDLE_TIMEOUT_MS = 300000;
|
|
158
|
+
/** Recovery mode duration in milliseconds.
|
|
159
|
+
* How long to use fast heartbeat (1s) after reconnection before switching to active. */
|
|
160
|
+
export declare const DEFAULT_HEARTBEAT_RECOVERY_DURATION_MS = 30000;
|
|
161
|
+
/** Stealth navigation settle time in milliseconds.
|
|
162
|
+
* How long to wait with no CDP attached before attaching to the page.
|
|
163
|
+
* Turnstile challenges typically complete in 6-8 seconds.
|
|
164
|
+
* Override with stealthSettleMs parameter on navigate tool. */
|
|
165
|
+
export declare const DEFAULT_STEALTH_SETTLE_MS = 8000;
|
|
107
166
|
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+FAA+F;AAC/F,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB;;;CAAyC,CAAC;AAEvE,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,QAAQ,CAAC;AAEnD,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;yEACyE;AACzE,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAEjD,oFAAoF;AACpF,eAAO,MAAM,6BAA6B,QAAQ,CAAC;AAEnD,+FAA+F;AAC/F,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,uGAAuG;AACvG,eAAO,MAAM,iCAAiC,QAAoB,CAAC;AAEnE,wGAAwG;AACxG,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,2FAA2F;AAC3F,eAAO,MAAM,yCAAyC,OAAO,CAAC;AAE9D,6DAA6D;AAC7D,eAAO,MAAM,kCAAkC,IAAI,CAAC;AAEpD,mDAAmD;AACnD,eAAO,MAAM,8BAA8B,QAAQ,CAAC;AAEpD,qFAAqF;AACrF,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAElD,iGAAiG;AACjG,eAAO,MAAM,6BAA6B,SAAS,CAAC;AAEpD,6GAA6G;AAC7G,eAAO,MAAM,iCAAiC,SAAS,CAAC;AAExD,uFAAuF;AACvF,eAAO,MAAM,+BAA+B,QAAQ,CAAC;AAErD,uFAAuF;AACvF,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAElD,oGAAoG;AACpG,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAEjD,sEAAsE;AACtE,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,wDAAwD;AACxD,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAEtD,qDAAqD;AACrD,eAAO,MAAM,wCAAwC,QAAQ,CAAC;AAE9D,gGAAgG;AAChG,eAAO,MAAM,gCAAgC,QAAQ,CAAC;AAEtD,uEAAuE;AACvE,eAAO,MAAM,iCAAiC,QAAQ,CAAC;AAEvD,sFAAsF;AACtF,eAAO,MAAM,iCAAiC,SAAS,CAAC;AAExD;;gGAEgG;AAChG,eAAO,MAAM,oCAAoC,QAAQ,CAAC;AAE1D;mEACmE;AACnE,eAAO,MAAM,gCAAgC,QAAQ,CAAC;AAEtD;;qFAEqF;AACrF,eAAO,MAAM,2CAA2C,QAAQ,CAAC;AAEjE;;;;6EAI6E;AAC7E,eAAO,MAAM,iCAAiC,QAAQ,CAAC;AAEvD;;+DAE+D;AAC/D,eAAO,MAAM,mCAAmC,QAAQ,CAAC;AAEzD;;wDAEwD;AACxD,eAAO,MAAM,kCAAkC,OAAO,CAAC;AAEvD;wFACwF;AACxF,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C;yFACyF;AACzF,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,qEAAqE;AACrE,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,2EAA2E;AAC3E,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD,0DAA0D;AAC1D,eAAO,MAAM,yBAAyB,UAAU,CAAC;AAEjD,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;sFAGsF;AACtF,eAAO,MAAM,kCAAkC,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"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"}
|
package/dist/config/defaults.js
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* Update this single file instead of hunting across tools/cdp/chrome.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.DEFAULT_COMPLETION_LOCK_TIMEOUT_MS = exports.COMPRESSION_MIN_BYTES = exports.DEFAULT_VERBOSITY = exports.DEFAULT_COMPRESSION_LEVEL = exports.DEFAULT_FILL_FORM_POLL_INTERVAL_MS = exports.DEFAULT_FILL_FORM_POLL_MS = exports.DEFAULT_FORM_SUBMIT_SETTLE_MS = exports.DEFAULT_DOM_SETTLE_DELAY_MS = exports.DEFAULT_SCREENSHOT_RACE_TIMEOUT_MS = exports.DEFAULT_CONNECT_VERIFY_STALENESS_MS = exports.DEFAULT_HEARTBEAT_PING_TIMEOUT_MS = exports.DEFAULT_SESSION_INIT_TIMEOUT_AUTO_LAUNCH_MS = exports.DEFAULT_CHROME_LAUNCH_TIMEOUT_MS = exports.DEFAULT_PUPPETEER_CONNECT_TIMEOUT_MS = exports.DEFAULT_OPERATION_GATE_TIMEOUT_MS = exports.DEFAULT_CDP_SESSION_OP_TIMEOUT_MS = exports.DEFAULT_CREATE_TARGET_TIMEOUT_MS = exports.DEFAULT_STORAGE_STATE_RESTORE_TIMEOUT_MS = exports.DEFAULT_COOKIE_CONTEXT_TIMEOUT_MS = exports.DEFAULT_PAGE_CONFIG_TIMEOUT_MS = exports.DEFAULT_NEW_PAGE_TIMEOUT_MS = exports.DEFAULT_RECONNECT_TIMEOUT_MS = exports.DEFAULT_SESSION_INIT_TIMEOUT_MS = exports.DEFAULT_TOOL_EXECUTION_TIMEOUT_MS = exports.DEFAULT_QUEUE_ITEM_TIMEOUT_MS = exports.DEFAULT_SAFE_TITLE_TIMEOUT_MS = exports.DEFAULT_COOKIE_COPY_TIMEOUT_MS = exports.DEFAULT_COOKIE_SCAN_MAX_CANDIDATES = exports.DEFAULT_COOKIE_SCAN_PER_TARGET_TIMEOUT_MS = exports.DEFAULT_COOKIE_SCAN_TIMEOUT_MS = exports.DEFAULT_MEMORY_PRESSURE_THRESHOLD = exports.DEFAULT_MAX_TARGETS_PER_WORKER = exports.DEFAULT_SCREENSHOT_TIMEOUT_MS = exports.DEFAULT_PROTOCOL_TIMEOUT_MS = exports.MAX_SEARCH_CANDIDATES = exports.DEFAULT_NAVIGATION_TIMEOUT_MS = exports.DEFAULT_VIEWPORT = exports.MAX_OUTPUT_CHARS = exports.DEFAULT_SCREENSHOT_QUALITY = void 0;
|
|
9
|
+
exports.DEFAULT_SESSION_PERSIST_DEBOUNCE_MS = exports.DEFAULT_TAB_EVICTION_THRESHOLD = exports.DEFAULT_TAB_UNHEALTHY_THRESHOLD = exports.DEFAULT_TAB_HEALTH_PROBE_TIMEOUT_MS = exports.DEFAULT_TAB_HEALTH_PROBE_INTERVAL_MS = exports.DEFAULT_PROCESS_WATCHDOG_INTERVAL_MS = exports.DEFAULT_COMPLETION_LOCK_TIMEOUT_MS = exports.DEFAULT_CDP_SEND_TIMEOUT_MS = exports.COMPRESSION_MIN_BYTES = exports.DEFAULT_VERBOSITY = exports.DEFAULT_COMPRESSION_LEVEL = exports.DEFAULT_FILL_FORM_POLL_INTERVAL_MS = exports.DEFAULT_FILL_FORM_POLL_MS = exports.DEFAULT_FORM_SUBMIT_SETTLE_MS = exports.DEFAULT_DOM_SETTLE_DELAY_MS = exports.DEFAULT_SCREENSHOT_RACE_TIMEOUT_MS = exports.DEFAULT_CONNECT_VERIFY_STALENESS_MS = exports.DEFAULT_HEARTBEAT_PING_TIMEOUT_MS = exports.DEFAULT_RECONNECT_DELAY_MS = exports.DEFAULT_MAX_RECONNECT_ATTEMPTS = exports.DEFAULT_HEARTBEAT_INTERVAL_MS = exports.DEFAULT_SESSION_INIT_TIMEOUT_AUTO_LAUNCH_MS = exports.DEFAULT_CHROME_LAUNCH_TIMEOUT_MS = exports.DEFAULT_PUPPETEER_CONNECT_TIMEOUT_MS = exports.DEFAULT_OPERATION_GATE_TIMEOUT_MS = exports.DEFAULT_CDP_SESSION_OP_TIMEOUT_MS = exports.DEFAULT_CREATE_TARGET_TIMEOUT_MS = exports.DEFAULT_WATCHDOG_INTERVAL_MS = exports.DEFAULT_STORAGE_STATE_RESTORE_TIMEOUT_MS = exports.DEFAULT_COOKIE_CONTEXT_TIMEOUT_MS = exports.DEFAULT_PAGE_CONFIG_TIMEOUT_MS = exports.DEFAULT_NEW_PAGE_TIMEOUT_MS = exports.DEFAULT_RECONNECT_TIMEOUT_MS = exports.DEFAULT_SESSION_INIT_TIMEOUT_MS = exports.DEFAULT_TOOL_EXECUTION_TIMEOUT_MS = exports.DEFAULT_QUEUE_ITEM_TIMEOUT_MS = exports.DEFAULT_SAFE_TITLE_TIMEOUT_MS = exports.DEFAULT_COOKIE_COPY_TIMEOUT_MS = exports.DEFAULT_COOKIE_SCAN_MAX_CANDIDATES = exports.DEFAULT_COOKIE_SCAN_PER_TARGET_TIMEOUT_MS = exports.DEFAULT_COOKIE_SCAN_TIMEOUT_MS = exports.DEFAULT_MEMORY_PRESSURE_THRESHOLD = exports.DEFAULT_MAX_TARGETS_PER_WORKER = exports.DEFAULT_SCREENSHOT_TIMEOUT_MS = exports.DEFAULT_PROTOCOL_TIMEOUT_MS = exports.MAX_SEARCH_CANDIDATES = exports.DEFAULT_NAVIGATION_TIMEOUT_MS = exports.DEFAULT_VIEWPORT = exports.MAX_OUTPUT_CHARS = exports.DEFAULT_SCREENSHOT_QUALITY = void 0;
|
|
10
|
+
exports.DEFAULT_STEALTH_SETTLE_MS = exports.DEFAULT_HEARTBEAT_RECOVERY_DURATION_MS = exports.DEFAULT_HEARTBEAT_IDLE_TIMEOUT_MS = exports.DEFAULT_HEALTH_ENDPOINT_PORT = exports.DEFAULT_EVENT_LOOP_WARN_THRESHOLD_MS = exports.DEFAULT_EVENT_LOOP_CHECK_INTERVAL_MS = void 0;
|
|
10
11
|
/** WebP screenshot quality (0-100). Directly affects LLM token consumption via base64 size. */
|
|
11
12
|
exports.DEFAULT_SCREENSHOT_QUALITY = 60;
|
|
12
13
|
/** Maximum characters returned in page content output (read_page, DOM serializer, batch_paginate). */
|
|
@@ -52,6 +53,10 @@ exports.DEFAULT_PAGE_CONFIG_TIMEOUT_MS = 5000;
|
|
|
52
53
|
exports.DEFAULT_COOKIE_CONTEXT_TIMEOUT_MS = 5000;
|
|
53
54
|
/** Storage state restore timeout in milliseconds. */
|
|
54
55
|
exports.DEFAULT_STORAGE_STATE_RESTORE_TIMEOUT_MS = 10000;
|
|
56
|
+
/** Storage state watchdog interval in milliseconds.
|
|
57
|
+
* How frequently cookies and localStorage are persisted to disk.
|
|
58
|
+
* Override with OPENCHROME_WATCHDOG_INTERVAL_MS environment variable. */
|
|
59
|
+
exports.DEFAULT_WATCHDOG_INTERVAL_MS = 30000;
|
|
55
60
|
/** createTarget aggregate timeout in milliseconds. Safety net for entire tab creation chain. */
|
|
56
61
|
exports.DEFAULT_CREATE_TARGET_TIMEOUT_MS = 60000;
|
|
57
62
|
/** CDP session operation timeout for direct createCDPSession calls. */
|
|
@@ -69,6 +74,18 @@ exports.DEFAULT_CHROME_LAUNCH_TIMEOUT_MS = 60000;
|
|
|
69
74
|
* Must be LONGER than DEFAULT_CHROME_LAUNCH_TIMEOUT_MS (60s) to allow the launcher's
|
|
70
75
|
* own error (with stderr diagnostics) to propagate instead of a generic timeout. */
|
|
71
76
|
exports.DEFAULT_SESSION_INIT_TIMEOUT_AUTO_LAUNCH_MS = 75000;
|
|
77
|
+
/** Heartbeat interval in milliseconds. How frequently the CDP connection health is probed.
|
|
78
|
+
* Override with OPENCHROME_HEARTBEAT_INTERVAL_MS environment variable.
|
|
79
|
+
* Lower values detect disconnects faster but increase Chrome CPU overhead. */
|
|
80
|
+
exports.DEFAULT_HEARTBEAT_INTERVAL_MS = 5000;
|
|
81
|
+
/** Maximum number of reconnection attempts after a disconnect.
|
|
82
|
+
* Override with OPENCHROME_MAX_RECONNECT_ATTEMPTS environment variable.
|
|
83
|
+
* Set higher for long-running sessions where transient failures are expected. */
|
|
84
|
+
exports.DEFAULT_MAX_RECONNECT_ATTEMPTS = 5;
|
|
85
|
+
/** Base delay between reconnection attempts in milliseconds.
|
|
86
|
+
* Actual delay uses exponential backoff: baseDelay * 2^(attempt-1) + jitter.
|
|
87
|
+
* Override with OPENCHROME_RECONNECT_DELAY_MS environment variable. */
|
|
88
|
+
exports.DEFAULT_RECONNECT_DELAY_MS = 1000;
|
|
72
89
|
/** Heartbeat active ping timeout in milliseconds.
|
|
73
90
|
* Sends Browser.getVersion to detect half-open WebSocket connections
|
|
74
91
|
* (e.g., after macOS sleep/wake) that browser.isConnected() misses.
|
|
@@ -99,9 +116,53 @@ exports.DEFAULT_COMPRESSION_LEVEL = 'light';
|
|
|
99
116
|
exports.DEFAULT_VERBOSITY = 'normal';
|
|
100
117
|
/** Minimum response size in bytes before compression is applied. */
|
|
101
118
|
exports.COMPRESSION_MIN_BYTES = 500;
|
|
119
|
+
/** Per-call timeout for CDPClient.send() in milliseconds.
|
|
120
|
+
* Prevents a hung Chrome renderer from blocking indefinitely.
|
|
121
|
+
* The 120s tool execution timeout is the outer safety net, but this
|
|
122
|
+
* catches hangs at the individual CDP command level (15s). */
|
|
123
|
+
exports.DEFAULT_CDP_SEND_TIMEOUT_MS = 15000;
|
|
102
124
|
/** Completion lock acquisition timeout in milliseconds.
|
|
103
125
|
* Safety net for the promise-based mutex in WorkflowEngine.
|
|
104
126
|
* If a previous lock holder's release() is never called (e.g. due to an
|
|
105
127
|
* unhandled exception outside the try/finally), this prevents permanent deadlock. */
|
|
106
128
|
exports.DEFAULT_COMPLETION_LOCK_TIMEOUT_MS = 30000;
|
|
129
|
+
// ─── Self-Healing Architecture (#347) ──────────────────────────────────────
|
|
130
|
+
/** Chrome process watchdog check interval in milliseconds.
|
|
131
|
+
* How often to verify Chrome PID is still alive.
|
|
132
|
+
* Override with OPENCHROME_PROCESS_WATCHDOG_INTERVAL_MS environment variable. */
|
|
133
|
+
exports.DEFAULT_PROCESS_WATCHDOG_INTERVAL_MS = 10000;
|
|
134
|
+
/** Per-tab renderer health probe interval in milliseconds.
|
|
135
|
+
* How often to check idle tabs for frozen/crashed renderers.
|
|
136
|
+
* Override with OPENCHROME_TAB_HEALTH_PROBE_INTERVAL_MS environment variable. */
|
|
137
|
+
exports.DEFAULT_TAB_HEALTH_PROBE_INTERVAL_MS = 60000;
|
|
138
|
+
/** Per-tab renderer health probe timeout in milliseconds.
|
|
139
|
+
* Maximum time to wait for a tab's page.evaluate('1') to respond. */
|
|
140
|
+
exports.DEFAULT_TAB_HEALTH_PROBE_TIMEOUT_MS = 5000;
|
|
141
|
+
/** Consecutive tab probe failures before marking as unhealthy. */
|
|
142
|
+
exports.DEFAULT_TAB_UNHEALTHY_THRESHOLD = 3;
|
|
143
|
+
/** Consecutive tab probe failures before auto-eviction. */
|
|
144
|
+
exports.DEFAULT_TAB_EVICTION_THRESHOLD = 5;
|
|
145
|
+
/** Session state persistence debounce interval in milliseconds.
|
|
146
|
+
* How long to wait after a session mutation before saving to disk. */
|
|
147
|
+
exports.DEFAULT_SESSION_PERSIST_DEBOUNCE_MS = 5000;
|
|
148
|
+
/** Event loop monitor check interval in milliseconds. */
|
|
149
|
+
exports.DEFAULT_EVENT_LOOP_CHECK_INTERVAL_MS = 200;
|
|
150
|
+
/** Event loop block warning threshold in milliseconds.
|
|
151
|
+
* Emit warning when blocked longer than this.
|
|
152
|
+
* Low enough to catch stalls before CDP commands time out. */
|
|
153
|
+
exports.DEFAULT_EVENT_LOOP_WARN_THRESHOLD_MS = 200;
|
|
154
|
+
/** Health endpoint HTTP port. Avoids conflict with Node.js inspector (9229) and Chrome DevTools (9222).
|
|
155
|
+
* Override with OPENCHROME_HEALTH_PORT environment variable. */
|
|
156
|
+
exports.DEFAULT_HEALTH_ENDPOINT_PORT = 9090;
|
|
157
|
+
/** Idle timeout for adaptive heartbeat mode transition in milliseconds.
|
|
158
|
+
* Switch to idle heartbeat mode after this long without tool calls. */
|
|
159
|
+
exports.DEFAULT_HEARTBEAT_IDLE_TIMEOUT_MS = 300000;
|
|
160
|
+
/** Recovery mode duration in milliseconds.
|
|
161
|
+
* How long to use fast heartbeat (1s) after reconnection before switching to active. */
|
|
162
|
+
exports.DEFAULT_HEARTBEAT_RECOVERY_DURATION_MS = 30000;
|
|
163
|
+
/** Stealth navigation settle time in milliseconds.
|
|
164
|
+
* How long to wait with no CDP attached before attaching to the page.
|
|
165
|
+
* Turnstile challenges typically complete in 6-8 seconds.
|
|
166
|
+
* Override with stealthSettleMs parameter on navigate tool. */
|
|
167
|
+
exports.DEFAULT_STEALTH_SETTLE_MS = 8000;
|
|
107
168
|
//# sourceMappingURL=defaults.js.map
|