rax-flow 0.1.5 → 0.1.7

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/dist/bin.js +27 -3
  3. package/dist/bin.js.map +1 -1
  4. package/dist/hub/__tests__/commands.test.d.ts.map +1 -0
  5. package/dist/hub/__tests__/commands.test.js +72 -0
  6. package/dist/hub/__tests__/commands.test.js.map +1 -0
  7. package/dist/hub/__tests__/history.test.d.ts.map +1 -0
  8. package/dist/hub/__tests__/history.test.js +119 -0
  9. package/dist/hub/__tests__/history.test.js.map +1 -0
  10. package/dist/hub/__tests__/parser.test.d.ts.map +1 -0
  11. package/dist/hub/__tests__/parser.test.js +92 -0
  12. package/dist/hub/__tests__/parser.test.js.map +1 -0
  13. package/dist/hub/chat/ChatApp.d.ts +2 -0
  14. package/dist/hub/chat/ChatApp.d.ts.map +1 -0
  15. package/dist/hub/chat/ChatApp.js +146 -0
  16. package/dist/hub/chat/ChatApp.js.map +1 -0
  17. package/dist/hub/chat/components/ChatInput.d.ts +9 -0
  18. package/dist/hub/chat/components/ChatInput.d.ts.map +1 -0
  19. package/dist/hub/chat/components/ChatInput.js +19 -0
  20. package/dist/hub/chat/components/ChatInput.js.map +1 -0
  21. package/dist/hub/chat/components/MessageList.d.ts +7 -0
  22. package/dist/hub/chat/components/MessageList.d.ts.map +1 -0
  23. package/dist/hub/chat/components/MessageList.js +6 -0
  24. package/dist/hub/chat/components/MessageList.js.map +1 -0
  25. package/dist/hub/chat/context.d.ts.map +1 -0
  26. package/dist/hub/chat/context.js +42 -0
  27. package/dist/hub/chat/context.js.map +1 -0
  28. package/dist/hub/chat/hooks/useChatHistory.d.ts +7 -0
  29. package/dist/hub/chat/hooks/useChatHistory.d.ts.map +1 -0
  30. package/dist/hub/chat/hooks/useChatHistory.js +31 -0
  31. package/dist/hub/chat/hooks/useChatHistory.js.map +1 -0
  32. package/dist/hub/chat/index.d.ts.map +1 -0
  33. package/dist/hub/chat/index.js +7 -0
  34. package/dist/hub/chat/index.js.map +1 -0
  35. package/dist/hub/chat/intent-parser.d.ts.map +1 -0
  36. package/dist/hub/chat/intent-parser.js +48 -0
  37. package/dist/hub/chat/intent-parser.js.map +1 -0
  38. package/dist/hub/chat/types.d.ts.map +1 -0
  39. package/dist/hub/chat/types.js +2 -0
  40. package/dist/hub/chat/types.js.map +1 -0
  41. package/dist/hub/commands/agents.d.ts.map +1 -0
  42. package/dist/hub/commands/agents.js +36 -0
  43. package/dist/hub/commands/agents.js.map +1 -0
  44. package/dist/hub/commands/index.d.ts.map +1 -0
  45. package/dist/hub/commands/index.js +120 -0
  46. package/dist/hub/commands/index.js.map +1 -0
  47. package/dist/hub/commands/logs.d.ts.map +1 -0
  48. package/dist/hub/commands/logs.js +53 -0
  49. package/dist/hub/commands/logs.js.map +1 -0
  50. package/dist/hub/commands/memory.d.ts.map +1 -0
  51. package/dist/hub/commands/memory.js +40 -0
  52. package/dist/hub/commands/memory.js.map +1 -0
  53. package/dist/hub/commands/metrics.d.ts.map +1 -0
  54. package/dist/hub/commands/metrics.js +35 -0
  55. package/dist/hub/commands/metrics.js.map +1 -0
  56. package/dist/hub/commands/providers.d.ts.map +1 -0
  57. package/dist/hub/commands/providers.js +26 -0
  58. package/dist/hub/commands/providers.js.map +1 -0
  59. package/dist/hub/commands/run.d.ts.map +1 -0
  60. package/dist/hub/commands/run.js +31 -0
  61. package/dist/hub/commands/run.js.map +1 -0
  62. package/dist/hub/commands/status.d.ts.map +1 -0
  63. package/dist/hub/commands/status.js +61 -0
  64. package/dist/hub/commands/status.js.map +1 -0
  65. package/dist/hub/commands/workflows.d.ts.map +1 -0
  66. package/dist/hub/commands/workflows.js +45 -0
  67. package/dist/hub/commands/workflows.js.map +1 -0
  68. package/dist/hub/config-loader.d.ts.map +1 -0
  69. package/dist/hub/config-loader.js +27 -0
  70. package/dist/hub/config-loader.js.map +1 -0
  71. package/dist/hub/event-listener.d.ts.map +1 -0
  72. package/dist/hub/event-listener.js +8 -0
  73. package/dist/hub/event-listener.js.map +1 -0
  74. package/dist/hub/history.d.ts.map +1 -0
  75. package/dist/hub/history.js +59 -0
  76. package/dist/hub/history.js.map +1 -0
  77. package/dist/hub/index.d.ts.map +1 -0
  78. package/dist/hub/index.js +102 -0
  79. package/dist/hub/index.js.map +1 -0
  80. package/dist/hub/parser.d.ts.map +1 -0
  81. package/dist/hub/parser.js +98 -0
  82. package/dist/hub/parser.js.map +1 -0
  83. package/dist/hub/styles/borders.d.ts.map +1 -0
  84. package/dist/hub/styles/borders.js +64 -0
  85. package/dist/hub/styles/borders.js.map +1 -0
  86. package/dist/hub/styles/colors.d.ts.map +1 -0
  87. package/dist/hub/styles/colors.js +115 -0
  88. package/dist/hub/styles/colors.js.map +1 -0
  89. package/dist/hub/styles/typography.d.ts.map +1 -0
  90. package/dist/hub/styles/typography.js +60 -0
  91. package/dist/hub/styles/typography.js.map +1 -0
  92. package/dist/hub/tui/App.d.ts +2 -0
  93. package/dist/hub/tui/App.d.ts.map +1 -0
  94. package/dist/hub/tui/App.js +53 -0
  95. package/dist/hub/tui/App.js.map +1 -0
  96. package/dist/hub/tui/components/AgentQueue.d.ts +6 -0
  97. package/dist/hub/tui/components/AgentQueue.d.ts.map +1 -0
  98. package/dist/hub/tui/components/AgentQueue.js +20 -0
  99. package/dist/hub/tui/components/AgentQueue.js.map +1 -0
  100. package/dist/hub/tui/components/DAGPanel.d.ts +16 -0
  101. package/dist/hub/tui/components/DAGPanel.d.ts.map +1 -0
  102. package/dist/hub/tui/components/DAGPanel.js +51 -0
  103. package/dist/hub/tui/components/DAGPanel.js.map +1 -0
  104. package/dist/hub/tui/components/Header.d.ts +7 -0
  105. package/dist/hub/tui/components/Header.d.ts.map +1 -0
  106. package/dist/hub/tui/components/Header.js +17 -0
  107. package/dist/hub/tui/components/Header.js.map +1 -0
  108. package/dist/hub/tui/components/LogsPanel.d.ts +6 -0
  109. package/dist/hub/tui/components/LogsPanel.d.ts.map +1 -0
  110. package/dist/hub/tui/components/LogsPanel.js +26 -0
  111. package/dist/hub/tui/components/LogsPanel.js.map +1 -0
  112. package/dist/hub/tui/components/StatusBar.d.ts +8 -0
  113. package/dist/hub/tui/components/StatusBar.d.ts.map +1 -0
  114. package/dist/hub/tui/components/StatusBar.js +7 -0
  115. package/dist/hub/tui/components/StatusBar.js.map +1 -0
  116. package/dist/hub/tui/hooks/useEvents.d.ts +2 -0
  117. package/dist/hub/tui/hooks/useEvents.d.ts.map +1 -0
  118. package/dist/hub/tui/hooks/useEvents.js +13 -0
  119. package/dist/hub/tui/hooks/useEvents.js.map +1 -0
  120. package/dist/hub/tui/index.d.ts.map +1 -0
  121. package/dist/hub/tui/index.js +7 -0
  122. package/dist/hub/tui/index.js.map +1 -0
  123. package/dist/hub/tui/types.d.ts.map +1 -0
  124. package/dist/hub/tui/types.js +2 -0
  125. package/dist/hub/tui/types.js.map +1 -0
  126. package/dist/hub/types.d.ts.map +1 -0
  127. package/dist/hub/types.js +2 -0
  128. package/dist/hub/types.js.map +1 -0
  129. package/dist/tui/App.d.ts +2 -0
  130. package/dist/tui/App.d.ts.map +1 -0
  131. package/dist/tui/App.js +31 -0
  132. package/dist/tui/App.js.map +1 -0
  133. package/dist/tui/components/ChatPanel.d.ts +14 -0
  134. package/dist/tui/components/ChatPanel.d.ts.map +1 -0
  135. package/dist/tui/components/ChatPanel.js +30 -0
  136. package/dist/tui/components/ChatPanel.js.map +1 -0
  137. package/dist/tui/components/Header.d.ts +9 -0
  138. package/dist/tui/components/Header.d.ts.map +1 -0
  139. package/dist/tui/components/Header.js +17 -0
  140. package/dist/tui/components/Header.js.map +1 -0
  141. package/dist/tui/components/InputBar.d.ts +8 -0
  142. package/dist/tui/components/InputBar.d.ts.map +1 -0
  143. package/dist/tui/components/InputBar.js +16 -0
  144. package/dist/tui/components/InputBar.js.map +1 -0
  145. package/dist/tui/components/StatusPanel.d.ts +20 -0
  146. package/dist/tui/components/StatusPanel.d.ts.map +1 -0
  147. package/dist/tui/components/StatusPanel.js +20 -0
  148. package/dist/tui/components/StatusPanel.js.map +1 -0
  149. package/dist/tui/hooks/useAppState.d.ts +38 -0
  150. package/dist/tui/hooks/useAppState.d.ts.map +1 -0
  151. package/dist/tui/hooks/useAppState.js +127 -0
  152. package/dist/tui/hooks/useAppState.js.map +1 -0
  153. package/dist/tui/index.d.ts +3 -0
  154. package/dist/tui/index.d.ts.map +1 -0
  155. package/dist/tui/index.js +8 -0
  156. package/dist/tui/index.js.map +1 -0
  157. package/package.json +17 -11
  158. package/src/bin.ts +29 -3
  159. package/src/hub/__tests__/commands.test.ts +84 -0
  160. package/src/hub/__tests__/history.test.ts +137 -0
  161. package/src/hub/__tests__/parser.test.ts +105 -0
  162. package/src/hub/commands/agents.ts +53 -0
  163. package/src/hub/commands/index.ts +137 -0
  164. package/src/hub/commands/logs.ts +70 -0
  165. package/src/hub/commands/memory.ts +47 -0
  166. package/src/hub/commands/metrics.ts +49 -0
  167. package/src/hub/commands/providers.ts +39 -0
  168. package/src/hub/commands/run.ts +37 -0
  169. package/src/hub/commands/status.ts +69 -0
  170. package/src/hub/commands/workflows.ts +64 -0
  171. package/src/hub/config-loader.ts +37 -0
  172. package/src/hub/event-listener.ts +13 -0
  173. package/src/hub/history.ts +66 -0
  174. package/src/hub/index.ts +120 -0
  175. package/src/hub/parser.ts +107 -0
  176. package/src/hub/styles/borders.ts +74 -0
  177. package/src/hub/styles/colors.ts +129 -0
  178. package/src/hub/styles/typography.ts +68 -0
  179. package/src/hub/types.ts +31 -0
  180. package/src/tui/App.tsx +61 -0
  181. package/src/tui/components/ChatPanel.tsx +79 -0
  182. package/src/tui/components/Header.tsx +53 -0
  183. package/src/tui/components/InputBar.tsx +55 -0
  184. package/src/tui/components/StatusPanel.tsx +85 -0
  185. package/src/tui/hooks/useAppState.ts +168 -0
  186. package/src/tui/index.ts +9 -0
  187. package/tsconfig.json +19 -3
  188. package/tsconfig.tsbuildinfo +1 -0
  189. package/dist/benchmark.d.ts +0 -10
  190. package/dist/bin.d.ts +0 -3
  191. package/dist/bootstrap.d.ts +0 -8
  192. package/dist/bridge-adapter-templates.d.ts +0 -4
  193. package/dist/bridge-test.d.ts +0 -7
  194. package/dist/dashboard.d.ts +0 -4
  195. package/dist/doctor.d.ts +0 -6
  196. package/dist/evolve.d.ts +0 -7
  197. package/dist/host-init-templates.d.ts +0 -16
  198. package/dist/index.d.ts +0 -11
  199. package/dist/init-host.d.ts +0 -10
  200. package/dist/install.d.ts +0 -8
  201. package/dist/run.d.ts +0 -16
  202. package/dist/styles.d.ts +0 -12
  203. package/dist/vendor-manifests.d.ts +0 -22
  204. package/package/dashboard/index.html +0 -420
  205. package/package/package.json +0 -28
  206. package/package/src/benchmark.ts +0 -156
  207. package/package/src/bin.ts +0 -127
  208. package/package/src/bootstrap.ts +0 -36
  209. package/package/src/bridge-adapter-templates.ts +0 -181
  210. package/package/src/bridge-test.ts +0 -107
  211. package/package/src/dashboard.ts +0 -51
  212. package/package/src/doctor.ts +0 -92
  213. package/package/src/evolve.ts +0 -74
  214. package/package/src/host-init-templates.ts +0 -134
  215. package/package/src/index.ts +0 -10
  216. package/package/src/init-host.ts +0 -285
  217. package/package/src/install.ts +0 -118
  218. package/package/src/run.ts +0 -317
  219. package/package/src/styles.ts +0 -12
  220. package/package/src/vendor-manifests.ts +0 -113
  221. package/package/src/ws-relay.ts +0 -156
  222. package/package/tsconfig.json +0 -12
  223. package/rax-flow-0.1.1.tgz +0 -0
