treesap 0.0.2 ā 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.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +137 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/BaseHead.d.ts +5 -0
- package/dist/components/BaseHead.d.ts.map +1 -0
- package/dist/components/BaseHead.js +161 -0
- package/dist/components/BaseHead.js.map +1 -0
- package/dist/components/SimpleLivePreview.d.ts +7 -0
- package/dist/components/SimpleLivePreview.d.ts.map +1 -0
- package/dist/components/SimpleLivePreview.js +7 -0
- package/dist/components/SimpleLivePreview.js.map +1 -0
- package/dist/components/Terminal.d.ts +7 -0
- package/dist/components/Terminal.d.ts.map +1 -0
- package/dist/components/Terminal.js +8 -0
- package/dist/components/Terminal.js.map +1 -0
- package/dist/components/VoiceRecorder.d.ts +4 -0
- package/dist/components/VoiceRecorder.d.ts.map +1 -0
- package/dist/components/VoiceRecorder.js +5 -0
- package/dist/components/VoiceRecorder.js.map +1 -0
- package/dist/components/icons/GeminiLogo.d.ts +7 -0
- package/dist/components/icons/GeminiLogo.d.ts.map +1 -0
- package/dist/components/icons/GeminiLogo.js +5 -0
- package/dist/components/icons/GeminiLogo.js.map +1 -0
- package/dist/components/icons/OllamaLogo.d.ts +2 -0
- package/dist/components/icons/OllamaLogo.d.ts.map +1 -0
- package/dist/components/icons/OllamaLogo.js +5 -0
- package/dist/components/icons/OllamaLogo.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts/Layout.d.ts +8 -0
- package/dist/layouts/Layout.d.ts.map +1 -0
- package/dist/layouts/Layout.js +16 -0
- package/dist/layouts/Layout.js.map +1 -0
- package/dist/layouts/NotFoundLayout.d.ts +2 -0
- package/dist/layouts/NotFoundLayout.d.ts.map +1 -0
- package/dist/layouts/NotFoundLayout.js +6 -0
- package/dist/layouts/NotFoundLayout.js.map +1 -0
- package/dist/pages/Home.d.ts +7 -0
- package/dist/pages/Home.d.ts.map +1 -0
- package/dist/pages/Home.js +8 -0
- package/dist/pages/Home.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +333 -0
- package/dist/server.js.map +1 -0
- package/dist/services/dev-server.d.ts +29 -0
- package/dist/services/dev-server.d.ts.map +1 -0
- package/dist/services/dev-server.js +201 -0
- package/dist/services/dev-server.js.map +1 -0
- package/dist/services/terminal.d.ts +22 -0
- package/dist/services/terminal.d.ts.map +1 -0
- package/dist/services/terminal.js +133 -0
- package/dist/services/terminal.js.map +1 -0
- package/dist/static/components/SimpleLivePreview.js +270 -0
- package/dist/static/components/Terminal.js +244 -0
- package/dist/static/favicon.svg +14 -0
- package/dist/static/signals/LivePreviewSignal.js +71 -0
- package/dist/static/styles/main.css +1400 -0
- package/package.json +58 -7
- package/src/cli.ts +155 -0
- package/src/components/BaseHead.ts +164 -0
- package/src/components/SimpleLivePreview.tsx +81 -0
- package/src/components/Terminal.tsx +34 -0
- package/src/components/VoiceRecorder.tsx +33 -0
- package/src/components/icons/GeminiLogo.tsx +10 -0
- package/src/components/icons/OllamaLogo.tsx +5 -0
- package/src/index.tsx +11 -0
- package/src/layouts/Layout.tsx +34 -0
- package/src/layouts/NotFoundLayout.tsx +15 -0
- package/src/pages/Home.tsx +27 -0
- package/src/server.tsx +399 -0
- package/src/services/dev-server.ts +234 -0
- package/src/services/terminal.ts +165 -0
- package/src/static/components/SimpleLivePreview.js +270 -0
- package/src/static/components/Terminal.js +244 -0
- package/src/static/favicon.svg +14 -0
- package/src/static/signals/LivePreviewSignal.js +71 -0
- package/src/static/styles/main.css +1400 -0
- package/src/styles/input.css +3 -0
- package/tailwind.config.ts +12 -0
- package/tsconfig.json +37 -0
- package/README.md +0 -1
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TreesapConfig {
|
|
2
|
+
port?: number;
|
|
3
|
+
projectRoot?: string;
|
|
4
|
+
previewPort?: number;
|
|
5
|
+
devCommand?: string;
|
|
6
|
+
devPort?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function startServer(config?: TreesapConfig & {
|
|
9
|
+
autoStartDev?: boolean;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,MAAM,GAAE,aAAa,GAAG;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,iBA2XxF"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { jsx as _jsx } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { serveStatic } from "@hono/node-server/serve-static";
|
|
4
|
+
import NotFoundLayout from "./layouts/NotFoundLayout.js";
|
|
5
|
+
import { Home } from "./pages/Home.js";
|
|
6
|
+
import { DevServerManager } from "./services/dev-server.js";
|
|
7
|
+
import { TerminalService } from "./services/terminal.js";
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import process from "node:process";
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
export async function startServer(config = {}) {
|
|
12
|
+
const { port = 1234, projectRoot = process.cwd(), previewPort = 5173, devCommand, devPort, autoStartDev = false } = config;
|
|
13
|
+
// Change the current working directory to the project root
|
|
14
|
+
process.chdir(projectRoot);
|
|
15
|
+
// Initialize dev server manager if dev command is provided
|
|
16
|
+
let devServerManager = null;
|
|
17
|
+
if (devCommand) {
|
|
18
|
+
devServerManager = new DevServerManager(devCommand, devPort);
|
|
19
|
+
devServerManager.setupGracefulShutdown();
|
|
20
|
+
// Auto-start dev server if enabled
|
|
21
|
+
if (autoStartDev) {
|
|
22
|
+
devServerManager.start().catch(error => {
|
|
23
|
+
console.error("Failed to auto-start dev server:", error);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const app = new Hono();
|
|
28
|
+
// Resolve module static directory (so consumers can see bundled assets)
|
|
29
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const moduleStaticRoot = path.join(moduleDir, 'static');
|
|
31
|
+
// Home page
|
|
32
|
+
app.get("/", (c) => {
|
|
33
|
+
// Additional cache prevention headers
|
|
34
|
+
c.header('Cache-Control', 'no-cache, no-store, must-revalidate, private');
|
|
35
|
+
c.header('Pragma', 'no-cache');
|
|
36
|
+
c.header('Expires', '0');
|
|
37
|
+
return c.html(_jsx(Home, { previewPort: previewPort }));
|
|
38
|
+
});
|
|
39
|
+
// Claude page
|
|
40
|
+
app.get("/claude", (c) => {
|
|
41
|
+
// Additional cache prevention headers
|
|
42
|
+
c.header('Cache-Control', 'no-cache, no-store, must-revalidate, private');
|
|
43
|
+
c.header('Pragma', 'no-cache');
|
|
44
|
+
c.header('Expires', '0');
|
|
45
|
+
return c.html(_jsx(Home, { previewPort: previewPort, workingDirectory: projectRoot }));
|
|
46
|
+
});
|
|
47
|
+
// Dev server management endpoints
|
|
48
|
+
app.get("/api/dev-status", (c) => {
|
|
49
|
+
if (!devServerManager) {
|
|
50
|
+
return c.json({ error: "No dev server configured" }, 400);
|
|
51
|
+
}
|
|
52
|
+
return c.json(devServerManager.getStatus());
|
|
53
|
+
});
|
|
54
|
+
app.post("/api/dev-restart", async (c) => {
|
|
55
|
+
if (!devServerManager) {
|
|
56
|
+
return c.json({ error: "No dev server configured" }, 400);
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await devServerManager.restart();
|
|
60
|
+
return c.json({ success: true, message: "Dev server restarted" });
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return c.json({
|
|
64
|
+
error: "Failed to restart dev server",
|
|
65
|
+
details: error instanceof Error ? error.message : String(error)
|
|
66
|
+
}, 500);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
app.post("/api/dev-start", async (c) => {
|
|
70
|
+
if (!devServerManager) {
|
|
71
|
+
return c.json({ error: "No dev server configured" }, 400);
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
await devServerManager.start();
|
|
75
|
+
return c.json({ success: true, message: "Dev server started" });
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return c.json({
|
|
79
|
+
error: "Failed to start dev server",
|
|
80
|
+
details: error instanceof Error ? error.message : String(error)
|
|
81
|
+
}, 500);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
app.post("/api/dev-stop", async (c) => {
|
|
85
|
+
if (!devServerManager) {
|
|
86
|
+
return c.json({ error: "No dev server configured" }, 400);
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
await devServerManager.stop();
|
|
90
|
+
return c.json({ success: true, message: "Dev server stopped" });
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return c.json({
|
|
94
|
+
error: "Failed to stop dev server",
|
|
95
|
+
details: error instanceof Error ? error.message : String(error)
|
|
96
|
+
}, 500);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
app.get("/api/dev-logs", (c) => {
|
|
100
|
+
if (!devServerManager) {
|
|
101
|
+
return c.json({ error: "No dev server configured" }, 400);
|
|
102
|
+
}
|
|
103
|
+
const logs = devServerManager.getLogs();
|
|
104
|
+
return c.json({ logs });
|
|
105
|
+
});
|
|
106
|
+
// List active terminal sessions
|
|
107
|
+
app.get("/api/terminal/sessions", (c) => {
|
|
108
|
+
const sessions = TerminalService.getAllSessions();
|
|
109
|
+
return c.json({
|
|
110
|
+
sessions: sessions.map(session => ({
|
|
111
|
+
id: session.id,
|
|
112
|
+
createdAt: session.createdAt,
|
|
113
|
+
lastActivity: session.lastActivity
|
|
114
|
+
}))
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
// Terminal endpoints
|
|
118
|
+
app.post("/terminal/execute/:sessionId", async (c) => {
|
|
119
|
+
const sessionId = c.req.param('sessionId');
|
|
120
|
+
const body = await c.req.json();
|
|
121
|
+
const { command } = body;
|
|
122
|
+
if (!command) {
|
|
123
|
+
return c.json({ error: "Command is required" }, 400);
|
|
124
|
+
}
|
|
125
|
+
// Get or create terminal session
|
|
126
|
+
let session = TerminalService.getSession(sessionId);
|
|
127
|
+
if (!session) {
|
|
128
|
+
session = TerminalService.createSession(sessionId);
|
|
129
|
+
}
|
|
130
|
+
const success = TerminalService.executeCommand(sessionId, command);
|
|
131
|
+
if (success) {
|
|
132
|
+
return c.json({ success: true });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
return c.json({ error: "Failed to execute command" }, 500);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
app.post("/terminal/input/:sessionId", async (c) => {
|
|
139
|
+
const sessionId = c.req.param('sessionId');
|
|
140
|
+
const body = await c.req.json();
|
|
141
|
+
const { input } = body;
|
|
142
|
+
if (input === undefined) {
|
|
143
|
+
return c.json({ error: "Input is required" }, 400);
|
|
144
|
+
}
|
|
145
|
+
// Get or create terminal session
|
|
146
|
+
let session = TerminalService.getSession(sessionId);
|
|
147
|
+
if (!session) {
|
|
148
|
+
session = TerminalService.createSession(sessionId);
|
|
149
|
+
}
|
|
150
|
+
// Send input directly to PTY
|
|
151
|
+
try {
|
|
152
|
+
session.lastActivity = new Date();
|
|
153
|
+
session.process.write(input);
|
|
154
|
+
return c.json({ success: true });
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
console.error(`Error sending input to session ${sessionId}:`, error);
|
|
158
|
+
return c.json({ error: "Failed to send input" }, 500);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
app.get("/terminal/stream/:sessionId", async (c) => {
|
|
162
|
+
const sessionId = c.req.param('sessionId');
|
|
163
|
+
// Get or create terminal session
|
|
164
|
+
let session = TerminalService.getSession(sessionId);
|
|
165
|
+
if (!session) {
|
|
166
|
+
session = TerminalService.createSession(sessionId);
|
|
167
|
+
}
|
|
168
|
+
// Set SSE headers
|
|
169
|
+
c.header('Content-Type', 'text/event-stream');
|
|
170
|
+
c.header('Cache-Control', 'no-cache');
|
|
171
|
+
c.header('Connection', 'keep-alive');
|
|
172
|
+
c.header('Access-Control-Allow-Origin', '*');
|
|
173
|
+
const stream = new ReadableStream({
|
|
174
|
+
start(controller) {
|
|
175
|
+
const encoder = new TextEncoder();
|
|
176
|
+
// Send initial connection event
|
|
177
|
+
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ type: 'connected' })}\n\n`));
|
|
178
|
+
// Set up output listener
|
|
179
|
+
const handleOutput = (data) => {
|
|
180
|
+
try {
|
|
181
|
+
controller.enqueue(encoder.encode(`data: ${JSON.stringify(data)}\n\n`));
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error('Error sending terminal output:', error);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
session.eventEmitter.on('output', handleOutput);
|
|
188
|
+
// Handle client disconnect
|
|
189
|
+
const handleDisconnect = () => {
|
|
190
|
+
session.eventEmitter.removeListener('output', handleOutput);
|
|
191
|
+
};
|
|
192
|
+
// Clean up on stream close
|
|
193
|
+
return () => {
|
|
194
|
+
handleDisconnect();
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return new Response(stream, {
|
|
199
|
+
headers: {
|
|
200
|
+
'Content-Type': 'text/event-stream',
|
|
201
|
+
'Cache-Control': 'no-cache',
|
|
202
|
+
'Connection': 'keep-alive',
|
|
203
|
+
'Access-Control-Allow-Origin': '*'
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
// Claude Code subprocess management
|
|
208
|
+
let claudeCodeManager = null;
|
|
209
|
+
app.post("/api/claude-start", async (c) => {
|
|
210
|
+
try {
|
|
211
|
+
if (claudeCodeManager && claudeCodeManager.getStatus().running) {
|
|
212
|
+
return c.json({ error: "Claude Code is already running" }, 400);
|
|
213
|
+
}
|
|
214
|
+
claudeCodeManager = new DevServerManager("claude");
|
|
215
|
+
claudeCodeManager.setupGracefulShutdown();
|
|
216
|
+
await claudeCodeManager.start();
|
|
217
|
+
return c.json({ success: true, message: "Claude Code started" });
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return c.json({
|
|
221
|
+
error: "Failed to start Claude Code",
|
|
222
|
+
details: error instanceof Error ? error.message : String(error)
|
|
223
|
+
}, 500);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
app.get("/api/claude-status", (c) => {
|
|
227
|
+
if (!claudeCodeManager) {
|
|
228
|
+
return c.json({ running: false });
|
|
229
|
+
}
|
|
230
|
+
return c.json(claudeCodeManager.getStatus());
|
|
231
|
+
});
|
|
232
|
+
app.post("/api/claude-stop", async (c) => {
|
|
233
|
+
if (!claudeCodeManager) {
|
|
234
|
+
return c.json({ error: "No Claude Code process running" }, 400);
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
await claudeCodeManager.stop();
|
|
238
|
+
claudeCodeManager = null;
|
|
239
|
+
return c.json({ success: true, message: "Claude Code stopped" });
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
return c.json({
|
|
243
|
+
error: "Failed to stop Claude Code",
|
|
244
|
+
details: error instanceof Error ? error.message : String(error)
|
|
245
|
+
}, 500);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
app.post("/api/claude-send", async (c) => {
|
|
249
|
+
if (!claudeCodeManager) {
|
|
250
|
+
return c.json({ error: "Claude Code process not running" }, 400);
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
const body = await c.req.json();
|
|
254
|
+
const { command } = body;
|
|
255
|
+
if (!command) {
|
|
256
|
+
return c.json({ error: "Command is required" }, 400);
|
|
257
|
+
}
|
|
258
|
+
// Send command to Claude Code stdin
|
|
259
|
+
const success = claudeCodeManager.sendCommand(command);
|
|
260
|
+
if (success) {
|
|
261
|
+
return c.json({ success: true, message: "Command sent to Claude Code" });
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
return c.json({ error: "Failed to send command - process may not be running" }, 500);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
return c.json({
|
|
269
|
+
error: "Failed to send command to Claude Code",
|
|
270
|
+
details: error instanceof Error ? error.message : String(error)
|
|
271
|
+
}, 500);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
// Serve static files from the module's bundled static directory
|
|
275
|
+
app.get("*", serveStatic({ root: moduleStaticRoot }));
|
|
276
|
+
// 404 Handler
|
|
277
|
+
app.notFound((c) => c.html(_jsx(NotFoundLayout, {})));
|
|
278
|
+
const { serve } = await import('@hono/node-server');
|
|
279
|
+
// Setup global graceful shutdown for all subprocess managers
|
|
280
|
+
const setupGlobalShutdown = () => {
|
|
281
|
+
const cleanup = async () => {
|
|
282
|
+
console.log('\nš Shutting down server and all subprocesses...');
|
|
283
|
+
// Stop Claude Code process if running
|
|
284
|
+
if (claudeCodeManager) {
|
|
285
|
+
try {
|
|
286
|
+
await claudeCodeManager.stop();
|
|
287
|
+
claudeCodeManager = null;
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
console.error('Error stopping Claude Code process:', error);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Stop dev server if running
|
|
294
|
+
if (devServerManager) {
|
|
295
|
+
try {
|
|
296
|
+
await devServerManager.stop();
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
console.error('Error stopping dev server:', error);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
process.exit(0);
|
|
303
|
+
};
|
|
304
|
+
// Handle Ctrl+C (SIGINT)
|
|
305
|
+
process.on('SIGINT', () => {
|
|
306
|
+
cleanup().catch(() => process.exit(1));
|
|
307
|
+
});
|
|
308
|
+
// Handle termination signal
|
|
309
|
+
process.on('SIGTERM', () => {
|
|
310
|
+
cleanup().catch(() => process.exit(1));
|
|
311
|
+
});
|
|
312
|
+
// Handle process exit (synchronous cleanup only)
|
|
313
|
+
process.on('exit', () => {
|
|
314
|
+
if (claudeCodeManager) {
|
|
315
|
+
try {
|
|
316
|
+
claudeCodeManager.stop();
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// Silently handle cleanup errors during exit
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
};
|
|
324
|
+
setupGlobalShutdown();
|
|
325
|
+
// Initialize terminal service cleanup
|
|
326
|
+
TerminalService.setupGlobalCleanup();
|
|
327
|
+
serve({
|
|
328
|
+
fetch: app.fetch,
|
|
329
|
+
port,
|
|
330
|
+
});
|
|
331
|
+
console.log(`\nš³ Treesap server running at http://localhost:${port}\n`);
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface DevServerStatus {
|
|
2
|
+
running: boolean;
|
|
3
|
+
pid?: number;
|
|
4
|
+
startTime?: Date;
|
|
5
|
+
port?: number;
|
|
6
|
+
command?: string;
|
|
7
|
+
logs: string[];
|
|
8
|
+
errors: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class DevServerManager {
|
|
11
|
+
private command;
|
|
12
|
+
private port?;
|
|
13
|
+
private childProcess;
|
|
14
|
+
private status;
|
|
15
|
+
private logBuffer;
|
|
16
|
+
private errorBuffer;
|
|
17
|
+
private maxBufferSize;
|
|
18
|
+
constructor(command: string, port?: number | undefined);
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
stop(): Promise<void>;
|
|
21
|
+
restart(): Promise<void>;
|
|
22
|
+
getStatus(): DevServerStatus;
|
|
23
|
+
getLogs(_since?: Date): string[];
|
|
24
|
+
sendCommand(command: string): boolean;
|
|
25
|
+
private addLog;
|
|
26
|
+
private addError;
|
|
27
|
+
setupGracefulShutdown(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=dev-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/services/dev-server.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAOf,OAAO,CAAC,OAAO;IAAU,OAAO,CAAC,IAAI,CAAC;IANlD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,aAAa,CAAQ;gBAET,OAAO,EAAE,MAAM,EAAU,IAAI,CAAC,EAAE,MAAM,YAAA;IAUpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+DtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,SAAS,IAAI,eAAe;IAQ5B,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE;IAKhC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAerC,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,QAAQ;IAYhB,qBAAqB,IAAI,IAAI;CA+C9B"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
export class DevServerManager {
|
|
4
|
+
command;
|
|
5
|
+
port;
|
|
6
|
+
childProcess = null;
|
|
7
|
+
status;
|
|
8
|
+
logBuffer = [];
|
|
9
|
+
errorBuffer = [];
|
|
10
|
+
maxBufferSize = 1000;
|
|
11
|
+
constructor(command, port) {
|
|
12
|
+
this.command = command;
|
|
13
|
+
this.port = port;
|
|
14
|
+
this.status = {
|
|
15
|
+
running: false,
|
|
16
|
+
command: command,
|
|
17
|
+
port: port,
|
|
18
|
+
logs: [],
|
|
19
|
+
errors: []
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async start() {
|
|
23
|
+
if (this.childProcess) {
|
|
24
|
+
console.log("Dev server is already running");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
console.log(`š Starting dev server: ${this.command}`);
|
|
29
|
+
// Split command into parts for spawn
|
|
30
|
+
const commandParts = this.command.split(' ');
|
|
31
|
+
const cmd = commandParts[0];
|
|
32
|
+
const args = commandParts.slice(1);
|
|
33
|
+
this.childProcess = spawn(cmd, args, {
|
|
34
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
35
|
+
cwd: process.cwd(),
|
|
36
|
+
shell: process.platform === 'win32'
|
|
37
|
+
});
|
|
38
|
+
this.status.running = true;
|
|
39
|
+
this.status.pid = this.childProcess.pid;
|
|
40
|
+
this.status.startTime = new Date();
|
|
41
|
+
// Handle stdout
|
|
42
|
+
if (this.childProcess.stdout) {
|
|
43
|
+
this.childProcess.stdout.on('data', (data) => {
|
|
44
|
+
const output = data.toString();
|
|
45
|
+
this.addLog(output);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Handle stderr
|
|
49
|
+
if (this.childProcess.stderr) {
|
|
50
|
+
this.childProcess.stderr.on('data', (data) => {
|
|
51
|
+
const output = data.toString();
|
|
52
|
+
this.addError(output);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Handle process exit
|
|
56
|
+
this.childProcess.on('exit', (code) => {
|
|
57
|
+
console.log(`Dev server exited with code ${code}`);
|
|
58
|
+
this.status.running = false;
|
|
59
|
+
this.status.pid = undefined;
|
|
60
|
+
this.childProcess = null;
|
|
61
|
+
});
|
|
62
|
+
this.childProcess.on('error', (error) => {
|
|
63
|
+
console.error("Dev server error:", error);
|
|
64
|
+
this.status.running = false;
|
|
65
|
+
this.status.pid = undefined;
|
|
66
|
+
this.childProcess = null;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error("Failed to start dev server:", error);
|
|
71
|
+
this.status.running = false;
|
|
72
|
+
this.addError(`Failed to start: ${error instanceof Error ? error.message : String(error)}`);
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async stop() {
|
|
77
|
+
if (!this.childProcess) {
|
|
78
|
+
console.log("Dev server is not running");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
this.childProcess.kill("SIGTERM");
|
|
83
|
+
// Wait for process to exit with timeout
|
|
84
|
+
await new Promise((resolve, reject) => {
|
|
85
|
+
const timeout = setTimeout(() => {
|
|
86
|
+
if (this.childProcess) {
|
|
87
|
+
this.childProcess.kill("SIGKILL");
|
|
88
|
+
}
|
|
89
|
+
reject(new Error("Process did not exit gracefully"));
|
|
90
|
+
}, 5000);
|
|
91
|
+
this.childProcess.on('exit', () => {
|
|
92
|
+
clearTimeout(timeout);
|
|
93
|
+
resolve();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
this.childProcess = null;
|
|
97
|
+
this.status.running = false;
|
|
98
|
+
this.status.pid = undefined;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error("Failed to stop dev server:", error);
|
|
102
|
+
this.addError(`Failed to stop: ${error instanceof Error ? error.message : String(error)}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async restart() {
|
|
106
|
+
console.log("š Restarting dev server...");
|
|
107
|
+
await this.stop();
|
|
108
|
+
// Small delay to ensure cleanup
|
|
109
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
110
|
+
await this.start();
|
|
111
|
+
}
|
|
112
|
+
getStatus() {
|
|
113
|
+
return {
|
|
114
|
+
...this.status,
|
|
115
|
+
logs: [...this.logBuffer],
|
|
116
|
+
errors: [...this.errorBuffer]
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
getLogs(_since) {
|
|
120
|
+
// For now, return all logs. In future, could filter by timestamp
|
|
121
|
+
return [...this.logBuffer];
|
|
122
|
+
}
|
|
123
|
+
sendCommand(command) {
|
|
124
|
+
if (!this.childProcess || !this.childProcess.stdin) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
this.childProcess.stdin.write(command + '\n');
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error('Failed to send command to subprocess:', error);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
addLog(message) {
|
|
137
|
+
const timestamp = new Date().toISOString();
|
|
138
|
+
const logEntry = `[${timestamp}] ${message}`;
|
|
139
|
+
this.logBuffer.push(logEntry);
|
|
140
|
+
if (this.logBuffer.length > this.maxBufferSize) {
|
|
141
|
+
this.logBuffer.shift();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
addError(message) {
|
|
145
|
+
const timestamp = new Date().toISOString();
|
|
146
|
+
const errorEntry = `[${timestamp}] ${message}`;
|
|
147
|
+
this.errorBuffer.push(errorEntry);
|
|
148
|
+
if (this.errorBuffer.length > this.maxBufferSize) {
|
|
149
|
+
this.errorBuffer.shift();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Cleanup on process exit
|
|
153
|
+
setupGracefulShutdown() {
|
|
154
|
+
const cleanup = async () => {
|
|
155
|
+
if (this.childProcess) {
|
|
156
|
+
await this.stop();
|
|
157
|
+
}
|
|
158
|
+
process.exit(0);
|
|
159
|
+
};
|
|
160
|
+
// Handle Ctrl+C (SIGINT)
|
|
161
|
+
process.on('SIGINT', () => {
|
|
162
|
+
console.log('\nš Shutting down...');
|
|
163
|
+
// Forward signal to child process if it exists
|
|
164
|
+
if (this.childProcess && this.childProcess.pid) {
|
|
165
|
+
try {
|
|
166
|
+
this.childProcess.kill('SIGINT');
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Silently handle signal forwarding errors
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
cleanup().catch(() => { });
|
|
173
|
+
});
|
|
174
|
+
// Handle termination signal
|
|
175
|
+
process.on('SIGTERM', () => {
|
|
176
|
+
console.log('\nš Terminating...');
|
|
177
|
+
// Forward signal to child process if it exists
|
|
178
|
+
if (this.childProcess && this.childProcess.pid) {
|
|
179
|
+
try {
|
|
180
|
+
this.childProcess.kill('SIGTERM');
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Silently handle signal forwarding errors
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
cleanup().catch(() => { });
|
|
187
|
+
});
|
|
188
|
+
// Handle process exit (synchronous cleanup only)
|
|
189
|
+
process.on('exit', () => {
|
|
190
|
+
if (this.childProcess) {
|
|
191
|
+
try {
|
|
192
|
+
this.childProcess.kill('SIGTERM');
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Silently handle cleanup errors during exit
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=dev-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/services/dev-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import * as pty from 'node-pty';
|
|
3
|
+
export interface TerminalSession {
|
|
4
|
+
id: string;
|
|
5
|
+
process: pty.IPty;
|
|
6
|
+
eventEmitter: EventEmitter;
|
|
7
|
+
createdAt: Date;
|
|
8
|
+
lastActivity: Date;
|
|
9
|
+
}
|
|
10
|
+
export declare class TerminalService {
|
|
11
|
+
private static sessions;
|
|
12
|
+
private static readonly SESSION_TIMEOUT;
|
|
13
|
+
static createSession(sessionId: string): TerminalSession;
|
|
14
|
+
static getSession(sessionId: string): TerminalSession | undefined;
|
|
15
|
+
static executeCommand(sessionId: string, command: string): boolean;
|
|
16
|
+
static destroySession(sessionId: string): boolean;
|
|
17
|
+
static getAllSessions(): TerminalSession[];
|
|
18
|
+
static cleanupExpiredSessions(): number;
|
|
19
|
+
private static scheduleSessionCleanup;
|
|
20
|
+
static setupGlobalCleanup(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/services/terminal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsC;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAEzD,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe;IAgDxD,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIjE,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAgBlE,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAuBjD,MAAM,CAAC,cAAc,IAAI,eAAe,EAAE;IAI1C,MAAM,CAAC,sBAAsB,IAAI,MAAM;IAgBvC,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAgBrC,MAAM,CAAC,kBAAkB,IAAI,IAAI;CAqBlC"}
|