@jobshimo/browser-link 0.2.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +37 -0
  2. package/dist/bridge/client.d.ts +101 -0
  3. package/dist/bridge/client.js +435 -0
  4. package/dist/bridge/client.js.map +1 -0
  5. package/dist/bridge/dispatch.d.ts +29 -0
  6. package/dist/bridge/dispatch.js +39 -0
  7. package/dist/bridge/dispatch.js.map +1 -0
  8. package/dist/bridge/events.d.ts +39 -0
  9. package/dist/bridge/events.js +47 -0
  10. package/dist/bridge/events.js.map +1 -0
  11. package/dist/bridge/protocol.d.ts +80 -0
  12. package/dist/bridge/protocol.js +79 -0
  13. package/dist/bridge/protocol.js.map +1 -0
  14. package/dist/bridge/server.d.ts +42 -0
  15. package/dist/bridge/server.js +336 -0
  16. package/dist/bridge/server.js.map +1 -0
  17. package/dist/bridge/token.d.ts +17 -0
  18. package/dist/bridge/token.js +79 -0
  19. package/dist/bridge/token.js.map +1 -0
  20. package/dist/cli.js +106 -15
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/doctor.d.ts +12 -1
  23. package/dist/commands/doctor.js +90 -20
  24. package/dist/commands/doctor.js.map +1 -1
  25. package/dist/commands/extension.d.ts +3 -2
  26. package/dist/commands/extension.js +53 -28
  27. package/dist/commands/extension.js.map +1 -1
  28. package/dist/commands/free-port.d.ts +21 -0
  29. package/dist/commands/free-port.js +146 -0
  30. package/dist/commands/free-port.js.map +1 -0
  31. package/dist/commands/multi-agent.d.ts +7 -0
  32. package/dist/commands/multi-agent.js +109 -0
  33. package/dist/commands/multi-agent.js.map +1 -0
  34. package/dist/commands/tools.d.ts +11 -0
  35. package/dist/commands/tools.js +168 -0
  36. package/dist/commands/tools.js.map +1 -0
  37. package/dist/commands/updates.d.ts +2 -1
  38. package/dist/commands/updates.js +24 -7
  39. package/dist/commands/updates.js.map +1 -1
  40. package/dist/config.d.ts +25 -3
  41. package/dist/config.js +35 -2
  42. package/dist/config.js.map +1 -1
  43. package/dist/messages.d.ts +7 -0
  44. package/dist/permissions.d.ts +37 -0
  45. package/dist/permissions.js +156 -0
  46. package/dist/permissions.js.map +1 -0
  47. package/dist/server.d.ts +7 -3
  48. package/dist/server.js +196 -32
  49. package/dist/server.js.map +1 -1
  50. package/dist/tools/browser-definitions.js +18 -0
  51. package/dist/tools/browser-definitions.js.map +1 -1
  52. package/dist/tools/browser-dispatch.d.ts +7 -0
  53. package/dist/tools/browser-dispatch.js +11 -0
  54. package/dist/tools/browser-dispatch.js.map +1 -1
  55. package/dist/tools/server-instructions.d.ts +1 -1
  56. package/dist/tools/server-instructions.js +4 -0
  57. package/dist/tools/server-instructions.js.map +1 -1
  58. package/dist/ui/app.js +20 -1
  59. package/dist/ui/app.js.map +1 -1
  60. package/dist/ui/screens.d.ts +18 -1
  61. package/dist/ui/screens.js +395 -2
  62. package/dist/ui/screens.js.map +1 -1
  63. package/package.json +4 -3
