@adhdev/daemon-standalone 0.5.7 → 0.5.16
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/index.js +82 -34
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/index-CPwQ0nLc.js +199 -0
- package/public/assets/index-Da6wVb2J.css +32 -0
- package/public/index.html +2 -2
- package/public/assets/index-DNJTxmxT.js +0 -186
- package/public/assets/index-_4zVo_k_.css +0 -32
package/dist/index.js
CHANGED
|
@@ -177,19 +177,18 @@ var StandaloneServer = class {
|
|
|
177
177
|
const ides = this.getIdes();
|
|
178
178
|
const agents = [];
|
|
179
179
|
for (const ide of ides) {
|
|
180
|
-
|
|
181
|
-
if (chat) {
|
|
180
|
+
if (ide.activeChat) {
|
|
182
181
|
agents.push({
|
|
183
|
-
ideId: ide.
|
|
184
|
-
type: ide.
|
|
185
|
-
name: ide.
|
|
186
|
-
status:
|
|
182
|
+
ideId: ide.instanceId,
|
|
183
|
+
type: ide.ideType,
|
|
184
|
+
name: ide.ideType,
|
|
185
|
+
status: ide.activeChat.status || "idle",
|
|
187
186
|
source: "native"
|
|
188
187
|
});
|
|
189
188
|
}
|
|
190
189
|
for (const stream of ide.agentStreams || []) {
|
|
191
190
|
agents.push({
|
|
192
|
-
ideId: ide.
|
|
191
|
+
ideId: ide.instanceId,
|
|
193
192
|
type: stream.agentType,
|
|
194
193
|
name: stream.agentName,
|
|
195
194
|
status: stream.status || "idle",
|
|
@@ -300,6 +299,7 @@ var StandaloneServer = class {
|
|
|
300
299
|
const machineId = os.hostname().replace(/[^a-zA-Z0-9]/g, "_");
|
|
301
300
|
const ides = this.getIdes();
|
|
302
301
|
const clis = this.getClis();
|
|
302
|
+
const acps = this.getAcps();
|
|
303
303
|
const cpus2 = os.cpus();
|
|
304
304
|
const memSnap = (0, import_daemon_core.getHostMemorySnapshot)();
|
|
305
305
|
const loadavg2 = os.loadavg();
|
|
@@ -307,17 +307,34 @@ var StandaloneServer = class {
|
|
|
307
307
|
const wsState = (0, import_daemon_core.getWorkspaceState)(cfgSnap);
|
|
308
308
|
return {
|
|
309
309
|
id: `standalone_${machineId}`,
|
|
310
|
+
instanceId: `standalone_${machineId}`,
|
|
311
|
+
version: "1.0.0",
|
|
312
|
+
// Standalone static version
|
|
313
|
+
daemonMode: false,
|
|
310
314
|
type: "standalone",
|
|
311
315
|
platform: os.platform(),
|
|
312
316
|
hostname: os.hostname(),
|
|
317
|
+
machine: {
|
|
318
|
+
hostname: os.hostname(),
|
|
319
|
+
platform: os.platform(),
|
|
320
|
+
arch: os.arch(),
|
|
321
|
+
cpus: cpus2.length,
|
|
322
|
+
totalMem: memSnap.totalMem,
|
|
323
|
+
freeMem: memSnap.freeMem,
|
|
324
|
+
availableMem: memSnap.availableMem,
|
|
325
|
+
loadavg: loadavg2,
|
|
326
|
+
uptime: os.uptime(),
|
|
327
|
+
release: os.release()
|
|
328
|
+
},
|
|
313
329
|
timestamp: Date.now(),
|
|
314
|
-
|
|
315
|
-
|
|
330
|
+
userName: cfgSnap.userName || void 0,
|
|
331
|
+
managedIdes: ides,
|
|
332
|
+
managedClis: clis,
|
|
333
|
+
managedAcps: acps,
|
|
316
334
|
workspaces: wsState.workspaces,
|
|
317
335
|
defaultWorkspaceId: wsState.defaultWorkspaceId,
|
|
318
336
|
defaultWorkspacePath: wsState.defaultWorkspacePath,
|
|
319
337
|
workspaceActivity: (0, import_daemon_core.getWorkspaceActivity)(cfgSnap, 15),
|
|
320
|
-
cdpConnected: [...this.components.cdpManagers.values()].some((m) => m.isConnected),
|
|
321
338
|
detectedIdes: this.components.detectedIdes.value.filter((i) => i.installed).map((i) => ({
|
|
322
339
|
id: i.id,
|
|
323
340
|
type: i.id,
|
|
@@ -349,16 +366,15 @@ var StandaloneServer = class {
|
|
|
349
366
|
for (const state of ideStates) {
|
|
350
367
|
const cdp = this.components.cdpManagers.get(state.type);
|
|
351
368
|
result.push({
|
|
352
|
-
|
|
369
|
+
ideType: state.type,
|
|
370
|
+
ideVersion: "",
|
|
353
371
|
instanceId: state.instanceId || state.type,
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
agents: [],
|
|
361
|
-
agentStreams: (state.extensions || []).map((ext) => ({
|
|
372
|
+
workspace: state.workspace || null,
|
|
373
|
+
terminals: 0,
|
|
374
|
+
aiAgents: [],
|
|
375
|
+
activeChat: state.activeChat,
|
|
376
|
+
chats: [],
|
|
377
|
+
agentStreams: state.extensions.map((ext) => ({
|
|
362
378
|
agentType: ext.type,
|
|
363
379
|
agentName: ext.name,
|
|
364
380
|
extensionId: ext.type,
|
|
@@ -367,10 +383,10 @@ var StandaloneServer = class {
|
|
|
367
383
|
inputContent: ext.activeChat?.inputContent || "",
|
|
368
384
|
activeModal: ext.activeChat?.activeModal || null
|
|
369
385
|
})),
|
|
370
|
-
|
|
371
|
-
activeFile: state.activeFile || null,
|
|
386
|
+
cdpConnected: cdp?.isConnected || false,
|
|
372
387
|
currentModel: state.currentModel,
|
|
373
|
-
currentPlan: state.currentPlan
|
|
388
|
+
currentPlan: state.currentPlan,
|
|
389
|
+
currentAutoApprove: state.currentAutoApprove
|
|
374
390
|
});
|
|
375
391
|
}
|
|
376
392
|
const coveredTypes = new Set(ideStates.map((s) => s.type));
|
|
@@ -379,16 +395,18 @@ var StandaloneServer = class {
|
|
|
379
395
|
const cdp = this.components.cdpManagers.get(ide.id);
|
|
380
396
|
if (!cdp?.isConnected) continue;
|
|
381
397
|
result.push({
|
|
382
|
-
|
|
398
|
+
ideType: ide.id,
|
|
399
|
+
ideVersion: "",
|
|
383
400
|
instanceId: ide.id,
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
cdpPort: cdp?.getPort?.(),
|
|
388
|
-
chatHistory: [],
|
|
401
|
+
workspace: null,
|
|
402
|
+
terminals: 0,
|
|
403
|
+
aiAgents: [],
|
|
389
404
|
activeChat: null,
|
|
390
|
-
|
|
391
|
-
agentStreams: []
|
|
405
|
+
chats: [],
|
|
406
|
+
agentStreams: [],
|
|
407
|
+
cdpConnected: true,
|
|
408
|
+
currentModel: void 0,
|
|
409
|
+
currentPlan: void 0
|
|
392
410
|
});
|
|
393
411
|
}
|
|
394
412
|
return result;
|
|
@@ -396,11 +414,41 @@ var StandaloneServer = class {
|
|
|
396
414
|
getClis() {
|
|
397
415
|
const result = [];
|
|
398
416
|
for (const [key, adapter] of this.components.cliManager.adapters.entries()) {
|
|
417
|
+
if (adapter._acpInstance) continue;
|
|
418
|
+
const state = this.components.instanceManager.getInstance(key)?.getState();
|
|
419
|
+
result.push({
|
|
420
|
+
id: key,
|
|
421
|
+
instanceId: key,
|
|
422
|
+
cliType: adapter.cliType || key,
|
|
423
|
+
cliName: adapter.cliName || key,
|
|
424
|
+
status: state?.status || "running",
|
|
425
|
+
mode: "terminal",
|
|
426
|
+
workspace: adapter.workingDir || "",
|
|
427
|
+
activeChat: state?.activeChat || null
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
return result;
|
|
431
|
+
}
|
|
432
|
+
getAcps() {
|
|
433
|
+
const result = [];
|
|
434
|
+
for (const [key, adapter] of this.components.cliManager.adapters.entries()) {
|
|
435
|
+
const acpInstance = adapter._acpInstance;
|
|
436
|
+
if (!acpInstance) continue;
|
|
437
|
+
const state = acpInstance.getState();
|
|
399
438
|
result.push({
|
|
400
|
-
id:
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
439
|
+
id: key,
|
|
440
|
+
acpType: adapter.cliType || state?.type || key,
|
|
441
|
+
acpName: state?.name || adapter.cliType || key,
|
|
442
|
+
status: state?.status || "running",
|
|
443
|
+
mode: "chat",
|
|
444
|
+
workspace: adapter.workingDir || "",
|
|
445
|
+
activeChat: state?.activeChat || null,
|
|
446
|
+
currentModel: state?.currentModel,
|
|
447
|
+
currentPlan: state?.currentPlan,
|
|
448
|
+
acpConfigOptions: state?.acpConfigOptions,
|
|
449
|
+
acpModes: state?.acpModes,
|
|
450
|
+
errorMessage: state?.errorMessage,
|
|
451
|
+
errorReason: state?.errorReason
|
|
404
452
|
});
|
|
405
453
|
}
|
|
406
454
|
return result;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * daemon-standalone — Embedded HTTP/WS server for local dashboard\n *\n * Standalone-only server:\n * 1. DaemonCore init (IDE detection, CDP connection, Provider loading)\n * 2. HTTP REST API — /api/v1/status, /api/v1/command, /api/v1/ides, /api/v1/clis, /api/v1/agents\n * 3. WebSocket — ws://localhost:3847/ws (real-time status broadcast + command execution)\n * 4. Static file serving — web-standalone build output\n *\n * Usage:\n * npx @adhdev/daemon-standalone\n * npx @adhdev/daemon-standalone --port 4000\n */\n\nimport { createServer, type IncomingMessage } from 'http';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as crypto from 'crypto';\n\nimport {\n DevServer,\n LOG,\n initDaemonComponents,\n shutdownDaemonComponents,\n loadConfig,\n getWorkspaceState,\n getHostMemorySnapshot,\n getWorkspaceActivity,\n type DaemonComponents,\n type StatusResponse,\n type AgentEntry,\n} from '@adhdev/daemon-core';\nimport type { IdeEntry, CliEntry } from '@adhdev/daemon-core';\n\n// ─── Constants ───\nconst DEFAULT_PORT = 3847;\nconst STATUS_INTERVAL = 2000;\n\n// ─── Types ───\ninterface StandaloneOptions {\n port?: number;\n host?: string;\n publicDir?: string;\n open?: boolean;\n token?: string;\n dev?: boolean;\n}\n\ninterface WsMessage {\n type: string;\n requestId?: string;\n data?: Record<string, any>;\n}\n\n\n// ─── Standalone Server ───\n\nclass StandaloneServer {\n private httpServer: ReturnType<typeof createServer> | null = null;\n private wss: WebSocketServer | null = null;\n private clients = new Set<WebSocket>();\n private authToken: string | null = null;\n private statusTimer: NodeJS.Timeout | null = null;\n private running = false;\n private components: DaemonComponents | null = null;\n private devServer: DevServer | null = null;\n\n async start(options: StandaloneOptions = {}): Promise<void> {\n const port = options.port || DEFAULT_PORT;\n const host = options.host || '127.0.0.1';\n\n // Auth token setup (opt-in only)\n this.authToken = options.token || process.env.ADHDEV_TOKEN || null;\n\n // Initialize all core components via daemon-core bootstrapper\n this.components = await initDaemonComponents({\n cliManagerDeps: {\n getServerConn: () => null,\n getP2p: () => null,\n onStatusChange: () => this.broadcastStatus(),\n removeAgentTracking: () => {},\n },\n onStatusChange: () => this.broadcastStatus(),\n onStreamsUpdated: (_ideType: string, _streams: any[]) => {\n this.broadcastStatus();\n },\n tickIntervalMs: 3000,\n cdpScanIntervalMs: 15_000,\n });\n\n // DevServer (optional)\n if (options.dev) {\n this.devServer = new DevServer({\n providerLoader: this.components.providerLoader,\n cdpManagers: this.components.cdpManagers,\n logFn: (msg: string) => console.log(msg),\n });\n await this.devServer.start();\n }\n\n // 5. HTTP Server\n this.httpServer = createServer((req, res) => {\n this.handleHttp(req, res, options.publicDir);\n });\n\n // 6. WebSocket Server (upgrade)\n this.wss = new WebSocketServer({ noServer: true });\n this.httpServer.on('upgrade', (req, socket, head) => {\n const wsUrl = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n if (wsUrl.pathname === '/ws') {\n // Token auth for WS\n if (this.authToken) {\n const urlToken = wsUrl.searchParams.get('token');\n if (urlToken !== this.authToken) {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n }\n this.wss!.handleUpgrade(req, socket, head, (ws) => {\n this.handleWsConnection(ws);\n });\n } else {\n socket.destroy();\n }\n });\n\n // 7. Status broadcast timer\n this.statusTimer = setInterval(() => {\n this.broadcastStatus();\n }, STATUS_INTERVAL);\n\n // 8. Start listening\n this.running = true;\n await new Promise<void>((resolve) => {\n this.httpServer!.listen(port, host, () => {\n resolve();\n });\n });\n\n console.log('');\n console.log('🚀 ADHDev Standalone Server');\n console.log(` http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`);\n console.log(` ws://${host === '0.0.0.0' ? 'localhost' : host}:${port}/ws`);\n if (host === '0.0.0.0') {\n const lanIps = this.getLanIPs();\n for (const ip of lanIps) {\n console.log(` http://${ip}:${port} (LAN)`);\n }\n }\n if (this.authToken) {\n console.log(` 🔑 Token: ${this.authToken}`);\n }\n console.log('');\n\n const cdpCount = [...this.components.cdpManagers.values()].filter(m => m.isConnected).length;\n console.log(` CDP: ${cdpCount > 0 ? `✅ ${cdpCount} connected` : '❌ none'}`);\n console.log(` Providers: ${this.components.providerLoader.getAll().length} loaded`);\n if (options.dev) {\n console.log(` 🛠️ DevConsole: http://127.0.0.1:19280`);\n }\n console.log('');\n console.log(' Press Ctrl+C to stop.');\n console.log('');\n\n // Open browser\n if (options.open !== false) {\n try {\n const open = (await import('open')).default;\n await open(`http://localhost:${port}`);\n } catch { /* noop */ }\n }\n\n // Signal handling\n process.on('SIGINT', () => this.stop());\n process.on('SIGTERM', () => this.stop());\n }\n\n // ─── HTTP Handler ───\n\n private handleHttp(\n req: IncomingMessage,\n res: import('http').ServerResponse,\n publicDir?: string\n ): void {\n const url = req.url || '/';\n const method = req.method || 'GET';\n\n // CORS\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n if (method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Token auth for API routes\n if (this.authToken && url.startsWith('/api/')) {\n const authHeader = req.headers['authorization'];\n const bearerToken = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null;\n const queryToken = new URL(url, `http://${req.headers.host || 'localhost'}`).searchParams.get('token');\n if (bearerToken !== this.authToken && queryToken !== this.authToken) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Unauthorized. Provide token via Authorization header or ?token= query.' }));\n return;\n }\n }\n\n // ─── API Routes (v1) ───\n const apiPath = url.startsWith('/api/v1/') ? url.slice(7) : null; // /api/v1/status → /status\n\n if (apiPath === '/status' && method === 'GET') {\n const status = this.getStatus();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(status));\n return;\n }\n\n if (apiPath === '/ides' && method === 'GET') {\n const ides = this.getIdes();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ ides }));\n return;\n }\n\n if (apiPath === '/clis' && method === 'GET') {\n const clis = this.getClis();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ clis }));\n return;\n }\n\n if (apiPath === '/agents' && method === 'GET') {\n const ides = this.getIdes();\n const agents: AgentEntry[] = [];\n for (const ide of ides) {\n // IDE native chat\n const chat = ide.activeChat as Record<string, any> | null;\n if (chat) {\n agents.push({\n ideId: ide.id,\n type: ide.type,\n name: ide.name || ide.type,\n status: chat.status || 'idle',\n source: 'native',\n });\n }\n // Extension agent streams\n for (const stream of (ide.agentStreams || [])) {\n agents.push({\n ideId: ide.id,\n type: stream.agentType,\n name: stream.agentName,\n status: stream.status || 'idle',\n source: 'extension',\n });\n }\n }\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ agents }));\n return;\n }\n\n if (apiPath === '/command' && method === 'POST') {\n let body = '';\n req.on('data', (chunk) => { body += chunk; });\n req.on('end', async () => {\n try {\n const { type, payload, target } = JSON.parse(body);\n const args = { ...payload, _targetInstance: target };\n const result = await this.executeCommand(type, args);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(result));\n } catch (e: any) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ success: false, error: e.message }));\n }\n });\n return;\n }\n\n // ─── Static Files ───\n if (publicDir) {\n const filePath = url === '/' ? '/index.html' : url;\n const fullPath = path.join(publicDir, filePath);\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n const ext = path.extname(fullPath);\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff2': 'font/woff2',\n };\n res.writeHead(200, { 'Content-Type': mimeTypes[ext] || 'application/octet-stream' });\n fs.createReadStream(fullPath).pipe(res);\n return;\n }\n // SPA fallback → index.html\n const indexPath = path.join(publicDir, 'index.html');\n if (fs.existsSync(indexPath) && !url.startsWith('/api/')) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n fs.createReadStream(indexPath).pipe(res);\n return;\n }\n }\n\n // 404\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Not found' }));\n }\n\n // ─── WebSocket Handler ───\n\n private handleWsConnection(ws: WebSocket): void {\n // Max client limit to prevent connection storms\n const MAX_WS_CLIENTS = 10;\n if (this.clients.size >= MAX_WS_CLIENTS) {\n // Close oldest connection\n const oldest = this.clients.values().next().value;\n if (oldest) {\n try { (oldest as WebSocket).close(1000, 'Too many connections'); } catch {}\n this.clients.delete(oldest);\n }\n }\n this.clients.add(ws);\n console.log(`[WS] Client connected (total: ${this.clients.size})`);\n\n // Send initial status immediately\n const status = this.getStatus();\n ws.send(JSON.stringify({ type: 'status', data: status }));\n\n ws.on('message', async (raw) => {\n try {\n const msg: WsMessage = JSON.parse(raw.toString());\n if (msg.type === 'command' && msg.data) {\n const { type, payload, target } = msg.data;\n const requestId = msg.requestId;\n const args = { ...payload, _targetInstance: target };\n const result = await this.executeCommand(type, args);\n ws.send(JSON.stringify({ type: 'command_result', requestId, data: result }));\n }\n } catch (e: any) {\n const requestId = (() => { try { return JSON.parse(raw.toString()).requestId; } catch { return undefined; } })();\n ws.send(JSON.stringify({ type: 'error', requestId, data: { message: e.message } }));\n }\n });\n\n ws.on('close', () => {\n this.clients.delete(ws);\n console.log(`[WS] Client disconnected (total: ${this.clients.size})`);\n });\n\n ws.on('error', () => {\n this.clients.delete(ws);\n });\n }\n\n // ─── Core Logic ───\n\n private getStatus(): StatusResponse {\n const machineId = os.hostname().replace(/[^a-zA-Z0-9]/g, '_');\n const ides = this.getIdes();\n const clis = this.getClis();\n const cpus = os.cpus();\n const memSnap = getHostMemorySnapshot();\n const loadavg = os.loadavg();\n const cfgSnap = loadConfig();\n const wsState = getWorkspaceState(cfgSnap);\n\n return {\n id: `standalone_${machineId}`,\n type: 'standalone',\n platform: os.platform(),\n hostname: os.hostname(),\n timestamp: Date.now(),\n ides,\n clis,\n workspaces: wsState.workspaces,\n defaultWorkspaceId: wsState.defaultWorkspaceId,\n defaultWorkspacePath: wsState.defaultWorkspacePath,\n workspaceActivity: getWorkspaceActivity(cfgSnap, 15),\n cdpConnected: [...this.components!.cdpManagers.values()].some(m => m.isConnected),\n detectedIdes: this.components!.detectedIdes.value.filter((i: any) => i.installed).map((i: any) => ({\n id: i.id, type: i.id, name: i.displayName || i.name, installed: true,\n running: this.components!.cdpManagers.has(i.id) && this.components!.cdpManagers.get(i.id)!.isConnected,\n })),\n availableProviders: this.components!.providerLoader.getAll().map((p: any) => ({\n type: p.type, icon: p.icon || '💻', displayName: p.displayName || p.type,\n category: p.category,\n })),\n system: {\n cpus: cpus.length,\n totalMem: memSnap.totalMem,\n freeMem: memSnap.freeMem,\n availableMem: memSnap.availableMem,\n loadavg,\n uptime: os.uptime(),\n arch: os.arch(),\n },\n };\n }\n\n private getIdes(): IdeEntry[] {\n const result: IdeEntry[] = [];\n \n // Collect states from ProviderInstanceManager (the proper way)\n const allStates = this.components!.instanceManager.collectAllStates();\n const ideStates = allStates.filter((s: any) => s.category === 'ide');\n \n for (const state of ideStates) {\n const cdp = this.components!.cdpManagers.get(state.type);\n result.push({\n id: `standalone:ide:${state.instanceId || state.type}`,\n instanceId: state.instanceId || state.type,\n type: state.type,\n name: state.name || state.type,\n cdpConnected: cdp?.isConnected || false,\n cdpPort: cdp?.getPort?.(),\n chatHistory: state.activeChat?.messages || [],\n activeChat: state.activeChat || null,\n agents: [],\n agentStreams: (state.extensions || []).map((ext: any) => ({\n agentType: ext.type,\n agentName: ext.name,\n extensionId: ext.type,\n status: ext.status || 'idle',\n messages: ext.activeChat?.messages || [],\n inputContent: ext.activeChat?.inputContent || '',\n activeModal: ext.activeChat?.activeModal || null,\n })),\n workspaceFolders: state.workspaceFolders || [],\n activeFile: state.activeFile || null,\n currentModel: state.currentModel,\n currentPlan: state.currentPlan,\n });\n }\n \n // Also include IDEs with CDP connected but no instance yet\n const coveredTypes = new Set(ideStates.map((s: any) => s.type));\n for (const ide of this.components!.detectedIdes.value) {\n if (!ide.installed || coveredTypes.has(ide.id)) continue;\n const cdp = this.components!.cdpManagers.get(ide.id);\n if (!cdp?.isConnected) continue; // Only show IDEs with active CDP\n result.push({\n id: `standalone:ide:${ide.id}`,\n instanceId: ide.id,\n type: ide.id,\n name: ide.displayName || ide.id,\n cdpConnected: true,\n cdpPort: cdp?.getPort?.(),\n chatHistory: [],\n activeChat: null,\n agents: [],\n agentStreams: [],\n });\n }\n return result;\n }\n\n private getClis(): CliEntry[] {\n const result: CliEntry[] = [];\n for (const [key, adapter] of this.components!.cliManager.adapters.entries()) {\n result.push({\n id: `standalone:cli:${key}`,\n cliId: key,\n type: (adapter as any).cliType || key,\n isRunning: true,\n });\n }\n return result;\n }\n\n private async executeCommand(type: string, args: any): Promise<any> {\n if (!this.components) {\n return { success: false, error: 'Components not initialized' };\n }\n const result = await this.components.router.execute(type, args, 'standalone');\n if (type.startsWith('workspace_')) this.broadcastStatus();\n return result;\n }\n\n private broadcastStatus(): void {\n if (this.clients.size === 0) return;\n const status = this.getStatus();\n const msg = JSON.stringify({ type: 'status', data: status });\n const cdpCount = [...this.components!.cdpManagers.values()].filter(m => m.isConnected).length;\n LOG.debug('Broadcast', `status → ${this.clients.size} client(s), ${(status as any).ides?.length || 0} IDE(s), ${cdpCount} CDP`);\n for (const client of this.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(msg);\n }\n }\n }\n\n // ─── Network ───\n\n private getLanIPs(): string[] {\n const interfaces = os.networkInterfaces();\n const ips: string[] = [];\n for (const iface of Object.values(interfaces)) {\n if (!iface) continue;\n for (const info of iface) {\n if (info.family === 'IPv4' && !info.internal) {\n ips.push(info.address);\n }\n }\n }\n return ips;\n }\n\n // ─── Lifecycle ───\n\n async stop(): Promise<void> {\n if (!this.running) return;\n this.running = false;\n\n console.log('\\n Shutting down...');\n\n if (this.statusTimer) {\n clearInterval(this.statusTimer);\n this.statusTimer = null;\n }\n\n // Close WS clients\n for (const ws of this.clients) {\n try { ws.close(); } catch { /* noop */ }\n }\n this.clients.clear();\n\n // Close WSS\n if (this.wss) {\n this.wss.close();\n this.wss = null;\n }\n\n // Shutdown core components\n if (this.components) {\n await shutdownDaemonComponents(this.components);\n }\n\n // HTTP server\n if (this.httpServer) {\n this.httpServer.close();\n this.httpServer = null;\n }\n\n console.log(' ✓ ADHDev Standalone stopped.\\n');\n process.exit(0);\n }\n}\n\n// ─── CLI ───\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const options: StandaloneOptions = {};\n\n // Parse simple args\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '--port' || args[i] === '-p') && args[i + 1]) {\n options.port = parseInt(args[i + 1]);\n i++;\n }\n if (args[i] === '--host' || args[i] === '-H') {\n options.host = '0.0.0.0';\n }\n if (args[i] === '--public' && args[i + 1]) {\n options.publicDir = args[i + 1];\n i++;\n }\n if (args[i] === '--no-open') {\n options.open = false;\n }\n if (args[i] === '--dev') {\n (options as any).dev = true;\n }\n if (args[i] === '--token' && args[i + 1]) {\n options.token = args[i + 1];\n i++;\n }\n }\n\n // Try to find web-standalone build\n if (!options.publicDir) {\n const candidates = [\n path.join(__dirname, '../../web-standalone/dist'),\n path.join(__dirname, '../public'),\n path.join(process.cwd(), 'public'),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, 'index.html'))) {\n options.publicDir = candidate;\n break;\n }\n }\n }\n\n const server = new StandaloneServer();\n await server.start(options);\n\n // Keep process alive\n await new Promise<void>(() => {});\n}\n\nmain().catch((e) => {\n console.error('Fatal error:', e);\n process.exit(1);\n});\n"],"mappings":"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","names":["cpus","loadavg"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * daemon-standalone — Embedded HTTP/WS server for local dashboard\n *\n * Standalone-only server:\n * 1. DaemonCore init (IDE detection, CDP connection, Provider loading)\n * 2. HTTP REST API — /api/v1/status, /api/v1/command, /api/v1/ides, /api/v1/clis, /api/v1/agents\n * 3. WebSocket — ws://localhost:3847/ws (real-time status broadcast + command execution)\n * 4. Static file serving — web-standalone build output\n *\n * Usage:\n * npx @adhdev/daemon-standalone\n * npx @adhdev/daemon-standalone --port 4000\n */\n\nimport { createServer, type IncomingMessage } from 'http';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as crypto from 'crypto';\n\nimport {\n DevServer,\n LOG,\n initDaemonComponents,\n shutdownDaemonComponents,\n loadConfig,\n getWorkspaceState,\n getHostMemorySnapshot,\n getWorkspaceActivity,\n type DaemonComponents,\n type StatusResponse,\n type AgentEntry,\n} from '@adhdev/daemon-core';\nimport type { ManagedIdeEntry, ManagedCliEntry, ManagedAcpEntry } from '@adhdev/daemon-core';\n\n// ─── Constants ───\nconst DEFAULT_PORT = 3847;\nconst STATUS_INTERVAL = 2000;\n\n// ─── Types ───\ninterface StandaloneOptions {\n port?: number;\n host?: string;\n publicDir?: string;\n open?: boolean;\n token?: string;\n dev?: boolean;\n}\n\ninterface WsMessage {\n type: string;\n requestId?: string;\n data?: Record<string, any>;\n}\n\n\n// ─── Standalone Server ───\n\nclass StandaloneServer {\n private httpServer: ReturnType<typeof createServer> | null = null;\n private wss: WebSocketServer | null = null;\n private clients = new Set<WebSocket>();\n private authToken: string | null = null;\n private statusTimer: NodeJS.Timeout | null = null;\n private running = false;\n private components: DaemonComponents | null = null;\n private devServer: DevServer | null = null;\n\n async start(options: StandaloneOptions = {}): Promise<void> {\n const port = options.port || DEFAULT_PORT;\n const host = options.host || '127.0.0.1';\n\n // Auth token setup (opt-in only)\n this.authToken = options.token || process.env.ADHDEV_TOKEN || null;\n\n // Initialize all core components via daemon-core bootstrapper\n this.components = await initDaemonComponents({\n cliManagerDeps: {\n getServerConn: () => null,\n getP2p: () => null,\n onStatusChange: () => this.broadcastStatus(),\n removeAgentTracking: () => {},\n },\n onStatusChange: () => this.broadcastStatus(),\n onStreamsUpdated: (_ideType: string, _streams: any[]) => {\n this.broadcastStatus();\n },\n tickIntervalMs: 3000,\n cdpScanIntervalMs: 15_000,\n });\n\n // DevServer (optional)\n if (options.dev) {\n this.devServer = new DevServer({\n providerLoader: this.components.providerLoader,\n cdpManagers: this.components.cdpManagers,\n logFn: (msg: string) => console.log(msg),\n });\n await this.devServer.start();\n }\n\n // 5. HTTP Server\n this.httpServer = createServer((req, res) => {\n this.handleHttp(req, res, options.publicDir);\n });\n\n // 6. WebSocket Server (upgrade)\n this.wss = new WebSocketServer({ noServer: true });\n this.httpServer.on('upgrade', (req, socket, head) => {\n const wsUrl = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n if (wsUrl.pathname === '/ws') {\n // Token auth for WS\n if (this.authToken) {\n const urlToken = wsUrl.searchParams.get('token');\n if (urlToken !== this.authToken) {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n }\n this.wss!.handleUpgrade(req, socket, head, (ws) => {\n this.handleWsConnection(ws);\n });\n } else {\n socket.destroy();\n }\n });\n\n // 7. Status broadcast timer\n this.statusTimer = setInterval(() => {\n this.broadcastStatus();\n }, STATUS_INTERVAL);\n\n // 8. Start listening\n this.running = true;\n await new Promise<void>((resolve) => {\n this.httpServer!.listen(port, host, () => {\n resolve();\n });\n });\n\n console.log('');\n console.log('🚀 ADHDev Standalone Server');\n console.log(` http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`);\n console.log(` ws://${host === '0.0.0.0' ? 'localhost' : host}:${port}/ws`);\n if (host === '0.0.0.0') {\n const lanIps = this.getLanIPs();\n for (const ip of lanIps) {\n console.log(` http://${ip}:${port} (LAN)`);\n }\n }\n if (this.authToken) {\n console.log(` 🔑 Token: ${this.authToken}`);\n }\n console.log('');\n\n const cdpCount = [...this.components.cdpManagers.values()].filter(m => m.isConnected).length;\n console.log(` CDP: ${cdpCount > 0 ? `✅ ${cdpCount} connected` : '❌ none'}`);\n console.log(` Providers: ${this.components.providerLoader.getAll().length} loaded`);\n if (options.dev) {\n console.log(` 🛠️ DevConsole: http://127.0.0.1:19280`);\n }\n console.log('');\n console.log(' Press Ctrl+C to stop.');\n console.log('');\n\n // Open browser\n if (options.open !== false) {\n try {\n const open = (await import('open')).default;\n await open(`http://localhost:${port}`);\n } catch { /* noop */ }\n }\n\n // Signal handling\n process.on('SIGINT', () => this.stop());\n process.on('SIGTERM', () => this.stop());\n }\n\n // ─── HTTP Handler ───\n\n private handleHttp(\n req: IncomingMessage,\n res: import('http').ServerResponse,\n publicDir?: string\n ): void {\n const url = req.url || '/';\n const method = req.method || 'GET';\n\n // CORS\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n if (method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Token auth for API routes\n if (this.authToken && url.startsWith('/api/')) {\n const authHeader = req.headers['authorization'];\n const bearerToken = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null;\n const queryToken = new URL(url, `http://${req.headers.host || 'localhost'}`).searchParams.get('token');\n if (bearerToken !== this.authToken && queryToken !== this.authToken) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Unauthorized. Provide token via Authorization header or ?token= query.' }));\n return;\n }\n }\n\n // ─── API Routes (v1) ───\n const apiPath = url.startsWith('/api/v1/') ? url.slice(7) : null; // /api/v1/status → /status\n\n if (apiPath === '/status' && method === 'GET') {\n const status = this.getStatus();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(status));\n return;\n }\n\n if (apiPath === '/ides' && method === 'GET') {\n const ides = this.getIdes();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ ides }));\n return;\n }\n\n if (apiPath === '/clis' && method === 'GET') {\n const clis = this.getClis();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ clis }));\n return;\n }\n\n if (apiPath === '/agents' && method === 'GET') {\n const ides = this.getIdes();\n const agents: AgentEntry[] = [];\n for (const ide of ides) {\n // IDE native chat\n if (ide.activeChat) {\n agents.push({\n ideId: ide.instanceId,\n type: ide.ideType,\n name: ide.ideType,\n status: ide.activeChat.status || 'idle',\n source: 'native',\n });\n }\n // Extension agent streams\n for (const stream of (ide.agentStreams || [])) {\n agents.push({\n ideId: ide.instanceId,\n type: stream.agentType,\n name: stream.agentName,\n status: stream.status || 'idle',\n source: 'extension',\n });\n }\n }\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ agents }));\n return;\n }\n\n if (apiPath === '/command' && method === 'POST') {\n let body = '';\n req.on('data', (chunk) => { body += chunk; });\n req.on('end', async () => {\n try {\n const { type, payload, target } = JSON.parse(body);\n const args = { ...payload, _targetInstance: target };\n const result = await this.executeCommand(type, args);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(result));\n } catch (e: any) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ success: false, error: e.message }));\n }\n });\n return;\n }\n\n // ─── Static Files ───\n if (publicDir) {\n const filePath = url === '/' ? '/index.html' : url;\n const fullPath = path.join(publicDir, filePath);\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n const ext = path.extname(fullPath);\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff2': 'font/woff2',\n };\n res.writeHead(200, { 'Content-Type': mimeTypes[ext] || 'application/octet-stream' });\n fs.createReadStream(fullPath).pipe(res);\n return;\n }\n // SPA fallback → index.html\n const indexPath = path.join(publicDir, 'index.html');\n if (fs.existsSync(indexPath) && !url.startsWith('/api/')) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n fs.createReadStream(indexPath).pipe(res);\n return;\n }\n }\n\n // 404\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Not found' }));\n }\n\n // ─── WebSocket Handler ───\n\n private handleWsConnection(ws: WebSocket): void {\n // Max client limit to prevent connection storms\n const MAX_WS_CLIENTS = 10;\n if (this.clients.size >= MAX_WS_CLIENTS) {\n // Close oldest connection\n const oldest = this.clients.values().next().value;\n if (oldest) {\n try { (oldest as WebSocket).close(1000, 'Too many connections'); } catch {}\n this.clients.delete(oldest);\n }\n }\n this.clients.add(ws);\n console.log(`[WS] Client connected (total: ${this.clients.size})`);\n\n // Send initial status immediately\n const status = this.getStatus();\n ws.send(JSON.stringify({ type: 'status', data: status }));\n\n ws.on('message', async (raw) => {\n try {\n const msg: WsMessage = JSON.parse(raw.toString());\n if (msg.type === 'command' && msg.data) {\n const { type, payload, target } = msg.data;\n const requestId = msg.requestId;\n const args = { ...payload, _targetInstance: target };\n const result = await this.executeCommand(type, args);\n ws.send(JSON.stringify({ type: 'command_result', requestId, data: result }));\n }\n } catch (e: any) {\n const requestId = (() => { try { return JSON.parse(raw.toString()).requestId; } catch { return undefined; } })();\n ws.send(JSON.stringify({ type: 'error', requestId, data: { message: e.message } }));\n }\n });\n\n ws.on('close', () => {\n this.clients.delete(ws);\n console.log(`[WS] Client disconnected (total: ${this.clients.size})`);\n });\n\n ws.on('error', () => {\n this.clients.delete(ws);\n });\n }\n\n // ─── Core Logic ───\n\n private getStatus(): StatusResponse {\n const machineId = os.hostname().replace(/[^a-zA-Z0-9]/g, '_');\n const ides = this.getIdes();\n const clis = this.getClis();\n const acps = this.getAcps();\n const cpus = os.cpus();\n const memSnap = getHostMemorySnapshot();\n const loadavg = os.loadavg();\n const cfgSnap = loadConfig();\n const wsState = getWorkspaceState(cfgSnap);\n\n return {\n id: `standalone_${machineId}`,\n instanceId: `standalone_${machineId}`,\n version: '1.0.0', // Standalone static version\n daemonMode: false,\n type: 'standalone',\n platform: os.platform(),\n hostname: os.hostname(),\n machine: {\n hostname: os.hostname(),\n platform: os.platform(),\n arch: os.arch(),\n cpus: cpus.length,\n totalMem: memSnap.totalMem,\n freeMem: memSnap.freeMem,\n availableMem: memSnap.availableMem,\n loadavg,\n uptime: os.uptime(),\n release: os.release(),\n },\n timestamp: Date.now(),\n userName: cfgSnap.userName || undefined,\n managedIdes: ides,\n managedClis: clis,\n managedAcps: acps,\n workspaces: wsState.workspaces,\n defaultWorkspaceId: wsState.defaultWorkspaceId,\n defaultWorkspacePath: wsState.defaultWorkspacePath,\n workspaceActivity: getWorkspaceActivity(cfgSnap, 15),\n detectedIdes: this.components!.detectedIdes.value.filter((i: any) => i.installed).map((i: any) => ({\n id: i.id, type: i.id, name: i.displayName || i.name, installed: true,\n running: this.components!.cdpManagers.has(i.id) && this.components!.cdpManagers.get(i.id)!.isConnected,\n })) as any,\n availableProviders: this.components!.providerLoader.getAll().map((p: any) => ({\n type: p.type, icon: p.icon || '💻', displayName: p.displayName || p.type,\n category: p.category,\n })) as any,\n system: {\n cpus: cpus.length,\n totalMem: memSnap.totalMem,\n freeMem: memSnap.freeMem,\n availableMem: memSnap.availableMem,\n loadavg,\n uptime: os.uptime(),\n arch: os.arch(),\n },\n };\n }\n\n private getIdes(): ManagedIdeEntry[] {\n const result: ManagedIdeEntry[] = [];\n \n // Collect states from ProviderInstanceManager (the proper way)\n const allStates = this.components!.instanceManager.collectAllStates();\n const ideStates = allStates.filter((s) => s.category === 'ide') as import('@adhdev/daemon-core').IdeProviderState[];\n \n for (const state of ideStates) {\n const cdp = this.components!.cdpManagers.get(state.type);\n result.push({\n ideType: state.type,\n ideVersion: '',\n instanceId: state.instanceId || state.type,\n workspace: state.workspace || null,\n terminals: 0,\n aiAgents: [],\n activeChat: state.activeChat,\n chats: [],\n agentStreams: state.extensions.map((ext) => ({\n agentType: ext.type,\n agentName: ext.name,\n extensionId: ext.type,\n status: ext.status || 'idle',\n messages: ext.activeChat?.messages || [],\n inputContent: ext.activeChat?.inputContent || '',\n activeModal: ext.activeChat?.activeModal || null,\n })),\n cdpConnected: cdp?.isConnected || false,\n currentModel: state.currentModel,\n currentPlan: state.currentPlan,\n currentAutoApprove: state.currentAutoApprove,\n });\n }\n \n // Also include IDEs with CDP connected but no instance yet\n const coveredTypes = new Set(ideStates.map((s) => s.type));\n for (const ide of this.components!.detectedIdes.value) {\n if (!ide.installed || coveredTypes.has(ide.id)) continue;\n const cdp = this.components!.cdpManagers.get(ide.id);\n if (!cdp?.isConnected) continue; // Only show IDEs with active CDP\n result.push({\n ideType: ide.id,\n ideVersion: '',\n instanceId: ide.id,\n workspace: null,\n terminals: 0,\n aiAgents: [],\n activeChat: null,\n chats: [],\n agentStreams: [],\n cdpConnected: true,\n currentModel: undefined,\n currentPlan: undefined,\n });\n }\n return result;\n }\n\n private getClis(): ManagedCliEntry[] {\n const result: ManagedCliEntry[] = [];\n for (const [key, adapter] of this.components!.cliManager.adapters.entries()) {\n // Skip ACP adapters — they go to getAcps()\n if ((adapter as any)._acpInstance) continue;\n const state = this.components!.instanceManager.getInstance(key)?.getState();\n result.push({\n id: key,\n instanceId: key,\n cliType: (adapter as any).cliType || key,\n cliName: (adapter as any).cliName || key,\n status: state?.status || 'running',\n mode: 'terminal',\n workspace: (adapter as any).workingDir || '',\n activeChat: state?.activeChat || null,\n });\n }\n return result;\n }\n\n private getAcps(): ManagedAcpEntry[] {\n const result: ManagedAcpEntry[] = [];\n for (const [key, adapter] of this.components!.cliManager.adapters.entries()) {\n const acpInstance = (adapter as any)._acpInstance;\n if (!acpInstance) continue;\n const state = acpInstance.getState();\n result.push({\n id: key,\n acpType: (adapter as any).cliType || state?.type || key,\n acpName: state?.name || (adapter as any).cliType || key,\n status: state?.status || 'running',\n mode: 'chat',\n workspace: (adapter as any).workingDir || '',\n activeChat: state?.activeChat || null,\n currentModel: state?.currentModel,\n currentPlan: state?.currentPlan,\n acpConfigOptions: state?.acpConfigOptions,\n acpModes: state?.acpModes,\n errorMessage: state?.errorMessage,\n errorReason: state?.errorReason,\n });\n }\n return result;\n }\n\n private async executeCommand(type: string, args: any): Promise<any> {\n if (!this.components) {\n return { success: false, error: 'Components not initialized' };\n }\n const result = await this.components.router.execute(type, args, 'standalone');\n if (type.startsWith('workspace_')) this.broadcastStatus();\n return result;\n }\n\n private broadcastStatus(): void {\n if (this.clients.size === 0) return;\n const status = this.getStatus();\n const msg = JSON.stringify({ type: 'status', data: status });\n const cdpCount = [...this.components!.cdpManagers.values()].filter(m => m.isConnected).length;\n LOG.debug('Broadcast', `status → ${this.clients.size} client(s), ${(status as any).ides?.length || 0} IDE(s), ${cdpCount} CDP`);\n for (const client of this.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(msg);\n }\n }\n }\n\n // ─── Network ───\n\n private getLanIPs(): string[] {\n const interfaces = os.networkInterfaces();\n const ips: string[] = [];\n for (const iface of Object.values(interfaces)) {\n if (!iface) continue;\n for (const info of iface) {\n if (info.family === 'IPv4' && !info.internal) {\n ips.push(info.address);\n }\n }\n }\n return ips;\n }\n\n // ─── Lifecycle ───\n\n async stop(): Promise<void> {\n if (!this.running) return;\n this.running = false;\n\n console.log('\\n Shutting down...');\n\n if (this.statusTimer) {\n clearInterval(this.statusTimer);\n this.statusTimer = null;\n }\n\n // Close WS clients\n for (const ws of this.clients) {\n try { ws.close(); } catch { /* noop */ }\n }\n this.clients.clear();\n\n // Close WSS\n if (this.wss) {\n this.wss.close();\n this.wss = null;\n }\n\n // Shutdown core components\n if (this.components) {\n await shutdownDaemonComponents(this.components);\n }\n\n // HTTP server\n if (this.httpServer) {\n this.httpServer.close();\n this.httpServer = null;\n }\n\n console.log(' ✓ ADHDev Standalone stopped.\\n');\n process.exit(0);\n }\n}\n\n// ─── CLI ───\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const options: StandaloneOptions = {};\n\n // Parse simple args\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '--port' || args[i] === '-p') && args[i + 1]) {\n options.port = parseInt(args[i + 1]);\n i++;\n }\n if (args[i] === '--host' || args[i] === '-H') {\n options.host = '0.0.0.0';\n }\n if (args[i] === '--public' && args[i + 1]) {\n options.publicDir = args[i + 1];\n i++;\n }\n if (args[i] === '--no-open') {\n options.open = false;\n }\n if (args[i] === '--dev') {\n (options as any).dev = true;\n }\n if (args[i] === '--token' && args[i + 1]) {\n options.token = args[i + 1];\n i++;\n }\n }\n\n // Try to find web-standalone build\n if (!options.publicDir) {\n const candidates = [\n path.join(__dirname, '../../web-standalone/dist'),\n path.join(__dirname, '../public'),\n path.join(process.cwd(), 'public'),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, 'index.html'))) {\n options.publicDir = candidate;\n break;\n }\n }\n }\n\n const server = new StandaloneServer();\n await server.start(options);\n\n // Keep process alive\n await new Promise<void>(() => {});\n}\n\nmain().catch((e) => {\n console.error('Fatal error:', e);\n process.exit(1);\n});\n"],"mappings":"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","names":["cpus","loadavg"]}
|