@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.
Files changed (94) hide show
  1. package/dist/bridge/events.d.ts +3 -0
  2. package/dist/bridge/events.js +8 -0
  3. package/dist/bridge/events.js.map +1 -1
  4. package/dist/commands/welcome.d.ts +15 -0
  5. package/dist/commands/welcome.js +44 -2
  6. package/dist/commands/welcome.js.map +1 -1
  7. package/dist/extension/background.js +37 -1
  8. package/dist/extension/background.js.map +1 -1
  9. package/dist/extension/manifest.json +1 -1
  10. package/dist/extension/popup.d.ts +2 -1
  11. package/dist/extension/popup.html +128 -50
  12. package/dist/extension/popup.js +22 -3
  13. package/dist/extension/popup.js.map +1 -1
  14. package/dist/server.js +42 -36
  15. package/dist/server.js.map +1 -1
  16. package/dist/tools/browser-definitions.js +16 -0
  17. package/dist/tools/browser-definitions.js.map +1 -1
  18. package/dist/tools/browser-dispatch.d.ts +8 -14
  19. package/dist/tools/browser-dispatch.js +10 -0
  20. package/dist/tools/browser-dispatch.js.map +1 -1
  21. package/dist/tools/tab-claims.d.ts +5 -1
  22. package/dist/tools/tab-claims.js +17 -0
  23. package/dist/tools/tab-claims.js.map +1 -1
  24. package/dist/ui/app.js +27 -2
  25. package/dist/ui/app.js.map +1 -1
  26. package/dist/ui/components.d.ts +15 -3
  27. package/dist/ui/components.js +34 -14
  28. package/dist/ui/components.js.map +1 -1
  29. package/dist/ui/primitives/badge.d.ts +11 -0
  30. package/dist/ui/primitives/badge.js +35 -0
  31. package/dist/ui/primitives/badge.js.map +1 -0
  32. package/dist/ui/primitives/check-row.d.ts +11 -0
  33. package/dist/ui/primitives/check-row.js +10 -0
  34. package/dist/ui/primitives/check-row.js.map +1 -0
  35. package/dist/ui/primitives/footer-keys.d.ts +12 -0
  36. package/dist/ui/primitives/footer-keys.js +11 -0
  37. package/dist/ui/primitives/footer-keys.js.map +1 -0
  38. package/dist/ui/primitives/index.d.ts +8 -0
  39. package/dist/ui/primitives/index.js +13 -0
  40. package/dist/ui/primitives/index.js.map +1 -0
  41. package/dist/ui/primitives/inline-spinner.d.ts +7 -0
  42. package/dist/ui/primitives/inline-spinner.js +23 -0
  43. package/dist/ui/primitives/inline-spinner.js.map +1 -0
  44. package/dist/ui/primitives/key-cap.d.ts +6 -0
  45. package/dist/ui/primitives/key-cap.js +6 -0
  46. package/dist/ui/primitives/key-cap.js.map +1 -0
  47. package/dist/ui/primitives/menu-row.d.ts +17 -0
  48. package/dist/ui/primitives/menu-row.js +8 -0
  49. package/dist/ui/primitives/menu-row.js.map +1 -0
  50. package/dist/ui/primitives/section-head.d.ts +11 -0
  51. package/dist/ui/primitives/section-head.js +7 -0
  52. package/dist/ui/primitives/section-head.js.map +1 -0
  53. package/dist/ui/primitives/status-bar.d.ts +13 -0
  54. package/dist/ui/primitives/status-bar.js +17 -0
  55. package/dist/ui/primitives/status-bar.js.map +1 -0
  56. package/dist/ui/screens/about.js +13 -4
  57. package/dist/ui/screens/about.js.map +1 -1
  58. package/dist/ui/screens/agent-instructions.js +53 -47
  59. package/dist/ui/screens/agent-instructions.js.map +1 -1
  60. package/dist/ui/screens/client-picker.js +64 -16
  61. package/dist/ui/screens/client-picker.js.map +1 -1
  62. package/dist/ui/screens/doctor.js +20 -7
  63. package/dist/ui/screens/doctor.js.map +1 -1
  64. package/dist/ui/screens/empty-clients.d.ts +8 -0
  65. package/dist/ui/screens/empty-clients.js +57 -0
  66. package/dist/ui/screens/empty-clients.js.map +1 -0
  67. package/dist/ui/screens/extension.js +25 -8
  68. package/dist/ui/screens/extension.js.map +1 -1
  69. package/dist/ui/screens/free-port.js +48 -33
  70. package/dist/ui/screens/free-port.js.map +1 -1
  71. package/dist/ui/screens/index.d.ts +2 -0
  72. package/dist/ui/screens/index.js +2 -0
  73. package/dist/ui/screens/index.js.map +1 -1
  74. package/dist/ui/screens/install-result.js +29 -6
  75. package/dist/ui/screens/install-result.js.map +1 -1
  76. package/dist/ui/screens/language.js +39 -18
  77. package/dist/ui/screens/language.js.map +1 -1
  78. package/dist/ui/screens/menu.js +99 -43
  79. package/dist/ui/screens/menu.js.map +1 -1
  80. package/dist/ui/screens/multi-agent.js +24 -18
  81. package/dist/ui/screens/multi-agent.js.map +1 -1
  82. package/dist/ui/screens/permissions.js +145 -33
  83. package/dist/ui/screens/permissions.js.map +1 -1
  84. package/dist/ui/screens/port-collision.d.ts +18 -0
  85. package/dist/ui/screens/port-collision.js +95 -0
  86. package/dist/ui/screens/port-collision.js.map +1 -0
  87. package/dist/ui/screens/updates.js +44 -21
  88. package/dist/ui/screens/updates.js.map +1 -1
  89. package/dist/ui/screens/welcome.js +56 -26
  90. package/dist/ui/screens/welcome.js.map +1 -1
  91. package/dist/ui/tokens.d.ts +37 -0
  92. package/dist/ui/tokens.js +58 -0
  93. package/dist/ui/tokens.js.map +1 -0
  94. package/package.json +1 -1
