@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.
- package/dist/benchmark.d.ts +10 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bootstrap.d.ts +8 -0
- package/dist/bridge-adapter-templates.d.ts +4 -0
- package/dist/bridge-test.d.ts +7 -0
- package/dist/dashboard.d.ts +4 -0
- package/dist/doctor.d.ts +6 -0
- package/dist/evolve.d.ts +7 -0
- package/dist/host-init-templates.d.ts +16 -0
- package/dist/hub/__tests__/commands.test.d.ts +2 -0
- package/dist/hub/__tests__/history.test.d.ts +2 -0
- package/dist/hub/__tests__/parser.test.d.ts +2 -0
- package/dist/hub/commands/agents.d.ts +3 -0
- package/dist/hub/commands/index.d.ts +4 -0
- package/dist/hub/commands/logs.d.ts +3 -0
- package/dist/hub/commands/memory.d.ts +3 -0
- package/dist/hub/commands/metrics.d.ts +3 -0
- package/dist/hub/commands/providers.d.ts +3 -0
- package/dist/hub/commands/run.d.ts +3 -0
- package/dist/hub/commands/status.d.ts +3 -0
- package/dist/hub/commands/workflows.d.ts +3 -0
- package/dist/hub/config-loader.d.ts +4 -0
- package/dist/hub/history.d.ts +13 -0
- package/dist/hub/index.d.ts +4 -0
- package/dist/hub/parser.d.ts +4 -0
- package/dist/hub/styles/borders.d.ts +23 -0
- package/dist/hub/styles/colors.d.ts +63 -0
- package/dist/hub/styles/typography.d.ts +34 -0
- package/dist/hub/types.d.ts +27 -0
- package/{src/index.ts → dist/index.d.ts} +1 -0
- package/dist/init-host.d.ts +10 -0
- package/dist/install.d.ts +8 -0
- package/dist/run.d.ts +16 -0
- package/dist/setup/components/ProviderSelector.d.ts.map +1 -1
- package/dist/setup/components/ProviderSelector.js +8 -7
- package/dist/setup/components/ProviderSelector.js.map +1 -1
- package/dist/styles.d.ts +12 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +7 -2
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/ChatPanel.d.ts +1 -0
- package/dist/tui/components/ChatPanel.d.ts.map +1 -1
- package/dist/tui/components/ChatPanel.js +4 -3
- package/dist/tui/components/ChatPanel.js.map +1 -1
- package/dist/tui/components/DAGPanel.d.ts +1 -0
- package/dist/tui/components/DAGPanel.d.ts.map +1 -1
- package/dist/tui/components/DAGPanel.js +4 -3
- package/dist/tui/components/DAGPanel.js.map +1 -1
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +1 -1
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/InputBar.d.ts.map +1 -1
- package/dist/tui/components/InputBar.js +1 -1
- package/dist/tui/components/InputBar.js.map +1 -1
- package/dist/tui/components/LogsPanel.d.ts +1 -0
- package/dist/tui/components/LogsPanel.d.ts.map +1 -1
- package/dist/tui/components/LogsPanel.js +4 -3
- package/dist/tui/components/LogsPanel.js.map +1 -1
- package/dist/tui/components/MemoryPanel.d.ts +1 -0
- package/dist/tui/components/MemoryPanel.d.ts.map +1 -1
- package/dist/tui/components/MemoryPanel.js +2 -2
- package/dist/tui/components/MemoryPanel.js.map +1 -1
- package/dist/tui/components/MetricsPanel.d.ts +1 -0
- package/dist/tui/components/MetricsPanel.d.ts.map +1 -1
- package/dist/tui/components/MetricsPanel.js +2 -2
- package/dist/tui/components/MetricsPanel.js.map +1 -1
- package/dist/tui/components/StatusPanel.d.ts +1 -0
- package/dist/tui/components/StatusPanel.d.ts.map +1 -1
- package/dist/tui/components/StatusPanel.js +4 -3
- package/dist/tui/components/StatusPanel.js.map +1 -1
- package/dist/vendor-manifests.d.ts +22 -0
- package/package.json +5 -1
- package/dashboard/index.html +0 -420
- package/dist/hub/chat/ChatApp.d.ts +0 -2
- package/dist/hub/chat/ChatApp.d.ts.map +0 -1
- package/dist/hub/chat/ChatApp.js +0 -146
- package/dist/hub/chat/ChatApp.js.map +0 -1
- package/dist/hub/chat/components/ChatInput.d.ts +0 -9
- package/dist/hub/chat/components/ChatInput.d.ts.map +0 -1
- package/dist/hub/chat/components/ChatInput.js +0 -19
- package/dist/hub/chat/components/ChatInput.js.map +0 -1
- package/dist/hub/chat/components/MessageList.d.ts +0 -7
- package/dist/hub/chat/components/MessageList.d.ts.map +0 -1
- package/dist/hub/chat/components/MessageList.js +0 -6
- package/dist/hub/chat/components/MessageList.js.map +0 -1
- package/dist/hub/chat/context.d.ts.map +0 -1
- package/dist/hub/chat/context.js +0 -42
- package/dist/hub/chat/context.js.map +0 -1
- package/dist/hub/chat/hooks/useChatHistory.d.ts +0 -7
- package/dist/hub/chat/hooks/useChatHistory.d.ts.map +0 -1
- package/dist/hub/chat/hooks/useChatHistory.js +0 -31
- package/dist/hub/chat/hooks/useChatHistory.js.map +0 -1
- package/dist/hub/chat/index.d.ts.map +0 -1
- package/dist/hub/chat/index.js +0 -7
- package/dist/hub/chat/index.js.map +0 -1
- package/dist/hub/chat/intent-parser.d.ts.map +0 -1
- package/dist/hub/chat/intent-parser.js +0 -48
- package/dist/hub/chat/intent-parser.js.map +0 -1
- package/dist/hub/chat/types.d.ts.map +0 -1
- package/dist/hub/chat/types.js +0 -2
- package/dist/hub/chat/types.js.map +0 -1
- package/dist/hub/tui/App.d.ts +0 -2
- package/dist/hub/tui/App.d.ts.map +0 -1
- package/dist/hub/tui/App.js +0 -53
- package/dist/hub/tui/App.js.map +0 -1
- package/dist/hub/tui/components/AgentQueue.d.ts +0 -6
- package/dist/hub/tui/components/AgentQueue.d.ts.map +0 -1
- package/dist/hub/tui/components/AgentQueue.js +0 -20
- package/dist/hub/tui/components/AgentQueue.js.map +0 -1
- package/dist/hub/tui/components/DAGPanel.d.ts +0 -16
- package/dist/hub/tui/components/DAGPanel.d.ts.map +0 -1
- package/dist/hub/tui/components/DAGPanel.js +0 -51
- package/dist/hub/tui/components/DAGPanel.js.map +0 -1
- package/dist/hub/tui/components/Header.d.ts +0 -7
- package/dist/hub/tui/components/Header.d.ts.map +0 -1
- package/dist/hub/tui/components/Header.js +0 -17
- package/dist/hub/tui/components/Header.js.map +0 -1
- package/dist/hub/tui/components/LogsPanel.d.ts +0 -6
- package/dist/hub/tui/components/LogsPanel.d.ts.map +0 -1
- package/dist/hub/tui/components/LogsPanel.js +0 -26
- package/dist/hub/tui/components/LogsPanel.js.map +0 -1
- package/dist/hub/tui/components/StatusBar.d.ts +0 -8
- package/dist/hub/tui/components/StatusBar.d.ts.map +0 -1
- package/dist/hub/tui/components/StatusBar.js +0 -7
- package/dist/hub/tui/components/StatusBar.js.map +0 -1
- package/dist/hub/tui/hooks/useEvents.d.ts +0 -2
- package/dist/hub/tui/hooks/useEvents.d.ts.map +0 -1
- package/dist/hub/tui/hooks/useEvents.js +0 -13
- package/dist/hub/tui/hooks/useEvents.js.map +0 -1
- package/dist/hub/tui/index.d.ts.map +0 -1
- package/dist/hub/tui/index.js +0 -7
- package/dist/hub/tui/index.js.map +0 -1
- package/dist/hub/tui/types.d.ts.map +0 -1
- package/dist/hub/tui/types.js +0 -2
- package/dist/hub/tui/types.js.map +0 -1
- package/src/benchmark.ts +0 -156
- package/src/bin.ts +0 -156
- package/src/bootstrap.ts +0 -36
- package/src/bridge-adapter-templates.ts +0 -181
- package/src/bridge-test.ts +0 -107
- package/src/dashboard.ts +0 -51
- package/src/doctor.ts +0 -92
- package/src/evolve.ts +0 -74
- package/src/host-init-templates.ts +0 -134
- package/src/hub/__tests__/commands.test.ts +0 -84
- package/src/hub/__tests__/history.test.ts +0 -137
- package/src/hub/__tests__/parser.test.ts +0 -105
- package/src/hub/commands/agents.ts +0 -53
- package/src/hub/commands/index.ts +0 -140
- package/src/hub/commands/logs.ts +0 -70
- package/src/hub/commands/memory.ts +0 -47
- package/src/hub/commands/metrics.ts +0 -49
- package/src/hub/commands/providers.ts +0 -39
- package/src/hub/commands/run.ts +0 -37
- package/src/hub/commands/status.ts +0 -69
- package/src/hub/commands/workflows.ts +0 -64
- package/src/hub/config-loader.ts +0 -37
- package/src/hub/event-listener.ts +0 -17
- package/src/hub/history.ts +0 -66
- package/src/hub/index.ts +0 -132
- package/src/hub/parser.ts +0 -107
- package/src/hub/styles/borders.ts +0 -74
- package/src/hub/styles/colors.ts +0 -129
- package/src/hub/styles/typography.ts +0 -68
- package/src/hub/types.ts +0 -31
- package/src/init-host.ts +0 -285
- package/src/install.ts +0 -118
- package/src/run.ts +0 -317
- package/src/setup/components/ApiKeyInput.tsx +0 -158
- package/src/setup/components/AsciiBanner.tsx +0 -125
- package/src/setup/components/CliDetector.tsx +0 -230
- package/src/setup/components/ModeSelector.tsx +0 -137
- package/src/setup/components/ProviderSelector.tsx +0 -174
- package/src/setup/components/SetupWizard.tsx +0 -368
- package/src/setup/components/StepIndicator.tsx +0 -74
- package/src/setup/components/SuccessScreen.tsx +0 -229
- package/src/setup/index.ts +0 -34
- package/src/setup/utils/cli-detection.ts +0 -99
- package/src/setup/utils/config-writer.ts +0 -249
- package/src/styles.ts +0 -12
- package/src/tui/App.tsx +0 -177
- package/src/tui/components/AgentStateIcon.tsx +0 -84
- package/src/tui/components/AnimatedBranch.tsx +0 -134
- package/src/tui/components/ChatPanel.tsx +0 -125
- package/src/tui/components/DAGPanel.tsx +0 -208
- package/src/tui/components/ExecutionTimeline.tsx +0 -225
- package/src/tui/components/Header.tsx +0 -109
- package/src/tui/components/HelpOverlay.tsx +0 -140
- package/src/tui/components/InputBar.tsx +0 -69
- package/src/tui/components/LogsPanel.tsx +0 -129
- package/src/tui/components/MemoryPanel.tsx +0 -163
- package/src/tui/components/MetricsPanel.tsx +0 -149
- package/src/tui/components/StatusPanel.tsx +0 -137
- package/src/tui/components/TaskTree.tsx +0 -159
- package/src/tui/components/animations/ProgressBar.tsx +0 -160
- package/src/tui/components/animations/Pulse.tsx +0 -73
- package/src/tui/components/animations/Spinner.tsx +0 -54
- package/src/tui/components/animations/StatusAnimator.tsx +0 -153
- package/src/tui/components/animations/TypingEffect.tsx +0 -119
- package/src/tui/components/animations/index.ts +0 -16
- package/src/tui/hooks/useAnimation.ts +0 -290
- package/src/tui/hooks/useAppState.ts +0 -403
- package/src/tui/index.ts +0 -9
- package/src/tui/services/orchestrator.ts +0 -195
- package/src/tui/styles/borders.ts +0 -51
- package/src/tui/styles/colors.ts +0 -19
- package/src/tui/styles/index.ts +0 -20
- package/src/tui/styles/indicators.ts +0 -54
- package/src/tui/styles/layout.ts +0 -44
- package/src/tui/styles/providers.ts +0 -32
- package/src/tui/utils/animation.ts +0 -124
- package/src/vendor-manifests.ts +0 -113
- package/src/ws-relay.ts +0 -156
- 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
|
-
};
|