@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.
Files changed (163) hide show
  1. package/dist/cli/main.js +0 -0
  2. package/dist/cli/tui/app.d.ts.map +1 -1
  3. package/dist/cli/tui/app.js +119 -61
  4. package/dist/cli/tui/app.js.map +1 -1
  5. package/dist/cli/tui/components/activity-feed.d.ts +16 -0
  6. package/dist/cli/tui/components/activity-feed.d.ts.map +1 -0
  7. package/dist/cli/tui/components/activity-feed.js +35 -0
  8. package/dist/cli/tui/components/activity-feed.js.map +1 -0
  9. package/dist/cli/tui/components/command-palette.d.ts +0 -1
  10. package/dist/cli/tui/components/command-palette.d.ts.map +1 -1
  11. package/dist/cli/tui/components/command-palette.js +5 -5
  12. package/dist/cli/tui/components/command-palette.js.map +1 -1
  13. package/dist/cli/tui/components/confirm-banner.d.ts +10 -0
  14. package/dist/cli/tui/components/confirm-banner.d.ts.map +1 -0
  15. package/dist/cli/tui/components/confirm-banner.js +11 -0
  16. package/dist/cli/tui/components/confirm-banner.js.map +1 -0
  17. package/dist/cli/tui/components/detail-panel.d.ts +34 -0
  18. package/dist/cli/tui/components/detail-panel.d.ts.map +1 -0
  19. package/dist/cli/tui/components/detail-panel.js +83 -0
  20. package/dist/cli/tui/components/detail-panel.js.map +1 -0
  21. package/dist/cli/tui/components/family-card.d.ts +5 -1
  22. package/dist/cli/tui/components/family-card.d.ts.map +1 -1
  23. package/dist/cli/tui/components/family-card.js +34 -4
  24. package/dist/cli/tui/components/family-card.js.map +1 -1
  25. package/dist/cli/tui/components/inline-wizard.d.ts +19 -0
  26. package/dist/cli/tui/components/inline-wizard.d.ts.map +1 -0
  27. package/dist/cli/tui/components/inline-wizard.js +16 -0
  28. package/dist/cli/tui/components/inline-wizard.js.map +1 -0
  29. package/dist/cli/tui/components/list-row.d.ts +11 -3
  30. package/dist/cli/tui/components/list-row.d.ts.map +1 -1
  31. package/dist/cli/tui/components/list-row.js +71 -13
  32. package/dist/cli/tui/components/list-row.js.map +1 -1
  33. package/dist/cli/tui/components/page-head.d.ts +8 -16
  34. package/dist/cli/tui/components/page-head.d.ts.map +1 -1
  35. package/dist/cli/tui/components/page-head.js +21 -14
  36. package/dist/cli/tui/components/page-head.js.map +1 -1
  37. package/dist/cli/tui/components/phase-card.d.ts +2 -1
  38. package/dist/cli/tui/components/phase-card.d.ts.map +1 -1
  39. package/dist/cli/tui/components/phase-card.js +9 -4
  40. package/dist/cli/tui/components/phase-card.js.map +1 -1
  41. package/dist/cli/tui/components/quick-actions.d.ts +9 -0
  42. package/dist/cli/tui/components/quick-actions.d.ts.map +1 -0
  43. package/dist/cli/tui/components/quick-actions.js +9 -0
  44. package/dist/cli/tui/components/quick-actions.js.map +1 -0
  45. package/dist/cli/tui/components/section-head.d.ts +10 -0
  46. package/dist/cli/tui/components/section-head.d.ts.map +1 -0
  47. package/dist/cli/tui/components/section-head.js +8 -0
  48. package/dist/cli/tui/components/section-head.js.map +1 -0
  49. package/dist/cli/tui/components/sidebar.d.ts +27 -0
  50. package/dist/cli/tui/components/sidebar.d.ts.map +1 -0
  51. package/dist/cli/tui/components/sidebar.js +37 -0
  52. package/dist/cli/tui/components/sidebar.js.map +1 -0
  53. package/dist/cli/tui/components/stat-tile.d.ts +4 -2
  54. package/dist/cli/tui/components/stat-tile.d.ts.map +1 -1
  55. package/dist/cli/tui/components/stat-tile.js +9 -8
  56. package/dist/cli/tui/components/stat-tile.js.map +1 -1
  57. package/dist/cli/tui/components/toast-stack.d.ts +3 -3
  58. package/dist/cli/tui/components/toast-stack.js +3 -3
  59. package/dist/cli/tui/data/activity.d.ts +21 -0
  60. package/dist/cli/tui/data/activity.d.ts.map +1 -0
  61. package/dist/cli/tui/data/activity.js +83 -0
  62. package/dist/cli/tui/data/activity.js.map +1 -0
  63. package/dist/cli/tui/tabs/mcp-tab.d.ts +3 -11
  64. package/dist/cli/tui/tabs/mcp-tab.d.ts.map +1 -1
  65. package/dist/cli/tui/tabs/mcp-tab.js +113 -85
  66. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  67. package/dist/cli/tui/tabs/project-tab.d.ts +0 -11
  68. package/dist/cli/tui/tabs/project-tab.d.ts.map +1 -1
  69. package/dist/cli/tui/tabs/project-tab.js +38 -78
  70. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  71. package/dist/cli/tui/tabs/skills-tab.d.ts +1 -21
  72. package/dist/cli/tui/tabs/skills-tab.d.ts.map +1 -1
  73. package/dist/cli/tui/tabs/skills-tab.js +65 -85
  74. package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
  75. package/dist/cli/tui/tabs/status-tab.d.ts +4 -1
  76. package/dist/cli/tui/tabs/status-tab.d.ts.map +1 -1
  77. package/dist/cli/tui/tabs/status-tab.js +50 -11
  78. package/dist/cli/tui/tabs/status-tab.js.map +1 -1
  79. package/dist/cli/tui/tabs/workflow-tab.d.ts +3 -1
  80. package/dist/cli/tui/tabs/workflow-tab.d.ts.map +1 -1
  81. package/dist/cli/tui/tabs/workflow-tab.js +31 -15
  82. package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
  83. package/dist/cli/tui/theme.d.ts +75 -55
  84. package/dist/cli/tui/theme.d.ts.map +1 -1
  85. package/dist/cli/tui/theme.js +75 -50
  86. package/dist/cli/tui/theme.js.map +1 -1
  87. package/package.json +1 -1
  88. package/dist/cli/commands/orchestration.d.ts +0 -5
  89. package/dist/cli/commands/orchestration.d.ts.map +0 -1
  90. package/dist/cli/commands/orchestration.js +0 -84
  91. package/dist/cli/commands/orchestration.js.map +0 -1
  92. package/dist/cli/commands/wave2-extras.d.ts +0 -7
  93. package/dist/cli/commands/wave2-extras.d.ts.map +0 -1
  94. package/dist/cli/commands/wave2-extras.js +0 -87
  95. package/dist/cli/commands/wave2-extras.js.map +0 -1
  96. package/dist/cli/commands/wave2-final.d.ts +0 -8
  97. package/dist/cli/commands/wave2-final.d.ts.map +0 -1
  98. package/dist/cli/commands/wave2-final.js +0 -134
  99. package/dist/cli/commands/wave2-final.js.map +0 -1
  100. package/dist/cli/commands/wave4d-simple.d.ts +0 -6
  101. package/dist/cli/commands/wave4d-simple.d.ts.map +0 -1
  102. package/dist/cli/commands/wave4d-simple.js +0 -138
  103. package/dist/cli/commands/wave4d-simple.js.map +0 -1
  104. package/dist/cli/tui/components/action-modal.d.ts +0 -33
  105. package/dist/cli/tui/components/action-modal.d.ts.map +0 -1
  106. package/dist/cli/tui/components/action-modal.js +0 -41
  107. package/dist/cli/tui/components/action-modal.js.map +0 -1
  108. package/dist/cli/tui/components/confirm-modal.d.ts +0 -12
  109. package/dist/cli/tui/components/confirm-modal.d.ts.map +0 -1
  110. package/dist/cli/tui/components/confirm-modal.js +0 -18
  111. package/dist/cli/tui/components/confirm-modal.js.map +0 -1
  112. package/dist/cli/tui/components/connections-grid.d.ts +0 -8
  113. package/dist/cli/tui/components/connections-grid.d.ts.map +0 -1
  114. package/dist/cli/tui/components/connections-grid.js +0 -55
  115. package/dist/cli/tui/components/connections-grid.js.map +0 -1
  116. package/dist/cli/tui/components/connections-table.d.ts +0 -5
  117. package/dist/cli/tui/components/connections-table.d.ts.map +0 -1
  118. package/dist/cli/tui/components/connections-table.js +0 -11
  119. package/dist/cli/tui/components/connections-table.js.map +0 -1
  120. package/dist/cli/tui/components/footer.d.ts +0 -4
  121. package/dist/cli/tui/components/footer.d.ts.map +0 -1
  122. package/dist/cli/tui/components/footer.js +0 -6
  123. package/dist/cli/tui/components/footer.js.map +0 -1
  124. package/dist/cli/tui/components/frame-box.d.ts +0 -10
  125. package/dist/cli/tui/components/frame-box.d.ts.map +0 -1
  126. package/dist/cli/tui/components/frame-box.js +0 -9
  127. package/dist/cli/tui/components/frame-box.js.map +0 -1
  128. package/dist/cli/tui/components/header.d.ts +0 -14
  129. package/dist/cli/tui/components/header.d.ts.map +0 -1
  130. package/dist/cli/tui/components/header.js +0 -21
  131. package/dist/cli/tui/components/header.js.map +0 -1
  132. package/dist/cli/tui/components/host-chip.d.ts +0 -28
  133. package/dist/cli/tui/components/host-chip.d.ts.map +0 -1
  134. package/dist/cli/tui/components/host-chip.js +0 -35
  135. package/dist/cli/tui/components/host-chip.js.map +0 -1
  136. package/dist/cli/tui/components/keymap-bar.d.ts +0 -17
  137. package/dist/cli/tui/components/keymap-bar.d.ts.map +0 -1
  138. package/dist/cli/tui/components/keymap-bar.js +0 -13
  139. package/dist/cli/tui/components/keymap-bar.js.map +0 -1
  140. package/dist/cli/tui/components/pill.d.ts +0 -16
  141. package/dist/cli/tui/components/pill.d.ts.map +0 -1
  142. package/dist/cli/tui/components/pill.js +0 -24
  143. package/dist/cli/tui/components/pill.js.map +0 -1
  144. package/dist/cli/tui/components/sectioned-menu.d.ts +0 -24
  145. package/dist/cli/tui/components/sectioned-menu.d.ts.map +0 -1
  146. package/dist/cli/tui/components/sectioned-menu.js +0 -72
  147. package/dist/cli/tui/components/sectioned-menu.js.map +0 -1
  148. package/dist/cli/tui/components/tab-bar.d.ts +0 -23
  149. package/dist/cli/tui/components/tab-bar.d.ts.map +0 -1
  150. package/dist/cli/tui/components/tab-bar.js +0 -17
  151. package/dist/cli/tui/components/tab-bar.js.map +0 -1
  152. package/dist/cli/tui/screens/main-menu.d.ts +0 -8
  153. package/dist/cli/tui/screens/main-menu.d.ts.map +0 -1
  154. package/dist/cli/tui/screens/main-menu.js +0 -24
  155. package/dist/cli/tui/screens/main-menu.js.map +0 -1
  156. package/dist/cli/tui/screens/mcp-done.d.ts +0 -10
  157. package/dist/cli/tui/screens/mcp-done.d.ts.map +0 -1
  158. package/dist/cli/tui/screens/mcp-done.js +0 -24
  159. package/dist/cli/tui/screens/mcp-done.js.map +0 -1
  160. package/dist/cli/tui/screens/mcp-wizard.d.ts +0 -10
  161. package/dist/cli/tui/screens/mcp-wizard.d.ts.map +0 -1
  162. package/dist/cli/tui/screens/mcp-wizard.js +0 -97
  163. 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;AAExD,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;CAClB;AAiBD,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,GAAG,EACH,IAAI,EACJ,MAAc,EACd,SAAiB,EACjB,MAAc,GACf,EAAE,aAAa,2CAwBf"}
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.success;
7
+ return colors.ok;
8
8
  case "warn":
