@jobshimo/browser-link 0.40.0 → 0.42.0
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 +27 -12
- package/dist/admin/actions.d.ts +57 -0
- package/dist/admin/actions.js +163 -0
- package/dist/admin/actions.js.map +1 -0
- package/dist/admin/descriptor.d.ts +65 -0
- package/dist/admin/descriptor.js +205 -0
- package/dist/admin/descriptor.js.map +1 -0
- package/dist/admin/i18n.d.ts +90 -0
- package/dist/admin/i18n.js +203 -0
- package/dist/admin/i18n.js.map +1 -0
- package/dist/admin/primary.d.ts +21 -0
- package/dist/admin/primary.js +56 -0
- package/dist/admin/primary.js.map +1 -0
- package/dist/admin/sources.d.ts +22 -0
- package/dist/admin/sources.js +82 -0
- package/dist/admin/sources.js.map +1 -0
- package/dist/bridge/dispatch.js +17 -7
- package/dist/bridge/dispatch.js.map +1 -1
- package/dist/bridge/ws-bridge.d.ts +65 -3
- package/dist/bridge/ws-bridge.js +165 -7
- package/dist/bridge/ws-bridge.js.map +1 -1
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +24 -0
- package/dist/commands/doctor.js +62 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/free-port.d.ts +40 -1
- package/dist/commands/free-port.js +72 -7
- package/dist/commands/free-port.js.map +1 -1
- package/dist/extension/admin-view.d.ts +95 -0
- package/dist/extension/admin-view.js +164 -0
- package/dist/extension/admin-view.js.map +1 -0
- package/dist/extension/background.js +176 -8
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/manifest.json +1 -1
- package/dist/extension/popup.html +113 -0
- package/dist/extension/popup.js +282 -1
- package/dist/extension/popup.js.map +1 -1
- package/dist/extension/repair-policy.d.ts +60 -0
- package/dist/extension/repair-policy.js +79 -0
- package/dist/extension/repair-policy.js.map +1 -0
- package/dist/extension/version-status.d.ts +44 -0
- package/dist/extension/version-status.js +60 -0
- package/dist/extension/version-status.js.map +1 -0
- package/dist/lifecycle/election.d.ts +98 -0
- package/dist/lifecycle/election.js +187 -0
- package/dist/lifecycle/election.js.map +1 -0
- package/dist/lifecycle/processes.d.ts +67 -0
- package/dist/lifecycle/processes.js +239 -0
- package/dist/lifecycle/processes.js.map +1 -0
- package/dist/lifecycle/repair.d.ts +48 -0
- package/dist/lifecycle/repair.js +67 -0
- package/dist/lifecycle/repair.js.map +1 -0
- package/dist/lifecycle/version-endpoint.d.ts +16 -0
- package/dist/lifecycle/version-endpoint.js +50 -0
- package/dist/lifecycle/version-endpoint.js.map +1 -0
- package/dist/manual/topics.js +1 -1
- package/dist/manual/topics.js.map +1 -1
- package/dist/messages.d.ts +115 -2
- package/dist/server.js +104 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/browser-dispatch.d.ts +8 -0
- package/dist/tools/browser-dispatch.js +15 -1
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/dist/ui/app.d.ts +4 -1
- package/dist/ui/app.js +55 -42
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/screens/free-port.js +4 -2
- package/dist/ui/screens/free-port.js.map +1 -1
- package/dist/ui/screens/index.d.ts +1 -0
- package/dist/ui/screens/index.js +1 -0
- package/dist/ui/screens/index.js.map +1 -1
- package/dist/ui/screens/menu.d.ts +11 -1
- package/dist/ui/screens/menu.js +12 -4
- package/dist/ui/screens/menu.js.map +1 -1
- package/dist/ui/screens/status.d.ts +19 -0
- package/dist/ui/screens/status.js +67 -0
- package/dist/ui/screens/status.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Language } from '../commands/welcome.js';
|
|
2
|
+
import type { InstructionsState } from '../agent-instructions/index.js';
|
|
3
|
+
import type { AdminUiStrings } from '../messages.js';
|
|
4
|
+
/**
|
|
5
|
+
* Every string the admin descriptor and actions send, for `en` and `es`.
|
|
6
|
+
* The server localises here so the popup renders the state dumbly; the
|
|
7
|
+
* console keeps its own per-screen tables for everything else.
|
|
8
|
+
*/
|
|
9
|
+
export interface AdminI18n {
|
|
10
|
+
ui: Omit<AdminUiStrings, 'language'>;
|
|
11
|
+
sections: {
|
|
12
|
+
status: string;
|
|
13
|
+
setup: string;
|
|
14
|
+
diagnose: string;
|
|
15
|
+
reference: string;
|
|
16
|
+
};
|
|
17
|
+
on: string;
|
|
18
|
+
off: string;
|
|
19
|
+
unknown: string;
|
|
20
|
+
server: string;
|
|
21
|
+
serverRunning: (version: string) => string;
|
|
22
|
+
serverNotRunning: string;
|
|
23
|
+
serverNotRunningHint: string;
|
|
24
|
+
installed: string;
|
|
25
|
+
installedOutdated: (installed: string) => string;
|
|
26
|
+
pid: string;
|
|
27
|
+
uptime: string;
|
|
28
|
+
tabs: string;
|
|
29
|
+
tabsUnknownHint: string;
|
|
30
|
+
ports: string;
|
|
31
|
+
multiAgentStatus: string;
|
|
32
|
+
extension: string;
|
|
33
|
+
extensionAligned: (version: string) => string;
|
|
34
|
+
extensionMismatch: (ext: string, server: string) => string;
|
|
35
|
+
extensionNotConnected: string;
|
|
36
|
+
instructionsFor: (client: string) => string;
|
|
37
|
+
instructionsState: (state: InstructionsState) => string;
|
|
38
|
+
cdpDirect: string;
|
|
39
|
+
cdpDirectGranted: (minutes: number | null) => string;
|
|
40
|
+
cdpDirectNoGrant: string;
|
|
41
|
+
update: string;
|
|
42
|
+
updateAvailable: (latest: string) => string;
|
|
43
|
+
upToDate: string;
|
|
44
|
+
activity: string;
|
|
45
|
+
language: string;
|
|
46
|
+
tool: (name: string) => string;
|
|
47
|
+
multiAgent: string;
|
|
48
|
+
autoReelect: string;
|
|
49
|
+
instructionsAutoRefresh: string;
|
|
50
|
+
cdpDirectEnabled: string;
|
|
51
|
+
cdpDirectPort: string;
|
|
52
|
+
cdpDirectGrantTtl: string;
|
|
53
|
+
minutes: (n: number) => string;
|
|
54
|
+
never: string;
|
|
55
|
+
activityEnabled: string;
|
|
56
|
+
activityRecordPayloads: string;
|
|
57
|
+
downloadsDir: string;
|
|
58
|
+
idleTtl: string;
|
|
59
|
+
idleTtlHint: string;
|
|
60
|
+
flowRecording: string;
|
|
61
|
+
flowRecordingHint: string;
|
|
62
|
+
popupDefault: string;
|
|
63
|
+
doctor: string;
|
|
64
|
+
updatesCheck: string;
|
|
65
|
+
instructionsInstall: (client: string) => string;
|
|
66
|
+
instructionsUninstall: (client: string) => string;
|
|
67
|
+
register: (client: string) => string;
|
|
68
|
+
registered: string;
|
|
69
|
+
notRegistered: string;
|
|
70
|
+
stop: string;
|
|
71
|
+
stopDescription: string;
|
|
72
|
+
selfUpdate: string;
|
|
73
|
+
selfUpdateDescription: string;
|
|
74
|
+
about: string;
|
|
75
|
+
aboutText: string;
|
|
76
|
+
repo: string;
|
|
77
|
+
extensionPath: string;
|
|
78
|
+
extensionNotFound: string;
|
|
79
|
+
unknownAction: (id: string) => string;
|
|
80
|
+
notAnAction: (id: string) => string;
|
|
81
|
+
invalidValue: (id: string) => string;
|
|
82
|
+
previewToolOn: (name: string) => string;
|
|
83
|
+
previewToolOff: (name: string) => string;
|
|
84
|
+
previewToggle: (label: string, on: boolean) => string;
|
|
85
|
+
previewSelect: (label: string, option: string) => string;
|
|
86
|
+
previewInstall: (client: string) => string;
|
|
87
|
+
previewUninstall: (client: string) => string;
|
|
88
|
+
previewRegister: (client: string) => string;
|
|
89
|
+
}
|
|
90
|
+
export declare const ADMIN_I18N: Record<Language, AdminI18n>;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
const v = (version) => (version === null ? 'unversioned' : `v${version}`);
|
|
2
|
+
export const ADMIN_I18N = {
|
|
3
|
+
en: {
|
|
4
|
+
ui: {
|
|
5
|
+
confirm: 'Confirm',
|
|
6
|
+
cancel: 'Cancel',
|
|
7
|
+
apply: 'Apply',
|
|
8
|
+
notConnected: 'Connect a tab to manage browser-link from here.',
|
|
9
|
+
restartRequired: 'Restart your MCP client for this change to take effect.',
|
|
10
|
+
changed: 'Saved.',
|
|
11
|
+
},
|
|
12
|
+
sections: { status: 'Status', setup: 'Setup', diagnose: 'Diagnose', reference: 'Reference' },
|
|
13
|
+
on: 'on',
|
|
14
|
+
off: 'off',
|
|
15
|
+
unknown: 'unknown',
|
|
16
|
+
server: 'Server',
|
|
17
|
+
serverRunning: (version) => `running v${version}`,
|
|
18
|
+
serverNotRunning: 'not running',
|
|
19
|
+
serverNotRunningHint: 'Your MCP client starts it; open a session that uses browser-link.',
|
|
20
|
+
installed: 'Installed version',
|
|
21
|
+
installedOutdated: (installed) => `${installed} (outdated: restart needed)`,
|
|
22
|
+
pid: 'PID',
|
|
23
|
+
uptime: 'Uptime',
|
|
24
|
+
tabs: 'Tabs connected',
|
|
25
|
+
tabsUnknownHint: 'Only the running server knows; open the extension popup.',
|
|
26
|
+
ports: 'Ports',
|
|
27
|
+
multiAgentStatus: 'Multi-agent',
|
|
28
|
+
extension: 'Extension',
|
|
29
|
+
extensionAligned: (version) => `v${version} (aligned)`,
|
|
30
|
+
extensionMismatch: (ext, server) => `v${ext} (server v${server}: reload or update one)`,
|
|
31
|
+
extensionNotConnected: 'no tab connected',
|
|
32
|
+
instructionsFor: (client) => `Instructions — ${client}`,
|
|
33
|
+
instructionsState: (state) => {
|
|
34
|
+
switch (state.kind) {
|
|
35
|
+
case 'installed':
|
|
36
|
+
return `installed ${v(state.version)}`;
|
|
37
|
+
case 'installed-outdated':
|
|
38
|
+
return `outdated ${v(state.version)}`;
|
|
39
|
+
case 'not-installed':
|
|
40
|
+
return 'not installed';
|
|
41
|
+
case 'no-file':
|
|
42
|
+
return 'no instructions file';
|
|
43
|
+
case 'corrupt':
|
|
44
|
+
return 'corrupt (fix it by hand)';
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
cdpDirect: 'cdp-direct',
|
|
48
|
+
cdpDirectGranted: (minutes) => minutes === null ? 'on, granted (no expiry)' : `on, granted (${minutes} min left)`,
|
|
49
|
+
cdpDirectNoGrant: 'on, no active grant (browser-link cdp allow)',
|
|
50
|
+
update: 'Updates',
|
|
51
|
+
updateAvailable: (latest) => `v${latest} available`,
|
|
52
|
+
upToDate: 'up to date',
|
|
53
|
+
activity: 'Activity trail',
|
|
54
|
+
language: 'Language',
|
|
55
|
+
tool: (name) => `Tool ${name}`,
|
|
56
|
+
multiAgent: 'Multi-agent mode',
|
|
57
|
+
autoReelect: 'Auto-reelect on primary close',
|
|
58
|
+
instructionsAutoRefresh: 'Refresh the instructions block at server start',
|
|
59
|
+
cdpDirectEnabled: 'cdp-direct enabled',
|
|
60
|
+
cdpDirectPort: 'cdp-direct port',
|
|
61
|
+
cdpDirectGrantTtl: 'cdp-direct grant lifetime',
|
|
62
|
+
minutes: (n) => `${n} min`,
|
|
63
|
+
never: 'never expires',
|
|
64
|
+
activityEnabled: 'Record the activity trail',
|
|
65
|
+
activityRecordPayloads: 'Record tool payloads in the trail',
|
|
66
|
+
downloadsDir: 'Downloads folder',
|
|
67
|
+
idleTtl: 'Idle disconnect',
|
|
68
|
+
idleTtlHint: "Change it in the popup's Idle disconnect control or with browser-link config set idle-ttl",
|
|
69
|
+
flowRecording: 'Flow recording',
|
|
70
|
+
flowRecordingHint: "Change it in the popup's flow recording control or with browser-link config set flow-recording",
|
|
71
|
+
popupDefault: 'popup choice',
|
|
72
|
+
doctor: 'Run doctor',
|
|
73
|
+
updatesCheck: 'Check for updates',
|
|
74
|
+
instructionsInstall: (client) => `Install instructions block — ${client}`,
|
|
75
|
+
instructionsUninstall: (client) => `Remove instructions block — ${client}`,
|
|
76
|
+
register: (client) => `Register with ${client}`,
|
|
77
|
+
registered: 'registered',
|
|
78
|
+
notRegistered: 'not registered',
|
|
79
|
+
stop: 'Stop the server / free the port',
|
|
80
|
+
stopDescription: 'Ends the running server, so it is only available from a terminal.',
|
|
81
|
+
selfUpdate: 'Update browser-link',
|
|
82
|
+
selfUpdateDescription: 'Replaces the running server, so it is only available from a terminal.',
|
|
83
|
+
about: 'About',
|
|
84
|
+
aboutText: 'browser-link is an MCP server that lets agents observe and act on the Chrome tabs you connect.',
|
|
85
|
+
repo: 'GitHub repository',
|
|
86
|
+
extensionPath: 'Extension folder',
|
|
87
|
+
extensionNotFound: 'not found next to the server',
|
|
88
|
+
unknownAction: (id) => `Unknown admin action: ${id}`,
|
|
89
|
+
notAnAction: (id) => `${id} is read-only`,
|
|
90
|
+
invalidValue: (id) => `Invalid value for ${id}`,
|
|
91
|
+
previewToolOn: (name) => `Enable tool ${name} for every agent`,
|
|
92
|
+
previewToolOff: (name) => `Disable tool ${name} for every agent`,
|
|
93
|
+
previewToggle: (label, on) => `Turn ${on ? 'on' : 'off'}: ${label}`,
|
|
94
|
+
previewSelect: (label, option) => `Set ${label} to ${option}`,
|
|
95
|
+
previewInstall: (client) => `Write the browser-link instructions block into ${client}'s file`,
|
|
96
|
+
previewUninstall: (client) => `Remove the browser-link instructions block from ${client}'s file`,
|
|
97
|
+
previewRegister: (client) => `Register browser-link in ${client}'s MCP config`,
|
|
98
|
+
},
|
|
99
|
+
es: {
|
|
100
|
+
ui: {
|
|
101
|
+
confirm: 'Confirmar',
|
|
102
|
+
cancel: 'Cancelar',
|
|
103
|
+
apply: 'Aplicar',
|
|
104
|
+
notConnected: 'Conectá una pestaña para administrar browser-link desde acá.',
|
|
105
|
+
restartRequired: 'Reiniciá tu cliente MCP para que el cambio tenga efecto.',
|
|
106
|
+
changed: 'Guardado.',
|
|
107
|
+
},
|
|
108
|
+
sections: {
|
|
109
|
+
status: 'Estado',
|
|
110
|
+
setup: 'Configuración',
|
|
111
|
+
diagnose: 'Diagnóstico',
|
|
112
|
+
reference: 'Referencia',
|
|
113
|
+
},
|
|
114
|
+
on: 'activado',
|
|
115
|
+
off: 'desactivado',
|
|
116
|
+
unknown: 'desconocido',
|
|
117
|
+
server: 'Servidor',
|
|
118
|
+
serverRunning: (version) => `en marcha v${version}`,
|
|
119
|
+
serverNotRunning: 'detenido',
|
|
120
|
+
serverNotRunningHint: 'Lo arranca tu cliente MCP; abrí una sesión que use browser-link.',
|
|
121
|
+
installed: 'Versión instalada',
|
|
122
|
+
installedOutdated: (installed) => `${installed} (desactualizado: hace falta reiniciar)`,
|
|
123
|
+
pid: 'PID',
|
|
124
|
+
uptime: 'Tiempo en marcha',
|
|
125
|
+
tabs: 'Pestañas conectadas',
|
|
126
|
+
tabsUnknownHint: 'Solo lo sabe el servidor en marcha; abrí el popup de la extensión.',
|
|
127
|
+
ports: 'Puertos',
|
|
128
|
+
multiAgentStatus: 'Multi-agente',
|
|
129
|
+
extension: 'Extensión',
|
|
130
|
+
extensionAligned: (version) => `v${version} (alineada)`,
|
|
131
|
+
extensionMismatch: (ext, server) => `v${ext} (servidor v${server}: recargá o actualizá uno de los dos)`,
|
|
132
|
+
extensionNotConnected: 'ninguna pestaña conectada',
|
|
133
|
+
instructionsFor: (client) => `Instrucciones — ${client}`,
|
|
134
|
+
instructionsState: (state) => {
|
|
135
|
+
switch (state.kind) {
|
|
136
|
+
case 'installed':
|
|
137
|
+
return `instalado ${state.version === null ? 'sin versión' : `v${state.version}`}`;
|
|
138
|
+
case 'installed-outdated':
|
|
139
|
+
return `desactualizado ${state.version === null ? 'sin versión' : `v${state.version}`}`;
|
|
140
|
+
case 'not-installed':
|
|
141
|
+
return 'no instalado';
|
|
142
|
+
case 'no-file':
|
|
143
|
+
return 'sin archivo de instrucciones';
|
|
144
|
+
case 'corrupt':
|
|
145
|
+
return 'corrupto (arreglalo a mano)';
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
cdpDirect: 'cdp-direct',
|
|
149
|
+
cdpDirectGranted: (minutes) => minutes === null
|
|
150
|
+
? 'activado, con permiso (sin vencimiento)'
|
|
151
|
+
: `activado, con permiso (quedan ${minutes} min)`,
|
|
152
|
+
cdpDirectNoGrant: 'activado, sin permiso vigente (browser-link cdp allow)',
|
|
153
|
+
update: 'Actualizaciones',
|
|
154
|
+
updateAvailable: (latest) => `v${latest} disponible`,
|
|
155
|
+
upToDate: 'al día',
|
|
156
|
+
activity: 'Registro de actividad',
|
|
157
|
+
language: 'Idioma',
|
|
158
|
+
tool: (name) => `Tool ${name}`,
|
|
159
|
+
multiAgent: 'Modo multi-agente',
|
|
160
|
+
autoReelect: 'Re-elección automática al cerrar el primary',
|
|
161
|
+
instructionsAutoRefresh: 'Refrescar el bloque de instrucciones al arrancar el servidor',
|
|
162
|
+
cdpDirectEnabled: 'cdp-direct activado',
|
|
163
|
+
cdpDirectPort: 'Puerto de cdp-direct',
|
|
164
|
+
cdpDirectGrantTtl: 'Duración del permiso de cdp-direct',
|
|
165
|
+
minutes: (n) => `${n} min`,
|
|
166
|
+
never: 'no vence',
|
|
167
|
+
activityEnabled: 'Guardar el registro de actividad',
|
|
168
|
+
activityRecordPayloads: 'Guardar los payloads de las tools en el registro',
|
|
169
|
+
downloadsDir: 'Carpeta de descargas',
|
|
170
|
+
idleTtl: 'Desconexión por inactividad',
|
|
171
|
+
idleTtlHint: 'Se cambia desde el popup (Desconexión por inactividad) o con browser-link config set idle-ttl',
|
|
172
|
+
flowRecording: 'Grabación de flows',
|
|
173
|
+
flowRecordingHint: 'Se cambia desde el popup (grabación de flows) o con browser-link config set flow-recording',
|
|
174
|
+
popupDefault: 'lo elegido en el popup',
|
|
175
|
+
doctor: 'Ejecutar doctor',
|
|
176
|
+
updatesCheck: 'Buscar actualizaciones',
|
|
177
|
+
instructionsInstall: (client) => `Instalar el bloque de instrucciones — ${client}`,
|
|
178
|
+
instructionsUninstall: (client) => `Quitar el bloque de instrucciones — ${client}`,
|
|
179
|
+
register: (client) => `Registrar en ${client}`,
|
|
180
|
+
registered: 'registrado',
|
|
181
|
+
notRegistered: 'sin registrar',
|
|
182
|
+
stop: 'Detener el servidor / liberar el puerto',
|
|
183
|
+
stopDescription: 'Termina el servidor en marcha, por eso solo se hace desde una terminal.',
|
|
184
|
+
selfUpdate: 'Actualizar browser-link',
|
|
185
|
+
selfUpdateDescription: 'Reemplaza el servidor en marcha, por eso solo se hace desde una terminal.',
|
|
186
|
+
about: 'Acerca de',
|
|
187
|
+
aboutText: 'browser-link es un servidor MCP que deja a los agentes ver y actuar sobre las pestañas de Chrome que conectás.',
|
|
188
|
+
repo: 'Repositorio en GitHub',
|
|
189
|
+
extensionPath: 'Carpeta de la extensión',
|
|
190
|
+
extensionNotFound: 'no se encontró junto al servidor',
|
|
191
|
+
unknownAction: (id) => `Acción de administración desconocida: ${id}`,
|
|
192
|
+
notAnAction: (id) => `${id} es de solo lectura`,
|
|
193
|
+
invalidValue: (id) => `Valor inválido para ${id}`,
|
|
194
|
+
previewToolOn: (name) => `Habilitar la tool ${name} para todos los agentes`,
|
|
195
|
+
previewToolOff: (name) => `Deshabilitar la tool ${name} para todos los agentes`,
|
|
196
|
+
previewToggle: (label, on) => `${on ? 'Activar' : 'Desactivar'}: ${label}`,
|
|
197
|
+
previewSelect: (label, option) => `Cambiar ${label} a ${option}`,
|
|
198
|
+
previewInstall: (client) => `Escribir el bloque de instrucciones de browser-link en el archivo de ${client}`,
|
|
199
|
+
previewUninstall: (client) => `Quitar el bloque de instrucciones de browser-link del archivo de ${client}`,
|
|
200
|
+
previewRegister: (client) => `Registrar browser-link en la configuración MCP de ${client}`,
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/admin/i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type UpdateCheckResult } from '../commands/update-check.js';
|
|
2
|
+
import type { AdminHandlers } from '../bridge/ws-bridge.js';
|
|
3
|
+
/**
|
|
4
|
+
* The primary's admin handlers for the WS bridge. In process: the server
|
|
5
|
+
* rows describe this very process, the tab count and the extension version
|
|
6
|
+
* come from the live sessions. The update check never runs at boot: the
|
|
7
|
+
* first `admin.describe` starts one in the background (honouring the 6 h
|
|
8
|
+
* disk cache) and later states carry its result; the `updates.check` button
|
|
9
|
+
* forces a fresh one. `doctor` runs only on its button, because it is slow.
|
|
10
|
+
*/
|
|
11
|
+
export interface PrimaryAdminOptions {
|
|
12
|
+
version: string;
|
|
13
|
+
tabsConnected: () => number;
|
|
14
|
+
connectedExtensionVersion: () => string | null;
|
|
15
|
+
/** Test seams; production leaves them unset. */
|
|
16
|
+
checkUpdates?: (opts: {
|
|
17
|
+
force?: boolean;
|
|
18
|
+
}) => Promise<UpdateCheckResult>;
|
|
19
|
+
doctor?: () => Promise<string[]>;
|
|
20
|
+
}
|
|
21
|
+
export declare function createPrimaryAdminHandlers(opts: PrimaryAdminOptions): AdminHandlers;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { loadConfig } from '../config.js';
|
|
2
|
+
import { buildServerStatus } from '../commands/doctor.js';
|
|
3
|
+
import { checkForUpdates } from '../commands/update-check.js';
|
|
4
|
+
import { formatUpdate } from '../commands/updates.js';
|
|
5
|
+
import { buildVersionInfo } from '../lifecycle/version-endpoint.js';
|
|
6
|
+
import { readInstalledVersion } from '../version.js';
|
|
7
|
+
import { applyAdminAction } from './actions.js';
|
|
8
|
+
import { adminLanguage, buildAdminState } from './descriptor.js';
|
|
9
|
+
import { gatherAdminInput } from './sources.js';
|
|
10
|
+
async function runDoctorLines() {
|
|
11
|
+
const { runDoctor, formatDoctor } = await import('../commands/doctor.js');
|
|
12
|
+
return formatDoctor(await runDoctor(), adminLanguage(loadConfig())).split('\n');
|
|
13
|
+
}
|
|
14
|
+
export function createPrimaryAdminHandlers(opts) {
|
|
15
|
+
const check = opts.checkUpdates ?? checkForUpdates;
|
|
16
|
+
let update = null;
|
|
17
|
+
let backgroundCheck = null;
|
|
18
|
+
const input = () => gatherAdminInput({
|
|
19
|
+
server: () => Promise.resolve(buildServerStatus({ kind: 'version', info: buildVersionInfo(opts.version) }, readInstalledVersion())),
|
|
20
|
+
version: opts.version,
|
|
21
|
+
tabsConnected: opts.tabsConnected,
|
|
22
|
+
connectedExtensionVersion: opts.connectedExtensionVersion,
|
|
23
|
+
update: () => update,
|
|
24
|
+
});
|
|
25
|
+
const startBackgroundCheck = () => {
|
|
26
|
+
if (backgroundCheck)
|
|
27
|
+
return;
|
|
28
|
+
backgroundCheck = check({})
|
|
29
|
+
.then((r) => {
|
|
30
|
+
update = { latest: r.latest, isNewer: r.isNewer };
|
|
31
|
+
})
|
|
32
|
+
.catch(() => {
|
|
33
|
+
/* passive: an unreachable registry leaves "unknown" */
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const checkUpdatesLines = async () => {
|
|
37
|
+
const r = await check({ force: true });
|
|
38
|
+
update = { latest: r.latest, isNewer: r.isNewer };
|
|
39
|
+
const info = r.latest === null
|
|
40
|
+
? { current: r.current, latest: null, newer: null }
|
|
41
|
+
: { current: r.current, latest: r.latest, newer: r.isNewer };
|
|
42
|
+
return formatUpdate(info, adminLanguage(loadConfig())).split('\n');
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
describe: async () => {
|
|
46
|
+
startBackgroundCheck();
|
|
47
|
+
return buildAdminState(await input());
|
|
48
|
+
},
|
|
49
|
+
action: (req) => applyAdminAction(req, {
|
|
50
|
+
input,
|
|
51
|
+
doctor: opts.doctor ?? runDoctorLines,
|
|
52
|
+
checkUpdates: checkUpdatesLines,
|
|
53
|
+
}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=primary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primary.js","sourceRoot":"","sources":["../../src/admin/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAA0B,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAmB,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAoBhD,KAAK,UAAU,cAAc;IAC3B,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAC1E,OAAO,YAAY,CAAC,MAAM,SAAS,EAAE,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAyB;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,eAAe,CAAC;IACnD,IAAI,MAAM,GAAuD,IAAI,CAAC;IACtE,IAAI,eAAe,GAAyB,IAAI,CAAC;IAEjD,MAAM,KAAK,GAAG,GAAwB,EAAE,CACtC,gBAAgB,CAAC;QACf,MAAM,EAAE,GAAG,EAAE,CACX,OAAO,CAAC,OAAO,CACb,iBAAiB,CACf,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EACzD,oBAAoB,EAAE,CACvB,CACF;QACH,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;QACzD,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;KACrB,CAAC,CAAC;IAEL,MAAM,oBAAoB,GAAG,GAAS,EAAE;QACtC,IAAI,eAAe;YAAE,OAAO;QAC5B,eAAe,GAAG,KAAK,CAAC,EAAE,CAAC;aACxB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACpD,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,uDAAuD;QACzD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,IAAuB,EAAE;QACtD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,IAAI,GACR,CAAC,CAAC,MAAM,KAAK,IAAI;YACf,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YACnD,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACjE,OAAO,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,oBAAoB,EAAE,CAAC;YACvB,OAAO,eAAe,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CACd,gBAAgB,CAAC,GAAG,EAAE;YACpB,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,cAAc;YACrC,YAAY,EAAE,iBAAiB;SAChC,CAAC;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type DoctorServerStatus } from '../commands/doctor.js';
|
|
2
|
+
import type { AdminInput } from './descriptor.js';
|
|
3
|
+
export interface AdminSourceOptions {
|
|
4
|
+
/** The running primary against the installed version. */
|
|
5
|
+
server: () => Promise<DoctorServerStatus>;
|
|
6
|
+
/** `null` when unknown (out of process). */
|
|
7
|
+
tabsConnected?: () => number | null;
|
|
8
|
+
/** Version a connected tab's extension reported; `null` when none did. */
|
|
9
|
+
connectedExtensionVersion?: () => string | null;
|
|
10
|
+
/** Version of the running server; default this module's `VERSION`. */
|
|
11
|
+
version?: string;
|
|
12
|
+
/** Last known update check; `null` when none ran yet. */
|
|
13
|
+
update?: () => {
|
|
14
|
+
latest: string | null;
|
|
15
|
+
isNewer: boolean;
|
|
16
|
+
} | null;
|
|
17
|
+
now?: () => number;
|
|
18
|
+
}
|
|
19
|
+
export declare function gatherAdminInput(opts: AdminSourceOptions): Promise<AdminInput>;
|
|
20
|
+
/** The console's view of the running primary: its `/version`, or "not
|
|
21
|
+
* running" when nothing answers. */
|
|
22
|
+
export declare function probeRunningServer(): Promise<DoctorServerStatus>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { loadConfig } from '../config.js';
|
|
2
|
+
import { IPC_PORT } from '../bridge/protocol.js';
|
|
3
|
+
import { detectInstructionsStatus } from '../manual/status.js';
|
|
4
|
+
import { INSTALLERS } from '../installers/index.js';
|
|
5
|
+
import { isGrantLive, loadGrant, remainingMs } from '../cdp/grant.js';
|
|
6
|
+
import { resolveDownloadsDir } from '../downloads.js';
|
|
7
|
+
import { getDataDir } from '../map/paths.js';
|
|
8
|
+
import { TOOL_CATALOGUE } from '../permissions.js';
|
|
9
|
+
import { resolveExtensionPath } from '../commands/extension.js';
|
|
10
|
+
import { buildServerStatus } from '../commands/doctor.js';
|
|
11
|
+
import { probeVersion } from '../lifecycle/election.js';
|
|
12
|
+
import { VERSION, readInstalledVersion } from '../version.js';
|
|
13
|
+
/**
|
|
14
|
+
* Gathers the facts `buildAdminState` needs from the real machine. Shared by
|
|
15
|
+
* the primary (in process: it knows its tabs and is the running server) and
|
|
16
|
+
* the console's status view (out of process: it asks the primary's
|
|
17
|
+
* `/version`, and the tab count stays unknown). Every source is a
|
|
18
|
+
* best-effort read: one that throws degrades to an empty or unknown value.
|
|
19
|
+
*/
|
|
20
|
+
/** The WS bridge port; `ws-bridge.ts` owns it, repeated here (as `doctor`
|
|
21
|
+
* does) so the console does not load the bridge to read a number. */
|
|
22
|
+
const WS_BRIDGE_PORT = 17529;
|
|
23
|
+
function safe(read, fallback) {
|
|
24
|
+
try {
|
|
25
|
+
return read();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function detectClients() {
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const installer of INSTALLERS) {
|
|
34
|
+
try {
|
|
35
|
+
const d = installer.detect();
|
|
36
|
+
out.push({
|
|
37
|
+
id: installer.id,
|
|
38
|
+
displayName: installer.displayName,
|
|
39
|
+
installed: d.installed,
|
|
40
|
+
registered: d.registered,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* best effort: an unreadable client is left out */
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
export async function gatherAdminInput(opts) {
|
|
50
|
+
const config = safe(() => loadConfig(), {});
|
|
51
|
+
const grant = safe(() => loadGrant(), null);
|
|
52
|
+
const now = opts.now?.() ?? Date.now();
|
|
53
|
+
const server = await opts.server().catch(() => ({
|
|
54
|
+
running: null,
|
|
55
|
+
installed: readInstalledVersion(),
|
|
56
|
+
outdated: false,
|
|
57
|
+
}));
|
|
58
|
+
return {
|
|
59
|
+
config,
|
|
60
|
+
now,
|
|
61
|
+
version: opts.version ?? VERSION,
|
|
62
|
+
server,
|
|
63
|
+
tabsConnected: opts.tabsConnected?.() ?? null,
|
|
64
|
+
ports: { ws: WS_BRIDGE_PORT, ipc: IPC_PORT },
|
|
65
|
+
extension: {
|
|
66
|
+
path: safe(() => resolveExtensionPath(), null),
|
|
67
|
+
connectedVersion: opts.connectedExtensionVersion?.() ?? null,
|
|
68
|
+
},
|
|
69
|
+
instructions: safe(() => detectInstructionsStatus(), []),
|
|
70
|
+
clients: detectClients(),
|
|
71
|
+
cdpGrant: { live: isGrantLive(grant, now), remainingMs: remainingMs(grant, now) },
|
|
72
|
+
update: opts.update?.() ?? null,
|
|
73
|
+
toolNames: TOOL_CATALOGUE.map((t) => t.name),
|
|
74
|
+
downloadsDir: safe(() => resolveDownloadsDir(config, getDataDir()), ''),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** The console's view of the running primary: its `/version`, or "not
|
|
78
|
+
* running" when nothing answers. */
|
|
79
|
+
export async function probeRunningServer() {
|
|
80
|
+
return buildServerStatus(await probeVersion(WS_BRIDGE_PORT), readInstalledVersion());
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/admin/sources.ts"],"names":[],"mappings":"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"}
|
package/dist/bridge/dispatch.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { isToolEnabled } from '../permissions.js';
|
|
11
11
|
import { MAP_TOOL_DEFINITIONS, handleMapTool, isMapTool } from '../map/tools.js';
|
|
12
12
|
import { BROWSER_TOOL_DEFINITIONS } from '../tools/browser-definitions.js';
|
|
13
|
-
import { handleBrowserTool, isBrowserTool, } from '../tools/browser-dispatch.js';
|
|
13
|
+
import { handleBrowserTool, isBrowserTool, outdatedServerHint, } from '../tools/browser-dispatch.js';
|
|
14
14
|
import { hintToolResponse, imageToolResponse, toolError, toolResponse, } from '../tools/responses.js';
|
|
15
15
|
import { buildEmptyTabsHint } from '../tools/empty-tabs-hint.js';
|
|
16
16
|
export function handleToolsList(deps) {
|
|
@@ -34,12 +34,22 @@ export async function handleToolCall(req, deps) {
|
|
|
34
34
|
const result = await handleBrowserTool(name, args, deps.browserTools, caller);
|
|
35
35
|
if (name === 'browser.screenshot')
|
|
36
36
|
return imageToolResponse(result);
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
// list_tabs explains itself in a second block; the first stays the
|
|
38
|
+
// bare array every client already parses. An empty list gets the
|
|
39
|
+
// reconnect hint; a server older than the installed one gets the
|
|
40
|
+
// outdated-server hint (S3b, 0.41.0). Both may apply.
|
|
41
|
+
if (name === 'browser.list_tabs' && Array.isArray(result)) {
|
|
42
|
+
const hints = [];
|
|
43
|
+
if (result.length === 0) {
|
|
44
|
+
const events = deps.browserTools.recentEvents?.({ limit: 200 });
|
|
45
|
+
if (events)
|
|
46
|
+
hints.push(buildEmptyTabsHint(events, Date.now()));
|
|
47
|
+
}
|
|
48
|
+
const outdated = outdatedServerHint();
|
|
49
|
+
if (outdated)
|
|
50
|
+
hints.push(outdated);
|
|
51
|
+
if (hints.length > 0)
|
|
52
|
+
return hintToolResponse(result, hints.join('\n'));
|
|
43
53
|
}
|
|
44
54
|
return toolResponse(result);
|
|
45
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/bridge/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,aAAa,
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/bridge/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WebSocket, WebSocketServer } from 'ws';
|
|
2
|
-
import type { ActivityPurgeMessage, ActivityQueryMessage, FlowRecordedPayload, ServerToExtension, SettingsUpdateMessage, TabRegisterPayload } from '../messages.js';
|
|
2
|
+
import type { ActivityPurgeMessage, AdminActionMessage, AdminActionResult, AdminDescribeMessage, AdminState, ActivityQueryMessage, ExtensionToServer, FlowRecordedPayload, ServerToExtension, SettingsUpdateMessage, TabRegisterPayload, TabRegisteredPayload } from '../messages.js';
|
|
3
3
|
import { type BridgeEventLog } from './events.js';
|
|
4
4
|
export declare const WS_HOST = "127.0.0.1";
|
|
5
5
|
export declare const WS_PORT = 17529;
|
|
@@ -18,11 +18,58 @@ export interface PendingRequest {
|
|
|
18
18
|
timeout: NodeJS.Timeout;
|
|
19
19
|
}
|
|
20
20
|
export declare function isAddrInUse(err: unknown): boolean;
|
|
21
|
+
export interface WsBridgeOptions {
|
|
22
|
+
/** Test-only: bind another port (0 = any free port). Default `WS_PORT`. */
|
|
23
|
+
port?: number;
|
|
24
|
+
/** Test-only: the version this bridge reports. Default `VERSION`. */
|
|
25
|
+
version?: string;
|
|
26
|
+
/** Starts the popup "Repair connection" restart (see lifecycle/repair.ts).
|
|
27
|
+
* Absent → `bridge.repair` is answered with `ok: false`. */
|
|
28
|
+
onRepair?: () => boolean;
|
|
29
|
+
/** The admin panel (admin/descriptor.ts, admin/actions.ts), wired by the
|
|
30
|
+
* primary. Absent → `admin.*` is answered with `ok: false`. */
|
|
31
|
+
admin?: AdminHandlers;
|
|
32
|
+
}
|
|
33
|
+
/** What the primary hands the bridge to answer `admin.describe` and
|
|
34
|
+
* `admin.action`. Both may reject; the bridge turns that into `ok: false`. */
|
|
35
|
+
export interface AdminHandlers {
|
|
36
|
+
describe: () => Promise<AdminState>;
|
|
37
|
+
action: (req: {
|
|
38
|
+
id: string;
|
|
39
|
+
value?: string | number | boolean;
|
|
40
|
+
confirm?: boolean;
|
|
41
|
+
}) => Promise<AdminActionResult>;
|
|
42
|
+
}
|
|
43
|
+
/** The effective bind target and reported version. Exported so the
|
|
44
|
+
* defaults are testable without binding the fixed port. */
|
|
45
|
+
export declare function resolveBridgeOptions(options?: WsBridgeOptions): {
|
|
46
|
+
host: string;
|
|
47
|
+
port: number;
|
|
48
|
+
version: string;
|
|
49
|
+
};
|
|
50
|
+
/** The `tab.registered` payload: the running version (`serverVersion`, as
|
|
51
|
+
* before), plus the version installed on disk right now and this pid, so
|
|
52
|
+
* the popup can show "running X · installed Y". */
|
|
53
|
+
export declare function buildTabRegisteredPayload(tabId: string, serverVersion: string, installedVersion: string | null, serverPid: number): TabRegisteredPayload;
|
|
21
54
|
/** Bring up the WebSocket bridge for the Chrome extension. Resolves only
|
|
22
55
|
* after the server is listening, so the caller can fail fast (and refuse
|
|
23
56
|
* to expose the MCP transport) when the port is taken or any other bind
|
|
24
|
-
* error happens.
|
|
25
|
-
|
|
57
|
+
* error happens.
|
|
58
|
+
*
|
|
59
|
+
* The bridge owns its HTTP server: WebSocket upgrades go to the
|
|
60
|
+
* `WebSocketServer` (same Chromium-only `verifyClient`), `GET /version`
|
|
61
|
+
* answers the election probe and every other plain request is a 404.
|
|
62
|
+
* Closing the returned `WebSocketServer` also closes the HTTP server. */
|
|
63
|
+
/**
|
|
64
|
+
* Whether a WebSocket handshake's `Origin` may open the bridge. A web page
|
|
65
|
+
* running inside Chrome passes the peer-process check (the owning process is
|
|
66
|
+
* Chromium) but always announces its own http(s) origin; only the extension's
|
|
67
|
+
* own context (`chrome-extension://<id>`) is allowed, and a missing `Origin`
|
|
68
|
+
* (non-browser clients) is left to the peer-process check. Pure; exported for
|
|
69
|
+
* tests. Since 0.42.0.
|
|
70
|
+
*/
|
|
71
|
+
export declare function isAllowedHandshakeOrigin(origin: string | undefined): boolean;
|
|
72
|
+
export declare function startWsBridge(tabs: Map<string, TabSession>, pendingRequests: Map<string, PendingRequest>, events: BridgeEventLog, options?: WsBridgeOptions): Promise<WebSocketServer>;
|
|
26
73
|
/**
|
|
27
74
|
* Build the `settings.update` a freshly-registered tab should receive, or
|
|
28
75
|
* `null` when nothing should be sent. Each of `idleTtlMinutes` and
|
|
@@ -115,6 +162,21 @@ export declare function handleFlowRecordedMessage(payload: FlowRecordedPayload,
|
|
|
115
162
|
* audit panel must not take the bridge connection down with it.
|
|
116
163
|
*/
|
|
117
164
|
export declare function handleActivityQueryMessage(msg: ActivityQueryMessage): ServerToExtension;
|
|
165
|
+
/**
|
|
166
|
+
* Answer one `admin.describe` or `admin.action` frame. Exported so it is
|
|
167
|
+
* unit-testable directly, like `handleActivityQueryMessage`. Never rejects:
|
|
168
|
+
* a handler that throws, a malformed frame or a bridge without handlers
|
|
169
|
+
* comes back as `ok: false`. Only the typed fields of an action reach the
|
|
170
|
+
* handler.
|
|
171
|
+
*/
|
|
172
|
+
export declare function handleAdminMessage(msg: AdminDescribeMessage | AdminActionMessage, admin?: AdminHandlers): Promise<ServerToExtension>;
|
|
173
|
+
/**
|
|
174
|
+
* The request/response frames the bridge answers without a tab scope:
|
|
175
|
+
* `activity.query` (synchronous, as before) and `admin.*` (asynchronous).
|
|
176
|
+
* `null` for every other kind. Exported so the dispatch is testable without
|
|
177
|
+
* binding the bridge port.
|
|
178
|
+
*/
|
|
179
|
+
export declare function routeRequestMessage(msg: ExtensionToServer, admin?: AdminHandlers): ServerToExtension | Promise<ServerToExtension> | null;
|
|
118
180
|
/**
|
|
119
181
|
* Answer one `activity.purge` frame.
|
|
120
182
|
*
|