@@ -0,0 +1,14 @@
1
+ interface Message {
2
+ id: string;
3
+ type: "user" | "system" | "agent" | "error" | "success";
4
+ content: string;
5
+ timestamp: Date;
6
+ agent?: string;
7
+ }
8
+ interface ChatPanelProps {
9
+ messages: Message[];
10
+ isProcessing: boolean;
11
+ }
12
+ export declare function ChatPanel({ messages, isProcessing }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=ChatPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ChatPanel.tsx"],"names":[],"mappings":"AAGA,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAuCD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,cAAc,2CAyBnE"}
@@ -0,0 +1,30 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ function formatTime(date) {
4
+ return date.toLocaleTimeString("fr-FR", {
5
+ hour: "2-digit",
6
+ minute: "2-digit",
7
+ second: "2-digit",
8
+ });
9
+ }
10
+ function MessageItem({ message }) {
11
+ const typeColors = {
12
+ user: "cyan",
13
+ system: "gray",
14
+ agent: "#f97316",
15
+ error: "red",
16
+ success: "green",
17
+ };
18
+ const typeLabels = {
19
+ user: "YOU",
20
+ system: "SYS",
21
+ agent: message.agent || "AGENT",
22
+ error: "ERR",
23
+ success: "OK",
24
+ };
25
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: "gray", dimColor: true, children: ["[", formatTime(message.timestamp), "]"] }), _jsxs(Text, { color: typeColors[message.type], bold: true, children: [" [", typeLabels[message.type], "]"] }), message.agent && _jsxs(Text, { color: "gray", children: [" [", message.agent, "]"] })] }), _jsx(Text, { color: "white", children: message.content })] }));
26
+ }
27
+ export function ChatPanel({ messages, isProcessing }) {
28
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 2, borderStyle: "single", borderColor: "gray", paddingX: 1, children: [_jsxs(Box, { borderStyle: "single", borderColor: "#f97316", marginBottom: 1, children: [_jsx(Text, { color: "#f97316", bold: true, children: "CHAT" }), _jsx(Text, { color: "gray", children: " \u2014 Tapez /help pour les commandes" })] }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: [messages.slice(-15).map((msg) => (_jsx(MessageItem, { message: msg }, msg.id))), isProcessing && (_jsx(Box, { children: _jsx(Text, { color: "yellow", children: "\u25CF Processing..." }) }))] })] }));
29
+ }
30
+ //# sourceMappingURL=ChatPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanel.js","sourceRoot":"","sources":["../../../src/tui/components/ChatPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAY,MAAM,KAAK,CAAC;AAe1C,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACtC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,OAAO,EAAsC;IAClE,MAAM,UAAU,GAA2B;QACzC,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,OAAO;KACjB,CAAC;IAEF,MAAM,UAAU,GAA2B;QACzC,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO;QAC/B,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,wBAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EACpE,MAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,yBAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAC/E,OAAO,CAAC,KAAK,IAAI,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,mBAAI,OAAO,CAAC,KAAK,SAAS,IAC1D,EACN,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,OAAO,CAAC,OAAO,GAAQ,IACxC,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAkB;IAClE,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,QAAQ,EAAE,CAAC,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,aAEX,MAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS,EAAC,YAAY,EAAE,CAAC,aAC7D,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,2BAAY,EACtC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uDAAyC,IACvD,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAC,QAAQ,aACvD,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAChC,KAAC,WAAW,IAAc,OAAO,EAAE,GAAG,IAApB,GAAG,CAAC,EAAE,CAAkB,CAC3C,CAAC,EACD,YAAY,IAAI,CACf,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,qCAAuB,GACvC,CACP,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface HeaderProps {
2
+ projectName: string;
3
+ agentCount: number;
4
+ provider: string;
5
+ status: "ready" | "running" | "error";
6
+ }
7
+ export declare function Header({ projectName, agentCount, provider, status }: HeaderProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;CACvC;AAED,wBAAgB,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,2CA0ChF"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ export function Header({ projectName, agentCount, provider, status }) {
4
+ const statusColors = {
5
+ ready: "green",
6
+ running: "yellow",
7
+ error: "red",
8
+ };
9
+ const statusText = {
10
+ ready: "READY",
11
+ running: "RUNNING",
12
+ error: "ERROR",
13
+ };
14
+ const statusIcon = status === "running" ? "▶" : status === "error" ? "✗" : "●";
15
+ return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", alignItems: "center", paddingX: 1, borderStyle: "single", borderColor: "gray", width: "100%", children: [_jsxs(Box, { flexDirection: "row", alignItems: "center", children: [_jsx(Text, { color: "#f97316", bold: true, children: "\u25A0" }), _jsx(Text, { color: "white", bold: true, children: " RAX-FLOW" }), _jsx(Text, { color: "gray", children: " HUB" })] }), _jsxs(Box, { flexDirection: "row", alignItems: "center", gap: 2, children: [_jsx(Text, { color: "gray", children: "Project:" }), _jsx(Text, { color: "cyan", children: projectName }), _jsx(Text, { color: "gray", children: "\u2502" }), _jsx(Text, { color: "gray", children: "Agents:" }), _jsxs(Text, { color: "green", children: [agentCount, "/12"] }), _jsx(Text, { color: "gray", children: "\u2502" }), _jsxs(Text, { color: "gray", children: ["[", provider, "]"] }), _jsxs(Text, { color: statusColors[status], children: [" ", statusIcon, " ", statusText[status]] })] })] }));
16
+ }
17
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,UAAU,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAe;IAC/E,MAAM,YAAY,GAAG;QACnB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,KAAK;KACb,CAAC;IAEF,MAAM,UAAU,GAAG;QACjB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;KACf,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAE/E,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,cAAc,EAAC,eAAe,EAC9B,UAAU,EAAC,QAAQ,EACnB,QAAQ,EAAE,CAAC,EACX,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,KAAK,EAAC,MAAM,aAEZ,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,aAC1C,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,6BAAS,EACnC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,gCAAiB,EACzC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,qBAAY,IAC1B,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,aACjD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAgB,EAClC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,WAAW,GAAQ,EACvC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBAAS,EAC3B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAe,EACjC,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,UAAU,WAAW,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBAAS,EAC3B,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAG,QAAQ,SAAS,EACtC,MAAC,IAAI,IAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,kBAAI,UAAU,OAAG,UAAU,CAAC,MAAM,CAAC,IAAQ,IACxE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface InputBarProps {
2
+ onSubmit: (input: string) => void;
3
+ suggestions: string[];
4
+ isProcessing: boolean;
5
+ }
6
+ export declare function InputBar({ onSubmit, suggestions, isProcessing }: InputBarProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=InputBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/InputBar.tsx"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,aAAa,2CA4C9E"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Text } from "ink";
4
+ import TextInput from "ink-text-input";
5
+ export function InputBar({ onSubmit, suggestions, isProcessing }) {
6
+ const [input, setInput] = useState("");
7
+ const handleSubmit = (value) => {
8
+ if (value.trim()) {
9
+ onSubmit(value);
10
+ setInput("");
11
+ }
12
+ };
13
+ const filteredSuggestions = suggestions.filter((s) => s.toLowerCase().startsWith(input.toLowerCase())).slice(0, 5);
14
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "gray", paddingX: 1, children: [input.startsWith("/") && filteredSuggestions.length > 0 && (_jsx(Box, { flexDirection: "row", marginBottom: 1, children: filteredSuggestions.map((s) => (_jsx(Box, { marginRight: 2, children: _jsx(Text, { color: "cyan", children: s }) }, s))) })), _jsxs(Box, { flexDirection: "row", alignItems: "center", children: [_jsx(Text, { color: "#f97316", bold: true, children: "\u25B6" }), _jsx(Box, { marginLeft: 1, flexGrow: 1, children: _jsx(TextInput, { value: input, onChange: setInput, onSubmit: handleSubmit, placeholder: "Tapez /help ou votre prompt...", showCursor: true }) }), isProcessing && _jsx(Text, { color: "yellow", children: " \u25CF" })] }), _jsxs(Box, { flexDirection: "row", marginTop: 1, children: [_jsx(Text, { color: "gray", dimColor: true, children: "[Ctrl+C] Quitter" }), _jsx(Text, { color: "gray", dimColor: true, children: " \u2502 [/cmd] Commandes" })] })] }));
15
+ }
16
+ //# sourceMappingURL=InputBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../../src/tui/components/InputBar.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAY,MAAM,KAAK,CAAC;AAC1C,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAQvC,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAiB;IAC7E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;QACrC,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACnD,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAChD,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEd,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,aAC5E,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1D,KAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,YAAY,EAAE,CAAC,YACrC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B,KAAC,GAAG,IAAS,WAAW,EAAE,CAAC,YACzB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,GAAQ,IADrB,CAAC,CAEL,CACP,CAAC,GACE,CACP,EACD,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,aAC1C,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,6BAAS,EACnC,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YAC7B,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAC,gCAAgC,EAC5C,UAAU,EAAE,IAAI,GAChB,GACE,EACL,YAAY,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,wBAAU,IAC3C,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,SAAS,EAAE,CAAC,aACnC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,uCAAwB,EACnD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,+CAA2B,IAClD,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ interface Agent {
2
+ name: string;
3
+ role: string;
4
+ status: "idle" | "running" | "queued" | "done";
5
+ provider: string;
6
+ }
7
+ interface Provider {
8
+ name: string;
9
+ status: "active" | "idle";
10
+ latency: number;
11
+ }
12
+ interface StatusPanelProps {
13
+ agents: Agent[];
14
+ providers: Provider[];
15
+ fitness: number;
16
+ currentWorkflow: string | null;
17
+ }
18
+ export declare function StatusPanel({ agents, providers, fitness, currentWorkflow }: StatusPanelProps): import("react/jsx-runtime").JSX.Element;
19
+ export {};
20
+ //# sourceMappingURL=StatusPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusPanel.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatusPanel.tsx"],"names":[],"mappings":"AAGA,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAgCD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,gBAAgB,2CA+B5F"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ const statusIcons = {
4
+ idle: { icon: "○", color: "gray" },
5
+ running: { icon: "▶", color: "yellow" },
6
+ queued: { icon: "◐", color: "cyan" },
7
+ done: { icon: "●", color: "green" },
8
+ };
9
+ function AgentRow({ agent, key }) {
10
+ const { icon, color } = statusIcons[agent.status];
11
+ return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Text, { color: color, children: icon }), _jsx(Text, { color: "white", children: agent.name.slice(0, 12).padEnd(12) }), _jsxs(Text, { color: "gray", children: ["[", agent.provider, "]"] })] }, key));
12
+ }
13
+ function ProviderRow({ provider, key }) {
14
+ return (_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Text, { color: provider.status === "active" ? "green" : "gray", children: provider.status === "active" ? "●" : "○" }), _jsx(Text, { color: "white", children: provider.name }), _jsx(Text, { color: "gray", children: provider.latency > 0 ? `${provider.latency}ms` : "--" })] }, key));
15
+ }
16
+ export function StatusPanel({ agents, providers, fitness, currentWorkflow }) {
17
+ const fitnessColor = fitness >= 0.9 ? "green" : fitness >= 0.7 ? "yellow" : "red";
18
+ return (_jsxs(Box, { flexDirection: "column", width: 35, borderStyle: "single", borderColor: "gray", children: [_jsx(Box, { borderStyle: "single", borderColor: "#f97316", marginBottom: 1, children: _jsx(Text, { color: "#f97316", bold: true, children: "STATUS" }) }), _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Text, { color: "gray", bold: true, children: "WORKFLOW" }), _jsx(Text, { color: "white", children: currentWorkflow || "Aucun" }), _jsx(Text, { color: "gray", children: "Fitness: " }), _jsx(Text, { color: fitnessColor, bold: true, children: fitness.toFixed(2) })] }), _jsxs(Box, { flexDirection: "column", paddingX: 1, marginTop: 1, children: [_jsx(Text, { color: "gray", bold: true, children: "AGENTS" }), agents.slice(0, 6).map((agent) => (_jsx(AgentRow, { agent: agent }, agent.name)))] }), _jsxs(Box, { flexDirection: "column", paddingX: 1, marginTop: 1, children: [_jsx(Text, { color: "gray", bold: true, children: "PROVIDERS" }), providers.map((provider) => (_jsx(ProviderRow, { provider: provider }, provider.name)))] })] }));
19
+ }
20
+ //# sourceMappingURL=StatusPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusPanel.js","sourceRoot":"","sources":["../../../src/tui/components/StatusPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ interface Message {
2
+ id: string;
3
+ type: "user" | "system" | "agent" | "error" | "success";
4
+ content: string;
5
+ timestamp: Date;
6
+ agent?: string;
7
+ }
8
+ interface Agent {
9
+ name: string;
10
+ role: string;
11
+ status: "idle" | "running" | "queued" | "done";
12
+ provider: string;
13
+ }
14
+ interface Provider {
15
+ name: string;
16
+ status: "active" | "idle";
17
+ latency: number;
18
+ }
19
+ interface AppState {
20
+ projectName: string;
21
+ agentCount: number;
22
+ provider: string;
23
+ status: "ready" | "running" | "error";
24
+ messages: Message[];
25
+ agents: Agent[];
26
+ providers: Provider[];
27
+ fitness: number;
28
+ currentWorkflow: string | null;
29
+ suggestions: string[];
30
+ isProcessing: boolean;
31
+ }
32
+ export declare function useAppState(): {
33
+ state: AppState;
34
+ dispatch: import("react").Dispatch<import("react").SetStateAction<AppState>>;
35
+ processCommand: (input: string) => void;
36
+ };
37
+ export {};
38
+ //# sourceMappingURL=useAppState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppState.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useAppState.ts"],"names":[],"mappings":"AAEA,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,QAAQ;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AA6BD,wBAAgB,WAAW;;;4BAgCkB,MAAM;EAuElD"}
@@ -0,0 +1,127 @@
1
+ import { useState, useCallback } from "react";
2
+ const COMMAND_SUGGESTIONS = [
3
+ "/run", "/status", "/agents", "/providers", "/workflows",
4
+ "/logs", "/metrics", "/memory", "/help", "/exit",
5
+ ];
6
+ const DEFAULT_AGENTS = [
7
+ { name: "IntentClassifier", role: "Classify intent", status: "idle", provider: "H" },
8
+ { name: "TaskPlanner", role: "Decompose tasks", status: "idle", provider: "H" },
9
+ { name: "SpecAgent", role: "Write specs", status: "idle", provider: "H" },
10
+ { name: "CodeGenerator", role: "Generate code", status: "idle", provider: "H" },
11
+ { name: "TestAgent", role: "Run tests", status: "idle", provider: "H" },
12
+ { name: "FixAgent", role: "Fix issues", status: "idle", provider: "H" },
13
+ { name: "MutationAgent", role: "Evolve workflow", status: "idle", provider: "H" },
14
+ { name: "ValidatorAgent", role: "Validate outputs", status: "idle", provider: "H" },
15
+ ];
16
+ const DEFAULT_PROVIDERS = [
17
+ { name: "Host-Native", status: "active", latency: 12 },
18
+ { name: "Claude Code", status: "active", latency: 8 },
19
+ { name: "OpenCode", status: "idle", latency: 0 },
20
+ { name: "Anthropic", status: "idle", latency: 0 },
21
+ ];
22
+ function generateId() {
23
+ return Math.random().toString(36).slice(2, 9);
24
+ }
25
+ export function useAppState() {
26
+ const [state, setState] = useState({
27
+ projectName: process.cwd().split("/").pop() || "project",
28
+ agentCount: 12,
29
+ provider: "HOST-NATIVE",
30
+ status: "ready",
31
+ messages: [
32
+ {
33
+ id: generateId(),
34
+ type: "system",
35
+ content: "■ RAX-FLOW HUB prêt. Tapez votre prompt ou /help pour les commandes.",
36
+ timestamp: new Date(),
37
+ },
38
+ ],
39
+ agents: DEFAULT_AGENTS,
40
+ providers: DEFAULT_PROVIDERS,
41
+ fitness: 0.87,
42
+ currentWorkflow: null,
43
+ suggestions: COMMAND_SUGGESTIONS,
44
+ isProcessing: false,
45
+ });
46
+ const addMessage = useCallback((type, content, agent) => {
47
+ setState((prev) => ({
48
+ ...prev,
49
+ messages: [
50
+ ...prev.messages,
51
+ { id: generateId(), type, content, timestamp: new Date(), agent },
52
+ ],
53
+ }));
54
+ }, []);
55
+ const processCommand = useCallback((input) => {
56
+ if (input.startsWith("/")) {
57
+ const cmd = input.slice(1).toLowerCase();
58
+ switch (cmd) {
59
+ case "help":
60
+ addMessage("system", `Commandes: /run /status /agents /providers /workflows /logs /metrics /memory /exit`);
61
+ break;
62
+ case "status":
63
+ addMessage("system", `Orchestrator: ● ACTIVE | Fitness: ${state.fitness.toFixed(2)} | Agents: ${state.agents.filter((a) => a.status !== "idle").length}/8 actifs`);
64
+ break;
65
+ case "agents":
66
+ const agentList = state.agents.map((a) => `${a.status === "running" ? "▶" : "○"} ${a.name} [${a.provider}]`).join("\n");
67
+ addMessage("system", agentList);
68
+ break;
69
+ case "providers":
70
+ const providerList = state.providers.map((p) => `${p.status === "active" ? "●" : "○"} ${p.name} ${p.latency > 0 ? `(${p.latency}ms)` : ""}`).join("\n");
71
+ addMessage("system", providerList);
72
+ break;
73
+ case "exit":
74
+ case "quit":
75
+ addMessage("system", "À bientôt !");
76
+ break;
77
+ default:
78
+ if (cmd.startsWith("run ")) {
79
+ const prompt = cmd.slice(4);
80
+ setState((prev) => ({ ...prev, status: "running", isProcessing: true }));
81
+ addMessage("user", prompt);
82
+ addMessage("agent", "Analyse de l'intent...", "IntentClassifier");
83
+ setTimeout(() => {
84
+ addMessage("agent", `Intent détecté: code_generation`, "IntentClassifier");
85
+ addMessage("agent", "Décomposition en tâches...", "TaskPlanner");
86
+ setState((prev) => ({
87
+ ...prev,
88
+ status: "ready",
89
+ isProcessing: false,
90
+ fitness: Math.min(prev.fitness + 0.02, 0.99),
91
+ currentWorkflow: prompt,
92
+ agents: prev.agents.map((a, i) => ({
93
+ ...a,
94
+ status: i === 0 ? "done" : i === 1 ? "running" : "idle",
95
+ })),
96
+ }));
97
+ }, 1500);
98
+ }
99
+ else {
100
+ addMessage("error", `Commande inconnue: /${cmd}. Tapez /help pour l'aide.`);
101
+ }
102
+ }
103
+ }
104
+ else {
105
+ setState((prev) => ({ ...prev, status: "running", isProcessing: true }));
106
+ addMessage("user", input);
107
+ addMessage("agent", "Analyse de l'intent...", "IntentClassifier");
108
+ setTimeout(() => {
109
+ addMessage("agent", `Intent détecté: code_generation`, "IntentClassifier");
110
+ addMessage("agent", "Exécution du workflow...", "Orchestrator");
111
+ setState((prev) => ({
112
+ ...prev,
113
+ status: "ready",
114
+ isProcessing: false,
115
+ fitness: Math.min(prev.fitness + 0.01, 0.99),
116
+ currentWorkflow: input,
117
+ }));
118
+ }, 2000);
119
+ }
120
+ }, [state, addMessage]);
121
+ return {
122
+ state,
123
+ dispatch: setState,
124
+ processCommand,
125
+ };
126
+ }
127
+ //# sourceMappingURL=useAppState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppState.js","sourceRoot":"","sources":["../../../src/tui/hooks/useAppState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function startTUI(): import("ink").Instance;
2
+ export { App } from "./App.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,2BAEvB;AAED,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { render } from "ink";
2
+ import React from "react";
3
+ import { App } from "./App.js";
4
+ export function startTUI() {
5
+ return render(React.createElement(App));
6
+ }
7
+ export { App } from "./App.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,28 +1,34 @@
1
1
  {
2
2
  "name": "rax-flow",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
8
8
  "rax-flow": "dist/bin.js"
9
9
  },
