@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
@@ -2,6 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Text, useInput } from 'ink';
3
3
  import { useMemo, useState } from 'react';
4
4
  import { Frame } from '../components.js';
5
+ import { COLORS, GLYPHS } from '../tokens.js';
6
+ import { CheckRow, FooterKeys, SectionHead } from '../primitives/index.js';
5
7
  import { loadConfig, saveConfig } from '../../config.js';
6
8
  const MULTI_AGENT_I18N = {
7
9
  en: {
@@ -19,7 +21,8 @@ const MULTI_AGENT_I18N = {
19
21
  'persistent UI map.',
20
22
  ].join('\n'),
21
23
  multiToggle: 'Enable multi-agent mode',
22
- reelectHeader: 'Auto-reelect on primary close (advanced)',
24
+ reelectHeader: 'Auto-reelect on primary close',
25
+ reelectAdvanced: '(advanced)',
23
26
  reelectBody: [
24
27
  'When the primary client closes, secondary clients lose the bridge.',
25
28
  'With auto-reelect ON, one of them takes over the primary role',
@@ -29,9 +32,13 @@ const MULTI_AGENT_I18N = {
29
32
  reelectToggle: 'Auto-reelect when primary closes',
30
33
  reelectDisabled: '(enable multi-agent first)',
31
34
  unsaved: '* Unsaved changes — press s to save',
32
- saved: 'Saved.',
35
+ saved: 'Saved.',
33
36
  restart: 'Restart every MCP client for these changes to take effect.',
34
- footer: '↑↓ navigate · Space toggle · s save · Esc back',
37
+ primaryBadge: ' PRIMARY ',
38
+ footerNav: 'navigate',
39
+ footerToggle: 'toggle',
40
+ footerSave: 'save',
41
+ footerBack: 'back',
35
42
  },
36
43
  es: {
37
44
  title: 'Multi-agente — varios clientes MCP comparten el mismo puente',
@@ -48,7 +55,8 @@ const MULTI_AGENT_I18N = {
48
55
  'y el mismo mapa persistente.',
49
56
  ].join('\n'),
50
57
  multiToggle: 'Activar modo multi-agente',
51
- reelectHeader: 'Re-elección automática al cerrar el primary (avanzado)',
58
+ reelectHeader: 'Re-elección automática al cerrar el primary',
59
+ reelectAdvanced: '(avanzado)',
52
60
  reelectBody: [
53
61
  'Cuando el cliente primary cierra, los secundarios pierden el',
54
62
  'puente. Con re-elección automática activada, uno de ellos toma el',
@@ -59,9 +67,13 @@ const MULTI_AGENT_I18N = {
59
67
  reelectToggle: 'Re-elegir automáticamente al cerrar el primary',
60
68
  reelectDisabled: '(activá primero multi-agente)',
61
69
  unsaved: '* Cambios sin guardar — apretá s para guardar',
62
- saved: 'Guardado.',
70
+ saved: 'Guardado.',
63
71
  restart: 'Reiniciá cada cliente MCP para que los cambios tengan efecto.',
64
- footer: '↑↓ moverse · Espacio cambiar · s guardar · Esc volver',
72
+ primaryBadge: ' PRIMARY ',
73
+ footerNav: 'moverse',
74
+ footerToggle: 'cambiar',
75
+ footerSave: 'guardar',
76
+ footerBack: 'volver',
65
77
  },
66
78
  };
67
79
  export function MultiAgentView({ language, onBack }) {
@@ -72,7 +84,6 @@ export function MultiAgentView({ language, onBack }) {
72
84
  const [multi, setMulti] = useState(savedMulti);
73
85
  const [reelect, setReelect] = useState(savedReelect);
74
86
  const [justSaved, setJustSaved] = useState(false);
75
- // Only the two toggles are navigable.
76
87
  const [cursor, setCursor] = useState('multi');
77
88
  const move = (dir) => {
78
89
  setCursor((c) => {
@@ -85,15 +96,12 @@ export function MultiAgentView({ language, onBack }) {
85
96
  if (cursor === 'multi') {
86
97
  setMulti((m) => {
87
98
  const next = !m;
88
- // Turning multi off also clears the working reelect state, matching
89
- // the config normalisation rule (autoReelect implies multiAgent).
90
99
  if (!next)
91
100
  setReelect(false);
92
101
  return next;
93
102
  });
94
103
  }
95
104
  else {
96
- // Auto-reelect can only be turned on when multi is on.
97
105
  if (!multi)
98
106
  return;
99
107
  setReelect((r) => !r);
@@ -119,13 +127,11 @@ export function MultiAgentView({ language, onBack }) {
119
127
  onBack();
120
128
  });
121
129
  const unsaved = multi !== savedMulti || reelect !== savedReelect;
122
- const checkbox = (on, dim) => {
123
- if (dim)
124
- return { mark: '[ ]', color: 'gray' };
125
- return on ? { mark: '[x]', color: 'green' } : { mark: '[ ]', color: 'red' };
126
- };
127
- const multiBox = checkbox(multi, false);
128
- const reelectBox = checkbox(multi ? reelect : false, !multi);
129
- return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: t.multiHeader }), _jsx(Text, { children: t.multiBody })] }), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: cursor === 'multi' ? 'cyan' : 'gray', children: cursor === 'multi' ? '❯ ' : ' ' }), _jsxs(Text, { color: multiBox.color, children: [multiBox.mark, " "] }), _jsx(Text, { color: cursor === 'multi' ? 'white' : 'gray', bold: cursor === 'multi', children: t.multiToggle })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: t.reelectHeader }), _jsx(Text, { children: t.reelectBody })] }), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: cursor === 'reelect' ? 'cyan' : 'gray', children: cursor === 'reelect' ? '❯ ' : ' ' }), _jsxs(Text, { color: reelectBox.color, children: [reelectBox.mark, " "] }), _jsxs(Text, { color: !multi ? 'gray' : cursor === 'reelect' ? 'white' : 'gray', bold: cursor === 'reelect' && multi, children: [t.reelectToggle, !multi && (_jsxs(Text, { color: "gray", dimColor: true, children: [' ', t.reelectDisabled] }))] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [unsaved ? (_jsx(Text, { color: "yellow", children: t.unsaved })) : justSaved ? (_jsx(Text, { color: "green", children: t.saved })) : null, _jsx(Text, { color: "gray", italic: true, children: t.restart })] })] }));
130
+ return (_jsxs(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
131
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNav },
132
+ { k: 'Sp', label: t.footerToggle },
133
+ { k: 's', label: t.footerSave },
134
+ { k: 'Esc', label: t.footerBack },
135
+ ] }), children: [_jsxs(Box, { children: [_jsx(Text, { color: COLORS.heading, bold: true, children: t.multiHeader }), savedMulti && (_jsx(Box, { marginLeft: 2, children: _jsx(Text, { inverse: true, bold: true, color: COLORS.primary, children: t.primaryBadge }) }))] }), _jsx(Text, { children: t.multiBody }), _jsx(Box, { marginTop: 1, children: _jsx(CheckRow, { selected: cursor === 'multi', on: multi, label: t.multiToggle }) }), _jsx(SectionHead, { hint: t.reelectAdvanced, children: t.reelectHeader }), _jsx(Text, { children: t.reelectBody }), _jsx(Box, { marginTop: 1, children: _jsx(CheckRow, { selected: cursor === 'reelect', on: multi ? reelect : false, dimmed: !multi, label: t.reelectToggle, hint: !multi ? t.reelectDisabled : undefined }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [unsaved ? (_jsx(Text, { color: COLORS.warn, children: t.unsaved })) : justSaved ? (_jsxs(Text, { color: COLORS.success, children: [GLYPHS.success, " ", t.saved] })) : null, _jsx(Text, { color: COLORS.muted, italic: true, children: t.restart })] })] }));
130
136
  }
