@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../../../src/ui/primitives/status-bar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAyBtC,SAAS,UAAU,CAAC,KAAkB;IACpC,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAClD,IAAI,KAAK,KAAK,gBAAgB;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAkB;IACjD,OAAO,CACL,KAAC,GAAG,cACD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,OAAO,CACL,KAAC,GAAG,IAAiB,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAC5C,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,IAAI,kBAAE,IAAI,CAAC,IAAI,GAAQ,EAC7B,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,yBAAY,EACrC,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAG,IAAI,CAAC,KAAK,GAAQ,IACnD,IALC,IAAI,CAAC,IAAI,CAMb,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } 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 { FooterKeys, SectionHead } from '../primitives/index.js';
4
6
  import { I18N_ABOUT } from '../../commands/about.js';
5
7
  export function AboutView({ language, onBack }) {
6
8
  const t = I18N_ABOUT[language];
@@ -8,10 +10,17 @@ export function AboutView({ language, onBack }) {
8
10
  if (key.return || key.escape)
9
11
  onBack();
10
12
  });
11
- const footer = language === 'es' ? '↵ / Esc volver al menú' : '↵ / Esc back to menu';
12
- return (_jsxs(Frame, { title: t.title, footer: footer, children: [_jsx(AboutSection, { title: t.whatTitle, body: t.what }), _jsx(AboutSection, { title: t.howTitle, body: t.how }), _jsx(AboutSection, { title: t.bindingTitle, body: t.binding }), _jsx(AboutSection, { title: t.bridgeToolsTitle, body: t.bridgeTools }), _jsx(AboutSection, { title: t.mapToolsTitle, body: t.mapTools }), _jsx(AboutSection, { title: t.privacyTitle, body: t.privacy }), _jsx(AboutSection, { title: t.helpTitle, body: t.help }), _jsx(AboutSection, { title: t.authorTitle, body: t.author })] }));
13
+ const footerItems = [
14
+ { k: GLYPHS.enter, label: language === 'es' ? 'volver al menú' : 'back to menu' },
15
+ { k: 'Esc', label: language === 'es' ? 'volver' : 'back' },
16
+ ];
17
+ return (_jsxs(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: footerItems }), children: [_jsx(AboutSection, { title: t.whatTitle, body: t.what, first: true }), _jsx(AboutSection, { title: t.howTitle, body: t.how }), _jsx(AboutSection, { title: t.bindingTitle, body: t.binding }), _jsx(AboutSection, { title: t.bridgeToolsTitle, body: t.bridgeTools }), _jsx(AboutSection, { title: t.mapToolsTitle, body: t.mapTools }), _jsx(AboutSection, { title: t.privacyTitle, body: t.privacy }), _jsx(AboutSection, { title: t.helpTitle, body: t.help }), _jsx(AboutSection, { title: t.authorTitle, body: t.author })] }));
13
18
  }
14
- function AboutSection({ title, body }) {
15
- return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: title }), _jsx(Text, { children: body })] }));
19
+ /* `first=true` for the top section so we don't double-pad against the
20
+ * Frame's own marginBottom on the title row. SectionHead applies
21
+ * marginTop=1 unconditionally — for the very first section that becomes
22
+ * a no-op since the Frame already left a row of whitespace. */
23
+ function AboutSection({ title, body, first = false, }) {
24
+ return (_jsxs(Box, { flexDirection: "column", children: [first ? (_jsx(Text, { color: COLORS.heading, bold: true, children: title })) : (_jsx(SectionHead, { children: title })), _jsx(Text, { children: body })] }));
16
25
  }
17
26
  //# sourceMappingURL=about.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"about.js","sourceRoot":"","sources":["../../../src/ui/screens/about.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAOrD,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAkB;IAC5D,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,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,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IACrF,OAAO,CACL,MAAC,KAAK,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,aACnC,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAI,EAClD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,GAAI,EAChD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,GAAI,EACxD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,GAAI,EAChE,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,GAAI,EAC1D,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,GAAI,EACxD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAI,EAClD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,GAAI,IAChD,CACT,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAmC;IACpE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,kBACpB,KAAK,GACD,EACP,KAAC,IAAI,cAAE,IAAI,GAAQ,IACf,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../../src/ui/screens/about.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAUrD,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAkB;IAC5D,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,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,WAAW,GAAG;QAClB,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,EAAE;QACjF,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE;KAC3D,CAAC;IACF,OAAO,CACL,MAAC,KAAK,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAC,UAAU,IAAC,KAAK,EAAE,WAAW,GAAI,aAC/D,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,SAAG,EACxD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,GAAI,EAChD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,GAAI,EACxD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,GAAI,EAChE,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,GAAI,EAC1D,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,GAAI,EACxD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAI,EAClD,KAAC,YAAY,IAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,GAAI,IAChD,CACT,CAAC;AACJ,CAAC;AAED;;;+DAG+D;AAC/D,SAAS,YAAY,CAAC,EACpB,KAAK,EACL,IAAI,EACJ,KAAK,GAAG,KAAK,GAKd;IACC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,kBAC9B,KAAK,GACD,CACR,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,cAAE,KAAK,GAAe,CACnC,EACD,KAAC,IAAI,cAAE,IAAI,GAAQ,IACf,CACP,CAAC;AACJ,CAAC"}
