@jobshimo/browser-link 0.18.3 → 0.19.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 +2 -2
- package/dist/bridge/ipc-client.d.ts +17 -0
- package/dist/bridge/ipc-client.js +42 -0
- package/dist/bridge/ipc-client.js.map +1 -1
- package/dist/bridge/protocol.d.ts +28 -1
- package/dist/bridge/protocol.js +17 -0
- package/dist/bridge/protocol.js.map +1 -1
- package/dist/bridge/server.d.ts +13 -0
- package/dist/bridge/server.js +10 -0
- package/dist/bridge/server.js.map +1 -1
- package/dist/bridge/ws-bridge.d.ts +32 -0
- package/dist/bridge/ws-bridge.js +52 -1
- package/dist/bridge/ws-bridge.js.map +1 -1
- package/dist/cli.js +23 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.js +64 -43
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +158 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/extension.js +2 -2
- package/dist/commands/extension.js.map +1 -1
- package/dist/commands/welcome.js +5 -5
- package/dist/commands/welcome.js.map +1 -1
- package/dist/config.d.ts +38 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -1
- package/dist/extension/background.js +126 -29
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/idle-policy.d.ts +106 -0
- package/dist/extension/idle-policy.js +132 -0
- package/dist/extension/idle-policy.js.map +1 -0
- package/dist/extension/manifest.json +1 -1
- package/dist/extension/popup.d.ts +1 -38
- package/dist/extension/popup.html +45 -0
- package/dist/extension/popup.js +87 -5
- package/dist/extension/popup.js.map +1 -1
- package/dist/messages.d.ts +26 -1
- package/dist/server.js +7 -2
- package/dist/server.js.map +1 -1
- package/dist/ui/screens/extension.js +2 -2
- package/dist/ui/screens/extension.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/about.js
CHANGED
|
@@ -10,17 +10,17 @@ export const I18N_ABOUT = {
|
|
|
10
10
|
'It is split in two pieces:',
|
|
11
11
|
' 1) This Node binary, the MCP server the client spawns over stdio.',
|
|
12
12
|
' 2) A small Chrome extension that you load manually. The extension',
|
|
13
|
-
' stays inert on every tab until you press "
|
|
14
|
-
' can enable as many tabs as you want, one by one. Tabs
|
|
15
|
-
' connect remain invisible to the agent.',
|
|
13
|
+
' stays inert on every tab until you press "Connect this tab" on',
|
|
14
|
+
' it. You can enable as many tabs as you want, one by one. Tabs',
|
|
15
|
+
' you do not connect remain invisible to the agent.',
|
|
16
16
|
].join('\n'),
|
|
17
17
|
howTitle: 'How does it work?',
|
|
18
18
|
how: [
|
|
19
19
|
'The Node binary listens on 127.0.0.1:17529 (loopback only — never on',
|
|
20
|
-
'a public interface). Each tab where you press "
|
|
21
|
-
'own WebSocket to that port and registers a tab_id. From
|
|
22
|
-
'on, the agent can call tools targeting that tab_id, and
|
|
23
|
-
'forwards each request to the extension over the WebSocket.',
|
|
20
|
+
'a public interface). Each tab where you press "Connect this tab"',
|
|
21
|
+
'opens its own WebSocket to that port and registers a tab_id. From',
|
|
22
|
+
'that moment on, the agent can call tools targeting that tab_id, and',
|
|
23
|
+
'the server forwards each request to the extension over the WebSocket.',
|
|
24
24
|
].join('\n'),
|
|
25
25
|
bindingTitle: 'Process binding (zero-config defense)',
|
|
26
26
|
binding: [
|
|
@@ -37,21 +37,31 @@ export const I18N_ABOUT = {
|
|
|
37
37
|
].join('\n'),
|
|
38
38
|
bridgeToolsTitle: 'Tools the agent gets over the bridge',
|
|
39
39
|
bridgeTools: [
|
|
40
|
-
' browser.list_tabs
|
|
41
|
-
' browser.
|
|
42
|
-
' browser.
|
|
43
|
-
' browser.
|
|
44
|
-
' browser.
|
|
40
|
+
' browser.list_tabs list connected tabs',
|
|
41
|
+
' browser.my_tabs list tabs claimed by the calling agent',
|
|
42
|
+
' browser.ping check the bridge to a tab',
|
|
43
|
+
' browser.snapshot dump title, url, text and interactive elements (filterable)',
|
|
44
|
+
' browser.find locate an element by visible text — selector + coords',
|
|
45
|
+
' browser.state compact orientation snapshot — focused element, dialogs, scroll',
|
|
45
46
|
' browser.canvas_screenshot capture a <canvas> as PNG/JPEG (Qt-WASM, WebGL, DOMless pages)',
|
|
46
|
-
' browser.
|
|
47
|
-
' browser.
|
|
48
|
-
' browser.
|
|
49
|
-
' browser.
|
|
50
|
-
' browser.
|
|
51
|
-
' browser.
|
|
52
|
-
' browser.
|
|
53
|
-
' browser.
|
|
54
|
-
' browser.
|
|
47
|
+
' browser.console recent console messages (rolling 200)',
|
|
48
|
+
' browser.network recent network requests (rolling 200)',
|
|
49
|
+
' browser.network_body fetch the body of a specific request',
|
|
50
|
+
' browser.wait_for wait for a selector, JS expression, or network request',
|
|
51
|
+
' browser.wait_for_tab wait for a popup/window.open tab and auto-claim it',
|
|
52
|
+
' browser.events bridge lifecycle log (tab renamed/registered/claimed, …)',
|
|
53
|
+
' browser.navigate change the tab URL',
|
|
54
|
+
' browser.click click an element by CSS selector (occlusion-checked)',
|
|
55
|
+
' browser.type type into an input',
|
|
56
|
+
' browser.press press a key (trusted CDP input, not synthetic)',
|
|
57
|
+
' browser.drag drag an element to another element or coordinate',
|
|
58
|
+
' browser.flow run a find/click/type/press/wait_for sequence in one call',
|
|
59
|
+
' browser.evaluate run JavaScript in the page context',
|
|
60
|
+
' browser.dialog_respond answer a pending alert/confirm/prompt',
|
|
61
|
+
' browser.set_permission grant/deny a browser permission for an origin',
|
|
62
|
+
' browser.claim_tab reserve a tab for the calling agent',
|
|
63
|
+
' browser.release_tab release a tab claim',
|
|
64
|
+
' browser.reset soft-reset the bridge (drop tabs, claims, events)',
|
|
55
65
|
].join('\n'),
|
|
56
66
|
mapToolsTitle: 'Persistent UI map (private, on your machine)',
|
|
57
67
|
mapTools: [
|
|
@@ -107,18 +117,19 @@ export const I18N_ABOUT = {
|
|
|
107
117
|
' 1) Este binario de Node, el servidor MCP que el cliente arranca',
|
|
108
118
|
' por stdio.',
|
|
109
119
|
' 2) Una pequeña extensión de Chrome que cargás vos a mano. La',
|
|
110
|
-
' extensión queda inerte en cada pestaña hasta que pulsás',
|
|
111
|
-
' "
|
|
112
|
-
' quieras, una por una. Las pestañas que no conectes
|
|
113
|
-
' invisibles al agente.',
|
|
120
|
+
' extensión queda inerte en cada pestaña hasta que pulsás el',
|
|
121
|
+
' botón "Connect this tab" sobre ella. Podés habilitar todas las',
|
|
122
|
+
' pestañas que quieras, una por una. Las pestañas que no conectes',
|
|
123
|
+
' siguen invisibles al agente.',
|
|
114
124
|
].join('\n'),
|
|
115
125
|
howTitle: '¿Cómo funciona?',
|
|
116
126
|
how: [
|
|
117
127
|
'El binario de Node escucha en 127.0.0.1:17529 (solo loopback — nunca',
|
|
118
|
-
'en una interfaz pública). Cada pestaña donde pulsás
|
|
119
|
-
'su propio WebSocket contra ese puerto y se
|
|
120
|
-
'Desde ahí, el agente puede llamar
|
|
121
|
-
'tab_id y el servidor reenvía cada
|
|
128
|
+
'en una interfaz pública). Cada pestaña donde pulsás el botón',
|
|
129
|
+
'"Connect this tab" abre su propio WebSocket contra ese puerto y se',
|
|
130
|
+
'registra con un tab_id. Desde ahí, el agente puede llamar',
|
|
131
|
+
'herramientas que apuntan a ese tab_id y el servidor reenvía cada',
|
|
132
|
+
'petición a la extensión.',
|
|
122
133
|
].join('\n'),
|
|
123
134
|
bindingTitle: 'Validación por proceso (sin configuración)',
|
|
124
135
|
binding: [
|
|
@@ -136,21 +147,31 @@ export const I18N_ABOUT = {
|
|
|
136
147
|
].join('\n'),
|
|
137
148
|
bridgeToolsTitle: 'Herramientas que el agente expone vía el puente',
|
|
138
149
|
bridgeTools: [
|
|
139
|
-
' browser.list_tabs
|
|
140
|
-
' browser.
|
|
141
|
-
' browser.
|
|
142
|
-
' browser.
|
|
143
|
-
' browser.
|
|
150
|
+
' browser.list_tabs listar pestañas conectadas',
|
|
151
|
+
' browser.my_tabs listar pestañas reclamadas por el agente que llama',
|
|
152
|
+
' browser.ping comprobar el puente a una pestaña',
|
|
153
|
+
' browser.snapshot volcar título, url, texto y elementos interactivos (filtrable)',
|
|
154
|
+
' browser.find localizar un elemento por texto visible — selector + coords',
|
|
155
|
+
' browser.state instantánea de orientación — elemento enfocado, diálogos, scroll',
|
|
144
156
|
' browser.canvas_screenshot capturar un <canvas> como PNG/JPEG (Qt-WASM, WebGL, sin DOM)',
|
|
145
|
-
' browser.
|
|
146
|
-
' browser.
|
|
147
|
-
' browser.
|
|
148
|
-
' browser.
|
|
149
|
-
' browser.
|
|
150
|
-
' browser.
|
|
151
|
-
' browser.
|
|
152
|
-
' browser.
|
|
153
|
-
' browser.
|
|
157
|
+
' browser.console mensajes recientes de consola (200 últimos)',
|
|
158
|
+
' browser.network peticiones de red recientes (200 últimas)',
|
|
159
|
+
' browser.network_body traer el body de una petición concreta',
|
|
160
|
+
' browser.wait_for esperar un selector, expresión JS o petición de red',
|
|
161
|
+
' browser.wait_for_tab esperar una pestaña emergente (window.open) y reclamarla',
|
|
162
|
+
' browser.events log de eventos del puente (pestaña renombrada/registrada/…)',
|
|
163
|
+
' browser.navigate cambiar la URL de la pestaña',
|
|
164
|
+
' browser.click hacer click en un elemento por CSS selector (con chequeo de oclusión)',
|
|
165
|
+
' browser.type escribir en un input',
|
|
166
|
+
' browser.press presionar una tecla (input CDP confiable, no sintético)',
|
|
167
|
+
' browser.drag arrastrar un elemento hacia otro elemento o coordenada',
|
|
168
|
+
' browser.flow encadenar find/click/type/press/wait_for en una sola llamada',
|
|
169
|
+
' browser.evaluate ejecutar JavaScript en el contexto de la página',
|
|
170
|
+
' browser.dialog_respond responder un alert/confirm/prompt pendiente',
|
|
171
|
+
' browser.set_permission otorgar/denegar un permiso del navegador para un origen',
|
|
172
|
+
' browser.claim_tab reservar una pestaña para el agente que llama',
|
|
173
|
+
' browser.release_tab liberar una reclamación de pestaña',
|
|
174
|
+
' browser.reset reiniciar el puente (soltar pestañas, reclamos, eventos)',
|
|
154
175
|
].join('\n'),
|
|
155
176
|
mapToolsTitle: 'Mapa de UI persistente (privado, en tu máquina)',
|
|
156
177
|
mapTools: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,UAAU,GAAgC;IACrD,EAAE,EAAE;QACF,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,eAAe;QAC1B,IAAI,EAAE;YACJ,oEAAoE;YACpE,qEAAqE;YACrE,kEAAkE;YAClE,EAAE;YACF,4BAA4B;YAC5B,qEAAqE;YACrE,qEAAqE;YACrE,qEAAqE;YACrE,
|
|
1
|
+
{"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Language } from './welcome.js';
|
|
2
|
+
/** One formatted line describing the current `idleTtlMinutes` state, shared
|
|
3
|
+
* by both `config get` (no key — lists everything) and `config get idle-ttl`
|
|
4
|
+
* (just this one). */
|
|
5
|
+
export declare function getIdleTtlLine(language?: Language): string;
|
|
6
|
+
export declare function listConfig(language?: Language): string;
|
|
7
|
+
/** Override the IPC endpoint the live push dials. Production callers never
|
|
8
|
+
* set this (defaults to the real 127.0.0.1:17530); tests spin up an
|
|
9
|
+
* ephemeral IpcServer (port: 0) and pass its bound port so the push path
|
|
10
|
+
* is exercised against a real socket instead of always short-circuiting on
|
|
11
|
+
* "no primary reachable". */
|
|
12
|
+
export interface IpcPushOptions {
|
|
13
|
+
host?: string;
|
|
14
|
+
port?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function setIdleTtl(rawValue: string, language?: Language, ipcOptions?: IpcPushOptions): Promise<string>;
|
|
17
|
+
export declare function runConfigCommand(argv: string[], language?: Language): Promise<string>;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { MAX_IDLE_TTL_MINUTES, MIN_IDLE_TTL_MINUTES, clampIdleTtlMinutes, loadConfig, saveConfig, } from '../config.js';
|
|
2
|
+
import { HandshakeError, IpcClient } from '../bridge/ipc-client.js';
|
|
3
|
+
import { readToken } from '../bridge/token.js';
|
|
4
|
+
const CFG_I18N = {
|
|
5
|
+
en: {
|
|
6
|
+
header: 'browser-link config',
|
|
7
|
+
idleTtlLabel: 'idle-ttl',
|
|
8
|
+
never: 'never (auto-disconnect disabled)',
|
|
9
|
+
minutes: (n) => `${n} min`,
|
|
10
|
+
notSetViaCli: "not set via CLI — the extension's own default/popup choice applies (30 min unless changed in the popup)",
|
|
11
|
+
invalidValue: (raw) => `Invalid idle-ttl value: "${raw}". Use a whole number of minutes (${MIN_IDLE_TTL_MINUTES}-${MAX_IDLE_TTL_MINUTES}) or "never".`,
|
|
12
|
+
clampedNote: (original, clamped) => ` (clamped from ${original} to ${clamped})`,
|
|
13
|
+
setSaved: (label) => `Idle-disconnect TTL set to ${label}.`,
|
|
14
|
+
pushedLive: (n) => ` Pushed immediately to ${n} connected tab(s).`,
|
|
15
|
+
pushedNone: ' No tabs are currently connected — it will apply the next time one connects.',
|
|
16
|
+
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
|
+
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] | browser-link config set idle-ttl <minutes|never>',
|
|
19
|
+
unknownKey: (key) => `Unknown config key: ${key}. Known keys: idle-ttl.`,
|
|
20
|
+
unknownAction: (action) => `Unknown config action: ${action}. Use get or set.`,
|
|
21
|
+
},
|
|
22
|
+
es: {
|
|
23
|
+
header: 'Configuración de browser-link',
|
|
24
|
+
idleTtlLabel: 'idle-ttl',
|
|
25
|
+
never: 'nunca (auto-desconexión deshabilitada)',
|
|
26
|
+
minutes: (n) => `${n} min`,
|
|
27
|
+
notSetViaCli: 'no configurado por CLI — se aplica el valor por defecto o el elegido en el popup de la extensión (30 min salvo que se haya cambiado en el popup)',
|
|
28
|
+
invalidValue: (raw) => `Valor de idle-ttl inválido: "${raw}". Usá un número entero de minutos (${MIN_IDLE_TTL_MINUTES}-${MAX_IDLE_TTL_MINUTES}) o "never".`,
|
|
29
|
+
clampedNote: (original, clamped) => ` (ajustado de ${original} a ${clamped})`,
|
|
30
|
+
setSaved: (label) => `TTL de auto-desconexión configurado a ${label}.`,
|
|
31
|
+
pushedLive: (n) => ` Aplicado de inmediato a ${n} pestaña(s) conectada(s).`,
|
|
32
|
+
pushedNone: ' No hay pestañas conectadas actualmente — se aplicará la próxima vez que una se conecte.',
|
|
33
|
+
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.',
|
|
34
|
+
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.',
|
|
35
|
+
usage: 'Uso: browser-link config get [idle-ttl] | browser-link config set idle-ttl <minutos|never>',
|
|
36
|
+
unknownKey: (key) => `Clave de configuración desconocida: ${key}. Claves conocidas: idle-ttl.`,
|
|
37
|
+
unknownAction: (action) => `Acción de config desconocida: ${action}. Usá get o set.`,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/** One formatted line describing the current `idleTtlMinutes` state, shared
|
|
41
|
+
* by both `config get` (no key — lists everything) and `config get idle-ttl`
|
|
42
|
+
* (just this one). */
|
|
43
|
+
export function getIdleTtlLine(language = 'en') {
|
|
44
|
+
const t = CFG_I18N[language];
|
|
45
|
+
const cfg = loadConfig();
|
|
46
|
+
const value = cfg.idleTtlMinutes === undefined
|
|
47
|
+
? t.notSetViaCli
|
|
48
|
+
: cfg.idleTtlMinutes === 0
|
|
49
|
+
? t.never
|
|
50
|
+
: t.minutes(cfg.idleTtlMinutes);
|
|
51
|
+
return ` ${t.idleTtlLabel} ${value}`;
|
|
52
|
+
}
|
|
53
|
+
export function listConfig(language = 'en') {
|
|
54
|
+
const t = CFG_I18N[language];
|
|
55
|
+
return [t.header, '', getIdleTtlLine(language)].join('\n');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse the CLI's raw `<minutes|never>` argument.
|
|
59
|
+
*
|
|
60
|
+
* Distinct from `clampIdleTtlMinutes` (config.ts) on purpose: that function
|
|
61
|
+
* is a defensive safety net for VALUES THE USER NEVER TYPED (a corrupted
|
|
62
|
+
* config.json, a hand-edited file) — for those, silently falling back to
|
|
63
|
+
* the 30-minute default is the safer failure mode, since there's no one to
|
|
64
|
+
* tell. Here the user just typed something on a terminal RIGHT NOW: a
|
|
65
|
+
* genuinely unparsable value (letters, decimals) gets a clear error instead
|
|
66
|
+
* of a silent substitution, and an out-of-range integer gets clamped to the
|
|
67
|
+
* boundary WITH a note explaining what happened — both are more honest
|
|
68
|
+
* feedback loops for an interactive command than defaulting silently.
|
|
69
|
+
*/
|
|
70
|
+
function parseIdleTtlArg(raw, t) {
|
|
71
|
+
const normalized = raw.trim().toLowerCase();
|
|
72
|
+
if (normalized === 'never' || normalized === '0')
|
|
73
|
+
return { minutes: 0, note: '' };
|
|
74
|
+
const parsed = Number(normalized);
|
|
75
|
+
if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
|
|
76
|
+
throw new Error(t.invalidValue(raw));
|
|
77
|
+
}
|
|
78
|
+
if (parsed < MIN_IDLE_TTL_MINUTES || parsed > MAX_IDLE_TTL_MINUTES) {
|
|
79
|
+
const clamped = Math.min(Math.max(parsed, MIN_IDLE_TTL_MINUTES), MAX_IDLE_TTL_MINUTES);
|
|
80
|
+
return { minutes: clamped, note: t.clampedNote(parsed, clamped) };
|
|
81
|
+
}
|
|
82
|
+
return { minutes: parsed, note: '' };
|
|
83
|
+
}
|
|
84
|
+
/** Best-effort live push to an already-running primary over the
|
|
85
|
+
* multi-agent IPC bridge. Never throws — every failure degrades to a
|
|
86
|
+
* message. Failures are NOT collapsed into one diagnosis: an explicit
|
|
87
|
+
* hello-reject (stale/mismatched token, version mismatch) proves a primary
|
|
88
|
+
* IS running and gets `pushRejected`, while connection-refused / timeout /
|
|
89
|
+
* missing-token-file — where "no primary, or multi-agent off" is the
|
|
90
|
+
* honest reading — get `pushUnavailable`. */
|
|
91
|
+
async function tryPushLive(settings, t, ipcOptions = {}) {
|
|
92
|
+
const token = readToken();
|
|
93
|
+
if (!token)
|
|
94
|
+
return t.pushUnavailable;
|
|
95
|
+
const client = new IpcClient();
|
|
96
|
+
try {
|
|
97
|
+
await client.connect(token, {
|
|
98
|
+
host: ipcOptions.host,
|
|
99
|
+
port: ipcOptions.port,
|
|
100
|
+
handshakeTimeoutMs: 1500,
|
|
101
|
+
});
|
|
102
|
+
const ack = await client.sendSettingsPush(settings);
|
|
103
|
+
return ack.notified > 0 ? t.pushedLive(ack.notified) : t.pushedNone;
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
// HandshakeError message shapes (see ipc-client.ts): "Primary
|
|
107
|
+
// rejected: <reason>" only when a live primary answered with an
|
|
108
|
+
// explicit hello-reject — timeouts and unexpected frames use other
|
|
109
|
+
// wording, and socket-level failures are not HandshakeErrors at all.
|
|
110
|
+
if (err instanceof HandshakeError && /rejected/i.test(err.message)) {
|
|
111
|
+
return t.pushRejected;
|
|
112
|
+
}
|
|
113
|
+
return t.pushUnavailable;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await client.disconnect().catch(() => {
|
|
117
|
+
/* best effort */
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export async function setIdleTtl(rawValue, language = 'en', ipcOptions = {}) {
|
|
122
|
+
const t = CFG_I18N[language];
|
|
123
|
+
// Defensive final pass: parseIdleTtlArg already guarantees an in-range
|
|
124
|
+
// value or 0, so this is a no-op in practice — but it keeps ONE function
|
|
125
|
+
// as the single source of truth for "what counts as a safe stored value",
|
|
126
|
+
// matching the extension side's clampIdleTtlMinutes.
|
|
127
|
+
const { minutes: parsedMinutes, note } = parseIdleTtlArg(rawValue, t);
|
|
128
|
+
const minutes = clampIdleTtlMinutes(parsedMinutes);
|
|
129
|
+
const updatedAt = Date.now();
|
|
130
|
+
saveConfig({ idleTtlMinutes: minutes, idleTtlUpdatedAt: updatedAt });
|
|
131
|
+
const label = (minutes === 0 ? t.never : t.minutes(minutes)) + note;
|
|
132
|
+
const pushMessage = await tryPushLive({ idleTtlMinutes: minutes, updatedAt }, t, ipcOptions);
|
|
133
|
+
return t.setSaved(label) + pushMessage;
|
|
134
|
+
}
|
|
135
|
+
export async function runConfigCommand(argv, language = 'en') {
|
|
136
|
+
const t = CFG_I18N[language];
|
|
137
|
+
const action = argv.at(0);
|
|
138
|
+
const key = argv.at(1);
|
|
139
|
+
const value = argv.at(2);
|
|
140
|
+
if (action === undefined || action === 'get') {
|
|
141
|
+
if (key === undefined)
|
|
142
|
+
return listConfig(language);
|
|
143
|
+
if (key === 'idle-ttl')
|
|
144
|
+
return getIdleTtlLine(language);
|
|
145
|
+
throw new Error(t.unknownKey(key));
|
|
146
|
+
}
|
|
147
|
+
if (action === 'set') {
|
|
148
|
+
if (key === undefined)
|
|
149
|
+
throw new Error(t.usage);
|
|
150
|
+
if (key !== 'idle-ttl')
|
|
151
|
+
throw new Error(t.unknownKey(key));
|
|
152
|
+
if (value === undefined)
|
|
153
|
+
throw new Error(t.usage);
|
|
154
|
+
return setIdleTtl(value, language);
|
|
155
|
+
}
|
|
156
|
+
throw new Error(t.unknownAction(action));
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,7 @@ const EXT_I18N = {
|
|
|
32
32
|
selectButton: 'Click "Select Folder".',
|
|
33
33
|
pathLabel: 'Chrome extension assets are at:',
|
|
34
34
|
stepsLabel: 'Install steps:',
|
|
35
|
-
afterLoading: 'After loading, open the extension popup on any tab and click "
|
|
35
|
+
afterLoading: 'After loading, open the extension popup on any tab and click "Connect this tab" to bridge it.',
|
|
36
36
|
notFound: 'Extension assets not found. Run `npm run build:extension` (dev) or reinstall the package.',
|
|
37
37
|
},
|
|
38
38
|
es: {
|
|
@@ -43,7 +43,7 @@ const EXT_I18N = {
|
|
|
43
43
|
selectButton: 'Hacé click en "Seleccionar carpeta".',
|
|
44
44
|
pathLabel: 'Los assets de la extensión están en:',
|
|
45
45
|
stepsLabel: 'Pasos de instalación:',
|
|
46
|
-
afterLoading: 'Después de cargarla, abrí el popup de la extensión en cualquier pestaña y hacé click en "
|
|
46
|
+
afterLoading: 'Después de cargarla, abrí el popup de la extensión en cualquier pestaña y hacé click en "Connect this tab" para puentearla.',
|
|
47
47
|
notFound: 'No se encontraron los assets. Corré `npm run build:extension` (dev) o reinstalá el paquete.',
|
|
48
48
|
},
|
|
49
49
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../src/commands/extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG;QACjB,+DAA+D;QAC/D,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QAC7B,gFAAgF;QAChF,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC;QACpD,gGAAgG;QAChG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC;KAC/C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAeD,MAAM,QAAQ,GAAoC;IAChD,EAAE,EAAE;QACF,UAAU,EAAE,4CAA4C;QACxD,SAAS,EAAE,sCAAsC;QACjD,YAAY,EAAE,wBAAwB;QACtC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE;QACpC,YAAY,EAAE,wBAAwB;QACtC,SAAS,EAAE,iCAAiC;QAC5C,UAAU,EAAE,gBAAgB;QAC5B,YAAY,EACV
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../src/commands/extension.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/welcome.js
CHANGED
|
@@ -46,7 +46,7 @@ export const I18N_WELCOME = {
|
|
|
46
46
|
'process act on your behalf. Disconnect a tab from the extension popup',
|
|
47
47
|
'when you are done with it.',
|
|
48
48
|
].join('\n'),
|
|
49
|
-
responsibility: 'You are responsible for every action the agent performs on the tabs you explicitly enable. The extension stays inert on any tab where you have not pressed "
|
|
49
|
+
responsibility: 'You are responsible for every action the agent performs on the tabs you explicitly enable. The extension stays inert on any tab where you have not pressed "Connect this tab" yourself.',
|
|
50
50
|
extensionNote: 'The Chrome extension is custom and ships inside this package. The setup menu after this screen will tell you where it lives so you can load it via chrome://extensions → Load unpacked.',
|
|
51
51
|
prompt: 'How do you want to proceed?',
|
|
52
52
|
detailHint: 'Press i for the full breakdown · also available under About.',
|
|
@@ -100,10 +100,10 @@ export const I18N_WELCOME = {
|
|
|
100
100
|
].join('\n'),
|
|
101
101
|
warningTitle: 'Leelo antes de continuar',
|
|
102
102
|
warning: [
|
|
103
|
-
'
|
|
104
|
-
'
|
|
103
|
+
'Una pestaña conectada le da al agente acceso a todo lo que esté en',
|
|
104
|
+
'ella: sesiones iniciadas, tarjetas guardadas, wallets, banca,',
|
|
105
105
|
'consolas de trabajo, paneles de administración… lo que el navegador',
|
|
106
|
-
'esté mostrando en
|
|
106
|
+
'esté mostrando en ese momento.',
|
|
107
107
|
'',
|
|
108
108
|
'Tratá al agente como a un dev junior con control remoto de esas',
|
|
109
109
|
'pestañas: puede comprar cosas, enviar formularios, cambiar',
|
|
@@ -114,7 +114,7 @@ export const I18N_WELCOME = {
|
|
|
114
114
|
'automatizado actúe en tu nombre. Desconectá la pestaña desde el popup',
|
|
115
115
|
'cuando termines de usarla.',
|
|
116
116
|
].join('\n'),
|
|
117
|
-
responsibility: 'Sos responsable de cada acción que el agente haga en las pestañas que habilitás explícitamente. La extensión se mantiene inerte en cualquier pestaña donde no hayas apretado "
|
|
117
|
+
responsibility: 'Sos responsable de cada acción que el agente haga en las pestañas que habilitás explícitamente. La extensión se mantiene inerte en cualquier pestaña donde no hayas apretado "Connect this tab" vos mismo.',
|
|
118
118
|
extensionNote: 'La extensión de Chrome es custom y viene incluida en este paquete. El menú que aparece después de esta pantalla te dice exactamente dónde está para que la cargues vía chrome://extensions → Cargar sin empaquetar.',
|
|
119
119
|
prompt: '¿Cómo querés seguir?',
|
|
120
120
|
detailHint: 'Apretá i para ver el detalle completo · también disponible en About.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/commands/welcome.ts"],"names":[],"mappings":"AAAA;;yDAEyD;AAiDzD,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,EAAE,EAAE;QACF,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE;YACV,8DAA8D;YAC9D,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE;YACZ,+DAA+D;YAC/D,kEAAkE;YAClE,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE;YACL,kEAAkE;YAClE,oEAAoE;YACpE,uEAAuE;YACvE,6BAA6B;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,iBAAiB,EAAE,0CAA0C;QAC7D,YAAY,EAAE;YACZ,gCAAgC;YAChC,6CAA6C;YAC7C,oCAAoC;YACpC,oDAAoD;YACpD,EAAE;YACF,oEAAoE;YACpE,uEAAuE;YACvE,kEAAkE;YAClE,4CAA4C;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,+BAA+B;QAC7C,OAAO,EAAE;YACP,oEAAoE;YACpE,sEAAsE;YACtE,2DAA2D;YAC3D,EAAE;YACF,uEAAuE;YACvE,wEAAwE;YACxE,qEAAqE;YACrE,EAAE;YACF,uEAAuE;YACvE,uEAAuE;YACvE,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,cAAc,EACZ,
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/commands/welcome.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -30,6 +30,44 @@ export interface BrowserLinkConfig {
|
|
|
30
30
|
* the primary does). Has no effect when multiAgent is false.
|
|
31
31
|
*/
|
|
32
32
|
autoReelect?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* CLI-side mirror of the extension's idle-disconnect TTL (see
|
|
35
|
+
* `packages/extension/src/idle-policy.ts`), in minutes. `0` means
|
|
36
|
+
* "never". Set via `browser-link config set idle-ttl <minutes|never>`.
|
|
37
|
+
*
|
|
38
|
+
* Deliberately left `undefined` — NOT defaulted to 30 here — when the
|
|
39
|
+
* CLI has never touched it: the WS bridge only pushes a `settings.update`
|
|
40
|
+
* to the extension when this field is explicitly set, so a popup-only
|
|
41
|
+
* user (who never ran the CLI command) never sees a spurious overwrite
|
|
42
|
+
* of their own choice with a server-side "default". See `idleTtlUpdatedAt`
|
|
43
|
+
* for the precedence rule when both sides have set a value.
|
|
44
|
+
*/
|
|
45
|
+
idleTtlMinutes?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Epoch-ms timestamp of the last `idleTtlMinutes` write from the CLI.
|
|
48
|
+
* Sent alongside `idleTtlMinutes` in every `settings.update` push so the
|
|
49
|
+
* extension can apply a last-write-wins precedence rule against its own
|
|
50
|
+
* locally-stored timestamp (popup edits stamp their own `Date.now()`).
|
|
51
|
+
* Always set together with `idleTtlMinutes` — never one without the other.
|
|
52
|
+
*/
|
|
53
|
+
idleTtlUpdatedAt?: number;
|
|
33
54
|
}
|
|
55
|
+
/** Safety-rail bounds mirrored from the extension's `idle-policy.ts` — kept
|
|
56
|
+
* as an independent copy (not a shared import) for the same reason
|
|
57
|
+
* `messages.ts` duplicates the wire types instead of depending on
|
|
58
|
+
* `@browser-link/shared`: the server publishes to npm standalone and must
|
|
59
|
+
* not carry an unresolvable workspace dependency. */
|
|
60
|
+
export declare const MIN_IDLE_TTL_MINUTES = 1;
|
|
61
|
+
export declare const MAX_IDLE_TTL_MINUTES = 1440;
|
|
62
|
+
export declare const DEFAULT_IDLE_TTL_MINUTES = 30;
|
|
63
|
+
/**
|
|
64
|
+
* Clamp a CLI-provided idle-TTL value the same way the extension clamps a
|
|
65
|
+
* stored one: `0` ("never") passes through untouched; a non-integer, an
|
|
66
|
+
* out-of-range value, or anything malformed falls back to
|
|
67
|
+
* `DEFAULT_IDLE_TTL_MINUTES` rather than being snapped to the nearest
|
|
68
|
+
* boundary. Exported so `commands/config.ts` and its tests share one
|
|
69
|
+
* implementation instead of re-deriving the bounds.
|
|
70
|
+
*/
|
|
71
|
+
export declare function clampIdleTtlMinutes(value: number): number;
|
|
34
72
|
export declare function loadConfig(): BrowserLinkConfig;
|
|
35
73
|
export declare function saveConfig(patch: Partial<BrowserLinkConfig>): BrowserLinkConfig;
|
package/dist/config.js
CHANGED
|
@@ -2,6 +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
|
+
/** Safety-rail bounds mirrored from the extension's `idle-policy.ts` — kept
|
|
6
|
+
* as an independent copy (not a shared import) for the same reason
|
|
7
|
+
* `messages.ts` duplicates the wire types instead of depending on
|
|
8
|
+
* `@browser-link/shared`: the server publishes to npm standalone and must
|
|
9
|
+
* not carry an unresolvable workspace dependency. */
|
|
10
|
+
export const MIN_IDLE_TTL_MINUTES = 1;
|
|
11
|
+
export const MAX_IDLE_TTL_MINUTES = 1440;
|
|
12
|
+
export const DEFAULT_IDLE_TTL_MINUTES = 30;
|
|
13
|
+
/**
|
|
14
|
+
* Clamp a CLI-provided idle-TTL value the same way the extension clamps a
|
|
15
|
+
* stored one: `0` ("never") passes through untouched; a non-integer, an
|
|
16
|
+
* out-of-range value, or anything malformed falls back to
|
|
17
|
+
* `DEFAULT_IDLE_TTL_MINUTES` rather than being snapped to the nearest
|
|
18
|
+
* boundary. Exported so `commands/config.ts` and its tests share one
|
|
19
|
+
* implementation instead of re-deriving the bounds.
|
|
20
|
+
*/
|
|
21
|
+
export function clampIdleTtlMinutes(value) {
|
|
22
|
+
if (value === 0)
|
|
23
|
+
return 0;
|
|
24
|
+
if (!Number.isFinite(value) || !Number.isInteger(value))
|
|
25
|
+
return DEFAULT_IDLE_TTL_MINUTES;
|
|
26
|
+
if (value < MIN_IDLE_TTL_MINUTES || value > MAX_IDLE_TTL_MINUTES)
|
|
27
|
+
return DEFAULT_IDLE_TTL_MINUTES;
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
5
30
|
/** Defaults applied at load time so consumers can read `cfg.multiAgent`
|
|
6
31
|
* directly. Persisted form (see `normaliseForWrite`) only carries the field
|
|
7
32
|
* when the user overrides the default, keeping the on-disk config minimal. */
|
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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"}
|