@ranker/raxflow 0.2.1 → 0.2.3

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 (214) hide show
  1. package/dist/benchmark.d.ts +10 -0
  2. package/dist/bin.d.ts +3 -0
  3. package/dist/bootstrap.d.ts +8 -0
  4. package/dist/bridge-adapter-templates.d.ts +4 -0
  5. package/dist/bridge-test.d.ts +7 -0
  6. package/dist/dashboard.d.ts +4 -0
  7. package/dist/doctor.d.ts +6 -0
  8. package/dist/evolve.d.ts +7 -0
  9. package/dist/host-init-templates.d.ts +16 -0
  10. package/dist/hub/__tests__/commands.test.d.ts +2 -0
  11. package/dist/hub/__tests__/history.test.d.ts +2 -0
  12. package/dist/hub/__tests__/parser.test.d.ts +2 -0
  13. package/dist/hub/commands/agents.d.ts +3 -0
  14. package/dist/hub/commands/index.d.ts +4 -0
  15. package/dist/hub/commands/logs.d.ts +3 -0
  16. package/dist/hub/commands/memory.d.ts +3 -0
  17. package/dist/hub/commands/metrics.d.ts +3 -0
  18. package/dist/hub/commands/providers.d.ts +3 -0
  19. package/dist/hub/commands/run.d.ts +3 -0
  20. package/dist/hub/commands/status.d.ts +3 -0
  21. package/dist/hub/commands/workflows.d.ts +3 -0
  22. package/dist/hub/config-loader.d.ts +4 -0
  23. package/dist/hub/history.d.ts +13 -0
  24. package/dist/hub/index.d.ts +4 -0
  25. package/dist/hub/parser.d.ts +4 -0
  26. package/dist/hub/styles/borders.d.ts +23 -0
  27. package/dist/hub/styles/colors.d.ts +63 -0
  28. package/dist/hub/styles/typography.d.ts +34 -0
  29. package/dist/hub/types.d.ts +27 -0
  30. package/{src/index.ts → dist/index.d.ts} +1 -0
  31. package/dist/init-host.d.ts +10 -0
  32. package/dist/install.d.ts +8 -0
  33. package/dist/run.d.ts +16 -0
  34. package/dist/setup/components/ProviderSelector.d.ts.map +1 -1
  35. package/dist/setup/components/ProviderSelector.js +8 -7
  36. package/dist/setup/components/ProviderSelector.js.map +1 -1
  37. package/dist/styles.d.ts +12 -0
  38. package/dist/tui/App.d.ts.map +1 -1
  39. package/dist/tui/App.js +7 -2
  40. package/dist/tui/App.js.map +1 -1
  41. package/dist/tui/components/ChatPanel.d.ts +1 -0
  42. package/dist/tui/components/ChatPanel.d.ts.map +1 -1
  43. package/dist/tui/components/ChatPanel.js +4 -3
  44. package/dist/tui/components/ChatPanel.js.map +1 -1
  45. package/dist/tui/components/DAGPanel.d.ts +1 -0
  46. package/dist/tui/components/DAGPanel.d.ts.map +1 -1
  47. package/dist/tui/components/DAGPanel.js +4 -3
  48. package/dist/tui/components/DAGPanel.js.map +1 -1
  49. package/dist/tui/components/Header.d.ts.map +1 -1
  50. package/dist/tui/components/Header.js +1 -1
  51. package/dist/tui/components/Header.js.map +1 -1
  52. package/dist/tui/components/InputBar.d.ts.map +1 -1
  53. package/dist/tui/components/InputBar.js +1 -1
  54. package/dist/tui/components/InputBar.js.map +1 -1
  55. package/dist/tui/components/LogsPanel.d.ts +1 -0
  56. package/dist/tui/components/LogsPanel.d.ts.map +1 -1
  57. package/dist/tui/components/LogsPanel.js +4 -3
  58. package/dist/tui/components/LogsPanel.js.map +1 -1
  59. package/dist/tui/components/MemoryPanel.d.ts +1 -0
  60. package/dist/tui/components/MemoryPanel.d.ts.map +1 -1
  61. package/dist/tui/components/MemoryPanel.js +2 -2
  62. package/dist/tui/components/MemoryPanel.js.map +1 -1
  63. package/dist/tui/components/MetricsPanel.d.ts +1 -0
  64. package/dist/tui/components/MetricsPanel.d.ts.map +1 -1
  65. package/dist/tui/components/MetricsPanel.js +2 -2
  66. package/dist/tui/components/MetricsPanel.js.map +1 -1
  67. package/dist/tui/components/StatusPanel.d.ts +1 -0
  68. package/dist/tui/components/StatusPanel.d.ts.map +1 -1
  69. package/dist/tui/components/StatusPanel.js +4 -3
  70. package/dist/tui/components/StatusPanel.js.map +1 -1
  71. package/dist/vendor-manifests.d.ts +22 -0
  72. package/package.json +5 -1
  73. package/dashboard/index.html +0 -420
  74. package/dist/hub/chat/ChatApp.d.ts +0 -2
  75. package/dist/hub/chat/ChatApp.d.ts.map +0 -1
  76. package/dist/hub/chat/ChatApp.js +0 -146
  77. package/dist/hub/chat/ChatApp.js.map +0 -1
  78. package/dist/hub/chat/components/ChatInput.d.ts +0 -9
  79. package/dist/hub/chat/components/ChatInput.d.ts.map +0 -1
  80. package/dist/hub/chat/components/ChatInput.js +0 -19
  81. package/dist/hub/chat/components/ChatInput.js.map +0 -1
  82. package/dist/hub/chat/components/MessageList.d.ts +0 -7
  83. package/dist/hub/chat/components/MessageList.d.ts.map +0 -1
  84. package/dist/hub/chat/components/MessageList.js +0 -6
  85. package/dist/hub/chat/components/MessageList.js.map +0 -1
  86. package/dist/hub/chat/context.d.ts.map +0 -1
  87. package/dist/hub/chat/context.js +0 -42
  88. package/dist/hub/chat/context.js.map +0 -1
  89. package/dist/hub/chat/hooks/useChatHistory.d.ts +0 -7
  90. package/dist/hub/chat/hooks/useChatHistory.d.ts.map +0 -1
  91. package/dist/hub/chat/hooks/useChatHistory.js +0 -31
  92. package/dist/hub/chat/hooks/useChatHistory.js.map +0 -1
  93. package/dist/hub/chat/index.d.ts.map +0 -1
  94. package/dist/hub/chat/index.js +0 -7
  95. package/dist/hub/chat/index.js.map +0 -1
  96. package/dist/hub/chat/intent-parser.d.ts.map +0 -1
  97. package/dist/hub/chat/intent-parser.js +0 -48
  98. package/dist/hub/chat/intent-parser.js.map +0 -1
  99. package/dist/hub/chat/types.d.ts.map +0 -1
  100. package/dist/hub/chat/types.js +0 -2
  101. package/dist/hub/chat/types.js.map +0 -1
  102. package/dist/hub/tui/App.d.ts +0 -2
  103. package/dist/hub/tui/App.d.ts.map +0 -1
  104. package/dist/hub/tui/App.js +0 -53
  105. package/dist/hub/tui/App.js.map +0 -1
  106. package/dist/hub/tui/components/AgentQueue.d.ts +0 -6
  107. package/dist/hub/tui/components/AgentQueue.d.ts.map +0 -1
  108. package/dist/hub/tui/components/AgentQueue.js +0 -20
  109. package/dist/hub/tui/components/AgentQueue.js.map +0 -1
  110. package/dist/hub/tui/components/DAGPanel.d.ts +0 -16
  111. package/dist/hub/tui/components/DAGPanel.d.ts.map +0 -1
  112. package/dist/hub/tui/components/DAGPanel.js +0 -51
  113. package/dist/hub/tui/components/DAGPanel.js.map +0 -1
  114. package/dist/hub/tui/components/Header.d.ts +0 -7
  115. package/dist/hub/tui/components/Header.d.ts.map +0 -1
  116. package/dist/hub/tui/components/Header.js +0 -17
  117. package/dist/hub/tui/components/Header.js.map +0 -1
  118. package/dist/hub/tui/components/LogsPanel.d.ts +0 -6
  119. package/dist/hub/tui/components/LogsPanel.d.ts.map +0 -1
  120. package/dist/hub/tui/components/LogsPanel.js +0 -26
  121. package/dist/hub/tui/components/LogsPanel.js.map +0 -1
  122. package/dist/hub/tui/components/StatusBar.d.ts +0 -8
  123. package/dist/hub/tui/components/StatusBar.d.ts.map +0 -1
  124. package/dist/hub/tui/components/StatusBar.js +0 -7
  125. package/dist/hub/tui/components/StatusBar.js.map +0 -1
  126. package/dist/hub/tui/hooks/useEvents.d.ts +0 -2
  127. package/dist/hub/tui/hooks/useEvents.d.ts.map +0 -1
  128. package/dist/hub/tui/hooks/useEvents.js +0 -13
  129. package/dist/hub/tui/hooks/useEvents.js.map +0 -1
  130. package/dist/hub/tui/index.d.ts.map +0 -1
  131. package/dist/hub/tui/index.js +0 -7
  132. package/dist/hub/tui/index.js.map +0 -1
  133. package/dist/hub/tui/types.d.ts.map +0 -1
  134. package/dist/hub/tui/types.js +0 -2
  135. package/dist/hub/tui/types.js.map +0 -1
  136. package/src/benchmark.ts +0 -156
  137. package/src/bin.ts +0 -156
  138. package/src/bootstrap.ts +0 -36
  139. package/src/bridge-adapter-templates.ts +0 -181
  140. package/src/bridge-test.ts +0 -107
  141. package/src/dashboard.ts +0 -51
  142. package/src/doctor.ts +0 -92
  143. package/src/evolve.ts +0 -74
  144. package/src/host-init-templates.ts +0 -134
  145. package/src/hub/__tests__/commands.test.ts +0 -84
  146. package/src/hub/__tests__/history.test.ts +0 -137
  147. package/src/hub/__tests__/parser.test.ts +0 -105
  148. package/src/hub/commands/agents.ts +0 -53
  149. package/src/hub/commands/index.ts +0 -140
  150. package/src/hub/commands/logs.ts +0 -70
  151. package/src/hub/commands/memory.ts +0 -47
  152. package/src/hub/commands/metrics.ts +0 -49
  153. package/src/hub/commands/providers.ts +0 -39
  154. package/src/hub/commands/run.ts +0 -37
  155. package/src/hub/commands/status.ts +0 -69
  156. package/src/hub/commands/workflows.ts +0 -64
  157. package/src/hub/config-loader.ts +0 -37
  158. package/src/hub/event-listener.ts +0 -17
  159. package/src/hub/history.ts +0 -66
  160. package/src/hub/index.ts +0 -132
  161. package/src/hub/parser.ts +0 -107
  162. package/src/hub/styles/borders.ts +0 -74
  163. package/src/hub/styles/colors.ts +0 -129
  164. package/src/hub/styles/typography.ts +0 -68
  165. package/src/hub/types.ts +0 -31
  166. package/src/init-host.ts +0 -285
  167. package/src/install.ts +0 -118
  168. package/src/run.ts +0 -317
  169. package/src/setup/components/ApiKeyInput.tsx +0 -158
  170. package/src/setup/components/AsciiBanner.tsx +0 -125
  171. package/src/setup/components/CliDetector.tsx +0 -230
  172. package/src/setup/components/ModeSelector.tsx +0 -137
  173. package/src/setup/components/ProviderSelector.tsx +0 -174
  174. package/src/setup/components/SetupWizard.tsx +0 -368
  175. package/src/setup/components/StepIndicator.tsx +0 -74
  176. package/src/setup/components/SuccessScreen.tsx +0 -229
  177. package/src/setup/index.ts +0 -34
  178. package/src/setup/utils/cli-detection.ts +0 -99
  179. package/src/setup/utils/config-writer.ts +0 -249
  180. package/src/styles.ts +0 -12
  181. package/src/tui/App.tsx +0 -177
  182. package/src/tui/components/AgentStateIcon.tsx +0 -84
  183. package/src/tui/components/AnimatedBranch.tsx +0 -134
  184. package/src/tui/components/ChatPanel.tsx +0 -125
  185. package/src/tui/components/DAGPanel.tsx +0 -208
  186. package/src/tui/components/ExecutionTimeline.tsx +0 -225
  187. package/src/tui/components/Header.tsx +0 -109
  188. package/src/tui/components/HelpOverlay.tsx +0 -140
  189. package/src/tui/components/InputBar.tsx +0 -69
  190. package/src/tui/components/LogsPanel.tsx +0 -129
  191. package/src/tui/components/MemoryPanel.tsx +0 -163
  192. package/src/tui/components/MetricsPanel.tsx +0 -149
  193. package/src/tui/components/StatusPanel.tsx +0 -137
  194. package/src/tui/components/TaskTree.tsx +0 -159
  195. package/src/tui/components/animations/ProgressBar.tsx +0 -160
  196. package/src/tui/components/animations/Pulse.tsx +0 -73
  197. package/src/tui/components/animations/Spinner.tsx +0 -54
  198. package/src/tui/components/animations/StatusAnimator.tsx +0 -153
  199. package/src/tui/components/animations/TypingEffect.tsx +0 -119
  200. package/src/tui/components/animations/index.ts +0 -16
  201. package/src/tui/hooks/useAnimation.ts +0 -290
  202. package/src/tui/hooks/useAppState.ts +0 -403
  203. package/src/tui/index.ts +0 -9
  204. package/src/tui/services/orchestrator.ts +0 -195
  205. package/src/tui/styles/borders.ts +0 -51
  206. package/src/tui/styles/colors.ts +0 -19
  207. package/src/tui/styles/index.ts +0 -20
  208. package/src/tui/styles/indicators.ts +0 -54
  209. package/src/tui/styles/layout.ts +0 -44
  210. package/src/tui/styles/providers.ts +0 -32
  211. package/src/tui/utils/animation.ts +0 -124
  212. package/src/vendor-manifests.ts +0 -113
  213. package/src/ws-relay.ts +0 -156
  214. package/tsconfig.json +0 -28
