@jobshimo/browser-link 0.22.0 → 0.23.1

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 (72) hide show
  1. package/README.md +5 -0
  2. package/dist/agent-instructions/content.js +11 -0
  3. package/dist/agent-instructions/content.js.map +1 -1
  4. package/dist/bridge/ws-bridge.js +13 -0
  5. package/dist/bridge/ws-bridge.js.map +1 -1
  6. package/dist/cdp/client.d.ts +35 -0
  7. package/dist/cdp/client.js +149 -0
  8. package/dist/cdp/client.js.map +1 -0
  9. package/dist/cdp/flow.d.ts +178 -0
  10. package/dist/cdp/flow.js +217 -0
  11. package/dist/cdp/flow.js.map +1 -0
  12. package/dist/cdp/gate.d.ts +31 -0
  13. package/dist/cdp/gate.js +35 -0
  14. package/dist/cdp/gate.js.map +1 -0
  15. package/dist/cdp/grant.d.ts +45 -0
  16. package/dist/cdp/grant.js +81 -0
  17. package/dist/cdp/grant.js.map +1 -0
  18. package/dist/cdp/inpage/builders.d.ts +165 -0
  19. package/dist/cdp/inpage/builders.js +501 -0
  20. package/dist/cdp/inpage/builders.js.map +1 -0
  21. package/dist/cdp/inpage/deep-query.d.ts +57 -0
  22. package/dist/cdp/inpage/deep-query.js +325 -0
  23. package/dist/cdp/inpage/deep-query.js.map +1 -0
  24. package/dist/cdp/inpage/dom-helpers.d.ts +27 -0
  25. package/dist/cdp/inpage/dom-helpers.js +147 -0
  26. package/dist/cdp/inpage/dom-helpers.js.map +1 -0
  27. package/dist/cdp/keymap.d.ts +83 -0
  28. package/dist/cdp/keymap.js +205 -0
  29. package/dist/cdp/keymap.js.map +1 -0
  30. package/dist/cdp/settle.d.ts +38 -0
  31. package/dist/cdp/settle.js +76 -0
  32. package/dist/cdp/settle.js.map +1 -0
  33. package/dist/cdp/support.d.ts +26 -0
  34. package/dist/cdp/support.js +58 -0
  35. package/dist/cdp/support.js.map +1 -0
  36. package/dist/cdp/targets.d.ts +54 -0
  37. package/dist/cdp/targets.js +176 -0
  38. package/dist/cdp/targets.js.map +1 -0
  39. package/dist/cdp/transport.d.ts +31 -0
  40. package/dist/cdp/transport.js +531 -0
  41. package/dist/cdp/transport.js.map +1 -0
  42. package/dist/cli.js +50 -0
  43. package/dist/cli.js.map +1 -1
  44. package/dist/commands/about.js +13 -0
  45. package/dist/commands/about.js.map +1 -1
  46. package/dist/commands/cdp.d.ts +28 -0
  47. package/dist/commands/cdp.js +172 -0
  48. package/dist/commands/cdp.js.map +1 -0
  49. package/dist/commands/config.d.ts +92 -0
  50. package/dist/commands/config.js +173 -12
  51. package/dist/commands/config.js.map +1 -1
  52. package/dist/config.d.ts +70 -0
  53. package/dist/config.js +94 -1
  54. package/dist/config.js.map +1 -1
  55. package/dist/extension/background.js +58 -5
  56. package/dist/extension/background.js.map +1 -1
  57. package/dist/extension/inpage/recorder.js +25 -0
  58. package/dist/extension/inpage/recorder.js.map +1 -1
  59. package/dist/extension/manifest.json +1 -1
  60. package/dist/extension/recording.d.ts +39 -3
  61. package/dist/extension/recording.js +57 -3
  62. package/dist/extension/recording.js.map +1 -1
  63. package/dist/server.js +9 -0
  64. package/dist/server.js.map +1 -1
  65. package/dist/tools/browser-definitions.js +4 -3
  66. package/dist/tools/browser-definitions.js.map +1 -1
  67. package/dist/tools/browser-dispatch.d.ts +31 -0
  68. package/dist/tools/browser-dispatch.js +88 -40
  69. package/dist/tools/browser-dispatch.js.map +1 -1
  70. package/dist/tools/server-instructions.js +19 -0
  71. package/dist/tools/server-instructions.js.map +1 -1
  72. package/package.json +1 -1
@@ -1,7 +1,10 @@
1
- import { MAX_IDLE_TTL_MINUTES, MIN_IDLE_TTL_MINUTES, clampIdleTtlMinutes, loadConfig, saveConfig, } from '../config.js';
1
+ import { MAX_CDP_DIRECT_PORT, MAX_GRANT_TTL_MINUTES, MAX_IDLE_TTL_MINUTES, MIN_CDP_DIRECT_PORT, MIN_GRANT_TTL_MINUTES, MIN_IDLE_TTL_MINUTES, clampCdpDirectPort, clampGrantTtlMinutes, clampIdleTtlMinutes, loadConfig, saveConfig, } from '../config.js';
2
2
  import { HandshakeError, IpcClient } from '../bridge/ipc-client.js';
3
3
  import { readToken } from '../bridge/token.js';