@@ -2,6 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { Box, Text, useInput } from 'ink';
3
3
  import { useEffect, useMemo, useState } from 'react';
4
4
  import { Frame } from '../components.js';
5
+ import { COLORS, GLYPHS } from '../tokens.js';
6
+ import { Badge, FooterKeys, KeyCap } from '../primitives/index.js';
5
7
  import { INSTRUCTIONS_INSTALLERS, } from '../../agent-instructions/index.js';
6
8
  import { describeState, displayNameColumnWidth, installInstructionsFor, statusAll, uninstallInstructionsFor, } from '../../commands/instructions.js';
7
9
  const I18N = {
@@ -13,19 +15,23 @@ const I18N = {
13
15
  'project CLAUDE.md required. The block lists triggers ("user reports a UI',
14
16
  'bug → call browser.snapshot first") and is rewritten in place on update.',
15
17
  ].join('\n'),
16
- installPrompt: 'Pick a client to install / refresh the block. Press u to uninstall.',
17
- installed: ' installed',
18
- outdated: '⚠ outdated',
19
- notInstalled: '· not installed',
20
- noFile: '· no file yet',
21
- corrupt: ' corrupt (multiple blocks)',
18
+ installPrompt: 'Pick a client to install / refresh the block.',
19
+ installPromptHint: 'to uninstall.',
20
+ installed: 'installed',
21
+ outdated: 'outdated',
22
+ notInstalled: 'not installed',
23
+ noFile: 'no file yet',
24
+ corrupt: 'corrupt (multiple blocks)',
22
25
  legacySuffix: 'legacy',
23
- footer: '↑↓ navigate · install/refresh · u uninstall · Esc back',
24
- doneInstall: '✓ Done. Restart your MCP client to pick up the new instructions.',
25
- doneUninstall: ' Removed. The rest of the file was left untouched.',
26
- failInstall: ' Install failed.',
27
- failUninstall: ' Uninstall failed.',
28
- refreshHint: 'On install: the block is refreshed in place if it already exists.',
26
+ doneInstall: 'Done. Restart your MCP client to pick up the new instructions.',
27
+ doneUninstall: 'Removed. The rest of the file was left untouched.',
28
+ failInstall: 'Install failed.',
29
+ failUninstall: 'Uninstall failed.',
30
+ refreshHint: 'On install: the block is refreshed in place if it already exists. The rest of the file is left untouched.',
31
+ footerNav: 'navigate',
32
+ footerInstall: 'install / refresh',
33
+ footerUninstall: 'uninstall',
34
+ footerBack: 'back',
29
35
  },
30
36
  es: {
31
37
  title: 'Instrucciones del agente — browser-link en los .md globales de cada cliente',
@@ -36,49 +42,47 @@ const I18N = {
36
42
  '("el usuario reporta un bug de UI → llamá a browser.snapshot primero") y',
37
43
  'se rescribe in place al actualizar.',
38
44
  ].join('\n'),
39
- installPrompt: 'Elegí un cliente para instalar / refrescar el bloque. Apretá u para desinstalar.',
40
- installed: ' instalado',
41
- outdated: '⚠ desactualizado',
42
- notInstalled: '· no instalado',
43
- noFile: '· sin archivo todavía',
44
- corrupt: ' corrupto (múltiples bloques)',
45
+ installPrompt: 'Elegí un cliente para instalar / refrescar el bloque.',
46
+ installPromptHint: 'para desinstalar.',
47
+ installed: 'instalado',
48
+ outdated: 'desactualizado',
49
+ notInstalled: 'no instalado',
50
+ noFile: 'sin archivo todavía',
51
+ corrupt: 'corrupto (múltiples bloques)',
45
52
  legacySuffix: 'legacy',
46
- footer: '↑↓ moverse · instalar/refrescar · u desinstalar · Esc volver',
47
- doneInstall: '✓ Listo. Reiniciá tu cliente MCP para tomar las nuevas instrucciones.',
48
- doneUninstall: ' Quitado. El resto del archivo quedó intacto.',
49
- failInstall: 'Falló la instalación.',
50
- failUninstall: ' Falló la desinstalación.',
51
- refreshHint: 'En instalar: si el bloque ya existe, se reescribe en su lugar.',
53
+ doneInstall: 'Listo. Reiniciá tu cliente MCP para tomar las nuevas instrucciones.',
54
+ doneUninstall: 'Quitado. El resto del archivo quedó intacto.',
55
+ failInstall: 'Falló la instalación.',
56
+ failUninstall: 'Falló la desinstalación.',
57
+ refreshHint: 'En instalar: si el bloque ya existe, se reescribe en su lugar. El resto del archivo queda intacto.',
58
+ footerNav: 'moverse',
59
+ footerInstall: 'instalar / refrescar',
60
+ footerUninstall: 'desinstalar',
61
+ footerBack: 'volver',
52
62
  },