131
137
  //# sourceMappingURL=multi-agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-agent.js","sourceRoot":"","sources":["../../../src/ui/screens/multi-agent.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"multi-agent.js","sourceRoot":"","sources":["../../../src/ui/screens/multi-agent.tsx"],"names":[],"mappings":"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"}
@@ -2,32 +2,63 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Text, useInput } from 'ink';
3
3
  import { useMemo, useState } from 'react';
4
4
  import { Frame } from '../components.js';
5
+ import { COLORS, GLYPHS } from '../tokens.js';
6
+ import { CheckRow, FooterKeys, KeyCap, SectionHead } from '../primitives/index.js';
5
7
  import { loadConfig, saveConfig } from '../../config.js';
6
8
  import { PRESETS, TOOL_CATALOGUE, sanitizeDisabledTools, } from '../../permissions.js';
9
+ /* Permissions — pick which MCP tools to expose.
10
+ *
11
+ * v0.9.0 layout (screens2.jsx → ScreenPermissions):
12
+ * - Presets as a horizontal pill row at top. The currently-cursor'd
13
+ * preset is rendered inverse (the "selected" pill); Enter applies it.
14
+ * - Tools grouped by family (Browser bridge, Persistent UI map). Each
15
+ * family head shows a `N / total enabled` hint.
16
+ * - Sticky bottom save bar when dirty — shows pending change count,
17
+ * `s save · d discard` keycaps, and an italic note that changes
18
+ * take effect on the next tool call.
19
+ *
20
+ * The change-count tracking and discard action are new — discard rolls
21
+ * the working `disabled` back to `savedDisabled`. Save and the existing
22
+ * logic stay unchanged.
23
+ */
7
24
  const PERM_I18N = {
8
25
  en: {
9
26
  title: 'Permissions — pick which MCP tools to expose',
10
- intro: 'Apply a preset (↵) or toggle individual tools (Space). Press s to save.',
27
+ intro: 'Apply a preset or toggle individual tools.',
11
28
  presetsHeader: 'Presets',
12
29
  bridgeHeader: 'Browser bridge',
13
30
  mapHeader: 'Persistent UI map',
14
- applyPrefix: 'Apply: ',
15
- unsaved: '* Unsaved changes press s to save',
16
- saved: '✓ Saved.',
17
- restart: 'Changes take effect on the next tool call — no MCP client restart needed.',
18
- footer: '↑↓ navigate · Space toggle · apply preset · s save · Esc back',
31
+ enabled: 'enabled',
32
+ unsavedSingle: 'Unsaved: 1 change since save',
33
+ unsavedMany: (n) => `Unsaved: ${n} changes since save`,
34
+ saved: 'Saved.',
35
+ restart: 'changes apply on the next tool call no MCP client restart needed',
36
+ footerNav: 'navigate',
37
+ footerToggle: 'toggle',
38
+ footerApply: 'apply preset',
39
+ footerSave: 'save',
40
+ footerBack: 'back',
41
+ saveLabel: 'save',
42
+ discardLabel: 'discard',
19
43
  },
20
44
  es: {
21
45
  title: 'Permisos — elegí qué tools del MCP se exponen',
22
- intro: 'Aplicá un preset (↵) o cambiá tools individuales (Espacio). Apretá s para guardar.',
46
+ intro: 'Aplicá un preset o cambiá tools individuales.',
23
47
  presetsHeader: 'Presets',
24
48
  bridgeHeader: 'Bridge del browser',
25
49
  mapHeader: 'Mapa persistente',
26
- applyPrefix: 'Aplicar: ',
27
- unsaved: '* Cambios sin guardar — apretá s para guardar',
28
- saved: '✓ Guardado.',
29
- restart: 'Los cambios tienen efecto en la próxima llamada — no hace falta reiniciar el cliente MCP.',
30
- footer: '↑↓ moverse · Espacio cambiar · aplicar preset · s guardar · Esc volver',
50
+ enabled: 'activos',
51
+ unsavedSingle: '* 1 cambio sin guardar',
52
+ unsavedMany: (n) => `* ${n} cambios sin guardar`,
53
+ saved: 'Guardado.',
54
+ restart: 'los cambios tienen efecto en la próxima llamada no hace falta reiniciar el cliente MCP',
55
+ footerNav: 'moverse',
56
+ footerToggle: 'cambiar',
57
+ footerApply: 'aplicar preset',
58
+ footerSave: 'guardar',
59
+ footerBack: 'volver',
60
+ saveLabel: 'guardar',
61
+ discardLabel: 'descartar',
31
62
  },
32
63
  };
