@jobshimo/browser-link 0.5.2 → 0.5.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.
Files changed (39) hide show
  1. package/dist/bridge/dispatch.d.ts +6 -0
  2. package/dist/bridge/dispatch.js +2 -2
  3. package/dist/bridge/dispatch.js.map +1 -1
  4. package/dist/bridge/events.d.ts +1 -1
  5. package/dist/bridge/events.js.map +1 -1
  6. package/dist/bridge/server.d.ts +7 -1
  7. package/dist/bridge/server.js +42 -5
  8. package/dist/bridge/server.js.map +1 -1
  9. package/dist/commands/self-update.d.ts +59 -0
  10. package/dist/commands/self-update.js +110 -0
  11. package/dist/commands/self-update.js.map +1 -0
  12. package/dist/commands/updates.js +27 -1
  13. package/dist/commands/updates.js.map +1 -1
  14. package/dist/config.d.ts +12 -10
  15. package/dist/config.js +55 -20
  16. package/dist/config.js.map +1 -1
  17. package/dist/extension/background.js +56 -6
  18. package/dist/extension/background.js.map +1 -1
  19. package/dist/extension/manifest.json +8 -3
  20. package/dist/extension/popup.d.ts +4 -0
  21. package/dist/extension/popup.html +243 -48
  22. package/dist/extension/popup.js +37 -24
  23. package/dist/extension/popup.js.map +1 -1
  24. package/dist/server.js +50 -1
  25. package/dist/server.js.map +1 -1
  26. package/dist/tools/browser-definitions.js +36 -1
  27. package/dist/tools/browser-definitions.js.map +1 -1
  28. package/dist/tools/browser-dispatch.d.ts +39 -3
  29. package/dist/tools/browser-dispatch.js +170 -63
  30. package/dist/tools/browser-dispatch.js.map +1 -1
  31. package/dist/tools/server-instructions.d.ts +1 -1
  32. package/dist/tools/server-instructions.js +32 -0
  33. package/dist/tools/server-instructions.js.map +1 -1
  34. package/dist/tools/tab-claims.d.ts +117 -0
  35. package/dist/tools/tab-claims.js +186 -0
  36. package/dist/tools/tab-claims.js.map +1 -0
  37. package/dist/ui/screens.js +57 -6
  38. package/dist/ui/screens.js.map +1 -1
  39. package/package.json +1 -1
@@ -8,10 +8,12 @@
8
8
  * out. Both callers wrap these results in whatever envelope they need.
9
9
  */
10
10
  import { type BrowserToolDeps } from '../tools/browser-dispatch.js';
11
+ import type { AgentCaller } from '../tools/tab-claims.js';
11
12
  export interface DispatchDeps {
12
13
  browserTools: BrowserToolDeps;
13
14
  disabledTools: readonly string[];
14
15
  }
16
+ export type { AgentCaller };
15
17
  /** Mirror of MCP `tools/list` shape. Kept minimal so the IPC layer can
16
18
  * forward it as a JSON-RPC result without any SDK-specific transformations. */
17
19
  export interface ToolsListResult {
@@ -25,5 +27,9 @@ export declare function handleToolsList(deps: DispatchDeps): ToolsListResult;
25
27
  export interface ToolCallRequest {
26
28
  name: string;
27
29
  arguments?: unknown;
30
+ /** Identity of the MCP client whose request this is. The transport layer
31
+ * (primary's stdio handler or IPC server) is responsible for filling it in
32
+ * — handlers that need to enforce per-agent ownership read from here. */
33
+ caller: AgentCaller;
28
34
  }
29
35
  export declare function handleToolCall(req: ToolCallRequest, deps: DispatchDeps): Promise<import("../tools/responses.js").ToolResponse>;
@@ -18,7 +18,7 @@ export function handleToolsList(deps) {
18
18
  };
19
19
  }
