@sudocode-ai/local-server 0.1.0 → 0.1.1

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 (115) hide show
  1. package/dist/cli.js +6 -104
  2. package/dist/cli.js.map +1 -7
  3. package/dist/execution/engine/engine.js +10 -0
  4. package/dist/execution/engine/engine.js.map +1 -0
  5. package/dist/execution/engine/simple-engine.js +611 -0
  6. package/dist/execution/engine/simple-engine.js.map +1 -0
  7. package/dist/execution/engine/types.js +10 -0
  8. package/dist/execution/engine/types.js.map +1 -0
  9. package/dist/execution/output/ag-ui-adapter.js +438 -0
  10. package/dist/execution/output/ag-ui-adapter.js.map +1 -0
  11. package/dist/execution/output/ag-ui-integration.js +96 -0
  12. package/dist/execution/output/ag-ui-integration.js.map +1 -0
  13. package/dist/execution/output/claude-code-output-processor.js +769 -0
  14. package/dist/execution/output/claude-code-output-processor.js.map +1 -0
  15. package/dist/execution/output/index.js +15 -0
  16. package/dist/execution/output/index.js.map +1 -0
  17. package/dist/execution/output/types.js +22 -0
  18. package/dist/execution/output/types.js.map +1 -0
  19. package/dist/execution/process/builders/claude.js +59 -0
  20. package/dist/execution/process/builders/claude.js.map +1 -0
  21. package/dist/execution/process/index.js +15 -0
  22. package/dist/execution/process/index.js.map +1 -0
  23. package/dist/execution/process/manager.js +10 -0
  24. package/dist/execution/process/manager.js.map +1 -0
  25. package/dist/execution/process/simple-manager.js +336 -0
  26. package/dist/execution/process/simple-manager.js.map +1 -0
  27. package/dist/execution/process/types.js +10 -0
  28. package/dist/execution/process/types.js.map +1 -0
  29. package/dist/execution/process/utils.js +97 -0
  30. package/dist/execution/process/utils.js.map +1 -0
  31. package/dist/execution/resilience/circuit-breaker.js +291 -0
  32. package/dist/execution/resilience/circuit-breaker.js.map +1 -0
  33. package/dist/execution/resilience/executor.js +10 -0
  34. package/dist/execution/resilience/executor.js.map +1 -0
  35. package/dist/execution/resilience/index.js +15 -0
  36. package/dist/execution/resilience/index.js.map +1 -0
  37. package/dist/execution/resilience/resilient-executor.js +261 -0
  38. package/dist/execution/resilience/resilient-executor.js.map +1 -0
  39. package/dist/execution/resilience/retry.js +234 -0
  40. package/dist/execution/resilience/retry.js.map +1 -0
  41. package/dist/execution/resilience/types.js +30 -0
  42. package/dist/execution/resilience/types.js.map +1 -0
  43. package/dist/execution/transport/event-buffer.js +208 -0
  44. package/dist/execution/transport/event-buffer.js.map +1 -0
  45. package/dist/execution/transport/index.js +10 -0
  46. package/dist/execution/transport/index.js.map +1 -0
  47. package/dist/execution/transport/sse-transport.js +282 -0
  48. package/dist/execution/transport/sse-transport.js.map +1 -0
  49. package/dist/execution/transport/transport-manager.js +231 -0
  50. package/dist/execution/transport/transport-manager.js.map +1 -0
  51. package/dist/execution/workflow/index.js +13 -0
  52. package/dist/execution/workflow/index.js.map +1 -0
  53. package/dist/execution/workflow/linear-orchestrator.js +683 -0
  54. package/dist/execution/workflow/linear-orchestrator.js.map +1 -0
  55. package/dist/execution/workflow/memory-storage.js +68 -0
  56. package/dist/execution/workflow/memory-storage.js.map +1 -0
  57. package/dist/execution/workflow/orchestrator.js +9 -0
  58. package/dist/execution/workflow/orchestrator.js.map +1 -0
  59. package/dist/execution/workflow/types.js +9 -0
  60. package/dist/execution/workflow/types.js.map +1 -0
  61. package/dist/execution/workflow/utils.js +152 -0
  62. package/dist/execution/workflow/utils.js.map +1 -0
  63. package/dist/execution/worktree/config.js +280 -0
  64. package/dist/execution/worktree/config.js.map +1 -0
  65. package/dist/execution/worktree/git-cli.js +189 -0
  66. package/dist/execution/worktree/git-cli.js.map +1 -0
  67. package/dist/execution/worktree/index.js +15 -0
  68. package/dist/execution/worktree/index.js.map +1 -0
  69. package/dist/execution/worktree/manager.js +452 -0
  70. package/dist/execution/worktree/manager.js.map +1 -0
  71. package/dist/execution/worktree/types.js +42 -0
  72. package/dist/execution/worktree/types.js.map +1 -0
  73. package/dist/index.js +356 -104
  74. package/dist/index.js.map +1 -7
  75. package/dist/routes/executions-stream.js +55 -0
  76. package/dist/routes/executions-stream.js.map +1 -0
  77. package/dist/routes/executions.js +267 -0
  78. package/dist/routes/executions.js.map +1 -0
  79. package/dist/routes/feedback.js +329 -0
  80. package/dist/routes/feedback.js.map +1 -0
  81. package/dist/routes/issues.js +280 -0
  82. package/dist/routes/issues.js.map +1 -0
  83. package/dist/routes/relationships.js +308 -0
  84. package/dist/routes/relationships.js.map +1 -0
  85. package/dist/routes/specs.js +270 -0
  86. package/dist/routes/specs.js.map +1 -0
  87. package/dist/services/db.js +85 -0
  88. package/dist/services/db.js.map +1 -0
  89. package/dist/services/execution-lifecycle.js +286 -0
  90. package/dist/services/execution-lifecycle.js.map +1 -0
  91. package/dist/services/execution-service.js +676 -0
  92. package/dist/services/execution-service.js.map +1 -0
  93. package/dist/services/executions.js +164 -0
  94. package/dist/services/executions.js.map +1 -0
  95. package/dist/services/export.js +106 -0
  96. package/dist/services/export.js.map +1 -0
  97. package/dist/services/feedback.js +54 -0
  98. package/dist/services/feedback.js.map +1 -0
  99. package/dist/services/issues.js +35 -0
  100. package/dist/services/issues.js.map +1 -0
  101. package/dist/services/prompt-template-engine.js +212 -0
  102. package/dist/services/prompt-template-engine.js.map +1 -0
  103. package/dist/services/prompt-templates.js +236 -0
  104. package/dist/services/prompt-templates.js.map +1 -0
  105. package/dist/services/relationships.js +42 -0
  106. package/dist/services/relationships.js.map +1 -0
  107. package/dist/services/specs.js +35 -0
  108. package/dist/services/specs.js.map +1 -0
  109. package/dist/services/watcher.js +69 -0
  110. package/dist/services/watcher.js.map +1 -0
  111. package/dist/services/websocket.js +389 -0
  112. package/dist/services/websocket.js.map +1 -0
  113. package/dist/utils/sudocode-dir.js +9 -0
  114. package/dist/utils/sudocode-dir.js.map +1 -0
  115. package/package.json +4 -6
