@jobshimo/browser-link 0.7.8 → 0.7.9
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/dist/extension/manifest.json +1 -1
- package/dist/ui/app.js +1 -1
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/screens/about.d.ts +6 -0
- package/dist/ui/screens/about.js +17 -0
- package/dist/ui/screens/about.js.map +1 -0
- package/dist/ui/screens/client-picker.d.ts +8 -0
- package/dist/ui/screens/client-picker.js +43 -0
- package/dist/ui/screens/client-picker.js.map +1 -0
- package/dist/ui/screens/doctor.d.ts +6 -0
- package/dist/ui/screens/doctor.js +43 -0
- package/dist/ui/screens/doctor.js.map +1 -0
- package/dist/ui/screens/extension.d.ts +6 -0
- package/dist/ui/screens/extension.js +32 -0
- package/dist/ui/screens/extension.js.map +1 -0
- package/dist/ui/screens/free-port.d.ts +6 -0
- package/dist/ui/screens/free-port.js +83 -0
- package/dist/ui/screens/free-port.js.map +1 -0
- package/dist/ui/screens/index.d.ts +12 -0
- package/dist/ui/screens/index.js +13 -0
- package/dist/ui/screens/index.js.map +1 -0
- package/dist/ui/screens/install-result.d.ts +8 -0
- package/dist/ui/screens/install-result.js +27 -0
- package/dist/ui/screens/install-result.js.map +1 -0
- package/dist/ui/screens/language.d.ts +8 -0
- package/dist/ui/screens/language.js +42 -0
- package/dist/ui/screens/language.js.map +1 -0
- package/dist/ui/screens/menu.d.ts +9 -0
- package/dist/ui/screens/menu.js +81 -0
- package/dist/ui/screens/menu.js.map +1 -0
- package/dist/ui/screens/multi-agent.d.ts +6 -0
- package/dist/ui/screens/multi-agent.js +131 -0
- package/dist/ui/screens/multi-agent.js.map +1 -0
- package/dist/ui/screens/permissions.d.ts +6 -0
- package/dist/ui/screens/permissions.js +135 -0
- package/dist/ui/screens/permissions.js.map +1 -0
- package/dist/ui/screens/types.d.ts +4 -0
- package/dist/ui/screens/types.js +2 -0
- package/dist/ui/screens/types.js.map +1 -0
- package/dist/ui/screens/updates.d.ts +6 -0
- package/dist/ui/screens/updates.js +113 -0
- package/dist/ui/screens/updates.js.map +1 -0
- package/dist/ui/screens/welcome.d.ts +10 -0
- package/dist/ui/screens/welcome.js +44 -0
- package/dist/ui/screens/welcome.js.map +1 -0
- package/package.json +1 -1
- package/dist/ui/screens.d.ts +0 -65
- package/dist/ui/screens.js +0 -743
- package/dist/ui/screens.js.map +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
import { Frame } from '../components.js';
|
|
5
|
+
import { loadConfig, saveConfig } from '../../config.js';
|
|
6
|
+
const MULTI_AGENT_I18N = {
|
|
7
|
+
en: {
|
|
8
|
+
title: 'Multi-agent — let multiple MCP clients share one browser-link',
|
|
9
|
+
multiHeader: 'Multi-agent mode',
|
|
10
|
+
multiBody: [
|
|
11
|
+
'browser-link normally binds 127.0.0.1:17529 from the first MCP',
|
|
12
|
+
'client that starts it. Other clients (Claude + Copilot + OpenCode at',
|
|
13
|
+
'the same time) crash with "port in use".',
|
|
14
|
+
'',
|
|
15
|
+
'When multi-agent is ON, the second instance becomes a proxy that',
|
|
16
|
+
'forwards MCP requests to the first one over an internal port',
|
|
17
|
+
'(127.0.0.1:17530, kernel-validated like the main one). All agents',
|
|
18
|
+
'end up sharing the same connected Chrome tabs and the same',
|
|
19
|
+
'persistent UI map.',
|
|
20
|
+
].join('\n'),
|
|
21
|
+
multiToggle: 'Enable multi-agent mode',
|
|
22
|
+
reelectHeader: 'Auto-reelect on primary close (advanced)',
|
|
23
|
+
reelectBody: [
|
|
24
|
+
'When the primary client closes, secondary clients lose the bridge.',
|
|
25
|
+
'With auto-reelect ON, one of them takes over the primary role',
|
|
26
|
+
'automatically (race on bind). With it OFF, you relaunch your MCP',
|
|
27
|
+
'client manually to reconnect.',
|
|
28
|
+
].join('\n'),
|
|
29
|
+
reelectToggle: 'Auto-reelect when primary closes',
|
|
30
|
+
reelectDisabled: '(enable multi-agent first)',
|
|
31
|
+
unsaved: '* Unsaved changes — press s to save',
|
|
32
|
+
saved: '✓ Saved.',
|
|
33
|
+
restart: 'Restart every MCP client for these changes to take effect.',
|
|
34
|
+
footer: '↑↓ navigate · Space toggle · s save · Esc back',
|
|
35
|
+
},
|
|
36
|
+
es: {
|
|
37
|
+
title: 'Multi-agente — varios clientes MCP comparten el mismo puente',
|
|
38
|
+
multiHeader: 'Modo multi-agente',
|
|
39
|
+
multiBody: [
|
|
40
|
+
'browser-link normalmente bindea 127.0.0.1:17529 desde el primer',
|
|
41
|
+
'cliente MCP que lo arranca. Otros clientes (Claude + Copilot +',
|
|
42
|
+
'OpenCode al mismo tiempo) caen con "port in use".',
|
|
43
|
+
'',
|
|
44
|
+
'Con multi-agente activado, el segundo proceso se vuelve un proxy',
|
|
45
|
+
'que reenvía los pedidos MCP al primero por un puerto interno',
|
|
46
|
+
'(127.0.0.1:17530, validado por kernel igual que el principal).',
|
|
47
|
+
'Todos los agentes terminan viendo las mismas pestañas conectadas',
|
|
48
|
+
'y el mismo mapa persistente.',
|
|
49
|
+
].join('\n'),
|
|
50
|
+
multiToggle: 'Activar modo multi-agente',
|
|
51
|
+
reelectHeader: 'Re-elección automática al cerrar el primary (avanzado)',
|
|
52
|
+
reelectBody: [
|
|
53
|
+
'Cuando el cliente primary cierra, los secundarios pierden el',
|
|
54
|
+
'puente. Con re-elección automática activada, uno de ellos toma el',
|
|
55
|
+
'rol de primary automáticamente (race en el bind). Con ella',
|
|
56
|
+
'desactivada, tenés que relanzar el cliente MCP a mano para',
|
|
57
|
+
'reconectar.',
|
|
58
|
+
].join('\n'),
|
|
59
|
+
reelectToggle: 'Re-elegir automáticamente al cerrar el primary',
|
|
60
|
+
reelectDisabled: '(activá primero multi-agente)',
|
|
61
|
+
unsaved: '* Cambios sin guardar — apretá s para guardar',
|
|
62
|
+
saved: '✓ Guardado.',
|
|
63
|
+
restart: 'Reiniciá cada cliente MCP para que los cambios tengan efecto.',
|
|
64
|
+
footer: '↑↓ moverse · Espacio cambiar · s guardar · Esc volver',
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
export function MultiAgentView({ language, onBack }) {
|
|
68
|
+
const t = MULTI_AGENT_I18N[language];
|
|
69
|
+
const initialCfg = useMemo(() => loadConfig(), []);
|
|
70
|
+
const [savedMulti, setSavedMulti] = useState(initialCfg.multiAgent === true);
|
|
71
|
+
const [savedReelect, setSavedReelect] = useState(initialCfg.autoReelect === true);
|
|
72
|
+
const [multi, setMulti] = useState(savedMulti);
|
|
73
|
+
const [reelect, setReelect] = useState(savedReelect);
|
|
74
|
+
const [justSaved, setJustSaved] = useState(false);
|
|
75
|
+
// Only the two toggles are navigable.
|
|
76
|
+
const [cursor, setCursor] = useState('multi');
|
|
77
|
+
const move = (dir) => {
|
|
78
|
+
setCursor((c) => {
|
|
79
|
+
if (dir === 1)
|
|
80
|
+
return c === 'multi' ? 'reelect' : 'multi';
|
|
81
|
+
return c === 'reelect' ? 'multi' : 'reelect';
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
const toggle = () => {
|
|
85
|
+
if (cursor === 'multi') {
|
|
86
|
+
setMulti((m) => {
|
|
87
|
+
const next = !m;
|
|
88
|
+
// Turning multi off also clears the working reelect state, matching
|
|
89
|
+
// the config normalisation rule (autoReelect implies multiAgent).
|
|
90
|
+
if (!next)
|
|
91
|
+
setReelect(false);
|
|
92
|
+
return next;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Auto-reelect can only be turned on when multi is on.
|
|
97
|
+
if (!multi)
|
|
98
|
+
return;
|
|
99
|
+
setReelect((r) => !r);
|
|
100
|
+
}
|
|
101
|
+
setJustSaved(false);
|
|
102
|
+
};
|
|
103
|
+
const save = () => {
|
|
104
|
+
saveConfig({ multiAgent: multi, autoReelect: multi ? reelect : false });
|
|
105
|
+
setSavedMulti(multi);
|
|
106
|
+
setSavedReelect(multi ? reelect : false);
|
|
107
|
+
setJustSaved(true);
|
|
108
|
+
};
|
|
109
|
+
useInput((input, key) => {
|
|
110
|
+
if (key.upArrow)
|
|
111
|
+
move(-1);
|
|
112
|
+
else if (key.downArrow)
|
|
113
|
+
move(1);
|
|
114
|
+
else if (input === ' ')
|
|
115
|
+
toggle();
|
|
116
|
+
else if (input === 's' || input === 'S')
|
|
117
|
+
save();
|
|
118
|
+
else if (input === 'q' || key.escape)
|
|
119
|
+
onBack();
|
|
120
|
+
});
|
|
121
|
+
const unsaved = multi !== savedMulti || reelect !== savedReelect;
|
|
122
|
+
const checkbox = (on, dim) => {
|
|
123
|
+
if (dim)
|
|
124
|
+
return { mark: '[ ]', color: 'gray' };
|
|
125
|
+
return on ? { mark: '[x]', color: 'green' } : { mark: '[ ]', color: 'red' };
|
|
126
|
+
};
|
|
127
|
+
const multiBox = checkbox(multi, false);
|
|
128
|
+
const reelectBox = checkbox(multi ? reelect : false, !multi);
|
|
129
|
+
return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: t.multiHeader }), _jsx(Text, { children: t.multiBody })] }), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: cursor === 'multi' ? 'cyan' : 'gray', children: cursor === 'multi' ? '❯ ' : ' ' }), _jsxs(Text, { color: multiBox.color, children: [multiBox.mark, " "] }), _jsx(Text, { color: cursor === 'multi' ? 'white' : 'gray', bold: cursor === 'multi', children: t.multiToggle })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: t.reelectHeader }), _jsx(Text, { children: t.reelectBody })] }), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: cursor === 'reelect' ? 'cyan' : 'gray', children: cursor === 'reelect' ? '❯ ' : ' ' }), _jsxs(Text, { color: reelectBox.color, children: [reelectBox.mark, " "] }), _jsxs(Text, { color: !multi ? 'gray' : cursor === 'reelect' ? 'white' : 'gray', bold: cursor === 'reelect' && multi, children: [t.reelectToggle, !multi && (_jsxs(Text, { color: "gray", dimColor: true, children: [' ', t.reelectDisabled] }))] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [unsaved ? (_jsx(Text, { color: "yellow", children: t.unsaved })) : justSaved ? (_jsx(Text, { color: "green", children: t.saved })) : null, _jsx(Text, { color: "gray", italic: true, children: t.restart })] })] }));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=multi-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-agent.js","sourceRoot":"","sources":["../../../src/ui/screens/multi-agent.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
import { Frame } from '../components.js';
|
|
5
|
+
import { loadConfig, saveConfig } from '../../config.js';
|
|
6
|
+
import { PRESETS, TOOL_CATALOGUE, sanitizeDisabledTools, } from '../../permissions.js';
|
|
7
|
+
const PERM_I18N = {
|
|
8
|
+
en: {
|
|
9
|
+
title: 'Permissions — pick which MCP tools to expose',
|
|
10
|
+
intro: 'Apply a preset (↵) or toggle individual tools (Space). Press s to save.',
|
|
11
|
+
presetsHeader: 'Presets',
|
|
12
|
+
bridgeHeader: 'Browser bridge',
|
|
13
|
+
mapHeader: 'Persistent UI map',
|
|
14
|
+
applyPrefix: 'Apply: ',
|
|
15
|
+
unsaved: '* Unsaved changes — press s to save',
|
|
16
|
+
saved: '✓ Saved.',
|
|
17
|
+
restart: 'Changes take effect the next time your MCP client starts the server.',
|
|
18
|
+
footer: '↑↓ navigate · Space toggle · ↵ apply preset · s save · Esc back',
|
|
19
|
+
},
|
|
20
|
+
es: {
|
|
21
|
+
title: 'Permisos — elegí qué tools del MCP se exponen',
|
|
22
|
+
intro: 'Aplicá un preset (↵) o cambiá tools individuales (Espacio). Apretá s para guardar.',
|
|
23
|
+
presetsHeader: 'Presets',
|
|
24
|
+
bridgeHeader: 'Bridge del browser',
|
|
25
|
+
mapHeader: 'Mapa persistente',
|
|
26
|
+
applyPrefix: 'Aplicar: ',
|
|
27
|
+
unsaved: '* Cambios sin guardar — apretá s para guardar',
|
|
28
|
+
saved: '✓ Guardado.',
|
|
29
|
+
restart: 'Los cambios tienen efecto la próxima vez que el cliente MCP arranque el servidor.',
|
|
30
|
+
footer: '↑↓ moverse · Espacio cambiar · ↵ aplicar preset · s guardar · Esc volver',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
function setsDiffer(a, b) {
|
|
34
|
+
if (a.size !== b.size)
|
|
35
|
+
return true;
|
|
36
|
+
for (const x of a)
|
|
37
|
+
if (!b.has(x))
|
|
38
|
+
return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
export function PermissionsView({ language, onBack }) {
|
|
42
|
+
const t = PERM_I18N[language];
|
|
43
|
+
const rows = useMemo(() => {
|
|
44
|
+
const r = [];
|
|
45
|
+
for (const preset of PRESETS)
|
|
46
|
+
r.push({ kind: 'preset', preset });
|
|
47
|
+
r.push({ kind: 'header', family: 'bridge' });
|
|
48
|
+
for (const tool of TOOL_CATALOGUE) {
|
|
49
|
+
if (tool.family === 'bridge')
|
|
50
|
+
r.push({ kind: 'tool', tool });
|
|
51
|
+
}
|
|
52
|
+
r.push({ kind: 'header', family: 'map' });
|
|
53
|
+
for (const tool of TOOL_CATALOGUE) {
|
|
54
|
+
if (tool.family === 'map')
|
|
55
|
+
r.push({ kind: 'tool', tool });
|
|
56
|
+
}
|
|
57
|
+
return r;
|
|
58
|
+
}, []);
|
|
59
|
+
const initial = useMemo(() => new Set(loadConfig().disabledTools ?? []), []);
|
|
60
|
+
const [savedDisabled, setSavedDisabled] = useState(initial);
|
|
61
|
+
const [disabled, setDisabled] = useState(initial);
|
|
62
|
+
const firstNonHeader = rows.findIndex((r) => r.kind !== 'header');
|
|
63
|
+
const [cursor, setCursor] = useState(firstNonHeader);
|
|
64
|
+
const [justSaved, setJustSaved] = useState(false);
|
|
65
|
+
const move = (dir) => {
|
|
66
|
+
setCursor((idx) => {
|
|
67
|
+
let i = idx;
|
|
68
|
+
for (let n = 0; n < rows.length; n++) {
|
|
69
|
+
i = (i + dir + rows.length) % rows.length;
|
|
70
|
+
if (rows[i].kind !== 'header')
|
|
71
|
+
return i;
|
|
72
|
+
}
|
|
73
|
+
return idx;
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const toggleTool = (name) => {
|
|
77
|
+
setDisabled((prev) => {
|
|
78
|
+
const next = new Set(prev);
|
|
79
|
+
if (next.has(name))
|
|
80
|
+
next.delete(name);
|
|
81
|
+
else
|
|
82
|
+
next.add(name);
|
|
83
|
+
return next;
|
|
84
|
+
});
|
|
85
|
+
setJustSaved(false);
|
|
86
|
+
};
|
|
87
|
+
const applyPreset = (preset) => {
|
|
88
|
+
setDisabled(new Set(preset.disabled));
|
|
89
|
+
setJustSaved(false);
|
|
90
|
+
};
|
|
91
|
+
const save = () => {
|
|
92
|
+
const list = sanitizeDisabledTools([...disabled]);
|
|
93
|
+
saveConfig({ disabledTools: list });
|
|
94
|
+
setSavedDisabled(new Set(list));
|
|
95
|
+
setJustSaved(true);
|
|
96
|
+
};
|
|
97
|
+
useInput((input, key) => {
|
|
98
|
+
if (key.upArrow)
|
|
99
|
+
move(-1);
|
|
100
|
+
else if (key.downArrow)
|
|
101
|
+
move(1);
|
|
102
|
+
else if (input === ' ') {
|
|
103
|
+
const row = rows[cursor];
|
|
104
|
+
if (row.kind === 'tool')
|
|
105
|
+
toggleTool(row.tool.name);
|
|
106
|
+
}
|
|
107
|
+
else if (key.return) {
|
|
108
|
+
const row = rows[cursor];
|
|
109
|
+
if (row.kind === 'preset')
|
|
110
|
+
applyPreset(row.preset);
|
|
111
|
+
}
|
|
112
|
+
else if (input === 's' || input === 'S') {
|
|
113
|
+
save();
|
|
114
|
+
}
|
|
115
|
+
else if (input === 'q' || key.escape)
|
|
116
|
+
onBack();
|
|
117
|
+
});
|
|
118
|
+
const unsaved = setsDiffer(disabled, savedDisabled);
|
|
119
|
+
return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "white", children: t.intro }) }), _jsx(Box, { flexDirection: "column", children: rows.map((row, i) => {
|
|
120
|
+
if (row.kind === 'header') {
|
|
121
|
+
const label = row.family === 'bridge' ? t.bridgeHeader : t.mapHeader;
|
|
122
|
+
return (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "cyan", bold: true, children: [label, ":"] }) }, `h-${i}`));
|
|
123
|
+
}
|
|
124
|
+
const isCursor = i === cursor;
|
|
125
|
+
const cursorMark = isCursor ? '❯' : ' ';
|
|
126
|
+
if (row.kind === 'preset') {
|
|
127
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: isCursor ? 'cyan' : 'gray', children: [cursorMark, " "] }), _jsxs(Text, { color: isCursor ? 'white' : 'gray', bold: isCursor, children: [t.applyPrefix, row.preset.label] })] }, `p-${row.preset.id}`));
|
|
128
|
+
}
|
|
129
|
+
const isDisabled = disabled.has(row.tool.name);
|
|
130
|
+
const checkbox = isDisabled ? '[ ]' : '[x]';
|
|
131
|
+
const checkboxColor = isDisabled ? 'red' : 'green';
|
|
132
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: isCursor ? 'cyan' : 'gray', children: [cursorMark, " "] }), _jsxs(Text, { color: checkboxColor, children: [checkbox, " "] }), _jsx(Text, { color: isCursor ? 'white' : isDisabled ? 'gray' : 'white', bold: isCursor, children: row.tool.name.padEnd(28) }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', row.tool.summary] })] }, `t-${row.tool.name}`));
|
|
133
|
+
}) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [unsaved ? (_jsx(Text, { color: "yellow", children: t.unsaved })) : justSaved ? (_jsx(Text, { color: "green", children: t.saved })) : null, _jsx(Text, { color: "gray", italic: true, children: t.restart })] })] }));
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/ui/screens/permissions.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ui/screens/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { Frame } from '../components.js';
|
|
5
|
+
import { checkUpdates } from '../../commands/updates.js';
|
|
6
|
+
import { runSelfUpdate, } from '../../commands/self-update.js';
|
|
7
|
+
import { PACKAGE_NAME } from '../../version.js';
|
|
8
|
+
const UPDATES_I18N = {
|
|
9
|
+
en: {
|
|
10
|
+
title: 'Check for updates',
|
|
11
|
+
checking: 'Checking the npm registry…',
|
|
12
|
+
current: 'Current version',
|
|
13
|
+
latest: 'Latest on npm ',
|
|
14
|
+
upToDate: '✓ You are on the latest published version.',
|
|
15
|
+
available: '⚠ A newer version is available.',
|
|
16
|
+
upgradeCmd: 'Or, to upgrade manually, run:',
|
|
17
|
+
updateKeyHint: 'Press u to update now (stops any running primary, then installs).',
|
|
18
|
+
updateRunning: 'Updating…',
|
|
19
|
+
error: 'Could not check the registry',
|
|
20
|
+
footerIdle: 'r retry · ↵ / Esc back to menu',
|
|
21
|
+
footerWithUpdate: 'u update · r retry · ↵ / Esc back to menu',
|
|
22
|
+
footerUpdating: 'updating — please wait…',
|
|
23
|
+
footerDone: '↵ / Esc back to menu — restart your MCP client to pick up the new version',
|
|
24
|
+
footerFailed: 'r retry check · ↵ / Esc back to menu',
|
|
25
|
+
},
|
|
26
|
+
es: {
|
|
27
|
+
title: 'Buscar actualizaciones',
|
|
28
|
+
checking: 'Consultando el registry de npm…',
|
|
29
|
+
current: 'Versión instalada',
|
|
30
|
+
latest: 'Última en npm ',
|
|
31
|
+
upToDate: '✓ Estás en la última versión publicada.',
|
|
32
|
+
available: '⚠ Hay una versión más nueva disponible.',
|
|
33
|
+
upgradeCmd: 'O, para actualizar a mano, corré:',
|
|
34
|
+
updateKeyHint: 'Tocá u para actualizar ahora (corta el primary en uso e instala).',
|
|
35
|
+
updateRunning: 'Actualizando…',
|
|
36
|
+
error: 'No se pudo consultar el registry',
|
|
37
|
+
footerIdle: 'r reintentar · ↵ / Esc volver al menú',
|
|
38
|
+
footerWithUpdate: 'u actualizar · r reintentar · ↵ / Esc volver al menú',
|
|
39
|
+
footerUpdating: 'actualizando — esperá…',
|
|
40
|
+
footerDone: '↵ / Esc volver al menú — reiniciá tu cliente MCP para que tome la nueva versión',
|
|
41
|
+
footerFailed: 'r reintentar el chequeo · ↵ / Esc volver al menú',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export function UpdatesView({ language, onBack }) {
|
|
45
|
+
const t = UPDATES_I18N[language];
|
|
46
|
+
const [info, setInfo] = useState(null);
|
|
47
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
48
|
+
const [update, setUpdate] = useState({ kind: 'idle' });
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
let cancelled = false;
|
|
51
|
+
setInfo(null);
|
|
52
|
+
setUpdate({ kind: 'idle' });
|
|
53
|
+
void checkUpdates().then((r) => {
|
|
54
|
+
if (!cancelled)
|
|
55
|
+
setInfo(r);
|
|
56
|
+
});
|
|
57
|
+
return () => {
|
|
58
|
+
cancelled = true;
|
|
59
|
+
};
|
|
60
|
+
}, [refreshKey]);
|
|
61
|
+
const isUpdating = update.kind === 'running';
|
|
62
|
+
const canUpdate = info !== null && info.newer === true && info.latest !== null && !isUpdating;
|
|
63
|
+
const startUpdate = () => {
|
|
64
|
+
// Guard against the type-system view (info: UpdateInfo | null,
|
|
65
|
+
// info.latest: string | null) — these are real runtime checks even
|
|
66
|
+
// though `canUpdate` already implies both. Without them TS won't
|
|
67
|
+
// narrow `info.latest` to `string` in the closure scope.
|
|
68
|
+
if (info === null)
|
|
69
|
+
return;
|
|
70
|
+
const target = info.latest;
|
|
71
|
+
if (target === null)
|
|
72
|
+
return;
|
|
73
|
+
if (!canUpdate)
|
|
74
|
+
return;
|
|
75
|
+
setUpdate({ kind: 'running', stage: 'preflight', message: t.updateRunning });
|
|
76
|
+
runSelfUpdate(target, language, (event) => {
|
|
77
|
+
setUpdate({ kind: 'running', stage: event.stage, message: event.message });
|
|
78
|
+
})
|
|
79
|
+
.then((result) => {
|
|
80
|
+
setUpdate({
|
|
81
|
+
kind: result.ok ? 'done' : 'failed',
|
|
82
|
+
message: result.message,
|
|
83
|
+
});
|
|
84
|
+
})
|
|
85
|
+
.catch((err) => {
|
|
86
|
+
setUpdate({
|
|
87
|
+
kind: 'failed',
|
|
88
|
+
message: err instanceof Error ? err.message : String(err),
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
useInput((input, key) => {
|
|
93
|
+
if (isUpdating)
|
|
94
|
+
return; // ignore keys while the install is in flight
|
|
95
|
+
if (key.return || key.escape)
|
|
96
|
+
onBack();
|
|
97
|
+
else if (input === 'r' && update.kind !== 'done')
|
|
98
|
+
setRefreshKey((k) => k + 1);
|
|
99
|
+
else if (input === 'u')
|
|
100
|
+
startUpdate();
|
|
101
|
+
});
|
|
102
|
+
const footer = update.kind === 'running'
|
|
103
|
+
? t.footerUpdating
|
|
104
|
+
: update.kind === 'done'
|
|
105
|
+
? t.footerDone
|
|
106
|
+
: update.kind === 'failed'
|
|
107
|
+
? t.footerFailed
|
|
108
|
+
: canUpdate
|
|
109
|
+
? t.footerWithUpdate
|
|
110
|
+
: t.footerIdle;
|
|
111
|
+
return (_jsx(Frame, { title: t.title, footer: footer, children: info === null ? (_jsx(Text, { color: "gray", children: t.checking })) : info.error || info.latest === null ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [_jsxs(Text, { color: "white", children: [t.current, ": "] }), _jsx(Text, { bold: true, children: info.current })] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "red", children: [t.error, ": ", info.error ?? 'unknown error'] }) })] })) : (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [_jsxs(Text, { color: "white", children: [t.current, ": "] }), _jsx(Text, { bold: true, children: info.current })] }), _jsxs(Text, { children: [_jsxs(Text, { color: "white", children: [t.latest, ": "] }), _jsx(Text, { bold: true, color: info.newer ? 'yellow' : 'green', children: info.latest })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: info.newer ? 'yellow' : 'green', children: info.newer ? t.available : t.upToDate }) }), info.newer && update.kind === 'idle' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", children: t.updateKeyHint }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: "gray", children: t.upgradeCmd }), _jsx(Text, { color: "cyan", children: `npm install -g ${PACKAGE_NAME}@latest` })] })] })), update.kind === 'running' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", children: t.updateRunning }), _jsx(Text, { color: "gray", children: update.message })] })), update.kind === 'done' && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "green", children: update.message }) })), update.kind === 'failed' && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: update.message }) }))] })) }));
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../../src/ui/screens/updates.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAmB,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EACL,aAAa,GAGd,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,MAAM,YAAY,GAmBd;IACF,EAAE,EAAE;QACF,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE,4BAA4B;QACtC,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,iBAAiB;QACzB,QAAQ,EAAE,4CAA4C;QACtD,SAAS,EAAE,iCAAiC;QAC5C,UAAU,EAAE,+BAA+B;QAC3C,aAAa,EAAE,mEAAmE;QAClF,aAAa,EAAE,WAAW;QAC1B,KAAK,EAAE,8BAA8B;QACrC,UAAU,EAAE,gCAAgC;QAC5C,gBAAgB,EAAE,2CAA2C;QAC7D,cAAc,EAAE,yBAAyB;QACzC,UAAU,EAAE,2EAA2E;QACvF,YAAY,EAAE,sCAAsC;KACrD;IACD,EAAE,EAAE;QACF,KAAK,EAAE,wBAAwB;QAC/B,QAAQ,EAAE,iCAAiC;QAC3C,OAAO,EAAE,mBAAmB;QAC5B,MAAM,EAAE,mBAAmB;QAC3B,QAAQ,EAAE,yCAAyC;QACnD,SAAS,EAAE,yCAAyC;QACpD,UAAU,EAAE,mCAAmC;QAC/C,aAAa,EAAE,mEAAmE;QAClF,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,kCAAkC;QACzC,UAAU,EAAE,uCAAuC;QACnD,gBAAgB,EAAE,sDAAsD;QACxE,cAAc,EAAE,wBAAwB;QACxC,UAAU,EAAE,iFAAiF;QAC7F,YAAY,EAAE,kDAAkD;KACjE;CACF,CAAC;AAcF,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAoB;IAChE,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAc,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEpE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5B,KAAK,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC;IAE9F,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,+DAA+D;QAC/D,mEAAmE;QACnE,iEAAiE;QACjE,yDAAyD;QACzD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC7E,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YACxC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC;aACC,IAAI,CAAC,CAAC,MAAwB,EAAE,EAAE;YACjC,SAAS,CAAC;gBACR,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;gBACnC,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,SAAS,CAAC;gBACR,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,UAAU;YAAE,OAAO,CAAC,6CAA6C;QACrE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;aAClC,IAAI,KAAK,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aACzE,IAAI,KAAK,KAAK,GAAG;YAAE,WAAW,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GACV,MAAM,CAAC,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC,CAAC,CAAC,cAAc;QAClB,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;YACtB,CAAC,CAAC,CAAC,CAAC,UAAU;YACd,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACxB,CAAC,CAAC,CAAC,CAAC,YAAY;gBAChB,CAAC,CAAC,SAAS;oBACT,CAAC,CAAC,CAAC,CAAC,gBAAgB;oBACpB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEzB,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,YAClC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,QAAQ,GAAQ,CACvC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CACvC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,CAAC,CAAC,OAAO,UAAU,EACxC,KAAC,IAAI,IAAC,IAAI,kBAAE,IAAI,CAAC,OAAO,GAAQ,IAC3B,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,aACd,CAAC,CAAC,KAAK,QAAI,IAAI,CAAC,KAAK,IAAI,eAAe,IACpC,GACH,IACF,CACP,CAAC,CAAC,CAAC,CACF,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,CAAC,CAAC,OAAO,UAAU,EACxC,KAAC,IAAI,IAAC,IAAI,kBAAE,IAAI,CAAC,OAAO,GAAQ,IAC3B,EACP,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,CAAC,CAAC,MAAM,UAAU,EACvC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,YAC9C,IAAI,CAAC,MAAM,GACP,IACF,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,YACzC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GACjC,GACH,EACL,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CACvC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,aAAa,GAAQ,EAC3C,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACvC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,UAAU,GAAQ,EACxC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,kBAAkB,YAAY,SAAS,GAAQ,IAC/D,IACF,CACP,EACA,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAC5B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,aAAa,GAAQ,EAC3C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,MAAM,CAAC,OAAO,GAAQ,IACtC,CACP,EACA,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CACzB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,MAAM,CAAC,OAAO,GAAQ,GACvC,CACP,EACA,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAC3B,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,MAAM,CAAC,OAAO,GAAQ,GACrC,CACP,IACG,CACP,GACK,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CommonProps } from './types.js';
|
|
2
|
+
interface WelcomeProps extends CommonProps {
|
|
3
|
+
hideDismiss: boolean;
|
|
4
|
+
onAccept: () => void;
|
|
5
|
+
onDismiss: () => void;
|
|
6
|
+
onSwapLang: () => void;
|
|
7
|
+
onQuit: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function WelcomeScreen({ language, hideDismiss, onAccept, onDismiss, onSwapLang, onQuit, }: WelcomeProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Frame, Menu } from '../components.js';
|
|
5
|
+
import { I18N_WELCOME } from '../../commands/welcome.js';
|
|
6
|
+
export function WelcomeScreen({ language, hideDismiss, onAccept, onDismiss, onSwapLang, onQuit, }) {
|
|
7
|
+
const t = I18N_WELCOME[language];
|
|
8
|
+
const items = [
|
|
9
|
+
{ value: 'accept', label: t.options.accept },
|
|
10
|
+
];
|
|
11
|
+
if (!hideDismiss)
|
|
12
|
+
items.push({ value: 'dismiss', label: t.options.dismiss });
|
|
13
|
+
items.push({ value: 'swap', label: t.options.swap }, { value: 'quit', label: t.options.quit });
|
|
14
|
+
const [idx, setIdx] = useState(0);
|
|
15
|
+
useInput((input, key) => {
|
|
16
|
+
if (key.upArrow)
|
|
17
|
+
setIdx((i) => (i - 1 + items.length) % items.length);
|
|
18
|
+
else if (key.downArrow)
|
|
19
|
+
setIdx((i) => (i + 1) % items.length);
|
|
20
|
+
else if (key.return) {
|
|
21
|
+
const v = items[idx].value;
|
|
22
|
+
if (v === 'accept')
|
|
23
|
+
onAccept();
|
|
24
|
+
else if (v === 'dismiss')
|
|
25
|
+
onDismiss();
|
|
26
|
+
else if (v === 'swap')
|
|
27
|
+
onSwapLang();
|
|
28
|
+
else
|
|
29
|
+
onQuit();
|
|
30
|
+
}
|
|
31
|
+
else if (input === 'q' || key.escape)
|
|
32
|
+
onQuit();
|
|
33
|
+
else if (input === 'l')
|
|
34
|
+
onSwapLang();
|
|
35
|
+
});
|
|
36
|
+
const footer = language === 'es'
|
|
37
|
+
? '↑↓ moverse · ↵ elegir · l idioma · q salir'
|
|
38
|
+
: '↑↓ navigate · ↵ select · l language · q quit';
|
|
39
|
+
return (_jsxs(Frame, { title: t.title, footer: footer, children: [_jsx(Section, { title: t.aboutTitle, body: t.about }), _jsx(Section, { title: t.capabilitiesTitle, body: t.capabilities }), _jsx(Section, { title: t.warningTitle, body: t.warning, warn: true }), _jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsx(Text, { color: "gray", italic: true, children: t.responsibility }), _jsx(Text, { color: "gray", italic: true, children: t.extensionNote })] }), _jsx(Text, { color: "white", bold: true, children: t.prompt }), _jsx(Box, { marginTop: 1, children: _jsx(Menu, { items: items, selectedIndex: idx }) })] }));
|
|
40
|
+
}
|
|
41
|
+
function Section({ title, body, warn }) {
|
|
42
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { color: warn ? 'yellow' : 'cyan', bold: true, children: [warn ? '⚠ ' : '', title] }), _jsx(Text, { children: body })] }));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=welcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../../src/ui/screens/welcome.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAiB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAWzD,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,SAAS,EACT,UAAU,EACV,MAAM,GACO;IACb,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAuD;QAChE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE;KAC7C,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/F,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,OAAO;YAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;aACjE,IAAI,GAAG,CAAC,SAAS;YAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;aACzD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,KAAK,QAAQ;gBAAE,QAAQ,EAAE,CAAC;iBAC1B,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS,EAAE,CAAC;iBACjC,IAAI,CAAC,KAAK,MAAM;gBAAE,UAAU,EAAE,CAAC;;gBAC/B,MAAM,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;aAC5C,IAAI,KAAK,KAAK,GAAG;YAAE,UAAU,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GACV,QAAQ,KAAK,IAAI;QACf,CAAC,CAAC,4CAA4C;QAC9C,CAAC,CAAC,8CAA8C,CAAC;IAErD,OAAO,CACL,MAAC,KAAK,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,aACnC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,GAAI,EAC/C,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,GAAI,EAC7D,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,SAAG,EACxD,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aAC1C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,kBACtB,CAAC,CAAC,cAAc,GACZ,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,kBACtB,CAAC,CAAC,aAAa,GACX,IACH,EACN,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,kBACrB,CAAC,CAAC,MAAM,GACJ,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,GAAI,GACtC,IACA,CACT,CAAC;AACJ,CAAC;AAOD,SAAS,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAgB;IAClD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,mBACxC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EACjB,KAAK,IACD,EACP,KAAC,IAAI,cAAE,IAAI,GAAQ,IACf,CACP,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobshimo/browser-link",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.9",
|
|
4
4
|
"description": "MCP server that bridges Claude Code, OpenCode, GitHub Copilot CLI and other MCP clients to a Chrome tab. Per-tool permissions, multi-agent mode (multiple MCP clients sharing one bridge), persistent UI map across sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
package/dist/ui/screens.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { type Language } from '../commands/welcome.js';
|
|
2
|
-
import { type ClientId } from '../installers/index.js';
|
|
3
|
-
import { type InstallReport } from '../commands/install.js';
|
|
4
|
-
interface CommonProps {
|
|
5
|
-
language: Language;
|
|
6
|
-
}
|
|
7
|
-
interface WelcomeProps extends CommonProps {
|
|
8
|
-
hideDismiss: boolean;
|
|
9
|
-
onAccept: () => void;
|
|
10
|
-
onDismiss: () => void;
|
|
11
|
-
onSwapLang: () => void;
|
|
12
|
-
onQuit: () => void;
|
|
13
|
-
}
|
|
14
|
-
export declare function WelcomeScreen({ language, hideDismiss, onAccept, onDismiss, onSwapLang, onQuit, }: WelcomeProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
-
export type MenuAction = 'register' | 'permissions' | 'multiAgent' | 'extension' | 'doctor' | 'updates' | 'freePort' | 'language' | 'welcome' | 'about' | 'repo' | 'quit';
|
|
16
|
-
interface MainMenuProps extends CommonProps {
|
|
17
|
-
onSelect: (action: MenuAction) => void;
|
|
18
|
-
onSwapLang: () => void;
|
|
19
|
-
onQuit: () => void;
|
|
20
|
-
}
|
|
21
|
-
export declare function MainMenu({ language, onSelect, onSwapLang, onQuit }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
-
interface ClientPickerProps extends CommonProps {
|
|
23
|
-
onPick: (id: ClientId) => void;
|
|
24
|
-
onBack: () => void;
|
|
25
|
-
}
|
|
26
|
-
export declare function ClientPicker({ language, onPick, onBack }: ClientPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
-
interface InstallResultProps extends CommonProps {
|
|
28
|
-
report: InstallReport;
|
|
29
|
-
onBack: () => void;
|
|
30
|
-
}
|
|
31
|
-
export declare function InstallResultView({ language, report, onBack }: InstallResultProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
-
interface ExtensionViewProps extends CommonProps {
|
|
33
|
-
onBack: () => void;
|
|
34
|
-
}
|
|
35
|
-
export declare function ExtensionView({ language, onBack }: ExtensionViewProps): import("react/jsx-runtime").JSX.Element;
|
|
36
|
-
interface DoctorViewProps extends CommonProps {
|
|
37
|
-
onBack: () => void;
|
|
38
|
-
}
|
|
39
|
-
export declare function DoctorView({ language, onBack }: DoctorViewProps): import("react/jsx-runtime").JSX.Element;
|
|
40
|
-
interface AboutViewProps extends CommonProps {
|
|
41
|
-
onBack: () => void;
|
|
42
|
-
}
|
|
43
|
-
export declare function AboutView({ language, onBack }: AboutViewProps): import("react/jsx-runtime").JSX.Element;
|
|
44
|
-
interface PermissionsViewProps extends CommonProps {
|
|
45
|
-
onBack: () => void;
|
|
46
|
-
}
|
|
47
|
-
export declare function PermissionsView({ language, onBack }: PermissionsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
48
|
-
interface UpdatesViewProps extends CommonProps {
|
|
49
|
-
onBack: () => void;
|
|
50
|
-
}
|
|
51
|
-
export declare function UpdatesView({ language, onBack }: UpdatesViewProps): import("react/jsx-runtime").JSX.Element;
|
|
52
|
-
interface LanguageViewProps extends CommonProps {
|
|
53
|
-
onPick: (next: Language) => void;
|
|
54
|
-
onBack: () => void;
|
|
55
|
-
}
|
|
56
|
-
export declare function LanguageView({ language, onPick, onBack }: LanguageViewProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
-
interface MultiAgentViewProps extends CommonProps {
|
|
58
|
-
onBack: () => void;
|
|
59
|
-
}
|
|
60
|
-
export declare function MultiAgentView({ language, onBack }: MultiAgentViewProps): import("react/jsx-runtime").JSX.Element;
|
|
61
|
-
interface FreePortViewProps extends CommonProps {
|
|
62
|
-
onBack: () => void;
|
|
63
|
-
}
|
|
64
|
-
export declare function FreePortView({ language, onBack }: FreePortViewProps): import("react/jsx-runtime").JSX.Element;
|
|
65
|
-
export {};
|