@jobshimo/browser-link 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-instructions/content.js +42 -27
- package/dist/agent-instructions/content.js.map +1 -1
- package/dist/agent-instructions/file-ops.js +7 -2
- package/dist/agent-instructions/file-ops.js.map +1 -1
- package/dist/bridge/events.d.ts +3 -0
- package/dist/bridge/events.js +8 -0
- package/dist/bridge/events.js.map +1 -1
- package/dist/commands/doctor.js +30 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/update-check.d.ts +25 -0
- package/dist/commands/update-check.js +108 -0
- package/dist/commands/update-check.js.map +1 -0
- package/dist/commands/welcome.d.ts +15 -0
- package/dist/commands/welcome.js +44 -2
- package/dist/commands/welcome.js.map +1 -1
- package/dist/extension/background.js +37 -1
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/manifest.json +1 -1
- package/dist/extension/popup.d.ts +2 -1
- package/dist/extension/popup.html +128 -50
- package/dist/extension/popup.js +22 -3
- package/dist/extension/popup.js.map +1 -1
- package/dist/map/tools.d.ts +1 -5
- package/dist/map/tools.js +45 -0
- package/dist/map/tools.js.map +1 -1
- package/dist/server.js +42 -36
- package/dist/server.js.map +1 -1
- package/dist/tools/browser-definitions.d.ts +6 -0
- package/dist/tools/browser-definitions.js +150 -0
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/browser-dispatch.d.ts +8 -14
- package/dist/tools/browser-dispatch.js +10 -0
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/dist/tools/server-instructions.d.ts +16 -2
- package/dist/tools/server-instructions.js +87 -68
- package/dist/tools/server-instructions.js.map +1 -1
- package/dist/tools/tab-claims.d.ts +5 -1
- package/dist/tools/tab-claims.js +17 -0
- package/dist/tools/tab-claims.js.map +1 -1
- package/dist/tools/types.d.ts +26 -1
- package/dist/ui/app.js +40 -5
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/components.d.ts +15 -3
- package/dist/ui/components.js +34 -14
- package/dist/ui/components.js.map +1 -1
- package/dist/ui/hooks/use-update-check.d.ts +16 -0
- package/dist/ui/hooks/use-update-check.js +48 -0
- package/dist/ui/hooks/use-update-check.js.map +1 -0
- package/dist/ui/primitives/badge.d.ts +11 -0
- package/dist/ui/primitives/badge.js +35 -0
- package/dist/ui/primitives/badge.js.map +1 -0
- package/dist/ui/primitives/check-row.d.ts +11 -0
- package/dist/ui/primitives/check-row.js +10 -0
- package/dist/ui/primitives/check-row.js.map +1 -0
- package/dist/ui/primitives/footer-keys.d.ts +12 -0
- package/dist/ui/primitives/footer-keys.js +11 -0
- package/dist/ui/primitives/footer-keys.js.map +1 -0
- package/dist/ui/primitives/index.d.ts +8 -0
- package/dist/ui/primitives/index.js +13 -0
- package/dist/ui/primitives/index.js.map +1 -0
- package/dist/ui/primitives/inline-spinner.d.ts +7 -0
- package/dist/ui/primitives/inline-spinner.js +23 -0
- package/dist/ui/primitives/inline-spinner.js.map +1 -0
- package/dist/ui/primitives/key-cap.d.ts +6 -0
- package/dist/ui/primitives/key-cap.js +6 -0
- package/dist/ui/primitives/key-cap.js.map +1 -0
- package/dist/ui/primitives/menu-row.d.ts +17 -0
- package/dist/ui/primitives/menu-row.js +8 -0
- package/dist/ui/primitives/menu-row.js.map +1 -0
- package/dist/ui/primitives/section-head.d.ts +11 -0
- package/dist/ui/primitives/section-head.js +7 -0
- package/dist/ui/primitives/section-head.js.map +1 -0
- package/dist/ui/primitives/status-bar.d.ts +13 -0
- package/dist/ui/primitives/status-bar.js +17 -0
- package/dist/ui/primitives/status-bar.js.map +1 -0
- package/dist/ui/screens/about.js +13 -4
- package/dist/ui/screens/about.js.map +1 -1
- package/dist/ui/screens/agent-instructions.d.ts +7 -1
- package/dist/ui/screens/agent-instructions.js +62 -46
- package/dist/ui/screens/agent-instructions.js.map +1 -1
- package/dist/ui/screens/client-picker.js +64 -16
- package/dist/ui/screens/client-picker.js.map +1 -1
- package/dist/ui/screens/doctor.js +20 -7
- package/dist/ui/screens/doctor.js.map +1 -1
- package/dist/ui/screens/empty-clients.d.ts +8 -0
- package/dist/ui/screens/empty-clients.js +57 -0
- package/dist/ui/screens/empty-clients.js.map +1 -0
- package/dist/ui/screens/extension.js +25 -8
- package/dist/ui/screens/extension.js.map +1 -1
- package/dist/ui/screens/free-port.js +48 -33
- package/dist/ui/screens/free-port.js.map +1 -1
- package/dist/ui/screens/index.d.ts +2 -0
- package/dist/ui/screens/index.js +2 -0
- package/dist/ui/screens/index.js.map +1 -1
- package/dist/ui/screens/install-result.js +29 -6
- package/dist/ui/screens/install-result.js.map +1 -1
- package/dist/ui/screens/language.js +39 -18
- package/dist/ui/screens/language.js.map +1 -1
- package/dist/ui/screens/menu.d.ts +10 -1
- package/dist/ui/screens/menu.js +118 -30
- package/dist/ui/screens/menu.js.map +1 -1
- package/dist/ui/screens/multi-agent.js +24 -18
- package/dist/ui/screens/multi-agent.js.map +1 -1
- package/dist/ui/screens/permissions.js +145 -33
- package/dist/ui/screens/permissions.js.map +1 -1
- package/dist/ui/screens/port-collision.d.ts +18 -0
- package/dist/ui/screens/port-collision.js +95 -0
- package/dist/ui/screens/port-collision.js.map +1 -0
- package/dist/ui/screens/updates.js +44 -21
- package/dist/ui/screens/updates.js.map +1 -1
- package/dist/ui/screens/welcome.js +56 -26
- package/dist/ui/screens/welcome.js.map +1 -1
- package/dist/ui/tokens.d.ts +37 -0
- package/dist/ui/tokens.js +58 -0
- package/dist/ui/tokens.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type BadgeKind = 'ok' | 'warn' | 'fail' | 'off' | 'info' | 'noFile';
|
|
2
|
+
interface BadgeProps {
|
|
3
|
+
kind: BadgeKind;
|
|
4
|
+
/** Optional override for the rendered text. When omitted, the default
|
|
5
|
+
* text comes from GLYPHS[badge*] (so callers reach for the same label
|
|
6
|
+
* across screens). Use `label` for context-specific copy: an i18n
|
|
7
|
+
* string, a version-suffixed label like "installed (v3)", etc. */
|
|
8
|
+
label?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function Badge({ kind, label }: BadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export type { BadgeKind };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from 'ink';
|
|
3
|
+
import { COLORS, GLYPHS } from '../tokens.js';
|
|
4
|
+
const KIND_TO_COLOR = {
|
|
5
|
+
ok: COLORS.success,
|
|
6
|
+
warn: COLORS.warn,
|
|
7
|
+
fail: COLORS.error,
|
|
8
|
+
off: COLORS.muted,
|
|
9
|
+
info: COLORS.info,
|
|
10
|
+
/* "no file yet" reads as muted, same as the generic off state. */
|
|
11
|
+
noFile: COLORS.muted,
|
|
12
|
+
};
|
|
13
|
+
const KIND_TO_GLYPH = {
|
|
14
|
+
ok: GLYPHS.success,
|
|
15
|
+
warn: GLYPHS.warn,
|
|
16
|
+
fail: GLYPHS.error,
|
|
17
|
+
off: GLYPHS.dot,
|
|
18
|
+
info: GLYPHS.info,
|
|
19
|
+
noFile: GLYPHS.dot,
|
|
20
|
+
};
|
|
21
|
+
const KIND_TO_DEFAULT_LABEL = {
|
|
22
|
+
ok: 'installed',
|
|
23
|
+
warn: 'outdated',
|
|
24
|
+
fail: 'failed',
|
|
25
|
+
off: 'not installed',
|
|
26
|
+
info: 'info',
|
|
27
|
+
noFile: 'no file yet',
|
|
28
|
+
};
|
|
29
|
+
export function Badge({ kind, label }) {
|
|
30
|
+
const color = KIND_TO_COLOR[kind];
|
|
31
|
+
const glyph = KIND_TO_GLYPH[kind];
|
|
32
|
+
const text = label ?? KIND_TO_DEFAULT_LABEL[kind];
|
|
33
|
+
return (_jsxs(Text, { color: color, children: [glyph, " ", text] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/ui/primitives/badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkB9C,MAAM,aAAa,GAA8B;IAC/C,EAAE,EAAE,MAAM,CAAC,OAAO;IAClB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC,KAAK;IAClB,GAAG,EAAE,MAAM,CAAC,KAAK;IACjB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC,KAAK;CACrB,CAAC;AAEF,MAAM,aAAa,GAA8B;IAC/C,EAAE,EAAE,MAAM,CAAC,OAAO;IAClB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC,KAAK;IAClB,GAAG,EAAE,MAAM,CAAC,GAAG;IACf,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,MAAM,EAAE,MAAM,CAAC,GAAG;CACnB,CAAC;AAEF,MAAM,qBAAqB,GAA8B;IACvD,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,QAAQ;IACd,GAAG,EAAE,eAAe;IACpB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,aAAa;CACtB,CAAC;AAEF,MAAM,UAAU,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAc;IAC/C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,aACf,KAAK,OAAG,IAAI,IACR,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface CheckRowProps {
|
|
2
|
+
selected?: boolean;
|
|
3
|
+
on: boolean;
|
|
4
|
+
label: string;
|
|
5
|
+
hint?: string;
|
|
6
|
+
/** When true, override the [x]/[ ] color to muted and the label to
|
|
7
|
+
* the muted role — signals the row is currently inactive. */
|
|
8
|
+
dimmed?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function CheckRow({ selected, on, label, hint, dimmed }: CheckRowProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { COLORS, GLYPHS } from '../tokens.js';
|
|
4
|
+
export function CheckRow({ selected = false, on, label, hint, dimmed = false }) {
|
|
5
|
+
const cursor = selected ? GLYPHS.cursor : ' ';
|
|
6
|
+
const boxColor = dimmed ? COLORS.muted : on ? COLORS.success : COLORS.error;
|
|
7
|
+
const boxMark = on ? '[x]' : '[ ]';
|
|
8
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: selected ? COLORS.focus : COLORS.muted, children: [cursor, " "] }), _jsxs(Text, { color: boxColor, children: [boxMark, " "] }), _jsx(Text, { color: dimmed ? COLORS.muted : selected ? 'white' : COLORS.muted, bold: selected && !dimmed, children: label }), hint !== undefined && hint !== '' && (_jsxs(Text, { color: COLORS.muted, dimColor: true, children: [' ', hint] }))] }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=check-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-row.js","sourceRoot":"","sources":["../../../src/ui/primitives/check-row.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAgB9C,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAiB;IAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAC5E,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACnC,OAAO,CACL,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,aAAG,MAAM,SAAS,EACrE,MAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,aAAG,OAAO,SAAS,EACxC,KAAC,IAAI,IACH,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAChE,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,YAExB,KAAK,GACD,EACN,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,CACpC,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,mBAChC,IAAI,EACJ,IAAI,IACA,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface FooterKeyItem {
|
|
2
|
+
/** Visible key label — single character ("q"), short word ("Esc"),
|
|
3
|
+
* or a combined cue ("↑↓"). */
|
|
4
|
+
k: string;
|
|
5
|
+
/** What pressing the key does — "navigate", "back", "save", etc. */
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
interface FooterKeysProps {
|
|
9
|
+
items: FooterKeyItem[];
|
|
10
|
+
}
|
|
11
|
+
export declare function FooterKeys({ items }: FooterKeysProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { COLORS, GLYPHS } from '../tokens.js';
|
|
4
|
+
import { KeyCap } from './key-cap.js';
|
|
5
|
+
export function FooterKeys({ items }) {
|
|
6
|
+
return (_jsx(Box, { children: items.map((it, i) => {
|
|
7
|
+
const last = i === items.length - 1;
|
|
8
|
+
return (_jsxs(Box, { children: [_jsx(KeyCap, { label: it.k }), _jsxs(Text, { color: COLORS.muted, children: [" ", it.label] }), !last && (_jsx(Text, { color: COLORS.muted, dimColor: true, children: ` ${GLYPHS.dot} ` }))] }, `${it.k}-${i}`));
|
|
9
|
+
}) }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=footer-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer-keys.js","sourceRoot":"","sources":["../../../src/ui/primitives/footer-keys.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAmBtC,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAmB;IACnD,OAAO,CACL,KAAC,GAAG,cACD,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,OAAO,CACL,MAAC,GAAG,eACF,KAAC,MAAM,IAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAI,EACvB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,kBAAI,EAAE,CAAC,KAAK,IAAQ,EAC5C,CAAC,IAAI,IAAI,CACR,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,kBAChC,MAAM,MAAM,CAAC,GAAG,KAAK,GACjB,CACR,KAPO,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAQlB,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { Badge, type BadgeKind } from './badge.js';
|
|
2
|
+
export { CheckRow } from './check-row.js';
|
|
3
|
+
export { FooterKeys, type FooterKeyItem } from './footer-keys.js';
|
|
4
|
+
export { InlineSpinner } from './inline-spinner.js';
|
|
5
|
+
export { KeyCap } from './key-cap.js';
|
|
6
|
+
export { MenuRow } from './menu-row.js';
|
|
7
|
+
export { SectionHead } from './section-head.js';
|
|
8
|
+
export { StatusBar, type ClientState, type StatusBarItem } from './status-bar.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/* Single import surface for the v0.9.0 design-system primitives. Every
|
|
2
|
+
* screen imports from here, never from individual files — keeps the
|
|
3
|
+
* dependency graph one-deep and lets us swap a primitive's source file
|
|
4
|
+
* without thrashing imports across 10+ callers. */
|
|
5
|
+
export { Badge } from './badge.js';
|
|
6
|
+
export { CheckRow } from './check-row.js';
|
|
7
|
+
export { FooterKeys } from './footer-keys.js';
|
|
8
|
+
export { InlineSpinner } from './inline-spinner.js';
|
|
9
|
+
export { KeyCap } from './key-cap.js';
|
|
10
|
+
export { MenuRow } from './menu-row.js';
|
|
11
|
+
export { SectionHead } from './section-head.js';
|
|
12
|
+
export { StatusBar } from './status-bar.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/primitives/index.ts"],"names":[],"mappings":"AAAA;;;mDAGmD;AAEnD,OAAO,EAAE,KAAK,EAAkB,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAsB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAwC,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface InlineSpinnerProps {
|
|
2
|
+
/** Optional override for the spinner color. Defaults to the primary
|
|
3
|
+
* (cyan) role so it reads as "active" against the body. */
|
|
4
|
+
color?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function InlineSpinner({ color }: InlineSpinnerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from 'ink';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { COLORS } from '../tokens.js';
|
|
5
|
+
/* Inline animated spinner — used inside long-running async screens
|
|
6
|
+
* (Updates, FreePort, Doctor). Hand-rolled instead of pulling in
|
|
7
|
+
* `ink-spinner` because the dep isn't already in the lockfile and the
|
|
8
|
+
* surface we need is exactly ten braille frames cycling at 100ms. */
|
|
9
|
+
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
10
|
+
const FRAME_INTERVAL_MS = 100;
|
|
11
|
+
export function InlineSpinner({ color = COLORS.primary }) {
|
|
12
|
+
const [tick, setTick] = useState(0);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const id = setInterval(() => {
|
|
15
|
+
setTick((t) => (t + 1) % FRAMES.length);
|
|
16
|
+
}, FRAME_INTERVAL_MS);
|
|
17
|
+
return () => {
|
|
18
|
+
clearInterval(id);
|
|
19
|
+
};
|
|
20
|
+
}, []);
|
|
21
|
+
return _jsx(Text, { color: color, children: FRAMES[tick] });
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=inline-spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-spinner.js","sourceRoot":"","sources":["../../../src/ui/primitives/inline-spinner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;qEAGqE;AACrE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAC3E,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAQ9B,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,OAAO,EAAsB;IAC1E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,MAAM,CAAC,IAAI,CAAC,GAAQ,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-cap.js","sourceRoot":"","sources":["../../../src/ui/primitives/key-cap.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAoB3B,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAe;IAC3C,OAAO,KAAC,IAAI,IAAC,OAAO,kBAAE,IAAI,KAAK,GAAG,GAAQ,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
interface MenuRowProps {
|
|
3
|
+
selected?: boolean;
|
|
4
|
+
/** Single-character hotkey marker rendered as `[h]` before the label.
|
|
5
|
+
* Optional — items without a sensible letter just omit it. */
|
|
6
|
+
hotkey?: string;
|
|
7
|
+
label: string;
|
|
8
|
+
/** Dim trailing string after the label. Examples: "trigger block in
|
|
9
|
+
* global .md", "EN / ES". */
|
|
10
|
+
hint?: string;
|
|
11
|
+
/** Right-aligned status badge — typically a <Badge>. Used by the
|
|
12
|
+
* client picker (registered / not registered per row) and the
|
|
13
|
+
* language picker (current). */
|
|
14
|
+
badge?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export declare function MenuRow({ selected, hotkey, label, hint, badge }: MenuRowProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { COLORS, GLYPHS } from '../tokens.js';
|
|
4
|
+
export function MenuRow({ selected = false, hotkey, label, hint, badge }) {
|
|
5
|
+
const cursor = selected ? GLYPHS.cursor : ' ';
|
|
6
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: selected ? COLORS.focus : COLORS.muted, children: [cursor, " "] }), hotkey !== undefined && hotkey !== '' && (_jsxs(Text, { children: [_jsx(Text, { color: COLORS.muted, children: "[" }), _jsx(Text, { color: selected ? COLORS.focus : COLORS.primary, bold: selected, underline: true, children: hotkey }), _jsx(Text, { color: COLORS.muted, children: "] " })] })), _jsx(Text, { color: selected ? 'white' : COLORS.muted, bold: selected, children: label }), hint !== undefined && hint !== '' && (_jsxs(Text, { color: COLORS.muted, dimColor: true, children: [' ', hint] })), badge !== undefined && (_jsx(Box, { marginLeft: 2, flexGrow: 1, justifyContent: "flex-end", children: badge }))] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=menu-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-row.js","sourceRoot":"","sources":["../../../src/ui/primitives/menu-row.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAyB9C,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAgB;IACpF,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,OAAO,CACL,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,aAAG,MAAM,SAAS,EACpE,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,IAAI,CACxC,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,kBAAU,EACnC,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,kBAC7E,MAAM,GACF,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,mBAAW,IAC/B,CACR,EACD,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,YAC3D,KAAK,GACD,EACN,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,CACpC,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,mBAChC,IAAI,EACJ,IAAI,IACA,CACR,EACA,KAAK,KAAK,SAAS,IAAI,CACtB,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,UAAU,YACvD,KAAK,GACF,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface SectionHeadProps {
|
|
2
|
+
/** Visible header text. The caller decides whether to upper-case it —
|
|
3
|
+
* we don't transform here because some headers (e.g. "Author") look
|
|
4
|
+
* better in title case. */
|
|
5
|
+
children: string;
|
|
6
|
+
/** Optional dim trailing string — e.g. "3 / 5 enabled" next to a
|
|
7
|
+
* tool-family header. */
|
|
8
|
+
hint?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function SectionHead({ children, hint }: SectionHeadProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { COLORS } from '../tokens.js';
|
|
4
|
+
export function SectionHead({ children, hint }) {
|
|
5
|
+
return (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: COLORS.heading, bold: true, children: children }), hint !== undefined && hint !== '' && (_jsxs(Text, { color: COLORS.muted, dimColor: true, children: [' ', hint] }))] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=section-head.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-head.js","sourceRoot":"","sources":["../../../src/ui/primitives/section-head.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAiBtC,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAoB;IAC9D,OAAO,CACL,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,kBAC9B,QAAQ,GACJ,EACN,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,CACpC,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,mBAChC,KAAK,EACL,IAAI,IACA,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ClientState = 'registered' | 'not registered' | 'not detected';
|
|
2
|
+
export interface StatusBarItem {
|
|
3
|
+
name: string;
|
|
4
|
+
/** Localised display string. `state` is the *normalised* English key
|
|
5
|
+
* used to pick the color; `label` is what the user reads. */
|
|
6
|
+
state: ClientState;
|
|
7
|
+
label: string;
|
|
8
|
+
}
|
|
9
|
+
interface StatusBarProps {
|
|
10
|
+
items: StatusBarItem[];
|
|
11
|
+
}
|
|
12
|
+
export declare function StatusBar({ items }: StatusBarProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { COLORS } from '../tokens.js';
|
|
4
|
+
function stateColor(state) {
|
|
5
|
+
if (state === 'registered')
|
|
6
|
+
return COLORS.success;
|
|
7
|
+
if (state === 'not registered')
|
|
8
|
+
return COLORS.warn;
|
|
9
|
+
return COLORS.muted;
|
|
10
|
+
}
|
|
11
|
+
export function StatusBar({ items }) {
|
|
12
|
+
return (_jsx(Box, { children: items.map((item, i) => {
|
|
13
|
+
const last = i === items.length - 1;
|
|
14
|
+
return (_jsx(Box, { marginRight: last ? 0 : 3, children: _jsxs(Text, { children: [_jsx(Text, { bold: true, children: item.name }), _jsx(Text, { color: COLORS.muted, children: " \u00B7 " }), _jsx(Text, { color: stateColor(item.state), children: item.label })] }) }, item.name));
|
|
15
|
+
}) }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=status-bar.js.map
|
|
@@ -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"}
|
package/dist/ui/screens/about.js
CHANGED
|
@@ -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
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
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;
|
|
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"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import { type ClientId } from '../../agent-instructions/index.js';
|
|
1
2
|
import type { CommonProps } from './types.js';
|
|
2
3
|
interface AgentInstructionsViewProps extends CommonProps {
|
|
3
4
|
onBack: () => void;
|
|
5
|
+
/** Optional initial cursor target. When the user lands on this screen via
|
|
6
|
+
* the `i` hotkey from the main menu, the cursor is auto-positioned on
|
|
7
|
+
* the first outdated client so the next Enter refreshes it. Falls back
|
|
8
|
+
* to row 0 when omitted or when the requested client is not present. */
|
|
9
|
+
initialCursorClient?: ClientId;
|
|
4
10
|
}
|
|
5
|
-
export declare function AgentInstructionsView({ language, onBack }: AgentInstructionsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function AgentInstructionsView({ language, onBack, initialCursorClient, }: AgentInstructionsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
6
12
|
export {};
|
|
@@ -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.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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,54 +42,59 @@ 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.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return {
|
|
63
|
-
|
|
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
|
|
75
|
+
return { kind: 'off', label: t.notInstalled };
|
|
68
76
|
case 'no-file':
|
|
69
|
-
return {
|
|
77
|
+
return { kind: 'noFile', label: t.noFile };
|
|
70
78
|
case 'corrupt':
|
|
71
|
-
return { label: t.corrupt
|
|
79
|
+
return { kind: 'warn', label: t.corrupt };
|
|
72
80
|
}
|
|
73
81
|
}
|
|
74
|
-
export function AgentInstructionsView({ language, onBack }) {
|
|
82
|
+
export function AgentInstructionsView({ language, onBack, initialCursorClient, }) {
|
|
75
83
|
const t = I18N[language];
|
|
76
84
|
const [reports, setReports] = useState(() => statusAll());
|
|
77
|
-
const
|
|
85
|
+
const items = useMemo(() => INSTRUCTIONS_INSTALLERS, []);
|
|
86
|
+
const initialIndex = useMemo(() => {
|
|
87
|
+
if (!initialCursorClient)
|
|
88
|
+
return 0;
|
|
89
|
+
const i = items.findIndex((it) => it.id === initialCursorClient);
|
|
90
|
+
return i >= 0 ? i : 0;
|
|
91
|
+
}, [initialCursorClient, items]);
|
|
92
|
+
const [cursor, setCursor] = useState(initialIndex);
|
|
78
93
|
const [lastAction, setLastAction] = useState(null);
|
|
79
|
-
// Refresh status when we come back from an install/uninstall round-trip.
|
|
80
94
|
useEffect(() => {
|
|
81
95
|
if (lastAction)
|
|
82
96
|
setReports(statusAll());
|
|
83
97
|
}, [lastAction]);
|
|
84
|
-
const items = useMemo(() => INSTRUCTIONS_INSTALLERS, []);
|
|
85
|
-
// Column width is driven by the longest displayName so adding a fourth
|
|
86
|
-
// client never requires hand-tuning a magic padEnd value in two places.
|
|
87
98
|
const nameColumnWidth = useMemo(() => displayNameColumnWidth(items.map((i) => i.displayName)), [items]);
|
|
88
99
|
const runAction = (client, action) => {
|
|
89
100
|
const report = action === 'install' ? installInstructionsFor(client) : uninstallInstructionsFor(client);
|
|
@@ -101,11 +112,16 @@ export function AgentInstructionsView({ language, onBack }) {
|
|
|
101
112
|
else if (key.escape || input === 'q')
|
|
102
113
|
onBack();
|
|
103
114
|
});
|
|
104
|
-
return (_jsxs(Frame, { title: t.title, footer:
|
|
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) => {
|
|
105
121
|
const r = reports[i];
|
|
106
122
|
const badge = statusBadge(r.state, t);
|
|
107
123
|
const isCursor = i === cursor;
|
|
108
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: isCursor ?
|
|
109
|
-
}) }), lastAction && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: lastAction.report.ok ? (_jsxs(_Fragment, { children: [
|
|
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)] }) })] }));
|
|
110
126
|
}
|
|
111
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":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../../src/ui/screens/agent-instructions.tsx"],"names":[],"mappings":"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"}
|