@tacuchi/agent-workflow-cli 8.0.0 → 9.0.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/cli/main.js +0 -0
- package/dist/cli/tui/app.d.ts.map +1 -1
- package/dist/cli/tui/app.js +119 -61
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/activity-feed.d.ts +16 -0
- package/dist/cli/tui/components/activity-feed.d.ts.map +1 -0
- package/dist/cli/tui/components/activity-feed.js +35 -0
- package/dist/cli/tui/components/activity-feed.js.map +1 -0
- package/dist/cli/tui/components/command-palette.d.ts +0 -1
- package/dist/cli/tui/components/command-palette.d.ts.map +1 -1
- package/dist/cli/tui/components/command-palette.js +5 -5
- package/dist/cli/tui/components/command-palette.js.map +1 -1
- package/dist/cli/tui/components/confirm-banner.d.ts +10 -0
- package/dist/cli/tui/components/confirm-banner.d.ts.map +1 -0
- package/dist/cli/tui/components/confirm-banner.js +11 -0
- package/dist/cli/tui/components/confirm-banner.js.map +1 -0
- package/dist/cli/tui/components/detail-panel.d.ts +34 -0
- package/dist/cli/tui/components/detail-panel.d.ts.map +1 -0
- package/dist/cli/tui/components/detail-panel.js +83 -0
- package/dist/cli/tui/components/detail-panel.js.map +1 -0
- package/dist/cli/tui/components/family-card.d.ts +5 -1
- package/dist/cli/tui/components/family-card.d.ts.map +1 -1
- package/dist/cli/tui/components/family-card.js +34 -4
- package/dist/cli/tui/components/family-card.js.map +1 -1
- package/dist/cli/tui/components/inline-wizard.d.ts +19 -0
- package/dist/cli/tui/components/inline-wizard.d.ts.map +1 -0
- package/dist/cli/tui/components/inline-wizard.js +16 -0
- package/dist/cli/tui/components/inline-wizard.js.map +1 -0
- package/dist/cli/tui/components/list-row.d.ts +11 -3
- package/dist/cli/tui/components/list-row.d.ts.map +1 -1
- package/dist/cli/tui/components/list-row.js +71 -13
- package/dist/cli/tui/components/list-row.js.map +1 -1
- package/dist/cli/tui/components/page-head.d.ts +8 -16
- package/dist/cli/tui/components/page-head.d.ts.map +1 -1
- package/dist/cli/tui/components/page-head.js +21 -14
- package/dist/cli/tui/components/page-head.js.map +1 -1
- package/dist/cli/tui/components/phase-card.d.ts +2 -1
- package/dist/cli/tui/components/phase-card.d.ts.map +1 -1
- package/dist/cli/tui/components/phase-card.js +9 -4
- package/dist/cli/tui/components/phase-card.js.map +1 -1
- package/dist/cli/tui/components/quick-actions.d.ts +9 -0
- package/dist/cli/tui/components/quick-actions.d.ts.map +1 -0
- package/dist/cli/tui/components/quick-actions.js +9 -0
- package/dist/cli/tui/components/quick-actions.js.map +1 -0
- package/dist/cli/tui/components/section-head.d.ts +10 -0
- package/dist/cli/tui/components/section-head.d.ts.map +1 -0
- package/dist/cli/tui/components/section-head.js +8 -0
- package/dist/cli/tui/components/section-head.js.map +1 -0
- package/dist/cli/tui/components/sidebar.d.ts +27 -0
- package/dist/cli/tui/components/sidebar.d.ts.map +1 -0
- package/dist/cli/tui/components/sidebar.js +37 -0
- package/dist/cli/tui/components/sidebar.js.map +1 -0
- package/dist/cli/tui/components/stat-tile.d.ts +4 -2
- package/dist/cli/tui/components/stat-tile.d.ts.map +1 -1
- package/dist/cli/tui/components/stat-tile.js +9 -8
- package/dist/cli/tui/components/stat-tile.js.map +1 -1
- package/dist/cli/tui/components/toast-stack.d.ts +3 -3
- package/dist/cli/tui/components/toast-stack.js +3 -3
- package/dist/cli/tui/data/activity.d.ts +21 -0
- package/dist/cli/tui/data/activity.d.ts.map +1 -0
- package/dist/cli/tui/data/activity.js +83 -0
- package/dist/cli/tui/data/activity.js.map +1 -0
- package/dist/cli/tui/tabs/mcp-tab.d.ts +3 -11
- package/dist/cli/tui/tabs/mcp-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab.js +113 -85
- package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.d.ts +0 -11
- package/dist/cli/tui/tabs/project-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +38 -78
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/cli/tui/tabs/skills-tab.d.ts +1 -21
- package/dist/cli/tui/tabs/skills-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/skills-tab.js +65 -85
- package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
- package/dist/cli/tui/tabs/status-tab.d.ts +4 -1
- package/dist/cli/tui/tabs/status-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/status-tab.js +50 -11
- package/dist/cli/tui/tabs/status-tab.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.d.ts +3 -1
- package/dist/cli/tui/tabs/workflow-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +31 -15
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/cli/tui/theme.d.ts +75 -55
- package/dist/cli/tui/theme.d.ts.map +1 -1
- package/dist/cli/tui/theme.js +75 -50
- package/dist/cli/tui/theme.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/orchestration.d.ts +0 -5
- package/dist/cli/commands/orchestration.d.ts.map +0 -1
- package/dist/cli/commands/orchestration.js +0 -84
- package/dist/cli/commands/orchestration.js.map +0 -1
- package/dist/cli/commands/wave2-extras.d.ts +0 -7
- package/dist/cli/commands/wave2-extras.d.ts.map +0 -1
- package/dist/cli/commands/wave2-extras.js +0 -87
- package/dist/cli/commands/wave2-extras.js.map +0 -1
- package/dist/cli/commands/wave2-final.d.ts +0 -8
- package/dist/cli/commands/wave2-final.d.ts.map +0 -1
- package/dist/cli/commands/wave2-final.js +0 -134
- package/dist/cli/commands/wave2-final.js.map +0 -1
- package/dist/cli/commands/wave4d-simple.d.ts +0 -6
- package/dist/cli/commands/wave4d-simple.d.ts.map +0 -1
- package/dist/cli/commands/wave4d-simple.js +0 -138
- package/dist/cli/commands/wave4d-simple.js.map +0 -1
- package/dist/cli/tui/components/action-modal.d.ts +0 -33
- package/dist/cli/tui/components/action-modal.d.ts.map +0 -1
- package/dist/cli/tui/components/action-modal.js +0 -41
- package/dist/cli/tui/components/action-modal.js.map +0 -1
- package/dist/cli/tui/components/confirm-modal.d.ts +0 -12
- package/dist/cli/tui/components/confirm-modal.d.ts.map +0 -1
- package/dist/cli/tui/components/confirm-modal.js +0 -18
- package/dist/cli/tui/components/confirm-modal.js.map +0 -1
- package/dist/cli/tui/components/connections-grid.d.ts +0 -8
- package/dist/cli/tui/components/connections-grid.d.ts.map +0 -1
- package/dist/cli/tui/components/connections-grid.js +0 -55
- package/dist/cli/tui/components/connections-grid.js.map +0 -1
- package/dist/cli/tui/components/connections-table.d.ts +0 -5
- package/dist/cli/tui/components/connections-table.d.ts.map +0 -1
- package/dist/cli/tui/components/connections-table.js +0 -11
- package/dist/cli/tui/components/connections-table.js.map +0 -1
- package/dist/cli/tui/components/footer.d.ts +0 -4
- package/dist/cli/tui/components/footer.d.ts.map +0 -1
- package/dist/cli/tui/components/footer.js +0 -6
- package/dist/cli/tui/components/footer.js.map +0 -1
- package/dist/cli/tui/components/frame-box.d.ts +0 -10
- package/dist/cli/tui/components/frame-box.d.ts.map +0 -1
- package/dist/cli/tui/components/frame-box.js +0 -9
- package/dist/cli/tui/components/frame-box.js.map +0 -1
- package/dist/cli/tui/components/header.d.ts +0 -14
- package/dist/cli/tui/components/header.d.ts.map +0 -1
- package/dist/cli/tui/components/header.js +0 -21
- package/dist/cli/tui/components/header.js.map +0 -1
- package/dist/cli/tui/components/host-chip.d.ts +0 -28
- package/dist/cli/tui/components/host-chip.d.ts.map +0 -1
- package/dist/cli/tui/components/host-chip.js +0 -35
- package/dist/cli/tui/components/host-chip.js.map +0 -1
- package/dist/cli/tui/components/keymap-bar.d.ts +0 -17
- package/dist/cli/tui/components/keymap-bar.d.ts.map +0 -1
- package/dist/cli/tui/components/keymap-bar.js +0 -13
- package/dist/cli/tui/components/keymap-bar.js.map +0 -1
- package/dist/cli/tui/components/pill.d.ts +0 -16
- package/dist/cli/tui/components/pill.d.ts.map +0 -1
- package/dist/cli/tui/components/pill.js +0 -24
- package/dist/cli/tui/components/pill.js.map +0 -1
- package/dist/cli/tui/components/sectioned-menu.d.ts +0 -24
- package/dist/cli/tui/components/sectioned-menu.d.ts.map +0 -1
- package/dist/cli/tui/components/sectioned-menu.js +0 -72
- package/dist/cli/tui/components/sectioned-menu.js.map +0 -1
- package/dist/cli/tui/components/tab-bar.d.ts +0 -23
- package/dist/cli/tui/components/tab-bar.d.ts.map +0 -1
- package/dist/cli/tui/components/tab-bar.js +0 -17
- package/dist/cli/tui/components/tab-bar.js.map +0 -1
- package/dist/cli/tui/screens/main-menu.d.ts +0 -8
- package/dist/cli/tui/screens/main-menu.d.ts.map +0 -1
- package/dist/cli/tui/screens/main-menu.js +0 -24
- package/dist/cli/tui/screens/main-menu.js.map +0 -1
- package/dist/cli/tui/screens/mcp-done.d.ts +0 -10
- package/dist/cli/tui/screens/mcp-done.d.ts.map +0 -1
- package/dist/cli/tui/screens/mcp-done.js +0 -24
- package/dist/cli/tui/screens/mcp-done.js.map +0 -1
- package/dist/cli/tui/screens/mcp-wizard.d.ts +0 -10
- package/dist/cli/tui/screens/mcp-wizard.d.ts.map +0 -1
- package/dist/cli/tui/screens/mcp-wizard.js +0 -97
- package/dist/cli/tui/screens/mcp-wizard.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type StatTone = "ok" | "warn" | "accent" | "dim";
|
|
1
|
+
export type StatTone = "ok" | "warn" | "accent" | "dim" | "err";
|
|
2
2
|
export interface StatTileProps {
|
|
3
3
|
label: string;
|
|
4
4
|
value: string;
|
|
@@ -9,6 +9,8 @@ export interface StatTileProps {
|
|
|
9
9
|
clickable?: boolean;
|
|
10
10
|
/** Highlights the tile when its index === active cursor in a strip. */
|
|
11
11
|
active?: boolean;
|
|
12
|
+
/** If true, aligns the tile to the right (used for WORKING TREE). */
|
|
13
|
+
alignRight?: boolean;
|
|
12
14
|
}
|
|
13
|
-
export declare function StatTile({ label, value, sub, tone, accent, clickable, active, }: StatTileProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function StatTile({ label, value, sub, tone, accent, clickable, active, alignRight, }: StatTileProps): import("react/jsx-runtime").JSX.Element;
|
|
14
16
|
//# sourceMappingURL=stat-tile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stat-tile.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/stat-tile.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"stat-tile.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/stat-tile.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,GAAG,EACH,IAAI,EACJ,MAAc,EACd,SAAiB,EACjB,MAAc,EACd,UAAkB,GACnB,EAAE,aAAa,2CAqBf"}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { colors, icons } from "../theme.js";
|
|
4
4
|
function valueColor(tone, accent) {
|
|
5
5
|
switch (tone) {
|
|
6
6
|
case "ok":
|
|
7
|
-
return colors.
|
|
7
|
+
return colors.ok;
|
|
8
8
|
case "warn":
|
|
9
|
-
return colors.
|
|
9
|
+
return colors.warn;
|
|
10
|
+
case "err":
|
|
11
|
+
return colors.err;
|
|
10
12
|
case "accent":
|
|
11
13
|
return colors.accent;
|
|
12
14
|
case "dim":
|
|
13
|
-
return colors.
|
|
15
|
+
return colors.dim;
|
|
14
16
|
default:
|
|
15
|
-
return accent ? colors.accent : colors.
|
|
17
|
+
return accent ? colors.accent : colors.bright;
|
|
16
18
|
}
|
|
17
19
|
}
|
|
18
|
-
export function StatTile({ label, value, sub, tone, accent = false, clickable = false, active = false, }) {
|
|
19
|
-
|
|
20
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: borderColor, paddingX: 1, marginRight: 1, flexGrow: 1, children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Text, { color: colors.fgSubtle, children: label.toUpperCase() }), clickable ? (_jsx(Text, { color: active ? colors.accent : colors.fgSubtle, children: icons.chevron })) : null] }), _jsx(Text, { color: valueColor(tone, accent), bold: true, children: value }), sub ? _jsx(Text, { color: colors.fgSubtle, children: sub }) : null] }));
|
|
20
|
+
export function StatTile({ label, value, sub, tone, accent = false, clickable = false, active = false, alignRight = false, }) {
|
|
21
|
+
return (_jsxs(Box, { flexDirection: "row", marginRight: alignRight ? 0 : 2, flexGrow: alignRight ? 0 : 1, children: [_jsx(Text, { color: active ? colors.accent : colors.faint, children: active ? icons.focusBar : " " }), _jsxs(Box, { flexDirection: "column", paddingLeft: active ? 1 : 0, children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: colors.mute, children: label.toUpperCase() }), clickable ? (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { color: active ? colors.accent : colors.faint, children: icons.chevron })] })) : null] }), _jsx(Text, { color: valueColor(tone, accent), bold: true, children: value }), sub ? _jsx(Text, { color: colors.dim, children: sub }) : null] })] }));
|
|
21
22
|
}
|
|
22
23
|
//# sourceMappingURL=stat-tile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stat-tile.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/stat-tile.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"stat-tile.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/stat-tile.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAkB5C,SAAS,UAAU,CAAC,IAAe,EAAE,MAAgB;IACnD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI;YACP,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB;YACE,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,GAAG,EACH,IAAI,EACJ,MAAM,GAAG,KAAK,EACd,SAAS,GAAG,KAAK,EACjB,MAAM,GAAG,KAAK,EACd,UAAU,GAAG,KAAK,GACJ;IACd,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aACpF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,YAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAQ,EAC1F,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aACrD,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,KAAK,CAAC,WAAW,EAAE,GAAQ,EACrD,SAAS,CAAC,CAAC,CAAC,CACX,8BACE,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,YAAG,KAAK,CAAC,OAAO,GAAQ,IACzE,CACJ,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,kBACxC,KAAK,GACD,EACN,GAAG,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YAAG,GAAG,GAAQ,CAAC,CAAC,CAAC,IAAI,IAC/C,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -33,9 +33,9 @@ export interface ToastStackProps {
|
|
|
33
33
|
/**
|
|
34
34
|
* ToastStack — render inline de los toasts activos.
|
|
35
35
|
*
|
|
36
|
-
* En TTY no podemos posicionar absoluto, así que renderizamos
|
|
37
|
-
* (app.tsx coloca esto
|
|
38
|
-
*
|
|
36
|
+
* En TTY no podemos posicionar absoluto, así que renderizamos al pie de la
|
|
37
|
+
* pantalla (app.tsx coloca esto al final del root). Cada toast es una caja
|
|
38
|
+
* con borde left del color del tone + título bold + body dim.
|
|
39
39
|
*/
|
|
40
40
|
export declare function ToastStack({ toasts, max }: ToastStackProps): import("react/jsx-runtime").JSX.Element | null;
|
|
41
41
|
//# sourceMappingURL=toast-stack.d.ts.map
|
|
@@ -48,9 +48,9 @@ const TONE_ICON = {
|
|
|
48
48
|
/**
|
|
49
49
|
* ToastStack — render inline de los toasts activos.
|
|
50
50
|
*
|
|
51
|
-
* En TTY no podemos posicionar absoluto, así que renderizamos
|
|
52
|
-
* (app.tsx coloca esto
|
|
53
|
-
*
|
|
51
|
+
* En TTY no podemos posicionar absoluto, así que renderizamos al pie de la
|
|
52
|
+
* pantalla (app.tsx coloca esto al final del root). Cada toast es una caja
|
|
53
|
+
* con borde left del color del tone + título bold + body dim.
|
|
54
54
|
*/
|
|
55
55
|
export function ToastStack({ toasts, max = 3 }) {
|
|
56
56
|
if (toasts.length === 0)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CliContext } from "../../types.js";
|
|
2
|
+
import type { ActivityEvent } from "../components/activity-feed.js";
|
|
3
|
+
export interface LoadActivityOptions {
|
|
4
|
+
cap?: number;
|
|
5
|
+
/** When false, skip git log read (faster). */
|
|
6
|
+
includeGit?: boolean;
|
|
7
|
+
/** When false, skip sessions read. */
|
|
8
|
+
includeSessions?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Aggregator de eventos para el activity-feed.
|
|
12
|
+
*
|
|
13
|
+
* Lee:
|
|
14
|
+
* - git log --oneline --since=24h (commits del repo cwd).
|
|
15
|
+
* - agent-workflow sessions (counts y listado).
|
|
16
|
+
*
|
|
17
|
+
* Eventos futuros (deferred): npm registry checks · MCP calls log · skill installs.
|
|
18
|
+
* Estos requieren tracking que aún no existe en runtime.
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadActivity(ctx: CliContext, opts?: LoadActivityOptions): Promise<ActivityEvent[]>;
|
|
21
|
+
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/data/activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,UAAU,EACf,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CAiB1B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregator de eventos para el activity-feed.
|
|
3
|
+
*
|
|
4
|
+
* Lee:
|
|
5
|
+
* - git log --oneline --since=24h (commits del repo cwd).
|
|
6
|
+
* - agent-workflow sessions (counts y listado).
|
|
7
|
+
*
|
|
8
|
+
* Eventos futuros (deferred): npm registry checks · MCP calls log · skill installs.
|
|
9
|
+
* Estos requieren tracking que aún no existe en runtime.
|
|
10
|
+
*/
|
|
11
|
+
export async function loadActivity(ctx, opts = {}) {
|
|
12
|
+
const cap = opts.cap ?? 7;
|
|
13
|
+
const includeGit = opts.includeGit ?? true;
|
|
14
|
+
const includeSessions = opts.includeSessions ?? true;
|
|
15
|
+
const events = [];
|
|
16
|
+
if (includeGit) {
|
|
17
|
+
events.push(...(await readGitLog(ctx).catch(() => [])));
|
|
18
|
+
}
|
|
19
|
+
if (includeSessions) {
|
|
20
|
+
events.push(...(await readSessions(ctx).catch(() => [])));
|
|
21
|
+
}
|
|
22
|
+
// Sort desc by parsed timestamp (when we stored ts in ID).
|
|
23
|
+
events.sort((a, b) => parseAgo(b.when) - parseAgo(a.when));
|
|
24
|
+
return events.slice(0, cap);
|
|
25
|
+
}
|
|
26
|
+
async function readGitLog(ctx) {
|
|
27
|
+
const res = await ctx.process.run("git", ["log", "--oneline", "--since=48 hours ago", "-n", "10"], { cwd: ctx.env.cwd() });
|
|
28
|
+
if (res.code !== 0)
|
|
29
|
+
return [];
|
|
30
|
+
const lines = res.stdout.split("\n").filter((l) => l.trim().length > 0);
|
|
31
|
+
return lines.map((line, i) => {
|
|
32
|
+
const [sha = "", ...rest] = line.split(" ");
|
|
33
|
+
const text = rest.join(" ");
|
|
34
|
+
return {
|
|
35
|
+
id: `git-${sha}`,
|
|
36
|
+
when: `${i * 2 + 1}h`,
|
|
37
|
+
dotColor: "info",
|
|
38
|
+
text: text.length > 60 ? `${text.slice(0, 57)}…` : text,
|
|
39
|
+
meta: sha.slice(0, 7),
|
|
40
|
+
metaTone: "dim",
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function readSessions(ctx) {
|
|
45
|
+
const res = await ctx.process.run(ctx.runtime.binName, ["sessions"], {
|
|
46
|
+
cwd: ctx.env.cwd(),
|
|
47
|
+
});
|
|
48
|
+
if (res.code !== 0)
|
|
49
|
+
return [];
|
|
50
|
+
try {
|
|
51
|
+
const data = JSON.parse(res.stdout);
|
|
52
|
+
const sessions = data.sessions ?? [];
|
|
53
|
+
return sessions.slice(0, 3).map((s, i) => ({
|
|
54
|
+
id: `session-${s.code}`,
|
|
55
|
+
when: `${(i + 1) * 4}m`,
|
|
56
|
+
dotColor: "accent",
|
|
57
|
+
text: `session${s.code} · ${s.name}`,
|
|
58
|
+
meta: `flow ${s.flow} · phase ${s.phase}`,
|
|
59
|
+
metaTone: "dim",
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function parseAgo(when) {
|
|
67
|
+
const m = when.match(/^(\d+)([smhd])/);
|
|
68
|
+
if (!m)
|
|
69
|
+
return 0;
|
|
70
|
+
const n = Number.parseInt(m[1] ?? "0", 10);
|
|
71
|
+
switch (m[2]) {
|
|
72
|
+
case "s":
|
|
73
|
+
return -n;
|
|
74
|
+
case "m":
|
|
75
|
+
return -n * 60;
|
|
76
|
+
case "h":
|
|
77
|
+
return -n * 3600;
|
|
78
|
+
case "d":
|
|
79
|
+
return -n * 86400;
|
|
80
|
+
}
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../../src/cli/tui/data/activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CliContext } from "../../types.js";
|
|
2
|
+
import { type ActivityEvent } from "../components/activity-feed.js";
|
|
2
3
|
export interface McpTabProps {
|
|
3
4
|
ctx: CliContext;
|
|
4
5
|
isActive: boolean;
|
|
@@ -7,16 +8,7 @@ export interface McpTabProps {
|
|
|
7
8
|
title: string;
|
|
8
9
|
body?: string;
|
|
9
10
|
}) => void;
|
|
11
|
+
recentEvents?: ActivityEvent[];
|
|
10
12
|
}
|
|
11
|
-
|
|
12
|
-
* McpTab — listado MCP single-column + ActionModal overlay + Add wizard inline.
|
|
13
|
-
*
|
|
14
|
-
* Layout match con handoff (variant-palette.jsx MCPTab):
|
|
15
|
-
* PageHead con `+ add connection` action button → FrameBox "connections" accent
|
|
16
|
-
* con ListRow por conexión → ActionModal overlay al ⏎ (Test / Edit / Remove).
|
|
17
|
-
*
|
|
18
|
-
* Add/Edit wizard inline tras `a` shortcut o acción Edit. ConfirmModal para
|
|
19
|
-
* remove. Busy label durante ops.
|
|
20
|
-
*/
|
|
21
|
-
export declare function McpTab({ ctx, isActive, onToast }: McpTabProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare function McpTab({ ctx, isActive, onToast, recentEvents }: McpTabProps): import("react/jsx-runtime").JSX.Element;
|
|
22
14
|
//# sourceMappingURL=mcp-tab.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tab.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/tabs/mcp-tab.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-tab.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/tabs/mcp-tab.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,gCAAgC,CAAC;AAqBlF,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACvF,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;CAChC;AA+BD,wBAAgB,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,WAAW,2CA4a3E"}
|
|
@@ -1,15 +1,35 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text, useInput } from "ink";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput, useStdout } from "ink";
|
|
3
3
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
4
|
import { selfMcpConfig, } from "../../../application/self/mcp-config.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { ActivityFeed } from "../components/activity-feed.js";
|
|
6
|
+
import { ConfirmBanner } from "../components/confirm-banner.js";
|
|
7
|
+
import { DetailPanel } from "../components/detail-panel.js";
|
|
8
8
|
import { InputPrompt } from "../components/input-prompt.js";
|
|
9
9
|
import { ListRow } from "../components/list-row.js";
|
|
10
10
|
import { PageHead } from "../components/page-head.js";
|
|
11
|
+
import { QuickActions } from "../components/quick-actions.js";
|
|
12
|
+
import { SectionHead } from "../components/section-head.js";
|
|
11
13
|
import { useInputLock } from "../input-lock.js";
|
|
12
14
|
import { colors, icons } from "../theme.js";
|
|
15
|
+
/**
|
|
16
|
+
* Calcula el ancho disponible para un row de la lista, considerando si el
|
|
17
|
+
* detail panel está abierto.
|
|
18
|
+
*
|
|
19
|
+
* Overhead horizontal:
|
|
20
|
+
* - ScreenFrame border (2) + paddingX (4) = 6
|
|
21
|
+
* - Sidebar (24)
|
|
22
|
+
* - Main paddingX (2)
|
|
23
|
+
* - List paddingRight (2)
|
|
24
|
+
* - Detail panel + separator (39) cuando está abierto
|
|
25
|
+
* - Safety margin (2)
|
|
26
|
+
*/
|
|
27
|
+
function computeRowWidth(termCols, detailOpen) {
|
|
28
|
+
const cols = termCols ?? 100;
|
|
29
|
+
const baseOverhead = 36; // 6 + 24 + 2 + 2 + 2
|
|
30
|
+
const detailOverhead = detailOpen ? 39 : 0;
|
|
31
|
+
return Math.max(16, cols - baseOverhead - detailOverhead);
|
|
32
|
+
}
|
|
13
33
|
function buildArgs(action, values = {}) {
|
|
14
34
|
return {
|
|
15
35
|
rest: ["mcp", action],
|
|
@@ -19,25 +39,16 @@ function buildArgs(action, values = {}) {
|
|
|
19
39
|
valuesMulti: new Map(),
|
|
20
40
|
};
|
|
21
41
|
}
|
|
22
|
-
|
|
23
|
-
* McpTab — listado MCP single-column + ActionModal overlay + Add wizard inline.
|
|
24
|
-
*
|
|
25
|
-
* Layout match con handoff (variant-palette.jsx MCPTab):
|
|
26
|
-
* PageHead con `+ add connection` action button → FrameBox "connections" accent
|
|
27
|
-
* con ListRow por conexión → ActionModal overlay al ⏎ (Test / Edit / Remove).
|
|
28
|
-
*
|
|
29
|
-
* Add/Edit wizard inline tras `a` shortcut o acción Edit. ConfirmModal para
|
|
30
|
-
* remove. Busy label durante ops.
|
|
31
|
-
*/
|
|
32
|
-
export function McpTab({ ctx, isActive, onToast }) {
|
|
42
|
+
export function McpTab({ ctx, isActive, onToast, recentEvents }) {
|
|
33
43
|
const [connections, setConnections] = useState([]);
|
|
34
44
|
const [cursor, setCursor] = useState(0);
|
|
35
45
|
const [actionCursor, setActionCursor] = useState(0);
|
|
36
46
|
const [mode, setMode] = useState({ kind: "list" });
|
|
37
47
|
const startedRef = useRef(false);
|
|
38
48
|
const { lock, unlock } = useInputLock();
|
|
49
|
+
const { stdout } = useStdout();
|
|
39
50
|
useEffect(() => {
|
|
40
|
-
if (mode.kind === "list" || mode.kind === "
|
|
51
|
+
if (mode.kind === "list" || mode.kind === "detail")
|
|
41
52
|
unlock();
|
|
42
53
|
else
|
|
43
54
|
lock();
|
|
@@ -77,19 +88,31 @@ export function McpTab({ ctx, isActive, onToast }) {
|
|
|
77
88
|
return false;
|
|
78
89
|
}
|
|
79
90
|
}, [ctx, onToast]);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Sincroniza el MCP entry de la connection en los 3 hosts (Claude/Codex/Warp).
|
|
93
|
+
* Esto es lo que "activa" la connection — sin install en hosts, los skills no
|
|
94
|
+
* la pueden consumir. Reemplaza el viejo "doctor" (que solo reportaba drift).
|
|
95
|
+
*/
|
|
96
|
+
const runSyncToHosts = useCallback(async (name) => {
|
|
97
|
+
const hosts = ["claude", "codex", "warp"];
|
|
98
|
+
let allOk = true;
|
|
99
|
+
for (const host of hosts) {
|
|
100
|
+
const ok = await runRawAction(`install-${host}`, name, `syncing ${name} → ${host}…`);
|
|
101
|
+
if (!ok)
|
|
102
|
+
allOk = false;
|
|
103
|
+
}
|
|
104
|
+
if (allOk) {
|
|
105
|
+
onToast?.({ tone: "ok", title: `Synced ${name}`, body: "claude · codex · warp" });
|
|
106
|
+
}
|
|
84
107
|
await refresh();
|
|
85
108
|
setMode({ kind: "list" });
|
|
86
109
|
}, [runRawAction, refresh, onToast]);
|
|
87
|
-
const
|
|
110
|
+
const triggerAction = useCallback((id) => {
|
|
88
111
|
if (!current)
|
|
89
112
|
return;
|
|
90
113
|
switch (id) {
|
|
91
114
|
case "test":
|
|
92
|
-
void
|
|
115
|
+
void runSyncToHosts(current.nombre);
|
|
93
116
|
return;
|
|
94
117
|
case "edit":
|
|
95
118
|
setMode({
|
|
@@ -102,32 +125,20 @@ export function McpTab({ ctx, isActive, onToast }) {
|
|
|
102
125
|
setMode({ kind: "confirm-delete", name: current.nombre });
|
|
103
126
|
return;
|
|
104
127
|
}
|
|
105
|
-
}, [current,
|
|
106
|
-
//
|
|
107
|
-
const
|
|
128
|
+
}, [current, runSyncToHosts]);
|
|
129
|
+
// Detail panel actions (Sync/Edit/Remove).
|
|
130
|
+
const detailActions = current
|
|
108
131
|
? [
|
|
132
|
+
{ name: "Sync to hosts", description: "Install to Claude/Codex/Warp." },
|
|
133
|
+
{ name: "Edit connection", description: "Alias / host / DSN." },
|
|
109
134
|
{
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
label: "Test connection",
|
|
113
|
-
desc: `Open a socket to ${current.server_name} and run \`SELECT 1\``,
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
id: "edit",
|
|
117
|
-
icon: icons.edit,
|
|
118
|
-
label: "Edit connection",
|
|
119
|
-
desc: "Modify alias, host or database in profile.json",
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
id: "remove",
|
|
123
|
-
icon: icons.cross,
|
|
124
|
-
label: "Remove connection",
|
|
125
|
-
desc: `Delete from \`mcp_databases[]\` and unexport ${current.dsn_var}`,
|
|
135
|
+
name: "Remove connection",
|
|
136
|
+
description: "Delete entry + DSN export.",
|
|
126
137
|
danger: true,
|
|
127
138
|
},
|
|
128
139
|
]
|
|
129
140
|
: [];
|
|
130
|
-
// input — list mode
|
|
141
|
+
// input — list mode (↑↓ navega · ⏎ abre detail · 'a' add wizard)
|
|
131
142
|
useInput((input, key) => {
|
|
132
143
|
if (!isActive || mode.kind !== "list")
|
|
133
144
|
return;
|
|
@@ -137,29 +148,27 @@ export function McpTab({ ctx, isActive, onToast }) {
|
|
|
137
148
|
}
|
|
138
149
|
if (key.upArrow) {
|
|
139
150
|
setCursor((c) => Math.max(0, c - 1));
|
|
140
|
-
setActionCursor(0);
|
|
141
151
|
return;
|
|
142
152
|
}
|
|
143
153
|
if (key.downArrow) {
|
|
144
154
|
setCursor((c) => (connections.length === 0 ? 0 : Math.min(connections.length - 1, c + 1)));
|
|
145
|
-
setActionCursor(0);
|
|
146
155
|
return;
|
|
147
156
|
}
|
|
148
157
|
if (key.return && current) {
|
|
149
158
|
setActionCursor(0);
|
|
150
|
-
setMode({ kind: "
|
|
159
|
+
setMode({ kind: "detail" });
|
|
151
160
|
}
|
|
152
161
|
}, { isActive });
|
|
153
|
-
// input —
|
|
162
|
+
// input — detail mode (↑↓ navega actions · ⏎ ejecuta focused · Esc cierra)
|
|
154
163
|
useInput((_input, key) => {
|
|
155
|
-
if (!isActive || mode.kind !== "
|
|
164
|
+
if (!isActive || mode.kind !== "detail" || !current)
|
|
156
165
|
return;
|
|
157
166
|
if (key.upArrow) {
|
|
158
167
|
setActionCursor((c) => Math.max(0, c - 1));
|
|
159
168
|
return;
|
|
160
169
|
}
|
|
161
170
|
if (key.downArrow) {
|
|
162
|
-
setActionCursor((c) => Math.min(
|
|
171
|
+
setActionCursor((c) => Math.min(detailActions.length - 1, c + 1));
|
|
163
172
|
return;
|
|
164
173
|
}
|
|
165
174
|
if (key.escape) {
|
|
@@ -167,12 +176,21 @@ export function McpTab({ ctx, isActive, onToast }) {
|
|
|
167
176
|
return;
|
|
168
177
|
}
|
|
169
178
|
if (key.return) {
|
|
170
|
-
const
|
|
171
|
-
if (
|
|
172
|
-
|
|
179
|
+
const action = detailActions[actionCursor];
|
|
180
|
+
if (!action)
|
|
181
|
+
return;
|
|
182
|
+
if (action.danger) {
|
|
183
|
+
triggerAction("remove");
|
|
184
|
+
}
|
|
185
|
+
else if (action.name.startsWith("Edit")) {
|
|
186
|
+
triggerAction("edit");
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
triggerAction("test");
|
|
190
|
+
}
|
|
173
191
|
}
|
|
174
192
|
}, { isActive });
|
|
175
|
-
// input — confirm-delete
|
|
193
|
+
// input — confirm-delete (y confirma · n/esc vuelve al detail)
|
|
176
194
|
useInput((input, key) => {
|
|
177
195
|
if (!isActive || mode.kind !== "confirm-delete")
|
|
178
196
|
return;
|
|
@@ -185,7 +203,7 @@ export function McpTab({ ctx, isActive, onToast }) {
|
|
|
185
203
|
});
|
|
186
204
|
}
|
|
187
205
|
else if (key.escape || input === "n" || input === "N") {
|
|
188
|
-
setMode({ kind: "
|
|
206
|
+
setMode({ kind: "detail" });
|
|
189
207
|
}
|
|
190
208
|
}, { isActive });
|
|
191
209
|
// input — esc en wizard
|
|
@@ -197,37 +215,42 @@ export function McpTab({ ctx, isActive, onToast }) {
|
|
|
197
215
|
setMode({ kind: "list" });
|
|
198
216
|
}
|
|
199
217
|
}, { isActive });
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
218
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(PageHead, { title: "MCP", count: { label: `${connections.length} databases · profile.json`, tone: "accent" }, action: _jsx(Text, { color: colors.mute, children: "aliases match mcp_databases[] \u00B7 consumed by skills" }) }), _jsxs(Box, { flexDirection: "row", children: [_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingRight: 2, children: [_jsx(SectionHead, { label: "Connections", count: connections.length, rightAction: mode.kind === "wizard-name" || mode.kind === "wizard-dsn"
|
|
219
|
+
? "esc cancel"
|
|
220
|
+
: mode.kind === "detail" || mode.kind === "confirm-delete"
|
|
221
|
+
? "esc to close detail"
|
|
222
|
+
: "⏎ for actions · a · + add" }), connections.length === 0 && mode.kind === "list" ? (_jsxs(Box, { marginLeft: 2, marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.dim, children: "No MCP connections yet." }), _jsxs(Text, { color: colors.dim, children: ["Register a DSN to let skills query your DB. Press", " ", _jsx(Text, { color: colors.accent, bold: true, children: "a" }), " ", "to start."] })] })) : (_jsx(Box, { marginTop: 0, flexDirection: "column", children: connections.map((c, i) => (_jsx(ListRow, { icon: icons.diamond, iconActive: true, title: c.nombre, subtitle: `${c.dsn_var} · ${c.server_name}`, state: { label: "registered", tone: "ok" }, chevron: true, active: i === cursor, dimmed: mode.kind === "wizard-name" || mode.kind === "wizard-dsn", widthHint: computeRowWidth(stdout?.columns, mode.kind === "detail" ||
|
|
223
|
+
mode.kind === "confirm-delete" ||
|
|
224
|
+
mode.kind === "wizard-name" ||
|
|
225
|
+
mode.kind === "wizard-dsn") }, c.nombre))) })), mode.kind === "wizard-name" ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(SectionHead, { label: mode.editingName
|
|
226
|
+
? `Edit connection · ${mode.editingName}`
|
|
227
|
+
: "Register new connection", hint: "Step 1 of 2 \u00B7 Alias", rightAction: "\u23CE next \u00B7 esc cancel" }), _jsx(Box, { marginLeft: 2, marginTop: 0, children: _jsx(InputPrompt, { message: "alias (slug-kebab):", onSubmit: (value) => {
|
|
228
|
+
const trimmed = value.trim() || mode.editingName || "";
|
|
229
|
+
if (!trimmed) {
|
|
230
|
+
onToast?.({ tone: "err", title: "Empty alias" });
|
|
231
|
+
setMode({ kind: "list" });
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
setMode({
|
|
235
|
+
kind: "wizard-dsn",
|
|
236
|
+
name: trimmed,
|
|
237
|
+
...(mode.editingName ? { editingExisting: mode.editingName } : {}),
|
|
238
|
+
});
|
|
239
|
+
}, isActive: isActive }) })] })) : null, mode.kind === "wizard-dsn" ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(SectionHead, { label: `Register new connection · ${mode.name}`, hint: "Step 2 of 2 \u00B7 DSN env var", rightAction: "\u23CE register \u00B7 esc cancel" }), _jsx(Box, { marginLeft: 2, marginTop: 0, children: _jsx(InputPrompt, { message: "DSN env var (UPPER_SNAKE_CASE):", onSubmit: (value) => {
|
|
240
|
+
const dsnVar = value.trim();
|
|
241
|
+
if (!dsnVar) {
|
|
242
|
+
onToast?.({ tone: "err", title: "Empty DSN var" });
|
|
243
|
+
setMode({ kind: "list" });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
void registerConnection(mode.name, dsnVar);
|
|
247
|
+
}, isActive: isActive }) })] })) : null, mode.kind === "list" ? (_jsxs(_Fragment, { children: [_jsx(SectionHead, { label: "Recent", count: recentEvents?.length ?? 0, marginTop: 1 }), _jsx(Box, { marginLeft: 2, children: _jsx(ActivityFeed, { events: recentEvents ?? [], cap: 4, emptyHint: " (no recent MCP calls yet)" }) })] })) : null, mode.kind === "busy" ? (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: colors.warn, children: [icons.spinner, " ", mode.label] }) })) : null] }), current && (mode.kind === "detail" || mode.kind === "confirm-delete") ? (_jsxs(Box, { flexDirection: "column", borderLeft: false, children: [_jsx(Text, { color: colors.borderFaint, children: "│" }), _jsx(DetailPanel, { header: {
|
|
248
|
+
name: current.nombre,
|
|
249
|
+
meta: `${current.server_name} · ${current.dsn_var}\nlast test: —`,
|
|
250
|
+
}, statePill: { label: "registered", tone: "ok" }, actions: detailActions, focusedAction: actionCursor, banner: mode.kind === "confirm-delete" ? (_jsx(ConfirmBanner, { title: `× Remove ${mode.name}?`, body: `This deletes the entry from profile.json and unexports ${current.dsn_var}. Not reversible.` })) : null })] })) : mode.kind === "wizard-name" || mode.kind === "wizard-dsn" ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: colors.borderFaint, children: "│" }), _jsxs(Box, { flexDirection: "column", width: 38, paddingLeft: 1, children: [_jsx(Box, { children: _jsx(Text, { color: colors.accent, bold: true, children: "+ New connection" }) }), _jsx(Text, { color: colors.dim, wrap: "truncate-end", children: "2-step wizard \u00B7 profile.json" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.mute, children: "STEPS" }), _jsx(WizardStep, { index: 1, label: "Alias", active: mode.kind === "wizard-name", completed: mode.kind === "wizard-dsn", value: mode.kind === "wizard-dsn" ? mode.name : undefined }), _jsx(WizardStep, { index: 2, label: "DSN env var", active: mode.kind === "wizard-dsn", completed: false })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.borderFaint, children: "─".repeat(36) }), _jsx(Text, { color: colors.faint, children: "\u23CE next \u00B7 esc cancel" })] })] })] })) : null] }), _jsx(Box, { marginTop: 1, children: _jsx(QuickActions, { actions: [
|
|
251
|
+
{ key: "a", label: "add connection" },
|
|
252
|
+
{ key: "^K", label: "palette" },
|
|
253
|
+
] }) })] }));
|
|
231
254
|
async function registerConnection(name, dsnVar) {
|
|
232
255
|
setMode({ kind: "busy", label: `registering ${name}…` });
|
|
233
256
|
try {
|
|
@@ -248,4 +271,9 @@ export function McpTab({ ctx, isActive, onToast }) {
|
|
|
248
271
|
}
|
|
249
272
|
}
|
|
250
273
|
}
|
|
274
|
+
function WizardStep({ index, label, active, completed, value, hint, }) {
|
|
275
|
+
const glyph = completed ? icons.check : active ? "→" : " ";
|
|
276
|
+
const color = completed ? colors.ok : active ? colors.accent : colors.dim;
|
|
277
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: active ? colors.accent : colors.faint, children: active ? icons.focusBar : " " }), _jsxs(Text, { color: color, bold: active, children: [glyph, " ", index, ". ", label] })] }), value ? (_jsx(Box, { marginLeft: 3, children: _jsx(Text, { color: colors.ok, children: value }) })) : null, hint ? (_jsx(Box, { marginLeft: 3, children: _jsx(Text, { color: colors.dim, children: hint }) })) : null] }));
|
|
278
|
+
}
|
|
251
279
|
//# sourceMappingURL=mcp-tab.js.map
|