10
- "scripts": {
11
- "build": "tsc -p tsconfig.json",
12
- "dev": "tsx src/bin.ts",
13
- "test": "vitest run --passWithNoTests",
14
- "typecheck": "tsc -p tsconfig.json --noEmit"
15
- },
16
10
  "dependencies": {
17
- "rax-flow-agents": "0.1.4",
18
- "rax-flow-core": "0.1.3",
19
- "rax-flow-providers": "0.1.3",
11
+ "ink": "^6.8.0",
12
+ "ink-box": "^2.0.0",
13
+ "ink-spinner": "^5.0.0",
14
+ "ink-text-input": "^6.0.0",
15
+ "rax-flow-agents": "0.1.5",
16
+ "rax-flow-core": "0.1.4",
17
+ "rax-flow-providers": "0.1.4",
18
+ "react": "19.2.3",
20
19
  "ws": "^8.19.0"
21
20
  },
22
21
  "publishConfig": {
23
22
  "access": "public"
24
23
  },
25
24
  "devDependencies": {
25
+ "@types/react": "^19.2.14",
26
26
  "@types/ws": "^8.18.1"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.json",
30
+ "dev": "tsx src/bin.ts",
31
+ "test": "vitest run --passWithNoTests",
32
+ "typecheck": "tsc -p tsconfig.json --noEmit"
27
33
  }