53
63
  };
54
64
  function statusBadge(state, t) {
55
65
  switch (state.kind) {
56
- case 'installed':
57
- return {
58
- label: `${t.installed} (${state.version === null ? t.legacySuffix : `v${state.version}`})`,
59
- color: 'green',
60
- };
61
- case 'installed-outdated':
62
- return {
63
- label: `${t.outdated} (${state.version === null ? t.legacySuffix : `v${state.version}`})`,
64
- color: 'yellow',
65
- };
66
+ case 'installed': {
67
+ const versionSuffix = state.version === null ? t.legacySuffix : `v${state.version}`;
68
+ return { kind: 'ok', label: `${t.installed} (${versionSuffix})` };
69
+ }
70
+ case 'installed-outdated': {
71
+ const versionSuffix = state.version === null ? t.legacySuffix : `v${state.version}`;
72
+ return { kind: 'warn', label: `${t.outdated} (${versionSuffix})` };
73
+ }
66
74
  case 'not-installed':
67
- return { label: t.notInstalled, color: 'gray' };
75
+ return { kind: 'off', label: t.notInstalled };
68
76
  case 'no-file':
69
- return { label: t.noFile, color: 'gray' };
77
+ return { kind: 'noFile', label: t.noFile };
70
78
  case 'corrupt':
71
- return { label: t.corrupt, color: 'yellow' };
79
+ return { kind: 'warn', label: t.corrupt };
72
80
  }
73
81
  }