9
- return colors.warning;
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.fgSubtle;
15
+ return colors.dim;
14
16
  default:
15
- return accent ? colors.accent : colors.fgBright;
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
- const borderColor = active ? colors.accent : accent ? colors.borderActive : colors.border;
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;AAgB5C,SAAS,UAAU,CAAC,IAAe,EAAE,MAAgB;IACnD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI;YACP,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB;YACE,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;IACpD,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,GACA;IACd,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAE1F,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,CAAC,EACX,WAAW,EAAE,CAAC,EACd,QAAQ,EAAE,CAAC,aAEX,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,cAAc,EAAC,eAAe,aACrD,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,YAAG,KAAK,CAAC,WAAW,EAAE,GAAQ,EACzD,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,YAAG,KAAK,CAAC,OAAO,GAAQ,CAC9E,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,QAAQ,YAAG,GAAG,GAAQ,CAAC,CAAC,CAAC,IAAI,IACpD,CACP,CAAC;AACJ,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 arriba del footer
37
- * (app.tsx coloca esto entre `<Content/>` y `<KeymapBar/>`). Cada toast es una
38
- * caja con borde left del color del tone + título bold + body dim.
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 arriba del footer
52
- * (app.tsx coloca esto entre `<Content/>` y `<KeymapBar/>`). Cada toast es una
53
- * caja con borde left del color del tone + título bold + body dim.
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;AAoBjD,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;CACxF;AAYD;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,2CAiY7D"}
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 { ActionModal } from "../components/action-modal.js";
6
- import { ConfirmModal } from "../components/confirm-modal.js";
7
- import { FrameBox } from "../components/frame-box.js";
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 === "actions")
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
- const runDoctor = useCallback(async (name) => {
81
- const ok = await runRawAction("doctor", name, `pinging ${name}…`);
82
- if (ok)
83
- onToast?.({ tone: "ok", title: `Test OK · ${name}`, body: "DSN reachable" });
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 applyModalAction = useCallback((id) => {
110
+ const triggerAction = useCallback((id) => {
88
111
  if (!current)
89
112
  return;
90
113
  switch (id) {
91
114
  case "test":
92
- void runDoctor(current.nombre);
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, runDoctor]);
106
- // 3 acciones: Test / Edit / Remove. Match con MCPActionModal del handoff.
107
- const modalActions = current
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
- id: "test",
111
- icon: icons.refresh,
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: "actions" });
159
+ setMode({ kind: "detail" });
151
160
  }
152
161
  }, { isActive });