4
- const CFG_I18N = {
4
+ /** Exported so `commands/cdp.ts` can reuse `parseGrantTtlArg`'s exact
5
+ * localized wording for `cdp allow --minutes`'s per-call override — same
6
+ * error/clamp messages `config set cdp-direct.grant-ttl` produces. */
7
+ export const CFG_I18N = {
5
8
  en: {
6
9
  header: 'browser-link config',
7
10
  idleTtlLabel: 'idle-ttl',
@@ -15,8 +18,8 @@ const CFG_I18N = {
15
18
  pushedNone: ' No tabs are currently connected — it will apply the next time one connects.',
16
19
  pushUnavailable: ' Could not reach a running browser-link primary (not running, or multi-agent mode is off) — it will apply the next time a tab connects.',
17
20
  pushRejected: ' A running primary rejected the push (stale or mismatched multi-agent token — it may have just restarted). The value is saved and applies the next time a tab connects.',
18
- usage: 'Usage: browser-link config get [idle-ttl|flow-recording] | browser-link config set idle-ttl <minutes|never> | browser-link config set flow-recording <on|off>',
19
- unknownKey: (key) => `Unknown config key: ${key}. Known keys: idle-ttl, flow-recording.`,
21
+ usage: 'Usage: browser-link config get [idle-ttl|flow-recording|cdp-direct.enabled|cdp-direct.port|cdp-direct.grant-ttl] | browser-link config set idle-ttl <minutes|never> | browser-link config set flow-recording <on|off> | browser-link config set cdp-direct.enabled <true|false> | browser-link config set cdp-direct.port <port> | browser-link config set cdp-direct.grant-ttl <minutes|never>',
22
+ unknownKey: (key) => `Unknown config key: ${key}. Known keys: idle-ttl, flow-recording, cdp-direct.enabled, cdp-direct.port, cdp-direct.grant-ttl.`,
20
23
  unknownAction: (action) => `Unknown config action: ${action}. Use get or set.`,
21
24
  flowRecordingLabel: 'flow-recording',
22
25
  flowRecordingEnabled: 'enabled',
@@ -24,6 +27,18 @@ const CFG_I18N = {
24
27
  flowRecordingNotSetViaCli: "not set via CLI — the extension's own default/popup choice applies (off unless enabled in the popup)",
25
28
  invalidFlowRecordingValue: (raw) => `Invalid flow-recording value: "${raw}". Use "on" or "off".`,
26
29
  flowRecordingSetSaved: (label) => `Flow recording set to ${label}.`,
30
+ cdpDirectEnabledLabel: 'cdp-direct.enabled',
31
+ cdpDirectPortLabel: 'cdp-direct.port',
32
+ cdpDirectGrantTtlLabel: 'cdp-direct.grant-ttl',
33
+ cdpDirectOn: 'on',
34
+ cdpDirectOff: 'off (default)',
35
+ invalidCdpDirectEnabledValue: (raw) => `Invalid cdp-direct.enabled value: "${raw}". Use "true" or "false".`,
36
+ cdpDirectEnabledSetSaved: (label) => `cdp-direct.enabled set to ${label}. This alone does not let an agent use a cdp: tab — run \`browser-link cdp allow\` to also grant it.`,
37
+ invalidCdpDirectPortValue: (raw) => `Invalid cdp-direct.port value: "${raw}". Use a whole number (${MIN_CDP_DIRECT_PORT}-${MAX_CDP_DIRECT_PORT}).`,
38
+ cdpDirectPortSetSaved: (port) => `cdp-direct.port set to ${port}.`,
39
+ invalidGrantTtlValue: (raw) => `Invalid cdp-direct.grant-ttl value: "${raw}". Use a whole number of minutes (${MIN_GRANT_TTL_MINUTES}-${MAX_GRANT_TTL_MINUTES}) or "never".`,
40
+ grantTtlNever: 'never (grants never expire until revoked — reduces the security posture)',
41
+ cdpDirectGrantTtlSetSaved: (label) => `cdp-direct.grant-ttl (default for \`cdp allow\`) set to ${label}.`,
27
42
  },
28
43
  es: {
29
44
  header: 'Configuración de browser-link',
@@ -38,8 +53,8 @@ const CFG_I18N = {
38
53
  pushedNone: ' No hay pestañas conectadas actualmente — se aplicará la próxima vez que una se conecte.',
39
54
  pushUnavailable: ' No se pudo contactar a un browser-link primary en ejecución (no está corriendo, o el modo multi-agente está apagado) — se aplicará la próxima vez que una pestaña se conecte.',
40
55
  pushRejected: ' Un primary en ejecución rechazó el push (token multi-agente obsoleto o no coincidente — puede haberse reiniciado recién). El valor quedó guardado y se aplicará la próxima vez que una pestaña se conecte.',
41
- usage: 'Uso: browser-link config get [idle-ttl|flow-recording] | browser-link config set idle-ttl <minutos|never> | browser-link config set flow-recording <on|off>',
42
- unknownKey: (key) => `Clave de configuración desconocida: ${key}. Claves conocidas: idle-ttl, flow-recording.`,
56
+ usage: 'Uso: browser-link config get [idle-ttl|flow-recording|cdp-direct.enabled|cdp-direct.port|cdp-direct.grant-ttl] | browser-link config set idle-ttl <minutos|never> | browser-link config set flow-recording <on|off> | browser-link config set cdp-direct.enabled <true|false> | browser-link config set cdp-direct.port <puerto> | browser-link config set cdp-direct.grant-ttl <minutos|never>',
57
+ unknownKey: (key) => `Clave de configuración desconocida: ${key}. Claves conocidas: idle-ttl, flow-recording, cdp-direct.enabled, cdp-direct.port, cdp-direct.grant-ttl.`,
43
58
  unknownAction: (action) => `Acción de config desconocida: ${action}. Usá get o set.`,
44
59
  flowRecordingLabel: 'flow-recording',
45
60
  flowRecordingEnabled: 'habilitado',
@@ -47,6 +62,18 @@ const CFG_I18N = {
47
62
  flowRecordingNotSetViaCli: 'no configurado por CLI — se aplica el valor por defecto o el elegido en el popup de la extensión (deshabilitado salvo que se haya habilitado en el popup)',
48
63
  invalidFlowRecordingValue: (raw) => `Valor de flow-recording inválido: "${raw}". Usá "on" u "off".`,
49
64
  flowRecordingSetSaved: (label) => `Grabación de flows configurada a ${label}.`,
65
+ cdpDirectEnabledLabel: 'cdp-direct.enabled',
66
+ cdpDirectPortLabel: 'cdp-direct.port',
67
+ cdpDirectGrantTtlLabel: 'cdp-direct.grant-ttl',
68
+ cdpDirectOn: 'activado',
69
+ cdpDirectOff: 'desactivado (por defecto)',
70
+ invalidCdpDirectEnabledValue: (raw) => `Valor de cdp-direct.enabled inválido: "${raw}". Usá "true" o "false".`,
71
+ cdpDirectEnabledSetSaved: (label) => `cdp-direct.enabled configurado a ${label}. Esto solo no permite que un agente use una pestaña cdp: — corré \`browser-link cdp allow\` para además otorgar el permiso.`,
72
+ invalidCdpDirectPortValue: (raw) => `Valor de cdp-direct.port inválido: "${raw}". Usá un número entero (${MIN_CDP_DIRECT_PORT}-${MAX_CDP_DIRECT_PORT}).`,
73
+ cdpDirectPortSetSaved: (port) => `cdp-direct.port configurado a ${port}.`,
74
+ invalidGrantTtlValue: (raw) => `Valor de cdp-direct.grant-ttl inválido: "${raw}". Usá un número entero de minutos (${MIN_GRANT_TTL_MINUTES}-${MAX_GRANT_TTL_MINUTES}) o "never".`,
75
+ grantTtlNever: 'nunca (los permisos no expiran hasta revocarlos — reduce la postura de seguridad)',
76
+ cdpDirectGrantTtlSetSaved: (label) => `cdp-direct.grant-ttl (valor por defecto para \`cdp allow\`) configurado a ${label}.`,
50
77
  },
51
78
  };
52
79
  /** One formatted line describing the current `idleTtlMinutes` state, shared
@@ -75,9 +102,42 @@ export function getFlowRecordingLine(language = 'en') {
75
102
  : t.flowRecordingDisabled;
76
103
  return ` ${t.flowRecordingLabel} ${value}`;
77
104
  }
105
+ /** One formatted line describing the current `cdpDirectEnabled` state. */
106
+ export function getCdpDirectEnabledLine(language = 'en') {
107
+ const t = CFG_I18N[language];
108
+ const cfg = loadConfig();
109
+ const value = cfg.cdpDirectEnabled === true ? t.cdpDirectOn : t.cdpDirectOff;
110
+ return ` ${t.cdpDirectEnabledLabel} ${value}`;
111
+ }
112
+ /** One formatted line describing the current `cdpDirectPort` state. */
113
+ export function getCdpDirectPortLine(language = 'en') {
114
+ const t = CFG_I18N[language];
115
+ const cfg = loadConfig();
116
+ return ` ${t.cdpDirectPortLabel} ${cfg.cdpDirectPort}`;
117
+ }
118
+ /** One formatted line describing the current `cdpDirectGrantTtlMinutes`
119
+ * state — the DEFAULT lifetime `browser-link cdp allow` applies when no
120
+ * `--minutes` override is passed, not the state of any grant itself (see
121
+ * `browser-link cdp status` for that). */
122
+ export function getCdpDirectGrantTtlLine(language = 'en') {
123
+ const t = CFG_I18N[language];
124
+ const cfg = loadConfig();
125
+ const value = cfg.cdpDirectGrantTtlMinutes === 0
126
+ ? t.grantTtlNever
127
+ : t.minutes(cfg.cdpDirectGrantTtlMinutes ?? 60);
128
+ return ` ${t.cdpDirectGrantTtlLabel} ${value}`;
129
+ }
78
130
  export function listConfig(language = 'en') {
79
131
  const t = CFG_I18N[language];
80
- return [t.header, '', getIdleTtlLine(language), getFlowRecordingLine(language)].join('\n');
132
+ return [
133
+ t.header,
134
+ '',
135
+ getIdleTtlLine(language),
136
+ getFlowRecordingLine(language),
137
+ getCdpDirectEnabledLine(language),
138
+ getCdpDirectPortLine(language),
139
+ getCdpDirectGrantTtlLine(language),
140
+ ].join('\n');
81
141
  }
82
142
  /**
83
143
  * Parse the CLI's raw `<minutes|never>` argument.
@@ -184,6 +244,99 @@ export async function setFlowRecording(rawValue, language = 'en', ipcOptions = {
184
244
  const pushMessage = await tryPushLive({ flowRecordingEnabled: enabled, flowRecordingUpdatedAt: updatedAt }, t, ipcOptions);
185
245
  return t.flowRecordingSetSaved(label) + pushMessage;
186
246
  }
247
+ /**
248
+ * Parse the CLI's raw `<true|false>` argument for
249
+ * `config set cdp-direct.enabled`. No IPC live-push counterpart — unlike
250
+ * idle-ttl/flow-recording, cdp-direct has no popup-side value to race
251
+ * against, so this only ever writes config.json.
252
+ */
253
+ function parseCdpDirectEnabledArg(raw, t) {
254
+ const normalized = raw.trim().toLowerCase();
255
+ if (['true', 'on', '1'].includes(normalized))
256
+ return true;
257
+ if (['false', 'off', '0'].includes(normalized))
258
+ return false;
259
+ throw new Error(t.invalidCdpDirectEnabledValue(raw));
260
+ }
261
+ export function setCdpDirectEnabled(rawValue, language = 'en') {
262
+ const t = CFG_I18N[language];
263
+ const enabled = parseCdpDirectEnabledArg(rawValue, t);
264
+ saveConfig({ cdpDirectEnabled: enabled });
265
+ return t.cdpDirectEnabledSetSaved(enabled ? t.cdpDirectOn : t.cdpDirectOff);
266
+ }
267
+ /** Parse the CLI's raw `<port>` argument for `config set cdp-direct.port`.
268
+ * Same "tell the user, don't guess" philosophy as `parseIdleTtlArg`: a
269
+ * genuinely unparsable value is rejected outright, an out-of-range integer
270
+ * is clamped to the boundary with a note. */
271
+ function parseCdpDirectPortArg(raw, t) {
272
+ const parsed = Number(raw.trim());
273
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
274
+ throw new Error(t.invalidCdpDirectPortValue(raw));
275
+ }
276
+ if (parsed < MIN_CDP_DIRECT_PORT || parsed > MAX_CDP_DIRECT_PORT) {
277
+ const clamped = Math.min(Math.max(parsed, MIN_CDP_DIRECT_PORT), MAX_CDP_DIRECT_PORT);
278
+ return { port: clamped, note: t.clampedNote(parsed, clamped) };
279
+ }
280
+ return { port: parsed, note: '' };
281
+ }
282
+ export function setCdpDirectPort(rawValue, language = 'en') {
283
+ const t = CFG_I18N[language];
284
+ const { port: parsedPort, note } = parseCdpDirectPortArg(rawValue, t);
285
+ const port = clampCdpDirectPort(parsedPort);
286
+ saveConfig({ cdpDirectPort: port });
287
+ return t.cdpDirectPortSetSaved(port) + note;
288
+ }
289
+ /**
290
+ * Parse the CLI's raw `<minutes|never>` argument for
291
+ * `config set cdp-direct.grant-ttl` — mirrors `parseIdleTtlArg` exactly,
292
+ * with the grant's own bounds/wording. Exported so `commands/cdp.ts` can
293
+ * reuse the SAME parsing for `cdp allow --minutes`'s per-call override —
294
+ * one implementation of "what counts as a valid TTL argument", not two
295
+ * that could drift.
296
+ */
297
+ export function parseGrantTtlArg(raw, t) {
298
+ const normalized = raw.trim().toLowerCase();
299
+ if (normalized === 'never' || normalized === '0')
300
+ return { minutes: 0, note: '' };
301
+ const parsed = Number(normalized);
302
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
303
+ throw new Error(t.invalidGrantTtlValue(raw));
304
+ }
305
+ if (parsed < MIN_GRANT_TTL_MINUTES || parsed > MAX_GRANT_TTL_MINUTES) {
306
+ const clamped = Math.min(Math.max(parsed, MIN_GRANT_TTL_MINUTES), MAX_GRANT_TTL_MINUTES);
307
+ return { minutes: clamped, note: t.clampedNote(parsed, clamped) };
308
+ }
309
+ return { minutes: parsed, note: '' };
310
+ }
311
+ export function setCdpDirectGrantTtl(rawValue, language = 'en') {
312
+ const t = CFG_I18N[language];
313
+ const { minutes: parsedMinutes, note } = parseGrantTtlArg(rawValue, t);
314
+ const minutes = clampGrantTtlMinutes(parsedMinutes);
315
+ saveConfig({ cdpDirectGrantTtlMinutes: minutes });
316
+ const label = (minutes === 0 ? t.grantTtlNever : t.minutes(minutes)) + note;
317
+ return t.cdpDirectGrantTtlSetSaved(label);
318
+ }
319
+ /** Config keys `cdp-direct.*` this module knows — shared by `get`/`set`
320
+ * dispatch below so the branching stays a lookup, not repeated equality
321
+ * chains. */
322
+ const CDP_DIRECT_KEYS = ['cdp-direct.enabled', 'cdp-direct.port', 'cdp-direct.grant-ttl'];
323
+ function isCdpDirectKey(key) {
324
+ return CDP_DIRECT_KEYS.includes(key);
325
+ }
326
+ function getCdpDirectLine(key, language) {
327
+ if (key === 'cdp-direct.enabled')
328
+ return getCdpDirectEnabledLine(language);
329
+ if (key === 'cdp-direct.port')
330
+ return getCdpDirectPortLine(language);
331
+ return getCdpDirectGrantTtlLine(language);
332
+ }
333
+ function setCdpDirectKey(key, value, language) {
334
+ if (key === 'cdp-direct.enabled')
335
+ return setCdpDirectEnabled(value, language);
336
+ if (key === 'cdp-direct.port')
337
+ return setCdpDirectPort(value, language);
338
+ return setCdpDirectGrantTtl(value, language);
339
+ }
187
340
  export async function runConfigCommand(argv, language = 'en') {
188
341
  const t = CFG_I18N[language];
189
342
  const action = argv.at(0);
@@ -196,16 +349,24 @@ export async function runConfigCommand(argv, language = 'en') {
196
349
  return getIdleTtlLine(language);
197
350
  if (key === 'flow-recording')
198
351
  return getFlowRecordingLine(language);
352
+ if (isCdpDirectKey(key))
353
+ return getCdpDirectLine(key, language);
199
354
  throw new Error(t.unknownKey(key));
200
355
  }
201
356
  if (action === 'set') {
202
357
  if (key === undefined)
203
358
  throw new Error(t.usage);
204
- if (key !== 'idle-ttl' && key !== 'flow-recording')
205
- throw new Error(t.unknownKey(key));
206
- if (value === undefined)
207
- throw new Error(t.usage);
208
- return key === 'idle-ttl' ? setIdleTtl(value, language) : setFlowRecording(value, language);
359
+ if (key === 'idle-ttl' || key === 'flow-recording') {
360
+ if (value === undefined)
361
+ throw new Error(t.usage);
362
+ return key === 'idle-ttl' ? setIdleTtl(value, language) : setFlowRecording(value, language);
363
+ }
364
+ if (isCdpDirectKey(key)) {
365
+ if (value === undefined)
366
+ throw new Error(t.usage);
367
+ return setCdpDirectKey(key, value, language);
368
+ }
369
+ throw new Error(t.unknownKey(key));
209
370
  }
210
371
  throw new Error(t.unknownAction(action));
211
372
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -70,6 +70,30 @@ export interface BrowserLinkConfig {
70
70
  * together, independent of the idle-TTL pair.
71
71
  */
72
72
  flowRecordingUpdatedAt?: number;
73
+ /**
74
+ * cdp-direct mode: let the server drive Chrome tabs DIRECTLY over a
75
+ * user-launched `--remote-debugging-port`, bypassing the extension
76
+ * entirely. Off by default and — even when on — gated behind a separate,
77
+ * explicit, time-boxed human grant (see `cdp/grant.ts`, `cdp/gate.ts`):
78
+ * an agent can never enable this itself, and enabling it here alone is
79
+ * NOT enough to let a tool touch a `cdp:` tab. Set via
80
+ * `browser-link config set cdp-direct.enabled <true|false>`.
81
+ */
82
+ cdpDirectEnabled?: boolean;
83
+ /**
84
+ * Loopback port the server dials for cdp-direct discovery/connections.
85
+ * The HOST is never configurable — always `127.0.0.1` — only the port
86
+ * is. Set via `browser-link config set cdp-direct.port <port>`.
87
+ */
88
+ cdpDirectPort?: number;
89
+ /**
90
+ * Default lifetime, in minutes, of a `browser-link cdp allow` grant when
91
+ * no `--minutes` override is passed on that command. `0` ("never") is
92
+ * allowed but reduces the security posture — documented as such in the
93
+ * CLI help and the README. Set via
94
+ * `browser-link config set cdp-direct.grant-ttl <minutes|never>`.
95
+ */
96
+ cdpDirectGrantTtlMinutes?: number;
73
97
  }
74
98
  /** Safety-rail bounds mirrored from the extension's `idle-policy.ts` — kept
75
99
  * as an independent copy (not a shared import) for the same reason
@@ -79,6 +103,52 @@ export interface BrowserLinkConfig {
79
103
  export declare const MIN_IDLE_TTL_MINUTES = 1;
80
104
  export declare const MAX_IDLE_TTL_MINUTES = 1440;
81
105
  export declare const DEFAULT_IDLE_TTL_MINUTES = 30;
106
+ /** cdp-direct bounds — same clamp-at-the-boundary philosophy as the
107
+ * idle-TTL constants above, independent copies since the two settings are
108
+ * unrelated. */
109
+ export declare const DEFAULT_CDP_DIRECT_PORT = 9222;
110
+ export declare const MIN_CDP_DIRECT_PORT = 1;
111
+ export declare const MAX_CDP_DIRECT_PORT = 65535;
112
+ export declare const MIN_GRANT_TTL_MINUTES = 1;
113
+ export declare const MAX_GRANT_TTL_MINUTES = 1440;
114
+ export declare const DEFAULT_GRANT_TTL_MINUTES = 60;
115
+ /** Defensive safety net for a `cdp-direct.grant-ttl` value THE USER NEVER
116
+ * TYPED (a corrupted config.json, a hand-edited file) — mirrors
117
+ * `clampIdleTtlMinutes` exactly: `0` ("never expires") passes through
118
+ * untouched, anything else malformed or out of range falls back to
119
+ * `DEFAULT_GRANT_TTL_MINUTES` rather than being snapped to the nearest
120
+ * boundary. `commands/cdp.ts` applies its own user-facing clamp-with-note
121
+ * for values typed at the CLI right now, the same split idle-ttl uses
122
+ * between this module and `commands/config.ts`. */
123
+ export declare function clampGrantTtlMinutes(value: number): number;
124
+ /** Same defensive-fallback philosophy as `clampGrantTtlMinutes`, for the
125
+ * cdp-direct port. No "never" sentinel here — a port is always a port.
126
+ * Used by the CLI `config set cdp-direct.port` path, where the value has
127
+ * already been parsed from a terminal argument. For the READ path — where
128
+ * the value comes straight from an untrusted config.json and is about to be
129
+ * interpolated into a URL — use `sanitizeCdpPort` instead. */
130
+ export declare function clampCdpDirectPort(value: number): number;
131
+ /**
132
+ * Trust-boundary sanitizer for the cdp-direct port. config.json is UNTRUSTED
133
+ * (hand-edited or corrupted), and the port is interpolated into
134
+ * `http://127.0.0.1:<port>/...` and `ws://127.0.0.1:<port>/...` discovery /
135
+ * connection URLs. A value like the STRING `"9222@attacker.com"` would, by
136
+ * URL userinfo syntax, resolve to host `attacker.com` — an off-host SSRF
137
+ * breakout despite the hardcoded loopback literal (the plain `?? 9222`
138
+ * fallback only ever caught null/undefined, never a malformed string).
139
+ *
140
+ * This coerces the raw value with `Number()` — NOT `parseInt`, which would
141
+ * read `"9222@attacker.com"` as `9222` and quietly accept it — and returns
142
+ * it ONLY when it is a whole port in `[1, 65535]`. Anything else (a string
143
+ * with trailing garbage, a float, `NaN`, out of range, a non-number) falls
144
+ * back to the default. The return is ALWAYS a fresh validated integer, never
145
+ * the raw value, so no attacker-controlled text can ever reach URL
146
+ * construction — this is also the numeric barrier that breaks CodeQL's
147
+ * `js/file-access-to-http` taint flow. Applied on every read (via
148
+ * `withDefaults`, so `cfg.cdpDirectPort` is valid by construction) AND again
149
+ * at each URL construction site as defense in depth.
150
+ */
151
+ export declare function sanitizeCdpPort(raw: unknown): number;
82
152
  /**
83
153
  * Clamp a CLI-provided idle-TTL value the same way the extension clamps a
84
154
  * stored one: `0` ("never") passes through untouched; a non-integer, an
package/dist/config.js CHANGED
@@ -10,6 +10,72 @@ import { sanitizeDisabledTools } from './permissions.js';
10
10
  export const MIN_IDLE_TTL_MINUTES = 1;
11
11
  export const MAX_IDLE_TTL_MINUTES = 1440;
12
12
  export const DEFAULT_IDLE_TTL_MINUTES = 30;
13
+ /** cdp-direct bounds — same clamp-at-the-boundary philosophy as the
14
+ * idle-TTL constants above, independent copies since the two settings are
15
+ * unrelated. */
16
+ export const DEFAULT_CDP_DIRECT_PORT = 9222;
17
+ export const MIN_CDP_DIRECT_PORT = 1;
18
+ export const MAX_CDP_DIRECT_PORT = 65535;
19
+ export const MIN_GRANT_TTL_MINUTES = 1;
20
+ export const MAX_GRANT_TTL_MINUTES = 1440;
21
+ export const DEFAULT_GRANT_TTL_MINUTES = 60;
22
+ /** Defensive safety net for a `cdp-direct.grant-ttl` value THE USER NEVER
23
+ * TYPED (a corrupted config.json, a hand-edited file) — mirrors
24
+ * `clampIdleTtlMinutes` exactly: `0` ("never expires") passes through
25
+ * untouched, anything else malformed or out of range falls back to
26
+ * `DEFAULT_GRANT_TTL_MINUTES` rather than being snapped to the nearest
27
+ * boundary. `commands/cdp.ts` applies its own user-facing clamp-with-note
28
+ * for values typed at the CLI right now, the same split idle-ttl uses
29
+ * between this module and `commands/config.ts`. */
30
+ export function clampGrantTtlMinutes(value) {
31
+ if (value === 0)
32
+ return 0;
33
+ if (!Number.isFinite(value) || !Number.isInteger(value))
34
+ return DEFAULT_GRANT_TTL_MINUTES;
35
+ if (value < MIN_GRANT_TTL_MINUTES || value > MAX_GRANT_TTL_MINUTES)
36
+ return DEFAULT_GRANT_TTL_MINUTES;
37
+ return value;
38
+ }
39
+ /** Same defensive-fallback philosophy as `clampGrantTtlMinutes`, for the
40
+ * cdp-direct port. No "never" sentinel here — a port is always a port.
41
+ * Used by the CLI `config set cdp-direct.port` path, where the value has
42
+ * already been parsed from a terminal argument. For the READ path — where
43
+ * the value comes straight from an untrusted config.json and is about to be
44
+ * interpolated into a URL — use `sanitizeCdpPort` instead. */
45
+ export function clampCdpDirectPort(value) {
46
+ if (!Number.isFinite(value) || !Number.isInteger(value))
47
+ return DEFAULT_CDP_DIRECT_PORT;
48
+ if (value < MIN_CDP_DIRECT_PORT || value > MAX_CDP_DIRECT_PORT)
49
+ return DEFAULT_CDP_DIRECT_PORT;
50
+ return value;
51
+ }
52
+ /**
53
+ * Trust-boundary sanitizer for the cdp-direct port. config.json is UNTRUSTED
54
+ * (hand-edited or corrupted), and the port is interpolated into
55
+ * `http://127.0.0.1:<port>/...` and `ws://127.0.0.1:<port>/...` discovery /
56
+ * connection URLs. A value like the STRING `"9222@attacker.com"` would, by
57
+ * URL userinfo syntax, resolve to host `attacker.com` — an off-host SSRF
58
+ * breakout despite the hardcoded loopback literal (the plain `?? 9222`
59
+ * fallback only ever caught null/undefined, never a malformed string).
60
+ *
61
+ * This coerces the raw value with `Number()` — NOT `parseInt`, which would
62
+ * read `"9222@attacker.com"` as `9222` and quietly accept it — and returns
63
+ * it ONLY when it is a whole port in `[1, 65535]`. Anything else (a string
64
+ * with trailing garbage, a float, `NaN`, out of range, a non-number) falls
65
+ * back to the default. The return is ALWAYS a fresh validated integer, never
66
+ * the raw value, so no attacker-controlled text can ever reach URL
67
+ * construction — this is also the numeric barrier that breaks CodeQL's
68
+ * `js/file-access-to-http` taint flow. Applied on every read (via
69
+ * `withDefaults`, so `cfg.cdpDirectPort` is valid by construction) AND again
70
+ * at each URL construction site as defense in depth.
71
+ */
72
+ export function sanitizeCdpPort(raw) {
73
+ const n = Number(raw);
74
+ if (Number.isInteger(n) && n >= MIN_CDP_DIRECT_PORT && n <= MAX_CDP_DIRECT_PORT) {
75
+ return n;
76
+ }
77
+ return DEFAULT_CDP_DIRECT_PORT;
78
+ }
13
79
  /**
14
80
  * Clamp a CLI-provided idle-TTL value the same way the extension clamps a
15
81
  * stored one: `0` ("never") passes through untouched; a non-integer, an
@@ -32,6 +98,7 @@ export function clampIdleTtlMinutes(value) {
32
98
  * when the user overrides the default, keeping the on-disk config minimal. */
33
99
  const DEFAULT_MULTI_AGENT = true;
34
100
  const DEFAULT_AUTO_REELECT = true;
101
+ const DEFAULT_CDP_DIRECT_ENABLED = false;
35
102
  function configFile() {
36
103
  return join(getDataDir(), 'config.json');
37
104
  }
@@ -43,7 +110,21 @@ function withDefaults(cfg) {
43
110
  // has no effect, so the effective value is forced to false to avoid any
44
111
  // ambiguity for the consumer.
45
112
  const autoReelect = multiAgent ? (cfg.autoReelect ?? DEFAULT_AUTO_REELECT) : false;
46
- return { ...cfg, multiAgent, autoReelect };
113
+ const cdpDirectEnabled = cfg.cdpDirectEnabled ?? DEFAULT_CDP_DIRECT_ENABLED;
114
+ // sanitizeCdpPort (not `?? DEFAULT`) so cfg.cdpDirectPort is ALWAYS a valid
115
+ // integer by construction — an untrusted config.json string that would
116
+ // otherwise reach a discovery URL is neutralized here, at the read
117
+ // boundary, for every consumer. See sanitizeCdpPort's doc.
118
+ const cdpDirectPort = sanitizeCdpPort(cfg.cdpDirectPort);
119
+ const cdpDirectGrantTtlMinutes = cfg.cdpDirectGrantTtlMinutes ?? DEFAULT_GRANT_TTL_MINUTES;
120
+ return {
121
+ ...cfg,
122
+ multiAgent,
123
+ autoReelect,
124
+ cdpDirectEnabled,
125
+ cdpDirectPort,
126
+ cdpDirectGrantTtlMinutes,
127
+ };
47
128
  }
48
129
  /** Strip fields that hold their default value before writing — the on-disk
49
130
  * config only carries explicit overrides. Keeps the file diff-friendly and
@@ -78,6 +159,18 @@ function normaliseForWrite(cfg) {
78
159
  const { autoReelect: _omit4, ...rest4 } = next;
79
160
  next = rest4;
80
161
  }
162
+ if (next.cdpDirectEnabled === DEFAULT_CDP_DIRECT_ENABLED) {
163
+ const { cdpDirectEnabled: _omit5, ...rest5 } = next;
164
+ next = rest5;
165
+ }
166
+ if (next.cdpDirectPort === DEFAULT_CDP_DIRECT_PORT) {
167
+ const { cdpDirectPort: _omit6, ...rest6 } = next;
168
+ next = rest6;
169
+ }
170
+ if (next.cdpDirectGrantTtlMinutes === DEFAULT_GRANT_TTL_MINUTES) {
171
+ const { cdpDirectGrantTtlMinutes: _omit7, ...rest7 } = next;
172
+ next = rest7;
173
+ }
81
174
  return next;
82
175
  }
83
176
  export function loadConfig() {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { runFlow, } from './flow.js';
5
5
  import { DEFAULT_IDLE_TTL_MINUTES, IDLE_TTL_STORAGE_KEY, IDLE_TTL_UPDATED_AT_STORAGE_KEY, clampIdleTtlMinutes, parseIncomingSettings, shouldAcceptIncomingSettings, shouldDisconnectForIdle, shouldScheduleIdleSweep, } from './idle-policy.js';
6
6
  import { DEFAULT_FLOW_RECORDING_ENABLED, FLOW_RECORDING_STORAGE_KEY, FLOW_RECORDING_UPDATED_AT_STORAGE_KEY, normalizeFlowRecordingEnabled, parseIncomingFlowRecordingSettings, } from './flow-recording-policy.js';
7
7
  import { buildRecorderJs, buildStopRecorderJs } from './inpage/recorder.js';
8
- import { appendRecordingStep, buildAmbiguousNote, buildNavigationWaitForStep, generateRecordingSession, isNavigationForRecording, parseRecordedPayload, toFlowStep, } from './recording.js';
8
+ import { DISCARDED_WHILE_SAVING_MESSAGE, appendRecordingStep, buildAmbiguousNote, buildNavigationWaitForStep, generateRecordingSession, isNavigationForRecording, isSameRecordingSession, parseRecordedPayload, toFlowStep, } from './recording.js';
9
9
  const WS_URL = 'ws://127.0.0.1:17529';
10
10
  const CDP_VERSION = '1.3';
11
11
  const CONSOLE_BUFFER_MAX = 200;
@@ -1776,9 +1776,31 @@ async function startRecording(tabId) {
1776
1776
  const session = generateRecordingSession();
1777
1777
  try {
1778
1778
  await cdp(tabId, 'Runtime.addBinding', { name: session.bindingName });
1779
+ }
1780
+ catch (err) {
1781
+ return {
1782
+ ok: false,
1783
+ error: `Could not start recording: ${err instanceof Error ? err.message : String(err)}`,
1784
+ };
1785
+ }
1786
+ try {
1779
1787
  await injectRecorder(tabId, session);
1780
1788
  }
1781
1789
  catch (err) {
1790
+ // The binding registered above is now orphaned — nothing else will ever
1791
+ // call Runtime.removeBinding for a session that never reached
1792
+ // `state.recording` (finishRecording, the normal binding-removal path,
1793
+ // only runs for a recording that actually started). Without this
1794
+ // rollback, every retried Record click after a failed injection (e.g. a
1795
+ // page CSP blocking the injected script) leaks another binding on the
1796
+ // same debugger session. Best-effort: a rollback failure must not mask
1797
+ // the original injection error the caller needs to see.
1798
+ try {
1799
+ await cdp(tabId, 'Runtime.removeBinding', { name: session.bindingName });
1800
+ }
1801
+ catch {
1802
+ // Tab likely already detached — nothing left to roll back.
1803
+ }
1782
1804
  return {
1783
1805
  ok: false,
1784
1806
  error: `Could not start recording: ${err instanceof Error ? err.message : String(err)}`,
@@ -1836,12 +1858,32 @@ async function stopRecording(tabId) {
1836
1858
  }
1837
1859
  /** Full teardown, dropping any captured-but-unsaved steps. Used by
1838
1860
  * Discard, by the "setting turned off mid-recording" force-stop, and by
1839
- * `cleanup`/disconnect. */
1861
+ * `cleanup`/disconnect.
1862
+ *
1863
+ * Also settles a `saveRecording` call still in flight for this tab, as a
1864
+ * failure — without this, `state.pendingFlowSave` would keep waiting for
1865
+ * the real `flow.recorded.result` (or the 10s timeout) after the recording
1866
+ * it belongs to is already gone, and its success continuation would run
1867
+ * LATER, re-clearing whatever recording state exists by then (see
1868
+ * `isSameRecordingSession` in recording.ts for the other half of this
1869
+ * fix — belt-and-braces against that same class of stale-continuation
1870
+ * bug). This is what makes Discard-while-saving actually inert on the
1871
+ * extension side instead of merely racing the real response.
1872
+ *
1873
+ * See `DISCARDED_WHILE_SAVING_MESSAGE`'s doc for the honest limitation:
1874
+ * this cannot retract a `flow.recorded` request the server already
1875
+ * received and persisted before this ran. */
1840
1876
  function clearRecording(tabId) {
1841
1877
  removeRecordingNavListener(tabId);
1842
1878
  const state = tabStates.get(tabId);
1843
- if (state)
1844
- state.recording = undefined;
1879
+ if (!state)
1880
+ return;
1881
+ state.recording = undefined;
1882
+ const pending = state.pendingFlowSave;
1883
+ if (pending) {
1884
+ state.pendingFlowSave = undefined;
1885
+ pending({ ok: false, error: DISCARDED_WHILE_SAVING_MESSAGE });
1886
+ }
1845
1887
  }
1846
1888
  /** Discard a recording without saving. The popup only exposes Discard from
1847
1889
  * the review panel (recorder already torn down by `finishRecording`), but
@@ -1908,6 +1950,11 @@ async function saveRecording(tabId, name, description) {
1908
1950
  : (ambiguousNote ?? userDescription);
1909
1951
  const ws = state.ws;
1910
1952
  const serverTabId = state.serverTabId;
1953
+ // Captured before the await below so the continuation can tell THIS
1954
+ // session apart from whatever `state.recording` holds once the server
1955
+ // round trip resolves — see `isSameRecordingSession`'s doc in
1956
+ // recording.ts.
1957
+ const sessionNonce = recording.nonce;
1911
1958
  const result = await new Promise((resolve) => {
1912
1959
  let settled = false;
1913
1960
  const settle = (r) => {
@@ -1934,8 +1981,14 @@ async function saveRecording(tabId, name, description) {
1934
1981
  settle({ ok: false, error: 'Timed out waiting for the server.' });
1935
1982
  }, 10_000);
1936
1983
  });
1937
- if (result.ok)
1984
+ // The identity check guards against a Discard-then-Record race: Discard
1985
+ // already settles `pendingFlowSave` synchronously (see `clearRecording`),
1986
+ // so `result.ok` alone would normally be enough — this check is
1987
+ // belt-and-braces for the same class of bug in case a NEW recording
1988
+ // session is now live on this tab by the time the real response lands.
1989
+ if (result.ok && isSameRecordingSession(state.recording?.nonce, sessionNonce)) {
1938
1990
  clearRecording(tabId);
1991
+ }
1939
1992
  return result;
1940
1993
  }
1941
1994
  async function respondToDialogFromPopup(tabId, accept, promptText) {