74
82
  export function AgentInstructionsView({ language, onBack, initialCursorClient, }) {
75
83
  const t = I18N[language];
76
84
  const [reports, setReports] = useState(() => statusAll());
77
85
  const items = useMemo(() => INSTRUCTIONS_INSTALLERS, []);
78
- // If the caller asked us to focus a specific client, place the cursor on
79
- // it; otherwise default to the first row. The lookup is done once on
80
- // mount because the prop is the user's deliberate landing instruction —
81
- // we should not pull the cursor away from where they navigated to next.
82
86
  const initialIndex = useMemo(() => {
83
87
  if (!initialCursorClient)
84
88
  return 0;
@@ -87,13 +91,10 @@ export function AgentInstructionsView({ language, onBack, initialCursorClient, }
87
91
  }, [initialCursorClient, items]);
88
92
  const [cursor, setCursor] = useState(initialIndex);
89
93
  const [lastAction, setLastAction] = useState(null);
90
- // Refresh status when we come back from an install/uninstall round-trip.
91
94
  useEffect(() => {
92
95
  if (lastAction)
93
96
  setReports(statusAll());
94
97
  }, [lastAction]);
95
- // Column width is driven by the longest displayName so adding a fourth
96
- // client never requires hand-tuning a magic padEnd value in two places.
97
98
  const nameColumnWidth = useMemo(() => displayNameColumnWidth(items.map((i) => i.displayName)), [items]);
98
99
  const runAction = (client, action) => {
99
100
  const report = action === 'install' ? installInstructionsFor(client) : uninstallInstructionsFor(client);
@@ -111,11 +112,16 @@ export function AgentInstructionsView({ language, onBack, initialCursorClient, }
111
112
  else if (key.escape || input === 'q')
112
113
  onBack();
113
114
  });
114
- return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(Text, { children: t.intro }) }), _jsx(Text, { color: "white", bold: true, children: t.installPrompt }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: items.map((inst, i) => {
115
+ return (_jsxs(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
116
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNav },
117
+ { k: GLYPHS.enter, label: t.footerInstall },
118
+ { k: 'u', label: t.footerUninstall },
119
+ { k: 'Esc', label: t.footerBack },
120
+ ] }), children: [_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(Text, { children: t.intro }) }), _jsxs(Box, { children: [_jsx(Text, { color: "white", bold: true, children: t.installPrompt }), _jsxs(Text, { color: COLORS.muted, dimColor: true, italic: true, children: [' ', "Press", ' '] }), _jsx(KeyCap, { label: "u" }), _jsxs(Text, { color: COLORS.muted, dimColor: true, italic: true, children: [' ', t.installPromptHint] })] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: items.map((inst, i) => {
115
121
  const r = reports[i];
116
122
  const badge = statusBadge(r.state, t);
117
123
  const isCursor = i === cursor;
118
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: isCursor ? 'cyan' : 'gray', children: isCursor ? '❯ ' : ' ' }), _jsx(Text, { color: isCursor ? 'white' : 'gray', bold: isCursor, children: inst.displayName.padEnd(nameColumnWidth) }), _jsx(Text, { color: badge.color, children: badge.label })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: "gray", dimColor: true, children: r.filePath }) })] }, inst.id));
119
- }) }), lastAction && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: lastAction.report.ok ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", children: lastAction.kind === 'install' ? t.doneInstall : t.doneUninstall }), lastAction.report.message !== undefined && lastAction.report.message !== '' && (_jsx(Text, { color: "gray", dimColor: true, children: lastAction.report.message }))] })) : (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "red", children: lastAction.kind === 'install' ? t.failInstall : t.failUninstall }), lastAction.report.message !== undefined && lastAction.report.message !== '' && (_jsx(Box, { children: _jsx(Text, { color: "red", wrap: "wrap", children: lastAction.report.message }) }))] })) })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "gray", italic: true, dimColor: true, children: [t.refreshHint, " ", describeState(reports[cursor]?.state ?? { kind: 'no-file' }, language)] }) })] }));
124
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: isCursor ? COLORS.focus : COLORS.muted, children: isCursor ? `${GLYPHS.cursor} ` : ' ' }), _jsx(Text, { color: isCursor ? 'white' : COLORS.muted, bold: isCursor, children: inst.displayName.padEnd(nameColumnWidth) }), _jsx(Text, { children: " " }), _jsx(Badge, { kind: badge.kind, label: badge.label })] }), _jsx(Box, { marginLeft: 4, children: _jsx(Text, { color: COLORS.muted, dimColor: true, children: r.filePath }) })] }, inst.id));
125
+ }) }), lastAction && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: lastAction.report.ok ? (_jsxs(_Fragment, { children: [_jsxs(Text, { color: COLORS.success, children: [GLYPHS.success, " ", lastAction.kind === 'install' ? t.doneInstall : t.doneUninstall] }), lastAction.report.message !== undefined && lastAction.report.message !== '' && (_jsx(Text, { color: COLORS.muted, dimColor: true, children: lastAction.report.message }))] })) : (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: COLORS.error, children: [GLYPHS.error, " ", lastAction.kind === 'install' ? t.failInstall : t.failUninstall] }), lastAction.report.message !== undefined && lastAction.report.message !== '' && (_jsx(Box, { children: _jsx(Text, { color: COLORS.error, wrap: "wrap", children: lastAction.report.message }) }))] })) })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: COLORS.muted, italic: true, dimColor: true, children: [t.refreshHint, " ", describeState(reports[cursor]?.state ?? { kind: 'no-file' }, language)] }) })] }));
120
126
  }
121
127
  //# sourceMappingURL=agent-instructions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../../src/ui/screens/agent-instructions.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../../src/ui/screens/agent-instructions.tsx"],"names":[],"mappings":"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"}
@@ -1,43 +1,91 @@
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 { GLYPHS } from '../tokens.js';
6
+ import { Badge, FooterKeys, MenuRow } from '../primitives/index.js';
5
7
  import { INSTALLERS } from '../../installers/index.js';
6
8
  const PICKER_I18N = {
7
9
  en: {
8
10
  title: 'Register browser-link in…',
9
11
  prompt: 'Which MCP client?',
10
- footer: '↑↓ navigate · register · Esc back',
12
+ refreshHint: 'Re-running install on a registered client refreshes the entry in place.',
13
+ footerNav: 'navigate',
14
+ footerRegister: 'register',
15
+ footerBack: 'back',
16
+ registered: 'registered',
17
+ notRegistered: 'not registered',
18
+ notDetected: 'not detected',
11
19
  },
12
20
  es: {
13
21
  title: 'Registrar browser-link en…',
14
22
  prompt: '¿Qué cliente MCP?',
15
- footer: '↑↓ moverse · registrar · Esc volver',
23
+ refreshHint: 'Volver a correr el install en un cliente registrado refresca la entrada en el lugar.',
24
+ footerNav: 'moverse',
25
+ footerRegister: 'registrar',
26
+ footerBack: 'volver',
27
+ registered: 'registrado',
28
+ notRegistered: 'no registrado',
29
+ notDetected: 'no detectado',
16
30
  },
17
31
  };