@@ -1,7 +1,9 @@
1
- import { jsx as _jsx, Fragment as _Fragment, 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, Menu } from '../components.js';
4
+ import { Frame } from '../components.js';
5
+ import { COLORS, GLYPHS } from '../tokens.js';
6
+ import { FooterKeys, InlineSpinner, MenuRow, SectionHead } from '../primitives/index.js';
5
7
  import { runFreePort } from '../../commands/free-port.js';
6
8
  const FREE_PORT_I18N = {
7
9
  en: {
@@ -11,16 +13,16 @@ const FREE_PORT_I18N = {
11
13
  'shutting down browser-link cleanly, the next client crashes with',
12
14
  '"port already in use". This screen finds the process holding',
13
15
  '127.0.0.1:17529 and stops it.',
14
- '',
15
- 'Safety: only processes whose image starts with "node" are killed.',
16
- 'Anything else is left alone with an explanation.',
17
16
  ].join('\n'),
17
+ safety: 'Safety: only processes whose image starts with "node" are killed. Anything else is left alone with an explanation.',
18
18
  confirmPrompt: 'Stop the process holding port 17529?',
19
19
  confirmYes: 'Yes — kill it',
20
20
  confirmNo: 'No — back to menu',
21
21
  running: 'Stopping…',
22
- footer: '↑↓ navigate · ↵ select · Esc back',
23
- doneFooter: '↵ / Esc back to menu',
22
+ footerNav: 'navigate',
23
+ footerSelect: 'select',
24
+ footerBack: 'back',
25
+ footerDone: 'back to menu',
24
26
  },
25
27
  es: {
26
28
  title: 'Liberar puerto 17529',
@@ -29,55 +31,68 @@ const FREE_PORT_I18N = {
29
31
  'browser-link de forma limpia, el próximo cliente crashea con',
30
32
  '"port already in use". Esta pantalla busca el proceso que tiene',
31
33
  '127.0.0.1:17529 y lo para.',
32
- '',
33
- 'Seguridad: sólo se matan procesos cuyo nombre empieza con "node".',
34
- 'Cualquier otro se deja vivo con una explicación.',
35
34
  ].join('\n'),
35
+ safety: 'Seguridad: sólo se matan procesos cuyo nombre empieza con "node". Cualquier otro se deja vivo con una explicación.',
36
36
  confirmPrompt: '¿Parar el proceso que tiene el puerto 17529?',
37
37
  confirmYes: 'Sí — matalo',
38
38
  confirmNo: 'No — volver al menú',
39
39
  running: 'Parando…',
40
- footer: '↑↓ moverse · ↵ elegir · Esc volver',
41
- doneFooter: '↵ / Esc volver al menú',
40
+ footerNav: 'moverse',
41
+ footerSelect: 'elegir',
42
+ footerBack: 'volver',
43
+ footerDone: 'volver al menú',
42
44
  },
43
45
  };
