@jobshimo/browser-link 0.25.0 → 0.25.2
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/agent-instructions/content.js +11 -3
- package/dist/agent-instructions/content.js.map +1 -1
- package/dist/commands/self-update.d.ts +27 -1
- package/dist/commands/self-update.js +138 -13
- package/dist/commands/self-update.js.map +1 -1
- package/dist/commands/updates.d.ts +1 -0
- package/dist/commands/updates.js +1 -1
- package/dist/commands/updates.js.map +1 -1
- package/dist/extension/manifest.json +1 -1
- package/package.json +1 -1
|
@@ -194,10 +194,18 @@ function body() {
|
|
|
194
194
|
' max_iterations: 200, while_found: ".row", delay_ms: 250 } }',
|
|
195
195
|
'```',
|
|
196
196
|
'',
|
|
197
|
-
'-
|
|
198
|
-
'
|
|
199
|
-
'
|
|
197
|
+
'- Every click stays trusted CDP input with the occlusion guard and a',
|
|
198
|
+
' recovery snapshot, and you get a per-iteration record. An',
|
|
199
|
+
' `evaluate` loop has NONE of that — `el.click()` is',
|
|
200
200
|
' `isTrusted:false`, nothing hit-tests, nothing is recorded.',
|
|
201
|
+
'- Budget reality, so you size it right the first time:',
|
|
202
|
+
' `2000 + max_iterations * (inner + delay_ms + 500 if while_found)',
|
|
203
|
+
' <= 60000`. A click costs 2500ms with default settle, 500ms with',
|
|
204
|
+
' `settle_ms: 0`. So a throttled drain loop fits ~46 iterations per',
|
|
205
|
+
' call; SET `settle_ms: 0` on the inner click or you only get ~23.',
|
|
206
|
+
' Draining a long list means several calls — that is expected, and',
|
|
207
|
+
' each call resumes where the last stopped while `while_found` still',
|
|
208
|
+
' matches. The win here is safety, not fewer round trips.',
|
|
201
209
|
'- `max_iterations` is REQUIRED and repeats do NOT nest. Inner steps',
|
|
202
210
|
' count against the same 20-step ceiling. If the projected budget',
|
|
203
211
|
' exceeds 60s the flow is rejected up front — lower `max_iterations`',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/agent-instructions/content.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/agent-instructions/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,24 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { spawn } from 'node:child_process';
|
|
22
22
|
import type { Language } from './welcome.js';
|
|
23
|
+
export declare function isSafeUpdateTarget(target: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Locate npm's own CLI entrypoint so the install can run as
|
|
26
|
+
* `node npm-cli.js install -g …` instead of going through a shim.
|
|
27
|
+
*
|
|
28
|
+
* This is the preferred path on EVERY platform because it removes the
|
|
29
|
+
* whole problem class rather than working around it: no `.cmd` shim, so
|
|
30
|
+
* no Windows EINVAL; no shell, so no argument concatenation and no
|
|
31
|
+
* DEP0190 deprecation warning printed at the user mid-update; and one
|
|
32
|
+
* identical code path on macOS, Linux and Windows.
|
|
33
|
+
*
|
|
34
|
+
* npm ships inside the Node distribution, so it sits next to the running
|
|
35
|
+
* `node` binary in every standard install (official installer, nvm,
|
|
36
|
+
* nvm4w, fnm). When it is not there — an unusual layout, or a shim-based
|
|
37
|
+
* manager like Volta — we return null and the caller falls back to the
|
|
38
|
+
* platform shim.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveNpmCliJs(execPath: string, fileExists?: (p: string) => boolean): string | null;
|
|
23
41
|
export interface SelfUpdateProgress {
|
|
24
42
|
/** What stage are we in. Drives the UI's status label. */
|
|
25
43
|
stage: 'preflight' | 'stopping-primary' | 'installing' | 'done' | 'failed';
|
|
@@ -39,8 +57,16 @@ export interface SelfUpdateResult {
|
|
|
39
57
|
interface SelfUpdateOptions {
|
|
40
58
|
/** Override the package name (mainly for tests). */
|
|
41
59
|
packageName?: string;
|
|
42
|
-
/** Force `npm` command path. Defaults to the `npm` on PATH.
|
|
60
|
+
/** Force `npm` command path. Defaults to the `npm` on PATH. Supplying
|
|
61
|
+
* it also forces the shim fallback (the npm-cli.js path is skipped). */
|
|
43
62
|
npmBin?: string;
|
|
63
|
+
/** Override npm-cli.js resolution. `null` forces the shim fallback —
|
|
64
|
+
* that is how tests exercise it on a machine where npm-cli.js DOES
|
|
65
|
+
* resolve. Undefined auto-resolves next to the running Node binary. */
|
|
66
|
+
npmCliJs?: string | null;
|
|
67
|
+
/** Override the shell decision (mainly for tests). Defaults to true on
|
|
68
|
+
* Windows only — see the spawn call for why it is mandatory there. */
|
|
69
|
+
useShell?: boolean;
|
|
44
70
|
/** Skip the `runFreePort` step. Tests / dry-run use this. */
|
|
45
71
|
skipFreePort?: boolean;
|
|
46
72
|
/** Override the actual spawn for tests. */
|
|
@@ -19,8 +19,47 @@
|
|
|
19
19
|
* to relaunch it is the only honest thing we can do.
|
|
20
20
|
*/
|
|
21
21
|
import { spawn } from 'node:child_process';
|
|
22
|
+
import { existsSync } from 'node:fs';
|
|
23
|
+
import { dirname, join } from 'node:path';
|
|
22
24
|
import { runFreePort } from './free-port.js';
|
|
25
|
+
import { assertSafeNpmName } from './updates.js';
|
|
23
26
|
import { PACKAGE_NAME } from '../version.js';
|
|
27
|
+
/**
|
|
28
|
+
* What we are willing to install: the `latest` dist-tag, or one exact
|
|
29
|
+
* semver. Validated BEFORE the value is ever interpolated into an
|
|
30
|
+
* argument list, because on Windows the install runs through cmd.exe
|
|
31
|
+
* (see `runSelfUpdate`) and an unvalidated target would be a command
|
|
32
|
+
* injection surface. An allow-list is the right shape here — the set of
|
|
33
|
+
* legitimate values is tiny and closed.
|
|
34
|
+
*/
|
|
35
|
+
const UPDATE_TARGET_RE = /^(?:latest|\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?)$/;
|
|
36
|
+
export function isSafeUpdateTarget(target) {
|
|
37
|
+
return UPDATE_TARGET_RE.test(target);
|
|
38
|
+
}
|
|
39
|
+
/** npm reports a global-install permission problem in several shapes
|
|
40
|
+
* depending on OS and npm version. Any of them means the same thing to
|
|
41
|
+
* the user, and the fix is the same. */
|
|
42
|
+
const PERMISSION_RE = /\bEACCES\b|\bEPERM\b|permission denied|operation not permitted/i;
|
|
43
|
+
/**
|
|
44
|
+
* Locate npm's own CLI entrypoint so the install can run as
|
|
45
|
+
* `node npm-cli.js install -g …` instead of going through a shim.
|
|
46
|
+
*
|
|
47
|
+
* This is the preferred path on EVERY platform because it removes the
|
|
48
|
+
* whole problem class rather than working around it: no `.cmd` shim, so
|
|
49
|
+
* no Windows EINVAL; no shell, so no argument concatenation and no
|
|
50
|
+
* DEP0190 deprecation warning printed at the user mid-update; and one
|
|
51
|
+
* identical code path on macOS, Linux and Windows.
|
|
52
|
+
*
|
|
53
|
+
* npm ships inside the Node distribution, so it sits next to the running
|
|
54
|
+
* `node` binary in every standard install (official installer, nvm,
|
|
55
|
+
* nvm4w, fnm). When it is not there — an unusual layout, or a shim-based
|
|
56
|
+
* manager like Volta — we return null and the caller falls back to the
|
|
57
|
+
* platform shim.
|
|
58
|
+
*/
|
|
59
|
+
export function resolveNpmCliJs(execPath, fileExists = existsSync) {
|
|
60
|
+
const candidate = join(dirname(execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js');
|
|
61
|
+
return fileExists(candidate) ? candidate : null;
|
|
62
|
+
}
|
|
24
63
|
const I18N = {
|
|
25
64
|
en: {
|
|
26
65
|
starting: (t) => `Updating browser-link → ${t}`,
|
|
@@ -31,6 +70,11 @@ const I18N = {
|
|
|
31
70
|
installed: (t) => `✓ Installed browser-link@${t}. Restart your MCP client (Claude Code, OpenCode, Copilot CLI, …) to load the new version.`,
|
|
32
71
|
failed: (reason) => `✗ Update failed: ${reason}`,
|
|
33
72
|
restartHint: 'Restart your MCP client to pick up the new version.',
|
|
73
|
+
refusedTarget: (t) => `✗ Refusing to install "${t}": a target must be "latest" or an exact version like 1.2.3.`,
|
|
74
|
+
refusedPackage: (name) => `✗ Refusing to install "${name}": it does not match the npm package-name grammar.`,
|
|
75
|
+
permissionHint: 'npm could not write to your global install directory. Either re-run with elevated permissions (`sudo npm install -g ' +
|
|
76
|
+
PACKAGE_NAME +
|
|
77
|
+
'@latest`), or point npm at a user-owned prefix (`npm config set prefix ~/.npm-global`) and reopen your shell.',
|
|
34
78
|
},
|
|
35
79
|
es: {
|
|
36
80
|
starting: (t) => `Actualizando browser-link → ${t}`,
|
|
@@ -41,6 +85,11 @@ const I18N = {
|
|
|
41
85
|
installed: (t) => `✓ Instalado browser-link@${t}. Reiniciá tu cliente MCP (Claude Code, OpenCode, Copilot CLI, …) para cargar la nueva versión.`,
|
|
42
86
|
failed: (reason) => `✗ La actualización falló: ${reason}`,
|
|
43
87
|
restartHint: 'Reiniciá tu cliente MCP para que tome la nueva versión.',
|
|
88
|
+
refusedTarget: (t) => `✗ No instalo "${t}": el destino tiene que ser "latest" o una versión exacta como 1.2.3.`,
|
|
89
|
+
refusedPackage: (name) => `✗ No instalo "${name}": no cumple la gramática de nombres de paquete de npm.`,
|
|
90
|
+
permissionHint: 'npm no pudo escribir en tu directorio de instalación global. O lo corrés con permisos elevados (`sudo npm install -g ' +
|
|
91
|
+
PACKAGE_NAME +
|
|
92
|
+
'@latest`), o apuntás npm a un prefix propio (`npm config set prefix ~/.npm-global`) y reabrís la terminal.',
|
|
44
93
|
},
|
|
45
94
|
};
|
|
46
95
|
/** Returns the human-readable hint to restart the MCP client after a
|
|
@@ -49,6 +98,12 @@ const I18N = {
|
|
|
49
98
|
export function restartHint(language = 'en') {
|
|
50
99
|
return I18N[language].restartHint;
|
|
51
100
|
}
|
|
101
|
+
/** A refusal happens before any stage has started, so it reports as a
|
|
102
|
+
* `failed` preflight rather than pretending an install was attempted. */
|
|
103
|
+
function emitRefusal(onProgress, message) {
|
|
104
|
+
if (onProgress)
|
|
105
|
+
onProgress({ stage: 'failed', message });
|
|
106
|
+
}
|
|
52
107
|
/**
|
|
53
108
|
* Run the full self-update pipeline. Reports progress via `onProgress`
|
|
54
109
|
* (optional). Always resolves with a `SelfUpdateResult` — never throws so
|
|
@@ -57,14 +112,56 @@ export function restartHint(language = 'en') {
|
|
|
57
112
|
export async function runSelfUpdate(target, language = 'en', onProgress, opts = {}) {
|
|
58
113
|
const t = I18N[language];
|
|
59
114
|
const pkgName = opts.packageName ?? PACKAGE_NAME;
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
115
|
+
// Validate BOTH halves of the package ref before anything is spawned.
|
|
116
|
+
// This is not defensive decoration: on Windows the install has to run
|
|
117
|
+
// through cmd.exe (see the spawn call), so an unvalidated target or
|
|
118
|
+
// package name would be a command-injection surface. Refusing is the
|
|
119
|
+
// safe failure mode, and the legitimate value set is tiny and closed.
|
|
120
|
+
if (!isSafeUpdateTarget(target)) {
|
|
121
|
+
const message = t.refusedTarget(target);
|
|
122
|
+
emitRefusal(onProgress, message);
|
|
123
|
+
return { ok: false, target, message };
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
assertSafeNpmName(pkgName);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
const message = t.refusedPackage(pkgName);
|
|
130
|
+
emitRefusal(onProgress, message);
|
|
131
|
+
return { ok: false, target, message };
|
|
132
|
+
}
|
|
133
|
+
// Windows needs BOTH halves of this, and getting only the first was the
|
|
134
|
+
// long-standing bug: `npm` on Windows is `npm.cmd`, so a bare
|
|
135
|
+
// `spawn('npm', …)` throws ENOENT — and since Node 18.20.2 / 20.12.2 /
|
|
136
|
+
// 21.7.3 (the CVE-2024-27980 mitigation) spawning a `.cmd` WITHOUT a
|
|
137
|
+
// shell throws EINVAL. Naming the shim was necessary but not
|
|
138
|
+
// sufficient. We opt into the shell on Windows only, and only after
|
|
139
|
+
// allow-list validating the package ref above, so the quoting surface
|
|
140
|
+
// it adds never sees an unvalidated value.
|
|
141
|
+
const isWindows = process.platform === 'win32';
|
|
67
142
|
const doSpawn = opts.spawnImpl ?? spawn;
|
|
143
|
+
// Preferred: drive npm's own CLI with the Node we are already running.
|
|
144
|
+
// Shell-free on every platform, so Windows never touches a `.cmd` shim
|
|
145
|
+
// and nothing is ever concatenated into a command line.
|
|
146
|
+
const npmCliJs = opts.npmCliJs !== undefined
|
|
147
|
+
? opts.npmCliJs
|
|
148
|
+
: opts.npmBin === undefined
|
|
149
|
+
? resolveNpmCliJs(process.execPath)
|
|
150
|
+
: null;
|
|
151
|
+
const installArgs = ['install', '-g'];
|
|
152
|
+
let command;
|
|
153
|
+
let argv;
|
|
154
|
+
let useShell;
|
|
155
|
+
if (npmCliJs !== null) {
|
|
156
|
+
command = process.execPath;
|
|
157
|
+
argv = [npmCliJs, ...installArgs];
|
|
158
|
+
useShell = opts.useShell ?? false;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
command = opts.npmBin ?? (isWindows ? 'npm.cmd' : 'npm');
|
|
162
|
+
argv = installArgs;
|
|
163
|
+
useShell = opts.useShell ?? isWindows;
|
|
164
|
+
}
|
|
68
165
|
const emit = (stage, message) => {
|
|
69
166
|
if (onProgress)
|
|
70
167
|
onProgress({ stage, message });
|
|
@@ -87,15 +184,38 @@ export async function runSelfUpdate(target, language = 'en', onProgress, opts =
|
|
|
87
184
|
emit('installing', t.installing(target));
|
|
88
185
|
const ref = `${pkgName}@${target}`;
|
|
89
186
|
const installResult = await new Promise((resolve) => {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
187
|
+
let child;
|
|
188
|
+
try {
|
|
189
|
+
child = doSpawn(command, [...argv, ref], {
|
|
190
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
191
|
+
// Only reached on the FALLBACK path, where we had to go through
|
|
192
|
+
// the platform shim. It is mandatory there on Windows and is the
|
|
193
|
+
// reason every in-app update used to fail: Node >= 18.20.2 /
|
|
194
|
+
// 20.12.2 / 21.7.3 refuse to spawn a `.cmd` or `.bat` without a
|
|
195
|
+
// shell (the CVE-2024-27980 mitigation), and on Windows `npm` IS
|
|
196
|
+
// `npm.cmd`, so the shell-less spawn throws EINVAL. Both halves
|
|
197
|
+
// of `ref` were allow-list validated above, so nothing
|
|
198
|
+
// unvalidated ever reaches cmd.exe's parser.
|
|
199
|
+
...(useShell ? { shell: true } : {}),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
// `spawn` can throw SYNCHRONOUSLY — EINVAL above, and EACCES /
|
|
204
|
+
// ENOENT on some platforms. That throw never reaches the 'error'
|
|
205
|
+
// listener below, so without this catch it escaped the promise and
|
|
206
|
+
// rejected out of a function whose contract is "never throws".
|
|
207
|
+
resolve({ code: 1, stderr: err instanceof Error ? err.message : String(err) });
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
93
210
|
let stderr = '';
|
|
94
|
-
|
|
211
|
+
// Non-null in practice (stdio is ['ignore','pipe','pipe']), but the
|
|
212
|
+
// declared ChildProcess type allows null, and an optional chain costs
|
|
213
|
+
// nothing here.
|
|
214
|
+
child.stderr?.on('data', (chunk) => {
|
|
95
215
|
stderr += chunk.toString();
|
|
96
216
|
});
|
|
97
217
|
// Drain stdout to avoid blocking npm on large logs.
|
|
98
|
-
child.stdout
|
|
218
|
+
child.stdout?.on('data', () => {
|
|
99
219
|
/* drain */
|
|
100
220
|
});
|
|
101
221
|
child.on('error', (err) => {
|
|
@@ -107,7 +227,12 @@ export async function runSelfUpdate(target, language = 'en', onProgress, opts =
|
|
|
107
227
|
});
|
|
108
228
|
if (installResult.code !== 0) {
|
|
109
229
|
const lastLine = installResult.stderr.trim().split('\n').pop() ?? `exit code ${installResult.code}`;
|
|
110
|
-
|
|
230
|
+
// A global-install permission failure is the single most common way
|
|
231
|
+
// this fails on macOS and Linux, and npm's own last line ("EACCES:
|
|
232
|
+
// permission denied") tells the user nothing about what to do. Append
|
|
233
|
+
// the two real remedies instead of making them search.
|
|
234
|
+
const hint = PERMISSION_RE.test(installResult.stderr) ? `\n${t.permissionHint}` : '';
|
|
235
|
+
const message = t.failed(lastLine) + hint;
|
|
111
236
|
emit('failed', message);
|
|
112
237
|
return { ok: false, target, message, stderr: installResult.stderr };
|
|
113
238
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/updates.js
CHANGED
|
@@ -8,7 +8,7 @@ import { PACKAGE_NAME, VERSION } from '../version.js';
|
|
|
8
8
|
* lookup elsewhere. Refusing to query at all is the safer failure mode.
|
|
9
9
|
*/
|
|
10
10
|
const NPM_NAME_REGEX = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/;
|
|
11
|
-
function assertSafeNpmName(name) {
|
|
11
|
+
export function assertSafeNpmName(name) {
|
|
12
12
|
if (!NPM_NAME_REGEX.test(name)) {
|
|
13
13
|
throw new Error(`Refusing to query registry: package name "${name}" does not match the npm grammar.`);
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/commands/updates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGtD;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,oDAAoD,CAAC;AAE5E,
|
|
1
|
+
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/commands/updates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "browser-link",
|
|
4
|
-
"version": "0.25.
|
|
4
|
+
"version": "0.25.2",
|
|
5
5
|
"description": "Bridge between Chrome and an MCP client (Claude Code, OpenCode, GitHub Copilot CLI, …). Per-tab manual activation.",
|
|
6
6
|
"permissions": [
|
|
7
7
|
"debugger",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobshimo/browser-link",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.2",
|
|
4
4
|
"description": "MCP server that bridges Claude Code, OpenCode, GitHub Copilot CLI and other MCP clients to a Chrome tab. Per-tool permissions, multi-agent mode (multiple MCP clients sharing one bridge), persistent UI map across sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|