32
+ /* Hotkeys: lowercase initial of the client id, stable across languages.
33
+ * `claude` → c, `opencode` → o, `copilot` → p (Copilot starts with 'c'
34
+ * too — fall back to the second-most-distinctive letter, 'p' from
35
+ * "Copilot"). */
36
+ const HOTKEY_BY_CLIENT = {
37
+ claude: 'c',
38
+ opencode: 'o',
39
+ copilot: 'p',
40
+ };
18
41
  export function ClientPicker({ language, onPick, onBack }) {
19
42
  const t = PICKER_I18N[language];
20
- const STATUS = {
21
- en: { registered: 'registered', notRegistered: 'not registered', notDetected: 'not detected' },
22
- es: { registered: 'registrado', notRegistered: 'no registrado', notDetected: 'no detectado' },
23
- };
24
- const s = STATUS[language];
25
- const items = INSTALLERS.map((inst) => {
43
+ const [idx, setIdx] = useState(0);
44
+ /* Build the row payload once per render calling detect() inside
45
+ * the JSX leaks a stat() into every row's diff path. */
46
+ const rows = INSTALLERS.map((inst) => {
26
47
  const d = inst.detect();
27
- const hint = !d.installed ? s.notDetected : d.registered ? s.registered : s.notRegistered;
28
- return { value: inst.id, label: inst.displayName, hint };
48
+ let kind;
49
+ let label;
50
+ if (!d.installed) {
51
+ kind = 'off';
52
+ label = t.notDetected;
53
+ }
54
+ else if (d.registered) {
55
+ kind = 'ok';
56
+ label = t.registered;
57
+ }
58
+ else {
59
+ kind = 'warn';
60
+ label = t.notRegistered;
61
+ }
62
+ return {
63
+ id: inst.id,
64
+ displayName: inst.displayName,
65
+ hotkey: HOTKEY_BY_CLIENT[inst.id],
66
+ badgeKind: kind,
67
+ badgeLabel: label,
68
+ };
29
69
  });
30
- const [idx, setIdx] = useState(0);
31
70
  useInput((input, key) => {
32
71
  if (key.upArrow)
33
- setIdx((i) => (i - 1 + items.length) % items.length);
72
+ setIdx((i) => (i - 1 + rows.length) % rows.length);
34
73
  else if (key.downArrow)
35
- setIdx((i) => (i + 1) % items.length);
74
+ setIdx((i) => (i + 1) % rows.length);
36
75
  else if (key.return)
37
- onPick(items[idx].value);
76
+ onPick(rows[idx].id);
38
77
  else if (input === 'q' || key.escape)
39
78
  onBack();
79
+ else {
80
+ const target = rows.find((r) => r.hotkey === input.toLowerCase());
81
+ if (target)
82
+ onPick(target.id);
83
+ }
40
84
  });
41
- 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 }) })] }));
85
+ return (_jsxs(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
86
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNav },
87
+ { k: GLYPHS.enter, label: t.footerRegister },
88
+ { k: 'Esc', label: t.footerBack },
89
+ ] }), 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.displayName, badge: _jsx(Badge, { kind: row.badgeKind, label: row.badgeLabel }) }, row.id))) }), _jsx(Box, { marginTop: 1, paddingLeft: 2, children: _jsx(Text, { italic: true, dimColor: true, children: t.refreshHint }) })] }));
42
90
  }
43
91
  //# sourceMappingURL=client-picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-picker.js","sourceRoot":"","sources":["../../../src/ui/screens/client-picker.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;AAE9D,OAAO,EAAE,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AAQtE,MAAM,WAAW,GAAwE;IACvF,EAAE,EAAE;QACF,KAAK,EAAE,2BAA2B;QAClC,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,qCAAqC;KAC9C;IACD,EAAE,EAAE;QACF,KAAK,EAAE,4BAA4B;QACnC,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,uCAAuC;KAChD;CACF,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAqB;IAC1E,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,MAAM,GAGR;QACF,EAAE,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE;QAC9F,EAAE,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE;KAC9F,CAAC;IACF,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAyB,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAC1F,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,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;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;aACzC,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;IACjD,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,IACA,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"client-picker.js","sourceRoot":"","sources":["../../../src/ui/screens/client-picker.tsx"],"names":[],"mappings":"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"}
@@ -1,20 +1,30 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Text, useInput } from 'ink';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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 { FooterKeys, InlineSpinner } from '../primitives/index.js';
5
7
  import { runDoctor, formatDoctor } from '../../commands/doctor.js';