44
46
  export function FreePortView({ language, onBack }) {
45
47
  const t = FREE_PORT_I18N[language];
46
48
  const [phase, setPhase] = useState('confirm');
47
49
  const [result, setResult] = useState(null);
48
- const items = [
49
- { value: 'yes', label: t.confirmYes },
50
- { value: 'no', label: t.confirmNo },
50
+ const rows = [
51
+ { value: 'yes', hotkey: 'y', label: t.confirmYes },
52
+ { value: 'no', hotkey: 'n', label: t.confirmNo },
51
53
  ];
54
+ /* Default cursor on "No" — destructive action gates behind an explicit
55
+ * confirmation, matching the previous behaviour. */
52
56
  const [idx, setIdx] = useState(1);
53
- useInput((_input, key) => {
57
+ const confirm = (value) => {
58
+ if (value === 'no') {
59
+ onBack();
60
+ return;
61
+ }
62
+ setPhase('running');
63
+ /* Defer the synchronous kill so Ink renders the "running" phase. */
64
+ setTimeout(() => {
65
+ const r = runFreePort(language);
66
+ setResult(r);
67
+ setPhase('done');
68
+ }, 0);
69
+ };
70
+ useInput((input, key) => {
54
71
  if (phase === 'confirm') {
55
72
  if (key.upArrow)
56
- setIdx((i) => (i - 1 + items.length) % items.length);
73
+ setIdx((i) => (i - 1 + rows.length) % rows.length);
57
74
  else if (key.downArrow)
58
- setIdx((i) => (i + 1) % items.length);
59
- else if (key.return) {
60
- const v = items[idx].value;
61
- if (v === 'no')
62
- onBack();
63
- else {
64
- setPhase('running');
65
- // Defer the synchronous kill so Ink renders the "running" state.
66
- setTimeout(() => {
67
- const r = runFreePort(language);
68
- setResult(r);
69
- setPhase('done');
70
- }, 0);
71
- }
72
- }
75
+ setIdx((i) => (i + 1) % rows.length);
76
+ else if (key.return)
77
+ confirm(rows[idx].value);
73
78
  else if (key.escape)
74
79
  onBack();
80
+ else {
81
+ const target = rows.find((r) => r.hotkey === input.toLowerCase());
82
+ if (target)
83
+ confirm(target.value);
84
+ }
75
85
  }
76
86
  else if (phase === 'done') {
77
87
  if (key.return || key.escape)
78
88
  onBack();
79
89
  }
80
90
  });
81
- return (_jsxs(Frame, { title: t.title, footer: phase === 'done' ? t.doneFooter : t.footer, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: t.intro }) }), phase === 'confirm' && (_jsxs(_Fragment, { children: [_jsx(Text, { color: "white", bold: true, children: t.confirmPrompt }), _jsx(Box, { marginTop: 1, children: _jsx(Menu, { items: items, selectedIndex: idx }) })] })), phase === 'running' && _jsx(Text, { color: "gray", children: t.running }), phase === 'done' && result && (_jsx(Text, { color: result.ok ? 'green' : 'yellow', children: result.message }))] }));
91
+ const footer = phase === 'done' ? (_jsx(FooterKeys, { items: [{ k: GLYPHS.enter, label: t.footerDone }] })) : (_jsx(FooterKeys, { items: [
92
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNav },
93
+ { k: GLYPHS.enter, label: t.footerSelect },
94
+ { k: 'Esc', label: t.footerBack },
95
+ ] }));
96
+ return (_jsxs(Frame, { title: t.title, footer: footer, children: [_jsx(Text, { children: t.intro }), _jsxs(Box, { marginTop: 1, children: [_jsxs(Text, { color: COLORS.warn, children: [GLYPHS.warn, " "] }), _jsx(Text, { children: t.safety })] }), phase === 'confirm' && (_jsxs(_Fragment, { children: [_jsx(SectionHead, { children: t.confirmPrompt }), rows.map((row, i) => (_jsx(MenuRow, { selected: i === idx, hotkey: row.hotkey, label: row.label }, row.value)))] })), phase === 'running' && (_jsxs(Box, { marginTop: 1, children: [_jsx(InlineSpinner, {}), _jsx(Text, { color: COLORS.primary, children: ` ${t.running}` })] })), phase === 'done' && result && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: result.ok ? COLORS.success : COLORS.warn, children: [result.ok ? GLYPHS.success : GLYPHS.warn, " ", result.message] }) }))] }));
82
97
  }
