@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,54 +0,0 @@
|
|
|
1
|
-
export const statusIndicators = {
|
|
2
|
-
online: { icon: "●", color: "#22c55e" },
|
|
3
|
-
offline: { icon: "○", color: "#71717a" },
|
|
4
|
-
pending: { icon: "○", color: "#71717a" },
|
|
5
|
-
running: { icon: "▶", color: "#f97316" },
|
|
6
|
-
loading: { icon: "◐", color: "#f59e0b" },
|
|
7
|
-
queued: { icon: "◐", color: "#f59e0b" },
|
|
8
|
-
done: { icon: "●", color: "#22c55e" },
|
|
9
|
-
success: { icon: "●", color: "#22c55e" },
|
|
10
|
-
error: { icon: "✗", color: "#ef4444" },
|
|
11
|
-
mutation: { icon: "◆", color: "#f59e0b" },
|
|
12
|
-
checkpoint: { icon: "■", color: "#f97316" },
|
|
13
|
-
idle: { icon: "○", color: "#71717a" },
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export function getStatusIndicator(status: string): { icon: string; color: string } {
|
|
17
|
-
const normalized = status.toLowerCase();
|
|
18
|
-
return statusIndicators[normalized as keyof typeof statusIndicators] || statusIndicators.pending;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const spinnerFrames = ["◐", "◓", "◑", "◒"];
|
|
22
|
-
|
|
23
|
-
export const dotsSpinnerFrames = ["⠋", "⠙", "⠹", "⠸", "⼸", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
24
|
-
|
|
25
|
-
export const circleSpinnerFrames = ["◐", "◓", "◑", "◒"];
|
|
26
|
-
|
|
27
|
-
export const pulseFrames = ["●", "◐", "○", "◐"];
|
|
28
|
-
|
|
29
|
-
export const breathFrames = ["●", "●", "◐", "◐", "○", "○", "◐", "◐"];
|
|
30
|
-
|
|
31
|
-
export const progressMarkerFrames = ["▶", "▸", "▶", "▸"];
|
|
32
|
-
|
|
33
|
-
export const progressGlowFrames = ["█", "▓", "█", "▓"];
|
|
34
|
-
|
|
35
|
-
export function getSpinnerFrame(tick: number, type: "circle" | "dots" | "pulse" = "circle"): string {
|
|
36
|
-
const frames = type === "dots" ? dotsSpinnerFrames : type === "pulse" ? pulseFrames : circleSpinnerFrames;
|
|
37
|
-
return frames[tick % frames.length];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function getPulseFrame(tick: number): string {
|
|
41
|
-
return pulseFrames[tick % pulseFrames.length];
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function getBreathFrame(tick: number): string {
|
|
45
|
-
return breathFrames[tick % breathFrames.length];
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function getProgressMarker(tick: number): string {
|
|
49
|
-
return progressMarkerFrames[tick % progressMarkerFrames.length];
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function getProgressGlow(tick: number): string {
|
|
53
|
-
return progressGlowFrames[tick % progressGlowFrames.length];
|
|
54
|
-
}
|
package/src/tui/styles/layout.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export const layout = {
|
|
2
|
-
defaultWidth: 80,
|
|
3
|
-
panelWidth: {
|
|
4
|
-
chat: 40,
|
|
5
|
-
dag: 38,
|
|
6
|
-
status: 28,
|
|
7
|
-
logs: 32,
|
|
8
|
-
metrics: 28,
|
|
9
|
-
memory: 30,
|
|
10
|
-
},
|
|
11
|
-
padding: {
|
|
12
|
-
x: 1,
|
|
13
|
-
y: 0,
|
|
14
|
-
},
|
|
15
|
-
progressWidth: 16,
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export function formatTimestamp(date: Date): string {
|
|
19
|
-
return date.toLocaleTimeString("fr-FR", {
|
|
20
|
-
hour: "2-digit",
|
|
21
|
-
minute: "2-digit",
|
|
22
|
-
second: "2-digit",
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function formatTimestampMs(date: Date): string {
|
|
27
|
-
const time = date.toLocaleTimeString("fr-FR", {
|
|
28
|
-
hour: "2-digit",
|
|
29
|
-
minute: "2-digit",
|
|
30
|
-
second: "2-digit",
|
|
31
|
-
});
|
|
32
|
-
const ms = String(date.getMilliseconds()).padStart(3, "0");
|
|
33
|
-
return `${time}.${ms}`;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function padRight(text: string, width: number): string {
|
|
37
|
-
const padding = Math.max(0, width - text.length);
|
|
38
|
-
return text + " ".repeat(padding);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function truncate(text: string, maxLength: number): string {
|
|
42
|
-
if (text.length <= maxLength) return text;
|
|
43
|
-
return text.slice(0, maxLength - 3) + "...";
|
|
44
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export const providerTags = {
|
|
2
|
-
host: { code: "[H]", name: "Host-Native" },
|
|
3
|
-
claude: { code: "[C]", name: "Claude Code" },
|
|
4
|
-
opencode: { code: "[O]", name: "OpenCode" },
|
|
5
|
-
kilo: { code: "[K]", name: "Kilo" },
|
|
6
|
-
anthropic: { code: "[A]", name: "Anthropic API" },
|
|
7
|
-
gemini: { code: "[G]", name: "Gemini" },
|
|
8
|
-
mistral: { code: "[M]", name: "Mistral" },
|
|
9
|
-
groq: { code: "[Q]", name: "Groq" },
|
|
10
|
-
openai: { code: "[O]", name: "OpenAI" },
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export function getProviderTag(provider: string): { code: string; name: string } {
|
|
14
|
-
const normalized = provider.toLowerCase().replace(/[-_\s]/g, "");
|
|
15
|
-
for (const [key, value] of Object.entries(providerTags)) {
|
|
16
|
-
if (normalized.includes(key)) {
|
|
17
|
-
return value;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return { code: "[?]", name: provider };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export const logStatusTags = {
|
|
24
|
-
run: { tag: "[RUN]", color: "#f97316" },
|
|
25
|
-
success: { tag: "[SUCCESS]", color: "#22c55e" },
|
|
26
|
-
warn: { tag: "[WARN]", color: "#f59e0b" },
|
|
27
|
-
error: { tag: "[ERROR]", color: "#ef4444" },
|
|
28
|
-
info: { tag: "[INFO]", color: "#a1a1aa" },
|
|
29
|
-
mutate: { tag: "[MUTATE]", color: "#f59e0b" },
|
|
30
|
-
done: { tag: "[DONE]", color: "#22c55e" },
|
|
31
|
-
start: { tag: "[START]", color: "#f97316" },
|
|
32
|
-
};
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
export const spinnerSequences = {
|
|
2
|
-
dots: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
|
|
3
|
-
line: ["─", "┐", "│", "┌"],
|
|
4
|
-
circle: ["◐", "◓", "◑", "◒"],
|
|
5
|
-
pulse: ["●", "◐", "○", "◐"],
|
|
6
|
-
bounce: ["⠁", "⠃", "⠇", "⡇", "⣇", "⣧", "⣷", "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣭", "⣩", "⣈", "⡈", "⠈"],
|
|
7
|
-
triangle: ["◢", "◣", "◤", "◥"],
|
|
8
|
-
square: ["◰", "◳", "◲", "◱"],
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const glowChars = ["░", "▒", "▓", "█"];
|
|
12
|
-
|
|
13
|
-
export const progressChars = {
|
|
14
|
-
empty: "░",
|
|
15
|
-
quarter: "▒",
|
|
16
|
-
half: "▓",
|
|
17
|
-
full: "█",
|
|
18
|
-
head: "▶",
|
|
19
|
-
marker: "↑",
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export const scanlineChars = ["─", "━", "═", "━"];
|
|
23
|
-
|
|
24
|
-
export function getSpinnerFrame(tick: number, type: keyof typeof spinnerSequences = "dots"): string {
|
|
25
|
-
const frames = spinnerSequences[type];
|
|
26
|
-
return frames[tick % frames.length];
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function getGlowChar(intensity: number): string {
|
|
30
|
-
const index = Math.min(3, Math.max(0, Math.floor(intensity * 4)));
|
|
31
|
-
return glowChars[index];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function easeIn(t: number): number {
|
|
35
|
-
return t * t;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function easeOut(t: number): number {
|
|
39
|
-
return 1 - (1 - t) * (1 - t);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function easeInOut(t: number): number {
|
|
43
|
-
return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function linear(t: number): number {
|
|
47
|
-
return t;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function pingPong(t: number, min: number = 0, max: number = 1): number {
|
|
51
|
-
const cycle = t % 2;
|
|
52
|
-
return min + (cycle < 1 ? cycle : 2 - cycle) * (max - min);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function breathe(t: number, min: number = 0.3, max: number = 1): number {
|
|
56
|
-
return min + (Math.sin(t * Math.PI * 2) + 1) / 2 * (max - min);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function clamp(value: number, min: number, max: number): number {
|
|
60
|
-
return Math.min(max, Math.max(min, value));
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function lerp(a: number, b: number, t: number): number {
|
|
64
|
-
return a + (b - a) * clamp(t, 0, 1);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export const bracketProgress = {
|
|
68
|
-
empty: (width: number = 10): string => `[${".".repeat(width)}]`,
|
|
69
|
-
progress: (progress: number, width: number = 10): string => {
|
|
70
|
-
const filled = Math.round(progress * width);
|
|
71
|
-
const empty = width - filled;
|
|
72
|
-
return `[${"=".repeat(filled)}${empty > 0 ? ".".repeat(empty) : ""}]`;
|
|
73
|
-
},
|
|
74
|
-
animated: (progress: number, tick: number, width: number = 10): string => {
|
|
75
|
-
const filled = Math.round(progress * width);
|
|
76
|
-
const empty = width - filled;
|
|
77
|
-
const head = filled < width ? [">", "=", "-"][tick % 3] : "";
|
|
78
|
-
return `[${"=".repeat(Math.max(0, filled - 1))}${head}${empty > 0 ? ".".repeat(empty) : ""}]`;
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
export function createTypewriterEffect(text: string, progress: number): string {
|
|
83
|
-
const chars = Math.floor(progress * text.length);
|
|
84
|
-
return text.slice(0, chars);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export const statusTransitionAnims = {
|
|
88
|
-
idle_to_running: ["○", "◐", "◑", "●", "▶"],
|
|
89
|
-
running_to_done: ["▶", "●", "✓"],
|
|
90
|
-
running_to_error: ["▶", "◐", "✗"],
|
|
91
|
-
pending_to_running: ["○", "◐", "▶"],
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
export function getStatusTransitionFrame(
|
|
95
|
-
from: string,
|
|
96
|
-
to: string,
|
|
97
|
-
progress: number
|
|
98
|
-
): string {
|
|
99
|
-
const key = `${from}_to_${to}` as keyof typeof statusTransitionAnims;
|
|
100
|
-
const frames = statusTransitionAnims[key];
|
|
101
|
-
if (!frames) return "●";
|
|
102
|
-
const index = Math.min(frames.length - 1, Math.floor(progress * frames.length));
|
|
103
|
-
return frames[index];
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export function generateGridOverlay(width: number, height: number, cellSize: number = 10): string[] {
|
|
107
|
-
const lines: string[] = [];
|
|
108
|
-
for (let y = 0; y < height; y++) {
|
|
109
|
-
let line = "";
|
|
110
|
-
for (let x = 0; x < width; x++) {
|
|
111
|
-
if (y % cellSize === 0 && x % cellSize === 0) {
|
|
112
|
-
line += "┼";
|
|
113
|
-
} else if (y % cellSize === 0) {
|
|
114
|
-
line += "─";
|
|
115
|
-
} else if (x % cellSize === 0) {
|
|
116
|
-
line += "│";
|
|
117
|
-
} else {
|
|
118
|
-
line += " ";
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
lines.push(line);
|
|
122
|
-
}
|
|
123
|
-
return lines;
|
|
124
|
-
}
|
package/src/vendor-manifests.ts
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { HostTarget } from "./host-init-templates.js";
|
|
3
|
-
|
|
4
|
-
export interface HostManifestModel {
|
|
5
|
-
version: number;
|
|
6
|
-
target: HostTarget;
|
|
7
|
-
title: string;
|
|
8
|
-
autoInjectMode: "native" | "scripted" | "manual";
|
|
9
|
-
bridgeCommand: string;
|
|
10
|
-
quickCommands: string[];
|
|
11
|
-
sessionEntryExamples: string[];
|
|
12
|
-
task: string | null;
|
|
13
|
-
files: {
|
|
14
|
-
bootstrapPrompt: string;
|
|
15
|
-
instructions: string;
|
|
16
|
-
bridgeAdapter: string;
|
|
17
|
-
bridgeRuntimeConfig: string;
|
|
18
|
-
bridgeSmokeTest: string;
|
|
19
|
-
vendorManifest: string;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function toRelative(baseDir: string, file: string): string {
|
|
24
|
-
const rel = path.relative(baseDir, file);
|
|
25
|
-
return rel.length > 0 ? rel : path.basename(file);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function buildClaudeManifest(baseDir: string, manifest: HostManifestModel) {
|
|
29
|
-
return {
|
|
30
|
-
schema: "rax.vendor.claude-code.v1",
|
|
31
|
-
session: {
|
|
32
|
-
initMessageFile: toRelative(baseDir, manifest.files.bootstrapPrompt),
|
|
33
|
-
mode: manifest.autoInjectMode,
|
|
34
|
-
bridgeCommand: manifest.bridgeCommand
|
|
35
|
-
},
|
|
36
|
-
orchestrator: {
|
|
37
|
-
tool: "rax-flow",
|
|
38
|
-
quickCommands: manifest.quickCommands
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function buildCodexManifest(baseDir: string, manifest: HostManifestModel) {
|
|
44
|
-
return {
|
|
45
|
-
schema: "rax.vendor.codex.v1",
|
|
46
|
-
chat: {
|
|
47
|
-
bootstrapFile: toRelative(baseDir, manifest.files.bootstrapPrompt),
|
|
48
|
-
strategy: manifest.autoInjectMode
|
|
49
|
-
},
|
|
50
|
-
runtime: {
|
|
51
|
-
bridgeCommand: manifest.bridgeCommand,
|
|
52
|
-
taskContext: manifest.task
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function buildOpenCodeManifest(baseDir: string, manifest: HostManifestModel) {
|
|
58
|
-
return {
|
|
59
|
-
schema: "rax.vendor.opencode.v1",
|
|
60
|
-
integration: {
|
|
61
|
-
startupPromptFile: toRelative(baseDir, manifest.files.bootstrapPrompt),
|
|
62
|
-
launchMode: manifest.autoInjectMode
|
|
63
|
-
},
|
|
64
|
-
orchestration: {
|
|
65
|
-
quickCommands: manifest.quickCommands,
|
|
66
|
-
bridgeCommand: manifest.bridgeCommand
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function buildKiloManifest(baseDir: string, manifest: HostManifestModel) {
|
|
72
|
-
return {
|
|
73
|
-
schema: "rax.vendor.kilo.v1",
|
|
74
|
-
initializer: {
|
|
75
|
-
promptFile: toRelative(baseDir, manifest.files.bootstrapPrompt),
|
|
76
|
-
injectMode: manifest.autoInjectMode
|
|
77
|
-
},
|
|
78
|
-
runtime: {
|
|
79
|
-
bridgeCommand: manifest.bridgeCommand,
|
|
80
|
-
commandHints: manifest.sessionEntryExamples
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function buildGenericManifest(baseDir: string, manifest: HostManifestModel) {
|
|
86
|
-
return {
|
|
87
|
-
schema: "rax.vendor.generic.v1",
|
|
88
|
-
bootstrap: {
|
|
89
|
-
file: toRelative(baseDir, manifest.files.bootstrapPrompt)
|
|
90
|
-
},
|
|
91
|
-
bridge: {
|
|
92
|
-
command: manifest.bridgeCommand,
|
|
93
|
-
mode: manifest.autoInjectMode
|
|
94
|
-
},
|
|
95
|
-
commands: manifest.quickCommands
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export function generateVendorManifest(target: HostTarget, baseDir: string, manifest: HostManifestModel): Record<string, unknown> {
|
|
100
|
-
if (target === "claude-code") return buildClaudeManifest(baseDir, manifest);
|
|
101
|
-
if (target === "codex") return buildCodexManifest(baseDir, manifest);
|
|
102
|
-
if (target === "opencode") return buildOpenCodeManifest(baseDir, manifest);
|
|
103
|
-
if (target === "kilo") return buildKiloManifest(baseDir, manifest);
|
|
104
|
-
return buildGenericManifest(baseDir, manifest);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export function vendorManifestFilename(target: HostTarget): string {
|
|
108
|
-
if (target === "claude-code") return "vendor-claude-code.json";
|
|
109
|
-
if (target === "codex") return "vendor-codex.json";
|
|
110
|
-
if (target === "opencode") return "vendor-opencode.json";
|
|
111
|
-
if (target === "kilo") return "vendor-kilo.json";
|
|
112
|
-
return "vendor-generic.json";
|
|
113
|
-
}
|
package/src/ws-relay.ts
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { WebSocketServer, WebSocket } from "ws";
|
|
2
|
-
import { RuntimeEventBus } from "rax-flow-core";
|
|
3
|
-
import { readdir, readFile, mkdir, writeFile } from "node:fs/promises";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
|
|
6
|
-
export class WebSocketRelay {
|
|
7
|
-
private wss: WebSocketServer | null = null;
|
|
8
|
-
private clients = new Set<WebSocket>();
|
|
9
|
-
private bus: RuntimeEventBus | null = null;
|
|
10
|
-
|
|
11
|
-
constructor(private port: number = 3002) { }
|
|
12
|
-
|
|
13
|
-
public start(eventBus: RuntimeEventBus): void {
|
|
14
|
-
this.bus = eventBus;
|
|
15
|
-
try {
|
|
16
|
-
this.wss = new WebSocketServer({ port: this.port });
|
|
17
|
-
console.log(`\n[UI] 📡 WebSocket relay started on ws://localhost:${this.port}`);
|
|
18
|
-
|
|
19
|
-
this.wss.on("connection", (ws) => {
|
|
20
|
-
this.clients.add(ws);
|
|
21
|
-
ws.send(JSON.stringify({ type: "HELLO", timestamp: Date.now() }));
|
|
22
|
-
|
|
23
|
-
ws.on("close", () => {
|
|
24
|
-
this.clients.delete(ws);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
ws.on("message", async (data) => {
|
|
28
|
-
try {
|
|
29
|
-
const message = JSON.parse(data.toString());
|
|
30
|
-
const historyDir = path.join(process.cwd(), ".rax-flow", "history");
|
|
31
|
-
|
|
32
|
-
if (message.type === "GET_HISTORY") {
|
|
33
|
-
try {
|
|
34
|
-
const files = await readdir(historyDir);
|
|
35
|
-
const runs = await Promise.all(
|
|
36
|
-
files.filter(f => f.endsWith(".json")).map(async f => {
|
|
37
|
-
const content = await readFile(path.join(historyDir, f), "utf8");
|
|
38
|
-
const parsed = JSON.parse(content);
|
|
39
|
-
return {
|
|
40
|
-
taskId: parsed.taskId,
|
|
41
|
-
timestamp: parsed.timestamp,
|
|
42
|
-
prompt: parsed.prompt,
|
|
43
|
-
success: parsed.result.success,
|
|
44
|
-
costUsd: parsed.metrics.totalCostUsd
|
|
45
|
-
};
|
|
46
|
-
})
|
|
47
|
-
);
|
|
48
|
-
ws.send(JSON.stringify({ type: "HISTORY_LIST", runs: runs.sort((a, b) => b.timestamp - a.timestamp) }));
|
|
49
|
-
} catch {
|
|
50
|
-
ws.send(JSON.stringify({ type: "HISTORY_LIST", runs: [] }));
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
else if (message.type === "LOAD_RUN") {
|
|
55
|
-
try {
|
|
56
|
-
const file = path.join(historyDir, `${message.taskId}.json`);
|
|
57
|
-
const content = await readFile(file, "utf8");
|
|
58
|
-
ws.send(JSON.stringify({ type: "RUN_DATA", data: JSON.parse(content) }));
|
|
59
|
-
} catch (err) {
|
|
60
|
-
ws.send(JSON.stringify({ type: "ERROR", message: "Run not found" }));
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
else if (message.type === "LIST_WORKFLOWS") {
|
|
65
|
-
const workflowsDir = path.join(process.cwd(), ".rax-flow", "workflows");
|
|
66
|
-
try {
|
|
67
|
-
const files = await readdir(workflowsDir);
|
|
68
|
-
const list = files.filter(f => f.endsWith(".json")).map(f => ({
|
|
69
|
-
id: f.replace(".json", ""),
|
|
70
|
-
filename: f
|
|
71
|
-
}));
|
|
72
|
-
ws.send(JSON.stringify({ type: "WORKFLOW_LIST", workflows: list }));
|
|
73
|
-
} catch {
|
|
74
|
-
ws.send(JSON.stringify({ type: "WORKFLOW_LIST", workflows: [] }));
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
else if (message.type === "RESOLVE_APPROVAL") {
|
|
79
|
-
this.bus?.emit({
|
|
80
|
-
type: "INTERNAL_RESOLVE_APPROVAL",
|
|
81
|
-
taskId: message.taskId,
|
|
82
|
-
nodeId: message.nodeId,
|
|
83
|
-
approved: message.approved,
|
|
84
|
-
feedback: message.feedback
|
|
85
|
-
} as any);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
else if (message.type === "SAVE_WORKFLOW") {
|
|
89
|
-
try {
|
|
90
|
-
const workflowsDir = path.join(process.cwd(), ".rax-flow", "workflows");
|
|
91
|
-
await mkdir(workflowsDir, { recursive: true });
|
|
92
|
-
const file = path.join(workflowsDir, `${message.id}.json`);
|
|
93
|
-
const data = {
|
|
94
|
-
id: message.id,
|
|
95
|
-
nodes: message.nodes,
|
|
96
|
-
edges: message.edges
|
|
97
|
-
};
|
|
98
|
-
await writeFile(file, JSON.stringify(data, null, 2));
|
|
99
|
-
ws.send(JSON.stringify({ type: "INFO", message: `Workflow ${message.id} saved.` }));
|
|
100
|
-
this.broadcast({ type: "REFRESH_WORKFLOWS" });
|
|
101
|
-
} catch (err) {
|
|
102
|
-
ws.send(JSON.stringify({ type: "ERROR", message: "Failed to save workflow" }));
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
else if (message.type === "DELETE_WORKFLOW") {
|
|
107
|
-
try {
|
|
108
|
-
const url = path.join(process.cwd(), ".rax-flow", "workflows", `${message.id}.json`);
|
|
109
|
-
const { unlink } = await import("node:fs/promises");
|
|
110
|
-
await unlink(url);
|
|
111
|
-
this.broadcast({ type: "REFRESH_WORKFLOWS" });
|
|
112
|
-
} catch (err) {
|
|
113
|
-
ws.send(JSON.stringify({ type: "ERROR", message: "Failed to delete workflow" }));
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
} catch (e) {
|
|
117
|
-
console.error("[WS] Message parse error:", e);
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
ws.on("error", () => {
|
|
122
|
-
this.clients.delete(ws);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
this.wss.on("error", (err) => {
|
|
127
|
-
console.error(`[UI] WebSocket server error: ${err.message}`);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
eventBus.onEvent((event) => {
|
|
131
|
-
this.broadcast(event);
|
|
132
|
-
});
|
|
133
|
-
} catch (err) {
|
|
134
|
-
console.error(`[UI] Failed to start WebSocket server: ${err}`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
private broadcast(event: unknown): void {
|
|
139
|
-
if (!this.wss) return;
|
|
140
|
-
const payload = JSON.stringify(event);
|
|
141
|
-
for (const client of this.clients) {
|
|
142
|
-
if (client.readyState === WebSocket.OPEN) {
|
|
143
|
-
client.send(payload);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
public stop(): void {
|
|
149
|
-
if (this.wss) {
|
|
150
|
-
this.wss.close();
|
|
151
|
-
this.wss = null;
|
|
152
|
-
this.clients.clear();
|
|
153
|
-
console.log("[UI] 📡 WebSocket relay stopped.");
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"rootDir": "src",
|
|
5
|
-
"outDir": "dist",
|
|
6
|
-
"composite": true,
|
|
7
|
-
"declaration": true,
|
|
8
|
-
"declarationMap": true,
|
|
9
|
-
"jsx": "react-jsx",
|
|
10
|
-
"jsxImportSource": "react",
|
|
11
|
-
"esModuleInterop": true
|
|
12
|
-
},
|
|
13
|
-
"include": [
|
|
14
|
-
"src/**/*.ts",
|
|
15
|
-
"src/**/*.tsx"
|
|
16
|
-
],
|
|
17
|
-
"references": [
|
|
18
|
-
{
|
|
19
|
-
"path": "../core"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"path": "../agents"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"path": "../providers"
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
}
|