@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,140 +0,0 @@
|
|
|
1
|
-
import { CommandDefinition } from "../types.js";
|
|
2
|
-
import { showStatus } from "./status.js";
|
|
3
|
-
import { listAgents } from "./agents.js";
|
|
4
|
-
import { runWorkflow } from "./run.js";
|
|
5
|
-
import { listProviders } from "./providers.js";
|
|
6
|
-
import { listWorkflows } from "./workflows.js";
|
|
7
|
-
import { showLogs } from "./logs.js";
|
|
8
|
-
import { showMetrics } from "./metrics.js";
|
|
9
|
-
import { showMemory } from "./memory.js";
|
|
10
|
-
import { startTUI } from "../../tui/index.js";
|
|
11
|
-
|
|
12
|
-
const commands = new Map<string, CommandDefinition>();
|
|
13
|
-
|
|
14
|
-
export function registerCommand(def: CommandDefinition): void {
|
|
15
|
-
commands.set(def.name, def);
|
|
16
|
-
if (def.aliases) {
|
|
17
|
-
for (const alias of def.aliases) {
|
|
18
|
-
commands.set(alias, def);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function getCommandRegistry(): Map<string, CommandDefinition> {
|
|
24
|
-
return commands;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
registerCommand({
|
|
28
|
-
name: "help",
|
|
29
|
-
aliases: ["?"],
|
|
30
|
-
description: "Affiche l'aide",
|
|
31
|
-
handler: async () => {
|
|
32
|
-
console.log(`
|
|
33
|
-
Commandes disponibles:
|
|
34
|
-
• run <prompt> : Exécuter un workflow
|
|
35
|
-
• status : Voir l'état du système
|
|
36
|
-
• agents : Liste des agents
|
|
37
|
-
• providers : État des providers
|
|
38
|
-
• workflows : Blueprints disponibles
|
|
39
|
-
• logs : Logs en temps réel
|
|
40
|
-
• metrics : Métriques de performance
|
|
41
|
-
• memory : Graph QSGM
|
|
42
|
-
• dashboard : Ouvrir dashboard web
|
|
43
|
-
• ui : Mode TUI plein écran
|
|
44
|
-
• chat : Mode conversationnel
|
|
45
|
-
• help : Cette aide
|
|
46
|
-
• exit : Quitter
|
|
47
|
-
`);
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
registerCommand({
|
|
52
|
-
name: "exit",
|
|
53
|
-
aliases: ["quit"],
|
|
54
|
-
description: "Quitte le hub",
|
|
55
|
-
handler: async () => {
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
registerCommand({
|
|
60
|
-
name: "status",
|
|
61
|
-
description: "Affiche le statut du système",
|
|
62
|
-
handler: showStatus,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
registerCommand({
|
|
66
|
-
name: "agents",
|
|
67
|
-
description: "Liste les agents disponibles",
|
|
68
|
-
handler: listAgents,
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
registerCommand({
|
|
72
|
-
name: "providers",
|
|
73
|
-
description: "Liste les providers configurés",
|
|
74
|
-
handler: listProviders,
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
registerCommand({
|
|
78
|
-
name: "workflows",
|
|
79
|
-
description: "Liste les workflows disponibles",
|
|
80
|
-
handler: listWorkflows,
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
registerCommand({
|
|
84
|
-
name: "logs",
|
|
85
|
-
description: "Affiche les logs en temps réel",
|
|
86
|
-
handler: showLogs,
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
registerCommand({
|
|
90
|
-
name: "metrics",
|
|
91
|
-
description: "Affiche les métriques de performance",
|
|
92
|
-
handler: showMetrics,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
registerCommand({
|
|
96
|
-
name: "memory",
|
|
97
|
-
description: "Affiche le statut de la mémoire",
|
|
98
|
-
handler: showMemory,
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
registerCommand({
|
|
102
|
-
name: "run",
|
|
103
|
-
description: "Exécute un workflow avec le prompt spécifié",
|
|
104
|
-
handler: runWorkflow,
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
registerCommand({
|
|
108
|
-
name: "ui",
|
|
109
|
-
description: "Lance le mode TUI plein écran",
|
|
110
|
-
handler: async () => {
|
|
111
|
-
console.log("\n🎬 Lancement du mode TUI...\n");
|
|
112
|
-
const { waitUntilExit } = startTUI();
|
|
113
|
-
await waitUntilExit();
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
registerCommand({
|
|
118
|
-
name: "chat",
|
|
119
|
-
description: "Lance le mode conversationnel",
|
|
120
|
-
handler: async () => {
|
|
121
|
-
console.log("\n💬 Lancement du mode Chat (TUI)...\n");
|
|
122
|
-
const { waitUntilExit } = startTUI();
|
|
123
|
-
await waitUntilExit();
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
const placeholderCommands = [
|
|
128
|
-
"install", "config", "doctor", "bridge-test", "benchmark",
|
|
129
|
-
"evolve", "dashboard"
|
|
130
|
-
];
|
|
131
|
-
|
|
132
|
-
for (const cmd of placeholderCommands) {
|
|
133
|
-
registerCommand({
|
|
134
|
-
name: cmd,
|
|
135
|
-
description: `Commande ${cmd}`,
|
|
136
|
-
handler: async () => {
|
|
137
|
-
console.log(`⚠️ Commande '${cmd}' sera implémentée dans une phase ultérieure`);
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
}
|
package/src/hub/commands/logs.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { HubContext } from "../types.js";
|
|
2
|
-
import { drawBox } from "../styles/borders.js";
|
|
3
|
-
import { colorize, ansiColors } from "../styles/colors.js";
|
|
4
|
-
|
|
5
|
-
interface LogEntry {
|
|
6
|
-
timestamp: string;
|
|
7
|
-
level: "INFO" | "WARN" | "ERROR" | "SUCCESS" | "MUTATE";
|
|
8
|
-
agent: string;
|
|
9
|
-
message: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function showLogs(_args: string[], flags: Record<string, string | boolean>, _context: HubContext): Promise<void> {
|
|
13
|
-
const width = 85;
|
|
14
|
-
const followMode = flags["f"] === true || flags["follow"] === true;
|
|
15
|
-
const agentFilter = typeof flags["agent"] === "string" ? flags["agent"] : null;
|
|
16
|
-
const levelFilter = typeof flags["level"] === "string" ? flags["level"].toUpperCase() : null;
|
|
17
|
-
|
|
18
|
-
// Sample log entries
|
|
19
|
-
const logs: LogEntry[] = [
|
|
20
|
-
{ timestamp: "14:23:07.123", level: "INFO", agent: "IntentClassifier", message: 'detected: "code_generation"' },
|
|
21
|
-
{ timestamp: "14:23:07.456", level: "INFO", agent: "TaskPlanner", message: "decomposed into 5 tasks" },
|
|
22
|
-
{ timestamp: "14:23:08.012", level: "SUCCESS", agent: "CodeGenerator", message: "generating auth module" },
|
|
23
|
-
{ timestamp: "14:23:09.234", level: "SUCCESS", agent: "CodeGenerator", message: "artifacts: 3 files" },
|
|
24
|
-
{ timestamp: "14:23:09.456", level: "INFO", agent: "TestAgent", message: "running test suite" },
|
|
25
|
-
{ timestamp: "14:23:12.789", level: "WARN", agent: "TestAgent", message: "2 tests failed, triggering FixAgent" },
|
|
26
|
-
{ timestamp: "14:23:13.012", level: "INFO", agent: "FixAgent", message: "patching auth/login.ts" },
|
|
27
|
-
{ timestamp: "14:23:14.345", level: "SUCCESS", agent: "FixAgent", message: "patches applied" },
|
|
28
|
-
{ timestamp: "14:23:14.567", level: "MUTATE", agent: "MutationAgent", message: "workflow optimized (+2 validation nodes)" },
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
// Filter logs
|
|
32
|
-
let filteredLogs = logs;
|
|
33
|
-
if (agentFilter) {
|
|
34
|
-
filteredLogs = filteredLogs.filter(l => l.agent.toLowerCase().includes(agentFilter.toLowerCase()));
|
|
35
|
-
}
|
|
36
|
-
if (levelFilter) {
|
|
37
|
-
filteredLogs = filteredLogs.filter(l => l.level === levelFilter);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const lines: string[] = [];
|
|
41
|
-
|
|
42
|
-
// Header
|
|
43
|
-
lines.push(` ${colorize("TIME", "bright")} ${colorize("LEVEL", "bright")} ${colorize("AGENT", "bright")} ${colorize("MESSAGE", "bright")}`);
|
|
44
|
-
lines.push(" " + "─".repeat(81));
|
|
45
|
-
|
|
46
|
-
// Log entries
|
|
47
|
-
for (const log of filteredLogs) {
|
|
48
|
-
const levelColor: Record<string, keyof typeof ansiColors> = {
|
|
49
|
-
"INFO": "cyan",
|
|
50
|
-
"WARN": "yellow",
|
|
51
|
-
"ERROR": "red",
|
|
52
|
-
"SUCCESS": "green",
|
|
53
|
-
"MUTATE": "magenta",
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
lines.push(` ${log.timestamp} ${colorize(log.level.padEnd(8), levelColor[log.level] || "white")} ${log.agent.padEnd(18)} ${log.message}`);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (followMode) {
|
|
60
|
-
lines.push("");
|
|
61
|
-
lines.push(colorize(" [Following... Press Ctrl+C to stop]", "gray"));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
console.log(drawBox(lines, width, "LOGS"));
|
|
65
|
-
|
|
66
|
-
if (followMode) {
|
|
67
|
-
// In a real implementation, this would stream new logs
|
|
68
|
-
console.log(colorize("\n (Follow mode not yet implemented)", "gray"));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { HubContext } from "../types.js";
|
|
2
|
-
import { drawBox } from "../styles/borders.js";
|
|
3
|
-
import { colorize, statusIndicators } from "../styles/colors.js";
|
|
4
|
-
|
|
5
|
-
export async function showMemory(_args: string[], _flags: Record<string, string | boolean>, _context: HubContext): Promise<void> {
|
|
6
|
-
const width = 70;
|
|
7
|
-
|
|
8
|
-
const stats = {
|
|
9
|
-
graphNodes: 247,
|
|
10
|
-
vectorStoreSize: "1.2 MB",
|
|
11
|
-
cacheEntries: 47,
|
|
12
|
-
lastAccess: "2s ago",
|
|
13
|
-
recentMutations: 3,
|
|
14
|
-
cacheHitRate: "94%",
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const lines: string[] = [];
|
|
18
|
-
|
|
19
|
-
// Stats
|
|
20
|
-
lines.push(` ${colorize("Graph Memory Nodes:", "bright")} ${colorize(stats.graphNodes.toString(), "cyan")} ${statusIndicators.online}`);
|
|
21
|
-
lines.push(` ${colorize("Vector Store Size:", "bright")} ${colorize(stats.vectorStoreSize, "cyan")}`);
|
|
22
|
-
lines.push(` ${colorize("Cache Entries:", "bright")} ${colorize(stats.cacheEntries.toString(), "cyan")}`);
|
|
23
|
-
lines.push(` ${colorize("Last Access:", "bright")} ${colorize(stats.lastAccess, "gray")}`);
|
|
24
|
-
lines.push(` ${colorize("Recent Mutations:", "bright")} ${colorize(`+${stats.recentMutations}`, "yellow")} ${statusIndicators.mutation}`);
|
|
25
|
-
lines.push(` ${colorize("Cache Hit Rate:", "bright")} ${colorize(stats.cacheHitRate, "green")}`);
|
|
26
|
-
|
|
27
|
-
lines.push("");
|
|
28
|
-
lines.push(colorize(" Sample Graph Structure:", "bright"));
|
|
29
|
-
lines.push(" " + "─".repeat(66));
|
|
30
|
-
|
|
31
|
-
// Visual graph representation
|
|
32
|
-
lines.push("");
|
|
33
|
-
lines.push(` [action:code_gen]${statusIndicators.online}`);
|
|
34
|
-
lines.push(` │`);
|
|
35
|
-
lines.push(` ├───▶ [file:auth.ts]${statusIndicators.online}`);
|
|
36
|
-
lines.push(` │ │`);
|
|
37
|
-
lines.push(` │ ├───▶ [task:login]${statusIndicators.online}`);
|
|
38
|
-
lines.push(` │ │`);
|
|
39
|
-
lines.push(` │ └───▶ [test:auth]${statusIndicators.online}`);
|
|
40
|
-
lines.push(` │ │`);
|
|
41
|
-
lines.push(` │ │`);
|
|
42
|
-
lines.push(` └───────────────────────┴───▶ [fix:patch_001]${statusIndicators.mutation}`);
|
|
43
|
-
lines.push("");
|
|
44
|
-
lines.push(colorize(" // QUANTUM_SEMANTIC_GRAPH_MEMORY", "gray"));
|
|
45
|
-
|
|
46
|
-
console.log(drawBox(lines, width, "MEMORY"));
|
|
47
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { HubContext } from "../types.js";
|
|
2
|
-
import { drawBox, drawProgressBar } from "../styles/borders.js";
|
|
3
|
-
import { colorize } from "../styles/colors.js";
|
|
4
|
-
import { padRight } from "../styles/typography.js";
|
|
5
|
-
|
|
6
|
-
interface MetricInfo {
|
|
7
|
-
label: string;
|
|
8
|
-
value: string;
|
|
9
|
-
trend?: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function showMetrics(_args: string[], _flags: Record<string, string | boolean>, _context: HubContext): Promise<void> {
|
|
13
|
-
const width = 65;
|
|
14
|
-
|
|
15
|
-
const metrics: MetricInfo[] = [
|
|
16
|
-
{ label: "Sessions", value: "12", trend: "↗" },
|
|
17
|
-
{ label: "Avg Duration", value: "14.2s", trend: "▼ -12%" },
|
|
18
|
-
{ label: "Success Rate", value: "96%", trend: "▲ +3%" },
|
|
19
|
-
{ label: "Cost (USD)", value: "$0.002", trend: "→" },
|
|
20
|
-
{ label: "Cache Savings", value: "67%", trend: "↗" },
|
|
21
|
-
];
|
|
22
|
-
|
|
23
|
-
const topAgents = [
|
|
24
|
-
{ name: "CodeGenerator", usage: 45 },
|
|
25
|
-
{ name: "TestAgent", usage: 32 },
|
|
26
|
-
{ name: "FixAgent", usage: 18 },
|
|
27
|
-
{ name: "IntentClassifier", usage: 5 },
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
const lines: string[] = [];
|
|
31
|
-
|
|
32
|
-
// General metrics
|
|
33
|
-
for (const metric of metrics) {
|
|
34
|
-
const trendColor = metric.trend?.includes("▲") ? "green" : metric.trend?.includes("▼") ? "green" : "gray";
|
|
35
|
-
lines.push(` ${padRight(metric.label, 15)} ${colorize(metric.value.padEnd(12), "cyan")} ${colorize(metric.trend || "", trendColor)}`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
lines.push("");
|
|
39
|
-
lines.push(colorize(" Top Agents:", "bright"));
|
|
40
|
-
lines.push(" " + "─".repeat(61));
|
|
41
|
-
|
|
42
|
-
// Top agents with progress bars
|
|
43
|
-
for (const agent of topAgents) {
|
|
44
|
-
const bar = drawProgressBar(agent.usage, 20);
|
|
45
|
-
lines.push(` ${padRight(agent.name, 18)} ${bar} ${colorize(`${agent.usage}%`, "yellow")}`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
console.log(drawBox(lines, width, "METRICS"));
|
|
49
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { HubContext } from "../types.js";
|
|
2
|
-
import { drawBox } from "../styles/borders.js";
|
|
3
|
-
import { colorize, formatStatus } from "../styles/colors.js";
|
|
4
|
-
import { padRight } from "../styles/typography.js";
|
|
5
|
-
|
|
6
|
-
interface ProviderInfo {
|
|
7
|
-
name: string;
|
|
8
|
-
key: string;
|
|
9
|
-
status: string;
|
|
10
|
-
latency: string;
|
|
11
|
-
lastCall: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export async function listProviders(_args: string[], _flags: Record<string, string | boolean>, _context: HubContext): Promise<void> {
|
|
15
|
-
const width = 65;
|
|
16
|
-
|
|
17
|
-
const providers: ProviderInfo[] = [
|
|
18
|
-
{ name: "Host-Native", key: "[H]", status: "online", latency: "12ms", lastCall: "2s ago" },
|
|
19
|
-
{ name: "Claude Code", key: "[C]", status: "online", latency: "8ms", lastCall: "5s ago" },
|
|
20
|
-
{ name: "OpenCode", key: "[O]", status: "idle", latency: "--", lastCall: "1h ago" },
|
|
21
|
-
{ name: "Anthropic API", key: "[A]", status: "online", latency: "45ms", lastCall: "1m ago" },
|
|
22
|
-
{ name: "Gemini", key: "[G]", status: "idle", latency: "--", lastCall: "2h ago" },
|
|
23
|
-
{ name: "Mistral", key: "[M]", status: "idle", latency: "--", lastCall: "3h ago" },
|
|
24
|
-
{ name: "Groq", key: "[Q]", status: "idle", latency: "--", lastCall: "5h ago" },
|
|
25
|
-
{ name: "OpenAI", key: "[O]", status: "idle", latency: "--", lastCall: "1d ago" },
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
const lines: string[] = [];
|
|
29
|
-
lines.push(` ${colorize("PROVIDER", "bright")} ${colorize("STATUS", "bright")} ${colorize("LATENCY", "bright")} ${colorize("LAST CALL", "bright")}`);
|
|
30
|
-
lines.push(" " + "─".repeat(61));
|
|
31
|
-
|
|
32
|
-
for (const provider of providers) {
|
|
33
|
-
const indicator = formatStatus(provider.status);
|
|
34
|
-
const statusColor = provider.status === "online" ? "green" : "gray";
|
|
35
|
-
lines.push(` ${provider.key} ${padRight(provider.name, 14)} ${indicator} ${colorize(provider.status.toUpperCase().padEnd(8), statusColor)} ${padRight(provider.latency, 8)} ${colorize(provider.lastCall, "gray")}`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
console.log(drawBox(lines, width, "PROVIDERS"));
|
|
39
|
-
}
|
package/src/hub/commands/run.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { HubContext } from "../types.js";
|
|
2
|
-
import { runWorkflow as runWorkflowOriginal } from "../../run.js";
|
|
3
|
-
|
|
4
|
-
export async function runWorkflow(args: string[], flags: Record<string, string | boolean>, context: HubContext): Promise<void> {
|
|
5
|
-
const prompt = args.join(" ");
|
|
6
|
-
|
|
7
|
-
if (!prompt) {
|
|
8
|
-
console.error("❌ Usage: run <prompt>");
|
|
9
|
-
console.log("\nExemples:");
|
|
10
|
-
console.log(' run "Crée une API REST"');
|
|
11
|
-
console.log(' run "Génère des tests unitaires" --workflow custom.json');
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
console.log(`▶ Lancement du workflow...`);
|
|
16
|
-
console.log(` Prompt: ${prompt}`);
|
|
17
|
-
console.log(` Mode: ${flags["workflow"] || "default"}`);
|
|
18
|
-
console.log("");
|
|
19
|
-
|
|
20
|
-
// Call the original run function
|
|
21
|
-
const code = await runWorkflowOriginal({
|
|
22
|
-
cwd: context.config.project || process.cwd(),
|
|
23
|
-
prompt,
|
|
24
|
-
workflowPath: typeof flags["workflow"] === "string" ? flags["workflow"] : undefined,
|
|
25
|
-
asJson: flags["json"] === true,
|
|
26
|
-
stream: flags["stream"] === true,
|
|
27
|
-
maxParallel: typeof flags["max-parallel"] === "string" ? Number(flags["max-parallel"]) : undefined,
|
|
28
|
-
noCachePersist: flags["no-cache-persist"] === true,
|
|
29
|
-
ui: flags["ui"] === true,
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
if (code !== 0) {
|
|
33
|
-
throw new Error(`Workflow failed with code ${code}`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
console.log("\n✅ Workflow terminé avec succès");
|
|
37
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { HubContext } from "../types.js";
|
|
2
|
-
import { drawBox } from "../styles/borders.js";
|
|
3
|
-
import { colorize, formatStatus, statusIndicators } from "../styles/colors.js";
|
|
4
|
-
import { padRight } from "../styles/typography.js";
|
|
5
|
-
|
|
6
|
-
export async function showStatus(_args: string[], _flags: Record<string, string | boolean>, context: HubContext): Promise<void> {
|
|
7
|
-
const width = 61;
|
|
8
|
-
|
|
9
|
-
// Simulated status data (will be replaced with real data from orchestrator)
|
|
10
|
-
const status = {
|
|
11
|
-
orchestrator: "ACTIVE",
|
|
12
|
-
mode: "HOST-NATIVE",
|
|
13
|
-
activeAgents: "3/12",
|
|
14
|
-
currentRun: "L2: CodeGen [H] 67%",
|
|
15
|
-
fitness: "0.87",
|
|
16
|
-
fitnessTrend: "improving",
|
|
17
|
-
cacheHit: "94%",
|
|
18
|
-
memoryNodes: "247",
|
|
19
|
-
latency: "12ms",
|
|
20
|
-
providers: [
|
|
21
|
-
{ name: "Host-Native", status: "online", latency: "12ms" },
|
|
22
|
-
{ name: "Claude", status: "online", latency: "8ms" },
|
|
23
|
-
{ name: "OpenAI", status: "idle", latency: "--" },
|
|
24
|
-
],
|
|
25
|
-
activeWorkflows: [
|
|
26
|
-
{ agent: "CodeGenerator", provider: "[H]", status: "running", progress: 67 },
|
|
27
|
-
{ agent: "TestAgent", provider: "[H]", status: "queued", progress: 0 },
|
|
28
|
-
],
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const lines: string[] = [];
|
|
32
|
-
|
|
33
|
-
// Orchestrator status
|
|
34
|
-
lines.push(` Orchestrator: ${formatStatus("online")} ${colorize(status.orchestrator, "green")}`);
|
|
35
|
-
lines.push(` Mode: ${colorize(status.mode, "cyan")}`);
|
|
36
|
-
lines.push(` Active Agents: ${colorize(status.activeAgents, "yellow")}`);
|
|
37
|
-
lines.push("");
|
|
38
|
-
|
|
39
|
-
// Current run
|
|
40
|
-
if (status.currentRun) {
|
|
41
|
-
lines.push(` Current Run: ${statusIndicators.running} ${colorize(status.currentRun, "yellow")}`);
|
|
42
|
-
lines.push(` Fitness: ${colorize(status.fitness, "green")} (${colorize(status.fitnessTrend, "cyan")})`);
|
|
43
|
-
lines.push(` Cache Hit: ${colorize(status.cacheHit, "green")}`);
|
|
44
|
-
lines.push(` Memory Nodes: ${colorize(status.memoryNodes, "cyan")}`);
|
|
45
|
-
lines.push(` Latency: ${colorize(status.latency, "green")}`);
|
|
46
|
-
lines.push("");
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Active workflows
|
|
50
|
-
if (status.activeWorkflows.length > 0) {
|
|
51
|
-
lines.push(colorize(" Active Workflows:", "bright"));
|
|
52
|
-
for (const wf of status.activeWorkflows) {
|
|
53
|
-
const indicator = statusIndicators[wf.status as keyof typeof statusIndicators] || "○";
|
|
54
|
-
const color = wf.status === "running" ? "yellow" : wf.status === "queued" ? "gray" : "white";
|
|
55
|
-
lines.push(` ${indicator} ${padRight(wf.agent, 20)} ${wf.provider} ${colorize(wf.status.toUpperCase(), color)}`);
|
|
56
|
-
}
|
|
57
|
-
lines.push("");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Providers
|
|
61
|
-
lines.push(colorize(" Providers:", "bright"));
|
|
62
|
-
for (const provider of status.providers) {
|
|
63
|
-
const indicator = formatStatus(provider.status);
|
|
64
|
-
const latencyStr = provider.latency !== "--" ? `${provider.latency}` : "--";
|
|
65
|
-
lines.push(` ${indicator} ${padRight(provider.name, 18)} ${colorize(latencyStr, "gray")}`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
console.log(drawBox(lines, width, "SYSTEM STATUS"));
|
|
69
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { HubContext } from "../types.js";
|
|
2
|
-
import { drawBox } from "../styles/borders.js";
|
|
3
|
-
import { colorize } from "../styles/colors.js";
|
|
4
|
-
import * as fs from "fs/promises";
|
|
5
|
-
import * as path from "path";
|
|
6
|
-
|
|
7
|
-
interface WorkflowInfo {
|
|
8
|
-
name: string;
|
|
9
|
-
description: string;
|
|
10
|
-
fitness?: number;
|
|
11
|
-
recommended?: boolean;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export async function listWorkflows(_args: string[], _flags: Record<string, string | boolean>, context: HubContext): Promise<void> {
|
|
15
|
-
const width = 70;
|
|
16
|
-
const lines: string[] = [];
|
|
17
|
-
|
|
18
|
-
// Try to find workflow files
|
|
19
|
-
const workflowDir = path.join(context.config.project || process.cwd(), ".rax", "workflows");
|
|
20
|
-
const workflows: WorkflowInfo[] = [];
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
const files = await fs.readdir(workflowDir);
|
|
24
|
-
for (const file of files.filter(f => f.endsWith('.json'))) {
|
|
25
|
-
const filePath = path.join(workflowDir, file);
|
|
26
|
-
const content = await fs.readFile(filePath, 'utf-8');
|
|
27
|
-
const workflow = JSON.parse(content);
|
|
28
|
-
workflows.push({
|
|
29
|
-
name: file.replace('.json', ''),
|
|
30
|
-
description: workflow.description || 'No description',
|
|
31
|
-
fitness: workflow.fitness,
|
|
32
|
-
recommended: workflow.recommended,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
} catch {
|
|
36
|
-
// Directory doesn't exist or is empty, use defaults
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Add default workflows
|
|
40
|
-
if (workflows.length === 0) {
|
|
41
|
-
workflows.push(
|
|
42
|
-
{ name: "default-routing", description: "Standard workflow with intent classification", fitness: 0.87 },
|
|
43
|
-
{ name: "secure-api-blueprint", description: "Security-focused API generation", fitness: 0.92 },
|
|
44
|
-
{ name: "test-heavy-workflow", description: "Prioritizes test generation", fitness: 0.89 },
|
|
45
|
-
{ name: "mutation-evolved-v3", description: "Optimized with mutations", fitness: 0.96, recommended: true }
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
lines.push(` ${colorize("WORKFLOW", "bright")} ${colorize("DESCRIPTION", "bright")} ${colorize("FITNESS", "bright")}`);
|
|
50
|
-
lines.push(" " + "─".repeat(66));
|
|
51
|
-
|
|
52
|
-
for (const wf of workflows) {
|
|
53
|
-
const name = wf.name.slice(0, 22).padEnd(24);
|
|
54
|
-
const desc = wf.description.slice(0, 25).padEnd(27);
|
|
55
|
-
const fitness = wf.fitness ? colorize(wf.fitness.toFixed(2), wf.fitness >= 0.9 ? "green" : "yellow") : "--";
|
|
56
|
-
const marker = wf.recommended ? colorize(" ★", "yellow") : "";
|
|
57
|
-
lines.push(` • ${name} ${desc} ${fitness}${marker}`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
lines.push("");
|
|
61
|
-
lines.push(` ${colorize("Usage:", "bright")} run -w <workflow-name> "<prompt>"`);
|
|
62
|
-
|
|
63
|
-
console.log(drawBox(lines, width, "WORKFLOWS"));
|
|
64
|
-
}
|
package/src/hub/config-loader.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs/promises";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import { HubConfig } from "./types.js";
|
|
4
|
-
|
|
5
|
-
interface RaxRcConfig {
|
|
6
|
-
project?: string;
|
|
7
|
-
providers?: string[];
|
|
8
|
-
theme?: 'industrial' | 'minimal' | 'high-contrast';
|
|
9
|
-
[key: string]: unknown;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function loadConfig(cwd: string): Promise<HubConfig> {
|
|
13
|
-
const configPath = path.join(cwd, ".raxrc");
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
const content = await fs.readFile(configPath, "utf-8");
|
|
17
|
-
const config: RaxRcConfig = JSON.parse(content);
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
project: config.project,
|
|
21
|
-
providers: config.providers,
|
|
22
|
-
theme: config.theme || 'industrial',
|
|
23
|
-
};
|
|
24
|
-
} catch {
|
|
25
|
-
// Return default config if .raxrc doesn't exist or is invalid
|
|
26
|
-
return {
|
|
27
|
-
project: path.basename(cwd),
|
|
28
|
-
providers: [],
|
|
29
|
-
theme: 'industrial',
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function saveConfig(cwd: string, config: HubConfig): Promise<void> {
|
|
35
|
-
const configPath = path.join(cwd, ".raxrc");
|
|
36
|
-
await fs.writeFile(configPath, JSON.stringify(config, null, 2));
|
|
37
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { RuntimeEventBus, RuntimeEvent } from "rax-flow-core";
|
|
2
|
-
|
|
3
|
-
const globalEventBus = new RuntimeEventBus();
|
|
4
|
-
|
|
5
|
-
export type { RuntimeEvent };
|
|
6
|
-
|
|
7
|
-
export function getEventBus(): RuntimeEventBus {
|
|
8
|
-
return globalEventBus;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function subscribeToEvents(callback: (event: RuntimeEvent) => void): () => void {
|
|
12
|
-
return globalEventBus.onEvent(callback);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function emitEvent(event: RuntimeEvent): void {
|
|
16
|
-
globalEventBus.emit(event);
|
|
17
|
-
}
|
package/src/hub/history.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs/promises";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
|
|
4
|
-
export class CommandHistory {
|
|
5
|
-
private history: string[] = [];
|
|
6
|
-
private position = -1;
|
|
7
|
-
private readonly historyPath: string;
|
|
8
|
-
|
|
9
|
-
constructor(cwd: string) {
|
|
10
|
-
this.historyPath = path.join(cwd, ".rax", "history.json");
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
add(command: string): void {
|
|
14
|
-
// Avoid duplicates at the end
|
|
15
|
-
if (this.history.length === 0 || this.history[this.history.length - 1] !== command) {
|
|
16
|
-
this.history.push(command);
|
|
17
|
-
}
|
|
18
|
-
this.position = this.history.length;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
up(): string | undefined {
|
|
22
|
-
if (this.position > 0) {
|
|
23
|
-
this.position--;
|
|
24
|
-
return this.history[this.position];
|
|
25
|
-
}
|
|
26
|
-
return undefined;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
down(): string | undefined {
|
|
30
|
-
if (this.position < this.history.length - 1) {
|
|
31
|
-
this.position++;
|
|
32
|
-
return this.history[this.position];
|
|
33
|
-
}
|
|
34
|
-
this.position = this.history.length;
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async save(): Promise<void> {
|
|
39
|
-
try {
|
|
40
|
-
const dir = path.dirname(this.historyPath);
|
|
41
|
-
await fs.mkdir(dir, { recursive: true });
|
|
42
|
-
await fs.writeFile(
|
|
43
|
-
this.historyPath,
|
|
44
|
-
JSON.stringify(this.history.slice(-1000), null, 2) // Keep last 1000 commands
|
|
45
|
-
);
|
|
46
|
-
} catch {
|
|
47
|
-
// Silently fail if we can't save history
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async load(): Promise<void> {
|
|
52
|
-
try {
|
|
53
|
-
const data = await fs.readFile(this.historyPath, "utf-8");
|
|
54
|
-
this.history = JSON.parse(data);
|
|
55
|
-
this.position = this.history.length;
|
|
56
|
-
} catch {
|
|
57
|
-
// No history file yet, start fresh
|
|
58
|
-
this.history = [];
|
|
59
|
-
this.position = 0;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
getAll(): string[] {
|
|
64
|
-
return [...this.history];
|
|
65
|
-
}
|
|
66
|
-
}
|