83
98
  //# sourceMappingURL=free-port.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"free-port.js","sourceRoot":"","sources":["../../../src/ui/screens/free-port.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"free-port.js","sourceRoot":"","sources":["../../../src/ui/screens/free-port.tsx"],"names":[],"mappings":"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"}
@@ -11,3 +11,5 @@ export { LanguageView } from './language.js';
11
11
  export { MultiAgentView } from './multi-agent.js';
12
12
  export { FreePortView } from './free-port.js';
13
13
  export { AgentInstructionsView } from './agent-instructions.js';
14
+ export { EmptyClientsView } from './empty-clients.js';
15
+ export { PortCollisionView, type PortCollisionInfo } from './port-collision.js';
@@ -11,4 +11,6 @@ export { LanguageView } from './language.js';
11
11
  export { MultiAgentView } from './multi-agent.js';
12
12
  export { FreePortView } from './free-port.js';
13
13
  export { AgentInstructionsView } from './agent-instructions.js';
14
+ export { EmptyClientsView } from './empty-clients.js';
15
+ export { PortCollisionView } from './port-collision.js';
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/screens/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/screens/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAA0B,MAAM,qBAAqB,CAAC"}
@@ -1,18 +1,34 @@
1
- import { jsxs as _jsxs, jsx as _jsx } 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 { Frame } from '../components.js';
4
+ import { COLORS, GLYPHS } from '../tokens.js';
5
+ import { Badge, FooterKeys, SectionHead } from '../primitives/index.js';
4
6
  const RESULT_I18N = {
5
7
  en: {
6
8
  ok: 'Registered',
7
9
  warn: 'Not registered',
8
- hint: 'Restart the MCP client so it picks up the new entry.',
9
- footer: ' / Esc back to menu',
10
+ nextStep: 'Next step',
11
+ nextStepBody: 'Restart the MCP client so it picks up the new entry.',
12
+ then: 'Then',
13
+ thenBody: 'Pick',
14
+ thenAction: 'Agent instructions',
15
+ fix: 'Fix',
16
+ fixBody: 'Install the client first, then re-run this screen.',
17
+ footerBack: 'back to menu',
18
+ footerRetry: 'back',
10
19
  },
11
20
  es: {
12
21
  ok: 'Registrado',
13
22
  warn: 'No registrado',
14
- hint: 'Reiniciá el cliente MCP para que tome la nueva entrada.',
15
- footer: ' / Esc volver al menú',
23
+ nextStep: 'Próximo paso',
24
+ nextStepBody: 'Reiniciá el cliente MCP para que tome la nueva entrada.',
25
+ then: 'Después',
26
+ thenBody: 'Elegí',
27
+ thenAction: 'Instrucciones del agente',
28
+ fix: 'Arreglo',
29
+ fixBody: 'Instalá el cliente primero, y volvé a esta pantalla.',
30
+ footerBack: 'volver al menú',
31
+ footerRetry: 'volver',
16
32
  },
17
33
  };
18
34
  export function InstallResultView({ language, report, onBack }) {
@@ -22,6 +38,13 @@ export function InstallResultView({ language, report, onBack }) {
22
38
  onBack();
23
39
  });
24
40
  const ok = report.installedClient;
25
- return (_jsxs(Frame, { title: `${report.displayName} ${ok ? t.ok : t.warn}`, footer: t.footer, children: [_jsxs(Text, { color: ok ? 'green' : 'yellow', children: [ok ? '✓ ' : '⚠ ', report.message] }), ok && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "cyan", children: ["\u2192 ", t.hint] }) }))] }));
41
+ /* Title is the client name followed by a colored status word. We feed
42
+ * the title to Frame as a ReactNode so the colored portion renders
43
+ * inline with the (always-cyan) frame heading style. */
44
+ const title = (_jsxs(Text, { children: [_jsx(Text, { color: COLORS.heading, bold: true, children: report.displayName }), _jsx(Text, { color: COLORS.muted, children: ` ${GLYPHS.dot} ` }), _jsx(Text, { color: ok ? COLORS.success : COLORS.warn, bold: true, children: ok ? t.ok : t.warn })] }));
45
+ return (_jsxs(Frame, { title: title, footer: _jsx(FooterKeys, { items: [
46
+ { k: GLYPHS.enter, label: t.footerBack },
47
+ { k: 'Esc', label: t.footerRetry },
48
+ ] }), children: [_jsx(Box, { children: _jsx(Badge, { kind: ok ? 'ok' : 'warn', label: report.message }) }), ok ? (_jsxs(_Fragment, { children: [_jsx(SectionHead, { children: `${GLYPHS.arrow} ${t.nextStep}` }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { children: t.nextStepBody }) }), _jsx(SectionHead, { children: `${GLYPHS.arrow} ${t.then}` }), _jsx(Box, { paddingLeft: 2, children: _jsxs(Text, { children: [t.thenBody, ' ', _jsx(Text, { color: COLORS.primary, bold: true, children: t.thenAction }), "."] }) })] })) : (_jsxs(_Fragment, { children: [_jsx(SectionHead, { children: `${GLYPHS.arrow} ${t.fix}` }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { children: t.fixBody }) })] }))] }));
26
49
  }