153
- // input — actions mode (modal)
162
+ // input — detail mode (↑↓ navega actions · ⏎ ejecuta focused · Esc cierra)
154
163
  useInput((_input, key) => {
155
- if (!isActive || mode.kind !== "actions")
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(modalActions.length - 1, c + 1));
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 def = modalActions[actionCursor];
171
- if (def)
172
- applyModalAction(def.id);
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: "list" });
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
- const inListMode = mode.kind === "list";
201
- const addButton = (_jsx(Text, { color: colors.accent, bold: true, inverse: true, children: " a · + add connection " }));
202
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(PageHead, { title: "MCP", count: {
203
- label: `${connections.length} db`,
204
- tone: connections.length > 0 ? "accent" : "muted",
205
- }, desc: "databases for skill consumption \u00B7 aliases match `mcp_databases[]` in profile.json", action: addButton }), inListMode ? (_jsx(FrameBox, { title: `connections · ${connections.length}`, accent: connections.length > 0, dim: connections.length === 0, children: connections.length === 0 ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: colors.fgSubtle, children: "No MCP connections yet." }), _jsxs(Text, { color: colors.fgSubtle, children: ["Register a DSN to let skills query your DB. Press", " ", _jsx(Text, { color: colors.accent, bold: true, children: "a" }), " ", "to start."] })] })) : (connections.map((c, i) => (_jsx(ListRow, { icon: icons.diamond, iconActive: true, title: c.nombre, subtitle: `${c.server_name} · ${c.dsn_var}`, state: { label: "registered", tone: "ok" }, chevron: true, active: i === cursor }, c.nombre)))) })) : null, mode.kind === "actions" && current ? (_jsx(Box, { flexDirection: "column", alignItems: "center", paddingY: 2, children: _jsx(Box, { width: "80%", flexDirection: "column", children: _jsx(ActionModal, { glyph: icons.diamond, title: current.nombre, subtitle: `${current.dsn_var} · ${current.server_name}`, state: { label: "registered", tone: "ok" }, actions: modalActions, cursor: actionCursor, footerRight: current.nombre }) }) })) : null, mode.kind === "wizard-name" ? (_jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsxs(FrameBox, { title: mode.editingName
206
- ? `edit MCP connection · ${mode.editingName}`
207
- : "register MCP connection", accent: true, children: [_jsxs(Text, { color: colors.fgSubtle, children: ["Step 1/2 \u2014 connection alias (slug-kebab).", " ", mode.editingName ? `Current: ${mode.editingName}` : ""] }), _jsx(Box, { marginTop: 1, children: _jsx(InputPrompt, { message: "alias:", onSubmit: (value) => {
208
- const trimmed = value.trim() || mode.editingName || "";
209
- if (!trimmed) {
210
- onToast?.({ tone: "err", title: "Empty alias" });
211
- setMode({ kind: "list" });
212
- return;
213
- }
214
- setMode({
215
- kind: "wizard-dsn",
216
- name: trimmed,
217
- ...(mode.editingName ? { editingExisting: mode.editingName } : {}),
218
- });
219
- }, isActive: isActive }) }), _jsx(Text, { color: colors.fgSubtle, children: "esc cancel" })] }) })) : null, mode.kind === "wizard-dsn" ? (_jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsxs(FrameBox, { title: "register MCP connection \u00B7 step 2/2", accent: true, children: [_jsxs(Box, { children: [_jsx(Text, { color: colors.fgSubtle, children: "alias \u00B7 " }), _jsx(Text, { color: colors.fgBright, bold: true, children: mode.name })] }), _jsx(Box, { marginTop: 1, children: _jsx(InputPrompt, { message: "DSN env var (UPPER_SNAKE_CASE):", onSubmit: (value) => {
220
- const dsnVar = value.trim();
221
- if (!dsnVar) {
222
- onToast?.({ tone: "err", title: "Empty DSN var" });
223
- setMode({ kind: "list" });
224
- return;
225
- }
226
- void registerConnection(mode.name, dsnVar);
227
- }, isActive: isActive }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.fgMoreSubtle, children: "PREVIEW \u00B7 profile.json" }), _jsx(Text, { color: colors.fgSubtle, children: "{" }), _jsx(Text, { color: colors.fgSubtle, children: ` "mcp-servers": {` }), _jsx(Text, { color: colors.fg, children: ` "${mode.name}": {` }), _jsx(Text, { color: colors.fg, children: ` "env": "<DSN env var>",` }), _jsx(Text, { color: colors.fg, children: ` "type": "stdio"` }), _jsx(Text, { color: colors.fg, children: " }" }), _jsx(Text, { color: colors.fgSubtle, children: " }" }), _jsx(Text, { color: colors.fgSubtle, children: "}" })] }), _jsx(Text, { color: colors.fgSubtle, children: "\u23CE register \u00B7 esc cancel" })] }) })) : null, mode.kind === "confirm-delete" ? (_jsx(Box, { marginTop: 1, children: _jsx(ConfirmModal, { tone: "danger", title: "Remove connection", body: [
228
- `You are about to remove the connection '${mode.name}'.`,
229
- "This action cannot be undone.",
230
- ], confirmKey: "y", confirmLabel: `Yes, remove ${mode.name}`, cancelKey: "n / esc", cancelLabel: "Cancel" }) })) : null, mode.kind === "busy" ? (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: colors.warning, children: [icons.spinner, " ", mode.label] }) })) : null] }));
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