daedalus-cli 3.69.0 → 3.70.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 (49) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -0
  3. package/dist/agents/loop.js +2 -2
  4. package/dist/agents/loop.js.map +1 -1
  5. package/dist/agents/orchestrator-verification.d.ts.map +1 -1
  6. package/dist/agents/orchestrator-verification.js +9 -1
  7. package/dist/agents/orchestrator-verification.js.map +1 -1
  8. package/dist/commands/index.d.ts.map +1 -1
  9. package/dist/commands/index.js +3 -1
  10. package/dist/commands/index.js.map +1 -1
  11. package/dist/commands/webui.d.ts +3 -0
  12. package/dist/commands/webui.d.ts.map +1 -0
  13. package/dist/commands/webui.js +75 -0
  14. package/dist/commands/webui.js.map +1 -0
  15. package/dist/marathon/engine.d.ts.map +1 -1
  16. package/dist/marathon/engine.js +3 -1
  17. package/dist/marathon/engine.js.map +1 -1
  18. package/dist/marathon/evaluator.d.ts.map +1 -1
  19. package/dist/marathon/evaluator.js +8 -9
  20. package/dist/marathon/evaluator.js.map +1 -1
  21. package/dist/marathon/pr.d.ts.map +1 -1
  22. package/dist/marathon/pr.js +39 -22
  23. package/dist/marathon/pr.js.map +1 -1
  24. package/dist/types.d.ts +5 -0
  25. package/dist/types.d.ts.map +1 -1
  26. package/dist/webui/index.d.ts +9 -0
  27. package/dist/webui/index.d.ts.map +1 -0
  28. package/dist/webui/index.js +12 -0
  29. package/dist/webui/index.js.map +1 -0
  30. package/dist/webui/public/index.html +84 -0
  31. package/dist/webui/public/script.js +78 -0
  32. package/dist/webui/public/styles.css +219 -0
  33. package/dist/webui/server.d.ts +9 -0
  34. package/dist/webui/server.d.ts.map +1 -0
  35. package/dist/webui/server.js +116 -0
  36. package/dist/webui/server.js.map +1 -0
  37. package/dist/webui/server.test.d.ts +2 -0
  38. package/dist/webui/server.test.d.ts.map +1 -0
  39. package/dist/webui/server.test.js +158 -0
  40. package/dist/webui/server.test.js.map +1 -0
  41. package/dist/webui/types/dashboard.d.ts +2 -0
  42. package/dist/webui/types/dashboard.d.ts.map +1 -0
  43. package/dist/webui/types/dashboard.js +2 -0
  44. package/dist/webui/types/dashboard.js.map +1 -0
  45. package/dist/webui/types.d.ts +23 -0
  46. package/dist/webui/types.d.ts.map +1 -0
  47. package/dist/webui/types.js +2 -0
  48. package/dist/webui/types.js.map +1 -0
  49. package/package.json +4 -2