8
+ /* Doctor — runs `runDoctor()` and dumps the formatted output.
9
+ *
10
+ * v0.9.0: replace the plain "Diagnosing…" string with an inline spinner
11
+ * so the long-running check feels alive, and adopt the FooterKeys strip
12
+ * for the keybindings. The formatted output itself comes from
13
+ * `formatDoctor()` which is a pre-styled plain string — we render it
14
+ * as-is so the existing tests keep passing.
15
+ */
6
16
  const DOCTOR_I18N = {
7
17
  en: {
8
18
  title: 'Doctor — diagnose current setup',
9
19
  loading: 'Diagnosing…',
10
- refresh: 'r refresh · ↵ / Esc back to menu',
11
- footer: '↵ / Esc back to menu',
20
+ refreshLabel: 'refresh',
21
+ backLabel: 'back to menu',
12
22
  },
13
23
  es: {
14
24
  title: 'Diagnóstico — estado actual de la instalación',
15
25
  loading: 'Diagnosticando…',
16
- refresh: 'r refrescar · ↵ / Esc volver al menú',
17
- footer: '↵ / Esc volver al menú',
26
+ refreshLabel: 'refrescar',
27
+ backLabel: 'volver al menú',
18
28
  },
19
29
  };
20
30
  export function DoctorView({ language, onBack }) {
@@ -38,6 +48,9 @@ export function DoctorView({ language, onBack }) {
38
48
  else if (input === 'r')
39
49
  setRefreshKey((k) => k + 1);
40
50
  });
41
- return (_jsx(Frame, { title: t.title, footer: t.refresh, children: output === null ? _jsx(Text, { color: "gray", children: t.loading }) : _jsx(Text, { children: output }) }));
51
+ return (_jsx(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
52
+ { k: 'r', label: t.refreshLabel },
53
+ { k: GLYPHS.enter, label: t.backLabel },
54
+ ] }), children: output === null ? (_jsxs(Box, { children: [_jsx(InlineSpinner, {}), _jsx(Text, { color: COLORS.muted, children: ` ${t.loading}` })] })) : (_jsx(Text, { children: output })) }));
42
55
  }
43
56
  //# sourceMappingURL=doctor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/ui/screens/doctor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,GAGb;IACF,EAAE,EAAE;QACF,KAAK,EAAE,iCAAiC;QACxC,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,kCAAkC;QAC3C,MAAM,EAAE,sBAAsB;KAC/B;IACD,EAAE,EAAE;QACF,KAAK,EAAE,+CAA+C;QACtD,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,sCAAsC;QAC/C,MAAM,EAAE,wBAAwB;KACjC;CACF,CAAC;AAMF,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAmB;IAC9D,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,KAAK,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,SAAS;gBAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;aAClC,IAAI,KAAK,KAAK,GAAG;YAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,YACrC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,OAAO,GAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,cAAE,MAAM,GAAQ,GAC1E,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/ui/screens/doctor.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;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGnE;;;;;;;GAOG;AACH,MAAM,WAAW,GAGb;IACF,EAAE,EAAE;QACF,KAAK,EAAE,iCAAiC;QACxC,OAAO,EAAE,aAAa;QACtB,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,cAAc;KAC1B;IACD,EAAE,EAAE;QACF,KAAK,EAAE,+CAA+C;QACtD,OAAO,EAAE,iBAAiB;QAC1B,YAAY,EAAE,WAAW;QACzB,SAAS,EAAE,gBAAgB;KAC5B;CACF,CAAC;AAMF,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAmB;IAC9D,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,KAAK,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,SAAS;gBAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;aAClC,IAAI,KAAK,KAAK,GAAG;YAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,MAAM,EACJ,KAAC,UAAU,IACT,KAAK,EAAE;gBACL,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;gBACjC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE;aACxC,GACD,YAGH,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CACjB,MAAC,GAAG,eACF,KAAC,aAAa,KAAG,EACjB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,IAAI,CAAC,CAAC,OAAO,EAAE,GAAQ,IAC/C,CACP,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,cAAE,MAAM,GAAQ,CACtB,GACK,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CommonProps } from './types.js';