33
64
  function setsDiffer(a, b) {
@@ -38,12 +69,25 @@ function setsDiffer(a, b) {
38
69
  return true;
39
70
  return false;
40
71
  }
72
+ function diffSize(a, b) {
73
+ let n = 0;
74
+ for (const x of a)
75
+ if (!b.has(x))
76
+ n += 1;
77
+ for (const x of b)
78
+ if (!a.has(x))
79
+ n += 1;
80
+ return n;
81
+ }
41
82
  export function PermissionsView({ language, onBack }) {
42
83
  const t = PERM_I18N[language];
84
+ /* Row order:
85
+ * 1 preset row (horizontal pills, single navigable row)
86
+ * 1 bridge header, then bridge tools
87
+ * 1 map header, then map tools
88
+ */
43
89
  const rows = useMemo(() => {
44
- const r = [];
45
- for (const preset of PRESETS)
46
- r.push({ kind: 'preset', preset });
90
+ const r = [{ kind: 'preset' }];
47
91
  r.push({ kind: 'header', family: 'bridge' });
48
92
  for (const tool of TOOL_CATALOGUE) {
49
93
  if (tool.family === 'bridge')
@@ -61,6 +105,7 @@ export function PermissionsView({ language, onBack }) {
61
105
  const [disabled, setDisabled] = useState(initial);
62
106
  const firstNonHeader = rows.findIndex((r) => r.kind !== 'header');
63
107
  const [cursor, setCursor] = useState(firstNonHeader);
108
+ const [presetCursor, setPresetCursor] = useState(0);
64
109
  const [justSaved, setJustSaved] = useState(false);
65
110
  const move = (dir) => {
66
111
  setCursor((idx) => {
@@ -73,6 +118,12 @@ export function PermissionsView({ language, onBack }) {
73
118
  return idx;
74
119
  });
75
120
  };
121
+ /* When the cursor is on a preset row, left/right arrows move between
122
+ * pills instead of bumping to the next row. We compute that adjacency
123
+ * here so the handler stays linear. */
124
+ const movePreset = (dir) => {
125
+ setPresetCursor((i) => (i + dir + PRESETS.length) % PRESETS.length);
126
+ };
76
127
  const toggleTool = (name) => {
77
128
  setDisabled((prev) => {
78
129
  const next = new Set(prev);
@@ -94,11 +145,23 @@ export function PermissionsView({ language, onBack }) {
94
145
  setSavedDisabled(new Set(list));
95
146
  setJustSaved(true);
96
147
  };
148
+ const discard = () => {
149
+ setDisabled(new Set(savedDisabled));
150
+ setJustSaved(false);
151
+ };
97
152
  useInput((input, key) => {
98
153
  if (key.upArrow)
99
154
  move(-1);
100
155
  else if (key.downArrow)
101
156
  move(1);
157
+ else if (key.leftArrow) {
158
+ if (rows[cursor].kind === 'preset')
159
+ movePreset(-1);
160
+ }
161
+ else if (key.rightArrow) {
162
+ if (rows[cursor].kind === 'preset')
163
+ movePreset(1);
164
+ }
102
165
  else if (input === ' ') {
103
166
  const row = rows[cursor];
104
167
  if (row.kind === 'tool')
@@ -107,29 +170,78 @@ export function PermissionsView({ language, onBack }) {
107
170
  else if (key.return) {
108
171
  const row = rows[cursor];
109
172
  if (row.kind === 'preset')
110
- applyPreset(row.preset);
173
+ applyPreset(PRESETS[presetCursor]);
111
174
  }
112
- else if (input === 's' || input === 'S') {
175
+ else if (input === 's' || input === 'S')
113
176
  save();
114
- }
177
+ else if (input === 'd' || input === 'D')
178
+ discard();
115
179
  else if (input === 'q' || key.escape)
116
180
  onBack();
117
181
  });
118
182
  const unsaved = setsDiffer(disabled, savedDisabled);
119
- return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "white", children: t.intro }) }), _jsx(Box, { flexDirection: "column", children: rows.map((row, i) => {
120
- if (row.kind === 'header') {
121
- const label = row.family === 'bridge' ? t.bridgeHeader : t.mapHeader;
122
- return (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "cyan", bold: true, children: [label, ":"] }) }, `h-${i}`));
123
- }
124
- const isCursor = i === cursor;
125
- const cursorMark = isCursor ? '❯' : ' ';
126
- if (row.kind === 'preset') {
127
- return (_jsxs(Box, { children: [_jsxs(Text, { color: isCursor ? 'cyan' : 'gray', children: [cursorMark, " "] }), _jsxs(Text, { color: isCursor ? 'white' : 'gray', bold: isCursor, children: [t.applyPrefix, row.preset.label] })] }, `p-${row.preset.id}`));
128
- }
129
- const isDisabled = disabled.has(row.tool.name);
130
- const checkbox = isDisabled ? '[ ]' : '[x]';
131
- const checkboxColor = isDisabled ? 'red' : 'green';
132
- return (_jsxs(Box, { children: [_jsxs(Text, { color: isCursor ? 'cyan' : 'gray', children: [cursorMark, " "] }), _jsxs(Text, { color: checkboxColor, children: [checkbox, " "] }), _jsx(Text, { color: isCursor ? 'white' : isDisabled ? 'gray' : 'white', bold: isCursor, children: row.tool.name.padEnd(28) }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', row.tool.summary] })] }, `t-${row.tool.name}`));
133
- }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [unsaved ? (_jsx(Text, { color: "yellow", children: t.unsaved })) : justSaved ? (_jsx(Text, { color: "green", children: t.saved })) : null, _jsx(Text, { color: "gray", italic: true, children: t.restart })] })] }));
183
+ const changeCount = diffSize(disabled, savedDisabled);
184
+ /* Per-family "N / total enabled" hint for the SectionHead. We compute
185
+ * once per render so each family row reads from a single source. */
186
+ const familyCounts = useMemo(() => {
187
+ let bridgeTotal = 0;
188
+ let bridgeEnabled = 0;
189
+ let mapTotal = 0;
190
+ let mapEnabled = 0;
191
+ for (const tool of TOOL_CATALOGUE) {
192
+ if (tool.family === 'bridge') {
193
+ bridgeTotal += 1;
194
+ if (!disabled.has(tool.name))
195
+ bridgeEnabled += 1;
196
+ }
197
+ else {
198
+ mapTotal += 1;
199
+ if (!disabled.has(tool.name))
200
+ mapEnabled += 1;
201
+ }
202
+ }
203
+ return { bridgeTotal, bridgeEnabled, mapTotal, mapEnabled };
204
+ }, [disabled]);
205
+ return (_jsxs(Frame, { title: t.title, footer: _jsx(FooterKeys, { items: [
206
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNav },
207
+ { k: 'Sp', label: t.footerToggle },
208
+ { k: GLYPHS.enter, label: t.footerApply },
209
+ { k: 's', label: t.footerSave },
210
+ { k: 'Esc', label: t.footerBack },
211
+ ] }), children: [_jsx(Text, { children: t.intro }), _jsx(SectionHead, { children: t.presetsHeader }), _jsx(PresetPills, { presets: PRESETS, activeIndex: presetCursor, cursorOnPresetRow: rows[cursor].kind === 'preset' }), _jsx(SectionHead, { hint: `${familyCounts.bridgeEnabled} / ${familyCounts.bridgeTotal} ${t.enabled}`, children: t.bridgeHeader }), rows.map((row, i) => {
212
+ if (row.kind !== 'tool' || row.tool.family !== 'bridge')
213
+ return null;
214
+ return (_jsx(CheckRow, { selected: i === cursor, on: !disabled.has(row.tool.name), label: row.tool.name, hint: row.tool.summary }, `bridge-${row.tool.name}`));
215
+ }), _jsx(SectionHead, { hint: `${familyCounts.mapEnabled} / ${familyCounts.mapTotal} ${t.enabled}`, children: t.mapHeader }), rows.map((row, i) => {
216
+ if (row.kind !== 'tool' || row.tool.family !== 'map')
217
+ return null;
218
+ return (_jsx(CheckRow, { selected: i === cursor, on: !disabled.has(row.tool.name), label: row.tool.name, hint: row.tool.summary }, `map-${row.tool.name}`));
219
+ }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: unsaved ? (_jsx(SaveBar, { count: changeCount, unsavedLabel: changeCount === 1 ? t.unsavedSingle : t.unsavedMany(changeCount), saveLabel: t.saveLabel, discardLabel: t.discardLabel, restart: t.restart })) : justSaved ? (_jsxs(Text, { color: COLORS.success, children: [GLYPHS.success, " ", t.saved] })) : null })] }));
220
+ }
221
+ /* Horizontal preset pills. The currently-cursored preset is inverted;
222
+ * the rest render in muted gray. We do NOT render a vertical cursor
223
+ * here — the cursor IS the inverted pill. The screen's main cursor only
224
+ * lands on the preset row as a whole; left/right move between pills. */
225
+ function PresetPills({ presets, activeIndex, cursorOnPresetRow, }) {
226
+ /* When the cursor is on the preset row, the active pill renders
227
+ * inverse + bold (it's the focus target). When the cursor is somewhere
228
+ * else, no pill is inverted — we still highlight the most-recently
229
+ * selected pill in cyan so the user remembers which preset is "set". */
230
+ return (_jsxs(Box, { children: [_jsx(Text, { color: cursorOnPresetRow ? COLORS.focus : COLORS.muted, children: cursorOnPresetRow ? `${GLYPHS.cursor} ` : ' ' }), presets.map((preset, i) => {
231
+ const isActive = i === activeIndex;
232
+ const last = i === presets.length - 1;
233
+ if (isActive && cursorOnPresetRow) {
234
+ return (_jsxs(Box, { children: [_jsx(Text, { inverse: true, bold: true, children: ` ${preset.label} ` }), !last && _jsx(Text, { color: COLORS.muted, children: ' ' })] }, preset.id));
235
+ }
236
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: isActive ? COLORS.primary : COLORS.muted, children: [" ", preset.label, " "] }), !last && _jsx(Text, { color: COLORS.muted, children: ' ' })] }, preset.id));
237
+ })] }));
238
+ }
239
+ /* Sticky-feeling save bar — a one-row inverted strip plus keycaps for
240
+ * save / discard plus an italic dim suffix explaining the effect. Lives
241
+ * inline under the catalogue (Ink doesn't have a true fixed-position
242
+ * primitive, but the visual weight of the inverse strip reads as
243
+ * "actionable" against the calmer rows above). */
244
+ function SaveBar({ count: _count, unsavedLabel, saveLabel, discardLabel, restart, }) {
245
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: COLORS.warn, children: unsavedLabel }), _jsxs(Box, { marginTop: 1, children: [_jsx(KeyCap, { label: "s" }), _jsxs(Text, { color: COLORS.muted, children: [" ", saveLabel] }), _jsx(Text, { color: COLORS.muted, dimColor: true, children: ` ${GLYPHS.dot} ` }), _jsx(KeyCap, { label: "d" }), _jsxs(Text, { color: COLORS.muted, children: [" ", discardLabel] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: COLORS.muted, italic: true, dimColor: true, children: restart }) })] }));
134
246
  }