@@ -1,99 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import { access } from "node:fs/promises";
3
- import { constants } from "node:fs";
4
- import path from "node:path";
5
- import os from "node:os";
6
-
7
- export interface DetectedCli {
8
- id: string;
9
- name: string;
10
- detected: boolean;
11
- configPath?: string;
12
- version?: string;
13
- }
14
-
15
- const CLI_CONFIG_PATHS: Record<string, string[]> = {
16
- "claude-code": [
17
- path.join(os.homedir(), ".claude"),
18
- path.join(os.homedir(), ".config", "claude-code"),
19
- ],
20
- codex: [
21
- path.join(os.homedir(), ".codex"),
22
- path.join(os.homedir(), ".config", "codex"),
23
- ],
24
- opencode: [
25
- path.join(os.homedir(), ".opencode"),
26
- path.join(os.homedir(), ".config", "opencode"),
27
- ],
28
- kilo: [
29
- path.join(os.homedir(), ".kilo"),
30
- path.join(os.homedir(), ".config", "kilo"),
31
- ],
32
- };
33
-
34
- const CLI_BOOTSTRAP_FILES: Record<string, string> = {
35
- "claude-code": "CLAUDE.md",
36
- codex: "CODEX.md",
37
- opencode: "OPENCODE.md",
38
- kilo: "KILO.md",
39
- };
40
-
41
- export function getCliBootstrapFile(cliId: string): string {
42
- return CLI_BOOTSTRAP_FILES[cliId] || "README.md";
43
- }
44
-
45
- export async function detectInstalledClis(): Promise<DetectedCli[]> {
46
- const candidates = [
47
- { id: "claude-code", name: "Claude Code", cmd: "claude-code --version" },
48
- { id: "codex", name: "Codex", cmd: "codex --version" },
49
- { id: "opencode", name: "OpenCode", cmd: "opencode --version" },
50
- { id: "kilo", name: "Kilo", cmd: "kilo --version" },
51
- ];
52
-
53
- const results: DetectedCli[] = [];
54
-
55
- for (const cli of candidates) {
56
- let detected = false;
57
- let version: string | undefined;
58
- let configPath: string | undefined;
59
-
60
- try {
61
- const output = execSync(cli.cmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
62
- detected = true;
63
- version = output.trim().split("\n")[0];
64
- } catch {
65
- // Not in PATH, check config directories
66
- }
67
-
68
- // Check for config directories even if not in PATH
69
- const configPaths = CLI_CONFIG_PATHS[cli.id] || [];
70
- for (const p of configPaths) {
71
- try {
72
- await access(p, constants.F_OK);
73
- configPath = p;
74
- if (!detected) detected = true;
75
- break;
76
- } catch {
77
- // Directory doesn't exist
78
- }
79
- }
80
-
81
- results.push({
82
- id: cli.id,
83
- name: cli.name,
84
- detected,
85
- configPath,
86
- version,
87
- });
88
- }
89
-
90
- return results;
91
- }
92
-
93
- export async function detectInstalledClisFast(): Promise<DetectedCli[]> {
94
- return detectInstalledClis();
95
- }
96
-
97
- export function getCliConfigPath(cliId: string): string | undefined {
98
- return (CLI_CONFIG_PATHS[cliId] || [])[0];
99
- }
@@ -1,249 +0,0 @@
1
- import { mkdir, writeFile, access } from "node:fs/promises";
2
- import { constants } from "node:fs";
3
- import path from "node:path";
4
- import os from "node:os";
5
-
6
- export interface ProviderConfig {
7
- id: string;
8
- name: string;
9
- apiKey?: string;
10
- model?: string;
11
- apiKeyEnv?: string;
12
- }
13
-
14
- export interface SetupConfig {
15
- mode: "hub" | "standalone" | "both";
16
- providers: ProviderConfig[];
17
- defaultProvider: string;
18
- hubTargets: string[];
19
- projectPath: string;
20
- }
21
-
22
- export interface RaxrcConfig {
23
- version: number;
24
- defaultProvider: string;
25
- strongProvider?: string;
26
- providers: Record<string, {
27
- model?: string;
28
- apiKeyEnv?: string;
29
- apiKey?: string;
30
- mode?: string;
31
- bridgeCommand?: string;
32
- bridgeCommandEnv?: string;
33
- }>;
34
- privacyMode: boolean;
35
- verifyFixLoops: number;
36
- }
37
-
38
- const ENV_VAR_MAP: Record<string, string> = {
39
- anthropic: "ANTHROPIC_API_KEY",
40
- openai: "OPENAI_API_KEY",
41
- gemini: "GOOGLE_API_KEY",
42
- mistral: "MISTRAL_API_KEY",
43
- groq: "GROQ_API_KEY",
44
- };
45
-
46
- const MODEL_MAP: Record<string, string> = {
47
- anthropic: "claude-3-5-sonnet-latest",
48
- openai: "gpt-4o",
49
- gemini: "gemini-2.0-flash",
50
- mistral: "mistral-large-latest",
51
- groq: "llama-3.3-70b-versatile",
52
- };
53
-
54
- export async function ensureDirectory(dir: string): Promise<void> {
55
- try {
56
- await access(dir, constants.F_OK);
57
- } catch {
58
- await mkdir(dir, { recursive: true });
59
- }
60
- }
61
-
62
- export async function writeRaxrc(targetDir: string, config: SetupConfig): Promise<string> {
63
- const raxrc: RaxrcConfig = {
64
- version: 1,
65
- defaultProvider: config.defaultProvider,
66
- providers: {},
67
- privacyMode: true,
68
- verifyFixLoops: 3,
69
- };
70
-
71
- // Add host provider if hub mode
72
- if (config.mode === "hub" || config.mode === "both") {
73
- const primaryTarget = config.hubTargets[0] || "claude-code";
74
- raxrc.providers.host = {
75
- model: primaryTarget,
76
- mode: "auto",
77
- bridgeCommand: primaryTarget,
78
- bridgeCommandEnv: "RAX_HOST_BRIDGE_COMMAND",
79
- };
80
- }
81
-
82
- // Add configured providers
83
- for (const provider of config.providers) {
84
- if (provider.id === "host") continue;
85
-
86
- raxrc.providers[provider.id] = {
87
- model: provider.model || MODEL_MAP[provider.id] || "unknown",
88
- apiKeyEnv: ENV_VAR_MAP[provider.id] || `${provider.id.toUpperCase()}_API_KEY`,
89
- };
90
-
91
- if (provider.apiKey) {
92
- raxrc.providers[provider.id].apiKey = provider.apiKey;
93
- }
94
- }
95
-
96
- // Ensure at least one fallback
97
- if (!raxrc.providers.openai) {
98
- raxrc.providers.openai = {
99
- model: "gpt-4o",
100
- apiKeyEnv: "OPENAI_API_KEY",
101
- };
102
- }
103
-
104
- if (!raxrc.providers.anthropic) {
105
- raxrc.providers.anthropic = {
106
- model: "claude-3-5-sonnet-latest",
107
- apiKeyEnv: "ANTHROPIC_API_KEY",
108
- };
109
- }
110
-
111
- const filePath = path.join(targetDir, ".raxrc");
112
- await writeFile(filePath, JSON.stringify(raxrc, null, 2) + "\n", "utf-8");
113
- return filePath;
114
- }
115
-
116
- export async function writeHubBootstrap(
117
- targetCli: string,
118
- configPath: string,
119
- projectPath: string
120
- ): Promise<string> {
121
- const bootstrapFileName = getBootstrapFileName(targetCli);
122
- const raxFlowDir = path.join(configPath, ".raxflow");
123
-
124
- await ensureDirectory(raxFlowDir);
125
- await ensureDirectory(path.join(raxFlowDir, "workflows"));
126
-
127
- const bootstrapContent = generateBootstrapContent(targetCli, projectPath);
128
- const bootstrapPath = path.join(configPath, bootstrapFileName);
129
-
130
- await writeFile(bootstrapPath, bootstrapContent, "utf-8");
131
-
132
- // Create example workflow
133
- const exampleWorkflow = {
134
- id: "default-workflow",
135
- nodes: [
136
- { id: "analyze", agent: "IntentClassifierAgent", dependsOn: [] },
137
- { id: "spec", agent: "SpecAgent", dependsOn: ["analyze"] },
138
- { id: "implement", agent: "CodeGeneratorAgent", dependsOn: ["spec"] },
139
- { id: "verify", agent: "ValidatorAgent", dependsOn: ["implement"] },
140
- ],
141
- };
142
-
143
- const workflowPath = path.join(raxFlowDir, "workflows", "default.json");
144
- await writeFile(workflowPath, JSON.stringify(exampleWorkflow, null, 2) + "\n", "utf-8");
145
-
146
- return bootstrapPath;
147
- }
148
-
149
- function getBootstrapFileName(cliId: string): string {
150
- const map: Record<string, string> = {
151
- "claude-code": "CLAUDE.md",
152
- codex: "CODEX.md",
153
- opencode: "OPENCODE.md",
154
- kilo: "KILO.md",
155
- };
156
- return map[cliId] || "RAXFLOW.md";
157
- }
158
-
159
- function generateBootstrapContent(cliId: string, projectPath: string): string {
160
- return `# RAXFLOW Bootstrap Configuration
161
-
162
- This project is configured to work with RAXFLOW orchestration.
163
-
164
- ## Project Context
165
- - Path: ${projectPath}
166
- - CLI: ${cliId}
167
-
168
- ## Available Commands
169
- - \`raxflow run --prompt "..." --stream\` - Execute orchestrated workflow
170
- - \`raxflow doctor\` - Check system health
171
- - \`raxflow status\` - View current state
172
-
173
- ## Workflows
174
- Workflows are stored in \`.raxflow/workflows/\` directory.
175
-
176
- ## Provider Configuration
177
- See \`.raxrc\` in the project root for provider settings.
178
- `;
179
- }
180
-
181
- export async function writeStandaloneConfig(projectPath: string): Promise<{
182
- raxFlowDir: string;
183
- workflowsDir: string;
184
- globalDir: string;
185
- }> {
186
- const raxFlowDir = path.join(projectPath, ".raxflow");
187
- const workflowsDir = path.join(raxFlowDir, "workflows");
188
- const globalDir = path.join(os.homedir(), ".raxflow");
189
-
190
- await ensureDirectory(raxFlowDir);
191
- await ensureDirectory(workflowsDir);
192
- await ensureDirectory(globalDir);
193
-
194
- // Create default workflow
195
- const defaultWorkflow = {
196
- id: "default",
197
- name: "Default Workflow",
198
- nodes: [
199
- { id: "classify", agent: "IntentClassifierAgent", dependsOn: [] },
200
- { id: "plan", agent: "TaskPlannerAgent", dependsOn: ["classify"] },
201
- { id: "code", agent: "CodeGeneratorAgent", dependsOn: ["plan"] },
202
- { id: "test", agent: "TestAgent", dependsOn: ["code"] },
203
- { id: "fix", agent: "FixAgent", dependsOn: ["test"] },
204
- ],
205
- };
206
-
207
- const workflowPath = path.join(workflowsDir, "default.json");
208
- await writeFile(workflowPath, JSON.stringify(defaultWorkflow, null, 2) + "\n", "utf-8");
209
-
210
- // Create global config
211
- const globalConfigPath = path.join(globalDir, "config.json");
212
- const globalConfig = {
213
- version: 1,
214
- createdAt: new Date().toISOString(),
215
- lastUsed: new Date().toISOString(),
216
- };
217
- await writeFile(globalConfigPath, JSON.stringify(globalConfig, null, 2) + "\n", "utf-8");
218
-
219
- return { raxFlowDir, workflowsDir, globalDir };
220
- }
221
-
222
- export async function validateSetup(projectPath: string): Promise<{
223
- valid: boolean;
224
- errors: string[];
225
- warnings: string[];
226
- }> {
227
- const errors: string[] = [];
228
- const warnings: string[] = [];
229
-
230
- // Check .raxrc exists
231
- try {
232
- await access(path.join(projectPath, ".raxrc"), constants.F_OK);
233
- } catch {
234
- errors.push(".raxrc configuration file not found");
235
- }
236
-
237
- // Check .raxflow directory
238
- try {
239
- await access(path.join(projectPath, ".raxflow"), constants.F_OK);
240
- } catch {
241
- warnings.push(".raxflow directory not found (optional for hub mode)");
242
- }
243
-
244
- return {
245
- valid: errors.length === 0,
246
- errors,
247
- warnings,
248
- };
249
- }
package/src/styles.ts DELETED
@@ -1,12 +0,0 @@
1
- export const c = {
2
- blue: (s: string) => `\u001b[34m${s}\u001b[0m`,
3
- green: (s: string) => `\u001b[32m${s}\u001b[0m`,
4
- yellow: (s: string) => `\u001b[33m${s}\u001b[0m`,
5
- red: (s: string) => `\u001b[31m${s}\u001b[0m`,
6
- magenta: (s: string) => `\u001b[35m${s}\u001b[0m`,
7
- cyan: (s: string) => `\u001b[36m${s}\u001b[0m`,
8
- white: (s: string) => `\u001b[37m${s}\u001b[0m`,
9
- gray: (s: string) => `\u001b[90m${s}\u001b[0m`,
10
- bold: (s: string) => `\u001b[1m${s}\u001b[22m`
11
- };
12
-
package/src/tui/App.tsx DELETED
@@ -1,177 +0,0 @@
1
- import React, { useState, useEffect, useRef, useMemo, useCallback } from "react";
2
- import { Box, Text, useApp, useInput } from "ink";
3
- import { Header } from "./components/Header.js";
4
- import { ChatPanel } from "./components/ChatPanel.js";
5
- import { StatusPanel } from "./components/StatusPanel.js";
6
- import { DAGPanel } from "./components/DAGPanel.js";
7
- import { LogsPanel } from "./components/LogsPanel.js";
8
- import { MetricsPanel } from "./components/MetricsPanel.js";
9
- import { MemoryPanel } from "./components/MemoryPanel.js";
10
- import { InputBar } from "./components/InputBar.js";
11
- import { HelpOverlay } from "./components/HelpOverlay.js";
12
- import { useAppState } from "./hooks/useAppState.js";
13
-
14
- type ActivePanel = "chat" | "dag" | "status" | "logs" | "metrics" | "memory";
15
-
16
- const PANEL_ORDER: ActivePanel[] = ["chat", "dag", "status", "logs", "metrics", "memory"];
17
- const TICK_INTERVAL = 200;
18
-
19
- export const App = React.memo(function App() {
20
- const { exit } = useApp();
21
- const { state, processCommand } = useAppState();
22
- const [activePanel, setActivePanel] = useState<ActivePanel>("chat");
23
- const [showHelp, setShowHelp] = useState(false);
24
- const [tick, setTick] = useState(0);
25
- const [viewMode, setViewMode] = useState<"full" | "compact">("full");
26
- const intervalRef = useRef<NodeJS.Timeout | null>(null);
27
-
28
- useEffect(() => {
29
- intervalRef.current = setInterval(() => {
30
- setTick((t) => t + 1);
31
- }, TICK_INTERVAL);
32
- return () => {
33
- if (intervalRef.current) clearInterval(intervalRef.current);
34
- };
35
- }, []);
36
-
37
- const handleTab = useCallback(() => {
38
- setActivePanel((current) => {
39
- const currentIndex = PANEL_ORDER.indexOf(current);
40
- return PANEL_ORDER[(currentIndex + 1) % PANEL_ORDER.length];
41
- });
42
- }, []);
43
-
44
- useInput((input, key) => {
45
- if (key.ctrl && (input === "c" || input === "d")) {
46
- exit();
47
- return;
48
- }
49
- if (key.escape) {
50
- if (showHelp) {
51
- setShowHelp(false);
52
- }
53
- return;
54
- }
55
- if (input === "?" && !showHelp) {
56
- setShowHelp(true);
57
- return;
58
- }
59
- if (showHelp) return;
60
-
61
- if (key.tab) {
62
- handleTab();
63
- return;
64
- }
65
-
66
- if (key.leftArrow) {
67
- setViewMode((v) => (v === "full" ? "compact" : "full"));
68
- }
69
- });
70
-
71
- const handleSubmit = useCallback((input: string) => {
72
- const trimmed = input.trim();
73
- if (!trimmed) return;
74
-
75
- if (trimmed === "exit" || trimmed === "quit") {
76
- exit();
77
- return;
78
- }
79
-
80
- if (trimmed === "?" || trimmed === "/help") {
81
- setShowHelp((s) => !s);
82
- return;
83
- }
84
-
85
- processCommand(trimmed);
86
- }, [exit, processCommand]);
87
-
88
- const handleDismissHelp = useCallback(() => setShowHelp(false), []);
89
-
90
- const headerProps = useMemo(() => ({
91
- projectName: state.projectName,
92
- agentCount: state.agentCount,
93
- provider: state.provider,
94
- status: state.status,
95
- tick,
96
- activePanel,
97
- }), [state.projectName, state.agentCount, state.provider, state.status, tick, activePanel]);
98
-
99
- const chatPanelProps = useMemo(() => ({
100
- messages: state.messages,
101
- isProcessing: state.isProcessing,
102
- isActive: activePanel === "chat",
103
- }), [state.messages, state.isProcessing, activePanel]);
104
-
105
- const dagPanelProps = useMemo(() => ({
106
- workflowState: state.workflowState,
107
- tick,
108
- isActive: activePanel === "dag",
109
- }), [state.workflowState, tick, activePanel]);
110
-
111
- const logsPanelProps = useMemo(() => ({
112
- logs: state.logs,
113
- isActive: activePanel === "logs",
114
- }), [state.logs, activePanel]);
115
-
116
- const metricsPanelProps = useMemo(() => ({
117
- metrics: state.metrics,
118
- fitness: state.fitness,
119
- isActive: activePanel === "metrics",
120
- tick,
121
- }), [state.metrics, state.fitness, activePanel, tick]);
122
-
123
- const memoryPanelProps = useMemo(() => ({
124
- nodes: [] as never[],
125
- edges: [] as never[],
126
- nodeCount: 247,
127
- cacheHitRate: 94,
128
- isActive: activePanel === "memory",
129
- tick,
130
- }), [activePanel, tick]);
131
-
132
- const statusPanelProps = useMemo(() => ({
133
- agents: state.agents,
134
- providers: state.providers,
135
- fitness: state.fitness,
136
- currentWorkflow: state.currentWorkflow,
137
- isActive: activePanel === "status",
138
- tick,
139
- }), [state.agents, state.providers, state.fitness, state.currentWorkflow, activePanel, tick]);
140
-
141
- const inputBarProps = useMemo(() => ({
142
- onSubmit: handleSubmit,
143
- suggestions: state.suggestions,
144
- isProcessing: state.isProcessing,
145
- projectName: state.projectName,
146
- }), [handleSubmit, state.suggestions, state.isProcessing, state.projectName]);
147
-
148
- return (
149
- <Box flexDirection="column" height="100%" width="100%">
150
- <Header {...headerProps} />
151
-
152
- {showHelp ? (
153
- <HelpOverlay onDismiss={handleDismissHelp} />
154
- ) : (
155
- <>
156
- <Box flexGrow={1} flexDirection="row" width="100%">
157
- <ChatPanel {...chatPanelProps} />
158
- <DAGPanel {...dagPanelProps} />
159
- {viewMode === "full" && (
160
- <>
161
- <LogsPanel {...logsPanelProps} />
162
- <Box flexDirection="column">
163
- <MetricsPanel {...metricsPanelProps} />
164
- <MemoryPanel {...memoryPanelProps} />
165
- </Box>
166
- </>
167
- )}
168
- {viewMode === "compact" && (
169
- <StatusPanel {...statusPanelProps} />
170
- )}
171
- </Box>
172
- <InputBar {...inputBarProps} />
173
- </>
174
- )}
175
- </Box>
176
- );
177
- });
@@ -1,84 +0,0 @@
1
- import React, { memo, useMemo } from "react";
2
- import { Text } from "ink";
3
- import { tuiColors } from "../styles/index.js";
4
-
5
- const THINKING_FRAMES = ["◠", "◡", "◠", "◡"];
6
- const PROCESSING_FRAMES = ["▶", "▷", "▶", "▷"];
7
- const RUNNING_FRAMES = ["●", "◉", "●", "○"];
8
- const WAITING_FRAMES = ["◐", "◓", "◐", "◓"];
9
-
10
- export type AgentState = 'idle' | 'thinking' | 'processing' | 'running' | 'success' | 'error' | 'waiting';
11
-
12
- interface AgentStateIconProps {
13
- state: AgentState;
14
- animated?: boolean;
15
- tick?: number;
16
- }
17
-
18
- const STATE_CONFIG: Record<AgentState, { icon: string; color: string; animated: boolean; frames?: string[] }> = {
19
- idle: { icon: "○", color: tuiColors.textTertiary, animated: false },
20
- thinking: { icon: "◠", color: tuiColors.warning, animated: true, frames: THINKING_FRAMES },
21
- processing: { icon: "▶", color: tuiColors.primary, animated: true, frames: PROCESSING_FRAMES },
22
- running: { icon: "●", color: tuiColors.success, animated: true, frames: RUNNING_FRAMES },
23
- success: { icon: "✓", color: tuiColors.success, animated: false },
24
- error: { icon: "✗", color: tuiColors.error, animated: false },
25
- waiting: { icon: "◐", color: tuiColors.warning, animated: true, frames: WAITING_FRAMES },
26
- };
27
-
28
- export const AgentStateIcon = memo(function AgentStateIcon({ state, animated = true, tick = 0 }: AgentStateIconProps) {
29
- const config = STATE_CONFIG[state];
30
- const showAnimation = animated && config.animated && config.frames;
31
-
32
- const icon = useMemo(() => {
33
- if (showAnimation && config.frames) {
34
- return config.frames[tick % config.frames.length];
35
- }
36
- return config.icon;
37
- }, [showAnimation, config.frames, config.icon, tick]);
38
-
39
- return <Text color={config.color}>{icon}</Text>;
40
- });
41
-
42
- export function useAgentStateFrame(state: AgentState, tick: number): string {
43
- const config = STATE_CONFIG[state];
44
- if (config.frames) {
45
- return config.frames[tick % config.frames.length];
46
- }
47
- return config.icon;
48
- }
49
-
50
- const STATE_LABELS: Record<AgentState, string> = {
51
- idle: "pending",
52
- thinking: "thinking...",
53
- processing: "processing",
54
- running: "running",
55
- success: "done",
56
- error: "error",
57
- waiting: "waiting",
58
- };
59
-
60
- interface AgentStateWithLabelProps {
61
- state: AgentState;
62
- label: string;
63
- tick: number;
64
- }
65
-
66
- export const AgentStateWithLabel = memo(function AgentStateWithLabel({ state, label, tick }: AgentStateWithLabelProps) {
67
- return (
68
- <>
69
- <AgentStateIcon state={state} tick={tick} />
70
- <Text color={tuiColors.textSecondary}> {label}</Text>
71
- <Text color={tuiColors.textTertiary}> {STATE_LABELS[state]}</Text>
72
- </>
73
- );
74
- });
75
-
76
- export const agentStateColors: Record<AgentState, string> = {
77
- idle: tuiColors.textTertiary,
78
- thinking: tuiColors.warning,
79
- processing: tuiColors.primary,
80
- running: tuiColors.success,
81
- success: tuiColors.success,
82
- error: tuiColors.error,
83
- waiting: tuiColors.warning,
84
- };