2
+ interface EmptyClientsViewProps extends CommonProps {
3
+ onRescan: () => void;
4
+ onOpenRepo: () => void;
5
+ onBack: () => void;
6
+ }
7
+ export declare function EmptyClientsView({ language, onRescan, onOpenRepo, onBack, }: EmptyClientsViewProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from 'ink';
3
+ import { Frame } from '../components.js';
4
+ import { COLORS, GLYPHS } from '../tokens.js';
5
+ import { FooterKeys, SectionHead } from '../primitives/index.js';
6
+ /* Empty clients — the "no MCP clients detected" state shown when
7
+ * register would otherwise have rendered an unusable picker.
8
+ *
9
+ * Design source: states.jsx → StateEmpty.
10
+ *
11
+ * Triggered when none of the supported MCP installers' `detect().installed`
12
+ * returns true. The screen tells the user which clients are supported
13
+ * and where to install them, then offers rescan / back as the only
14
+ * forward actions.
15
+ */
16
+ const EMPTY_I18N = {
17
+ en: {
18
+ title: 'Register browser-link in…',
19
+ headline: 'No MCP clients detected on this machine.',
20
+ sub: 'Install one of the supported clients, then re-run browser-link.',
21
+ supportedHeader: 'Supported clients',
22
+ rescan: 'rescan',
23
+ openRepo: 'open repo',
24
+ back: 'back',
25
+ },
26
+ es: {
27
+ title: 'Registrar browser-link en…',
28
+ headline: 'No se detectó ningún cliente MCP en esta máquina.',
29
+ sub: 'Instalá alguno de los clientes soportados y volvé a correr browser-link.',
30
+ supportedHeader: 'Clientes soportados',
31
+ rescan: 'reescanear',
32
+ openRepo: 'abrir repo',
33
+ back: 'volver',
34
+ },
35
+ };
36
+ const SUPPORTED = [
37
+ { name: 'Claude Code', where: 'claude.ai/code' },
38
+ { name: 'OpenCode', where: 'opencode.ai' },
39
+ { name: 'GitHub Copilot CLI', where: 'gh extension install github/gh-copilot' },
40
+ ];
41
+ export function EmptyClientsView({ language, onRescan, onOpenRepo, onBack, }) {
42
+ const t = EMPTY_I18N[language];
43
+ useInput((input, key) => {
44
+ if (input === 'r')
45
+ onRescan();
46
+ else if (input === 'g')
47
+ onOpenRepo();
48
+ else if (key.escape || key.return || input === 'q')
49
+ onBack();
50
+ });
51
+ return (_jsxs(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
52
+ { k: 'r', label: t.rescan },
53
+ { k: 'g', label: t.openRepo },
54
+ { k: 'Esc', label: t.back },
55
+ ] }), children: [_jsx(Box, { marginTop: 1, paddingLeft: 2, children: _jsx(Text, { color: COLORS.muted, children: `${GLYPHS.dot} ${GLYPHS.dot} ${GLYPHS.dot}` }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "white", bold: true, children: t.headline }) }), _jsx(Text, { color: COLORS.muted, dimColor: true, children: t.sub }), _jsx(SectionHead, { children: t.supportedHeader }), SUPPORTED.map((c) => (_jsx(Box, { paddingLeft: 2, children: _jsxs(Text, { children: [_jsx(Text, { color: "white", children: `${GLYPHS.dot} ${c.name}` }), _jsx(Text, { color: COLORS.muted, children: ' ' }), _jsx(Text, { color: COLORS.primary, children: c.where })] }) }, c.name)))] }));
56
+ }
57
+ //# sourceMappingURL=empty-clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-clients.js","sourceRoot":"","sources":["../../../src/ui/screens/empty-clients.tsx"],"names":[],"mappings":"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"}
@@ -1,23 +1,37 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } 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 { FooterKeys, SectionHead } from '../primitives/index.js';
4
6
  import { getExtensionInfo } from '../../commands/extension.js';
7
+ /* Chrome extension — install steps. v0.9.0 layout:
8
+ * - "Extension assets are at" → path in cyan, indented.
9
+ * - "Steps" header, then the existing numbered-line steps split into
10
+ * row-per-step rendering with cyan-bold ordinals.
11
+ * - Trailing italic dim note about activation, footer via FooterKeys.
12
+ *
13
+ * The actual step text is generated by `getExtensionInfo().hints` (which
14
+ * is already a numbered, multi-line string) — we keep that text intact
15
+ * and only restyle the surrounding chrome.
16
+ */
5
17
  const EXT_I18N = {
6
18
  en: {
7
19
  title: 'Chrome extension — install steps',
8
- pathLabel: 'Extension assets are at:',
9
- stepsLabel: 'Install steps:',
20
+ pathLabel: 'Extension assets are at',
21
+ stepsLabel: 'Steps',
10
22
  afterLoading: 'After loading, open the extension popup on any tab and click "Conectar" to bridge it.',
11
23
  notFound: 'Extension assets not found. Run `npm run build:extension` (dev) or reinstall the package.',
12
- footer: '↵ / Esc back to menu',
24
+ footerBack: 'back to menu',
25
+ footerBackKey: 'back',
13
26
  },
14
27
  es: {
15
28
  title: 'Extensión de Chrome — pasos de instalación',
16
- pathLabel: 'Los assets de la extensión están en:',
17
- stepsLabel: 'Pasos:',
29
+ pathLabel: 'Los assets de la extensión están en',
30
+ stepsLabel: 'Pasos',
18
31
  afterLoading: 'Después de cargarla, abrí el popup de la extensión en cualquier pestaña y hacé click en "Conectar" para puentearla.',
19
32
  notFound: 'No se encontraron los assets. Corré `npm run build:extension` (dev) o reinstalá el paquete.',
20
- footer: '↵ / Esc volver al menú',
33
+ footerBack: 'volver al menú',
34
+ footerBackKey: 'volver',
21
35
  },
22
36
  };