28
- }
34
+ }
package/src/bin.ts CHANGED
@@ -7,6 +7,7 @@ import { runDoctor } from "./doctor.js";
7
7
  import { runInitHost } from "./init-host.js";
8
8
  import { runWorkflow } from "./run.js";
9
9
  import { runDashboard } from "./dashboard.js";
10
+ import { startHubOneShot } from "./hub/index.js";
10
11
 
11
12
  function getFlag(args: string[], flag: string): string | undefined {
12
13
  const index = args.indexOf(flag);
@@ -18,9 +19,34 @@ async function main() {
18
19
  const args = process.argv.slice(2);
19
20
  const command = args[0];
20
21
 
21
- if (!command || command === "--help" || command === "-h") {
22
- console.log("Usage: rax-flow <command>");
23
- console.log("Commands:");
22
+ // Mode hub interactif (défaut) - sans arguments ou avec 'hub'
23
+ if (!command || command === "hub") {
24
+ const { startTUI } = await import("./tui/index.js");
25
+ startTUI();
26
+ return;
27
+ }
28
+
29
+ // Mode one-shot
30
+ if (command === "--run") {
31
+ const prompt = getFlag(args, "--run");
32
+ if (!prompt) {
33
+ console.error("Missing --run <prompt>");
34
+ process.exit(1);
35
+ }
36
+ await startHubOneShot("run", [prompt, ...args.slice(1)]);
37
+ return;
38
+ }
39
+
40
+ // Help pour le hub
41
+ if (command === "--help" || command === "-h") {
42
+ console.log("Usage: rax-flow [command]");
43
+ console.log("");
44
+ console.log("Modes:");
45
+ console.log(" (no args) Launch interactive hub (default)");
46
+ console.log(" hub Launch interactive hub");
47
+ console.log(" --run <prompt> One-shot mode (execute and exit)");
48
+ console.log("");
49
+ console.log("Legacy Commands:");
24
50
  console.log(" install [--ui] Setup project, providers and .raxrc");
25
51
  console.log(" run --prompt <text> [--workflow path] [--json] [--stream] [--max-parallel N] [--no-cache-persist]");
26
52
  console.log(" Execute workflow");
@@ -0,0 +1,84 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { registerCommand, getCommandRegistry } from "../commands/index.js";
3
+ import { CommandDefinition } from "../types.js";
4
+
5
+ describe("Command Registry", () => {
6
+ beforeEach(() => {
7
+ // Clear the registry before each test
8
+ const registry = getCommandRegistry();
9
+ registry.clear();
10
+ });
11
+
12
+ describe("registerCommand", () => {
13
+ it("should register a command", () => {
14
+ const cmd: CommandDefinition = {
15
+ name: "test",
16
+ description: "Test command",
17
+ handler: async () => {},
18
+ };
19
+
20
+ registerCommand(cmd);
21
+ const registry = getCommandRegistry();
22
+ expect(registry.has("test")).toBe(true);
23
+ });
24
+
25
+ it("should register command with aliases", () => {
26
+ const cmd: CommandDefinition = {
27
+ name: "status",
28
+ description: "Show status",
29
+ handler: async () => {},
30
+ aliases: ["st", "s"],
31
+ };
32
+
33
+ registerCommand(cmd);
34
+ const registry = getCommandRegistry();
35
+ expect(registry.has("status")).toBe(true);
36
+ expect(registry.has("st")).toBe(true);
37
+ expect(registry.has("s")).toBe(true);
38
+ });
39
+
40
+ it("should allow multiple commands to be registered", () => {
41
+ registerCommand({
42
+ name: "cmd1",
43
+ description: "Command 1",
44
+ handler: async () => {},
45
+ });
46
+
47
+ registerCommand({
48
+ name: "cmd2",
49
+ description: "Command 2",
50
+ handler: async () => {},
51
+ });
52
+
53
+ const registry = getCommandRegistry();
54
+ expect(registry.size).toBe(2);
55
+ });
56
+ });
57
+
58
+ describe("getCommandRegistry", () => {
59
+ it("should return the same registry instance", () => {
60
+ const registry1 = getCommandRegistry();
61
+ const registry2 = getCommandRegistry();
62
+ expect(registry1).toBe(registry2);
63
+ });
64
+
65
+ it("should allow retrieving registered commands", async () => {
66
+ const mockHandler = async () => {
67
+ // Mock handler that does nothing
68
+ };
69
+
70
+ registerCommand({
71
+ name: "mock",
72
+ description: "Mock command",
73
+ handler: mockHandler,
74
+ });
75
+
76
+ const registry = getCommandRegistry();
77
+ const cmd = registry.get("mock");
78
+ expect(cmd).toBeDefined();
79
+ expect(cmd?.name).toBe("mock");
80
+ expect(cmd?.description).toBe("Mock command");
81
+ expect(cmd?.handler).toBe(mockHandler);
82
+ });
83
+ });
84
+ });