27
50
  //# sourceMappingURL=install-result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-result.js","sourceRoot":"","sources":["../../../src/ui/screens/install-result.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAUzC,MAAM,WAAW,GAAiF;IAChG,EAAE,EAAE;QACF,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,sDAAsD;QAC5D,MAAM,EAAE,sBAAsB;KAC/B;IACD,EAAE,EAAE;QACF,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,yDAAyD;QAC/D,MAAM,EAAE,wBAAwB;KACjC;CACF,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAsB;IAChF,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChC,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,OAAO,CACL,MAAC,KAAK,IAAC,KAAK,EAAE,GAAG,MAAM,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,aAC7E,MAAC,IAAI,IAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,aACjC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAChB,MAAM,CAAC,OAAO,IACV,EACN,EAAE,IAAI,CACL,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAI,CAAC,CAAC,IAAI,IAAQ,GAChC,CACP,IACK,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"install-result.js","sourceRoot":"","sources":["../../../src/ui/screens/install-result.tsx"],"names":[],"mappings":"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"}
@@ -1,42 +1,63 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Text, useInput } from 'ink';
3
3
  import { useState } from 'react';
4
- import { Frame, Menu } from '../components.js';
4
+ import { Frame } from '../components.js';
5
+ import { COLORS, GLYPHS } from '../tokens.js';
6
+ import { FooterKeys, MenuRow } from '../primitives/index.js';
7
+ /* Language picker — two MenuRows, the currently-selected language gets
8
+ * a dim "current" badge so the user can tell at a glance which one is
9
+ * active even if the cursor hasn't moved yet. */
5
10
  const LANG_I18N = {
6
11
  en: {
7
12
  title: 'Language — switch between English and Español',
8
13
  prompt: 'Pick a language',
9
- saved: 'Saved. All output will now use the selected language.',
10
- footer: '↑↓ navigate · ↵ pick · Esc back',
14
+ saved: 'Saved. All output will now use the selected language.',
15
+ current: 'current',
16
+ footerNav: 'navigate',
17
+ footerPick: 'pick',
18
+ footerBack: 'back',
11
19
  },
12
20
  es: {
13
21
  title: 'Idioma — cambiar entre English y Español',
14
22
  prompt: 'Elegí un idioma',
15
- saved: 'Guardado. Todo el output va a usar el idioma elegido.',
16
- footer: '↑↓ moverse · ↵ elegir · Esc volver',
23
+ saved: 'Guardado. Todo el output va a usar el idioma elegido.',
24
+ current: 'actual',
25
+ footerNav: 'moverse',
26
+ footerPick: 'elegir',
27
+ footerBack: 'volver',
17
28
  },
18
29
  };