@@ -0,0 +1,116 @@
1
+ import { createServer } from 'node:http';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ const PORT = 3888;
8
+ const HOST = 'localhost';
9
+ const activeClients = new Set();
10
+ function resolvePublicAsset(filename) {
11
+ const primary = path.join(__dirname, 'public', filename);
12
+ if (fs.existsSync(primary))
13
+ return primary;
14
+ // Fallback for development / uncompiled runner environments
15
+ const fallback = path.join(__dirname, '..', '..', 'src', 'webui', 'public', filename);
16
+ if (fs.existsSync(fallback))
17
+ return fallback;
18
+ return null;
19
+ }
20
+ export function handleRequest(req, res) {
21
+ try {
22
+ if (req.method === 'GET' && req.url === '/') {
23
+ const htmlPath = resolvePublicAsset('index.html');
24
+ if (htmlPath) {
25
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
26
+ res.end(fs.readFileSync(htmlPath, 'utf8'));
27
+ return;
28
+ }
29
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
30
+ res.end('OK');
31
+ return;
32
+ }
33
+ if (req.method === 'GET' && req.url === '/styles.css') {
34
+ const cssPath = resolvePublicAsset('styles.css');
35
+ if (cssPath) {
36
+ res.writeHead(200, { 'Content-Type': 'text/css; charset=utf-8' });
37
+ res.end(fs.readFileSync(cssPath, 'utf8'));
38
+ return;
39
+ }
40
+ }
41
+ if (req.method === 'GET' && req.url === '/script.js') {
42
+ const jsPath = resolvePublicAsset('script.js');
43
+ if (jsPath) {
44
+ res.writeHead(200, { 'Content-Type': 'application/javascript; charset=utf-8' });
45
+ res.end(fs.readFileSync(jsPath, 'utf8'));
46
+ return;
47
+ }
48
+ }
49
+ if (req.method === 'GET' && req.url === '/telemetry') {
50
+ res.writeHead(200, {
51
+ 'Content-Type': 'text/event-stream',
52
+ 'Cache-Control': 'no-cache',
53
+ 'Connection': 'keep-alive',
54
+ 'Access-Control-Allow-Origin': '*'
55
+ });
56
+ res.write('data: {"type":"connected"}\n\n');
57
+ activeClients.add(res);
58
+ const interval = setInterval(() => {
59
+ const data = {
60
+ timestamp: Date.now(),
61
+ metric: ['cpu', 'memory', 'disk', 'network'][Math.floor(Math.random() * 4)],
62
+ value: Math.floor(Math.random() * 100)
63
+ };
64
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
65
+ }, 1000);
66
+ req.on('close', () => {
67
+ clearInterval(interval);
68
+ activeClients.delete(res);
69
+ res.end();
70
+ });
71
+ return;
72
+ }
73
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
74
+ res.end('Not Found');
75
+ }
76
+ catch (err) {
77
+ res.writeHead(500, { 'Content-Type': 'application/json' });
78
+ res.end(JSON.stringify({ error: err?.message || 'Internal Server Error' }));
79
+ }
80
+ }
81
+ const server = createServer(handleRequest);
82
+ export function startServer(port = PORT, host = HOST) {
83
+ return new Promise((resolve, reject) => {
84
+ server.once('error', reject);
85
+ server.listen(port, host, () => {
86
+ server.removeListener('error', reject);
87
+ console.info(`[webui] Server listening on http://${host}:${port}`);
88
+ resolve(server);
89
+ });
90
+ });
91
+ }
92
+ export function stopServer() {
93
+ return new Promise((resolve, reject) => {
94
+ for (const client of activeClients) {
95
+ try {
96
+ client.end();
97
+ }
98
+ catch {
99
+ // ignore client termination error
100
+ }
101
+ }
102
+ activeClients.clear();
103
+ if (!server.listening) {
104
+ resolve();
105
+ return;
106
+ }
107
+ server.close((err) => {
108
+ if (err)
109
+ reject(err);
110
+ else
111
+ resolve();
112
+ });
113
+ });
114
+ }
115
+ export { server, PORT, HOST };
116
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/webui/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../src/webui/server.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import { handleRequest, server } from './server.js';
4
+ // Mock dependencies
5
+ vi.mock('node:fs');
6
+ // Mock React components for web UI testing
7
+ vi.mock('./components/HomePage', () => ({
8
+ default: ({ title }) => `<div class="home-container"><h1>${title}</h1></div>`
9
+ }));
10
+ vi.mock('./components/PromptCard', () => ({
11
+ default: ({ title }) => `<div class="prompt-card"><p>${title}</p></div>`
12
+ }));
13
+ describe('WebUI Server', () => {
14
+ let mockReq;
15
+ let mockRes;
16
+ let writeHeadSpy;
17
+ let endSpy;
18
+ let writeSpy;
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ // Setup mock request
22
+ const onMock = vi.fn();
23
+ mockReq = {
24
+ method: 'GET',
25
+ url: '/',
26
+ on: onMock
27
+ };
28
+ // Setup mock response
29
+ writeHeadSpy = vi.fn();
30
+ endSpy = vi.fn();
31
+ writeSpy = vi.fn();
32
+ mockRes = {
33
+ writeHead: writeHeadSpy,
34
+ end: endSpy,
35
+ write: writeSpy
36
+ };
37
+ // Mock fs.existsSync to return true for index.html
38
+ vi.mocked(fs.existsSync).mockReturnValue(true);
39
+ vi.mocked(fs.readFileSync).mockReturnValue('<html>Mock HTML</html>');
40
+ });
41
+ describe('GET /', () => {
42
+ it('should serve index.html when file exists', () => {
43
+ handleRequest(mockReq, mockRes);
44
+ expect(writeHeadSpy).toHaveBeenCalledWith(200, { 'Content-Type': 'text/html; charset=utf-8' });
45
+ expect(endSpy).toHaveBeenCalledWith('<html>Mock HTML</html>');
46
+ });
47
+ it('should return OK when index.html does not exist', () => {
48
+ vi.mocked(fs.existsSync).mockReturnValue(false);
49
+ handleRequest(mockReq, mockRes);
50
+ expect(writeHeadSpy).toHaveBeenCalledWith(200, { 'Content-Type': 'text/plain' });
51
+ expect(endSpy).toHaveBeenCalledWith('OK');
52
+ });
53
+ });
54
+ describe('GET /telemetry', () => {
55
+ beforeEach(() => {
56
+ vi.useFakeTimers();
57
+ mockReq.url = '/telemetry';
58
+ mockReq.method = 'GET';
59
+ });
60
+ afterEach(() => {
61
+ vi.useRealTimers();
62
+ });
63
+ it('should establish telemetry stream connection', () => {
64
+ handleRequest(mockReq, mockRes);
65
+ expect(writeHeadSpy).toHaveBeenCalledWith(200, {
66
+ 'Content-Type': 'text/event-stream',
67
+ 'Cache-Control': 'no-cache',
68
+ 'Connection': 'keep-alive',
69
+ 'Access-Control-Allow-Origin': '*'
70
+ });
71
+ expect(writeSpy).toHaveBeenCalledWith('data: {"type":"connected"}\n\n');
72
+ });
73
+ it('should send telemetry data every second', () => {
74
+ handleRequest(mockReq, mockRes);
75
+ // Fast-forward time to trigger interval
76
+ vi.advanceTimersByTime(1000);
77
+ expect(writeSpy).toHaveBeenCalled();
78
+ const telemetryCall = writeSpy.mock.calls[1];
79
+ expect(telemetryCall[0]).toMatch(/^data: \{.*\}\n\n$/);
80
+ // Verify data structure
81
+ const dataStr = telemetryCall[0];
82
+ const dataMatch = dataStr.match(/data: (\{.*\})\n\n/);
83
+ if (dataMatch) {
84
+ const data = JSON.parse(dataMatch[1]);
85
+ expect(data).toHaveProperty('timestamp');
86
+ expect(data).toHaveProperty('metric');
87
+ expect(data).toHaveProperty('value');
88
+ expect(['cpu', 'memory', 'disk', 'network']).toContain(data.metric);
89
+ expect(data.value).toBeGreaterThanOrEqual(0);
90
+ expect(data.value).toBeLessThanOrEqual(100);
91
+ }
92
+ });
93
+ it('should clean up interval on client disconnect', () => {
94
+ const clearIntervalSpy = vi.spyOn(global, 'clearInterval');
95
+ handleRequest(mockReq, mockRes);
96
+ // Simulate client disconnect
97
+ const closeCallback = mockReq.on.mock.calls.find((call) => call[0] === 'close')?.[1];
98
+ if (closeCallback) {
99
+ closeCallback();
100
+ }
101
+ expect(clearIntervalSpy).toHaveBeenCalled();
102
+ });
103
+ });
104
+ describe('Other routes', () => {
105
+ it('should return 404 for unknown routes', () => {
106
+ mockReq.url = '/unknown';
107
+ mockReq.method = 'GET';
108
+ handleRequest(mockReq, mockRes);
109
+ expect(writeHeadSpy).toHaveBeenCalledWith(404, { 'Content-Type': 'text/plain' });
110
+ expect(endSpy).toHaveBeenCalledWith('Not Found');
111
+ });
112
+ it('should return 404 for non-GET methods', () => {
113
+ mockReq.url = '/';
114
+ mockReq.method = 'POST';
115
+ handleRequest(mockReq, mockRes);
116
+ expect(writeHeadSpy).toHaveBeenCalledWith(404, { 'Content-Type': 'text/plain' });
117
+ expect(endSpy).toHaveBeenCalledWith('Not Found');
118
+ });
119
+ });
120
+ describe('Server initialization', () => {
121
+ it('should create server instance', () => {
122
+ expect(server).toBeDefined();
123
+ expect(typeof server.listen).toBe('function');
124
+ });
125
+ it('should export server instance', () => {
126
+ expect(server).toBeDefined();
127
+ });
128
+ });
129
+ describe('TelemetryData interface', () => {
130
+ it('should have correct structure', () => {
131
+ const data = {
132
+ timestamp: Date.now(),
133
+ metric: 'cpu',
134
+ value: 50
135
+ };
136
+ expect(data).toHaveProperty('timestamp');
137
+ expect(data).toHaveProperty('metric');
138
+ expect(data).toHaveProperty('value');
139
+ expect(typeof data.timestamp).toBe('number');
140
+ expect(typeof data.metric).toBe('string');
141
+ expect(typeof data.value).toBe('number');
142
+ });
143
+ });
144
+ describe('Server error handling', () => {
145
+ it('should return 500 for internal server error', () => {
146
+ vi.mocked(fs.existsSync).mockReturnValue(true);
147
+ vi.mocked(fs.readFileSync).mockImplementation(() => {
148
+ throw new Error('Disk read error');
149
+ });
150
+ handleRequest(mockReq, mockRes);
151
+ expect(writeHeadSpy).toHaveBeenCalledWith(500, { 'Content-Type': 'application/json' });
152
+ expect(endSpy).toHaveBeenCalled();
153
+ const responseBody = JSON.parse(endSpy.mock.calls[0][0]);
154
+ expect(responseBody.error).toBe('Disk read error');
155
+ });
156
+ });
157
+ });
158
+ //# sourceMappingURL=server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../src/webui/server.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/webui/types/dashboard.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/webui/types/dashboard.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ export interface IServerConfig {
2
+ /** Port on which the server should listen */
3
+ port: number;
4
+ /** Optional hostname; defaults to 'localhost' */
5
+ host?: string;
6
+ /** Flag indicating whether HTTPS should be used */
7
+ secure?: boolean;
8
+ }
9
+ export interface IRequest {
10
+ /** HTTP method, e.g., 'GET', 'POST' */
11
+ method: string;
12
+ /** URL path, e.g., '/api/status' */
13
+ path: string;
14
+ /** Optional JSON payload for POST/PUT */
15
+ body?: any;
16
+ }
17
+ export interface IResponse {
18
+ /** HTTP status code */
19
+ status: number;
20
+ /** JSON payload returned to the client */
21
+ data: any;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/webui/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,EAAE,GAAG,CAAC;CACX"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/webui/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "daedalus-cli",
3
- "version": "3.69.0",
3
+ "version": "3.70.0",
4
4
  "description": "Local-first AI coding CLI with embedded model router, multi-agent orchestration, and codebase indexing",
5
5
  "type": "module",
6
6
  "bin": {
@@ -21,7 +21,7 @@
21
21
  "start": "tsx src/index.ts",
22
22
  "bot": "tsx src/bot/index.ts",
23
23
  "dev": "tsx watch src/index.ts",
24
- "build": "tsc && node scripts/copy-skills.mjs",
24
+ "build": "tsc && node scripts/copy-assets.mjs",
25
25
  "lint": "eslint src --ext .ts",
26
26
  "prepublishOnly": "npm run build",
27
27
  "test": "vitest run",
@@ -79,7 +79,9 @@
79
79
  "@types/better-sqlite3": "^7.6.13",
80
80
  "@types/blessed": "^0.1.27",
81
81
  "@types/diff": "^6.0.0",
82
+ "@types/express": "^5.0.6",
82
83
  "@types/node": "^22.15.3",
84
+ "@types/react": "^19.2.18",
83
85
  "conventional-changelog-conventionalcommits": "^8.0.0",
84
86
  "esbuild": "^0.24.0",
85
87
  "eslint": "^10.5.0",