pi-browser-use 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 0xPlayerOne
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # pi-browser-use
2
+
3
+ Opinionated browser-use for the [Pi coding agent](https://pi.dev), powered by [`chrome-devtools-mcp`](https://github.com/ChromeDevTools/chrome-devtools-mcp) — not Playwright.
4
+
5
+ ## Why this exists
6
+
7
+ - **Fresh headless by default** — isolated ephemeral profile, no window, never steals focus.
8
+ - **Authenticated profile opt-in** — `sessionMode: persistent` persists `~/.pi/browser-profile` (log in once).
9
+ - **CLI-first policy bundled** — `skills/browser-policy` tells agents to prefer `gh` / `wrangler` / APIs and web fetching before driving the browser.
10
+ - **Safer proxying** — `browser_`-prefixed tools, noisy/privileged tools excluded, sensitive network headers redacted.
11
+
12
+ Not affiliated with `@amaster.ai/pi-browser-use` or `@narumitw/pi-chrome-devtools`.
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ pi install npm:pi-browser-use
18
+ ```
19
+
20
+ Requires Node.js `^20.19.0 || ^22.12.0 || >=23` and Chrome stable or newer.
21
+
22
+ ## Configure
23
+
24
+ Settings key is `pi-browser-use` in `~/.pi/agent/settings.json` (user) or `.pi/settings.json` (trusted project, wins):
25
+
26
+ ```json
27
+ {
28
+ "pi-browser-use": {
29
+ "sessionMode": "isolated",
30
+ "headless": true
31
+ }
32
+ }
33
+ ```
34
+
35
+ | Mode | Config | Behavior |
36
+ | --------------- | --------------------------------------- | ------------------------------------------------------ |
37
+ | Fresh (default) | `isolated` + `headless: true` | Ephemeral profile, no window |
38
+ | Authenticated | `sessionMode: persistent` | Shared profile, log in once, headed windows pop |
39
+ | Existing | `sessionMode: existing` + `autoConnect` | Drives your daily Chrome — intrusive, avoid by default |
40
+
41
+ First-class `chromeArgs` (forwarded as `--chrome-arg=`) only apply when `chrome-devtools-mcp` launches Chrome itself — never with `autoConnect`/`browserUrl`. On macOS `--start-minimized` is ignored; only `headless: true` truly hides the window. Raw `extraArgs` are forwarded verbatim as an escape hatch.
42
+
43
+ Hosts where `process.execPath` is not a directly executable Node runtime can set `PI_BROWSER_USE_NODE` to the Node command used for the MCP subprocess.
44
+
45
+ ## Page-scoped tools
46
+
47
+ Call `browser_list_pages` first, then pass its numeric `pageId` to page-scoped tools. See `skills/browser-policy/SKILL.md` for the full agent policy.
48
+
49
+ ## Vision model (optional)
50
+
51
+ Enable `browser_analyze_screenshot` by referencing a model already configured in Pi's model registry. The extension resolves credentials from the registry automatically:
52
+
53
+ ```json
54
+ {
55
+ "pi-browser-use": {
56
+ "visionModel": { "provider": "openai", "model": "gpt-4o" }
57
+ }
58
+ }
59
+ ```
60
+
61
+ Use it for canvas/WebGL scenes or coordinate clicks the accessibility tree cannot describe. Without `visionModel` the tool is not registered.
62
+
63
+ ## Browser profile
64
+
65
+ On startup the default persistent profile is checked for accessibility. A root-owned or unreadable default (typically from running under `sudo`) is moved aside to `~/.pi/browser-profile.inaccessible-<timestamp>` so Chrome starts fresh instead of showing a preferences dialog. An explicit custom `userDataDir` in the same state fails fast with an ownership remediation hint. Never run the agent (or anything launching this browser) via `sudo`.
66
+
67
+ ## License
68
+
69
+ MIT
@@ -0,0 +1,29 @@
1
+ import { type BrowserUseConfig } from './config.js';
2
+ /**
3
+ * MCP client that spawns chrome-devtools-mcp as a per-session subprocess over
4
+ * stdio. Nothing runs persistently: connect() starts it, close() kills it.
5
+ */
6
+ export declare class DevToolsClient {
7
+ private client;
8
+ private config;
9
+ private state;
10
+ private connectPromise;
11
+ private generation;
12
+ private hasConnected;
13
+ private explicitlyClosed;
14
+ private lastHealthCheckAt;
15
+ constructor(config: BrowserUseConfig);
16
+ connect(signal?: AbortSignal): Promise<void>;
17
+ private openConnection;
18
+ private markDisconnected;
19
+ private disconnectUnhealthyClient;
20
+ ensureReady(signal?: AbortSignal): Promise<void>;
21
+ listAllTools(signal?: AbortSignal): Promise<Array<{
22
+ name: string;
23
+ description?: string;
24
+ inputSchema: unknown;
25
+ }>>;
26
+ callTool(name: string, args: unknown, signal?: AbortSignal): Promise<unknown>;
27
+ close(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,EAA+B,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AA6ChF;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CACG;IAChB,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,iBAAiB,CAAI;gBAEjB,MAAM,EAAE,gBAAgB;IAI9B,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAYpC,cAAc;IAyD5B,OAAO,CAAC,gBAAgB;YAOV,yBAAyB;IAYjC,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhD,YAAY,CAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAsBzE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B"}
package/dist/client.js ADDED
@@ -0,0 +1,222 @@
1
+ import { createRequire } from 'node:module';
2
+ import { dirname, join } from 'node:path';
3
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
5
+ import { configToArgs, resolveConfig } from './config.js';
6
+ const MCP_TIMEOUT_MS = 60_000;
7
+ const MCP_HEALTH_TIMEOUT_MS = 5_000;
8
+ const MCP_HEALTH_CHECK_INTERVAL_MS = 10_000;
9
+ const MCP_STDERR_LIMIT = 4_096;
10
+ const MCP_SYSTEM_ERROR_CODE_PATTERN = /^(?:EACCES|EADDRINUSE|ECONNREFUSED|ECONNRESET|EHOSTUNREACH|ENOENT|ENOTEMPTY|ENOTFOUND|EPERM|ETIMEDOUT)$/;
11
+ const require = createRequire(import.meta.url);
12
+ const chromeDevToolsMcpPackagePath = require.resolve('chrome-devtools-mcp/package.json');
13
+ // oxlint-disable-next-line no-unsafe-read -- package.json of a pinned dependency
14
+ const chromeDevToolsMcpPackage = require(chromeDevToolsMcpPackagePath);
15
+ const chromeDevToolsMcpBin = chromeDevToolsMcpPackage.bin?.['chrome-devtools-mcp'];
16
+ if (!chromeDevToolsMcpBin) {
17
+ throw new Error('chrome-devtools-mcp package does not declare its chrome-devtools-mcp binary');
18
+ }
19
+ const CHROME_DEVTOOLS_MCP_ENTRYPOINT = join(dirname(chromeDevToolsMcpPackagePath), chromeDevToolsMcpBin);
20
+ function safeSystemErrorCode(value) {
21
+ return typeof value === 'string' && MCP_SYSTEM_ERROR_CODE_PATTERN.test(value) ? value : undefined;
22
+ }
23
+ function summarizeFailure(stderr, errorName, errorCode) {
24
+ const systemError = safeSystemErrorCode(errorCode) ??
25
+ stderr.match(/\b(EACCES|EADDRINUSE|ECONNREFUSED|ECONNRESET|EHOSTUNREACH|ENOENT|ENOTEMPTY|ENOTFOUND|EPERM|ETIMEDOUT)\b/)?.[1];
26
+ if (systemError)
27
+ return `MCP subprocess failed (${systemError}).`;
28
+ if (/could not find (?:chrome|browser)/i.test(stderr))
29
+ return 'Chrome executable was not found.';
30
+ if (/failed to launch (?:the )?(?:browser|chrome)/i.test(stderr))
31
+ return 'Chrome failed to launch.';
32
+ if (/(?:browser|chrome).+already running|profile.+in use/i.test(stderr)) {
33
+ return 'Chrome profile is already in use.';
34
+ }
35
+ const safeName = /^[A-Za-z][A-Za-z0-9]{0,63}$/.test(errorName) ? errorName : 'UnknownError';
36
+ return `MCP transport failed (${safeName}).`;
37
+ }
38
+ /**
39
+ * MCP client that spawns chrome-devtools-mcp as a per-session subprocess over
40
+ * stdio. Nothing runs persistently: connect() starts it, close() kills it.
41
+ */
42
+ export class DevToolsClient {
43
+ client = null;
44
+ config;
45
+ state = 'disconnected';
46
+ connectPromise = null;
47
+ generation = 0;
48
+ hasConnected = false;
49
+ explicitlyClosed = false;
50
+ lastHealthCheckAt = 0;
51
+ constructor(config) {
52
+ this.config = resolveConfig(config);
53
+ }
54
+ async connect(signal) {
55
+ if (this.state === 'ready')
56
+ return;
57
+ if (this.connectPromise)
58
+ return this.connectPromise;
59
+ this.explicitlyClosed = false;
60
+ this.connectPromise = this.openConnection(signal);
61
+ try {
62
+ await this.connectPromise;
63
+ }
64
+ finally {
65
+ this.connectPromise = null;
66
+ }
67
+ }
68
+ async openConnection(signal) {
69
+ this.state = this.hasConnected ? 'reconnecting' : 'connecting';
70
+ const args = configToArgs(this.config);
71
+ const generation = ++this.generation;
72
+ const transport = new StdioClientTransport({
73
+ command: process.env.PI_BROWSER_USE_NODE?.trim() || process.execPath,
74
+ args: [CHROME_DEVTOOLS_MCP_ENTRYPOINT, ...args],
75
+ stderr: 'pipe',
76
+ });
77
+ let stderr = '';
78
+ let transportErrorCode;
79
+ transport.stderr?.on('data', (chunk) => {
80
+ stderr = `${stderr}${String(chunk)}`.slice(-MCP_STDERR_LIMIT);
81
+ });
82
+ const client = new Client({ name: 'pi-browser-use', version: '0.1.0' }, { capabilities: {} });
83
+ this.client = client;
84
+ transport.onerror = (error) => {
85
+ if (generation !== this.generation)
86
+ return;
87
+ transportErrorCode = safeSystemErrorCode(error.code);
88
+ console.error(`[pi-browser-use] chrome-devtools-mcp transport error (${transportErrorCode ?? error.name})`);
89
+ void this.disconnectUnhealthyClient(generation);
90
+ };
91
+ transport.onclose = () => this.markDisconnected(generation);
92
+ try {
93
+ await client.connect(transport, signal ? { signal, timeout: MCP_TIMEOUT_MS } : { timeout: MCP_TIMEOUT_MS });
94
+ if (generation !== this.generation)
95
+ return;
96
+ this.state = 'ready';
97
+ this.hasConnected = true;
98
+ this.lastHealthCheckAt = Date.now();
99
+ }
100
+ catch (error) {
101
+ if (generation === this.generation) {
102
+ ++this.generation;
103
+ this.client = null;
104
+ this.state = 'failed';
105
+ }
106
+ try {
107
+ await client.close();
108
+ }
109
+ catch {
110
+ // The failed transport may already be closed.
111
+ }
112
+ if (signal?.aborted)
113
+ throw error;
114
+ const errorName = error instanceof Error ? error.name : 'UnknownError';
115
+ const errorCode = error instanceof Error
116
+ ? safeSystemErrorCode(error.code)
117
+ : undefined;
118
+ const diagnostic = summarizeFailure(stderr, errorName, transportErrorCode ?? errorCode);
119
+ console.error(`[pi-browser-use] browser connection failed: ${diagnostic}`);
120
+ throw new Error(`Browser connection failed. ${diagnostic}`);
121
+ }
122
+ }
123
+ markDisconnected(generation) {
124
+ if (generation !== this.generation || this.state === 'closing')
125
+ return;
126
+ ++this.generation;
127
+ this.client = null;
128
+ this.state = 'disconnected';
129
+ }
130
+ async disconnectUnhealthyClient(generation) {
131
+ if (generation !== this.generation || this.state === 'closing')
132
+ return;
133
+ const failedClient = this.client;
134
+ this.markDisconnected(generation);
135
+ if (!failedClient)
136
+ return;
137
+ try {
138
+ await failedClient.close();
139
+ }
140
+ catch {
141
+ console.error('[pi-browser-use] failed to close unhealthy MCP client');
142
+ }
143
+ }
144
+ async ensureReady(signal) {
145
+ if (this.explicitlyClosed)
146
+ throw new Error('Client not connected');
147
+ if (this.state === 'ready') {
148
+ if (Date.now() - this.lastHealthCheckAt < MCP_HEALTH_CHECK_INTERVAL_MS)
149
+ return;
150
+ const generation = this.generation;
151
+ try {
152
+ await this.client?.ping({ timeout: MCP_HEALTH_TIMEOUT_MS });
153
+ if (generation !== this.generation)
154
+ return;
155
+ this.lastHealthCheckAt = Date.now();
156
+ return;
157
+ }
158
+ catch (error) {
159
+ if (signal?.aborted)
160
+ throw error;
161
+ await this.disconnectUnhealthyClient(generation);
162
+ }
163
+ }
164
+ await this.connect(signal);
165
+ }
166
+ async listAllTools(signal) {
167
+ await this.ensureReady(signal);
168
+ const client = this.client;
169
+ if (!client)
170
+ throw new Error('Client not connected');
171
+ const allTools = [];
172
+ let cursor;
173
+ do {
174
+ const result = await client.listTools(cursor ? { cursor } : undefined, {
175
+ timeout: MCP_TIMEOUT_MS,
176
+ });
177
+ allTools.push(...result.tools.map((t) => ({
178
+ name: t.name,
179
+ description: t.description,
180
+ inputSchema: t.inputSchema,
181
+ })));
182
+ cursor = result.nextCursor;
183
+ } while (cursor);
184
+ return allTools;
185
+ }
186
+ async callTool(name, args, signal) {
187
+ await this.ensureReady(signal);
188
+ const client = this.client;
189
+ if (!client)
190
+ throw new Error('Client not connected');
191
+ try {
192
+ return await client.callTool({ name, arguments: args }, undefined, { timeout: MCP_TIMEOUT_MS });
193
+ }
194
+ catch (error) {
195
+ if (signal?.aborted)
196
+ throw error;
197
+ if (this.state !== 'ready' || this.client !== client) {
198
+ throw new Error('Browser connection lost; retry the tool.');
199
+ }
200
+ const errorName = error instanceof Error ? error.name : 'UnknownError';
201
+ console.error(`[pi-browser-use] upstream tool call failed (${errorName})`);
202
+ throw new Error('Browser tool call failed.');
203
+ }
204
+ }
205
+ async close() {
206
+ if (this.explicitlyClosed)
207
+ return;
208
+ this.explicitlyClosed = true;
209
+ this.state = 'closing';
210
+ const client = this.client;
211
+ ++this.generation;
212
+ this.client = null;
213
+ try {
214
+ if (client)
215
+ await client.close();
216
+ }
217
+ finally {
218
+ this.state = 'disconnected';
219
+ }
220
+ }
221
+ }
222
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export declare const DEFAULT_PROFILE_DIR: string;
2
+ export type BrowserSessionMode = 'persistent' | 'isolated' | 'existing';
3
+ /** Vision model used by the optional analyze_screenshot tool. Must already exist in Pi's model registry. */
4
+ export interface VisionModelConfig {
5
+ provider: string;
6
+ model: string;
7
+ }
8
+ /** Configuration for the chrome-devtools-mcp subprocess. Same settings key as before: "pi-browser-use". */
9
+ export interface BrowserUseConfig {
10
+ sessionMode?: BrowserSessionMode;
11
+ headless?: boolean;
12
+ channel?: 'canary' | 'dev' | 'beta' | 'stable';
13
+ browserUrl?: string;
14
+ wsEndpoint?: string;
15
+ wsHeaders?: string;
16
+ executablePath?: string;
17
+ viewport?: string;
18
+ isolated?: boolean;
19
+ userDataDir?: string;
20
+ autoConnect?: boolean;
21
+ categoryPerformance?: boolean;
22
+ categoryNetwork?: boolean;
23
+ categoryEmulation?: boolean;
24
+ categoryExtensions?: boolean;
25
+ experimentalVision?: boolean;
26
+ experimentalScreencast?: boolean;
27
+ experimentalMemory?: boolean;
28
+ experimentalPageIdRouting?: boolean;
29
+ visionModel?: VisionModelConfig;
30
+ usageStatistics?: boolean;
31
+ performanceCrux?: boolean;
32
+ redactNetworkHeaders?: boolean;
33
+ acceptInsecureCerts?: boolean;
34
+ allowedUrlPattern?: string[];
35
+ blockedUrlPattern?: string[];
36
+ slim?: boolean;
37
+ /** First-class Chrome flags, forwarded as --chrome-arg=<flag>. Only applies when Chrome is launched by chrome-devtools-mcp (not with autoConnect/browserUrl). */
38
+ chromeArgs?: string[];
39
+ /** Raw escape hatch: extra CLI flags forwarded verbatim to chrome-devtools-mcp. */
40
+ extraArgs?: string[];
41
+ }
42
+ /** Merge user config over fresh-headless defaults. */
43
+ export declare function resolveConfig(config?: BrowserUseConfig): BrowserUseConfig;
44
+ /** Convert config into CLI flags for the chrome-devtools-mcp subprocess. */
45
+ export declare function configToArgs(config: BrowserUseConfig): string[];
46
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,QAA4C,CAAA;AAE5E,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,CAAA;AAEvE,4GAA4G;AAC5G,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,2GAA2G;AAC3G,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iKAAiK;IACjK,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAyBD,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CA6BzE;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAqC/D"}
package/dist/config.js ADDED
@@ -0,0 +1,120 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ export const DEFAULT_PROFILE_DIR = join(homedir(), '.pi', 'browser-profile');
4
+ /**
5
+ * Fresh headless by default: isolated ephemeral profile, no window, never
6
+ * steals focus. Set sessionMode "persistent" for the authenticated profile
7
+ * (log in once, cookies persist), or "existing" + autoConnect to drive your
8
+ * daily Chrome (intrusive: windows pop and steal focus).
9
+ */
10
+ const DEFAULTS = {
11
+ sessionMode: 'isolated',
12
+ headless: true,
13
+ categoryPerformance: false,
14
+ categoryNetwork: true,
15
+ categoryEmulation: true,
16
+ categoryExtensions: false,
17
+ experimentalVision: true,
18
+ experimentalScreencast: false,
19
+ experimentalMemory: false,
20
+ experimentalPageIdRouting: true,
21
+ usageStatistics: false,
22
+ performanceCrux: false,
23
+ redactNetworkHeaders: true,
24
+ acceptInsecureCerts: false,
25
+ };
26
+ /** Merge user config over fresh-headless defaults. */
27
+ export function resolveConfig(config) {
28
+ const resolved = { ...DEFAULTS, ...config };
29
+ if (resolved.allowedUrlPattern?.length && resolved.blockedUrlPattern?.length) {
30
+ throw new Error('allowedUrlPattern and blockedUrlPattern cannot be used together');
31
+ }
32
+ if (resolved.slim) {
33
+ if (config?.experimentalPageIdRouting === true) {
34
+ throw new Error('experimentalPageIdRouting cannot be used with slim mode');
35
+ }
36
+ resolved.experimentalPageIdRouting = false;
37
+ }
38
+ switch (resolved.sessionMode) {
39
+ case 'existing':
40
+ if (!resolved.autoConnect && !resolved.browserUrl && !resolved.wsEndpoint) {
41
+ resolved.autoConnect = true;
42
+ }
43
+ break;
44
+ case 'isolated':
45
+ if (!resolved.isolated) {
46
+ resolved.isolated = true;
47
+ }
48
+ break;
49
+ default:
50
+ if (!resolved.userDataDir && !resolved.browserUrl && !resolved.wsEndpoint) {
51
+ resolved.userDataDir = DEFAULT_PROFILE_DIR;
52
+ }
53
+ break;
54
+ }
55
+ return resolved;
56
+ }
57
+ /** Convert config into CLI flags for the chrome-devtools-mcp subprocess. */
58
+ export function configToArgs(config) {
59
+ const args = [];
60
+ const resolved = resolveConfig(config);
61
+ if (resolved.headless)
62
+ args.push('--headless');
63
+ if (resolved.channel)
64
+ args.push(`--channel=${resolved.channel}`);
65
+ if (resolved.browserUrl)
66
+ args.push(`--browser-url=${resolved.browserUrl}`);
67
+ if (resolved.wsEndpoint)
68
+ args.push(`--ws-endpoint=${resolved.wsEndpoint}`);
69
+ if (resolved.wsHeaders)
70
+ args.push(`--ws-headers=${resolved.wsHeaders}`);
71
+ if (resolved.executablePath)
72
+ args.push(`--executable-path=${resolved.executablePath}`);
73
+ if (resolved.viewport)
74
+ args.push(`--viewport=${resolved.viewport}`);
75
+ if (resolved.isolated)
76
+ args.push('--isolated');
77
+ if (resolved.userDataDir)
78
+ args.push(`--user-data-dir=${resolved.userDataDir}`);
79
+ if (resolved.autoConnect)
80
+ args.push('--auto-connect');
81
+ if (resolved.slim)
82
+ args.push('--slim');
83
+ if (resolved.categoryPerformance === false)
84
+ args.push('--category-performance=false');
85
+ if (resolved.categoryNetwork === false)
86
+ args.push('--category-network=false');
87
+ if (resolved.categoryEmulation === false)
88
+ args.push('--category-emulation=false');
89
+ if (resolved.categoryExtensions === true)
90
+ args.push('--category-extensions=true');
91
+ if (resolved.experimentalVision)
92
+ args.push('--experimental-vision');
93
+ if (resolved.experimentalScreencast)
94
+ args.push('--experimental-screencast');
95
+ if (resolved.experimentalMemory)
96
+ args.push('--experimental-memory');
97
+ if (resolved.experimentalPageIdRouting)
98
+ args.push('--experimental-page-id-routing');
99
+ if (resolved.usageStatistics === false)
100
+ args.push('--no-usage-statistics');
101
+ if (resolved.performanceCrux === false)
102
+ args.push('--no-performance-crux');
103
+ if (resolved.redactNetworkHeaders)
104
+ args.push('--redact-network-headers');
105
+ if (resolved.acceptInsecureCerts)
106
+ args.push('--accept-insecure-certs');
107
+ for (const pattern of resolved.allowedUrlPattern ?? []) {
108
+ args.push(`--allowed-url-pattern=${pattern}`);
109
+ }
110
+ for (const pattern of resolved.blockedUrlPattern ?? []) {
111
+ args.push(`--blocked-url-pattern=${pattern}`);
112
+ }
113
+ for (const flag of resolved.chromeArgs ?? []) {
114
+ args.push(`--chrome-arg=${flag}`);
115
+ }
116
+ if (resolved.extraArgs)
117
+ args.push(...resolved.extraArgs);
118
+ return args;
119
+ }
120
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export { configToArgs, resolveConfig } from './config.js';
2
+ interface ModelRegistry {
3
+ find(provider: string, modelId: string): unknown;
4
+ getApiKeyAndHeaders(model: unknown): Promise<{
5
+ ok: true;
6
+ apiKey?: string;
7
+ headers?: Record<string, string>;
8
+ } | {
9
+ ok: false;
10
+ error: string;
11
+ }>;
12
+ }
13
+ interface PiToolContext {
14
+ modelRegistry?: ModelRegistry;
15
+ }
16
+ interface Pi {
17
+ registerTool(def: {
18
+ name: string;
19
+ label: string;
20
+ description: string;
21
+ parameters: unknown;
22
+ execute: (toolCallId: string, params: Record<string, unknown>, signal?: AbortSignal, onUpdate?: unknown, ctx?: PiToolContext) => Promise<{
23
+ content: Array<{
24
+ type: string;
25
+ text?: string;
26
+ data?: string;
27
+ mimeType?: string;
28
+ }>;
29
+ isError?: boolean;
30
+ details?: undefined;
31
+ }>;
32
+ }): void;
33
+ on(event: string, handler: (event: unknown, ctx: {
34
+ cwd: string;
35
+ } & Record<string, unknown>) => Promise<void>): void;
36
+ }
37
+ /**
38
+ * Pi extension entry point. On session_start spawns chrome-devtools-mcp,
39
+ * discovers upstream tools, and registers each as browser_*. On
40
+ * session_shutdown tears the subprocess down. Nothing runs persistently.
41
+ *
42
+ * Defaults are fresh headless (isolated ephemeral profile, no window). Set
43
+ * sessionMode "persistent" for the authenticated profile, or "existing" with
44
+ * autoConnect/browserUrl to drive an already-running Chrome.
45
+ */
46
+ export default function browserUseExtension(pi: Pi): void;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAoBzD,UAAU,aAAa;IACrB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IAChD,mBAAmB,CACjB,KAAK,EAAE,OAAO,GACb,OAAO,CACR;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAC/F,CAAA;CACF;AAED,UAAU,aAAa;IACrB,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,UAAU,EAAE;IACV,YAAY,CAAC,GAAG,EAAE;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,OAAO,CAAA;QACnB,OAAO,EAAE,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,aAAa,KAChB,OAAO,CAAC;YACX,OAAO,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;YACjF,OAAO,CAAC,EAAE,OAAO,CAAA;YACjB,OAAO,CAAC,EAAE,SAAS,CAAA;SACpB,CAAC,CAAA;KACH,GAAG,IAAI,CAAA;IACR,EAAE,CACA,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GACzF,IAAI,CAAA;CACR;AA8BD;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,EAAE,EAAE,QAyFjD"}