@@ -0,0 +1,17 @@
1
+ /** Where the per-session token file lives. */
2
+ export declare function tokenPath(): string;
3
+ /** Generate a fresh 32-byte hex token. */
4
+ export declare function generateToken(): string;
5
+ /** Write the given token to the data dir, replacing any previous value.
6
+ * Tries to set 0600 permissions on POSIX; on Windows the file ACL
7
+ * inherits from the user's profile, which is already user-only. */
8
+ export declare function writeToken(token: string): string;
9
+ /** Read the current token. Returns null if no token file exists or if
10
+ * it does not look like a valid 32-byte hex string. */
11
+ export declare function readToken(): string | null;
12
+ /** Generate + write a fresh token. Returns it. Called by every primary
13
+ * on startup, so any zombie token from a previous primary is invalidated. */
14
+ export declare function rotateToken(): string;
15
+ /** Best-effort cleanup. Used when the primary shuts down cleanly so the
16
+ * file doesn't linger as misleading state. */
17
+ export declare function clearToken(): void;
@@ -0,0 +1,79 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { randomBytes } from 'node:crypto';
4
+ import { getDataDir } from '../map/paths.js';
5
+ /**
6
+ * Per-session authentication token for the IPC channel between primary and
7
+ * proxy browser-link processes. The primary writes a fresh random token at
8
+ * startup; proxies read it just before sending their hello frame.
9
+ *
10
+ * Security model: the file lives in the user's data dir. On POSIX we set
11
+ * 0600 so only the user can read it. On Windows the file inherits the
12
+ * user-profile ACL, which is already restricted to the same user. A
13
+ * malicious process running as the same user can read the file — at that
14
+ * point the user has already lost — but a different local user, a remote
15
+ * peer, or a sandboxed process cannot.
16
+ */
17
+ const TOKEN_FILE_NAME = 'multi-agent-token';
18
+ const TOKEN_HEX_LENGTH = 64; // 32 bytes hex = 64 chars
19
+ /** Where the per-session token file lives. */
20
+ export function tokenPath() {
21
+ return join(getDataDir(), TOKEN_FILE_NAME);
22
+ }
23
+ /** Generate a fresh 32-byte hex token. */
24
+ export function generateToken() {
25
+ return randomBytes(32).toString('hex');
26
+ }
27
+ /** Write the given token to the data dir, replacing any previous value.
28
+ * Tries to set 0600 permissions on POSIX; on Windows the file ACL
29
+ * inherits from the user's profile, which is already user-only. */
30
+ export function writeToken(token) {
31
+ const path = tokenPath();
32
+ mkdirSync(dirname(path), { recursive: true });
33
+ writeFileSync(path, token, 'utf8');
34
+ try {
35
+ chmodSync(path, 0o600);
36
+ }
37
+ catch {
38
+ // chmod is a no-op on Windows; ignore.
39
+ }
40
+ return path;
41
+ }
42
+ /** Read the current token. Returns null if no token file exists or if
43
+ * it does not look like a valid 32-byte hex string. */
44
+ export function readToken() {
45
+ const path = tokenPath();
46
+ if (!existsSync(path))
47
+ return null;
48
+ try {
49
+ const raw = readFileSync(path, 'utf8').trim();
50
+ if (raw.length !== TOKEN_HEX_LENGTH)
51
+ return null;
52
+ if (!/^[0-9a-f]+$/i.test(raw))
53
+ return null;
54
+ return raw;
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /** Generate + write a fresh token. Returns it. Called by every primary
61
+ * on startup, so any zombie token from a previous primary is invalidated. */
62
+ export function rotateToken() {
63
+ const token = generateToken();
64
+ writeToken(token);
65
+ return token;
66
+ }
67
+ /** Best-effort cleanup. Used when the primary shuts down cleanly so the
68
+ * file doesn't linger as misleading state. */
69
+ export function clearToken() {
70
+ const path = tokenPath();
71
+ try {
72
+ if (existsSync(path))
73
+ unlinkSync(path);
74
+ }
75
+ catch {
76
+ // ignore
77
+ }
78
+ }
79
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/bridge/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;GAWG;AAEH,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAC5C,MAAM,gBAAgB,GAAG,EAAE,CAAC,CAAC,0BAA0B;AAEvD,8CAA8C;AAC9C,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED;;mEAEmE;AACnE,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;uDACuD;AACvD,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,UAAU,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;8CAC8C;AAC9C,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC"}
package/dist/cli.js CHANGED
@@ -5,9 +5,53 @@ import { uninstallAll, uninstallFor } from './commands/uninstall.js';
5
5
  import { printExtensionInstructions } from './commands/extension.js';
6
6
  import { printAbout } from './commands/about.js';
7
7
  import { checkUpdates, formatUpdate } from './commands/updates.js';
8
+ import { runToolsCommand } from './commands/tools.js';
9
+ import { runMultiAgentCommand } from './commands/multi-agent.js';
10
+ import { runFreePort } from './commands/free-port.js';
8
11
  import { loadConfig } from './config.js';
9
12
  import { VERSION } from './version.js';
10
- const HELP = `browser-link ${VERSION} — bridge any MCP client to the Chrome tabs you enable.
13
+ function buildHelp(language) {
14
+ if (language === 'es') {
15
+ return `browser-link ${VERSION} — puente entre cualquier cliente MCP y las pestañas de Chrome que vos habilites.
16
+
17
+ Uso:
18
+ browser-link Abre el setup interactivo (registrar un
19
+ cliente, ver pasos de la extensión, doctor,
20
+ buscar actualizaciones) cuando se invoca
21
+ desde una terminal.
22
+ Cuando lo invoca un cliente MCP por stdio,
23
+ arranca el servidor MCP.
24
+ browser-link install Registra browser-link en todos los clientes detectados.
25
+ browser-link install --client <claude|opencode|copilot>
26
+ Registra sólo en el cliente nombrado.
27
+ browser-link uninstall Elimina todos los registros.
28
+ browser-link uninstall --client <id>
29
+ Elimina sólo el registro nombrado.
30
+ browser-link extension Muestra la ruta de los assets de la extensión
31
+ de Chrome y los pasos por SO.
32
+ browser-link doctor Diagnostica el setup actual (clientes, servidor, extensión, base del mapa).
33
+ browser-link updates Consulta el registry de npm en busca de versión nueva.
34
+ browser-link tools Muestra qué tools MCP están habilitadas / deshabilitadas.
35
+ browser-link tools enable <nombre…> Vuelve a habilitar tools concretas.
36
+ browser-link tools disable <nombre…> Deshabilita tools concretas.
37
+ browser-link tools preset <id> Aplica un preset: all | readonly | no-eval | no-map.
38
+ browser-link multi-agent Estado del modo multi-agente y re-elección automática.
39
+ browser-link multi-agent enable | disable
40
+ browser-link multi-agent auto-reelect enable | disable
41
+ browser-link stop Mata el proceso browser-link que esté ocupando el
42
+ puerto 17529 (útil si un cliente MCP quedó zombie).
43
+ browser-link about Muestra la explicación completa.
44
+ browser-link version Muestra la versión instalada (también: --version, -v).
45
+ browser-link help Este mensaje.
46
+
47
+ Variables de entorno:
48
+ BROWSER_LINK_DATA_DIR Sobreescribe la ruta de la base (default por SO).
49
+ BROWSER_LINK_BIN Sobreescribe el comando guardado en los configs
50
+ de los clientes (p. ej. "node /path/to/dist/index.js" en dev).
51
+ COPILOT_HOME Sobreescribe el directorio de config del CLI de
52
+ GitHub Copilot (default ~/.copilot).`;
53
+ }
54
+ return `browser-link ${VERSION} — bridge any MCP client to the Chrome tabs you enable.
11
55
 
12
56
  Usage:
13
57
  browser-link When invoked from an interactive terminal,
@@ -25,6 +69,15 @@ Usage:
25
69
  per-OS install instructions.
26
70
  browser-link doctor Diagnose current setup (clients, server, extension, map DB).
27
71
  browser-link updates Check the npm registry for a newer version.
72
+ browser-link tools Show which MCP tools are enabled / disabled.
73
+ browser-link tools enable <name…> Re-enable specific tools.
74
+ browser-link tools disable <name…> Disable specific tools.
75
+ browser-link tools preset <id> Apply a preset: all | readonly | no-eval | no-map.
76
+ browser-link multi-agent Show multi-agent mode + auto-reelect status.
77
+ browser-link multi-agent enable | disable
78
+ browser-link multi-agent auto-reelect enable | disable
79
+ browser-link stop Kill the browser-link process holding port 17529
80
+ (useful when an MCP client left a zombie behind).
28
81
  browser-link about Show the full explanation of what this is and how it works.
29
82
  browser-link version Print the installed version (also: --version, -v).
30
83
  browser-link help This message.
@@ -35,17 +88,39 @@ Environment:
35
88
  (e.g. "node /path/to/dist/index.js" for dev).
36
89
  COPILOT_HOME Override GitHub Copilot CLI's config dir
37
90
  (default ~/.copilot).`;
38
- function parseClient(argv) {
91
+ }
92
+ const CLI_I18N = {
93
+ en: {
94
+ help: '',
95
+ restartHint: 'Restart the MCP client so it picks up the registration.',
96
+ installNext: 'Next: install the Chrome extension — run `browser-link extension`.',
97
+ toolsRestart: 'Restart your MCP client so it picks up the change.',
98
+ unknownCommand: (cmd) => `Unknown command: ${cmd}`,
99
+ unknownClient: (val) => `Unknown --client value: ${val}. Use claude, opencode or copilot.`,
100
+ },
101
+ es: {
102
+ help: '',
103
+ restartHint: 'Reiniciá el cliente MCP para que tome el registro.',
104
+ installNext: 'Siguiente: instalá la extensión de Chrome — corré `browser-link extension`.',
105
+ toolsRestart: 'Reiniciá el cliente MCP para que tome el cambio.',
106
+ unknownCommand: (cmd) => `Comando desconocido: ${cmd}`,
107
+ unknownClient: (val) => `Valor de --client desconocido: ${val}. Usá claude, opencode o copilot.`,
108
+ },
109
+ };
110
+ function parseClient(argv, language) {
39
111
  const idx = argv.findIndex((a) => a === '--client');
40
112
  if (idx === -1 || idx === argv.length - 1)
41
113
  return null;
42
114
  const val = argv[idx + 1];
43
115
  if (val === 'claude' || val === 'opencode' || val === 'copilot')
44
116
  return val;
45
- throw new Error(`Unknown --client value: ${val}. Use claude, opencode or copilot.`);
117
+ throw new Error(CLI_I18N[language].unknownClient(val ?? ''));
46
118
  }
47
119
  async function dispatch(argv) {
48
120
  const [cmd, ...rest] = argv;
121
+ const cfg = loadConfig();
122
+ const language = cfg.language ?? 'en';
123
+ const t = CLI_I18N[language];
49
124
  switch (cmd) {
50
125
  case undefined:
51
126
  case 'start': {
@@ -56,50 +131,66 @@ async function dispatch(argv) {
56
131
  case 'help':
57
132
  case '-h':
58
133
  case '--help': {
59
- console.log(HELP);
134
+ console.log(buildHelp(language));
60
135
  return;
61
136
  }
62
137
  case 'install': {
63
- const client = parseClient(rest);
138
+ const client = parseClient(rest, language);
64
139
  const reports = client ? [installFor(client)] : installAll();
65
140
  for (const r of reports) {
66
141
  const prefix = r.installedClient ? '✓' : '·';
67
142
  console.log(`${prefix} ${r.displayName}: ${r.message}`);
68
143
  }
69
144
  console.log('');
70
- console.log('Restart the MCP client so it picks up the registration.');
71
- console.log('Next: install the Chrome extension — run `browser-link extension`.');
145
+ console.log(t.restartHint);
146
+ console.log(t.installNext);
72
147
  return;
73
148
  }
74
149
  case 'uninstall': {
75
- const client = parseClient(rest);
150
+ const client = parseClient(rest, language);
76
151
  const reports = client ? [uninstallFor(client)] : uninstallAll();
77
152
  for (const r of reports)
78
153
  console.log(`· ${r.displayName}: ${r.message}`);
79
154
  return;
80
155
  }
81
156
  case 'extension': {
82
- printExtensionInstructions();
157
+ printExtensionInstructions(language);
83
158
  return;
84
159
  }
85
160
  case 'doctor': {
86
161
  const report = await runDoctor();
87
- console.log(formatDoctor(report));
162
+ console.log(formatDoctor(report, language));
88
163
  return;
89
164
  }
90
165
  case 'about': {
91
- const cfg = loadConfig();
92
- printAbout(cfg.language ?? 'en');
166
+ printAbout(language);
93
167
  return;
94
168
  }
95
169
  case 'updates': {
96
170
  const info = await checkUpdates();
97
- console.log(formatUpdate(info));
171
+ console.log(formatUpdate(info, language));
98
172
  // Non-zero exit when we could not reach the registry, so scripts can detect it.
99
173
  if (info.error || info.latest === null)
100
174
  process.exit(2);
101
175
  return;
102
176
  }
177
+ case 'tools': {
178
+ console.log(runToolsCommand(rest, language));
179
+ console.log('');
180
+ console.log(t.toolsRestart);
181
+ return;
182
+ }
183
+ case 'multi-agent': {
184
+ console.log(runMultiAgentCommand(rest, language));
185
+ return;
186
+ }
187
+ case 'stop': {
188
+ const result = runFreePort(language);
189
+ console.log(result.message);
190
+ if (!result.ok)
191
+ process.exit(2);
192
+ return;
193
+ }
103
194
  case 'version':
104
195
  case '-v':
105
196
  case '--version': {
@@ -107,9 +198,9 @@ async function dispatch(argv) {
107
198
  return;
108
199
  }
109
200
  default: {
110
- console.error(`Unknown command: ${cmd}`);
201
+ console.error(t.unknownCommand(cmd));
111
202
  console.error('');
112
- console.error(HELP);
203
+ console.error(buildHelp(language));
113
204
  process.exit(2);
114
205
  }
115
206
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { Language } from './welcome.js';
1
2
  export interface DoctorReport {
2
3
  ws: {
3
4
  listening: boolean;
@@ -5,6 +6,16 @@ export interface DoctorReport {
5
6
  host: string;
6
7
  port: number;
7
8
  };
9
+ ipc: {
10
+ listening: boolean;
11
+ detail: string;
12
+ host: string;
13
+ port: number;
14
+ };
15
+ multiAgent: {
16
+ enabled: boolean;
17
+ autoReelect: boolean;
18
+ };
8
19
  clients: {
9
20
  id: string;
10
21
  displayName: string;
@@ -26,4 +37,4 @@ export interface DoctorReport {
26
37
  };
27
38
  }
28
39
  export declare function runDoctor(): Promise<DoctorReport>;
29
- export declare function formatDoctor(r: DoctorReport): string;
40
+ export declare function formatDoctor(r: DoctorReport, language?: Language): string;
@@ -5,6 +5,8 @@ import { getAllowedBrowsers } from '../auth/allowlist.js';
5
5
  import { getDbPath } from '../map/paths.js';
6
6
  import { listApps } from '../map/queries.js';
7
7
  import { resolveExtensionPath } from './extension.js';
8
+ import { loadConfig } from '../config.js';
9
+ import { IPC_HOST, IPC_PORT } from '../bridge/protocol.js';
8
10
  const WS_HOST = '127.0.0.1';
9
11
  const WS_PORT = 17529;
10
12
  function checkPort(host, port, timeoutMs = 500) {
@@ -31,6 +33,7 @@ function checkPort(host, port, timeoutMs = 500) {
31
33
  }
32
34
  export async function runDoctor() {
33
35
  const ws = await checkPort(WS_HOST, WS_PORT);
36
+ const ipc = await checkPort(IPC_HOST, IPC_PORT);
34
37
  const clients = INSTALLERS.map((i) => {
35
38
  const d = i.detect();
36
39
  return { id: i.id, displayName: i.displayName, ...d };
@@ -48,8 +51,11 @@ export async function runDoctor() {
48
51
  apps = -1;
49
52
  }
50
53
  }
54
+ const cfg = loadConfig();
51
55
  return {
52
56
  ws: { ...ws, host: WS_HOST, port: WS_PORT },
57
+ ipc: { ...ipc, host: IPC_HOST, port: IPC_PORT },
58
+ multiAgent: { enabled: cfg.multiAgent === true, autoReelect: cfg.autoReelect === true },
53
59
  clients,
54
60
  extension: { path: extPath },
55
61
  map: { dbPath, exists: dbExists, sizeBytes, apps },
@@ -59,52 +65,116 @@ export async function runDoctor() {
59
65
  function symbol(ok) {
60
66
  return ok ? '✓' : '✗';
61
67
  }
62
- export function formatDoctor(r) {
68
+ const DOCTOR_I18N = {
69
+ en: {
70
+ title: 'browser-link doctor',
71
+ wsBridge: 'WebSocket bridge',
72
+ wsHint: ' (the server is launched by your MCP client; open Claude Code / OpenCode / Copilot CLI to start it)',
73
+ clientsHeader: 'MCP clients:',
74
+ clientNotInstalled: '✗ not installed',
75
+ clientRegistered: '✓ registered',
76
+ clientNotRegistered: '⚠ installed but not registered',
77
+ clientConfig: 'config:',
78
+ extensionHeader: 'Chrome extension assets:',
79
+ extensionNotFound: 'not found (run `browser-link extension` for guidance)',
80
+ mapHeader: 'Map DB:',
81
+ mapPath: 'path:',
82
+ mapNotCreated: ' (not created yet — will be initialized on first run)',
83
+ mapSize: 'size:',
84
+ mapApps: 'apps tracked:',
85
+ processBinding: 'Process binding:',
86
+ processBindingNone: ' ✗ no allowlist for this OS — incoming WS connections will be rejected.',
87
+ processBindingOk: (n) => ` ✓ accepts WS connections from ${n} known browser binaries.`,
88
+ multiAgentHeader: 'Multi-agent:',
89
+ multiAgentMode: ' Mode ',
90
+ autoReelect: ' Auto-reelect ',
91
+ on: 'on',
92
+ off: 'off',
93
+ ipcLine: ' IPC port ',
94
+ ipcListening: 'listening (a primary is running)',
95
+ ipcFree: 'free (no primary on this machine)',
96
+ },
97
+ es: {
98
+ title: 'browser-link doctor',
99
+ wsBridge: 'Puente WebSocket',
100
+ wsHint: ' (lo arranca tu cliente MCP; abrí Claude Code / OpenCode / Copilot CLI para iniciarlo)',
101
+ clientsHeader: 'Clientes MCP:',
102
+ clientNotInstalled: '✗ no instalado',
103
+ clientRegistered: '✓ registrado',
104
+ clientNotRegistered: '⚠ instalado pero no registrado',
105
+ clientConfig: 'config:',
106
+ extensionHeader: 'Assets de la extensión de Chrome:',
107
+ extensionNotFound: 'no encontrada (corré `browser-link extension` para la guía)',
108
+ mapHeader: 'Base de datos del mapa:',
109
+ mapPath: 'ruta:',
110
+ mapNotCreated: ' (todavía no se creó — se inicializa en el primer arranque)',
111
+ mapSize: 'tamaño:',
112
+ mapApps: 'apps registradas:',
113
+ processBinding: 'Validación por proceso:',
114
+ processBindingNone: ' ✗ sin allowlist para este SO — las conexiones WS entrantes se rechazan.',
115
+ processBindingOk: (n) => ` ✓ acepta conexiones WS desde ${n} binarios de navegador conocidos.`,
116
+ multiAgentHeader: 'Multi-agente:',
117
+ multiAgentMode: ' Modo ',
118
+ autoReelect: ' Re-elección auto ',
119
+ on: 'activado',
120
+ off: 'desactivado',
121
+ ipcLine: ' Puerto IPC ',
122
+ ipcListening: 'escuchando (hay un primary corriendo)',
123
+ ipcFree: 'libre (no hay primary en esta máquina)',
124
+ },
125
+ };
126
+ export function formatDoctor(r, language = 'en') {
127
+ const t = DOCTOR_I18N[language];
63
128
  const lines = [];
64
- lines.push('browser-link doctor');
129
+ lines.push(t.title);
65
130
  lines.push('');
66
- lines.push(`WebSocket bridge ${symbol(r.ws.listening)} ${r.ws.host}:${r.ws.port} — ${r.ws.detail}`);
131
+ lines.push(`${t.wsBridge} ${symbol(r.ws.listening)} ${r.ws.host}:${r.ws.port} — ${r.ws.detail}`);
67
132
  if (!r.ws.listening) {
68
- lines.push(' (the server is launched by your MCP client; open Claude Code / OpenCode to start it)');
133
+ lines.push(t.wsHint);
69
134
  }
70
135
  lines.push('');
71
- lines.push('MCP clients:');
136
+ lines.push(t.clientsHeader);
72
137
  for (const c of r.clients) {
73
138
  const status = !c.installed
74
- ? '✗ not installed'
139
+ ? t.clientNotInstalled
75
140
  : c.registered
76
- ? '✓ registered'
77
- : '⚠ installed but not registered';
78
- lines.push(` ${c.displayName.padEnd(14)} ${status}`);
79
- lines.push(` ${' '.repeat(14)} config: ${c.configPath}`);
141
+ ? t.clientRegistered
142
+ : t.clientNotRegistered;
143
+ lines.push(` ${c.displayName.padEnd(20)} ${status}`);
144
+ lines.push(` ${' '.repeat(20)} ${t.clientConfig} ${c.configPath}`);
80
145
  }
81
146
  lines.push('');
82
- lines.push('Chrome extension assets:');
147
+ lines.push(t.extensionHeader);
83
148
  if (r.extension.path) {
84
149
  lines.push(` ${symbol(true)} ${r.extension.path}`);
85
150
  }
86
151
  else {
87
- lines.push(` ${symbol(false)} not found (run \`browser-link extension\` for guidance)`);
152
+ lines.push(` ${symbol(false)} ${t.extensionNotFound}`);
88
153
  }
89
154
  lines.push('');
90
- lines.push('Map DB:');
91
- lines.push(` path: ${r.map.dbPath}`);
155
+ lines.push(t.mapHeader);
156
+ lines.push(` ${t.mapPath} ${r.map.dbPath}`);
92
157
  if (!r.map.exists) {
93
- lines.push(' (not created yet — will be initialized on first run)');
158
+ lines.push(t.mapNotCreated);
94
159
  }
95
160
  else {
96
- lines.push(` size: ${r.map.sizeBytes} bytes`);
97
- lines.push(` apps tracked: ${r.map.apps}`);
161
+ lines.push(` ${t.mapSize} ${r.map.sizeBytes} bytes`);
162
+ lines.push(` ${t.mapApps} ${r.map.apps}`);
98
163
  }
99
164
  lines.push('');
100
- lines.push('Process binding:');
165
+ lines.push(t.processBinding);
101
166
  if (r.security.allowedBrowsers.length === 0) {
102
- lines.push(` ✗ no allowlist for this OS — incoming WS connections will be rejected.`);
167
+ lines.push(t.processBindingNone);
103
168
  }
104
169
  else {
105
- lines.push(` ✓ accepts WS connections from ${r.security.allowedBrowsers.length} known browser binaries.`);
170
+ lines.push(t.processBindingOk(r.security.allowedBrowsers.length));
106
171
  lines.push(` (${r.security.allowedBrowsers.slice(0, 4).join(', ')}${r.security.allowedBrowsers.length > 4 ? ', …' : ''})`);
107
172
  }
173
+ lines.push('');
174
+ lines.push(t.multiAgentHeader);
175
+ lines.push(`${t.multiAgentMode}${r.multiAgent.enabled ? t.on : t.off}`);
176
+ lines.push(`${t.autoReelect}${r.multiAgent.autoReelect ? t.on : t.off}`);
177
+ lines.push(`${t.ipcLine}${r.ipc.listening ? t.ipcListening : t.ipcFree}`);
108
178
  return lines.join('\n');
109
179
  }
110
180
  //# sourceMappingURL=doctor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { Language } from './welcome.js';
1
2
  /**
2
3
  * Resolve the absolute path to the Chrome extension assets.
3
4
  * Tries the npm-install layout first, then the monorepo dev layout.
@@ -8,5 +9,5 @@ export interface ExtensionInfo {
8
9
  path: string | null;
9
10
  hints: string;
10
11
  }
11
- export declare function getExtensionInfo(): ExtensionInfo;
12
- export declare function printExtensionInstructions(): void;
12
+ export declare function getExtensionInfo(language?: Language): ExtensionInfo;
13
+ export declare function printExtensionInstructions(language?: Language): void;