@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
package/src/run.ts
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import * as readline from "node:readline/promises";
|
|
5
|
-
import { stdin as input, stdout as output } from "node:process";
|
|
6
|
-
|
|
7
|
-
import { CoreOrchestrator, WorkflowGraph } from "rax-flow-core";
|
|
8
|
-
import { buildOfficialAgentsRuntime } from "rax-flow-agents";
|
|
9
|
-
import { ClaudeAdapter, GenericRestAdapter, HostBridgeAdapter, OpenAIAdapter } from "rax-flow-providers";
|
|
10
|
-
import { WebSocketRelay } from "./ws-relay.js";
|
|
11
|
-
import { c } from "./styles.js";
|
|
12
|
-
|
|
13
|
-
interface RunOptions {
|
|
14
|
-
cwd: string;
|
|
15
|
-
prompt: string;
|
|
16
|
-
workflowPath?: string;
|
|
17
|
-
asJson?: boolean;
|
|
18
|
-
stream?: boolean;
|
|
19
|
-
maxParallel?: number;
|
|
20
|
-
noCachePersist?: boolean;
|
|
21
|
-
providerOverride?: string;
|
|
22
|
-
bridgeCommandOverride?: string;
|
|
23
|
-
ui?: boolean;
|
|
24
|
-
yolo?: boolean;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
interface RaxConfig {
|
|
29
|
-
defaultProvider?: string;
|
|
30
|
-
strongProvider?: string;
|
|
31
|
-
providers?: {
|
|
32
|
-
host?: { model?: string; mode?: "auto" | "bridge-only" | "mock"; bridgeCommandEnv?: string; timeoutMs?: number };
|
|
33
|
-
openai?: { model?: string; apiKeyEnv?: string; baseUrl?: string };
|
|
34
|
-
claude?: { model?: string; apiKeyEnv?: string; baseUrl?: string };
|
|
35
|
-
rest?: { endpoint?: string; tokenEnv?: string; model?: string };
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async function loadConfig(cwd: string): Promise<RaxConfig> {
|
|
40
|
-
const file = path.join(cwd, ".raxrc");
|
|
41
|
-
const raw = await readFile(file, "utf8");
|
|
42
|
-
return JSON.parse(raw) as RaxConfig;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async function loadWorkflow(cwd: string, workflowPath?: string): Promise<WorkflowGraph | undefined> {
|
|
46
|
-
const file = workflowPath
|
|
47
|
-
? path.resolve(cwd, workflowPath)
|
|
48
|
-
: path.join(cwd, ".raxflow", "workflows", "fullstack-feature.json");
|
|
49
|
-
|
|
50
|
-
try {
|
|
51
|
-
const raw = await readFile(file, "utf8");
|
|
52
|
-
return JSON.parse(raw) as WorkflowGraph;
|
|
53
|
-
} catch {
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function createProviders(config: RaxConfig, bridgeCommandOverride?: string) {
|
|
59
|
-
const providers: Record<string, OpenAIAdapter | ClaudeAdapter | GenericRestAdapter | HostBridgeAdapter> = {};
|
|
60
|
-
|
|
61
|
-
const hostCfg = config.providers?.host;
|
|
62
|
-
const bridgeCommand = bridgeCommandOverride ?? process.env[hostCfg?.bridgeCommandEnv ?? "RAX_HOST_BRIDGE_COMMAND"];
|
|
63
|
-
providers.host = new HostBridgeAdapter({
|
|
64
|
-
model: hostCfg?.model ?? "host-managed",
|
|
65
|
-
mode: hostCfg?.mode ?? "auto",
|
|
66
|
-
command: bridgeCommand,
|
|
67
|
-
timeoutMs: hostCfg?.timeoutMs ?? 20000
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
const openaiKey = process.env[config.providers?.openai?.apiKeyEnv ?? "OPENAI_API_KEY"];
|
|
71
|
-
if (openaiKey) {
|
|
72
|
-
providers.openai = new OpenAIAdapter(openaiKey, config.providers?.openai?.baseUrl);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const claudeKey = process.env[config.providers?.claude?.apiKeyEnv ?? "ANTHROPIC_API_KEY"];
|
|
76
|
-
if (claudeKey) {
|
|
77
|
-
providers.claude = new ClaudeAdapter(claudeKey, config.providers?.claude?.baseUrl);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const restEndpoint = config.providers?.rest?.endpoint;
|
|
81
|
-
if (restEndpoint) {
|
|
82
|
-
const restToken = process.env[config.providers?.rest?.tokenEnv ?? "RAX_REST_TOKEN"];
|
|
83
|
-
providers.rest = new GenericRestAdapter(restEndpoint, restToken);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return providers;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function cachePath(cwd: string): string {
|
|
90
|
-
return path.join(cwd, ".raxflow", "cache", "semantic-cache.json");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async function saveHistory(cwd: string, taskId: string, data: any) {
|
|
94
|
-
const dir = path.join(cwd, ".raxflow", "history");
|
|
95
|
-
await mkdir(dir, { recursive: true });
|
|
96
|
-
const file = path.join(dir, `${taskId}.json`);
|
|
97
|
-
await writeFile(file, JSON.stringify(data, null, 2));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
async function askApproval(nodeId: string, agent: string, data: any): Promise<{ approved: boolean; feedback?: string }> {
|
|
101
|
-
const rl = readline.createInterface({ input, output });
|
|
102
|
-
console.log(c.magenta("\n--- [HUMAN INTERVENTION REQUIRED] ---"));
|
|
103
|
-
console.log(c.cyan(`Step: ${nodeId} | Agent: ${agent}`));
|
|
104
|
-
console.log(c.white("Candidate Output Data:"));
|
|
105
|
-
console.log(JSON.stringify(data, null, 2));
|
|
106
|
-
|
|
107
|
-
const answer = await rl.question(c.yellow("\nApprove? [Y to accept, or type your feedback to reject/fix]: "));
|
|
108
|
-
rl.close();
|
|
109
|
-
|
|
110
|
-
if (answer.toLowerCase() === "y" || answer === "") {
|
|
111
|
-
return { approved: true };
|
|
112
|
-
} else {
|
|
113
|
-
return { approved: false, feedback: answer };
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
export async function runWorkflow(options: RunOptions): Promise<number> {
|
|
119
|
-
let config: RaxConfig;
|
|
120
|
-
try {
|
|
121
|
-
config = await loadConfig(options.cwd);
|
|
122
|
-
} catch {
|
|
123
|
-
console.error(c.red("Missing .raxrc. Run `raxflow install` first."));
|
|
124
|
-
return 1;
|
|
125
|
-
}
|
|
126
|
-
const providers = createProviders(config, options.bridgeCommandOverride);
|
|
127
|
-
const selectedDefault = options.providerOverride ?? config.defaultProvider ?? "host";
|
|
128
|
-
|
|
129
|
-
// Pre-flight check: Ensure Zero-Error compliance for Bridge integration
|
|
130
|
-
if (selectedDefault === "host") {
|
|
131
|
-
const health = await providers.host.healthCheck();
|
|
132
|
-
if (!health) {
|
|
133
|
-
console.error(c.red(`[Error] Host Bridge connectivity failed.`));
|
|
134
|
-
console.error(c.yellow(`Check your .raxrc or set RAX_HOST_BRIDGE_COMMAND env var.`));
|
|
135
|
-
console.log("Tip: run `raxflow doctor` for detailed diagnostics.");
|
|
136
|
-
return 1;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const selectedStrong = config.strongProvider ?? "host";
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const agents = buildOfficialAgentsRuntime({
|
|
144
|
-
providers,
|
|
145
|
-
defaultProvider: selectedDefault,
|
|
146
|
-
strongProvider: selectedStrong,
|
|
147
|
-
providerModels: {
|
|
148
|
-
host: config.providers?.host?.model ?? "host-managed",
|
|
149
|
-
openai: config.providers?.openai?.model ?? "gpt-4.1-mini",
|
|
150
|
-
claude: config.providers?.claude?.model ?? "claude-3-5-sonnet-latest",
|
|
151
|
-
rest: config.providers?.rest?.model ?? "generic-llm"
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
const workflow = await loadWorkflow(options.cwd, options.workflowPath);
|
|
156
|
-
// Memory System: Quantum Semantic Graph Memory (QSGM)
|
|
157
|
-
const memoryDir = path.join(options.cwd, ".raxflow", "memory");
|
|
158
|
-
const { LocalVectorStore, GraphMemory, MemoryManager } = await import("rax-flow-core");
|
|
159
|
-
|
|
160
|
-
const vectorStore = new LocalVectorStore(path.join(memoryDir, "vector-index.json"));
|
|
161
|
-
await vectorStore.load();
|
|
162
|
-
|
|
163
|
-
const graphMemory = new GraphMemory(path.join(memoryDir, "graph-memory.json"));
|
|
164
|
-
await graphMemory.load();
|
|
165
|
-
|
|
166
|
-
const memoryManager = new MemoryManager(vectorStore, graphMemory);
|
|
167
|
-
|
|
168
|
-
const orchestrator = new CoreOrchestrator(providers, agents, { memory: memoryManager }, { maxParallel: options.maxParallel ?? 4, cacheTtlMs: 1000 * 60 * 60 * 24 });
|
|
169
|
-
|
|
170
|
-
// Governance System: Enterprise security & compliance
|
|
171
|
-
const { GovernancePlugin, PIIPolicy } = await import("rax-flow-core");
|
|
172
|
-
const governancePlugin = new GovernancePlugin(
|
|
173
|
-
[new PIIPolicy()],
|
|
174
|
-
path.join(options.cwd, ".raxflow", "audit"),
|
|
175
|
-
orchestrator.events
|
|
176
|
-
);
|
|
177
|
-
orchestrator.registerPlugin(governancePlugin);
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
// Register Memory Plugin if an embedding provider is available (OpenAI in this case)
|
|
181
|
-
if (providers.openai) {
|
|
182
|
-
const { LongTermMemoryPlugin } = await import("rax-flow-core");
|
|
183
|
-
orchestrator.registerPlugin(new LongTermMemoryPlugin(memoryManager, providers.openai as any));
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
let relay: WebSocketRelay | undefined;
|
|
189
|
-
|
|
190
|
-
if (options.ui) {
|
|
191
|
-
relay = new WebSocketRelay(3002);
|
|
192
|
-
relay.start(orchestrator.events);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const persistentCacheFile = cachePath(options.cwd);
|
|
196
|
-
if (!options.noCachePersist) {
|
|
197
|
-
await orchestrator.loadCache(persistentCacheFile);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const sessionEvents: any[] = [];
|
|
201
|
-
orchestrator.onEvent(e => sessionEvents.push(e));
|
|
202
|
-
|
|
203
|
-
// Connect WebSocket relay resolutions to orchestrator
|
|
204
|
-
orchestrator.onEvent((event: any) => {
|
|
205
|
-
if (event.type === "INTERNAL_RESOLVE_APPROVAL") {
|
|
206
|
-
orchestrator.resolveApproval(event.taskId, event.nodeId, event.approved, event.feedback);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
if (options.stream) {
|
|
211
|
-
orchestrator.onEvent((event) => {
|
|
212
|
-
if (event.type === "graph_ready") {
|
|
213
|
-
console.log(c.magenta(c.bold(`\n--- [DAG FLOW] ---`)));
|
|
214
|
-
const edgeCount = event.workflow.nodes.reduce((acc: number, n: any) => acc + (n.dependsOn?.length || 0), 0);
|
|
215
|
-
console.log(c.gray(`Tasks: ${event.workflow.nodes.length} | Edges: ${edgeCount}`));
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (event.type === "node_start") {
|
|
219
|
-
const retryPrefix = event.retry > 0 ? c.yellow(` (Retry ${event.retry})`) : "";
|
|
220
|
-
console.log(`${c.blue("◆")} ${c.bold(event.nodeId)}${retryPrefix} ${c.gray(`[${event.agent}]`)}`);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
if (event.type === "node_awaiting_approval") {
|
|
224
|
-
if (options.yolo) {
|
|
225
|
-
orchestrator.resolveApproval(event.taskId, event.nodeId, true);
|
|
226
|
-
} else {
|
|
227
|
-
(async () => {
|
|
228
|
-
const { approved, feedback } = await askApproval(event.nodeId, event.agent, event.data);
|
|
229
|
-
orchestrator.resolveApproval(event.taskId, event.nodeId, approved, feedback);
|
|
230
|
-
})();
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (event.type === "node_end") {
|
|
235
|
-
const confColor = event.confidence >= 0.8 ? c.green : (event.confidence >= 0.6 ? c.yellow : c.red);
|
|
236
|
-
const icon = event.success ? c.green("✔") : c.red("✘");
|
|
237
|
-
console.log(` ${icon} ${confColor(`conf: ${(event.confidence * 100).toFixed(0)}%`)} ${c.gray(`cost: $${(event.costUsd || 0).toFixed(5)}`)}`);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
if (event.type === "node_error") {
|
|
241
|
-
console.log(` ${c.red("!")} ${c.red(event.message)}`);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
if (event.type === "audit_record" && event.mutation) {
|
|
245
|
-
console.log(c.magenta(`\n🧬 [Genetic Mutation Generated]`));
|
|
246
|
-
console.log(c.magenta(` Reason: ${event.mutation.reason ?? "Optimization"}`));
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const taskId = `task_${Date.now()}_${Math.floor(Math.random() * 1000)}`;
|
|
252
|
-
const result = await orchestrator.run(
|
|
253
|
-
{
|
|
254
|
-
taskId,
|
|
255
|
-
userPrompt: options.prompt,
|
|
256
|
-
context: {
|
|
257
|
-
cli: true,
|
|
258
|
-
host: os.hostname()
|
|
259
|
-
}
|
|
260
|
-
},
|
|
261
|
-
workflow
|
|
262
|
-
);
|
|
263
|
-
|
|
264
|
-
if (relay) {
|
|
265
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
266
|
-
relay.stop();
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
if (!options.noCachePersist) {
|
|
270
|
-
await orchestrator.saveCache(persistentCacheFile);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// Save to history
|
|
274
|
-
await saveHistory(options.cwd, taskId, {
|
|
275
|
-
taskId,
|
|
276
|
-
timestamp: Date.now(),
|
|
277
|
-
prompt: options.prompt,
|
|
278
|
-
result: result.result,
|
|
279
|
-
metrics: result.metrics,
|
|
280
|
-
workflow: result.workflow,
|
|
281
|
-
events: sessionEvents
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
if (options.asJson) {
|
|
285
|
-
console.log(JSON.stringify(result, null, 2));
|
|
286
|
-
return 0;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Final Summary Table
|
|
290
|
-
console.log(c.bold(c.cyan(`\n\n--- [RUN SUMMARY] ---`)));
|
|
291
|
-
const tableData = [
|
|
292
|
-
["Task ID", taskId],
|
|
293
|
-
["Main Agent", result.result.agent],
|
|
294
|
-
["Status", result.result.success ? c.green("SUCCESS") : c.red("FAILED")],
|
|
295
|
-
["Confidence", `${(result.result.confidence * 100).toFixed(1)}%`],
|
|
296
|
-
["Retries", result.metrics.retries.toString()],
|
|
297
|
-
["Escalations", result.metrics.escalations.toString()],
|
|
298
|
-
["Latency", `${(result.metrics.totalLatencyMs / 1000).toFixed(2)}s`],
|
|
299
|
-
["Total Cost", c.yellow(`$${(result.metrics.totalCostUsd || 0).toFixed(5)}`)]
|
|
300
|
-
];
|
|
301
|
-
|
|
302
|
-
for (const [key, value] of tableData) {
|
|
303
|
-
console.log(`${c.bold(key.padEnd(15))} : ${value}`);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
if (result.result.logs.length > 0) {
|
|
307
|
-
console.log(c.bold(`\nTrace Logs:`));
|
|
308
|
-
for (const line of result.result.logs.slice(-5)) {
|
|
309
|
-
console.log(c.gray(` • ${line}`));
|
|
310
|
-
}
|
|
311
|
-
if (result.result.logs.length > 5) {
|
|
312
|
-
console.log(c.gray(` ... and ${result.result.logs.length - 5} more lines.`));
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
return 0;
|
|
317
|
-
}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import React, { useState } from "react";
|
|
2
|
-
import { Box, Text, useInput } from "ink";
|
|
3
|
-
import TextInput from "ink-text-input";
|
|
4
|
-
|
|
5
|
-
interface ApiKeyInputProps {
|
|
6
|
-
providerId: string;
|
|
7
|
-
providerName: string;
|
|
8
|
-
currentKey?: string;
|
|
9
|
-
envVar?: string;
|
|
10
|
-
onSetKey: (key: string) => void;
|
|
11
|
-
onSkip: () => void;
|
|
12
|
-
onBack: () => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function ApiKeyInput({
|
|
16
|
-
providerId,
|
|
17
|
-
providerName,
|
|
18
|
-
currentKey,
|
|
19
|
-
envVar,
|
|
20
|
-
onSetKey,
|
|
21
|
-
onSkip,
|
|
22
|
-
onBack,
|
|
23
|
-
}: ApiKeyInputProps) {
|
|
24
|
-
const [inputValue, setInputValue] = useState(currentKey || "");
|
|
25
|
-
const [isEditing, setIsEditing] = useState(true);
|
|
26
|
-
const [showKey, setShowKey] = useState(false);
|
|
27
|
-
const PRIMARY = "#f97316";
|
|
28
|
-
|
|
29
|
-
const envValue = process.env[envVar || ""];
|
|
30
|
-
|
|
31
|
-
useInput((input, key) => {
|
|
32
|
-
if (!isEditing) {
|
|
33
|
-
if (key.return || input === "s") {
|
|
34
|
-
onSkip();
|
|
35
|
-
} else if (input === "b") {
|
|
36
|
-
onBack();
|
|
37
|
-
} else if (input === "e") {
|
|
38
|
-
setIsEditing(true);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
const handleSubmit = (value: string) => {
|
|
44
|
-
if (value.trim()) {
|
|
45
|
-
onSetKey(value.trim());
|
|
46
|
-
} else {
|
|
47
|
-
setIsEditing(false);
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const maskedValue = (key: string) => {
|
|
52
|
-
if (key.length <= 8) return "••••••••";
|
|
53
|
-
return key.slice(0, 4) + "•".repeat(8) + key.slice(-4);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
return (
|
|
57
|
-
<Box flexDirection="column">
|
|
58
|
-
<Box marginBottom={1}>
|
|
59
|
-
<Text color={PRIMARY} bold>
|
|
60
|
-
CONFIGURE {providerName.toUpperCase()}
|
|
61
|
-
</Text>
|
|
62
|
-
</Box>
|
|
63
|
-
|
|
64
|
-
{envValue && (
|
|
65
|
-
<Box marginBottom={1}>
|
|
66
|
-
<Text color="#22c55e">✓</Text>
|
|
67
|
-
<Text color="#a1a1aa">
|
|
68
|
-
{" Found key in "}
|
|
69
|
-
</Text>
|
|
70
|
-
<Text color="#f59e0b">{envVar}</Text>
|
|
71
|
-
</Box>
|
|
72
|
-
)}
|
|
73
|
-
|
|
74
|
-
<Box marginBottom={1}>
|
|
75
|
-
<Text color="#a1a1aa">Enter your API key (or leave empty to skip):</Text>
|
|
76
|
-
</Box>
|
|
77
|
-
|
|
78
|
-
{isEditing ? (
|
|
79
|
-
<Box>
|
|
80
|
-
<Text color="#27272a">{"> "}</Text>
|
|
81
|
-
<TextInput
|
|
82
|
-
value={inputValue}
|
|
83
|
-
onChange={setInputValue}
|
|
84
|
-
onSubmit={handleSubmit}
|
|
85
|
-
placeholder={envValue ? "Press Enter to use env variable" : "sk-..."}
|
|
86
|
-
showCursor={true}
|
|
87
|
-
/>
|
|
88
|
-
</Box>
|
|
89
|
-
) : (
|
|
90
|
-
<Box flexDirection="column">
|
|
91
|
-
{inputValue && (
|
|
92
|
-
<Box>
|
|
93
|
-
<Text color="#22c55e">✓ Key set: </Text>
|
|
94
|
-
<Text color="#a1a1aa">
|
|
95
|
-
{showKey ? inputValue : maskedValue(inputValue)}
|
|
96
|
-
</Text>
|
|
97
|
-
</Box>
|
|
98
|
-
)}
|
|
99
|
-
</Box>
|
|
100
|
-
)}
|
|
101
|
-
|
|
102
|
-
<Box marginTop={1}>
|
|
103
|
-
<Text color="#27272a">{"─".repeat(50)}</Text>
|
|
104
|
-
</Box>
|
|
105
|
-
|
|
106
|
-
<Box marginTop={1}>
|
|
107
|
-
<Text color="#71717a">[E] Edit</Text>
|
|
108
|
-
<Text color="#71717a"> [S] Skip</Text>
|
|
109
|
-
<Text color="#71717a"> [B] Back</Text>
|
|
110
|
-
</Box>
|
|
111
|
-
</Box>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
interface ApiKeyCollectorProps {
|
|
116
|
-
providers: Array<{ id: string; name: string; requiresApiKey: boolean }>;
|
|
117
|
-
currentIndex: number;
|
|
118
|
-
keys: Record<string, string>;
|
|
119
|
-
onSetKey: (providerId: string, key: string) => void;
|
|
120
|
-
onSkip: () => void;
|
|
121
|
-
onBack: () => void;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const ENV_VAR_MAP: Record<string, string> = {
|
|
125
|
-
anthropic: "ANTHROPIC_API_KEY",
|
|
126
|
-
openai: "OPENAI_API_KEY",
|
|
127
|
-
gemini: "GOOGLE_API_KEY",
|
|
128
|
-
mistral: "MISTRAL_API_KEY",
|
|
129
|
-
groq: "GROQ_API_KEY",
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
export function ApiKeyCollector({
|
|
133
|
-
providers,
|
|
134
|
-
currentIndex,
|
|
135
|
-
keys,
|
|
136
|
-
onSetKey,
|
|
137
|
-
onSkip,
|
|
138
|
-
onBack,
|
|
139
|
-
}: ApiKeyCollectorProps) {
|
|
140
|
-
const providersNeedingKeys = providers.filter((p) => p.requiresApiKey);
|
|
141
|
-
const currentProvider = providersNeedingKeys[currentIndex];
|
|
142
|
-
|
|
143
|
-
if (!currentProvider) {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return (
|
|
148
|
-
<ApiKeyInput
|
|
149
|
-
providerId={currentProvider.id}
|
|
150
|
-
providerName={currentProvider.name}
|
|
151
|
-
currentKey={keys[currentProvider.id]}
|
|
152
|
-
envVar={ENV_VAR_MAP[currentProvider.id]}
|
|
153
|
-
onSetKey={(key) => onSetKey(currentProvider.id, key)}
|
|
154
|
-
onSkip={onSkip}
|
|
155
|
-
onBack={onBack}
|
|
156
|
-
/>
|
|
157
|
-
);
|
|
158
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
|
|
4
|
-
const PRIMARY = "#f97316";
|
|
5
|
-
const SECONDARY = "#a1a1aa";
|
|
6
|
-
|
|
7
|
-
const RAX_FLOW_ASCII = `
|
|
8
|
-
╔══════════════════════════════════════════════════════════════════════════╗
|
|
9
|
-
║ ██████╗ █████╗ ██████╗ ██╗ ██╗ █████╗ ███╗ ██╗ ██████╗███████╗ ║
|
|
10
|
-
║ ██╔══██╗██╔══██╗██╔════╝██║ ██╔╝██╔══██╗████╗ ██║██╔════╝██╔════╝ ║
|
|
11
|
-
║ ██████╔╝███████║██║ █████╔╝ ███████║██╔██╗ ██║██║ █████╗ ║
|
|
12
|
-
║ ██╔══██╗██╔══██║██║ ██╔═██╗ ██╔══██║██║╚██╗██║██║ ██╔══╝ ║
|
|
13
|
-
║ ██║ ██║██║ ██║╚██████╗██║ ██╗██║ ██║██║ ╚████║╚██████╗███████╗ ║
|
|
14
|
-
║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝╚══════╝ ║
|
|
15
|
-
╠══════════════════════════════════════════════════════════════════════════╣
|
|
16
|
-
║ [■■■■■■■■■■] ORCHESTRATOR THAT EVOLVES WITH YOUR HOST TOOLS [■■■■■■] ║
|
|
17
|
-
╚══════════════════════════════════════════════════════════════════════════╝`;
|
|
18
|
-
|
|
19
|
-
const RAX_FLOW_ASCII_COMPACT = `
|
|
20
|
-
╔═══════════════════════════════════════════════════════╗
|
|
21
|
-
║ ██████╗ █████╗ ██████╗ ██╗ ██╗███████╗ ║
|
|
22
|
-
║ ██╔══██╗██╔══██╗██╔════╝ ██║ ██║██╔════╝ ║
|
|
23
|
-
║ ██████╔╝███████║██║ █████║█████╗ ║
|
|
24
|
-
║ ██╔══██╗██╔══██║██║ ██╔═██║██╔══╝ ║
|
|
25
|
-
║ ██║ ██║██║ ██║╚██████╗ ██║ ██║███████╗ ║
|
|
26
|
-
║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ║
|
|
27
|
-
╠═══════════════════════════════════════════════════════╣
|
|
28
|
-
║ [■■■■■] ORCHESTRATOR [■■■■■] ║
|
|
29
|
-
╚═══════════════════════════════════════════════════════╝`;
|
|
30
|
-
|
|
31
|
-
const GEAR_PATTERN = " ⚙ ";
|
|
32
|
-
const CIRCUIT_PATTERN = " │├┤│ ";
|
|
33
|
-
|
|
34
|
-
interface AsciiBannerProps {
|
|
35
|
-
compact?: boolean;
|
|
36
|
-
showTagline?: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function AsciiBanner({ compact = false, showTagline = true }: AsciiBannerProps) {
|
|
40
|
-
const ascii = compact ? RAX_FLOW_ASCII_COMPACT : RAX_FLOW_ASCII;
|
|
41
|
-
|
|
42
|
-
return (
|
|
43
|
-
<Box flexDirection="column" paddingX={1}>
|
|
44
|
-
<Box>
|
|
45
|
-
<Text color={PRIMARY} bold>
|
|
46
|
-
{ascii}
|
|
47
|
-
</Text>
|
|
48
|
-
</Box>
|
|
49
|
-
{showTagline && (
|
|
50
|
-
<Box marginTop={1} justifyContent="center">
|
|
51
|
-
<Text color={SECONDARY} dimColor>
|
|
52
|
-
{compact ? "Setup Wizard v1.0" : "Multi-Agent Orchestration Framework • Setup Wizard v1.0"}
|
|
53
|
-
</Text>
|
|
54
|
-
</Box>
|
|
55
|
-
)}
|
|
56
|
-
</Box>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function IndustrialDivider({ width = 60 }: { width?: number }) {
|
|
61
|
-
const segment = "─".repeat(Math.floor(width / 3));
|
|
62
|
-
const full = `╟${segment}╂${segment}╂${segment}╢`;
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<Box>
|
|
66
|
-
<Text color="#27272a">{full}</Text>
|
|
67
|
-
</Box>
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function IndustrialBox({
|
|
72
|
-
children,
|
|
73
|
-
title,
|
|
74
|
-
width = 60,
|
|
75
|
-
active = false,
|
|
76
|
-
}: {
|
|
77
|
-
children: React.ReactNode;
|
|
78
|
-
title?: string;
|
|
79
|
-
width?: number;
|
|
80
|
-
active?: boolean;
|
|
81
|
-
}) {
|
|
82
|
-
const borderColor = active ? PRIMARY : "#27272a";
|
|
83
|
-
const innerWidth = width - 4;
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<Box flexDirection="column">
|
|
87
|
-
<Text color={borderColor}>
|
|
88
|
-
{`┌${title ? `─ ${title} ` : ""}${"─".repeat(innerWidth - (title?.length || 0) - 2)}┐`}
|
|
89
|
-
</Text>
|
|
90
|
-
<Box flexDirection="column" borderStyle="single" borderColor={borderColor}>
|
|
91
|
-
{children}
|
|
92
|
-
</Box>
|
|
93
|
-
<Text color={borderColor}>{`└${"─".repeat(innerWidth)}┘`}</Text>
|
|
94
|
-
</Box>
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export function StatusIndicator({
|
|
99
|
-
status,
|
|
100
|
-
label,
|
|
101
|
-
active = false
|
|
102
|
-
}: {
|
|
103
|
-
status: "online" | "offline" | "running" | "pending" | "done" | "error";
|
|
104
|
-
label: string;
|
|
105
|
-
active?: boolean;
|
|
106
|
-
}) {
|
|
107
|
-
const indicators: Record<string, { char: string; color: string }> = {
|
|
108
|
-
online: { char: "●", color: "#22c55e" },
|
|
109
|
-
offline: { char: "○", color: "#71717a" },
|
|
110
|
-
running: { char: "▶", color: "#f59e0b" },
|
|
111
|
-
pending: { char: "◐", color: "#a1a1aa" },
|
|
112
|
-
done: { char: "✓", color: "#22c55e" },
|
|
113
|
-
error: { char: "✗", color: "#ef4444" },
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
const { char, color } = indicators[status];
|
|
117
|
-
|
|
118
|
-
return (
|
|
119
|
-
<Box>
|
|
120
|
-
<Text color={active ? PRIMARY : color}>{char}</Text>
|
|
121
|
-
<Text> </Text>
|
|
122
|
-
<Text color={active ? PRIMARY : "#ffffff"}>{label}</Text>
|
|
123
|
-
</Box>
|
|
124
|
-
);
|
|
125
|
-
}
|