30
+ const ROWS = [
31
+ { value: 'en', hotkey: 'e', label: 'English' },
32
+ { value: 'es', hotkey: 's', label: 'Español' },
33
+ ];
19
34
  export function LanguageView({ language, onPick, onBack }) {
20
35
  const t = LANG_I18N[language];
21
- const items = [
22
- { value: 'en', label: 'English' },
23
- { value: 'es', label: 'Español' },
24
- ];
25
36
  const [idx, setIdx] = useState(language === 'es' ? 1 : 0);
26
37
  const [saved, setSaved] = useState(false);
27
- useInput((_input, key) => {
38
+ const pick = (next) => {
39
+ onPick(next);
40
+ setSaved(true);
41
+ };
42
+ useInput((input, key) => {
28
43
  if (key.upArrow)
29
- setIdx((i) => (i - 1 + items.length) % items.length);
44
+ setIdx((i) => (i - 1 + ROWS.length) % ROWS.length);
30
45
  else if (key.downArrow)
31
- setIdx((i) => (i + 1) % items.length);
32
- else if (key.return) {
33
- const next = items[idx].value;
34
- onPick(next);
35
- setSaved(true);
36
- }
46
+ setIdx((i) => (i + 1) % ROWS.length);
47
+ else if (key.return)
48
+ pick(ROWS[idx].value);
37
49
  else if (key.escape)
38
50
  onBack();
51
+ else {
52
+ const target = ROWS.find((r) => r.hotkey === input.toLowerCase());
53
+ if (target)
54
+ pick(target.value);
55
+ }
39
56
  });
40
- return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [_jsx(Text, { color: "white", bold: true, children: t.prompt }), _jsx(Box, { marginTop: 1, children: _jsx(Menu, { items: items, selectedIndex: idx }) }), saved && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "green", children: t.saved }) }))] }));
57
+ return (_jsxs(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
58
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNav },
59
+ { k: GLYPHS.enter, label: t.footerPick },
60
+ { k: 'Esc', label: t.footerBack },
61
+ ] }), children: [_jsx(Text, { color: "white", bold: true, children: t.prompt }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: ROWS.map((row, i) => (_jsx(MenuRow, { selected: i === idx, hotkey: row.hotkey, label: row.label, badge: row.value === language ? (_jsx(Text, { color: COLORS.muted, dimColor: true, children: t.current })) : undefined }, row.value))) }), saved && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: COLORS.success, children: [GLYPHS.success, " ", t.saved] }) }))] }));
41
62
  }
42
63
  //# sourceMappingURL=language.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"language.js","sourceRoot":"","sources":["../../../src/ui/screens/language.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;AAI9D,MAAM,SAAS,GAGX;IACF,EAAE,EAAE;QACF,KAAK,EAAE,+CAA+C;QACtD,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,yDAAyD;QAChE,MAAM,EAAE,iCAAiC;KAC1C;IACD,EAAE,EAAE;QACF,KAAK,EAAE,0CAA0C;QACjD,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,yDAAyD;QAChE,MAAM,EAAE,oCAAoC;KAC7C;CACF,CAAC;AAOF,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAqB;IAC1E,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAyB;QAClC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;QACjC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;KAClC,CAAC;IACF,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAS,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1C,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,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,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,KAAK,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,aACrC,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,EACL,KAAK,IAAI,CACR,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,CAAC,CAAC,KAAK,GAAQ,GAChC,CACP,IACK,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"language.js","sourceRoot":"","sources":["../../../src/ui/screens/language.tsx"],"names":[],"mappings":"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"}
@@ -1,14 +1,42 @@
1
1
  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
- import { Frame, Menu } from '../components.js';
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 { statusAll } from '../../commands/instructions.js';
6
8
  import { useBackgroundUpdateCheck } from '../hooks/use-update-check.js';
