@ranker/raxflow 0.2.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 (425) hide show
  1. package/dashboard/index.html +420 -0
  2. package/dist/benchmark.d.ts.map +1 -0
  3. package/dist/benchmark.js +123 -0
  4. package/dist/benchmark.js.map +1 -0
  5. package/dist/bin.d.ts.map +1 -0
  6. package/dist/bin.js +141 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/bootstrap.d.ts.map +1 -0
  9. package/dist/bootstrap.js +22 -0
  10. package/dist/bootstrap.js.map +1 -0
  11. package/dist/bridge-adapter-templates.d.ts.map +1 -0
  12. package/dist/bridge-adapter-templates.js +185 -0
  13. package/dist/bridge-adapter-templates.js.map +1 -0
  14. package/dist/bridge-test.d.ts.map +1 -0
  15. package/dist/bridge-test.js +89 -0
  16. package/dist/bridge-test.js.map +1 -0
  17. package/dist/dashboard.d.ts.map +1 -0
  18. package/dist/dashboard.js +49 -0
  19. package/dist/dashboard.js.map +1 -0
  20. package/dist/doctor.d.ts.map +1 -0
  21. package/dist/doctor.js +70 -0
  22. package/dist/doctor.js.map +1 -0
  23. package/dist/evolve.d.ts.map +1 -0
  24. package/dist/evolve.js +48 -0
  25. package/dist/evolve.js.map +1 -0
  26. package/dist/host-init-templates.d.ts.map +1 -0
  27. package/dist/host-init-templates.js +119 -0
  28. package/dist/host-init-templates.js.map +1 -0
  29. package/dist/hub/__tests__/commands.test.d.ts.map +1 -0
  30. package/dist/hub/__tests__/commands.test.js +72 -0
  31. package/dist/hub/__tests__/commands.test.js.map +1 -0
  32. package/dist/hub/__tests__/history.test.d.ts.map +1 -0
  33. package/dist/hub/__tests__/history.test.js +119 -0
  34. package/dist/hub/__tests__/history.test.js.map +1 -0
  35. package/dist/hub/__tests__/parser.test.d.ts.map +1 -0
  36. package/dist/hub/__tests__/parser.test.js +92 -0
  37. package/dist/hub/__tests__/parser.test.js.map +1 -0
  38. package/dist/hub/chat/ChatApp.d.ts +2 -0
  39. package/dist/hub/chat/ChatApp.d.ts.map +1 -0
  40. package/dist/hub/chat/ChatApp.js +146 -0
  41. package/dist/hub/chat/ChatApp.js.map +1 -0
  42. package/dist/hub/chat/components/ChatInput.d.ts +9 -0
  43. package/dist/hub/chat/components/ChatInput.d.ts.map +1 -0
  44. package/dist/hub/chat/components/ChatInput.js +19 -0
  45. package/dist/hub/chat/components/ChatInput.js.map +1 -0
  46. package/dist/hub/chat/components/MessageList.d.ts +7 -0
  47. package/dist/hub/chat/components/MessageList.d.ts.map +1 -0
  48. package/dist/hub/chat/components/MessageList.js +6 -0
  49. package/dist/hub/chat/components/MessageList.js.map +1 -0
  50. package/dist/hub/chat/context.d.ts.map +1 -0
  51. package/dist/hub/chat/context.js +42 -0
  52. package/dist/hub/chat/context.js.map +1 -0
  53. package/dist/hub/chat/hooks/useChatHistory.d.ts +7 -0
  54. package/dist/hub/chat/hooks/useChatHistory.d.ts.map +1 -0
  55. package/dist/hub/chat/hooks/useChatHistory.js +31 -0
  56. package/dist/hub/chat/hooks/useChatHistory.js.map +1 -0
  57. package/dist/hub/chat/index.d.ts.map +1 -0
  58. package/dist/hub/chat/index.js +7 -0
  59. package/dist/hub/chat/index.js.map +1 -0
  60. package/dist/hub/chat/intent-parser.d.ts.map +1 -0
  61. package/dist/hub/chat/intent-parser.js +48 -0
  62. package/dist/hub/chat/intent-parser.js.map +1 -0
  63. package/dist/hub/chat/types.d.ts.map +1 -0
  64. package/dist/hub/chat/types.js +2 -0
  65. package/dist/hub/chat/types.js.map +1 -0
  66. package/dist/hub/commands/agents.d.ts.map +1 -0
  67. package/dist/hub/commands/agents.js +36 -0
  68. package/dist/hub/commands/agents.js.map +1 -0
  69. package/dist/hub/commands/index.d.ts.map +1 -0
  70. package/dist/hub/commands/index.js +123 -0
  71. package/dist/hub/commands/index.js.map +1 -0
  72. package/dist/hub/commands/logs.d.ts.map +1 -0
  73. package/dist/hub/commands/logs.js +53 -0
  74. package/dist/hub/commands/logs.js.map +1 -0
  75. package/dist/hub/commands/memory.d.ts.map +1 -0
  76. package/dist/hub/commands/memory.js +40 -0
  77. package/dist/hub/commands/memory.js.map +1 -0
  78. package/dist/hub/commands/metrics.d.ts.map +1 -0
  79. package/dist/hub/commands/metrics.js +35 -0
  80. package/dist/hub/commands/metrics.js.map +1 -0
  81. package/dist/hub/commands/providers.d.ts.map +1 -0
  82. package/dist/hub/commands/providers.js +26 -0
  83. package/dist/hub/commands/providers.js.map +1 -0
  84. package/dist/hub/commands/run.d.ts.map +1 -0
  85. package/dist/hub/commands/run.js +31 -0
  86. package/dist/hub/commands/run.js.map +1 -0
  87. package/dist/hub/commands/status.d.ts.map +1 -0
  88. package/dist/hub/commands/status.js +61 -0
  89. package/dist/hub/commands/status.js.map +1 -0
  90. package/dist/hub/commands/workflows.d.ts.map +1 -0
  91. package/dist/hub/commands/workflows.js +45 -0
  92. package/dist/hub/commands/workflows.js.map +1 -0
  93. package/dist/hub/config-loader.d.ts.map +1 -0
  94. package/dist/hub/config-loader.js +27 -0
  95. package/dist/hub/config-loader.js.map +1 -0
  96. package/dist/hub/event-listener.d.ts +6 -0
  97. package/dist/hub/event-listener.d.ts.map +1 -0
  98. package/dist/hub/event-listener.js +12 -0
  99. package/dist/hub/event-listener.js.map +1 -0
  100. package/dist/hub/history.d.ts.map +1 -0
  101. package/dist/hub/history.js +59 -0
  102. package/dist/hub/history.js.map +1 -0
  103. package/dist/hub/index.d.ts.map +1 -0
  104. package/dist/hub/index.js +114 -0
  105. package/dist/hub/index.js.map +1 -0
  106. package/dist/hub/parser.d.ts.map +1 -0
  107. package/dist/hub/parser.js +98 -0
  108. package/dist/hub/parser.js.map +1 -0
  109. package/dist/hub/styles/borders.d.ts.map +1 -0
  110. package/dist/hub/styles/borders.js +64 -0
  111. package/dist/hub/styles/borders.js.map +1 -0
  112. package/dist/hub/styles/colors.d.ts.map +1 -0
  113. package/dist/hub/styles/colors.js +115 -0
  114. package/dist/hub/styles/colors.js.map +1 -0
  115. package/dist/hub/styles/typography.d.ts.map +1 -0
  116. package/dist/hub/styles/typography.js +60 -0
  117. package/dist/hub/styles/typography.js.map +1 -0
  118. package/dist/hub/tui/App.d.ts +2 -0
  119. package/dist/hub/tui/App.d.ts.map +1 -0
  120. package/dist/hub/tui/App.js +53 -0
  121. package/dist/hub/tui/App.js.map +1 -0
  122. package/dist/hub/tui/components/AgentQueue.d.ts +6 -0
  123. package/dist/hub/tui/components/AgentQueue.d.ts.map +1 -0
  124. package/dist/hub/tui/components/AgentQueue.js +20 -0
  125. package/dist/hub/tui/components/AgentQueue.js.map +1 -0
  126. package/dist/hub/tui/components/DAGPanel.d.ts +16 -0
  127. package/dist/hub/tui/components/DAGPanel.d.ts.map +1 -0
  128. package/dist/hub/tui/components/DAGPanel.js +51 -0
  129. package/dist/hub/tui/components/DAGPanel.js.map +1 -0
  130. package/dist/hub/tui/components/Header.d.ts +7 -0
  131. package/dist/hub/tui/components/Header.d.ts.map +1 -0
  132. package/dist/hub/tui/components/Header.js +17 -0
  133. package/dist/hub/tui/components/Header.js.map +1 -0
  134. package/dist/hub/tui/components/LogsPanel.d.ts +6 -0
  135. package/dist/hub/tui/components/LogsPanel.d.ts.map +1 -0
  136. package/dist/hub/tui/components/LogsPanel.js +26 -0
  137. package/dist/hub/tui/components/LogsPanel.js.map +1 -0
  138. package/dist/hub/tui/components/StatusBar.d.ts +8 -0
  139. package/dist/hub/tui/components/StatusBar.d.ts.map +1 -0
  140. package/dist/hub/tui/components/StatusBar.js +7 -0
  141. package/dist/hub/tui/components/StatusBar.js.map +1 -0
  142. package/dist/hub/tui/hooks/useEvents.d.ts +2 -0
  143. package/dist/hub/tui/hooks/useEvents.d.ts.map +1 -0
  144. package/dist/hub/tui/hooks/useEvents.js +13 -0
  145. package/dist/hub/tui/hooks/useEvents.js.map +1 -0
  146. package/dist/hub/tui/index.d.ts.map +1 -0
  147. package/dist/hub/tui/index.js +7 -0
  148. package/dist/hub/tui/index.js.map +1 -0
  149. package/dist/hub/tui/types.d.ts.map +1 -0
  150. package/dist/hub/tui/types.js +2 -0
  151. package/dist/hub/tui/types.js.map +1 -0
  152. package/dist/hub/types.d.ts.map +1 -0
  153. package/dist/hub/types.js +2 -0
  154. package/dist/hub/types.js.map +1 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +11 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/init-host.d.ts.map +1 -0
  159. package/dist/init-host.js +232 -0
  160. package/dist/init-host.js.map +1 -0
  161. package/dist/install.d.ts.map +1 -0
  162. package/dist/install.js +99 -0
  163. package/dist/install.js.map +1 -0
  164. package/dist/run.d.ts.map +1 -0
  165. package/dist/run.js +238 -0
  166. package/dist/run.js.map +1 -0
  167. package/dist/setup/components/ApiKeyInput.d.ts +25 -0
  168. package/dist/setup/components/ApiKeyInput.d.ts.map +1 -0
  169. package/dist/setup/components/ApiKeyInput.js +54 -0
  170. package/dist/setup/components/ApiKeyInput.js.map +1 -0
  171. package/dist/setup/components/AsciiBanner.d.ts +22 -0
  172. package/dist/setup/components/AsciiBanner.d.ts.map +1 -0
  173. package/dist/setup/components/AsciiBanner.js +55 -0
  174. package/dist/setup/components/AsciiBanner.js.map +1 -0
  175. package/dist/setup/components/CliDetector.d.ts +17 -0
  176. package/dist/setup/components/CliDetector.d.ts.map +1 -0
  177. package/dist/setup/components/CliDetector.js +79 -0
  178. package/dist/setup/components/CliDetector.js.map +1 -0
  179. package/dist/setup/components/ModeSelector.d.ts +8 -0
  180. package/dist/setup/components/ModeSelector.d.ts.map +1 -0
  181. package/dist/setup/components/ModeSelector.js +76 -0
  182. package/dist/setup/components/ModeSelector.js.map +1 -0
  183. package/dist/setup/components/ProviderSelector.d.ts +18 -0
  184. package/dist/setup/components/ProviderSelector.d.ts.map +1 -0
  185. package/dist/setup/components/ProviderSelector.js +97 -0
  186. package/dist/setup/components/ProviderSelector.js.map +1 -0
  187. package/dist/setup/components/SetupWizard.d.ts +2 -0
  188. package/dist/setup/components/SetupWizard.d.ts.map +1 -0
  189. package/dist/setup/components/SetupWizard.js +212 -0
  190. package/dist/setup/components/SetupWizard.js.map +1 -0
  191. package/dist/setup/components/StepIndicator.d.ts +13 -0
  192. package/dist/setup/components/StepIndicator.d.ts.map +1 -0
  193. package/dist/setup/components/StepIndicator.js +18 -0
  194. package/dist/setup/components/StepIndicator.js.map +1 -0
  195. package/dist/setup/components/SuccessScreen.d.ts +18 -0
  196. package/dist/setup/components/SuccessScreen.d.ts.map +1 -0
  197. package/dist/setup/components/SuccessScreen.js +38 -0
  198. package/dist/setup/components/SuccessScreen.js.map +1 -0
  199. package/dist/setup/index.d.ts +12 -0
  200. package/dist/setup/index.d.ts.map +1 -0
  201. package/dist/setup/index.js +29 -0
  202. package/dist/setup/index.js.map +1 -0
  203. package/dist/setup/utils/cli-detection.d.ts +12 -0
  204. package/dist/setup/utils/cli-detection.d.ts.map +1 -0
  205. package/dist/setup/utils/cli-detection.js +83 -0
  206. package/dist/setup/utils/cli-detection.js.map +1 -0
  207. package/dist/setup/utils/config-writer.d.ts +43 -0
  208. package/dist/setup/utils/config-writer.d.ts.map +1 -0
  209. package/dist/setup/utils/config-writer.js +180 -0
  210. package/dist/setup/utils/config-writer.js.map +1 -0
  211. package/dist/styles.d.ts.map +1 -0
  212. package/dist/styles.js +12 -0
  213. package/dist/styles.js.map +1 -0
  214. package/dist/tui/App.d.ts +3 -0
  215. package/dist/tui/App.d.ts.map +1 -0
  216. package/dist/tui/App.js +131 -0
  217. package/dist/tui/App.js.map +1 -0
  218. package/dist/tui/components/AgentStateIcon.d.ts +18 -0
  219. package/dist/tui/components/AgentStateIcon.d.ts.map +1 -0
  220. package/dist/tui/components/AgentStateIcon.js +57 -0
  221. package/dist/tui/components/AgentStateIcon.js.map +1 -0
  222. package/dist/tui/components/AnimatedBranch.d.ts +39 -0
  223. package/dist/tui/components/AnimatedBranch.d.ts.map +1 -0
  224. package/dist/tui/components/AnimatedBranch.js +64 -0
  225. package/dist/tui/components/AnimatedBranch.js.map +1 -0
  226. package/dist/tui/components/ChatPanel.d.ts +16 -0
  227. package/dist/tui/components/ChatPanel.d.ts.map +1 -0
  228. package/dist/tui/components/ChatPanel.js +50 -0
  229. package/dist/tui/components/ChatPanel.js.map +1 -0
  230. package/dist/tui/components/DAGPanel.d.ts +36 -0
  231. package/dist/tui/components/DAGPanel.d.ts.map +1 -0
  232. package/dist/tui/components/DAGPanel.js +51 -0
  233. package/dist/tui/components/DAGPanel.js.map +1 -0
  234. package/dist/tui/components/ExecutionTimeline.d.ts +34 -0
  235. package/dist/tui/components/ExecutionTimeline.d.ts.map +1 -0
  236. package/dist/tui/components/ExecutionTimeline.js +67 -0
  237. package/dist/tui/components/ExecutionTimeline.js.map +1 -0
  238. package/dist/tui/components/Header.d.ts +12 -0
  239. package/dist/tui/components/Header.d.ts.map +1 -0
  240. package/dist/tui/components/Header.js +32 -0
  241. package/dist/tui/components/Header.js.map +1 -0
  242. package/dist/tui/components/HelpOverlay.d.ts +7 -0
  243. package/dist/tui/components/HelpOverlay.d.ts.map +1 -0
  244. package/dist/tui/components/HelpOverlay.js +60 -0
  245. package/dist/tui/components/HelpOverlay.js.map +1 -0
  246. package/dist/tui/components/InputBar.d.ts +10 -0
  247. package/dist/tui/components/InputBar.d.ts.map +1 -0
  248. package/dist/tui/components/InputBar.js +21 -0
  249. package/dist/tui/components/InputBar.js.map +1 -0
  250. package/dist/tui/components/LogsPanel.d.ts +9 -0
  251. package/dist/tui/components/LogsPanel.d.ts.map +1 -0
  252. package/dist/tui/components/LogsPanel.js +56 -0
  253. package/dist/tui/components/LogsPanel.js.map +1 -0
  254. package/dist/tui/components/MemoryPanel.d.ts +21 -0
  255. package/dist/tui/components/MemoryPanel.d.ts.map +1 -0
  256. package/dist/tui/components/MemoryPanel.js +51 -0
  257. package/dist/tui/components/MemoryPanel.js.map +1 -0
  258. package/dist/tui/components/MetricsPanel.d.ts +18 -0
  259. package/dist/tui/components/MetricsPanel.d.ts.map +1 -0
  260. package/dist/tui/components/MetricsPanel.js +27 -0
  261. package/dist/tui/components/MetricsPanel.js.map +1 -0
  262. package/dist/tui/components/StatusPanel.d.ts +23 -0
  263. package/dist/tui/components/StatusPanel.d.ts.map +1 -0
  264. package/dist/tui/components/StatusPanel.js +23 -0
  265. package/dist/tui/components/StatusPanel.js.map +1 -0
  266. package/dist/tui/components/TaskTree.d.ts +28 -0
  267. package/dist/tui/components/TaskTree.d.ts.map +1 -0
  268. package/dist/tui/components/TaskTree.js +29 -0
  269. package/dist/tui/components/TaskTree.js.map +1 -0
  270. package/dist/tui/components/animations/ProgressBar.d.ts +39 -0
  271. package/dist/tui/components/animations/ProgressBar.d.ts.map +1 -0
  272. package/dist/tui/components/animations/ProgressBar.js +39 -0
  273. package/dist/tui/components/animations/ProgressBar.js.map +1 -0
  274. package/dist/tui/components/animations/Pulse.d.ts +17 -0
  275. package/dist/tui/components/animations/Pulse.d.ts.map +1 -0
  276. package/dist/tui/components/animations/Pulse.js +47 -0
  277. package/dist/tui/components/animations/Pulse.js.map +1 -0
  278. package/dist/tui/components/animations/Spinner.d.ts +13 -0
  279. package/dist/tui/components/animations/Spinner.d.ts.map +1 -0
  280. package/dist/tui/components/animations/Spinner.js +36 -0
  281. package/dist/tui/components/animations/Spinner.js.map +1 -0
  282. package/dist/tui/components/animations/StatusAnimator.d.ts +27 -0
  283. package/dist/tui/components/animations/StatusAnimator.d.ts.map +1 -0
  284. package/dist/tui/components/animations/StatusAnimator.js +85 -0
  285. package/dist/tui/components/animations/StatusAnimator.js.map +1 -0
  286. package/dist/tui/components/animations/TypingEffect.d.ts +26 -0
  287. package/dist/tui/components/animations/TypingEffect.d.ts.map +1 -0
  288. package/dist/tui/components/animations/TypingEffect.js +59 -0
  289. package/dist/tui/components/animations/TypingEffect.js.map +1 -0
  290. package/dist/tui/components/animations/index.d.ts +8 -0
  291. package/dist/tui/components/animations/index.d.ts.map +1 -0
  292. package/dist/tui/components/animations/index.js +6 -0
  293. package/dist/tui/components/animations/index.js.map +1 -0
  294. package/dist/tui/hooks/useAnimation.d.ts +42 -0
  295. package/dist/tui/hooks/useAnimation.d.ts.map +1 -0
  296. package/dist/tui/hooks/useAnimation.js +212 -0
  297. package/dist/tui/hooks/useAnimation.js.map +1 -0
  298. package/dist/tui/hooks/useAppState.d.ts +65 -0
  299. package/dist/tui/hooks/useAppState.d.ts.map +1 -0
  300. package/dist/tui/hooks/useAppState.js +293 -0
  301. package/dist/tui/hooks/useAppState.js.map +1 -0
  302. package/dist/tui/index.d.ts +3 -0
  303. package/dist/tui/index.d.ts.map +1 -0
  304. package/dist/tui/index.js +8 -0
  305. package/dist/tui/index.js.map +1 -0
  306. package/dist/tui/services/orchestrator.d.ts +16 -0
  307. package/dist/tui/services/orchestrator.d.ts.map +1 -0
  308. package/dist/tui/services/orchestrator.js +152 -0
  309. package/dist/tui/services/orchestrator.js.map +1 -0
  310. package/dist/tui/styles/borders.d.ts +31 -0
  311. package/dist/tui/styles/borders.d.ts.map +1 -0
  312. package/dist/tui/styles/borders.js +47 -0
  313. package/dist/tui/styles/borders.js.map +1 -0
  314. package/dist/tui/styles/colors.d.ts +18 -0
  315. package/dist/tui/styles/colors.d.ts.map +1 -0
  316. package/dist/tui/styles/colors.js +18 -0
  317. package/dist/tui/styles/colors.js.map +1 -0
  318. package/dist/tui/styles/index.d.ts +6 -0
  319. package/dist/tui/styles/index.d.ts.map +1 -0
  320. package/dist/tui/styles/index.js +6 -0
  321. package/dist/tui/styles/index.js.map +1 -0
  322. package/dist/tui/styles/indicators.d.ts +67 -0
  323. package/dist/tui/styles/indicators.d.ts.map +1 -0
  324. package/dist/tui/styles/indicators.js +42 -0
  325. package/dist/tui/styles/indicators.js.map +1 -0
  326. package/dist/tui/styles/layout.d.ts +21 -0
  327. package/dist/tui/styles/layout.d.ts.map +1 -0
  328. package/dist/tui/styles/layout.js +42 -0
  329. package/dist/tui/styles/layout.js.map +1 -0
  330. package/dist/tui/styles/providers.d.ts +77 -0
  331. package/dist/tui/styles/providers.d.ts.map +1 -0
  332. package/dist/tui/styles/providers.js +31 -0
  333. package/dist/tui/styles/providers.js.map +1 -0
  334. package/dist/tui/utils/animation.d.ts +44 -0
  335. package/dist/tui/utils/animation.d.ts.map +1 -0
  336. package/dist/tui/utils/animation.js +107 -0
  337. package/dist/tui/utils/animation.js.map +1 -0
  338. package/dist/vendor-manifests.d.ts.map +1 -0
  339. package/dist/vendor-manifests.js +94 -0
  340. package/dist/vendor-manifests.js.map +1 -0
  341. package/dist/ws-relay.d.ts +12 -0
  342. package/dist/ws-relay.d.ts.map +1 -0
  343. package/dist/ws-relay.js +148 -0
  344. package/dist/ws-relay.js.map +1 -0
  345. package/package.json +34 -0
  346. package/src/benchmark.ts +156 -0
  347. package/src/bin.ts +156 -0
  348. package/src/bootstrap.ts +36 -0
  349. package/src/bridge-adapter-templates.ts +181 -0
  350. package/src/bridge-test.ts +107 -0
  351. package/src/dashboard.ts +51 -0
  352. package/src/doctor.ts +92 -0
  353. package/src/evolve.ts +74 -0
  354. package/src/host-init-templates.ts +134 -0
  355. package/src/hub/__tests__/commands.test.ts +84 -0
  356. package/src/hub/__tests__/history.test.ts +137 -0
  357. package/src/hub/__tests__/parser.test.ts +105 -0
  358. package/src/hub/commands/agents.ts +53 -0
  359. package/src/hub/commands/index.ts +140 -0
  360. package/src/hub/commands/logs.ts +70 -0
  361. package/src/hub/commands/memory.ts +47 -0
  362. package/src/hub/commands/metrics.ts +49 -0
  363. package/src/hub/commands/providers.ts +39 -0
  364. package/src/hub/commands/run.ts +37 -0
  365. package/src/hub/commands/status.ts +69 -0
  366. package/src/hub/commands/workflows.ts +64 -0
  367. package/src/hub/config-loader.ts +37 -0
  368. package/src/hub/event-listener.ts +17 -0
  369. package/src/hub/history.ts +66 -0
  370. package/src/hub/index.ts +132 -0
  371. package/src/hub/parser.ts +107 -0
  372. package/src/hub/styles/borders.ts +74 -0
  373. package/src/hub/styles/colors.ts +129 -0
  374. package/src/hub/styles/typography.ts +68 -0
  375. package/src/hub/types.ts +31 -0
  376. package/src/index.ts +10 -0
  377. package/src/init-host.ts +285 -0
  378. package/src/install.ts +118 -0
  379. package/src/run.ts +317 -0
  380. package/src/setup/components/ApiKeyInput.tsx +158 -0
  381. package/src/setup/components/AsciiBanner.tsx +125 -0
  382. package/src/setup/components/CliDetector.tsx +230 -0
  383. package/src/setup/components/ModeSelector.tsx +137 -0
  384. package/src/setup/components/ProviderSelector.tsx +174 -0
  385. package/src/setup/components/SetupWizard.tsx +368 -0
  386. package/src/setup/components/StepIndicator.tsx +74 -0
  387. package/src/setup/components/SuccessScreen.tsx +229 -0
  388. package/src/setup/index.ts +34 -0
  389. package/src/setup/utils/cli-detection.ts +99 -0
  390. package/src/setup/utils/config-writer.ts +249 -0
  391. package/src/styles.ts +12 -0
  392. package/src/tui/App.tsx +177 -0
  393. package/src/tui/components/AgentStateIcon.tsx +84 -0
  394. package/src/tui/components/AnimatedBranch.tsx +134 -0
  395. package/src/tui/components/ChatPanel.tsx +125 -0
  396. package/src/tui/components/DAGPanel.tsx +208 -0
  397. package/src/tui/components/ExecutionTimeline.tsx +225 -0
  398. package/src/tui/components/Header.tsx +109 -0
  399. package/src/tui/components/HelpOverlay.tsx +140 -0
  400. package/src/tui/components/InputBar.tsx +69 -0
  401. package/src/tui/components/LogsPanel.tsx +129 -0
  402. package/src/tui/components/MemoryPanel.tsx +163 -0
  403. package/src/tui/components/MetricsPanel.tsx +149 -0
  404. package/src/tui/components/StatusPanel.tsx +137 -0
  405. package/src/tui/components/TaskTree.tsx +159 -0
  406. package/src/tui/components/animations/ProgressBar.tsx +160 -0
  407. package/src/tui/components/animations/Pulse.tsx +73 -0
  408. package/src/tui/components/animations/Spinner.tsx +54 -0
  409. package/src/tui/components/animations/StatusAnimator.tsx +153 -0
  410. package/src/tui/components/animations/TypingEffect.tsx +119 -0
  411. package/src/tui/components/animations/index.ts +16 -0
  412. package/src/tui/hooks/useAnimation.ts +290 -0
  413. package/src/tui/hooks/useAppState.ts +403 -0
  414. package/src/tui/index.ts +9 -0
  415. package/src/tui/services/orchestrator.ts +195 -0
  416. package/src/tui/styles/borders.ts +51 -0
  417. package/src/tui/styles/colors.ts +19 -0
  418. package/src/tui/styles/index.ts +20 -0
  419. package/src/tui/styles/indicators.ts +54 -0
  420. package/src/tui/styles/layout.ts +44 -0
  421. package/src/tui/styles/providers.ts +32 -0
  422. package/src/tui/utils/animation.ts +124 -0
  423. package/src/vendor-manifests.ts +113 -0
  424. package/src/ws-relay.ts +156 -0
  425. package/tsconfig.json +28 -0
