@jobshimo/browser-link 0.8.5 → 0.9.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/dist/bridge/events.d.ts +3 -0
- package/dist/bridge/events.js +8 -0
- package/dist/bridge/events.js.map +1 -1
- package/dist/commands/welcome.d.ts +15 -0
- package/dist/commands/welcome.js +44 -2
- package/dist/commands/welcome.js.map +1 -1
- package/dist/extension/background.js +37 -1
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/manifest.json +1 -1
- package/dist/extension/popup.d.ts +2 -1
- package/dist/extension/popup.html +128 -50
- package/dist/extension/popup.js +22 -3
- package/dist/extension/popup.js.map +1 -1
- package/dist/server.js +42 -36
- package/dist/server.js.map +1 -1
- package/dist/tools/browser-definitions.js +16 -0
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/browser-dispatch.d.ts +8 -14
- package/dist/tools/browser-dispatch.js +10 -0
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/dist/tools/tab-claims.d.ts +5 -1
- package/dist/tools/tab-claims.js +17 -0
- package/dist/tools/tab-claims.js.map +1 -1
- package/dist/ui/app.js +27 -2
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/components.d.ts +15 -3
- package/dist/ui/components.js +34 -14
- package/dist/ui/components.js.map +1 -1
- package/dist/ui/primitives/badge.d.ts +11 -0
- package/dist/ui/primitives/badge.js +35 -0
- package/dist/ui/primitives/badge.js.map +1 -0
- package/dist/ui/primitives/check-row.d.ts +11 -0
- package/dist/ui/primitives/check-row.js +10 -0
- package/dist/ui/primitives/check-row.js.map +1 -0
- package/dist/ui/primitives/footer-keys.d.ts +12 -0
- package/dist/ui/primitives/footer-keys.js +11 -0
- package/dist/ui/primitives/footer-keys.js.map +1 -0
- package/dist/ui/primitives/index.d.ts +8 -0
- package/dist/ui/primitives/index.js +13 -0
- package/dist/ui/primitives/index.js.map +1 -0
- package/dist/ui/primitives/inline-spinner.d.ts +7 -0
- package/dist/ui/primitives/inline-spinner.js +23 -0
- package/dist/ui/primitives/inline-spinner.js.map +1 -0
- package/dist/ui/primitives/key-cap.d.ts +6 -0
- package/dist/ui/primitives/key-cap.js +6 -0
- package/dist/ui/primitives/key-cap.js.map +1 -0
- package/dist/ui/primitives/menu-row.d.ts +17 -0
- package/dist/ui/primitives/menu-row.js +8 -0
- package/dist/ui/primitives/menu-row.js.map +1 -0
- package/dist/ui/primitives/section-head.d.ts +11 -0
- package/dist/ui/primitives/section-head.js +7 -0
- package/dist/ui/primitives/section-head.js.map +1 -0
- package/dist/ui/primitives/status-bar.d.ts +13 -0
- package/dist/ui/primitives/status-bar.js +17 -0
- package/dist/ui/primitives/status-bar.js.map +1 -0
- package/dist/ui/screens/about.js +13 -4
- package/dist/ui/screens/about.js.map +1 -1
- package/dist/ui/screens/agent-instructions.js +53 -47
- package/dist/ui/screens/agent-instructions.js.map +1 -1
- package/dist/ui/screens/client-picker.js +64 -16
- package/dist/ui/screens/client-picker.js.map +1 -1
- package/dist/ui/screens/doctor.js +20 -7
- package/dist/ui/screens/doctor.js.map +1 -1
- package/dist/ui/screens/empty-clients.d.ts +8 -0
- package/dist/ui/screens/empty-clients.js +57 -0
- package/dist/ui/screens/empty-clients.js.map +1 -0
- package/dist/ui/screens/extension.js +25 -8
- package/dist/ui/screens/extension.js.map +1 -1
- package/dist/ui/screens/free-port.js +48 -33
- package/dist/ui/screens/free-port.js.map +1 -1
- package/dist/ui/screens/index.d.ts +2 -0
- package/dist/ui/screens/index.js +2 -0
- package/dist/ui/screens/index.js.map +1 -1
- package/dist/ui/screens/install-result.js +29 -6
- package/dist/ui/screens/install-result.js.map +1 -1
- package/dist/ui/screens/language.js +39 -18
- package/dist/ui/screens/language.js.map +1 -1
- package/dist/ui/screens/menu.js +99 -43
- package/dist/ui/screens/menu.js.map +1 -1
- package/dist/ui/screens/multi-agent.js +24 -18
- package/dist/ui/screens/multi-agent.js.map +1 -1
- package/dist/ui/screens/permissions.js +145 -33
- package/dist/ui/screens/permissions.js.map +1 -1
- package/dist/ui/screens/port-collision.d.ts +18 -0
- package/dist/ui/screens/port-collision.js +95 -0
- package/dist/ui/screens/port-collision.js.map +1 -0
- package/dist/ui/screens/updates.js +44 -21
- package/dist/ui/screens/updates.js.map +1 -1
- package/dist/ui/screens/welcome.js +56 -26
- package/dist/ui/screens/welcome.js.map +1 -1
- package/dist/ui/tokens.d.ts +37 -0
- package/dist/ui/tokens.js +58 -0
- package/dist/ui/tokens.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,19 +2,29 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Text, useInput } from 'ink';
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
4
|
import { Frame } from '../components.js';
|
|
5
|
+
import { COLORS, GLYPHS } from '../tokens.js';
|
|
6
|
+
import { Badge, FooterKeys, InlineSpinner, KeyCap } from '../primitives/index.js';
|
|
5
7
|
import { checkUpdates } from '../../commands/updates.js';
|
|
6
8
|
import { runSelfUpdate, } from '../../commands/self-update.js';
|
|
7
9
|
import { PACKAGE_NAME } from '../../version.js';
|
|
10
|
+
/* Updates screen. Same async lifecycle, redesigned chrome:
|
|
11
|
+
* - "Current version" / "Latest on npm" as two value rows with the
|
|
12
|
+
* latest tagged with a <Badge> when newer.
|
|
13
|
+
* - When `available`, the "Press u to update" line uses a keycap.
|
|
14
|
+
* - When running, an InlineSpinner sits next to the status message.
|
|
15
|
+
* - When done, the success row + restart hint stays.
|
|
16
|
+
*/
|
|
8
17
|
const UPDATES_I18N = {
|
|
9
18
|
en: {
|
|
10
19
|
title: 'Check for updates',
|
|
11
20
|
checking: 'Checking the npm registry…',
|
|
12
21
|
current: 'Current version',
|
|
13
22
|
latest: 'Latest on npm ',
|
|
14
|
-
|
|
15
|
-
|
|
23
|
+
newer: 'newer',
|
|
24
|
+
upToDate: 'You are on the latest published version.',
|
|
25
|
+
available: 'A newer version is available.',
|
|
16
26
|
upgradeCmd: 'Or, to upgrade manually, run:',
|
|
17
|
-
updateKeyHint: '
|
|
27
|
+
updateKeyHint: 'to update now (stops any running primary, then installs).',
|
|
18
28
|
updateRunning: 'Updating…',
|
|
19
29
|
error: 'Could not check the registry',
|
|
20
30
|
footerIdle: 'r retry · ↵ / Esc back to menu',
|
|
@@ -22,16 +32,21 @@ const UPDATES_I18N = {
|
|
|
22
32
|
footerUpdating: 'updating — please wait…',
|
|
23
33
|
footerDone: '↵ / Esc back to menu — restart your MCP client to pick up the new version',
|
|
24
34
|
footerFailed: 'r retry check · ↵ / Esc back to menu',
|
|
35
|
+
backLabel: 'back to menu',
|
|
36
|
+
retryLabel: 'retry',
|
|
37
|
+
updateLabel: 'update',
|
|
38
|
+
waitLabel: 'updating — please wait',
|
|
25
39
|
},
|
|
26
40
|
es: {
|
|
27
41
|
title: 'Buscar actualizaciones',
|
|
28
42
|
checking: 'Consultando el registry de npm…',
|
|
29
43
|
current: 'Versión instalada',
|
|
30
44
|
latest: 'Última en npm ',
|
|
31
|
-
|
|
32
|
-
|
|
45
|
+
newer: 'más nueva',
|
|
46
|
+
upToDate: 'Estás en la última versión publicada.',
|
|
47
|
+
available: 'Hay una versión más nueva disponible.',
|
|
33
48
|
upgradeCmd: 'O, para actualizar a mano, corré:',
|
|
34
|
-
updateKeyHint: '
|
|
49
|
+
updateKeyHint: 'para actualizar ahora (corta el primary en uso e instala).',
|
|
35
50
|
updateRunning: 'Actualizando…',
|
|
36
51
|
error: 'No se pudo consultar el registry',
|
|
37
52
|
footerIdle: 'r reintentar · ↵ / Esc volver al menú',
|
|
@@ -39,6 +54,10 @@ const UPDATES_I18N = {
|
|
|
39
54
|
footerUpdating: 'actualizando — esperá…',
|
|
40
55
|
footerDone: '↵ / Esc volver al menú — reiniciá tu cliente MCP para que tome la nueva versión',
|
|
41
56
|
footerFailed: 'r reintentar el chequeo · ↵ / Esc volver al menú',
|
|
57
|
+
backLabel: 'volver al menú',
|
|
58
|
+
retryLabel: 'reintentar',
|
|
59
|
+
updateLabel: 'actualizar',
|
|
60
|
+
waitLabel: 'actualizando — esperá',
|
|
42
61
|
},
|
|
43
62
|
};
|
|
44
63
|
export function UpdatesView({ language, onBack }) {
|
|
@@ -61,10 +80,6 @@ export function UpdatesView({ language, onBack }) {
|
|
|
61
80
|
const isUpdating = update.kind === 'running';
|
|
62
81
|
const canUpdate = info !== null && info.newer === true && info.latest !== null && !isUpdating;
|
|
63
82
|
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
83
|
if (info === null)
|
|
69
84
|
return;
|
|
70
85
|
const target = info.latest;
|
|
@@ -91,7 +106,7 @@ export function UpdatesView({ language, onBack }) {
|
|
|
91
106
|
};
|
|
92
107
|
useInput((input, key) => {
|
|
93
108
|
if (isUpdating)
|
|
94
|
-
return;
|
|
109
|
+
return;
|
|
95
110
|
if (key.return || key.escape)
|
|
96
111
|
onBack();
|
|
97
112
|
else if (input === 'r' && update.kind !== 'done')
|
|
@@ -99,15 +114,23 @@ export function UpdatesView({ language, onBack }) {
|
|
|
99
114
|
else if (input === 'u')
|
|
100
115
|
startUpdate();
|
|
101
116
|
});
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
117
|
+
const footerItems = (() => {
|
|
118
|
+
if (update.kind === 'running')
|
|
119
|
+
return [{ k: GLYPHS.dot, label: t.waitLabel }];
|
|
120
|
+
if (update.kind === 'done')
|
|
121
|
+
return [{ k: GLYPHS.enter, label: t.backLabel }];
|
|
122
|
+
if (canUpdate) {
|
|
123
|
+
return [
|
|
124
|
+
{ k: 'u', label: t.updateLabel },
|
|
125
|
+
{ k: 'r', label: t.retryLabel },
|
|
126
|
+
{ k: GLYPHS.enter, label: t.backLabel },
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
return [
|
|
130
|
+
{ k: 'r', label: t.retryLabel },
|
|
131
|
+
{ k: GLYPHS.enter, label: t.backLabel },
|
|
132
|
+
];
|
|
133
|
+
})();
|
|
134
|
+
return (_jsx(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: footerItems }), children: info === null ? (_jsxs(Box, { children: [_jsx(InlineSpinner, {}), _jsx(Text, { color: COLORS.muted, 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: COLORS.error, 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(Box, { children: [_jsxs(Text, { color: "white", children: [t.latest, ": "] }), _jsx(Text, { bold: true, color: info.newer ? COLORS.warn : COLORS.success, children: info.latest }), info.newer && (_jsx(Box, { marginLeft: 2, children: _jsx(Badge, { kind: "warn", label: t.newer }) }))] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: info.newer ? COLORS.warn : COLORS.success, children: info.newer ? `${GLYPHS.warn} ${t.available}` : `${GLYPHS.success} ${t.upToDate}` }) }), info.newer && update.kind === 'idle' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: COLORS.primary, children: "Press " }), _jsx(KeyCap, { label: "u" }), _jsxs(Text, { color: COLORS.primary, children: [" ", t.updateKeyHint] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: COLORS.muted, children: t.upgradeCmd }), _jsx(Text, { color: COLORS.primary, children: `npm install -g ${PACKAGE_NAME}@latest` })] })] })), update.kind === 'running' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(InlineSpinner, {}), _jsx(Text, { color: COLORS.primary, children: ` ${t.updateRunning}` })] }), _jsx(Text, { color: COLORS.muted, children: update.message })] })), update.kind === 'done' && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: COLORS.success, children: [GLYPHS.success, " ", update.message] }) })), update.kind === 'failed' && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: COLORS.error, children: [GLYPHS.error, " ", update.message] }) }))] })) }));
|
|
112
135
|
}
|
|
113
136
|
//# sourceMappingURL=updates.js.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../../src/ui/screens/updates.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +1,74 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text, useInput } from 'ink';
|
|
3
3
|
import { useState } from 'react';
|
|
4
|
-
import { Frame
|
|
4
|
+
import { Frame } from '../components.js';
|
|
5
|
+
import { COLORS, GLYPHS } from '../tokens.js';
|
|
6
|
+
import { FooterKeys, MenuRow, SectionHead } from '../primitives/index.js';
|
|
5
7
|
import { I18N_WELCOME } from '../../commands/welcome.js';
|
|
8
|
+
import { VERSION } from '../../version.js';
|
|
6
9
|
export function WelcomeScreen({ language, hideDismiss, onAccept, onDismiss, onSwapLang, onQuit, }) {
|
|
7
10
|
const t = I18N_WELCOME[language];
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
const [expanded, setExpanded] = useState(false);
|
|
12
|
+
/* Hotkeys here are stable across languages — `c` for the primary
|
|
13
|
+
* action ("continue"), `d` for dismiss, `l` for language, `q` for
|
|
14
|
+
* quit. Picking them from the EN labels would drift between locales,
|
|
15
|
+
* so we hard-code them. */
|
|
16
|
+
const rows = [{ value: 'accept', hotkey: 'c', label: t.options.accept }];
|
|
11
17
|
if (!hideDismiss)
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
rows.push({ value: 'dismiss', hotkey: 'd', label: t.options.dismiss });
|
|
19
|
+
rows.push({ value: 'swap', hotkey: 'l', label: t.options.swap }, { value: 'quit', hotkey: 'q', label: t.options.quit });
|
|
14
20
|
const [idx, setIdx] = useState(0);
|
|
21
|
+
const fire = (action) => {
|
|
22
|
+
if (action === 'accept')
|
|
23
|
+
onAccept();
|
|
24
|
+
else if (action === 'dismiss')
|
|
25
|
+
onDismiss();
|
|
26
|
+
else if (action === 'swap')
|
|
27
|
+
onSwapLang();
|
|
28
|
+
else
|
|
29
|
+
onQuit();
|
|
30
|
+
};
|
|
15
31
|
useInput((input, key) => {
|
|
16
32
|
if (key.upArrow)
|
|
17
|
-
setIdx((i) => (i - 1 +
|
|
33
|
+
setIdx((i) => (i - 1 + rows.length) % rows.length);
|
|
18
34
|
else if (key.downArrow)
|
|
19
|
-
setIdx((i) => (i + 1) %
|
|
20
|
-
else if (key.return)
|
|
21
|
-
|
|
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
|
-
}
|
|
35
|
+
setIdx((i) => (i + 1) % rows.length);
|
|
36
|
+
else if (key.return)
|
|
37
|
+
fire(rows[idx].value);
|
|
31
38
|
else if (input === 'q' || key.escape)
|
|
32
39
|
onQuit();
|
|
33
40
|
else if (input === 'l')
|
|
34
41
|
onSwapLang();
|
|
42
|
+
else if (input === 'i' || input === 'I')
|
|
43
|
+
setExpanded((v) => !v);
|
|
44
|
+
else {
|
|
45
|
+
// Hotkey lookup — pressing the bracketed letter fires the row.
|
|
46
|
+
const target = rows.find((r) => r.hotkey === input.toLowerCase());
|
|
47
|
+
if (target)
|
|
48
|
+
fire(target.value);
|
|
49
|
+
}
|
|
35
50
|
});
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
:
|
|
39
|
-
|
|
51
|
+
const fk = t.footerKeys;
|
|
52
|
+
const footerItems = [
|
|
53
|
+
{ k: `${GLYPHS.up}${GLYPHS.down}`, label: fk.navigate },
|
|
54
|
+
{ k: GLYPHS.enter, label: fk.select },
|
|
55
|
+
{ k: 'i', label: expanded ? fk.hide : fk.info },
|
|
56
|
+
{ k: 'l', label: fk.lang },
|
|
57
|
+
{ k: 'q', label: fk.quit },
|
|
58
|
+
];
|
|
59
|
+
return (_jsxs(Frame, { title: t.title, badge: _jsxs(Text, { color: COLORS.muted, dimColor: true, children: ["v", VERSION] }), footer: _jsx(FooterKeys, { items: footerItems }), children: [_jsx(Wordmark, {}), expanded ? (_jsx(ExpandedBody, { t: t })) : (_jsx(CompactBody, { about: t.shortAbout, warningTitle: t.warningTitle, warning: t.shortWarning })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "white", bold: true, children: t.prompt }) }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: rows.map((row, i) => (_jsx(MenuRow, { selected: i === idx, hotkey: row.hotkey, label: row.label }, row.value))) }), !expanded && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: COLORS.muted, italic: true, children: t.detailHint }) }))] }));
|
|
60
|
+
}
|
|
61
|
+
function CompactBody({ about, warningTitle, warning }) {
|
|
62
|
+
return (_jsxs(_Fragment, { children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { children: about }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: COLORS.warn, bold: true, children: [GLYPHS.warn, " ", warningTitle] }) }), _jsx(Text, { children: warning })] }));
|
|
63
|
+
}
|
|
64
|
+
function ExpandedBody({ t }) {
|
|
65
|
+
return (_jsxs(_Fragment, { children: [_jsx(SectionHead, { children: t.aboutTitle }), _jsx(Text, { children: t.about }), _jsx(SectionHead, { children: t.capabilitiesTitle }), _jsx(Text, { children: t.capabilities }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: COLORS.warn, bold: true, children: [GLYPHS.warn, " ", t.warningTitle] }) }), _jsx(Text, { children: t.warning }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: COLORS.muted, italic: true, children: t.responsibility }), _jsx(Text, { color: COLORS.muted, italic: true, children: t.extensionNote })] })] }));
|
|
40
66
|
}
|
|
41
|
-
|
|
42
|
-
|
|
67
|
+
/* Logo A — typeset wordmark, single line. See system.jsx → LogoCard,
|
|
68
|
+
* option A. `·` is the magenta hairline between "browser" and "link";
|
|
69
|
+
* we render it in muted gray here because magenta is the Branded mood
|
|
70
|
+
* primary and would clash with the Pragmatic palette. */
|
|
71
|
+
function Wordmark() {
|
|
72
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: COLORS.primary, bold: true, children: "browser" }), _jsxs(Text, { color: COLORS.muted, children: [" ", GLYPHS.dot, " "] }), _jsx(Text, { color: COLORS.primary, bold: true, children: "link" }), _jsx(Text, { color: COLORS.muted, dimColor: true, children: ` v${VERSION}` })] }));
|
|
43
73
|
}
|
|
44
74
|
//# sourceMappingURL=welcome.js.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../../src/ui/screens/welcome.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare const COLORS: {
|
|
2
|
+
readonly primary: "cyan";
|
|
3
|
+
readonly success: "green";
|
|
4
|
+
readonly warn: "yellow";
|
|
5
|
+
readonly error: "red";
|
|
6
|
+
readonly info: "blue";
|
|
7
|
+
readonly muted: "gray";
|
|
8
|
+
readonly focus: "cyan";
|
|
9
|
+
readonly heading: "cyan";
|
|
10
|
+
};
|
|
11
|
+
export type ColorRole = keyof typeof COLORS;
|
|
12
|
+
export declare const GLYPHS: {
|
|
13
|
+
readonly cursor: "❯";
|
|
14
|
+
readonly success: "✓";
|
|
15
|
+
readonly error: "✗";
|
|
16
|
+
readonly warn: "⚠";
|
|
17
|
+
readonly info: "ℹ";
|
|
18
|
+
readonly dot: "·";
|
|
19
|
+
readonly arrow: "→";
|
|
20
|
+
readonly up: "↑";
|
|
21
|
+
readonly down: "↓";
|
|
22
|
+
readonly enter: "↵";
|
|
23
|
+
readonly esc: "⎋";
|
|
24
|
+
readonly space: "␣";
|
|
25
|
+
readonly badgeOk: "✓ installed";
|
|
26
|
+
readonly badgeWarn: "⚠ outdated";
|
|
27
|
+
readonly badgeOff: "· not installed";
|
|
28
|
+
readonly badgeFail: "✗ failed";
|
|
29
|
+
readonly badgeNoFile: "· no file yet";
|
|
30
|
+
};
|
|
31
|
+
export type GlyphKey = keyof typeof GLYPHS;
|
|
32
|
+
export declare const SPACE: {
|
|
33
|
+
readonly none: 0;
|
|
34
|
+
readonly gap: 1;
|
|
35
|
+
readonly block: 2;
|
|
36
|
+
};
|
|
37
|
+
export type SpaceKey = keyof typeof SPACE;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/* Design tokens — the Pragmatic mood (Mood A) of the v0.9.0 visual refactor.
|
|
2
|
+
*
|
|
3
|
+
* Ink accepts ANSI color names directly via the `color` prop on <Text>,
|
|
4
|
+
* so this module is a thin semantic-role → ANSI-name mapping, not a
|
|
5
|
+
* hex-to-color translator. The full design source lives at
|
|
6
|
+
* `~/browser-link/browser-link/tokens.jsx` (Mood A · Pragmatic).
|
|
7
|
+
*
|
|
8
|
+
* `dimColor` on Ink's <Text> handles the "muted" role; we still expose
|
|
9
|
+
* `muted: 'gray'` so consumers reading from COLORS get a sensible fallback
|
|
10
|
+
* when they want the muted *color* (e.g. a separator dot) and not the
|
|
11
|
+
* dim *effect* (which is applied via the dimColor prop instead).
|
|
12
|
+
*/
|
|
13
|
+
export const COLORS = {
|
|
14
|
+
primary: 'cyan',
|
|
15
|
+
success: 'green',
|
|
16
|
+
warn: 'yellow',
|
|
17
|
+
error: 'red',
|
|
18
|
+
info: 'blue',
|
|
19
|
+
muted: 'gray',
|
|
20
|
+
focus: 'cyan',
|
|
21
|
+
heading: 'cyan',
|
|
22
|
+
};
|
|
23
|
+
/* Glyph set A — Shapes. Chosen for max cross-terminal compatibility:
|
|
24
|
+
* every glyph below renders cleanly on cmd.exe-equivalent terminals
|
|
25
|
+
* (Windows Terminal, iTerm2, modern xterms). The corresponding
|
|
26
|
+
* design source is `tokens.jsx` → GLYPHS.shapes. */
|
|
27
|
+
export const GLYPHS = {
|
|
28
|
+
cursor: '❯',
|
|
29
|
+
success: '✓',
|
|
30
|
+
error: '✗',
|
|
31
|
+
warn: '⚠',
|
|
32
|
+
info: 'ℹ',
|
|
33
|
+
dot: '·',
|
|
34
|
+
arrow: '→',
|
|
35
|
+
up: '↑',
|
|
36
|
+
down: '↓',
|
|
37
|
+
enter: '↵',
|
|
38
|
+
esc: '⎋',
|
|
39
|
+
space: '␣',
|
|
40
|
+
/* Status badges — glyph + space + label. Kept here so the same string
|
|
41
|
+
* is reused across screens (Agent Instructions, Client Picker, Doctor). */
|
|
42
|
+
badgeOk: '✓ installed',
|
|
43
|
+
badgeWarn: '⚠ outdated',
|
|
44
|
+
badgeOff: '· not installed',
|
|
45
|
+
badgeFail: '✗ failed',
|
|
46
|
+
/* Agent-instructions specific — used when the target .md file does
|
|
47
|
+
* not exist yet (install will create it). */
|
|
48
|
+
badgeNoFile: '· no file yet',
|
|
49
|
+
};
|
|
50
|
+
/* Spacing scale — three levels only, mapped directly to Ink margin props.
|
|
51
|
+
* See `~/browser-link/browser-link/tokens.jsx` → SPACE and `system.jsx` →
|
|
52
|
+
* SpacingCard for the per-level usage spec. Don't introduce a fourth value. */
|
|
53
|
+
export const SPACE = {
|
|
54
|
+
none: 0,
|
|
55
|
+
gap: 1,
|
|
56
|
+
block: 2,
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/ui/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,MAAM;CACP,CAAC;AAIX;;;oDAGoD;AACpD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,GAAG;IACV,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,GAAG;IACV;+EAC2E;IAC3E,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,UAAU;IACrB;iDAC6C;IAC7C,WAAW,EAAE,eAAe;CACpB,CAAC;AAIX;;+EAE+E;AAC/E,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;CACA,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobshimo/browser-link",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
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",
|