cloakbrowser-mcp 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -1
- package/dist/bridge/config.d.ts +25 -2
- package/dist/bridge/config.d.ts.map +1 -1
- package/dist/bridge/config.js +183 -9
- package/dist/bridge/config.js.map +1 -1
- package/dist/cli/options.d.ts +5 -1
- package/dist/cli/options.d.ts.map +1 -1
- package/dist/cli/options.js +39 -1
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/singleton-lock-cleanup.d.ts +34 -0
- package/dist/cli/singleton-lock-cleanup.d.ts.map +1 -0
- package/dist/cli/singleton-lock-cleanup.js +151 -0
- package/dist/cli/singleton-lock-cleanup.js.map +1 -0
- package/dist/cli.js +10 -4
- package/dist/cli.js.map +1 -1
- package/dist/http/options.d.ts +8 -0
- package/dist/http/options.d.ts.map +1 -1
- package/dist/http/options.js +5 -0
- package/dist/http/options.js.map +1 -1
- package/dist/http/requests.d.ts +5 -0
- package/dist/http/requests.d.ts.map +1 -1
- package/dist/http/requests.js +76 -3
- package/dist/http/requests.js.map +1 -1
- package/dist/http/server.d.ts +2 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +20 -2
- package/dist/http/server.js.map +1 -1
- package/dist/protocol/constants.d.ts +1 -0
- package/dist/protocol/constants.d.ts.map +1 -1
- package/dist/protocol/constants.js +1 -0
- package/dist/protocol/constants.js.map +1 -1
- package/dist/runtime/humanize-init-page.cjs +19 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/package.json +13 -6
- package/server.json +29 -5
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
[](docs/docker.md)
|
|
24
24
|
[](LICENSE)
|
|
25
25
|
|
|
26
|
-
`cloakbrowser-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io/) browser automation server that runs upstream [`@playwright/mcp`](https://github.com/microsoft/playwright-mcp) with the [CloakBrowser](https://github.com/CloakHQ/CloakBrowser) Chromium binary. It provides Playwright MCP-compatible tools through a thin CloakBrowser bridge for npm and Docker users over stdio or Streamable HTTP.
|
|
26
|
+
`cloakbrowser-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io/) browser automation server that runs upstream [`@playwright/mcp`](https://github.com/microsoft/playwright-mcp) with the [CloakBrowser](https://github.com/CloakHQ/CloakBrowser) Chromium binary. It provides Playwright MCP-compatible tools through a thin CloakBrowser bridge for npm and Docker users over stdio or Streamable HTTP, including GeoIP-aware proxy matching and humanized input behavior for QA.
|
|
27
27
|
|
|
28
28
|
Documentation: [swimmwatch.github.io/cloakbrowser-mcp](https://swimmwatch.github.io/cloakbrowser-mcp/)
|
|
29
29
|
|
|
@@ -42,6 +42,7 @@ The server is intentionally thin:
|
|
|
42
42
|
|
|
43
43
|
| cloakbrowser-mcp | @playwright/mcp | CloakBrowser | Node.js | Platform |
|
|
44
44
|
| ---------------- | --------------- | ------------ | --------- | ----------------------------------------------------------------------------------------- |
|
|
45
|
+
| `1.5.0` | `^0.0.76` | `^0.4.3` | `>=22.12` | npm on Linux x64/arm64, macOS arm64/x64, Windows x64; Docker `linux/amd64`, `linux/arm64` |
|
|
45
46
|
| `1.4.0` | `^0.0.76` | `^0.3.32` | `>=22.12` | npm on Linux x64/arm64, macOS arm64/x64, Windows x64; Docker `linux/amd64`, `linux/arm64` |
|
|
46
47
|
| `1.3.0` | `^0.0.75` | `^0.3.31` | `>=20` | Docker `linux/amd64`, Node.js local |
|
|
47
48
|
| `1.2.7` | `^0.0.75` | `^0.3.30` | `>=20` | Docker `linux/amd64`, Node.js local |
|
|
@@ -163,6 +164,7 @@ The same tags are also published to `ghcr.io/swimmwatch/cloakbrowser-mcp`.
|
|
|
163
164
|
|
|
164
165
|
Use upstream `PLAYWRIGHT_MCP_*` variables for browser, artifact, timeout, network, and tool capability settings. Cloak-specific bridge toggles use `CLOAK_PLAYWRIGHT_MCP_*`.
|
|
165
166
|
CLI flags are documented in the generated [CLI Reference](https://swimmwatch.github.io/cloakbrowser-mcp/generated/cli/).
|
|
167
|
+
GeoIP proxy matching and Streamable HTTP runtime metadata are documented in [GeoIP Proxy Matching](docs/geoip-proxy-matching.md) and [Configuration](docs/configuration.md). Human-like mouse, keyboard, and scroll behavior is documented in [Humanized Input Behavior](docs/humanized-input-behavior.md).
|
|
166
168
|
|
|
167
169
|
Common variables:
|
|
168
170
|
|
|
@@ -182,6 +184,11 @@ Common variables:
|
|
|
182
184
|
| `CLOAK_PLAYWRIGHT_MCP_HTTPS_PFX` | unset | TLS PFX/PKCS12 path for HTTPS Streamable HTTP. |
|
|
183
185
|
| `CLOAK_PLAYWRIGHT_MCP_HTTPS_PASSPHRASE` | unset | Passphrase for an encrypted HTTPS key or PFX. |
|
|
184
186
|
| `CLOAK_PLAYWRIGHT_MCP_LOG_LEVEL` | `info` | Streamable HTTP operational log level: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, or `silent`. |
|
|
187
|
+
| `PLAYWRIGHT_MCP_PROXY_SERVER` | unset | Upstream Playwright MCP proxy server. Used as the GeoIP source when matching is enabled. |
|
|
188
|
+
| `PLAYWRIGHT_MCP_PROXY_BYPASS` | unset | Upstream proxy bypass list for hosts that should not use `PLAYWRIGHT_MCP_PROXY_SERVER`. |
|
|
189
|
+
| `CLOAK_PLAYWRIGHT_MCP_GEOIP_PROXY_MATCH` | `false` | Match CloakBrowser timezone and locale fingerprint flags to `PLAYWRIGHT_MCP_PROXY_SERVER` GeoIP. |
|
|
190
|
+
| `CLOAK_PLAYWRIGHT_MCP_HUMANIZE` | `false` | Enables CloakBrowser human-like mouse, keyboard, and scroll behavior. |
|
|
191
|
+
| `CLOAK_PLAYWRIGHT_MCP_HUMAN_PRESET` | `default` | CloakBrowser human behavior preset: `default` or `careful`. Used only when humanize is enabled. |
|
|
185
192
|
| `PLAYWRIGHT_MCP_BROWSER_ENGINE` | `cloak` | `cloak` uses CloakBrowser. `playwright` uses the upstream Playwright MCP browser runtime. |
|
|
186
193
|
| `PLAYWRIGHT_MCP_HEADLESS` | `true` | Runs Chromium headless. |
|
|
187
194
|
| `PLAYWRIGHT_MCP_OUTPUT_DIR` | `.playwright-mcp` | Artifact directory for npm usage. Docker defaults to `/data`. |
|
|
@@ -190,6 +197,54 @@ Common variables:
|
|
|
190
197
|
| `CLOAK_PLAYWRIGHT_MCP_STEALTH_ARGS` | `true` | Adds CloakBrowser default stealth launch arguments. |
|
|
191
198
|
| `CLOAK_PLAYWRIGHT_MCP_EXTRA_ARGS` | unset | Comma-separated or JSON array of extra Chromium launch arguments. |
|
|
192
199
|
|
|
200
|
+
Streamable HTTP clients can override the proxy per MCP session by passing bridge
|
|
201
|
+
metadata in the `initialize` request:
|
|
202
|
+
|
|
203
|
+
```json
|
|
204
|
+
{
|
|
205
|
+
"params": {
|
|
206
|
+
"_meta": {
|
|
207
|
+
"io.github.swimmwatch/cloakbrowser-mcp": {
|
|
208
|
+
"proxyServer": "http://user:pass@proxy.example:8080",
|
|
209
|
+
"proxyBypass": ".internal,localhost",
|
|
210
|
+
"geoipProxyMatch": true,
|
|
211
|
+
"headless": false,
|
|
212
|
+
"humanize": true,
|
|
213
|
+
"humanPreset": "careful"
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Runtime proxy metadata overrides `PLAYWRIGHT_MCP_PROXY_SERVER` and
|
|
221
|
+
`PLAYWRIGHT_MCP_PROXY_BYPASS` for that HTTP session only. Stdio keeps using
|
|
222
|
+
process-level environment and CLI configuration.
|
|
223
|
+
|
|
224
|
+
`headless` overrides `PLAYWRIGHT_MCP_HEADLESS` for that HTTP session only. Use
|
|
225
|
+
`headless: false` only where the runtime has a usable display environment, such
|
|
226
|
+
as a local desktop session, Xvfb, or an equivalent container display setup.
|
|
227
|
+
|
|
228
|
+
Authenticated HTTP proxies are supported with credentials embedded in
|
|
229
|
+
`proxyServer`, for example `http://user:pass@proxy.example:8080`. Percent-encode
|
|
230
|
+
credential characters that have URL meaning, such as `@`, `:`, `/`, `?`, `#`,
|
|
231
|
+
and `%`.
|
|
232
|
+
|
|
233
|
+
Enable `CLOAK_PLAYWRIGHT_MCP_GEOIP_PROXY_MATCH=true` to align CloakBrowser
|
|
234
|
+
timezone, language, and locale fingerprint flags with the selected proxy
|
|
235
|
+
location. Streamable HTTP clients can set `geoipProxyMatch` per session to run
|
|
236
|
+
different regional QA scenarios from one server process.
|
|
237
|
+
|
|
238
|
+
Enable `CLOAK_PLAYWRIGHT_MCP_HUMANIZE=true` to route Playwright page input
|
|
239
|
+
methods through CloakBrowser's human-like interaction layer. Streamable HTTP
|
|
240
|
+
clients can set `humanize` and `humanPreset` per session to compare standard,
|
|
241
|
+
default-humanized, and careful-humanized interaction behavior without restarting
|
|
242
|
+
the server. `humanPreset` accepts `default` or `careful` and does not enable
|
|
243
|
+
humanized behavior by itself.
|
|
244
|
+
|
|
245
|
+
Custom `humanConfig` objects are intentionally not supported yet; accepting
|
|
246
|
+
structured config requires a dedicated validation schema.
|
|
247
|
+
|
|
193
248
|
The old `CLOAKBROWSER_MCP_*` variables are not supported.
|
|
194
249
|
|
|
195
250
|
## Tools
|
package/dist/bridge/config.d.ts
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
|
-
import { binaryInfo } from 'cloakbrowser';
|
|
1
|
+
import { binaryInfo, buildLaunchOptions } from 'cloakbrowser';
|
|
2
2
|
import { type EnvReader } from '#src/bridge/env';
|
|
3
3
|
export type BrowserEngine = 'cloak' | 'playwright';
|
|
4
|
+
export declare const humanPresets: readonly ["default", "careful"];
|
|
5
|
+
export type HumanPreset = (typeof humanPresets)[number];
|
|
6
|
+
type CloakBuildLaunchOptions = typeof buildLaunchOptions;
|
|
7
|
+
type PlaywrightProxyOption = {
|
|
8
|
+
server: string;
|
|
9
|
+
bypass?: string;
|
|
10
|
+
username?: string;
|
|
11
|
+
password?: string;
|
|
12
|
+
};
|
|
13
|
+
export interface BridgeRuntimeProxy {
|
|
14
|
+
server: string;
|
|
15
|
+
bypass?: string;
|
|
16
|
+
}
|
|
4
17
|
export interface BridgeRuntime {
|
|
5
18
|
browserEngine: BrowserEngine;
|
|
6
19
|
configPath: string;
|
|
@@ -15,7 +28,13 @@ export interface PrepareBridgeRuntimeOptions {
|
|
|
15
28
|
env?: EnvReader;
|
|
16
29
|
tempRoot?: string;
|
|
17
30
|
ensureCloakBinary?: () => Promise<string>;
|
|
31
|
+
buildCloakLaunchOptions?: CloakBuildLaunchOptions;
|
|
18
32
|
browserIsolated?: boolean;
|
|
33
|
+
geoipProxyMatch?: boolean;
|
|
34
|
+
headless?: boolean;
|
|
35
|
+
humanize?: boolean;
|
|
36
|
+
humanPreset?: HumanPreset;
|
|
37
|
+
proxy?: BridgeRuntimeProxy;
|
|
19
38
|
}
|
|
20
39
|
export interface PlaywrightMcpBridgeConfig {
|
|
21
40
|
browser?: {
|
|
@@ -27,12 +46,16 @@ export interface PlaywrightMcpBridgeConfig {
|
|
|
27
46
|
args?: string[];
|
|
28
47
|
chromiumSandbox?: boolean;
|
|
29
48
|
ignoreDefaultArgs?: string[];
|
|
49
|
+
proxy?: PlaywrightProxyOption;
|
|
30
50
|
};
|
|
51
|
+
initPage?: string[];
|
|
31
52
|
initScript?: string[];
|
|
32
53
|
};
|
|
33
54
|
}
|
|
34
55
|
export declare function prepareBridgeRuntime(options?: PrepareBridgeRuntimeOptions): Promise<BridgeRuntime>;
|
|
35
56
|
export declare function createLaunchArgs(env: EnvReader): string[];
|
|
36
|
-
export declare function
|
|
57
|
+
export declare function parseHumanPreset(value: string): HumanPreset;
|
|
58
|
+
export declare function createChildEnv(env: EnvReader, outputDir: string, runtimeProxy?: BridgeRuntimeProxy, headless?: boolean, humanPreset?: "default" | "careful"): Record<string, string>;
|
|
37
59
|
export declare function getCurrentCloakBinaryInfo(): ReturnType<typeof binaryInfo>;
|
|
60
|
+
export {};
|
|
38
61
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/bridge/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/bridge/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAuC,MAAM,cAAc,CAAC;AACnG,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAIzB,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,YAAY,CAAC;AACnD,eAAO,MAAM,YAAY,iCAAkC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AACxD,KAAK,uBAAuB,GAAG,OAAO,kBAAkB,CAAC;AAGzD,KAAK,qBAAqB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,yBAAyB,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,UAAU,CAAC;QACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,aAAa,CAAC,EAAE;YACd,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,eAAe,CAAC,EAAE,OAAO,CAAC;YAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;YAC7B,KAAK,CAAC,EAAE,qBAAqB,CAAC;SAC/B,CAAC;QACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAID,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,aAAa,CAAC,CAoFxB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,EAAE,CAQzD;AAuCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAG3D;AAgHD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,kBAAkB,EACjC,QAAQ,UAAgD,EACxD,WAAW,wBAAmF,GAC7F,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBxB;AAcD,wBAAgB,yBAAyB,IAAI,UAAU,CAAC,OAAO,UAAU,CAAC,CAEzE"}
|
package/dist/bridge/config.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import {
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { binaryInfo, buildLaunchOptions, ensureBinary, getDefaultStealthArgs } from 'cloakbrowser';
|
|
5
6
|
import { appendNodeOption, envBool, envInt, envList, envString, quoteNodeOptionValue, } from '#src/bridge/env';
|
|
6
7
|
import { resolvePlaywrightCoreBundlePath } from '#src/bridge/paths';
|
|
7
8
|
import { consoleFallbackInitScript, consoleFallbackPreloadScript } from '#src/runtime/consoleFallback';
|
|
9
|
+
export const humanPresets = ['default', 'careful'];
|
|
8
10
|
const ignoredAutomationArgs = ['--enable-automation', '--enable-unsafe-swiftshader'];
|
|
9
11
|
export async function prepareBridgeRuntime(options = {}) {
|
|
10
12
|
const env = options.env ?? process.env;
|
|
@@ -12,12 +14,15 @@ export async function prepareBridgeRuntime(options = {}) {
|
|
|
12
14
|
const outputDir = envString(env, 'PLAYWRIGHT_MCP_OUTPUT_DIR', path.resolve('.playwright-mcp'));
|
|
13
15
|
mkdirSync(outputDir, { recursive: true });
|
|
14
16
|
const browserEngine = parseBrowserEngine(envString(env, 'PLAYWRIGHT_MCP_BROWSER_ENGINE', 'cloak'));
|
|
15
|
-
const childEnv = createChildEnv(env, outputDir);
|
|
16
17
|
const useCloak = browserEngine === 'cloak';
|
|
18
|
+
const headless = options.headless ?? envBool(env, 'PLAYWRIGHT_MCP_HEADLESS', true);
|
|
19
|
+
const humanPreset = options.humanPreset ?? parseHumanPreset(envString(env, 'CLOAK_PLAYWRIGHT_MCP_HUMAN_PRESET', 'default'));
|
|
20
|
+
const childEnv = createChildEnv(env, outputDir, options.proxy, headless, humanPreset);
|
|
21
|
+
const chromiumSandbox = useCloak ? !envBool(env, 'CLOAK_PLAYWRIGHT_MCP_NO_SANDBOX', true) : undefined;
|
|
17
22
|
const launchOptions = {
|
|
18
|
-
headless
|
|
23
|
+
headless,
|
|
19
24
|
args: useCloak ? createLaunchArgs(env) : envList(env, 'CLOAK_PLAYWRIGHT_MCP_EXTRA_ARGS'),
|
|
20
|
-
chromiumSandbox
|
|
25
|
+
chromiumSandbox,
|
|
21
26
|
ignoreDefaultArgs: useCloak ? ignoredAutomationArgs : undefined,
|
|
22
27
|
};
|
|
23
28
|
const config = {
|
|
@@ -26,6 +31,10 @@ export async function prepareBridgeRuntime(options = {}) {
|
|
|
26
31
|
launchOptions,
|
|
27
32
|
},
|
|
28
33
|
};
|
|
34
|
+
const configuredProxy = resolveConfiguredProxy(env, launchOptions.args ?? [], options.proxy);
|
|
35
|
+
if (configuredProxy && typeof configuredProxy !== 'string') {
|
|
36
|
+
config.browser.launchOptions.proxy = configuredProxy;
|
|
37
|
+
}
|
|
29
38
|
if (options.browserIsolated === true) {
|
|
30
39
|
config.browser.isolated = true;
|
|
31
40
|
childEnv.PLAYWRIGHT_MCP_ISOLATED = 'true';
|
|
@@ -36,6 +45,19 @@ export async function prepareBridgeRuntime(options = {}) {
|
|
|
36
45
|
config.browser.launchOptions.executablePath = cloakBinaryPath;
|
|
37
46
|
childEnv.PLAYWRIGHT_MCP_EXECUTABLE_PATH = cloakBinaryPath;
|
|
38
47
|
childEnv.CLOAKBROWSER_AUTO_UPDATE = childEnv.CLOAKBROWSER_AUTO_UPDATE ?? 'false';
|
|
48
|
+
if (shouldMatchProxyGeoip(env, options.geoipProxyMatch)) {
|
|
49
|
+
config.browser.launchOptions.args = await resolveGeoipProxyMatchingArgs({
|
|
50
|
+
env,
|
|
51
|
+
args: config.browser.launchOptions.args ?? [],
|
|
52
|
+
headless,
|
|
53
|
+
chromiumSandbox,
|
|
54
|
+
proxy: options.proxy,
|
|
55
|
+
buildCloakLaunchOptions: options.buildCloakLaunchOptions ?? buildLaunchOptions,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (shouldHumanize(env, options.humanize)) {
|
|
59
|
+
config.browser.initPage = [...(config.browser.initPage ?? []), resolveHumanizeInitPagePath()];
|
|
60
|
+
}
|
|
39
61
|
}
|
|
40
62
|
if (useCloak && envBool(env, 'CLOAK_PLAYWRIGHT_MCP_CONSOLE_FALLBACK', true)) {
|
|
41
63
|
const initScriptPath = path.join(tempDir, 'console-fallback-init.js');
|
|
@@ -73,20 +95,156 @@ export function createLaunchArgs(env) {
|
|
|
73
95
|
args.add(arg);
|
|
74
96
|
return [...args];
|
|
75
97
|
}
|
|
76
|
-
|
|
98
|
+
async function resolveGeoipProxyMatchingArgs(options) {
|
|
99
|
+
const proxy = resolveConfiguredProxy(options.env, options.args, options.proxy);
|
|
100
|
+
if (!proxy)
|
|
101
|
+
return options.args;
|
|
102
|
+
const launchOptions = await suppressStdout(() => options.buildCloakLaunchOptions({
|
|
103
|
+
headless: options.headless,
|
|
104
|
+
stealthArgs: false,
|
|
105
|
+
args: options.args,
|
|
106
|
+
proxy,
|
|
107
|
+
geoip: true,
|
|
108
|
+
launchOptions: options.chromiumSandbox === undefined ? undefined : { chromiumSandbox: options.chromiumSandbox },
|
|
109
|
+
}));
|
|
110
|
+
return mergeLaunchArgs(options.args, extractGeoipMatchingArgs(launchOptions.args ?? []));
|
|
111
|
+
}
|
|
112
|
+
function shouldMatchProxyGeoip(env, explicit) {
|
|
113
|
+
return explicit ?? envBool(env, 'CLOAK_PLAYWRIGHT_MCP_GEOIP_PROXY_MATCH', false);
|
|
114
|
+
}
|
|
115
|
+
function shouldHumanize(env, explicit) {
|
|
116
|
+
return explicit ?? envBool(env, 'CLOAK_PLAYWRIGHT_MCP_HUMANIZE', false);
|
|
117
|
+
}
|
|
118
|
+
export function parseHumanPreset(value) {
|
|
119
|
+
if (isHumanPreset(value))
|
|
120
|
+
return value;
|
|
121
|
+
throw new Error(`CLOAK_PLAYWRIGHT_MCP_HUMAN_PRESET must be "default" or "careful", got "${value}"`);
|
|
122
|
+
}
|
|
123
|
+
function isHumanPreset(value) {
|
|
124
|
+
return humanPresets.includes(value);
|
|
125
|
+
}
|
|
126
|
+
function resolveHumanizeInitPagePath() {
|
|
127
|
+
return fileURLToPath(new URL('../runtime/humanize-init-page.cjs', import.meta.url));
|
|
128
|
+
}
|
|
129
|
+
function resolveConfiguredProxy(env, args, runtimeProxy) {
|
|
130
|
+
if (runtimeProxy)
|
|
131
|
+
return runtimeProxy.bypass
|
|
132
|
+
? parseProxyOption(runtimeProxy.server, runtimeProxy.bypass)
|
|
133
|
+
: parseProxyOption(runtimeProxy.server);
|
|
134
|
+
const envProxyServer = optionalEnvString(env, 'PLAYWRIGHT_MCP_PROXY_SERVER');
|
|
135
|
+
if (envProxyServer) {
|
|
136
|
+
const bypass = optionalEnvString(env, 'PLAYWRIGHT_MCP_PROXY_BYPASS');
|
|
137
|
+
return bypass ? parseProxyOption(envProxyServer, bypass) : parseProxyOption(envProxyServer);
|
|
138
|
+
}
|
|
139
|
+
const argProxyServer = findLaunchArgValue(args, '--proxy-server');
|
|
140
|
+
if (!argProxyServer)
|
|
141
|
+
return undefined;
|
|
142
|
+
const bypass = findLaunchArgValue(args, '--proxy-bypass-list');
|
|
143
|
+
return bypass ? parseProxyOption(argProxyServer, bypass) : parseProxyOption(argProxyServer);
|
|
144
|
+
}
|
|
145
|
+
function parseProxyOption(server, bypass) {
|
|
146
|
+
const parsed = parseProxyServer(server);
|
|
147
|
+
return bypass === undefined ? parsed : { ...parsed, bypass };
|
|
148
|
+
}
|
|
149
|
+
function parseProxyServer(server) {
|
|
150
|
+
try {
|
|
151
|
+
const url = new URL(ensureProxyServerScheme(server));
|
|
152
|
+
const username = decodeUrlCredential(url.username);
|
|
153
|
+
const password = decodeUrlCredential(url.password);
|
|
154
|
+
if (username === undefined && password === undefined)
|
|
155
|
+
return { server };
|
|
156
|
+
return {
|
|
157
|
+
server: `${url.protocol}//${url.host}`,
|
|
158
|
+
...(username === undefined ? {} : { username }),
|
|
159
|
+
...(password === undefined ? {} : { password }),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return { server };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function ensureProxyServerScheme(server) {
|
|
167
|
+
return /^[a-z][a-z0-9+.-]*:\/\//iu.test(server) ? server : `http://${server}`;
|
|
168
|
+
}
|
|
169
|
+
function decodeUrlCredential(value) {
|
|
170
|
+
return value ? decodeURIComponent(value) : undefined;
|
|
171
|
+
}
|
|
172
|
+
function hasProxyCredentials(server) {
|
|
173
|
+
const parsed = parseProxyServer(server);
|
|
174
|
+
return parsed.username !== undefined || parsed.password !== undefined;
|
|
175
|
+
}
|
|
176
|
+
function extractGeoipMatchingArgs(args) {
|
|
177
|
+
return args.filter((arg) => ['--fingerprint-timezone=', '--lang=', '--fingerprint-locale='].some((prefix) => arg.startsWith(prefix)));
|
|
178
|
+
}
|
|
179
|
+
function mergeLaunchArgs(args, replacements) {
|
|
180
|
+
const replacementByKey = new Map(replacements.map((replacement) => [launchArgKey(replacement), replacement]));
|
|
181
|
+
const result = [];
|
|
182
|
+
const replacedKeys = new Set();
|
|
183
|
+
for (const arg of args) {
|
|
184
|
+
const key = launchArgKey(arg);
|
|
185
|
+
const replacement = replacementByKey.get(key);
|
|
186
|
+
if (replacement === undefined) {
|
|
187
|
+
result.push(arg);
|
|
188
|
+
}
|
|
189
|
+
else if (!replacedKeys.has(key)) {
|
|
190
|
+
result.push(replacement);
|
|
191
|
+
replacedKeys.add(key);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
for (const replacement of replacements) {
|
|
195
|
+
const key = launchArgKey(replacement);
|
|
196
|
+
if (!replacedKeys.has(key)) {
|
|
197
|
+
result.push(replacement);
|
|
198
|
+
replacedKeys.add(key);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
function findLaunchArgValue(args, name) {
|
|
204
|
+
const prefix = `${name}=`;
|
|
205
|
+
return args.find((arg) => arg.startsWith(prefix))?.slice(prefix.length);
|
|
206
|
+
}
|
|
207
|
+
function launchArgKey(arg) {
|
|
208
|
+
return arg.split('=')[0] ?? arg;
|
|
209
|
+
}
|
|
210
|
+
function optionalEnvString(env, name) {
|
|
211
|
+
const value = env[name]?.trim();
|
|
212
|
+
return value ? value : undefined;
|
|
213
|
+
}
|
|
214
|
+
export function createChildEnv(env, outputDir, runtimeProxy, headless = envBool(env, 'PLAYWRIGHT_MCP_HEADLESS', true), humanPreset = parseHumanPreset(envString(env, 'CLOAK_PLAYWRIGHT_MCP_HUMAN_PRESET', 'default'))) {
|
|
77
215
|
const result = {};
|
|
78
216
|
for (const [key, value] of Object.entries(env)) {
|
|
79
217
|
if (typeof value === 'string')
|
|
80
218
|
result[key] = value;
|
|
81
219
|
}
|
|
82
|
-
result.PLAYWRIGHT_MCP_HEADLESS =
|
|
220
|
+
result.PLAYWRIGHT_MCP_HEADLESS = String(headless);
|
|
221
|
+
result.CLOAK_PLAYWRIGHT_MCP_HUMAN_PRESET = humanPreset;
|
|
83
222
|
result.PLAYWRIGHT_MCP_OUTPUT_DIR = outputDir;
|
|
84
223
|
result.PLAYWRIGHT_MCP_OUTPUT_MODE = envString(env, 'PLAYWRIGHT_MCP_OUTPUT_MODE', 'stdout');
|
|
85
224
|
result.PLAYWRIGHT_MCP_TIMEOUT_ACTION = String(envInt(env, 'PLAYWRIGHT_MCP_TIMEOUT_ACTION', 5000));
|
|
86
225
|
result.PLAYWRIGHT_MCP_TIMEOUT_NAVIGATION = String(envInt(env, 'PLAYWRIGHT_MCP_TIMEOUT_NAVIGATION', 60000));
|
|
87
226
|
result.CLOAKBROWSER_AUTO_UPDATE = envString(env, 'CLOAKBROWSER_AUTO_UPDATE', 'false');
|
|
227
|
+
const envProxyServer = optionalEnvString(env, 'PLAYWRIGHT_MCP_PROXY_SERVER');
|
|
228
|
+
if (runtimeProxy === undefined && envProxyServer !== undefined && hasProxyCredentials(envProxyServer)) {
|
|
229
|
+
removeProxyEnv(result);
|
|
230
|
+
}
|
|
231
|
+
if (runtimeProxy)
|
|
232
|
+
applyRuntimeProxyEnv(result, runtimeProxy);
|
|
88
233
|
return result;
|
|
89
234
|
}
|
|
235
|
+
function applyRuntimeProxyEnv(env, proxy) {
|
|
236
|
+
env.PLAYWRIGHT_MCP_PROXY_SERVER = proxy.server;
|
|
237
|
+
if (proxy.bypass === undefined)
|
|
238
|
+
delete env.PLAYWRIGHT_MCP_PROXY_BYPASS;
|
|
239
|
+
else
|
|
240
|
+
env.PLAYWRIGHT_MCP_PROXY_BYPASS = proxy.bypass;
|
|
241
|
+
if (hasProxyCredentials(proxy.server))
|
|
242
|
+
removeProxyEnv(env);
|
|
243
|
+
}
|
|
244
|
+
function removeProxyEnv(env) {
|
|
245
|
+
delete env.PLAYWRIGHT_MCP_PROXY_SERVER;
|
|
246
|
+
delete env.PLAYWRIGHT_MCP_PROXY_BYPASS;
|
|
247
|
+
}
|
|
90
248
|
export function getCurrentCloakBinaryInfo() {
|
|
91
249
|
return binaryInfo();
|
|
92
250
|
}
|
|
@@ -97,13 +255,29 @@ function parseBrowserEngine(value) {
|
|
|
97
255
|
}
|
|
98
256
|
async function suppressStdout(fn) {
|
|
99
257
|
const stdout = process.stdout;
|
|
100
|
-
|
|
101
|
-
|
|
258
|
+
if (stdoutSuppressionDepth === 0) {
|
|
259
|
+
suppressedStdoutWrite = Reflect.get(stdout, 'write');
|
|
260
|
+
process.stdout.write = suppressedProcessStdoutWrite;
|
|
261
|
+
}
|
|
262
|
+
stdoutSuppressionDepth += 1;
|
|
102
263
|
try {
|
|
103
264
|
return await fn();
|
|
104
265
|
}
|
|
105
266
|
finally {
|
|
106
|
-
|
|
267
|
+
stdoutSuppressionDepth -= 1;
|
|
268
|
+
if (stdoutSuppressionDepth === 0) {
|
|
269
|
+
const write = suppressedStdoutWrite;
|
|
270
|
+
suppressedStdoutWrite = undefined;
|
|
271
|
+
if (write)
|
|
272
|
+
process.stdout.write = write;
|
|
273
|
+
}
|
|
107
274
|
}
|
|
108
275
|
}
|
|
276
|
+
let stdoutSuppressionDepth = 0;
|
|
277
|
+
let suppressedStdoutWrite;
|
|
278
|
+
function suppressedProcessStdoutWrite(_chunk, encodingOrCallback, callback) {
|
|
279
|
+
const writeCallback = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;
|
|
280
|
+
writeCallback?.();
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
109
283
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/bridge/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/bridge/config.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/options.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { type HumanPreset } from '#src/bridge/config';
|
|
2
3
|
import { type BridgeTransportMode, type CliOptions, type HttpProtocol, type HttpSessionBackend } from '#src/http/options';
|
|
3
4
|
export declare const cliDescription = "Playwright MCP bridge backed by CloakBrowser.";
|
|
4
5
|
interface CommanderCliOptions {
|
|
5
6
|
transport: BridgeTransportMode;
|
|
7
|
+
geoipProxyMatch: boolean;
|
|
8
|
+
humanize: boolean;
|
|
9
|
+
humanPreset: HumanPreset;
|
|
6
10
|
httpProtocol: HttpProtocol;
|
|
7
11
|
httpHost: string;
|
|
8
12
|
httpPort: number;
|
|
@@ -22,7 +26,7 @@ interface DoctorCliOptions {
|
|
|
22
26
|
interface CreateCliCommandOptions {
|
|
23
27
|
doctorAction?: (options: DoctorCliOptions) => Promise<void> | void;
|
|
24
28
|
}
|
|
25
|
-
type CliOptionValue = string | number;
|
|
29
|
+
type CliOptionValue = string | number | boolean;
|
|
26
30
|
interface CliOptionDefinition {
|
|
27
31
|
name: keyof CommanderCliOptions;
|
|
28
32
|
flags: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgC,MAAM,WAAW,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgC,MAAM,WAAW,CAAC;AAClE,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAUL,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAExB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,cAAc,kDAAkD,CAAC;AAE9E,UAAU,mBAAmB;IAC3B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,uBAAuB;IAC/B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpE;AAED,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,mBAAmB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,cAAc,CAAC;CAC5C;AAED,eAAO,MAAM,oBAAoB,EAAE,SAAS,mBAAmB,EA0I9D,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAiBhG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CASnE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAE3D;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwBlE"}
|
package/dist/cli/options.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command, InvalidArgumentError, Option } from 'commander';
|
|
2
|
-
import {
|
|
2
|
+
import { humanPresets } from '#src/bridge/config';
|
|
3
|
+
import { BRIDGE_TRANSPORT_STDIO, HEALTHZ_PATH, HTTP_PROTOCOL_HTTP, READYZ_PATH, bridgeTransportModes, defaultStreamableHttpOptions, defaultBridgeOptions, httpProtocols, httpSessionBackends, } from '#src/http/options';
|
|
3
4
|
export const cliDescription = 'Playwright MCP bridge backed by CloakBrowser.';
|
|
4
5
|
export const cliOptionDefinitions = [
|
|
5
6
|
{
|
|
@@ -11,6 +12,31 @@ export const cliOptionDefinitions = [
|
|
|
11
12
|
defaultValue: BRIDGE_TRANSPORT_STDIO,
|
|
12
13
|
choices: bridgeTransportModes,
|
|
13
14
|
},
|
|
15
|
+
{
|
|
16
|
+
name: 'geoipProxyMatch',
|
|
17
|
+
flags: '--geoip-proxy-match',
|
|
18
|
+
description: 'Match CloakBrowser timezone and locale to the configured proxy GeoIP.',
|
|
19
|
+
env: 'CLOAK_PLAYWRIGHT_MCP_GEOIP_PROXY_MATCH',
|
|
20
|
+
group: 'Bridge',
|
|
21
|
+
defaultValue: defaultBridgeOptions.geoipProxyMatch,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'humanize',
|
|
25
|
+
flags: '--humanize',
|
|
26
|
+
description: 'Enable CloakBrowser human-like mouse, keyboard, and scroll behavior.',
|
|
27
|
+
env: 'CLOAK_PLAYWRIGHT_MCP_HUMANIZE',
|
|
28
|
+
group: 'Bridge',
|
|
29
|
+
defaultValue: defaultBridgeOptions.humanize,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'humanPreset',
|
|
33
|
+
flags: '--human-preset <preset>',
|
|
34
|
+
description: 'CloakBrowser human behavior preset. Used only when humanize is enabled.',
|
|
35
|
+
env: 'CLOAK_PLAYWRIGHT_MCP_HUMAN_PRESET',
|
|
36
|
+
group: 'Bridge',
|
|
37
|
+
defaultValue: defaultBridgeOptions.humanPreset,
|
|
38
|
+
choices: humanPresets,
|
|
39
|
+
},
|
|
14
40
|
{
|
|
15
41
|
name: 'httpProtocol',
|
|
16
42
|
flags: '--http-protocol <protocol>',
|
|
@@ -200,6 +226,11 @@ function toCliOptions(options) {
|
|
|
200
226
|
validateHttpProtocolOptions(options.httpProtocol, tls);
|
|
201
227
|
return {
|
|
202
228
|
transport: options.transport,
|
|
229
|
+
bridge: {
|
|
230
|
+
geoipProxyMatch: normalizeBoolean(options.geoipProxyMatch),
|
|
231
|
+
humanize: normalizeBoolean(options.humanize),
|
|
232
|
+
humanPreset: options.humanPreset,
|
|
233
|
+
},
|
|
203
234
|
http: {
|
|
204
235
|
protocol: options.httpProtocol,
|
|
205
236
|
host: options.httpHost,
|
|
@@ -214,6 +245,13 @@ function toCliOptions(options) {
|
|
|
214
245
|
},
|
|
215
246
|
};
|
|
216
247
|
}
|
|
248
|
+
function normalizeBoolean(value) {
|
|
249
|
+
if (typeof value === 'boolean')
|
|
250
|
+
return value;
|
|
251
|
+
if (value === undefined)
|
|
252
|
+
return false;
|
|
253
|
+
return ['1', 'true', 'yes', 'on'].includes(value.toLowerCase());
|
|
254
|
+
}
|
|
217
255
|
function normalizeTlsOptions(options) {
|
|
218
256
|
return {
|
|
219
257
|
cert: optionalString(options.httpsCert),
|
package/dist/cli/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACpB,4BAA4B,EAC5B,aAAa,EACb,mBAAmB,GAMpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,cAAc,GAAG,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the platform-specific Playwright MCP cache directory.
|
|
3
|
+
* Exported for testability — the win32 branch uses env vars that
|
|
4
|
+
* cannot be exercised cleanly on POSIX CI hosts.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getCacheDir(platform: NodeJS.Platform): string;
|
|
7
|
+
/**
|
|
8
|
+
* Reads the owning PID from a `SingletonLock` entry, handling both POSIX
|
|
9
|
+
* symlink targets and Windows plain-file content. Returns `null` when the
|
|
10
|
+
* lock is missing, unreadable, or has no valid positive PID.
|
|
11
|
+
* Exported for testability.
|
|
12
|
+
*/
|
|
13
|
+
export declare function readLockPid(lockPath: string, platform: NodeJS.Platform): number | null;
|
|
14
|
+
/** Options accepted by {@link cleanStaleSingletonLocks}. */
|
|
15
|
+
export interface CleanStaleSingletonLocksOptions {
|
|
16
|
+
/** Override the cache directory (used by tests). */
|
|
17
|
+
readonly cacheDir?: string;
|
|
18
|
+
/** Override the platform identifier (used by tests). */
|
|
19
|
+
readonly platform?: NodeJS.Platform;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Iterates every `mcp-chromium-*` profile directory under the platform cache
|
|
23
|
+
* directory and removes the `SingletonLock` / `SingletonCookie` /
|
|
24
|
+
* `SingletonSocket` files whose owning PID is no longer alive.
|
|
25
|
+
*
|
|
26
|
+
* Safety guarantees:
|
|
27
|
+
* - Skips the cache directory silently if it does not exist.
|
|
28
|
+
* - Skips entries whose lock file is missing or unreadable.
|
|
29
|
+
* - Skips entries whose owning PID is still alive.
|
|
30
|
+
* - Skips entries whose PID status is indeterminate (EPERM, etc.).
|
|
31
|
+
* - Skips entries with malformed PID values (negative, zero, non-integer).
|
|
32
|
+
*/
|
|
33
|
+
export declare function cleanStaleSingletonLocks(options?: CleanStaleSingletonLocksOptions): void;
|
|
34
|
+
//# sourceMappingURL=singleton-lock-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton-lock-cleanup.d.ts","sourceRoot":"","sources":["../../src/cli/singleton-lock-cleanup.ts"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAiB7D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI,CAuBtF;AAwBD,4DAA4D;AAC5D,MAAM,WAAW,+BAA+B;IAC9C,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,+BAAoC,GAAG,IAAI,CAyB5F"}
|