@@ -0,0 +1,149 @@
1
+ import React, { memo, useMemo } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { tuiColors } from "../styles/index.js";
4
+ import { AnimatedProgressBar, FitnessAnimator, Pulse } from "./animations/index.js";
5
+
6
+ interface MetricsData {
7
+ sessions: number;
8
+ avgDuration: number;
9
+ successRate: number;
10
+ totalCost: number;
11
+ totalRetries?: number;
12
+ totalEscalations?: number;
13
+ }
14
+
15
+ interface MetricsPanelProps {
16
+ metrics: MetricsData;
17
+ fitness: number;
18
+ isActive: boolean;
19
+ tick?: number;
20
+ }
21
+
22
+ interface AgentUsage {
23
+ name: string;
24
+ percent: number;
25
+ }
26
+
27
+ const TOP_AGENTS: AgentUsage[] = [
28
+ { name: "CodeGenerator", percent: 45 },
29
+ { name: "TestAgent", percent: 32 },
30
+ { name: "FixAgent", percent: 18 },
31
+ ];
32
+
33
+ interface AnimatedMetricBarProps {
34
+ value: number;
35
+ max: number;
36
+ width?: number;
37
+ tick?: number;
38
+ animated?: boolean;
39
+ }
40
+
41
+ const AnimatedMetricBar = memo(function AnimatedMetricBar({
42
+ value,
43
+ max,
44
+ width = 16,
45
+ tick,
46
+ animated
47
+ }: AnimatedMetricBarProps) {
48
+ const percent = useMemo(() => Math.min((value / max) * 100, 100), [value, max]);
49
+ return (
50
+ <AnimatedProgressBar
51
+ progress={percent}
52
+ width={width}
53
+ tick={tick || 0}
54
+ animated={animated}
55
+ showPercentage={false}
56
+ />
57
+ );
58
+ });
59
+
60
+ export const MetricsPanel = memo(function MetricsPanel({
61
+ metrics,
62
+ fitness,
63
+ isActive,
64
+ tick = 0
65
+ }: MetricsPanelProps) {
66
+ const borderColor = isActive ? tuiColors.primary : tuiColors.border;
67
+ const fitnessColor = fitness >= 0.9
68
+ ? tuiColors.success
69
+ : fitness >= 0.7
70
+ ? tuiColors.warning
71
+ : tuiColors.error;
72
+
73
+ const showSuccessPulse = metrics.successRate >= 90;
74
+
75
+ const costStr = useMemo(() => metrics.totalCost.toFixed(4), [metrics.totalCost]);
76
+
77
+ const agentElements = useMemo(() =>
78
+ TOP_AGENTS.map((agent, idx) => (
79
+ <Box key={agent.name} flexDirection="row">
80
+ <Text color={tuiColors.textPrimary}>{agent.name.padEnd(14)}</Text>
81
+ <AnimatedMetricBar
82
+ value={agent.percent}
83
+ max={100}
84
+ width={8}
85
+ tick={tick}
86
+ animated={isActive && idx === 0}
87
+ />
88
+ <Text color={tuiColors.textTertiary}> {agent.percent}%</Text>
89
+ </Box>
90
+ )),
91
+ [tick, isActive]
92
+ );
93
+
94
+ return (
95
+ <Box
96
+ flexDirection="column"
97
+ width={30}
98
+ borderStyle="single"
99
+ borderColor={borderColor}
100
+ paddingX={1}
101
+ >
102
+ <Box marginBottom={1}>
103
+ <Text color={tuiColors.primary} bold>┌─</Text>
104
+ <Text color={tuiColors.primary} bold> PERFORMANCE </Text>
105
+ <Text color={tuiColors.textTertiary}>─────────────</Text>
106
+ </Box>
107
+
108
+ <Box flexDirection="column">
109
+ <Text color={tuiColors.textTertiary} bold>METRICS</Text>
110
+
111
+ <Box flexDirection="row" marginTop={1}>
112
+ <Text color={tuiColors.textSecondary}>Sessions:</Text>
113
+ <Text color={tuiColors.textPrimary} bold> {metrics.sessions}</Text>
114
+ </Box>
115
+
116
+ <Box flexDirection="row">
117
+ <Text color={tuiColors.textSecondary}>Avg Duration:</Text>
118
+ <Text color={tuiColors.textPrimary}> {metrics.avgDuration}ms</Text>
119
+ </Box>
120
+
121
+ <Box flexDirection="row">
122
+ <Text color={tuiColors.textSecondary}>Success Rate:</Text>
123
+ <Text color={tuiColors.success}> {metrics.successRate}%</Text>
124
+ {showSuccessPulse && <Pulse interval={1000} color={tuiColors.success} type="breath" />}
125
+ </Box>
126
+
127
+ <Box flexDirection="row">
128
+ <Text color={tuiColors.textSecondary}>Cost:</Text>
129
+ <Text color={tuiColors.warning}> ${costStr}</Text>
130
+ </Box>
131
+ </Box>
132
+
133
+ <Box flexDirection="column" marginTop={1}>
134
+ <Text color={tuiColors.textTertiary} bold>FITNESS SCORE</Text>
135
+ <FitnessAnimator value={fitness} />
136
+ <Box flexDirection="row">
137
+ <AnimatedMetricBar value={fitness} max={1} width={12} tick={tick} animated={isActive} />
138
+ </Box>
139
+ </Box>
140
+
141
+ <Box flexDirection="column" marginTop={1}>
142
+ <Text color={tuiColors.textTertiary} bold>TOP AGENTS</Text>
143
+ <Box flexDirection="column" marginTop={1}>
144
+ {agentElements}
145
+ </Box>
146
+ </Box>
147
+ </Box>
148
+ );
149
+ });
@@ -0,0 +1,137 @@
1
+ import React, { memo, useMemo } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { tuiColors, getStatusIndicator, getProviderTag } from "../styles/index.js";
4
+ import { Pulse, FitnessAnimator, StatusAnimator } from "./animations/index.js";
5
+
6
+ interface Agent {
7
+ name: string;
8
+ role: string;
9
+ status: "idle" | "running" | "queued" | "done";
10
+ provider: string;
11
+ }
12
+
13
+ interface Provider {
14
+ name: string;
15
+ status: "active" | "idle";
16
+ latency: number;
17
+ }
18
+
19
+ interface StatusPanelProps {
20
+ agents: Agent[];
21
+ providers: Provider[];
22
+ fitness: number;
23
+ currentWorkflow: string | null;
24
+ isActive: boolean;
25
+ tick?: number;
26
+ }
27
+
28
+ interface AgentRowProps {
29
+ agent: Agent;
30
+ tick: number;
31
+ }
32
+
33
+ const AgentRow = memo(function AgentRow({ agent, tick }: AgentRowProps) {
34
+ const statusInfo = useMemo(() => getStatusIndicator(agent.status), [agent.status]);
35
+ const providerInfo = useMemo(() => getProviderTag(agent.provider), [agent.provider]);
36
+
37
+ return (
38
+ <Box flexDirection="row">
39
+ {agent.status === "running" ? (
40
+ <StatusAnimator status="running" showLabel={false} />
41
+ ) : (
42
+ <Text color={statusInfo.color}>{statusInfo.icon}</Text>
43
+ )}
44
+ <Text color={tuiColors.textPrimary}> {agent.name.slice(0, 14).padEnd(14)}</Text>
45
+ <Text color={tuiColors.textTertiary}> {providerInfo.code}</Text>
46
+ <Text color={tuiColors.textSecondary}> {agent.status.toUpperCase().padEnd(8)}</Text>
47
+ </Box>
48
+ );
49
+ });
50
+
51
+ interface ProviderRowProps {
52
+ provider: Provider;
53
+ tick: number;
54
+ }
55
+
56
+ const ProviderRow = memo(function ProviderRow({ provider, tick }: ProviderRowProps) {
57
+ const isActive = provider.status === "active";
58
+ const providerInfo = useMemo(() => getProviderTag(provider.name), [provider.name]);
59
+
60
+ return (
61
+ <Box flexDirection="row">
62
+ {isActive ? (
63
+ <Pulse interval={800} color={tuiColors.success} type="breath" />
64
+ ) : (
65
+ <Text color={tuiColors.textTertiary}>○</Text>
66
+ )}
67
+ <Text color={tuiColors.textPrimary}> {provider.name.padEnd(12)}</Text>
68
+ <Text color={tuiColors.textTertiary}> {provider.latency > 0 ? `${provider.latency}ms`.padStart(6) : "--".padStart(6)}</Text>
69
+ </Box>
70
+ );
71
+ });
72
+
73
+ export const StatusPanel = memo(function StatusPanel({
74
+ agents,
75
+ providers,
76
+ fitness,
77
+ currentWorkflow,
78
+ isActive,
79
+ tick = 0
80
+ }: StatusPanelProps) {
81
+ const borderColor = isActive ? tuiColors.primary : tuiColors.border;
82
+
83
+ const activeAgents = useMemo(() =>
84
+ agents.filter(a => a.status === "running" || a.status === "queued").slice(0, 4),
85
+ [agents]
86
+ );
87
+
88
+ const hasNoActiveAgents = activeAgents.length === 0;
89
+
90
+ const workflowDisplay = useMemo(() =>
91
+ currentWorkflow ? `▶ ${currentWorkflow.slice(0, 20)}...` : "○ None",
92
+ [currentWorkflow]
93
+ );
94
+
95
+ return (
96
+ <Box flexDirection="column" width={30} borderStyle="single" borderColor={borderColor}>
97
+ <Box paddingX={1}>
98
+ <Text color={tuiColors.primary} bold>┌─</Text>
99
+ <Text color={tuiColors.primary} bold> SYSTEM_STATUS </Text>
100
+ <Text color={tuiColors.textTertiary}>───────────</Text>
101
+ </Box>
102
+
103
+ <Box flexDirection="column" paddingX={1}>
104
+ <Text color={tuiColors.textTertiary} bold>ORCHESTRATOR</Text>
105
+ <Box flexDirection="row">
106
+ <Text color={tuiColors.textSecondary}>Status:</Text>
107
+ <Text color={tuiColors.success}> </Text>
108
+ <Pulse interval={600} color={tuiColors.success} type="breath" />
109
+ <Text color={tuiColors.success}> ACTIVE</Text>
110
+ </Box>
111
+ </Box>
112
+
113
+ <Box flexDirection="column" paddingX={1} marginTop={1}>
114
+ <Text color={tuiColors.textTertiary} bold>WORKFLOW</Text>
115
+ <Text color={tuiColors.textPrimary}>{workflowDisplay}</Text>
116
+ <FitnessAnimator value={fitness} />
117
+ </Box>
118
+
119
+ <Box flexDirection="column" paddingX={1} marginTop={1}>
120
+ <Text color={tuiColors.textTertiary} bold>ACTIVE AGENTS</Text>
121
+ {activeAgents.map((agent) => (
122
+ <AgentRow key={agent.name} agent={agent} tick={tick} />
123
+ ))}
124
+ {hasNoActiveAgents && (
125
+ <Text color={tuiColors.textQuaternary}> ○ All idle</Text>
126
+ )}
127
+ </Box>
128
+
129
+ <Box flexDirection="column" paddingX={1} marginTop={1}>
130
+ <Text color={tuiColors.textTertiary} bold>PROVIDERS</Text>
131
+ {providers.map((provider) => (
132
+ <ProviderRow key={provider.name} provider={provider} tick={tick} />
133
+ ))}
134
+ </Box>
135
+ </Box>
136
+ );
137
+ });
@@ -0,0 +1,159 @@
1
+ import React, { memo, useMemo } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { tuiColors, treeChars } from "../styles/index.js";
4
+ import { AgentStateIcon, AgentState } from "./AgentStateIcon.js";
5
+ import { AnimatedBranch } from "./AnimatedBranch.js";
6
+
7
+ export interface TaskNode {
8
+ id: string;
9
+ name: string;
10
+ state: AgentState;
11
+ level: number;
12
+ detail?: string;
13
+ children?: TaskNode[];
14
+ executionTime?: number;
15
+ subtasks?: string[];
16
+ }
17
+
18
+ interface TaskNodeItemProps {
19
+ node: TaskNode;
20
+ tick: number;
21
+ isLast: boolean;
22
+ showDetail?: boolean;
23
+ }
24
+
25
+ const TaskNodeItem = memo(function TaskNodeItem({ node, tick, isLast, showDetail = true }: TaskNodeItemProps) {
26
+ const indent = useMemo(() => " ".repeat(node.level), [node.level]);
27
+ const prefix = isLast ? treeChars.lastBranch : treeChars.branch;
28
+ const timeStr = node.executionTime ? `${node.executionTime.toFixed(1)}s` : "";
29
+ const paddedName = useMemo(() => node.name.padEnd(20), [node.name]);
30
+
31
+ return (
32
+ <Box flexDirection="column">
33
+ <Box flexDirection="row">
34
+ <Text color={tuiColors.textTertiary}>{indent}{prefix} </Text>
35
+ <Box flexDirection="row">
36
+ <Text color={tuiColors.textSecondary}>[</Text>
37
+ <AgentStateIcon state={node.state} tick={tick} />
38
+ <Text color={tuiColors.textSecondary}>]</Text>
39
+ </Box>
40
+ <Text color={tuiColors.textPrimary}> {paddedName}</Text>
41
+ {timeStr && (
42
+ <Text color={tuiColors.textTertiary}> ● {timeStr}</Text>
43
+ )}
44
+ </Box>
45
+ {showDetail && node.detail && (
46
+ <Box flexDirection="row">
47
+ <Text color={tuiColors.textTertiary}>{indent} └── </Text>
48
+ <Text color={tuiColors.textSecondary}>{node.detail}</Text>
49
+ </Box>
50
+ )}
51
+ {showDetail && node.subtasks && node.subtasks.length > 0 && (
52
+ <Box flexDirection="column">
53
+ {node.subtasks.map((subtask, idx) => (
54
+ <Box key={idx} flexDirection="row">
55
+ <Text color={tuiColors.textTertiary}>{indent} {idx === node.subtasks!.length - 1 ? '└──' : '├──'} </Text>
56
+ <Text color={tuiColors.textTertiary}>{subtask}</Text>
57
+ </Box>
58
+ ))}
59
+ </Box>
60
+ )}
61
+ </Box>
62
+ );
63
+ });
64
+
65
+ export interface TaskTreeProps {
66
+ rootTask: string;
67
+ tasks: TaskNode[];
68
+ tick: number;
69
+ isActive?: boolean;
70
+ maxDisplay?: number;
71
+ }
72
+
73
+ export const TaskTree = memo(function TaskTree({ rootTask, tasks, tick, isActive = false, maxDisplay = 15 }: TaskTreeProps) {
74
+ const borderColor = isActive ? tuiColors.primary : tuiColors.border;
75
+ const displayTasks = useMemo(() => tasks.slice(0, maxDisplay), [tasks, maxDisplay]);
76
+ const hiddenCount = tasks.length - maxDisplay;
77
+
78
+ const taskElements = useMemo(() =>
79
+ displayTasks.map((task, idx) => (
80
+ <TaskNodeItem
81
+ key={task.id}
82
+ node={task}
83
+ tick={tick}
84
+ isLast={idx === displayTasks.length - 1 && hiddenCount === 0}
85
+ />
86
+ )),
87
+ [displayTasks, tick, hiddenCount]
88
+ );
89
+
90
+ return (
91
+ <Box flexDirection="column" borderStyle="single" borderColor={borderColor} paddingX={1}>
92
+ <Box marginBottom={1}>
93
+ <Text color={tuiColors.primary} bold>┌─</Text>
94
+ <Text color={tuiColors.primary} bold> TASK_TREE </Text>
95
+ <Text color={tuiColors.textTertiary}>────────────────────</Text>
96
+ </Box>
97
+
98
+ <Box flexDirection="row">
99
+ <Text color={tuiColors.textPrimary} bold>■ </Text>
100
+ <Text color={tuiColors.textSecondary}>root: {rootTask}</Text>
101
+ </Box>
102
+
103
+ <Box flexDirection="column" marginTop={1}>
104
+ <AnimatedBranch type="vertical" tick={tick} animated={isActive} />
105
+ </Box>
106
+
107
+ <Box flexDirection="column">
108
+ {taskElements}
109
+ {hiddenCount > 0 && (
110
+ <Box flexDirection="row">
111
+ <Text color={tuiColors.textTertiary}> └── +{hiddenCount} more tasks...</Text>
112
+ </Box>
113
+ )}
114
+ </Box>
115
+ </Box>
116
+ );
117
+ });
118
+
119
+ interface TaskHierarchyProps {
120
+ tasks: TaskNode[];
121
+ tick: number;
122
+ expandedIds?: Set<string>;
123
+ }
124
+
125
+ export const TaskHierarchy = memo(function TaskHierarchy({ tasks, tick, expandedIds = new Set() }: TaskHierarchyProps) {
126
+ const renderNode = (node: TaskNode, isLast: boolean): React.ReactNode => {
127
+ const hasChildren = (node.children?.length ?? 0) > 0;
128
+ const isExpanded = expandedIds.has(node.id);
129
+
130
+ return (
131
+ <Box key={node.id} flexDirection="column">
132
+ <TaskNodeItem
133
+ node={node}
134
+ tick={tick}
135
+ isLast={isLast}
136
+ showDetail={isExpanded}
137
+ />
138
+ {hasChildren && isExpanded && (
139
+ <Box flexDirection="column" marginLeft={2}>
140
+ {node.children!.map((child, idx) => (
141
+ <Box key={child.id} flexDirection="column">
142
+ <Box flexDirection="row">
143
+ <AnimatedBranch type="vertical" tick={tick} />
144
+ </Box>
145
+ {renderNode(child, idx === node.children!.length - 1)}
146
+ </Box>
147
+ ))}
148
+ </Box>
149
+ )}
150
+ </Box>
151
+ );
152
+ };
153
+
154
+ return (
155
+ <Box flexDirection="column">
156
+ {tasks.map((task, idx) => renderNode(task, idx === tasks.length - 1))}
157
+ </Box>
158
+ );
159
+ });
@@ -0,0 +1,160 @@
1
+ import React, { memo, useMemo } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { tuiColors, getProgressMarker, getProgressGlow } from "../../styles/index.js";
4
+
5
+ interface ProgressBarProps {
6
+ progress: number;
7
+ width?: number;
8
+ showPercentage?: boolean;
9
+ animated?: boolean;
10
+ tick?: number;
11
+ showMarker?: boolean;
12
+ glowEffect?: boolean;
13
+ color?: string;
14
+ }
15
+
16
+ export const AnimatedProgressBar = memo(function AnimatedProgressBar({
17
+ progress,
18
+ width = 16,
19
+ showPercentage = true,
20
+ animated = true,
21
+ tick = 0,
22
+ showMarker = true,
23
+ glowEffect = false,
24
+ color,
25
+ }: ProgressBarProps) {
26
+ const filled = Math.round((progress / 100) * width);
27
+ const empty = width - filled;
28
+ const markerPos = Math.min(filled, width - 1);
29
+
30
+ const barColor = color || (progress >= 100
31
+ ? tuiColors.success
32
+ : progress > 0
33
+ ? tuiColors.warning
34
+ : tuiColors.textTertiary);
35
+
36
+ const filledChar = glowEffect && animated ? getProgressGlow(tick) : "█";
37
+ const emptyChar = "░";
38
+ const markerChar = showMarker && animated && progress > 0 && progress < 100 ? getProgressMarker(tick) : "";
39
+
40
+ const beforeMarker = filled > 0 ? filledChar.repeat(Math.max(0, filled - 1)) : "";
41
+ const afterMarker = emptyChar.repeat(empty);
42
+
43
+ const progressStr = useMemo(() => progress.toString().padStart(3), [progress]);
44
+
45
+ if (showMarker && animated && progress > 0 && progress < 100) {
46
+ return (
47
+ <Box flexDirection="row">
48
+ <Text color={barColor}>{beforeMarker}</Text>
49
+ <Text color={tuiColors.primary} bold>{markerChar}</Text>
50
+ <Text color={tuiColors.textTertiary}>{afterMarker.slice(1)}</Text>
51
+ {showPercentage && (
52
+ <Text color={barColor}> {progressStr}%</Text>
53
+ )}
54
+ </Box>
55
+ );
56
+ }
57
+
58
+ const bar = filledChar.repeat(filled) + emptyChar.repeat(empty);
59
+
60
+ return (
61
+ <Box flexDirection="row">
62
+ <Text color={barColor}>{bar}</Text>
63
+ {showPercentage && (
64
+ <Text color={barColor}> {progressStr}%</Text>
65
+ )}
66
+ </Box>
67
+ );
68
+ });
69
+
70
+ interface ProgressWithLabelProps {
71
+ label: string;
72
+ progress: number;
73
+ width?: number;
74
+ tick?: number;
75
+ animated?: boolean;
76
+ }
77
+
78
+ export const ProgressWithLabel = memo(function ProgressWithLabel({
79
+ label,
80
+ progress,
81
+ width = 12,
82
+ tick = 0,
83
+ animated = true
84
+ }: ProgressWithLabelProps) {
85
+ const paddedLabel = useMemo(() => label.padEnd(10), [label]);
86
+
87
+ return (
88
+ <Box flexDirection="row">
89
+ <Text color={tuiColors.textSecondary}>{paddedLabel}</Text>
90
+ <AnimatedProgressBar progress={progress} width={width} tick={tick} animated={animated} showMarker />
91
+ </Box>
92
+ );
93
+ });
94
+
95
+ interface SegmentedProgressProps {
96
+ segments: { progress: number; color?: string; label?: string }[];
97
+ width?: number;
98
+ tick?: number;
99
+ }
100
+
101
+ export const SegmentedProgress = memo(function SegmentedProgress({
102
+ segments,
103
+ width = 20,
104
+ tick = 0
105
+ }: SegmentedProgressProps) {
106
+ const totalProgress = useMemo(() =>
107
+ segments.reduce((sum, s) => sum + s.progress, 0) / segments.length,
108
+ [segments]
109
+ );
110
+
111
+ return (
112
+ <Box flexDirection="column">
113
+ {segments.map((segment, idx) => (
114
+ <Box key={idx} flexDirection="row">
115
+ {segment.label && <Text color={tuiColors.textTertiary}>{segment.label.padEnd(8)}</Text>}
116
+ <AnimatedProgressBar
117
+ progress={segment.progress}
118
+ width={width}
119
+ tick={tick}
120
+ color={segment.color}
121
+ showPercentage={false}
122
+ />
123
+ <Text color={segment.color || tuiColors.textPrimary}> {segment.progress}%</Text>
124
+ </Box>
125
+ ))}
126
+ </Box>
127
+ );
128
+ });
129
+
130
+ interface WorkflowProgressProps {
131
+ level: string;
132
+ progress: number;
133
+ isActive: boolean;
134
+ tick?: number;
135
+ }
136
+
137
+ export const WorkflowProgress = memo(function WorkflowProgress({
138
+ level,
139
+ progress,
140
+ isActive,
141
+ tick = 0
142
+ }: WorkflowProgressProps) {
143
+ const levelColor = isActive ? tuiColors.primary : tuiColors.textSecondary;
144
+ const paddedLevel = useMemo(() => level.padEnd(12), [level]);
145
+
146
+ return (
147
+ <Box flexDirection="row">
148
+ <Text color={levelColor} bold>{paddedLevel}</Text>
149
+ <AnimatedProgressBar
150
+ progress={progress}
151
+ width={12}
152
+ tick={tick}
153
+ animated={isActive}
154
+ showMarker={isActive}
155
+ glowEffect={isActive}
156
+ color={isActive ? tuiColors.warning : undefined}
157
+ />
158
+ </Box>
159
+ );
160
+ });
@@ -0,0 +1,73 @@
1
+ import React, { memo } from "react";
2
+ import { Text } from "ink";
3
+ import { useAnimation } from "../../hooks/useAnimation.js";
4
+ import { tuiColors } from "../../styles/index.js";
5
+
6
+ const PULSE_FRAMES = ["●", "◐", "○", "◐"];
7
+ const BREATH_FRAMES = ["●", "●", "◐", "◐", "○", "○", "◐", "◐"];
8
+ const PING_FRAMES = ["●", "●", "●", "○", "○", "○", "○", "○", "○", "○"];
9
+
10
+ const FRAME_MAP = {
11
+ pulse: PULSE_FRAMES,
12
+ breath: BREATH_FRAMES,
13
+ ping: PING_FRAMES,
14
+ } as const;
15
+
16
+ const DEFAULT_INTERVALS = {
17
+ pulse: 300,
18
+ breath: 600,
19
+ ping: 400,
20
+ } as const;
21
+
22
+ interface PulseProps {
23
+ interval?: number;
24
+ color?: string;
25
+ isAnimating?: boolean;
26
+ type?: "pulse" | "breath" | "ping";
27
+ }
28
+
29
+ export const Pulse = memo(function Pulse({
30
+ interval,
31
+ color = tuiColors.success,
32
+ isAnimating = true,
33
+ type = "pulse"
34
+ }: PulseProps) {
35
+ const frames = FRAME_MAP[type];
36
+ const actualInterval = interval ?? DEFAULT_INTERVALS[type];
37
+ const { frame } = useAnimation({ interval: actualInterval, loop: true, autoStart: isAnimating, maxFps: 15 });
38
+ const currentFrame = frames[frame % frames.length];
39
+
40
+ return <Text color={color}>{currentFrame}</Text>;
41
+ });
42
+
43
+ export function usePulseFrame(tick: number, type: "pulse" | "breath" | "ping" = "pulse"): string {
44
+ const frames = FRAME_MAP[type];
45
+ return frames[tick % frames.length];
46
+ }
47
+
48
+ export function usePulseIntensity(tick: number, interval: number = 100): number {
49
+ const cycleLength = 20;
50
+ const phase = (tick % cycleLength) / cycleLength;
51
+ return 0.5 + Math.sin(phase * Math.PI * 2) * 0.5;
52
+ }
53
+
54
+ interface StatusPulseProps {
55
+ status: "online" | "offline" | "running" | "error";
56
+ tick?: number;
57
+ }
58
+
59
+ export const StatusPulse = memo(function StatusPulse({ status, tick }: StatusPulseProps) {
60
+ if (status === "running") {
61
+ return <Pulse interval={200} color={tuiColors.warning} type="pulse" />;
62
+ }
63
+
64
+ if (status === "online") {
65
+ return <Pulse interval={600} color={tuiColors.success} type="breath" />;
66
+ }
67
+
68
+ if (status === "error") {
69
+ return <Pulse interval={400} color={tuiColors.error} type="ping" />;
70
+ }
71
+
72
+ return <Text color={tuiColors.textTertiary}>○</Text>;
73
+ });