daedalus-cli 3.68.13 → 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 (57) hide show
  1. package/CHANGELOG.md +14 -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/marathon.d.ts.map +1 -1
  12. package/dist/commands/marathon.js +22 -1
  13. package/dist/commands/marathon.js.map +1 -1
  14. package/dist/commands/webui.d.ts +3 -0
  15. package/dist/commands/webui.d.ts.map +1 -0
  16. package/dist/commands/webui.js +75 -0
  17. package/dist/commands/webui.js.map +1 -0
  18. package/dist/marathon/engine.d.ts.map +1 -1
  19. package/dist/marathon/engine.js +25 -1
  20. package/dist/marathon/engine.js.map +1 -1
  21. package/dist/marathon/evaluator.d.ts.map +1 -1
  22. package/dist/marathon/evaluator.js +8 -9
  23. package/dist/marathon/evaluator.js.map +1 -1
  24. package/dist/marathon/pr.d.ts +12 -0
  25. package/dist/marathon/pr.d.ts.map +1 -0
  26. package/dist/marathon/pr.js +125 -0
  27. package/dist/marathon/pr.js.map +1 -0
  28. package/dist/marathon/pr.test.d.ts +2 -0
  29. package/dist/marathon/pr.test.d.ts.map +1 -0
  30. package/dist/marathon/pr.test.js +48 -0
  31. package/dist/marathon/pr.test.js.map +1 -0
  32. package/dist/types.d.ts +5 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/webui/index.d.ts +9 -0
  35. package/dist/webui/index.d.ts.map +1 -0
  36. package/dist/webui/index.js +12 -0
  37. package/dist/webui/index.js.map +1 -0
  38. package/dist/webui/public/index.html +84 -0
  39. package/dist/webui/public/script.js +78 -0
  40. package/dist/webui/public/styles.css +219 -0
  41. package/dist/webui/server.d.ts +9 -0
  42. package/dist/webui/server.d.ts.map +1 -0
  43. package/dist/webui/server.js +116 -0
  44. package/dist/webui/server.js.map +1 -0
  45. package/dist/webui/server.test.d.ts +2 -0
  46. package/dist/webui/server.test.d.ts.map +1 -0
  47. package/dist/webui/server.test.js +158 -0
  48. package/dist/webui/server.test.js.map +1 -0
  49. package/dist/webui/types/dashboard.d.ts +2 -0
  50. package/dist/webui/types/dashboard.d.ts.map +1 -0
  51. package/dist/webui/types/dashboard.js +2 -0
  52. package/dist/webui/types/dashboard.js.map +1 -0
  53. package/dist/webui/types.d.ts +23 -0
  54. package/dist/webui/types.d.ts.map +1 -0
  55. package/dist/webui/types.js +2 -0
  56. package/dist/webui/types.js.map +1 -0
  57. package/package.json +4 -2
