rax-flow 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dashboard/index.html +420 -0
  2. package/dist/benchmark.d.ts +10 -0
  3. package/dist/benchmark.d.ts.map +1 -0
  4. package/dist/benchmark.js +123 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/bin.d.ts +3 -0
  7. package/dist/bin.d.ts.map +1 -0
  8. package/dist/bin.js +115 -0
  9. package/dist/bin.js.map +1 -0
  10. package/dist/bootstrap.d.ts +8 -0
  11. package/dist/bootstrap.d.ts.map +1 -0
  12. package/dist/bootstrap.js +22 -0
  13. package/dist/bootstrap.js.map +1 -0
  14. package/dist/bridge-adapter-templates.d.ts +4 -0
  15. package/dist/bridge-adapter-templates.d.ts.map +1 -0
  16. package/dist/bridge-adapter-templates.js +185 -0
  17. package/dist/bridge-adapter-templates.js.map +1 -0
  18. package/dist/bridge-test.d.ts +7 -0
  19. package/dist/bridge-test.d.ts.map +1 -0
  20. package/dist/bridge-test.js +89 -0
  21. package/dist/bridge-test.js.map +1 -0
  22. package/dist/dashboard.d.ts +4 -0
  23. package/dist/dashboard.d.ts.map +1 -0
  24. package/dist/dashboard.js +49 -0
  25. package/dist/dashboard.js.map +1 -0
  26. package/dist/doctor.d.ts +6 -0
  27. package/dist/doctor.d.ts.map +1 -0
  28. package/dist/doctor.js +70 -0
  29. package/dist/doctor.js.map +1 -0
  30. package/dist/evolve.d.ts +7 -0
  31. package/dist/evolve.d.ts.map +1 -0
  32. package/dist/evolve.js +48 -0
  33. package/dist/evolve.js.map +1 -0
  34. package/dist/host-init-templates.d.ts +16 -0
  35. package/dist/host-init-templates.d.ts.map +1 -0
  36. package/dist/host-init-templates.js +119 -0
  37. package/dist/host-init-templates.js.map +1 -0
  38. package/dist/index.d.ts +11 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +11 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/init-host.d.ts +10 -0
  43. package/dist/init-host.d.ts.map +1 -0
  44. package/dist/init-host.js +232 -0
  45. package/dist/init-host.js.map +1 -0
  46. package/dist/install.d.ts +8 -0
  47. package/dist/install.d.ts.map +1 -0
  48. package/dist/install.js +99 -0
  49. package/dist/install.js.map +1 -0
  50. package/dist/run.d.ts +16 -0
  51. package/dist/run.d.ts.map +1 -0
  52. package/dist/run.js +238 -0
  53. package/dist/run.js.map +1 -0
  54. package/dist/styles.d.ts +12 -0
  55. package/dist/styles.d.ts.map +1 -0
  56. package/dist/styles.js +12 -0
  57. package/dist/styles.js.map +1 -0
  58. package/dist/vendor-manifests.d.ts +22 -0
  59. package/dist/vendor-manifests.d.ts.map +1 -0
  60. package/dist/vendor-manifests.js +94 -0
  61. package/dist/vendor-manifests.js.map +1 -0
  62. package/dist/ws-relay.d.ts +12 -0
  63. package/dist/ws-relay.d.ts.map +1 -0
  64. package/dist/ws-relay.js +148 -0
  65. package/dist/ws-relay.js.map +1 -0
  66. package/package.json +28 -0
  67. package/src/benchmark.ts +156 -0
  68. package/src/bin.ts +127 -0
  69. package/src/bootstrap.ts +36 -0
  70. package/src/bridge-adapter-templates.ts +181 -0
  71. package/src/bridge-test.ts +107 -0
  72. package/src/dashboard.ts +51 -0
  73. package/src/doctor.ts +92 -0
  74. package/src/evolve.ts +74 -0
  75. package/src/host-init-templates.ts +134 -0
  76. package/src/index.ts +10 -0
  77. package/src/init-host.ts +285 -0
  78. package/src/install.ts +118 -0
  79. package/src/run.ts +317 -0
  80. package/src/styles.ts +12 -0
  81. package/src/vendor-manifests.ts +113 -0
  82. package/src/ws-relay.ts +156 -0
  83. package/tsconfig.json +12 -0
@@ -0,0 +1,156 @@
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 ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist",
6
+ "composite": true,
7
+ "declaration": true,
8
+ "declarationMap": true
9
+ },
10
+ "include": ["src/**/*.ts"],
11
+ "references": [{ "path": "../core" }, { "path": "../agents" }, { "path": "../providers" }]
12
+ }