9
+ import { VERSION } from '../../version.js';
10
+ /* The ordering here is the visual order on screen. Hotkeys are picked
11
+ * so each one is unique across the full menu and reads naturally:
12
+ * r = register i = instructions p = permissions m = multi-agent
13
+ * d = doctor u = updates f = free port
14
+ * e = extension L = language w = welcome a = about g = github
15
+ * q = quit
16
+ */
17
+ const MENU_SPEC = [
18
+ { value: 'register', group: 'setup', hotkey: 'r' },
19
+ { value: 'instructions', group: 'setup', hotkey: 'i' },
20
+ { value: 'permissions', group: 'setup', hotkey: 'p' },
21
+ { value: 'multiAgent', group: 'setup', hotkey: 'm' },
22
+ { value: 'doctor', group: 'diagnose', hotkey: 'd' },
23
+ { value: 'updates', group: 'diagnose', hotkey: 'u' },
24
+ { value: 'freePort', group: 'diagnose', hotkey: 'f' },
25
+ { value: 'extension', group: 'reference', hotkey: 'e' },
26
+ { value: 'language', group: 'reference', hotkey: 'L' },
27
+ { value: 'welcome', group: 'reference', hotkey: 'w' },
28
+ { value: 'about', group: 'reference', hotkey: 'a' },
29
+ { value: 'repo', group: 'reference', hotkey: 'g' },
30
+ { value: 'quit', group: 'reference', hotkey: 'q' },
31
+ ];
7
32
  const MENU_I18N = {
8
33
  en: {
9
34
  title: 'browser-link — setup',
10
35
  prompt: 'Pick an action',
11
- footer: '↑↓ navigate · select · i instructions · l language · q quit',
36
+ promptHint: 'or press the bracketed key',
37
+ groupSetup: 'SETUP',
38
+ groupDiagnose: 'DIAGNOSE',
39
+ groupReference: 'REFERENCE',
12
40
  outdatedBanner: (clients) => `⚠ Outdated browser-link block in ${clients}. Press \`i\` to refresh in place.`,
13
41
  updateBanner: (latest) => `⬆ v${latest} available — run \`npm install -g @jobshimo/browser-link@latest\``,
14
42
  options: {
@@ -26,11 +54,27 @@ const MENU_I18N = {
26
54
  repo: 'Open the GitHub repository',
27
55
  quit: 'Quit',
28
56
  },
57
+ hints: {
58
+ instructions: 'trigger block in global .md',
59
+ permissions: 'which browser.* tools to expose',
60
+ multiAgent: 'share one bridge between clients',
61
+ doctor: 'report current setup state',
62
+ freePort: 'kill stuck bridge',
63
+ language: 'EN / ES',
64
+ },
65
+ footerNavigate: 'navigate',
66
+ footerSelect: 'select',
67
+ footerHotkey: 'hotkey',
68
+ footerLang: 'lang',
69
+ footerQuit: 'quit',
29
70
  },
30
71
  es: {
31
72
  title: 'browser-link — configuración',
32
73
  prompt: 'Elegí una acción',
33
- footer: '↑↓ moverse · elegir · i instrucciones · l idioma · q salir',
74
+ promptHint: 'o apretá la letra entre corchetes',
75
+ groupSetup: 'SETUP',
76
+ groupDiagnose: 'DIAGNÓSTICO',
77
+ groupReference: 'REFERENCIA',
34
78
  outdatedBanner: (clients) => `⚠ Bloque de browser-link desactualizado en ${clients}. Apretá \`i\` para refrescar.`,
35
79
  updateBanner: (latest) => `⬆ v${latest} disponible — corré \`npm install -g @jobshimo/browser-link@latest\``,
36
80
  options: {
@@ -48,11 +92,21 @@ const MENU_I18N = {
48
92
  repo: 'Abrir el repositorio en GitHub',
49
93
  quit: 'Salir',
50
94
  },
95
+ hints: {
96
+ instructions: 'bloque en el .md global',
97
+ permissions: 'qué tools browser.* exponer',
98
+ multiAgent: 'compartí el puente entre clientes',
99
+ doctor: 'estado actual del setup',
100
+ freePort: 'matá el puente colgado',
101
+ language: 'EN / ES',
102
+ },
103
+ footerNavigate: 'moverse',
104
+ footerSelect: 'elegir',
105
+ footerHotkey: 'hotkey',
106
+ footerLang: 'idioma',
107
+ footerQuit: 'salir',
51
108
  },
52
109
  };
53
- /** Default implementation — read live status from the installer registry
54
- * and project the outdated ones to their display names. Pulled out so the
55
- * test seam (`outdatedClientNames` prop) has a clean default. */
56
110
  function defaultOutdatedClientNames() {
57
111
  return statusAll()
58
112
  .filter((r) => r.state.kind === 'installed-outdated')
@@ -60,57 +114,59 @@ function defaultOutdatedClientNames() {
60
114
  }
61
115
  export function MainMenu({ language, onSelect, onSwapLang, onQuit, outdatedClientNames = defaultOutdatedClientNames, updateState, }) {
62
116
  const t = MENU_I18N[language];
63
- // The real hook drives a 6-hourly background check; tests inject a fixed
64
- // `updateState` instead. We call the hook unconditionally so the React
65
- // rules-of-hooks are satisfied (no conditional invocation), then ignore
66
- // its result when the prop override is present.
117
+ /* The real hook drives a 6-hourly background check; tests inject a fixed
118
+ * `updateState` instead. We call the hook unconditionally so the React
119
+ * rules-of-hooks are satisfied (no conditional invocation), then ignore
120
+ * its result when the prop override is present. */
67
121
  const hookState = useBackgroundUpdateCheck();
68
122
  const effectiveUpdate = updateState ?? hookState;
69
- const items = [
70
- 'register',
71
- 'instructions',
72
- 'permissions',
73
- 'multiAgent',
74
- 'extension',
75
- 'doctor',
76
- 'updates',
77
- 'freePort',
78
- 'language',
79
- 'welcome',
80
- 'about',
81
- 'repo',
82
- 'quit',
83
- ].map((a) => ({ value: a, label: t.options[a] }));
84
123
  const [idx, setIdx] = useState(0);
85
- // Banner state is computed on mount. The screen unmounts when the user
86
- // navigates away (AgentInstructionsView is a different screen), so the
87
- // next mount re-runs the lookup — after a successful refresh the banner
88
- // disappears automatically without any explicit invalidation.
89
124
  const [outdated, setOutdated] = useState(() => outdatedClientNames());
90
- // Refresh the banner if the prop function changes between renders (the
91
- // App may re-create it across language switches or theme changes).
92
125
  useEffect(() => {
93
126
  setOutdated(outdatedClientNames());
94
127
  }, [outdatedClientNames]);
128
+ const handleAction = (value) => {
129
+ if (value === 'quit')
130
+ onQuit();
131
+ else
132
+ onSelect(value);
133
+ };
95
134
  useInput((input, key) => {
96
135
  if (key.upArrow)
97
- setIdx((i) => (i - 1 + items.length) % items.length);
136
+ setIdx((i) => (i - 1 + MENU_SPEC.length) % MENU_SPEC.length);
98
137
  else if (key.downArrow)
99
- setIdx((i) => (i + 1) % items.length);
100
- else if (key.return) {
101
- const v = items[idx].value;
102
- if (v === 'quit')
103
- onQuit();
104
- else
105
- onSelect(v);
106
- }
138
+ setIdx((i) => (i + 1) % MENU_SPEC.length);
139
+ else if (key.return)
140
+ handleAction(MENU_SPEC[idx].value);
107
141
  else if (input === 'q' || key.escape)
108
142
  onQuit();
109
143
  else if (input === 'l')
110
144
  onSwapLang();
111
- else if (input === 'i' || input === 'I')
112
- onSelect('instructions');
145
+ else {
146
+ /* Hotkey dispatch. Compare case-insensitively so `L` (language) and
147
+ * `i` (instructions) both fire regardless of caps-lock state.
148
+ * Instructions also has the legacy `I`/`i` shortcut so existing
149
+ * users keep their muscle memory; new bindings use the same path. */
150
+ const lower = input.toLowerCase();
151
+ const target = MENU_SPEC.find((m) => m.hotkey.toLowerCase() === lower);
152
+ if (target)
153
+ handleAction(target.value);
154
+ }
113
155
  });
114
- return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [outdated.length > 0 && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "yellow", children: t.outdatedBanner(outdated.join(', ')) }) })), effectiveUpdate.isNewer && effectiveUpdate.latest !== null && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "cyan", children: t.updateBanner(effectiveUpdate.latest) }) })), _jsx(Text, { color: "white", bold: true, children: t.prompt }), _jsx(Box, { marginTop: 1, children: _jsx(Menu, { items: items, selectedIndex: idx }) })] }));
156
+ const groups = [
157
+ { id: 'setup', head: t.groupSetup },
158
+ { id: 'diagnose', head: t.groupDiagnose },
159
+ { id: 'reference', head: t.groupReference },
160
+ ];
161
+ return (_jsxs(Frame, { title: t.title, badge: _jsxs(Text, { color: COLORS.muted, dimColor: true, children: ["v", VERSION] }), footer: _jsx(FooterKeys, { items: [
162
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNavigate },
163
+ { k: GLYPHS.enter, label: t.footerSelect },
164
+ { k: 'a-z', label: t.footerHotkey },
165
+ { k: 'l', label: t.footerLang },
166
+ { k: 'q', label: t.footerQuit },
167
+ ] }), children: [outdated.length > 0 && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: COLORS.warn, children: t.outdatedBanner(outdated.join(', ')) }) })), effectiveUpdate.isNewer && effectiveUpdate.latest !== null && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: COLORS.primary, children: t.updateBanner(effectiveUpdate.latest) }) })), _jsxs(Box, { children: [_jsx(Text, { color: "white", bold: true, children: t.prompt }), _jsxs(Text, { color: COLORS.muted, dimColor: true, italic: true, children: [' ', GLYPHS.dot, " ", t.promptHint] })] }), groups.map((g) => (_jsxs(Box, { flexDirection: "column", children: [_jsx(SectionHead, { children: g.head }), MENU_SPEC.filter((m) => m.group === g.id).map((spec) => {
168
+ const globalIndex = MENU_SPEC.indexOf(spec);
169
+ return (_jsx(MenuRow, { selected: globalIndex === idx, hotkey: spec.hotkey, label: t.options[spec.value], hint: t.hints[spec.value] }, spec.value));
170
+ })] }, g.id)))] }));
115
171
  }
116
172
  //# sourceMappingURL=menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/ui/screens/menu.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/ui/screens/menu.tsx"],"names":[],"mappings":"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"}