@@ -0,0 +1,219 @@
1
+ :root {
2
+ --bg-primary: #0a0e17;
3
+ --bg-secondary: #121826;
4
+ --bg-panel: #182234;
5
+ --border-color: #1e293b;
6
+ --border-glow: #00f0ff33;
7
+ --text-primary: #f8fafc;
8
+ --text-muted: #64748b;
9
+ --accent-cyan: #00f0ff;
10
+ --accent-green: #10b981;
11
+ --accent-purple: #8b5cf6;
12
+ --accent-red: #ef4444;
13
+ }
14
+
15
+ * {
16
+ box-sizing: border-box;
17
+ margin: 0;
18
+ padding: 0;
19
+ }
20
+
21
+ body {
22
+ background-color: var(--bg-primary);
23
+ color: var(--text-primary);
24
+ font-family: 'JetBrains Mono', 'Fira Code', monospace, system-ui, sans-serif;
25
+ min-height: 100vh;
26
+ display: flex;
27
+ flex-direction: column;
28
+ }
29
+
30
+ .dashboard {
31
+ max-width: 1200px;
32
+ margin: 0 auto;
33
+ padding: 24px;
34
+ width: 100%;
35
+ }
36
+
37
+ .header {
38
+ display: flex;
39
+ justify-content: space-between;
40
+ align-items: center;
41
+ border-bottom: 1px solid var(--border-color);
42
+ padding-bottom: 20px;
43
+ margin-bottom: 28px;
44
+ }
45
+
46
+ .brand {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 12px;
50
+ }
51
+
52
+ .logo {
53
+ color: var(--accent-cyan);
54
+ font-size: 24px;
55
+ text-shadow: 0 0 10px var(--accent-cyan);
56
+ }
57
+
58
+ h1 {
59
+ font-size: 20px;
60
+ letter-spacing: 2px;
61
+ color: var(--text-primary);
62
+ }
63
+
64
+ .subtitle {
65
+ color: var(--text-muted);
66
+ font-size: 13px;
67
+ margin-left: 8px;
68
+ }
69
+
70
+ .status-bar {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 16px;
74
+ font-size: 13px;
75
+ }
76
+
77
+ .status {
78
+ padding: 4px 10px;
79
+ border-radius: 4px;
80
+ font-weight: bold;
81
+ }
82
+
83
+ .status.connected {
84
+ color: var(--accent-green);
85
+ background: rgba(16, 185, 129, 0.1);
86
+ border: 1px solid rgba(16, 185, 129, 0.3);
87
+ text-shadow: 0 0 6px rgba(16, 185, 129, 0.4);
88
+ }
89
+
90
+ .status.disconnected {
91
+ color: var(--accent-red);
92
+ background: rgba(239, 68, 68, 0.1);
93
+ border: 1px solid rgba(239, 68, 68, 0.3);
94
+ }
95
+
96
+ .timestamp {
97
+ color: var(--text-muted);
98
+ }
99
+
100
+ .grid {
101
+ display: grid;
102
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
103
+ gap: 20px;
104
+ margin-bottom: 24px;
105
+ }
106
+
107
+ .panel {
108
+ background: var(--bg-secondary);
109
+ border: 1px solid var(--border-color);
110
+ border-radius: 8px;
111
+ padding: 20px;
112
+ position: relative;
113
+ overflow: hidden;
114
+ transition: border-color 0.2s, box-shadow 0.2s;
115
+ }
116
+
117
+ .panel:hover {
118
+ border-color: var(--accent-cyan);
119
+ box-shadow: 0 0 15px var(--border-glow);
120
+ }
121
+
122
+ .panel-header {
123
+ display: flex;
124
+ justify-content: space-between;
125
+ align-items: baseline;
126
+ margin-bottom: 16px;
127
+ }
128
+
129
+ .metric-name {
130
+ font-size: 12px;
131
+ letter-spacing: 1.5px;
132
+ color: var(--text-muted);
133
+ }
134
+
135
+ .metric-value {
136
+ font-size: 28px;
137
+ font-weight: 700;
138
+ color: var(--accent-cyan);
139
+ text-shadow: 0 0 8px rgba(0, 240, 255, 0.3);
140
+ }
141
+
142
+ .sparkline {
143
+ height: 40px;
144
+ background: var(--bg-panel);
145
+ border-radius: 4px;
146
+ margin-bottom: 12px;
147
+ position: relative;
148
+ overflow: hidden;
149
+ }
150
+
151
+ .sparkline::after {
152
+ content: '';
153
+ position: absolute;
154
+ bottom: 0;
155
+ left: 0;
156
+ right: 0;
157
+ height: 4px;
158
+ background: var(--accent-cyan);
159
+ box-shadow: 0 0 8px var(--accent-cyan);
160
+ }
161
+
162
+ .panel-footer {
163
+ display: flex;
164
+ justify-content: space-between;
165
+ font-size: 12px;
166
+ color: var(--text-muted);
167
+ }
168
+
169
+ .metric-status {
170
+ color: var(--accent-green);
171
+ }
172
+
173
+ .log-panel {
174
+ grid-column: 1 / -1;
175
+ background: var(--bg-secondary);
176
+ }
177
+
178
+ .clear-btn {
179
+ background: transparent;
180
+ border: 1px solid var(--border-color);
181
+ color: var(--text-muted);
182
+ padding: 4px 10px;
183
+ border-radius: 4px;
184
+ font-family: inherit;
185
+ font-size: 11px;
186
+ cursor: pointer;
187
+ transition: all 0.2s;
188
+ }
189
+
190
+ .clear-btn:hover {
191
+ border-color: var(--accent-red);
192
+ color: var(--accent-red);
193
+ }
194
+
195
+ .log-container {
196
+ height: 180px;
197
+ overflow-y: auto;
198
+ background: var(--bg-primary);
199
+ border: 1px solid var(--border-color);
200
+ border-radius: 4px;
201
+ padding: 12px;
202
+ font-size: 12px;
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 6px;
206
+ }
207
+
208
+ .log-entry {
209
+ color: var(--text-muted);
210
+ }
211
+
212
+ .log-entry.active {
213
+ color: var(--text-primary);
214
+ }
215
+
216
+ .log-entry .time {
217
+ color: var(--accent-purple);
218
+ margin-right: 8px;
219
+ }
@@ -0,0 +1,9 @@
1
+ import { IncomingMessage, ServerResponse, Server } from 'node:http';
2
+ declare const PORT = 3888;
3
+ declare const HOST = "localhost";
4
+ export declare function handleRequest(req: IncomingMessage, res: ServerResponse): void;
5
+ declare const server: Server;
6
+ export declare function startServer(port?: number, host?: string): Promise<Server>;
7
+ export declare function stopServer(): Promise<void>;
8
+ export { server, PORT, HOST };
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/webui/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AASlF,QAAA,MAAM,IAAI,OAAO,CAAC;AAClB,QAAA,MAAM,IAAI,cAAc,CAAC;AAezB,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAkE7E;AAED,QAAA,MAAM,MAAM,EAAE,MAAoC,CAAC;AAEnD,wBAAgB,WAAW,CAAC,IAAI,SAAO,EAAE,IAAI,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CASrE;AAED,wBAAgB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB1C;AAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC"}
@@ -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.68.13",
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",