23
37
  export function ExtensionView({ language, onBack }) {
@@ -27,6 +41,9 @@ export function ExtensionView({ language, onBack }) {
27
41
  if (key.return || key.escape)
28
42
  onBack();
29
43
  });
30
- return (_jsx(Frame, { title: t.title, footer: t.footer, children: info.path ? (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: t.pathLabel }), _jsx(Text, { color: "cyan", children: info.path }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: t.stepsLabel }), _jsx(Text, { children: info.hints })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", italic: true, children: t.afterLoading }) })] })) : (_jsx(Text, { color: "yellow", children: t.notFound })) }));
44
+ return (_jsx(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
45
+ { k: GLYPHS.enter, label: t.footerBack },
46
+ { k: 'Esc', label: t.footerBackKey },
47
+ ] }), children: info.path ? (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: t.pathLabel }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { color: COLORS.primary, children: info.path }) }), _jsx(SectionHead, { children: t.stepsLabel }), _jsx(Text, { children: info.hints }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { italic: true, dimColor: true, children: t.afterLoading }) })] })) : (_jsx(Text, { color: COLORS.warn, children: t.notFound })) }));
31
48
  }
32
49
  //# sourceMappingURL=extension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/ui/screens/extension.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,MAAM,QAAQ,GAUV;IACF,EAAE,EAAE;QACF,KAAK,EAAE,kCAAkC;QACzC,SAAS,EAAE,0BAA0B;QACrC,UAAU,EAAE,gBAAgB;QAC5B,YAAY,EACV,uFAAuF;QACzF,QAAQ,EACN,2FAA2F;QAC7F,MAAM,EAAE,sBAAsB;KAC/B;IACD,EAAE,EAAE;QACF,KAAK,EAAE,4CAA4C;QACnD,SAAS,EAAE,sCAAsC;QACjD,UAAU,EAAE,QAAQ;QACpB,YAAY,EACV,qHAAqH;QACvH,QAAQ,EACN,6FAA6F;QAC/F,MAAM,EAAE,wBAAwB;KACjC;CACF,CAAC;AAMF,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAsB;IACpE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,gBAAgB,EAAE,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,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,YACpC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACX,8BACE,KAAC,IAAI,IAAC,IAAI,kBAAE,CAAC,CAAC,SAAS,GAAQ,EAC/B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,IAAI,CAAC,IAAI,GAAQ,EACrC,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACvC,KAAC,IAAI,IAAC,IAAI,kBAAE,CAAC,CAAC,UAAU,GAAQ,EAChC,KAAC,IAAI,cAAE,IAAI,CAAC,KAAK,GAAQ,IACrB,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,kBACtB,CAAC,CAAC,YAAY,GACV,GACH,IACL,CACJ,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,CAAC,CAAC,QAAQ,GAAQ,CACzC,GACK,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/ui/screens/extension.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D;;;;;;;;;GASG;AACH,MAAM,QAAQ,GAWV;IACF,EAAE,EAAE;QACF,KAAK,EAAE,kCAAkC;QACzC,SAAS,EAAE,yBAAyB;QACpC,UAAU,EAAE,OAAO;QACnB,YAAY,EACV,uFAAuF;QACzF,QAAQ,EACN,2FAA2F;QAC7F,UAAU,EAAE,cAAc;QAC1B,aAAa,EAAE,MAAM;KACtB;IACD,EAAE,EAAE;QACF,KAAK,EAAE,4CAA4C;QACnD,SAAS,EAAE,qCAAqC;QAChD,UAAU,EAAE,OAAO;QACnB,YAAY,EACV,qHAAqH;QACvH,QAAQ,EACN,6FAA6F;QAC/F,UAAU,EAAE,gBAAgB;QAC5B,aAAa,EAAE,QAAQ;KACxB;CACF,CAAC;AAMF,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAsB;IACpE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,gBAAgB,EAAE,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;IAEH,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,MAAM,EACJ,KAAC,UAAU,IACT,KAAK,EAAE;gBACL,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE;gBACxC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE;aACrC,GACD,YAGH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACX,8BACE,KAAC,IAAI,IAAC,IAAI,kBAAE,CAAC,CAAC,SAAS,GAAQ,EAC/B,KAAC,GAAG,IAAC,WAAW,EAAE,CAAC,YACjB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,IAAI,CAAC,IAAI,GAAQ,GAC3C,EACN,KAAC,WAAW,cAAE,CAAC,CAAC,UAAU,GAAe,EACzC,KAAC,IAAI,cAAE,IAAI,CAAC,KAAK,GAAQ,EACzB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,MAAM,QAAC,QAAQ,kBAClB,CAAC,CAAC,YAAY,GACV,GACH,IACL,CACJ,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,CAAC,CAAC,QAAQ,GAAQ,CAC9C,GACK,CACT,CAAC;AACJ,CAAC"}