135
247
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/ui/screens/permissions.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/ui/screens/permissions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { CommonProps } from './types.js';
2
+ interface PortCollisionInfo {
3
+ /** PID currently holding 127.0.0.1:17529. null when the lookup failed
4
+ * (we still show the screen — the headline still applies). */
5
+ pid: number | null;
6
+ /** Best-effort image or command line of the holder. null when we
7
+ * couldn't extract it. */
8
+ cmdline: string | null;
9
+ }
10
+ interface PortCollisionViewProps extends CommonProps {
11
+ info: PortCollisionInfo;
12
+ onKill?: () => void;
13
+ onMultiAgent?: () => void;
14
+ onRetry?: () => void;
15
+ onQuit: () => void;
16
+ }
17
+ export declare function PortCollisionView({ language, info, onKill, onMultiAgent, onRetry, onQuit, }: PortCollisionViewProps): import("react/jsx-runtime").JSX.Element;
18
+ export type { PortCollisionInfo };
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from 'ink';
3
+ import { useState } from 'react';
4
+ import { Frame } from '../components.js';
5
+ import { COLORS, GLYPHS } from '../tokens.js';
6
+ import { FooterKeys, MenuRow, SectionHead } from '../primitives/index.js';
7
+ const PORT_I18N = {
8
+ en: {
9
+ title: 'Port 17529 is already in use',
10
+ body1: 'browser-link could not bind 127.0.0.1:17529.',
11
+ body2: "Another process is already holding it — usually a previous instance that didn't shut down cleanly.",
12
+ processHeader: 'Process holding the port',
13
+ fixHeader: 'Fix paths',
14
+ kill: 'Kill the stuck process',
15
+ killHint: 'safe — only node processes',
16
+ multi: 'Switch to multi-agent mode',
17
+ multiHint: 'run alongside, proxy to the holder',
18
+ retry: 'Retry — check again',
19
+ quit: 'Quit',
20
+ why1: 'Why this happens: an MCP client crash leaves the bridge orphaned.',
21
+ why2: 'Multi-agent mode prevents this by allowing parallel clients.',
22
+ footerNav: 'navigate',
23
+ footerSelect: 'select',
24
+ footerQuit: 'quit',
25
+ },
26
+ es: {
27
+ title: 'El puerto 17529 ya está en uso',
28
+ body1: 'browser-link no pudo bindear 127.0.0.1:17529.',
29
+ body2: 'Otro proceso lo tiene tomado — normalmente una instancia anterior que no cerró bien.',
30
+ processHeader: 'Proceso que tiene el puerto',
31
+ fixHeader: 'Cómo arreglarlo',
32
+ kill: 'Matar el proceso colgado',
33
+ killHint: 'seguro — sólo procesos node',
34
+ multi: 'Pasar a modo multi-agente',
35
+ multiHint: 'corré en paralelo, hacé proxy al que lo tiene',
36
+ retry: 'Reintentar — chequear de nuevo',
37
+ quit: 'Salir',
38
+ why1: 'Por qué pasa: un crash de un cliente MCP deja el puente huérfano.',
39
+ why2: 'Multi-agente evita esto permitiendo clientes en paralelo.',
40
+ footerNav: 'moverse',
41
+ footerSelect: 'elegir',
42
+ footerQuit: 'salir',
43
+ },
44
+ };
45
+ export function PortCollisionView({ language, info, onKill, onMultiAgent, onRetry, onQuit, }) {
46
+ const t = PORT_I18N[language];
47
+ const rows = [
48
+ { value: 'kill', hotkey: 'k', label: t.kill, hint: t.killHint, enabled: onKill !== undefined },
49
+ {
50
+ value: 'multi',
51
+ hotkey: 'm',
52
+ label: t.multi,
53
+ hint: t.multiHint,
54
+ enabled: onMultiAgent !== undefined,
55
+ },
56
+ { value: 'retry', hotkey: 'r', label: t.retry, enabled: onRetry !== undefined },
57
+ { value: 'quit', hotkey: 'q', label: t.quit, enabled: true },
58
+ ];
59
+ const [idx, setIdx] = useState(0);
60
+ const fire = (value) => {
61
+ if (value === 'kill')
62
+ onKill?.();
63
+ else if (value === 'multi')
64
+ onMultiAgent?.();
65
+ else if (value === 'retry')
66
+ onRetry?.();
67
+ else
68
+ onQuit();
69
+ };
70
+ useInput((input, key) => {
71
+ if (key.upArrow)
72
+ setIdx((i) => (i - 1 + rows.length) % rows.length);
73
+ else if (key.downArrow)
74
+ setIdx((i) => (i + 1) % rows.length);
75
+ else if (key.return) {
76
+ const row = rows[idx];
77
+ if (row.enabled)
78
+ fire(row.value);
79
+ }
80
+ else if (input === 'q' || key.escape)
81
+ onQuit();
82
+ else {
83
+ const target = rows.find((r) => r.hotkey === input.toLowerCase() && r.enabled);
84
+ if (target)
85
+ fire(target.value);
86
+ }
87
+ });
88
+ const titleNode = (_jsxs(Text, { children: [_jsx(Text, { color: COLORS.error, bold: true, children: GLYPHS.error }), _jsx(Text, { children: ' ' }), _jsx(Text, { color: COLORS.heading, bold: true, children: t.title })] }));
89
+ return (_jsxs(Frame, { title: titleNode, borderColor: COLORS.error, footer: _jsx(FooterKeys, { items: [
90
+ { k: `${GLYPHS.up}${GLYPHS.down}`, label: t.footerNav },
91
+ { k: GLYPHS.enter, label: t.footerSelect },
92
+ { k: 'q', label: t.footerQuit },
93
+ ] }), children: [_jsx(Text, { children: t.body1 }), _jsx(Text, { children: t.body2 }), _jsx(SectionHead, { children: t.processHeader }), _jsx(Box, { paddingLeft: 2, children: _jsxs(Text, { children: [_jsx(Text, { children: "PID " }), _jsx(Text, { bold: true, children: info.pid ?? 'unknown' }), info.cmdline !== null && (_jsxs(_Fragment, { children: [_jsx(Text, { color: COLORS.muted, children: ` ${GLYPHS.dot} ` }), _jsx(Text, { color: COLORS.primary, children: info.cmdline })] }))] }) }), _jsx(SectionHead, { children: t.fixHeader }), _jsx(Box, { flexDirection: "column", children: rows.map((row, i) => (_jsx(Box, { children: row.enabled ? (_jsx(MenuRow, { selected: i === idx, hotkey: row.hotkey, label: row.label, hint: row.hint })) : (_jsxs(Box, { children: [_jsx(Text, { color: COLORS.muted, children: " " }), _jsx(Text, { color: COLORS.muted, children: "[" }), _jsx(Text, { color: COLORS.muted, children: row.hotkey }), _jsx(Text, { color: COLORS.muted, children: "] " }), _jsx(Text, { color: COLORS.muted, dimColor: true, children: row.label }), row.hint !== undefined && (_jsxs(Text, { color: COLORS.muted, dimColor: true, children: [' ', row.hint] }))] })) }, row.value))) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: COLORS.muted, italic: true, dimColor: true, children: t.why1 }), _jsx(Text, { color: COLORS.muted, italic: true, dimColor: true, children: t.why2 })] })] }));
94
+ }
95
+ //# sourceMappingURL=port-collision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-collision.js","sourceRoot":"","sources":["../../../src/ui/screens/port-collision.tsx"],"names":[],"mappings":"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"}