20
20
  export async function handleToolCall(req, deps) {
21
- const { name, arguments: args } = req;
21
+ const { name, arguments: args, caller } = req;
22
22
  if (!isToolEnabled(name, deps.disabledTools)) {
23
23
  // Defence in depth: a client that cached the previous tools/list could
24
24
  // still try to call a now-disabled tool. Refuse with a clear reason.
@@ -29,7 +29,7 @@ export async function handleToolCall(req, deps) {
29
29
  if (isMapTool(name))
30
30
  return toolResponse(handleMapTool(name, args));
31
31
  if (isBrowserTool(name))
32
- return toolResponse(await handleBrowserTool(name, args, deps.browserTools));
32
+ return toolResponse(await handleBrowserTool(name, args, deps.browserTools, caller));
33
33
  return toolError(`Unknown tool: ${name}`);
34
34
  }
35
35
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/bridge/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,aAAa,GAEd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAiBhE,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,wBAAwB,EAAE,GAAG,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACzE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAC1C;KACF,CAAC;AACJ,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAoB,EAAE,IAAkB;IAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACtC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7C,uEAAuE;QACvE,qEAAqE;QACrE,OAAO,SAAS,CACd,SAAS,IAAI,6CAA6C;YACxD,8EAA8E,IAAI,KAAK,CAC1F,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACpE,IAAI,aAAa,CAAC,IAAI,CAAC;YACrB,OAAO,YAAY,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9E,OAAO,SAAS,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/bridge/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,aAAa,GAEd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAoBhE,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,wBAAwB,EAAE,GAAG,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACzE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAC1C;KACF,CAAC;AACJ,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAoB,EAAE,IAAkB;IAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7C,uEAAuE;QACvE,qEAAqE;QACrE,OAAO,SAAS,CACd,SAAS,IAAI,6CAA6C;YACxD,8EAA8E,IAAI,KAAK,CAC1F,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACpE,IAAI,aAAa,CAAC,IAAI,CAAC;YACrB,OAAO,YAAY,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QACtF,OAAO,SAAS,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
@@ -10,7 +10,7 @@
10
10
  * `primary-elected` event as the fundamental marker — older history is
11
11
  * intentionally lost (the agent has nothing useful to do with it anyway).
12
12
  */
13
- export type BridgeEventKind = 'primary-elected' | 'tab-registered' | 'tab-disconnected' | 'tab-renamed';
13
+ export type BridgeEventKind = 'primary-elected' | 'tab-registered' | 'tab-disconnected' | 'tab-renamed' | 'tab-claimed' | 'tab-released' | 'tab-claim-rejected';
14
14
  export interface BridgeEvent {
15
15
  /** Monotonic id assigned by addEvent. */
16
16
  id: number;
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/bridge/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkBH,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,OAAO,cAAc;IACjB,MAAM,GAAkB,EAAE,CAAC;IAC3B,MAAM,GAAG,CAAC,CAAC;IAEnB,6EAA6E;IAC7E,GAAG,CAAC,IAAqB,EAAE,OAAgC,EAAE;QAC3D,MAAM,KAAK,GAAgB;YACzB,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;YACjB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,IAAI;SACL,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;oDAEgD;IAChD,MAAM,CAAC,OAA6C,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GACZ,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC;QAC7F,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,2DAA2D;IAC3D,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC;IAChF,CAAC;IAED,4CAA4C;IAC5C,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/bridge/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqBH,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,OAAO,cAAc;IACjB,MAAM,GAAkB,EAAE,CAAC;IAC3B,MAAM,GAAG,CAAC,CAAC;IAEnB,6EAA6E;IAC7E,GAAG,CAAC,IAAqB,EAAE,OAAgC,EAAE;QAC3D,MAAM,KAAK,GAAgB;YACzB,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;YACjB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,IAAI;SACL,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;oDAEgD;IAChD,MAAM,CAAC,OAA6C,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GACZ,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAQ,CAAC,CAAC;QAC7F,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,2DAA2D;IAC3D,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC;IAChF,CAAC;IAED,4CAA4C;IAC5C,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF"}
@@ -43,6 +43,12 @@ export declare class IpcServer {
43
43
  private handleFrame;
44
44
  /** Dispatch a JSON-RPC 2.0 MCP request to the shared handlers and return
45
45
  * a JSON-RPC 2.0 response object. Errors are converted to JSON-RPC error
46
- * envelopes — never thrown back to the socket layer. */
46
+ * envelopes — never thrown back to the socket layer.
47
+ *
48
+ * `sessionId` ties the call back to the IPC session that originated it,
49
+ * so handlers that care about per-agent ownership (tab claims) see the
50
+ * right identity. The session is the authentication scope: only the agent
51
+ * that passed the handshake gets a session id, and the id dies with the
52
+ * connection. */
47
53
  private dispatchMcpRequest;
48
54
  }
@@ -14,9 +14,22 @@ import { rotateToken } from './token.js';
14
14
  *
15
15
  * Construction does NOT bind the port. Call `start()` and await.
16
16
  */
17
+ /** Strip ASCII control characters from anything we put through `log()`.
18
+ * Some of what we log includes data that originally came from a peer
19
+ * (binary names, error messages, frame kinds), so a malicious or just
20
+ * quirky value with embedded newlines / ANSI escapes / NULs could forge
21
+ * additional log lines or hide context. Replacing them with `?` makes
22
+ * every entry survive a single line and a single visible character per
23
+ * source character. */
24
+ function sanitizeLogValue(s) {
25
+ // ASCII C0 (U+0000-U+001F) plus DEL (U+007F). Stops embedded newlines /
26
+ // NUL / ANSI escapes from forging extra log lines or hiding text.
27
+ // eslint-disable-next-line no-control-regex
28
+ return s.replace(/[\x00-\x1f\x7f]/g, '?');
29
+ }
17
30
  function log(msg) {
18
31
  // stderr — stdout belongs to the MCP transport.
19
- console.error(`[browser-link ipc] ${msg}`);
32
+ console.error(`[browser-link ipc] ${sanitizeLogValue(msg)}`);
20
33
  }
21
34
  /** Binaries we'll accept as legitimate peers. The token is the real auth;
22
35
  * this is defence in depth. Names normalised to lowercase before comparison. */
@@ -184,11 +197,17 @@ export class IpcServer {
184
197
  sessionId = randomUUID();
185
198
  socket.write(encodeFrame({ kind: 'hello-ack', version: IPC_PROTOCOL_VERSION, sessionId }));
186
199
  const sid = sessionId;
200
+ const caller = {
201
+ agent_id: sid,
202
+ pid: peer.pid,
203
+ binary: peer.binaryName,
204
+ };
187
205
  const session = {
188
206
  id: sid,
189
207
  socket,
190
208
  pingTimer: setInterval(() => this.heartbeat(sid), IPC_PING_INTERVAL_MS),
191
209
  pongDeadline: null,
210
+ caller,
192
211
  };
193
212
  this.sessions.set(sid, session);
194
213
  log(`Proxy connected: session=${sid} pid=${peer.pid}`);
@@ -213,6 +232,10 @@ export class IpcServer {
213
232
  if (session.pongDeadline)
214
233
  clearTimeout(session.pongDeadline);
215
234
  this.sessions.delete(sessionId);
235
+ // Drop every claim the agent held. The registry emits one
236
+ // tab-released event per dropped claim, which surfaces in
237
+ // browser.events for the remaining agents.
238
+ this.deps.browserTools.tabClaims?.onAgentDisconnect(sessionId);
216
239
  log(`Proxy disconnected: session=${sessionId}`);
217
240
  }
218
241
  }
@@ -250,7 +273,7 @@ export class IpcServer {
250
273
  return;
251
274
  }
252
275
  case 'mcp.request': {
253
- const response = await this.dispatchMcpRequest(frame.payload);
276
+ const response = await this.dispatchMcpRequest(frame.payload, sessionId);
254
277
  try {
255
278
  socket.write(encodeFrame({ kind: 'mcp.response', requestId: frame.requestId, payload: response }));
256
279
  }
@@ -282,8 +305,14 @@ export class IpcServer {
282
305
  }
283
306
  /** Dispatch a JSON-RPC 2.0 MCP request to the shared handlers and return
284
307
  * a JSON-RPC 2.0 response object. Errors are converted to JSON-RPC error
285
- * envelopes — never thrown back to the socket layer. */
286
- async dispatchMcpRequest(payload) {
308
+ * envelopes — never thrown back to the socket layer.
309
+ *
310
+ * `sessionId` ties the call back to the IPC session that originated it,
311
+ * so handlers that care about per-agent ownership (tab claims) see the
312
+ * right identity. The session is the authentication scope: only the agent
313
+ * that passed the handshake gets a session id, and the id dies with the
314
+ * connection. */
315
+ async dispatchMcpRequest(payload, sessionId) {
287
316
  if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
288
317
  return { jsonrpc: '2.0', id: null, error: { code: -32600, message: 'Invalid request' } };
289
318
  }
@@ -314,7 +343,15 @@ export class IpcServer {
314
343
  error: { code: -32602, message: 'Missing tool name in params' },
315
344
  };
316
345
  }
317
- const result = await handleToolCall({ name: params.name, arguments: params.arguments }, this.deps);
346
+ const session = this.sessions.get(sessionId);
347
+ if (!session) {
348
+ return {
349
+ jsonrpc: '2.0',
350
+ id,
351
+ error: { code: -32603, message: 'Session not found for tools/call' },
352
+ };
353
+ }
354
+ const result = await handleToolCall({ name: params.name, arguments: params.arguments, caller: session.caller }, this.deps);
318
355
  return { jsonrpc: '2.0', id, result };
319
356
  }
320
357
  case 'ping': {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/bridge/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/bridge/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * One-shot self-update for the browser-link CLI / MCP server.
3
+ *
4
+ * Strategy:
5
+ * 1. Optionally free port 17529 — if a primary is running, npm install
6
+ * can race with the live binary on Windows (file lock) and produces
7
+ * confusing errors on Unix when the process is rebound to a stale
8
+ * dist/. Stopping the primary first keeps the install clean and
9
+ * forces the next MCP-client spawn to pick up the new code.
10
+ * 2. Run `npm install -g <package>@<target>` as a child process, with
11
+ * stdio piped so we can capture output and report it to the caller
12
+ * (UI streams a short summary; CLI prints raw stderr on failure).
13
+ * 3. Return a structured result. The caller decides what to do next:
14
+ * the interactive UI shows a "restart your MCP client" hint, the
15
+ * command-line wrapper prints stdout and exits.
16
+ *
17
+ * Why not auto-restart the MCP client? We don't own that process — it is
18
+ * the parent (Claude Code, OpenCode, Copilot CLI, …). Telling the user
19
+ * to relaunch it is the only honest thing we can do.
20
+ */
21
+ import { spawn } from 'node:child_process';
22
+ import type { Language } from './welcome.js';
23
+ export interface SelfUpdateProgress {
24
+ /** What stage are we in. Drives the UI's status label. */
25
+ stage: 'preflight' | 'stopping-primary' | 'installing' | 'done' | 'failed';
26
+ /** Human-readable message safe to surface to the user as-is. */
27
+ message: string;
28
+ }
29
+ export type SelfUpdateProgressCallback = (event: SelfUpdateProgress) => void;
30
+ export interface SelfUpdateResult {
31
+ ok: boolean;
32
+ /** The version requested (e.g. `"latest"`, `"0.5.3"`). */
33
+ target: string;
34
+ /** Final message — the one to show in the UI when the spinner stops. */
35
+ message: string;
36
+ /** Combined npm stderr in case the caller wants to dump it for diagnosis. */
37
+ stderr?: string;
38
+ }
39
+ interface SelfUpdateOptions {
40
+ /** Override the package name (mainly for tests). */
41
+ packageName?: string;
42
+ /** Force `npm` command path. Defaults to the `npm` on PATH. */
43
+ npmBin?: string;
44
+ /** Skip the `runFreePort` step. Tests / dry-run use this. */
45
+ skipFreePort?: boolean;
46
+ /** Override the actual spawn for tests. */
47
+ spawnImpl?: typeof spawn;
48
+ }
49
+ /** Returns the human-readable hint to restart the MCP client after a
50
+ * successful update. Exported so the CLI wrapper can reuse it without
51
+ * duplicating the i18n table. */
52
+ export declare function restartHint(language?: Language): string;
53
+ /**
54
+ * Run the full self-update pipeline. Reports progress via `onProgress`
55
+ * (optional). Always resolves with a `SelfUpdateResult` — never throws so
56
+ * the UI doesn't have to wrap calls in try/catch.
57
+ */
58
+ export declare function runSelfUpdate(target: string, language?: Language, onProgress?: SelfUpdateProgressCallback, opts?: SelfUpdateOptions): Promise<SelfUpdateResult>;
59
+ export {};
@@ -0,0 +1,110 @@
1
+ /**
2
+ * One-shot self-update for the browser-link CLI / MCP server.
3
+ *
4
+ * Strategy:
5
+ * 1. Optionally free port 17529 — if a primary is running, npm install
6
+ * can race with the live binary on Windows (file lock) and produces
7
+ * confusing errors on Unix when the process is rebound to a stale
8
+ * dist/. Stopping the primary first keeps the install clean and
9
+ * forces the next MCP-client spawn to pick up the new code.
10
+ * 2. Run `npm install -g <package>@<target>` as a child process, with
11
+ * stdio piped so we can capture output and report it to the caller
12
+ * (UI streams a short summary; CLI prints raw stderr on failure).
13
+ * 3. Return a structured result. The caller decides what to do next:
14
+ * the interactive UI shows a "restart your MCP client" hint, the
15
+ * command-line wrapper prints stdout and exits.
16
+ *
17
+ * Why not auto-restart the MCP client? We don't own that process — it is
18
+ * the parent (Claude Code, OpenCode, Copilot CLI, …). Telling the user
19
+ * to relaunch it is the only honest thing we can do.
20
+ */
21
+ import { spawn } from 'node:child_process';
22
+ import { runFreePort } from './free-port.js';
23
+ import { PACKAGE_NAME } from '../version.js';
24
+ const I18N = {
25
+ en: {
26
+ starting: (t) => `Updating browser-link → ${t}`,
27
+ stopping: 'Stopping the running browser-link primary…',
28
+ notRunning: 'No primary running — port is already free.',
29
+ stopFailed: (reason) => `Could not stop the running browser-link primary: ${reason}. Continuing with the install anyway.`,
30
+ installing: (t) => `Running: npm install -g ${PACKAGE_NAME}@${t}`,
31
+ installed: (t) => `✓ Installed browser-link@${t}. Restart your MCP client (Claude Code, OpenCode, Copilot CLI, …) to load the new version.`,
32
+ failed: (reason) => `✗ Update failed: ${reason}`,
33
+ restartHint: 'Restart your MCP client to pick up the new version.',
34
+ },
35
+ es: {
36
+ starting: (t) => `Actualizando browser-link → ${t}`,
37
+ stopping: 'Deteniendo el primary de browser-link en uso…',
38
+ notRunning: 'No hay primary corriendo — el puerto ya está libre.',
39
+ stopFailed: (reason) => `No se pudo detener el primary en uso: ${reason}. Igual sigo con la instalación.`,
40
+ installing: (t) => `Ejecutando: npm install -g ${PACKAGE_NAME}@${t}`,
41
+ installed: (t) => `✓ Instalado browser-link@${t}. Reiniciá tu cliente MCP (Claude Code, OpenCode, Copilot CLI, …) para cargar la nueva versión.`,
42
+ failed: (reason) => `✗ La actualización falló: ${reason}`,
43
+ restartHint: 'Reiniciá tu cliente MCP para que tome la nueva versión.',
44
+ },
45
+ };
46
+ /** Returns the human-readable hint to restart the MCP client after a
47
+ * successful update. Exported so the CLI wrapper can reuse it without
48
+ * duplicating the i18n table. */
49
+ export function restartHint(language = 'en') {
50
+ return I18N[language].restartHint;
51
+ }
52
+ /**
53
+ * Run the full self-update pipeline. Reports progress via `onProgress`
54
+ * (optional). Always resolves with a `SelfUpdateResult` — never throws so
55
+ * the UI doesn't have to wrap calls in try/catch.
56
+ */
57
+ export async function runSelfUpdate(target, language = 'en', onProgress, opts = {}) {
58
+ const t = I18N[language];
59
+ const pkgName = opts.packageName ?? PACKAGE_NAME;
60
+ const npmBin = opts.npmBin ?? 'npm';
61
+ const doSpawn = opts.spawnImpl ?? spawn;
62
+ const emit = (stage, message) => {
63
+ if (onProgress)
64
+ onProgress({ stage, message });
65
+ };
66
+ emit('preflight', t.starting(target));
67
+ // Stop the running primary (if any). Failure here is non-fatal — we still
68
+ // try to install; only the install failure is treated as terminal.
69
+ if (!opts.skipFreePort) {
70
+ let stopMessage;
71
+ try {
72
+ const freed = runFreePort(language);
73
+ stopMessage = freed.pid == null ? t.notRunning : freed.message;
74
+ }
75
+ catch (err) {
76
+ const reason = err instanceof Error ? err.message : String(err);
77
+ stopMessage = t.stopFailed(reason);
78
+ }
79
+ emit('stopping-primary', stopMessage);
80
+ }
81
+ emit('installing', t.installing(target));
82
+ const ref = `${pkgName}@${target}`;
83
+ const installResult = await new Promise((resolve) => {
84
+ const child = doSpawn(npmBin, ['install', '-g', ref], {
85
+ stdio: ['ignore', 'pipe', 'pipe'],
86
+ });
87
+ let stderr = '';
88
+ child.stderr?.on('data', (chunk) => {
89
+ stderr += chunk.toString();
90
+ });
91
+ // Drain stdout to avoid blocking npm on large logs.
92
+ child.stdout?.on('data', () => { });
93
+ child.on('error', (err) => {
94
+ resolve({ code: 1, stderr: err.message });
95
+ });
96
+ child.on('close', (code) => {
97
+ resolve({ code, stderr });
98
+ });
99
+ });
100
+ if (installResult.code !== 0) {
101
+ const lastLine = installResult.stderr.trim().split('\n').pop() ?? `exit code ${installResult.code}`;
102
+ const message = t.failed(lastLine);
103
+ emit('failed', message);
104
+ return { ok: false, target, message, stderr: installResult.stderr };
105
+ }
106
+ const okMessage = t.installed(target);
107
+ emit('done', okMessage);
108
+ return { ok: true, target, message: okMessage };
109
+ }
110
+ //# sourceMappingURL=self-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,18 @@
1
1
  import { PACKAGE_NAME, VERSION } from '../version.js';
2
+ /**
3
+ * Conservative subset of npm's official name grammar — lowercase ASCII,
4
+ * digits, dash/underscore/dot, optional `@scope/` prefix. PACKAGE_NAME is
5
+ * read from package.json at runtime; routing that string into a URL without
6
+ * a validation gate would let a tampered package.json point the registry
7
+ * lookup elsewhere. Refusing to query at all is the safer failure mode.
8
+ */
9
+ const NPM_NAME_REGEX = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/;
10
+ function assertSafeNpmName(name) {
11
+ if (!NPM_NAME_REGEX.test(name)) {
12
+ throw new Error(`Refusing to query registry: package name "${name}" does not match the npm grammar.`);
13
+ }
14
+ return name;
15
+ }
2
16
  /**
3
17
  * Ask the npm registry for the `latest` dist-tag and compare it to the
4
18
  * version baked into this package. Network round-trip is one tiny GET.
@@ -9,7 +23,19 @@ import { PACKAGE_NAME, VERSION } from '../version.js';
9
23
  * consistent ordering, just not the semver-correct one.
10
24
  */
11
25
  export async function checkUpdates(timeoutMs = 4000) {
12
- const url = `https://registry.npmjs.org/-/package/${PACKAGE_NAME}/dist-tags`;
26
+ let safeName;
27
+ try {
28
+ safeName = assertSafeNpmName(PACKAGE_NAME);
29
+ }
30
+ catch (err) {
31
+ return {
32
+ current: VERSION,
33
+ latest: null,
34
+ newer: null,
35
+ error: err instanceof Error ? err.message : String(err),
36
+ };
37
+ }
38
+ const url = `https://registry.npmjs.org/-/package/${safeName}/dist-tags`;
13
39
  const controller = new AbortController();
14
40
  const timer = setTimeout(() => controller.abort(), timeoutMs);
15
41
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/commands/updates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/commands/updates.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -13,19 +13,21 @@ export interface BrowserLinkConfig {
13
13
  */
14
14
  disabledTools?: string[];
15
15
  /**
16
- * Multi-agent mode. When false (default), only one MCP client can have
17
- * browser-link active at a time; a second client trying to spawn the
18
- * server crashes with EADDRINUSE. When true, the second instance becomes
19
- * a proxy that forwards MCP requests to the first one over an internal
20
- * IPC port (127.0.0.1:17530). All agents end up sharing the same Chrome
21
- * tabs and the same persistent UI map.
16
+ * Multi-agent mode. Default ON. When true (default), several MCP clients
17
+ * (Claude Code + OpenCode + Copilot, …) can share the same browser-link
18
+ * primary: the second `browser-link` spawn becomes a thin proxy that
19
+ * forwards MCP traffic to the first one over an internal IPC port
20
+ * (127.0.0.1:17530), and all agents see the same Chrome tabs and the
21
+ * same persistent UI map. Set explicitly to false to disable.
22
22
  */
23
23
  multiAgent?: boolean;
24
24
  /**
25
- * Only honoured when multiAgent === true. When false (default), if the
26
- * primary's MCP client closes, secondary clients lose the bridge and
27
- * have to be relaunched manually. When true, one of the secondaries
28
- * takes over the primary role automatically (race on bind(17529)).
25
+ * Auto-reelect. Default ON, gated by `multiAgent`. When true and the
26
+ * current primary's MCP client closes, the secondary proxies enter a
27
+ * short reconnect window and race to become the new primary; clients
28
+ * recover automatically instead of needing a manual relaunch. Set
29
+ * explicitly to false to keep the previous behaviour (proxies die when
30
+ * the primary does). Has no effect when multiAgent is false.
29
31
  */
30
32
  autoReelect?: boolean;
31
33
  }
package/dist/config.js CHANGED
@@ -2,13 +2,31 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { dirname, join } from 'node:path';
3
3
  import { getDataDir } from './map/paths.js';
4
4
  import { sanitizeDisabledTools } from './permissions.js';
5
+ /** Defaults applied at load time so consumers can read `cfg.multiAgent`
6
+ * directly. Persisted form (see `normaliseForWrite`) only carries the field
7
+ * when the user overrides the default, keeping the on-disk config minimal. */
8
+ const DEFAULT_MULTI_AGENT = true;
9
+ const DEFAULT_AUTO_REELECT = true;
5
10
  function configFile() {
6
11
  return join(getDataDir(), 'config.json');
7
12
  }
8
- function normalise(cfg) {
9
- // Always run the disabled-tools list through the sanitizer both on read
10
- // and on write — so unknown names from a downgraded build, a typo, or a
11
- // manual edit never reach the server filter.
13
+ /** Apply the runtime defaults so every consumer of loadConfig() reads the
14
+ * effective configuration directly no per-call `?? true` plumbing. */
15
+ function withDefaults(cfg) {
16
+ const multiAgent = cfg.multiAgent ?? DEFAULT_MULTI_AGENT;
17
+ // autoReelect is gated on multiAgent: when multi-agent is off, the flag
18
+ // has no effect, so the effective value is forced to false to avoid any
19
+ // ambiguity for the consumer.
20
+ const autoReelect = multiAgent ? (cfg.autoReelect ?? DEFAULT_AUTO_REELECT) : false;
21
+ return { ...cfg, multiAgent, autoReelect };
22
+ }
23
+ /** Strip fields that hold their default value before writing — the on-disk
24
+ * config only carries explicit overrides. Keeps the file diff-friendly and
25
+ * forward-compatible when defaults shift in a future release. */
26
+ function normaliseForWrite(cfg) {
27
+ // Always run the disabled-tools list through the sanitizer so unknown
28
+ // names from a downgraded build, a typo, or a manual edit never reach
29
+ // the server filter.
12
30
  const sanitized = sanitizeDisabledTools(cfg.disabledTools);
13
31
  let next;
14
32
  if (sanitized.length === 0) {
@@ -18,20 +36,20 @@ function normalise(cfg) {
18
36
  else {
19
37
  next = { ...cfg, disabledTools: sanitized };
20
38
  }
21
- // autoReelect only makes sense when multiAgent is on. Drop a stray
22
- // autoReelect:true if multiAgent is off, so the config file never has
23
- // an inert flag advertising a behaviour it does not produce.
24
- if (next.autoReelect && !next.multiAgent) {
39
+ // autoReelect only makes sense when multiAgent is on. Drop the flag
40
+ // entirely when multiAgent has been turned off so the file never carries
41
+ // an inert override.
42
+ if (next.multiAgent === false && 'autoReelect' in next) {
25
43
  const { autoReelect: _omit2, ...rest2 } = next;
26
44
  next = rest2;
27
45
  }
28
- // Drop explicit `false` for the two new flags too the default is false,
29
- // so storing it just adds noise.
30
- if (next.multiAgent === false) {
46
+ // Drop fields whose value matches the runtime default they are the
47
+ // implicit state; the file should only show user-chosen overrides.
48
+ if (next.multiAgent === DEFAULT_MULTI_AGENT) {
31
49
  const { multiAgent: _omit3, ...rest3 } = next;
32
50
  next = rest3;
33
51
  }
34
- if (next.autoReelect === false) {
52
+ if (next.autoReelect === DEFAULT_AUTO_REELECT) {
35
53
  const { autoReelect: _omit4, ...rest4 } = next;
36
54
  next = rest4;
37
55
  }
@@ -40,13 +58,13 @@ function normalise(cfg) {
40
58
  export function loadConfig() {
41
59
  const path = configFile();
42
60
  if (!existsSync(path))
43
- return {};
61
+ return withDefaults({});
44
62
  try {
45
63
  const raw = readFileSync(path, 'utf8');
46
64
  const parsed = JSON.parse(raw);
47
65
  if (parsed && typeof parsed === 'object')
48
- return normalise(parsed);
49
- return {};
66
+ return withDefaults(parsed);
67
+ return withDefaults({});
50
68
  }
51
69
  catch (err) {
52
70
  // Surface corruption rather than silently masking it: the file is
@@ -54,15 +72,32 @@ export function loadConfig() {
54
72
  // signal. We still fall back to defaults so the CLI keeps working.
55
73
  const message = err instanceof Error ? err.message : String(err);
56
74
  console.warn(`[browser-link] could not read config at ${path}: ${message}. Using defaults.`);
57
- return {};
75
+ return withDefaults({});
58
76
  }
59
77
  }
60
78
  export function saveConfig(patch) {
61
79
  const path = configFile();
62
80
  mkdirSync(dirname(path), { recursive: true });
63
- const current = loadConfig();
64
- const next = normalise({ ...current, ...patch });
65
- writeFileSync(path, JSON.stringify(next, null, 2) + '\n', 'utf8');
66
- return next;
81
+ // Read the persisted form (pre-defaults) so merging the patch doesn't
82
+ // accidentally promote a default into an explicit field on disk.
83
+ const persisted = readPersisted();
84
+ const stripped = normaliseForWrite({ ...persisted, ...patch });
85
+ writeFileSync(path, JSON.stringify(stripped, null, 2) + '\n', 'utf8');
86
+ return loadConfig();
87
+ }
88
+ function readPersisted() {
89
+ const path = configFile();
90
+ if (!existsSync(path))
91
+ return {};
92
+ try {
93
+ const raw = readFileSync(path, 'utf8');
94
+ const parsed = JSON.parse(raw);
95
+ if (parsed && typeof parsed === 'object')
96
+ return parsed;
97
+ return {};
98
+ }
99
+ catch {
100
+ return {};
101
+ }
67
102
  }
68
103
  //# sourceMappingURL=config.js.map