@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.
- package/README.md +5 -0
- package/dist/agent-instructions/content.js +11 -0
- package/dist/agent-instructions/content.js.map +1 -1
- package/dist/bridge/ws-bridge.js +13 -0
- package/dist/bridge/ws-bridge.js.map +1 -1
- package/dist/cdp/client.d.ts +35 -0
- package/dist/cdp/client.js +149 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/flow.d.ts +178 -0
- package/dist/cdp/flow.js +217 -0
- package/dist/cdp/flow.js.map +1 -0
- package/dist/cdp/gate.d.ts +31 -0
- package/dist/cdp/gate.js +35 -0
- package/dist/cdp/gate.js.map +1 -0
- package/dist/cdp/grant.d.ts +45 -0
- package/dist/cdp/grant.js +81 -0
- package/dist/cdp/grant.js.map +1 -0
- package/dist/cdp/inpage/builders.d.ts +165 -0
- package/dist/cdp/inpage/builders.js +501 -0
- package/dist/cdp/inpage/builders.js.map +1 -0
- package/dist/cdp/inpage/deep-query.d.ts +57 -0
- package/dist/cdp/inpage/deep-query.js +325 -0
- package/dist/cdp/inpage/deep-query.js.map +1 -0
- package/dist/cdp/inpage/dom-helpers.d.ts +27 -0
- package/dist/cdp/inpage/dom-helpers.js +147 -0
- package/dist/cdp/inpage/dom-helpers.js.map +1 -0
- package/dist/cdp/keymap.d.ts +83 -0
- package/dist/cdp/keymap.js +205 -0
- package/dist/cdp/keymap.js.map +1 -0
- package/dist/cdp/settle.d.ts +38 -0
- package/dist/cdp/settle.js +76 -0
- package/dist/cdp/settle.js.map +1 -0
- package/dist/cdp/support.d.ts +26 -0
- package/dist/cdp/support.js +58 -0
- package/dist/cdp/support.js.map +1 -0
- package/dist/cdp/targets.d.ts +54 -0
- package/dist/cdp/targets.js +176 -0
- package/dist/cdp/targets.js.map +1 -0
- package/dist/cdp/transport.d.ts +31 -0
- package/dist/cdp/transport.js +531 -0
- package/dist/cdp/transport.js.map +1 -0
- package/dist/cli.js +50 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.js +13 -0
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/cdp.d.ts +28 -0
- package/dist/commands/cdp.js +172 -0
- package/dist/commands/cdp.js.map +1 -0
- package/dist/commands/config.d.ts +92 -0
- package/dist/commands/config.js +173 -12
- package/dist/commands/config.js.map +1 -1
- package/dist/config.d.ts +70 -0
- package/dist/config.js +94 -1
- package/dist/config.js.map +1 -1
- package/dist/extension/background.js +58 -5
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/inpage/recorder.js +25 -0
- package/dist/extension/inpage/recorder.js.map +1 -1
- package/dist/extension/manifest.json +1 -1
- package/dist/extension/recording.d.ts +39 -3
- package/dist/extension/recording.js +57 -3
- package/dist/extension/recording.js.map +1 -1
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/browser-definitions.js +4 -3
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/browser-dispatch.d.ts +31 -0
- package/dist/tools/browser-dispatch.js +88 -40
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/dist/tools/server-instructions.js +19 -0
- package/dist/tools/server-instructions.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/config.js
CHANGED
|
@@ -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
|
-
|
|
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 [
|
|
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
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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":"AAAA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAqE/C;;sEAEsE;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAiC;IACpD,EAAE,EAAE;QACF,MAAM,EAAE,qBAAqB;QAC7B,YAAY,EAAE,UAAU;QACxB,KAAK,EAAE,kCAAkC;QACzC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM;QAC1B,YAAY,EACV,yGAAyG;QAC3G,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CACpB,4BAA4B,GAAG,qCAAqC,oBAAoB,IAAI,oBAAoB,eAAe;QACjI,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,kBAAkB,QAAQ,OAAO,OAAO,GAAG;QAC/E,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,8BAA8B,KAAK,GAAG;QAC3D,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,oBAAoB;QAClE,UAAU,EAAE,8EAA8E;QAC1F,eAAe,EACb,yIAAyI;QAC3I,YAAY,EACV,yKAAyK;QAC3K,KAAK,EACH,iYAAiY;QACnY,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAClB,uBAAuB,GAAG,oGAAoG;QAChI,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,0BAA0B,MAAM,mBAAmB;QAC9E,kBAAkB,EAAE,gBAAgB;QACpC,oBAAoB,EAAE,SAAS;QAC/B,qBAAqB,EAAE,UAAU;QACjC,yBAAyB,EACvB,sGAAsG;QACxG,yBAAyB,EAAE,CAAC,GAAG,EAAE,EAAE,CACjC,kCAAkC,GAAG,uBAAuB;QAC9D,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,yBAAyB,KAAK,GAAG;QACnE,qBAAqB,EAAE,oBAAoB;QAC3C,kBAAkB,EAAE,iBAAiB;QACrC,sBAAsB,EAAE,sBAAsB;QAC9C,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,eAAe;QAC7B,4BAA4B,EAAE,CAAC,GAAG,EAAE,EAAE,CACpC,sCAAsC,GAAG,2BAA2B;QACtE,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,CAClC,6BAA6B,KAAK,sGAAsG;QAC1I,yBAAyB,EAAE,CAAC,GAAG,EAAE,EAAE,CACjC,mCAAmC,GAAG,0BAA0B,mBAAmB,IAAI,mBAAmB,IAAI;QAChH,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,0BAA0B,IAAI,GAAG;QAClE,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAC5B,wCAAwC,GAAG,qCAAqC,qBAAqB,IAAI,qBAAqB,eAAe;QAC/I,aAAa,EAAE,0EAA0E;QACzF,yBAAyB,EAAE,CAAC,KAAK,EAAE,EAAE,CACnC,2DAA2D,KAAK,GAAG;KACtE;IACD,EAAE,EAAE;QACF,MAAM,EAAE,+BAA+B;QACvC,YAAY,EAAE,UAAU;QACxB,KAAK,EAAE,wCAAwC;QAC/C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM;QAC1B,YAAY,EACV,kJAAkJ;QACpJ,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CACpB,gCAAgC,GAAG,uCAAuC,oBAAoB,IAAI,oBAAoB,cAAc;QACtI,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,QAAQ,MAAM,OAAO,GAAG;QAC7E,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,yCAAyC,KAAK,GAAG;QACtE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,4BAA4B,CAAC,2BAA2B;QAC3E,UAAU,EACR,0FAA0F;QAC5F,eAAe,EACb,gLAAgL;QAClL,YAAY,EACV,6MAA6M;QAC/M,KAAK,EACH,iYAAiY;QACnY,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAClB,uCAAuC,GAAG,0GAA0G;QACtJ,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,iCAAiC,MAAM,kBAAkB;QACpF,kBAAkB,EAAE,gBAAgB;QACpC,oBAAoB,EAAE,YAAY;QAClC,qBAAqB,EAAE,eAAe;QACtC,yBAAyB,EACvB,2JAA2J;QAC7J,yBAAyB,EAAE,CAAC,GAAG,EAAE,EAAE,CACjC,sCAAsC,GAAG,sBAAsB;QACjE,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,oCAAoC,KAAK,GAAG;QAC9E,qBAAqB,EAAE,oBAAoB;QAC3C,kBAAkB,EAAE,iBAAiB;QACrC,sBAAsB,EAAE,sBAAsB;QAC9C,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,2BAA2B;QACzC,4BAA4B,EAAE,CAAC,GAAG,EAAE,EAAE,CACpC,0CAA0C,GAAG,0BAA0B;QACzE,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,CAClC,oCAAoC,KAAK,8HAA8H;QACzK,yBAAyB,EAAE,CAAC,GAAG,EAAE,EAAE,CACjC,uCAAuC,GAAG,4BAA4B,mBAAmB,IAAI,mBAAmB,IAAI;QACtH,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,iCAAiC,IAAI,GAAG;QACzE,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAC5B,4CAA4C,GAAG,uCAAuC,qBAAqB,IAAI,qBAAqB,cAAc;QACpJ,aAAa,EACX,mFAAmF;QACrF,yBAAyB,EAAE,CAAC,KAAK,EAAE,EAAE,CACnC,6EAA6E,KAAK,GAAG;KACxF;CACF,CAAC;AAEF;;sBAEsB;AACtB,MAAM,UAAU,cAAc,CAAC,WAAqB,IAAI;IACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,KAAK,GACT,GAAG,CAAC,cAAc,KAAK,SAAS;QAC9B,CAAC,CAAC,CAAC,CAAC,YAAY;QAChB,CAAC,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC;YACxB,CAAC,CAAC,CAAC,CAAC,KAAK;YACT,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,CAAC,YAAY,MAAM,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED;;kCAEkC;AAClC,MAAM,UAAU,oBAAoB,CAAC,WAAqB,IAAI;IAC5D,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,KAAK,GACT,GAAG,CAAC,oBAAoB,KAAK,SAAS;QACpC,CAAC,CAAC,CAAC,CAAC,yBAAyB;QAC7B,CAAC,CAAC,GAAG,CAAC,oBAAoB;YACxB,CAAC,CAAC,CAAC,CAAC,oBAAoB;YACxB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,kBAAkB,MAAM,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,uBAAuB,CAAC,WAAqB,IAAI;IAC/D,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC7E,OAAO,KAAK,CAAC,CAAC,qBAAqB,MAAM,KAAK,EAAE,CAAC;AACnD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,WAAqB,IAAI;IAC5D,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,KAAK,CAAC,CAAC,kBAAkB,UAAU,GAAG,CAAC,aAAa,EAAE,CAAC;AAChE,CAAC;AAED;;;0CAG0C;AAC1C,MAAM,UAAU,wBAAwB,CAAC,WAAqB,IAAI;IAChE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,KAAK,GACT,GAAG,CAAC,wBAAwB,KAAK,CAAC;QAChC,CAAC,CAAC,CAAC,CAAC,aAAa;QACjB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,sBAAsB,MAAM,KAAK,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAqB,IAAI;IAClD,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO;QACL,CAAC,CAAC,MAAM;QACR,EAAE;QACF,cAAc,CAAC,QAAQ,CAAC;QACxB,oBAAoB,CAAC,QAAQ,CAAC;QAC9B,uBAAuB,CAAC,QAAQ,CAAC;QACjC,oBAAoB,CAAC,QAAQ,CAAC;QAC9B,wBAAwB,CAAC,QAAQ,CAAC;KACnC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,eAAe,CAAC,GAAW,EAAE,CAAa;IACjD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,GAAG,oBAAoB,IAAI,MAAM,GAAG,oBAAoB,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACvF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACvC,CAAC;AAYD;;;;;;;;;;6EAU6E;AAC7E,KAAK,UAAU,WAAW,CACxB,QAKC,EACD,CAAa,EACb,aAA6B,EAAE;IAE/B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,eAAe,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;YAC1B,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8DAA8D;QAC9D,gEAAgE;QAChE,mEAAmE;QACnE,qEAAqE;QACrE,IAAI,GAAG,YAAY,cAAc,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACnE,OAAO,CAAC,CAAC,YAAY,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,CAAC,eAAe,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;YACnC,iBAAiB;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,WAAqB,IAAI,EACzB,aAA6B,EAAE;IAE/B,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,uEAAuE;IACvE,yEAAyE;IACzE,0EAA0E;IAC1E,qDAAqD;IACrD,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IACpE,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7F,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAW,EAAE,CAAa;IACvD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,WAAqB,IAAI,EACzB,aAA6B,EAAE;IAE/B,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,oBAAoB,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAAC;IAEjF,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;IACzE,MAAM,WAAW,GAAG,MAAM,WAAW,CACnC,EAAE,oBAAoB,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,EACpE,CAAC,EACD,UAAU,CACX,CAAC;IACF,OAAO,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,SAAS,wBAAwB,CAAC,GAAW,EAAE,CAAa;IAC1D,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,WAAqB,IAAI;IAC7E,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC9E,CAAC;AAED;;;6CAG6C;AAC7C,SAAS,qBAAqB,CAAC,GAAW,EAAE,CAAa;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,GAAG,mBAAmB,IAAI,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACrF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,WAAqB,IAAI;IAC1E,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC5C,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,CAAa;IACzD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,GAAG,qBAAqB,IAAI,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACzF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,WAAqB,IAAI;IAC9E,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACpD,UAAU,CAAC,EAAE,wBAAwB,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5E,OAAO,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;aAEa;AACb,MAAM,eAAe,GAAG,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,sBAAsB,CAAU,CAAC;AAGnG,SAAS,cAAc,CAAC,GAAW;IACjC,OAAQ,eAAqC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAiB,EAAE,QAAkB;IAC7D,IAAI,GAAG,KAAK,oBAAoB;QAAE,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3E,IAAI,GAAG,KAAK,iBAAiB;QAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACrE,OAAO,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe,CAAC,GAAiB,EAAE,KAAa,EAAE,QAAkB;IAC3E,IAAI,GAAG,KAAK,oBAAoB;QAAE,OAAO,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9E,IAAI,GAAG,KAAK,iBAAiB;QAAE,OAAO,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxE,OAAO,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc,EAAE,WAAqB,IAAI;IAC9E,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7C,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,GAAG,KAAK,UAAU;YAAE,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,GAAG,KAAK,gBAAgB;YAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,cAAc,CAAC,GAAG,CAAC;YAAE,OAAO,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
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
|
-
|
|
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() {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|