@@ -0,0 +1,389 @@
1
+ import { WebSocketServer, WebSocket } from "ws";
2
+ import { randomUUID } from "crypto";
3
+ const LOG_CONNECTIONS = false;
4
+ /**
5
+ * WebSocket server manager
6
+ */
7
+ class WebSocketManager {
8
+ wss = null;
9
+ clients = new Map();
10
+ heartbeatInterval = null;
11
+ HEARTBEAT_INTERVAL = 30000; // 30 seconds
12
+ /**
13
+ * Initialize the WebSocket server
14
+ */
15
+ init(server, path = "/ws") {
16
+ if (this.wss) {
17
+ console.warn("[websocket] WebSocket server already initialized");
18
+ return;
19
+ }
20
+ this.wss = new WebSocketServer({ server, path });
21
+ console.log(`[websocket] WebSocket server initialized on path: ${path}`);
22
+ this.wss.on("connection", this.handleConnection.bind(this));
23
+ this.startHeartbeat();
24
+ }
25
+ /**
26
+ * Handle new WebSocket connection
27
+ */
28
+ handleConnection(ws, _req) {
29
+ const clientId = randomUUID();
30
+ const client = {
31
+ id: clientId,
32
+ ws,
33
+ subscriptions: new Set(),
34
+ isAlive: true,
35
+ connectedAt: new Date(),
36
+ };
37
+ this.clients.set(clientId, client);
38
+ if (LOG_CONNECTIONS) {
39
+ console.log(`[websocket] Client connected: ${clientId} (total: ${this.clients.size})`);
40
+ }
41
+ // Set up event handlers
42
+ ws.on("message", (data) => this.handleMessage(clientId, data));
43
+ ws.on("close", () => this.handleDisconnection(clientId));
44
+ ws.on("error", (error) => this.handleError(clientId, error));
45
+ ws.on("pong", () => this.handlePong(clientId));
46
+ // Send welcome message
47
+ this.sendToClient(clientId, {
48
+ type: "pong",
49
+ message: "Connected to sudocode server",
50
+ });
51
+ }
52
+ /**
53
+ * Handle client disconnection
54
+ */
55
+ handleDisconnection(clientId) {
56
+ const client = this.clients.get(clientId);
57
+ if (client) {
58
+ if (LOG_CONNECTIONS) {
59
+ console.log(`[websocket] Client disconnected: ${clientId} (subscriptions: ${client.subscriptions.size})`);
60
+ }
61
+ this.clients.delete(clientId);
62
+ }
63
+ }
64
+ /**
65
+ * Handle client errors
66
+ */
67
+ handleError(clientId, error) {
68
+ console.error(`[websocket] Client error (${clientId}):`, error.message);
69
+ }
70
+ /**
71
+ * Handle pong response from client
72
+ */
73
+ handlePong(clientId) {
74
+ const client = this.clients.get(clientId);
75
+ if (client) {
76
+ client.isAlive = true;
77
+ }
78
+ }
79
+ /**
80
+ * Handle incoming messages from clients
81
+ */
82
+ handleMessage(clientId, data) {
83
+ const client = this.clients.get(clientId);
84
+ if (!client) {
85
+ return;
86
+ }
87
+ try {
88
+ const message = JSON.parse(data.toString());
89
+ switch (message.type) {
90
+ case "subscribe":
91
+ this.handleSubscribe(clientId, message);
92
+ break;
93
+ case "unsubscribe":
94
+ this.handleUnsubscribe(clientId, message);
95
+ break;
96
+ case "ping":
97
+ this.sendToClient(clientId, { type: "pong" });
98
+ break;
99
+ default:
100
+ this.sendToClient(clientId, {
101
+ type: "error",
102
+ message: `Unknown message type: ${message.type}`,
103
+ });
104
+ }
105
+ }
106
+ catch (error) {
107
+ console.error(`[websocket] Failed to parse message from ${clientId}:`, error);
108
+ this.sendToClient(clientId, {
109
+ type: "error",
110
+ message: "Invalid message format",
111
+ });
112
+ }
113
+ }
114
+ /**
115
+ * Handle subscription request
116
+ */
117
+ handleSubscribe(clientId, message) {
118
+ const client = this.clients.get(clientId);
119
+ if (!client) {
120
+ return;
121
+ }
122
+ let subscription;
123
+ if (message.entity_type === "all") {
124
+ // Subscribe to all updates
125
+ subscription = "all";
126
+ }
127
+ else if (message.entity_type && message.entity_id) {
128
+ // Subscribe to a specific entity
129
+ subscription = `${message.entity_type}:${message.entity_id}`;
130
+ }
131
+ else if (message.entity_type) {
132
+ // Subscribe to all entities of a type
133
+ subscription = `${message.entity_type}:*`;
134
+ }
135
+ else {
136
+ this.sendToClient(clientId, {
137
+ type: "error",
138
+ message: "Invalid subscription request",
139
+ });
140
+ return;
141
+ }
142
+ client.subscriptions.add(subscription);
143
+ if (LOG_CONNECTIONS) {
144
+ console.log(`[websocket] Client ${clientId} subscribed to: ${subscription}`);
145
+ }
146
+ this.sendToClient(clientId, {
147
+ type: "subscribed",
148
+ subscription,
149
+ message: `Subscribed to ${subscription}`,
150
+ });
151
+ }
152
+ /**
153
+ * Handle unsubscription request
154
+ */
155
+ handleUnsubscribe(clientId, message) {
156
+ const client = this.clients.get(clientId);
157
+ if (!client) {
158
+ return;
159
+ }
160
+ let subscription;
161
+ if (message.entity_type === "all") {
162
+ subscription = "all";
163
+ }
164
+ else if (message.entity_type && message.entity_id) {
165
+ subscription = `${message.entity_type}:${message.entity_id}`;
166
+ }
167
+ else if (message.entity_type) {
168
+ subscription = `${message.entity_type}:*`;
169
+ }
170
+ else {
171
+ this.sendToClient(clientId, {
172
+ type: "error",
173
+ message: "Invalid unsubscription request",
174
+ });
175
+ return;
176
+ }
177
+ client.subscriptions.delete(subscription);
178
+ if (LOG_CONNECTIONS) {
179
+ console.log(`[websocket] Client ${clientId} unsubscribed from: ${subscription}`);
180
+ }
181
+ this.sendToClient(clientId, {
182
+ type: "unsubscribed",
183
+ subscription,
184
+ message: `Unsubscribed from ${subscription}`,
185
+ });
186
+ }
187
+ /**
188
+ * Send a message to a specific client
189
+ */
190
+ sendToClient(clientId, message) {
191
+ const client = this.clients.get(clientId);
192
+ if (!client || client.ws.readyState !== WebSocket.OPEN) {
193
+ return;
194
+ }
195
+ try {
196
+ client.ws.send(JSON.stringify(message));
197
+ }
198
+ catch (error) {
199
+ console.error(`[websocket] Failed to send message to ${clientId}:`, error);
200
+ }
201
+ }
202
+ /**
203
+ * Broadcast a message to all subscribed clients
204
+ */
205
+ broadcast(entityType, entityId, message) {
206
+ const subscription = `${entityType}:${entityId}`;
207
+ const typeSubscription = `${entityType}:*`;
208
+ let sentCount = 0;
209
+ this.clients.forEach((client) => {
210
+ if (client.ws.readyState !== WebSocket.OPEN) {
211
+ return;
212
+ }
213
+ // Check if client is subscribed to this specific entity, entity type, or all
214
+ if (client.subscriptions.has(subscription) ||
215
+ client.subscriptions.has(typeSubscription) ||
216
+ client.subscriptions.has("all")) {
217
+ try {
218
+ client.ws.send(JSON.stringify(message));
219
+ sentCount++;
220
+ }
221
+ catch (error) {
222
+ console.error(`[websocket] Failed to broadcast to ${client.id}:`, error);
223
+ }
224
+ }
225
+ });
226
+ if (sentCount > 0) {
227
+ console.log(`[websocket] Broadcasted ${message.type} for ${subscription} to ${sentCount} clients`);
228
+ }
229
+ }
230
+ /**
231
+ * Broadcast a relationship or feedback update
232
+ * These don't have a specific entity type in the subscription, so we broadcast to 'all' subscribers
233
+ */
234
+ broadcastGeneric(message) {
235
+ let sentCount = 0;
236
+ this.clients.forEach((client) => {
237
+ if (client.ws.readyState !== WebSocket.OPEN) {
238
+ return;
239
+ }
240
+ // Only send to clients subscribed to 'all'
241
+ if (client.subscriptions.has("all")) {
242
+ try {
243
+ client.ws.send(JSON.stringify(message));
244
+ sentCount++;
245
+ }
246
+ catch (error) {
247
+ console.error(`[websocket] Failed to broadcast to ${client.id}:`, error);
248
+ }
249
+ }
250
+ });
251
+ if (sentCount > 0) {
252
+ console.log(`[websocket] Broadcasted ${message.type} to ${sentCount} clients`);
253
+ }
254
+ }
255
+ /**
256
+ * Start the heartbeat mechanism to detect dead connections
257
+ */
258
+ startHeartbeat() {
259
+ if (this.heartbeatInterval) {
260
+ return;
261
+ }
262
+ this.heartbeatInterval = setInterval(() => {
263
+ this.clients.forEach((client, clientId) => {
264
+ if (!client.isAlive) {
265
+ console.log(`[websocket] Terminating dead connection: ${clientId}`);
266
+ client.ws.terminate();
267
+ this.clients.delete(clientId);
268
+ return;
269
+ }
270
+ client.isAlive = false;
271
+ try {
272
+ client.ws.ping();
273
+ }
274
+ catch (error) {
275
+ console.error(`[websocket] Failed to ping ${clientId}:`, error);
276
+ }
277
+ });
278
+ }, this.HEARTBEAT_INTERVAL);
279
+ console.log(`[websocket] Heartbeat started (interval: ${this.HEARTBEAT_INTERVAL}ms)`);
280
+ }
281
+ /**
282
+ * Stop the heartbeat mechanism
283
+ */
284
+ stopHeartbeat() {
285
+ if (this.heartbeatInterval) {
286
+ clearInterval(this.heartbeatInterval);
287
+ this.heartbeatInterval = null;
288
+ console.log("[websocket] Heartbeat stopped");
289
+ }
290
+ }
291
+ /**
292
+ * Get statistics about connected clients
293
+ */
294
+ getStats() {
295
+ return {
296
+ totalClients: this.clients.size,
297
+ clients: Array.from(this.clients.values()).map((client) => ({
298
+ id: client.id,
299
+ subscriptions: Array.from(client.subscriptions),
300
+ connectedAt: client.connectedAt.toISOString(),
301
+ isAlive: client.isAlive,
302
+ })),
303
+ };
304
+ }
305
+ /**
306
+ * Gracefully shutdown the WebSocket server
307
+ */
308
+ async shutdown() {
309
+ console.log("[websocket] Shutting down WebSocket server...");
310
+ this.stopHeartbeat();
311
+ // Close all client connections
312
+ this.clients.forEach((client) => {
313
+ try {
314
+ client.ws.close(1000, "Server shutting down");
315
+ }
316
+ catch (error) {
317
+ console.error(`[websocket] Error closing client ${client.id}:`, error);
318
+ }
319
+ });
320
+ this.clients.clear();
321
+ // Close the WebSocket server
322
+ if (this.wss) {
323
+ return new Promise((resolve) => {
324
+ this.wss.close(() => {
325
+ console.log("[websocket] WebSocket server closed");
326
+ this.wss = null;
327
+ resolve();
328
+ });
329
+ });
330
+ }
331
+ }
332
+ }
333
+ // Export singleton instance
334
+ export const websocketManager = new WebSocketManager();
335
+ /**
336
+ * Initialize the WebSocket server
337
+ */
338
+ export function initWebSocketServer(server, path) {
339
+ websocketManager.init(server, path);
340
+ }
341
+ /**
342
+ * Broadcast issue updates to subscribed clients
343
+ */
344
+ export function broadcastIssueUpdate(issueId, action, data) {
345
+ websocketManager.broadcast("issue", issueId, {
346
+ type: `issue_${action}`,
347
+ data,
348
+ });
349
+ }
350
+ /**
351
+ * Broadcast spec updates to subscribed clients
352
+ */
353
+ export function broadcastSpecUpdate(specId, action, data) {
354
+ websocketManager.broadcast("spec", specId, {
355
+ type: `spec_${action}`,
356
+ data,
357
+ });
358
+ }
359
+ /**
360
+ * Broadcast feedback updates to subscribed clients
361
+ */
362
+ export function broadcastFeedbackUpdate(action, data) {
363
+ websocketManager.broadcastGeneric({
364
+ type: `feedback_${action}`,
365
+ data,
366
+ });
367
+ }
368
+ /**
369
+ * Broadcast relationship updates to subscribed clients
370
+ */
371
+ export function broadcastRelationshipUpdate(action, data) {
372
+ websocketManager.broadcastGeneric({
373
+ type: `relationship_${action}`,
374
+ data,
375
+ });
376
+ }
377
+ /**
378
+ * Get WebSocket server statistics
379
+ */
380
+ export function getWebSocketStats() {
381
+ return websocketManager.getStats();
382
+ }
383
+ /**
384
+ * Shutdown the WebSocket server
385
+ */
386
+ export async function shutdownWebSocketServer() {
387
+ await websocketManager.shutdown();
388
+ }
389
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utility to get the SUDOCODE directory path
3
+ * Respects SUDOCODE_DIR environment variable for testing
4
+ */
5
+ import * as path from "path";
6
+ export function getSudocodeDir() {
7
+ return process.env.SUDOCODE_DIR || path.join(process.cwd(), ".sudocode");
8
+ }
9
+ //# sourceMappingURL=sudocode-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sudocode-dir.js","sourceRoot":"","sources":["../../src/utils/sudocode-dir.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAC3E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudocode-ai/local-server",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Local backend server for sudocode - provides REST API and WebSocket endpoints",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -9,8 +9,7 @@
9
9
  },
10
10
  "scripts": {
11
11
  "dev": "tsx watch src/index.ts",
12
- "build": "node build.js",
13
- "build:dev": "tsc && chmod +x dist/cli.js",
12
+ "build": "tsc && chmod +x dist/cli.js && node scripts/copy-frontend.js",
14
13
  "start": "node dist/index.js",
15
14
  "test": "NODE_ENV=test vitest",
16
15
  "test:e2e": "RUN_E2E_TESTS=true NODE_ENV=test vitest --run",
@@ -42,9 +41,8 @@
42
41
  },
43
42
  "dependencies": {
44
43
  "@ag-ui/core": "^0.0.39",
45
- "@copilotkit/runtime": "^1.10.6",
46
- "@sudocode-ai/cli": "^0.1.0",
47
- "@sudocode-ai/types": "^0.1.0",
44
+ "@sudocode-ai/cli": "^0.1.1",
45
+ "@sudocode-ai/types": "^0.1.1",
48
46
  "@types/ws": "^8.18.1",
49
47
  "async-mutex": "^0.5.0",
50
48
  "better-sqlite3": "^11.8.1",