@adhdev/daemon-standalone 0.4.1 → 0.5.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/index.js CHANGED
@@ -39,78 +39,35 @@ var StandaloneServer = class {
39
39
  authToken = null;
40
40
  statusTimer = null;
41
41
  running = false;
42
- // daemon-core components
43
- providerLoader;
44
- instanceManager;
45
- cliManager;
46
- commandHandler = null;
47
- agentStreamManager = null;
48
- statusReporter = null;
49
- cdpManagers = /* @__PURE__ */ new Map();
50
- instanceIdMap = /* @__PURE__ */ new Map();
51
- detectedIdes = [];
42
+ components = null;
52
43
  devServer = null;
53
- constructor() {
54
- this.providerLoader = new import_daemon_core.ProviderLoader();
55
- this.providerLoader.loadAll();
56
- this.providerLoader.registerToDetector();
57
- this.instanceManager = new import_daemon_core.ProviderInstanceManager();
58
- this.cliManager = new import_daemon_core.DaemonCliManager({
59
- getServerConn: () => null,
60
- getP2p: () => null,
61
- onStatusChange: () => this.broadcastStatus(),
62
- removeAgentTracking: () => {
63
- },
64
- getInstanceManager: () => this.instanceManager
65
- }, this.providerLoader);
66
- }
67
44
  async start(options = {}) {
68
45
  const port = options.port || DEFAULT_PORT;
69
46
  const host = options.host || "127.0.0.1";
70
47
  this.authToken = options.token || process.env.ADHDEV_TOKEN || null;
71
- (0, import_daemon_core.installGlobalInterceptor)();
72
- console.log("\u{1F50D} Detecting IDEs...");
73
- this.detectedIdes = await (0, import_daemon_core.detectIDEs)();
74
- const installed = this.detectedIdes.filter((i) => i.installed);
75
- console.log(` Found ${installed.length} IDE(s): ${installed.map((i) => i.id).join(", ") || "none"}`);
76
- await this.initCdp();
48
+ this.components = await (0, import_daemon_core.initDaemonComponents)({
49
+ cliManagerDeps: {
50
+ getServerConn: () => null,
51
+ getP2p: () => null,
52
+ onStatusChange: () => this.broadcastStatus(),
53
+ removeAgentTracking: () => {
54
+ }
55
+ },
56
+ onStatusChange: () => this.broadcastStatus(),
57
+ onStreamsUpdated: (_ideType, _streams) => {
58
+ this.broadcastStatus();
59
+ },
60
+ tickIntervalMs: 3e3,
61
+ cdpScanIntervalMs: 15e3
62
+ });
77
63
  if (options.dev) {
78
64
  this.devServer = new import_daemon_core.DevServer({
79
- providerLoader: this.providerLoader,
80
- cdpManagers: this.cdpManagers,
65
+ providerLoader: this.components.providerLoader,
66
+ cdpManagers: this.components.cdpManagers,
81
67
  logFn: (msg) => console.log(msg)
82
68
  });
83
69
  await this.devServer.start();
84
70
  }
85
- for (const ide of this.detectedIdes) {
86
- if (!ide.installed) continue;
87
- const cdp = this.cdpManagers.get(ide.id);
88
- if (!cdp) continue;
89
- const provider = this.providerLoader.resolve(ide.id);
90
- if (!provider) continue;
91
- const instance = new import_daemon_core.IdeProviderInstance(provider, ide.id);
92
- const context = {
93
- cdp: cdp || void 0,
94
- serverConn: void 0,
95
- settings: {}
96
- };
97
- await this.instanceManager.addInstance(ide.id, instance, context);
98
- this.instanceIdMap.set(instance.getInstanceId(), ide.id);
99
- }
100
- this.instanceManager.startTicking(3e3);
101
- this.commandHandler = new import_daemon_core.DaemonCommandHandler({
102
- cdpManagers: this.cdpManagers,
103
- ideType: "unknown",
104
- adapters: this.cliManager.adapters,
105
- providerLoader: this.providerLoader,
106
- instanceManager: this.instanceManager,
107
- instanceIdMap: this.instanceIdMap
108
- });
109
- this.agentStreamManager = new import_daemon_core.DaemonAgentStreamManager(
110
- console.log,
111
- this.providerLoader
112
- );
113
- this.commandHandler.setAgentStreamManager(this.agentStreamManager);
114
71
  this.httpServer = (0, import_http.createServer)((req, res) => {
115
72
  this.handleHttp(req, res, options.publicDir);
116
73
  });
@@ -156,9 +113,9 @@ var StandaloneServer = class {
156
113
  console.log(` \u{1F511} Token: ${this.authToken}`);
157
114
  }
158
115
  console.log("");
159
- const cdpCount = [...this.cdpManagers.values()].filter((m) => m.isConnected).length;
116
+ const cdpCount = [...this.components.cdpManagers.values()].filter((m) => m.isConnected).length;
160
117
  console.log(` CDP: ${cdpCount > 0 ? `\u2705 ${cdpCount} connected` : "\u274C none"}`);
161
- console.log(` Providers: ${this.providerLoader.getAll().length} loaded`);
118
+ console.log(` Providers: ${this.components.providerLoader.getAll().length} loaded`);
162
119
  if (options.dev) {
163
120
  console.log(` \u{1F6E0}\uFE0F DevConsole: http://127.0.0.1:19280`);
164
121
  }
@@ -355,15 +312,15 @@ var StandaloneServer = class {
355
312
  timestamp: Date.now(),
356
313
  ides,
357
314
  clis,
358
- cdpConnected: [...this.cdpManagers.values()].some((m) => m.isConnected),
359
- detectedIdes: this.detectedIdes.filter((i) => i.installed).map((i) => ({
315
+ cdpConnected: [...this.components.cdpManagers.values()].some((m) => m.isConnected),
316
+ detectedIdes: this.components.detectedIdes.value.filter((i) => i.installed).map((i) => ({
360
317
  id: i.id,
361
318
  type: i.id,
362
319
  name: i.displayName || i.name,
363
320
  installed: true,
364
- running: this.cdpManagers.has(i.id) && this.cdpManagers.get(i.id).isConnected
321
+ running: this.components.cdpManagers.has(i.id) && this.components.cdpManagers.get(i.id).isConnected
365
322
  })),
366
- availableProviders: this.providerLoader.getAll().map((p) => ({
323
+ availableProviders: this.components.providerLoader.getAll().map((p) => ({
367
324
  type: p.type,
368
325
  icon: p.icon || "\u{1F4BB}",
369
326
  displayName: p.displayName || p.type,
@@ -381,10 +338,10 @@ var StandaloneServer = class {
381
338
  }
382
339
  getIdes() {
383
340
  const result = [];
384
- const allStates = this.instanceManager.collectAllStates();
341
+ const allStates = this.components.instanceManager.collectAllStates();
385
342
  const ideStates = allStates.filter((s) => s.category === "ide");
386
343
  for (const state of ideStates) {
387
- const cdp = this.cdpManagers.get(state.type);
344
+ const cdp = this.components.cdpManagers.get(state.type);
388
345
  result.push({
389
346
  id: `standalone:ide:${state.instanceId || state.type}`,
390
347
  instanceId: state.instanceId || state.type,
@@ -411,9 +368,9 @@ var StandaloneServer = class {
411
368
  });
412
369
  }
413
370
  const coveredTypes = new Set(ideStates.map((s) => s.type));
414
- for (const ide of this.detectedIdes) {
371
+ for (const ide of this.components.detectedIdes.value) {
415
372
  if (!ide.installed || coveredTypes.has(ide.id)) continue;
416
- const cdp = this.cdpManagers.get(ide.id);
373
+ const cdp = this.components.cdpManagers.get(ide.id);
417
374
  if (!cdp?.isConnected) continue;
418
375
  result.push({
419
376
  id: `standalone:ide:${ide.id}`,
@@ -432,7 +389,7 @@ var StandaloneServer = class {
432
389
  }
433
390
  getClis() {
434
391
  const result = [];
435
- for (const [key, adapter] of this.cliManager.adapters.entries()) {
392
+ for (const [key, adapter] of this.components.cliManager.adapters.entries()) {
436
393
  result.push({
437
394
  id: `standalone:cli:${key}`,
438
395
  cliId: key,
@@ -443,54 +400,16 @@ var StandaloneServer = class {
443
400
  return result;
444
401
  }
445
402
  async executeCommand(type, args) {
446
- if (!this.commandHandler) {
447
- return { success: false, error: "Command handler not initialized" };
448
- }
449
- switch (type) {
450
- case "launch_ide": {
451
- const result2 = await (0, import_daemon_core.launchWithCdp)(args);
452
- if (result2.success && result2.port && result2.ideId && !this.cdpManagers.has(result2.ideId)) {
453
- const manager = new import_daemon_core.DaemonCdpManager(result2.port, (msg) => {
454
- console.log(`[CDP:${result2.ideId}] ${msg}`);
455
- });
456
- const connected = await manager.connect();
457
- if (connected) {
458
- this.cdpManagers.set(result2.ideId, manager);
459
- console.log(`[CDP] Connected: ${result2.ideId} (port ${result2.port})`);
460
- }
461
- }
462
- return { success: result2.success, ...result2 };
463
- }
464
- case "detect_ides": {
465
- this.detectedIdes = await (0, import_daemon_core.detectIDEs)();
466
- return { success: true, ides: this.detectedIdes };
467
- }
468
- case "launch_cli":
469
- case "stop_cli":
470
- case "restart_session":
471
- case "agent_command": {
472
- return this.cliManager.handleCliCommand(type, args);
473
- }
474
- case "get_logs": {
475
- const count = args?.count || 100;
476
- const minLevel = args?.minLevel || "info";
477
- const sinceTs = args?.since || 0;
478
- let logs = (0, import_daemon_core.getRecentLogs)(count, minLevel);
479
- if (sinceTs > 0) {
480
- logs = logs.filter((l) => l.ts > sinceTs);
481
- }
482
- return { success: true, logs };
483
- }
403
+ if (!this.components) {
404
+ return { success: false, error: "Components not initialized" };
484
405
  }
485
- const result = await this.commandHandler.handle(type, args);
486
- (0, import_daemon_core.logCommand)({ ts: (/* @__PURE__ */ new Date()).toISOString(), cmd: type, source: "standalone", args, success: result.success, durationMs: 0 });
487
- return result;
406
+ return this.components.router.execute(type, args, "standalone");
488
407
  }
489
408
  broadcastStatus() {
490
409
  if (this.clients.size === 0) return;
491
410
  const status = this.getStatus();
492
411
  const msg = JSON.stringify({ type: "status", data: status });
493
- const cdpCount = [...this.cdpManagers.values()].filter((m) => m.isConnected).length;
412
+ const cdpCount = [...this.components.cdpManagers.values()].filter((m) => m.isConnected).length;
494
413
  import_daemon_core.LOG.debug("Broadcast", `status \u2192 ${this.clients.size} client(s), ${status.ides?.length || 0} IDE(s), ${cdpCount} CDP`);
495
414
  for (const client of this.clients) {
496
415
  if (client.readyState === import_ws.WebSocket.OPEN) {
@@ -498,90 +417,6 @@ var StandaloneServer = class {
498
417
  }
499
418
  }
500
419
  }
501
- // ─── CDP Init ───
502
- async initCdp() {
503
- const cdpPortMap = this.providerLoader.getCdpPortMap?.() || {};
504
- for (const ide of this.detectedIdes) {
505
- if (!ide.installed) continue;
506
- const candidates = [];
507
- if (ide.cdpPort) {
508
- candidates.push(ide.cdpPort);
509
- }
510
- const providerPorts = cdpPortMap[ide.id];
511
- if (providerPorts) {
512
- for (let p = providerPorts[0]; p <= providerPorts[1]; p++) {
513
- if (!candidates.includes(p)) candidates.push(p);
514
- }
515
- }
516
- if (candidates.length === 0) continue;
517
- for (const port of candidates) {
518
- try {
519
- const probe = await fetch(`http://localhost:${port}/json/version`, {
520
- signal: AbortSignal.timeout(1e3)
521
- }).then((r) => r.json()).catch(() => null);
522
- if (!probe) continue;
523
- const manager = new import_daemon_core.DaemonCdpManager(port, (msg) => {
524
- console.log(`[CDP:${ide.id}] ${msg}`);
525
- });
526
- const connected = await manager.connect();
527
- if (connected) {
528
- const enabledExtProviders = this.providerLoader.getEnabledExtensionProviders(ide.id).map((p) => ({
529
- agentType: p.type,
530
- extensionId: p.extensionId || "",
531
- extensionIdPattern: p.extensionIdPattern
532
- }));
533
- manager.setExtensionProviders(enabledExtProviders);
534
- this.cdpManagers.set(ide.id, manager);
535
- console.log(` \u2705 CDP connected: ${ide.id} (port ${port})`);
536
- break;
537
- }
538
- } catch {
539
- }
540
- }
541
- }
542
- setInterval(async () => {
543
- const portMap = this.providerLoader.getCdpPortMap?.() || {};
544
- for (const [ide, ports] of Object.entries(portMap)) {
545
- const alreadyConnected = [...this.cdpManagers.entries()].some(
546
- ([key, m]) => m.isConnected && (key === ide || key.startsWith(ide + "_"))
547
- );
548
- if (alreadyConnected) continue;
549
- const primaryPort = ports[0];
550
- try {
551
- const probe = await fetch(`http://localhost:${primaryPort}/json/version`, {
552
- signal: AbortSignal.timeout(1e3)
553
- }).then((r) => r.json()).catch(() => null);
554
- if (!probe) continue;
555
- const manager = new import_daemon_core.DaemonCdpManager(primaryPort, (msg) => {
556
- console.log(`[CDP:${ide}] ${msg}`);
557
- });
558
- const connected = await manager.connect();
559
- if (connected) {
560
- const enabledExtProviders = this.providerLoader.getEnabledExtensionProviders(ide).map((p) => ({
561
- agentType: p.type,
562
- extensionId: p.extensionId || "",
563
- extensionIdPattern: p.extensionIdPattern
564
- }));
565
- manager.setExtensionProviders(enabledExtProviders);
566
- this.cdpManagers.set(ide, manager);
567
- console.log(`[CDP-Scan] \u2705 Auto-connected: ${ide} (port ${primaryPort})`);
568
- const provider = this.providerLoader.resolve(ide);
569
- if (provider) {
570
- const instance = new import_daemon_core.IdeProviderInstance(provider, ide);
571
- await this.instanceManager.addInstance(ide, instance, {
572
- cdp: manager,
573
- serverConn: void 0,
574
- settings: {}
575
- });
576
- this.instanceIdMap.set(instance.getInstanceId(), ide);
577
- }
578
- this.broadcastStatus();
579
- }
580
- } catch {
581
- }
582
- }
583
- }, 15e3);
584
- }
585
420
  // ─── Network ───
586
421
  getLanIPs() {
587
422
  const interfaces = os.networkInterfaces();
@@ -616,16 +451,8 @@ var StandaloneServer = class {
616
451
  this.wss.close();
617
452
  this.wss = null;
618
453
  }
619
- for (const m of this.cdpManagers.values()) {
620
- try {
621
- m.disconnect();
622
- } catch {
623
- }
624
- }
625
- this.cdpManagers.clear();
626
- try {
627
- await this.cliManager.shutdownAll();
628
- } catch {
454
+ if (this.components) {
455
+ await (0, import_daemon_core.shutdownDaemonComponents)(this.components);
629
456
  }
630
457
  if (this.httpServer) {
631
458
  this.httpServer.close();
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 loadConfig,\n detectIDEs,\n DaemonCdpManager,\n DaemonCommandHandler,\n DaemonAgentStreamManager,\n DaemonStatusReporter,\n DaemonCliManager,\n ProviderLoader,\n ProviderInstanceManager,\n IdeProviderInstance,\n DevServer,\n DEFAULT_DAEMON_PORT,\n LOG,\n logCommand,\n getRecentLogs,\n installGlobalInterceptor,\n launchWithCdp,\n type DaemonStatus,\n type CommandResult,\n type StatusResponse,\n type AgentEntry,\n type AgentStreamEntry,\n} from '@adhdev/daemon-core';\nimport type { IdeEntry, CliEntry, SystemInfo, DetectedIde, ProviderInfo } 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\n // daemon-core components\n private providerLoader: ProviderLoader;\n private instanceManager: ProviderInstanceManager;\n private cliManager!: DaemonCliManager;\n private commandHandler: DaemonCommandHandler | null = null;\n private agentStreamManager: DaemonAgentStreamManager | null = null;\n private statusReporter: DaemonStatusReporter | null = null;\n private cdpManagers = new Map<string, DaemonCdpManager>();\n private instanceIdMap = new Map<string, string>();\n private detectedIdes: any[] = [];\n private devServer: DevServer | null = null;\n\n constructor() {\n this.providerLoader = new ProviderLoader();\n this.providerLoader.loadAll();\n this.providerLoader.registerToDetector();\n this.instanceManager = new ProviderInstanceManager();\n this.cliManager = new DaemonCliManager({\n getServerConn: () => null,\n getP2p: () => null,\n onStatusChange: () => this.broadcastStatus(),\n removeAgentTracking: () => {},\n getInstanceManager: () => this.instanceManager,\n }, this.providerLoader);\n }\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 // 0. Install global log interceptor (console.log → ring buffer)\n installGlobalInterceptor();\n\n // 1. Detect IDEs\n console.log('🔍 Detecting IDEs...');\n this.detectedIdes = await detectIDEs();\n const installed = this.detectedIdes.filter((i: any) => i.installed);\n console.log(` Found ${installed.length} IDE(s): ${installed.map((i: any) => i.id).join(', ') || 'none'}`);\n\n // 2. CDP connections\n await this.initCdp();\n\n // 2.1. Start DevServer if --dev flag\n if (options.dev) {\n this.devServer = new DevServer({\n providerLoader: this.providerLoader,\n cdpManagers: this.cdpManagers,\n logFn: (msg) => console.log(msg),\n });\n await this.devServer.start();\n }\n\n // 2.5. Register provider instances for IDEs with CDP connected (only active ones)\n for (const ide of this.detectedIdes) {\n if (!ide.installed) continue;\n const cdp = this.cdpManagers.get(ide.id);\n if (!cdp) continue; // Only register IDEs with active CDP connection\n const provider = this.providerLoader.resolve(ide.id);\n if (!provider) continue;\n const instance = new IdeProviderInstance(provider, ide.id);\n const context = {\n cdp: cdp || undefined,\n serverConn: undefined,\n settings: {},\n };\n await this.instanceManager.addInstance(ide.id, instance, context as any);\n this.instanceIdMap.set(instance.getInstanceId(), ide.id);\n }\n // Start ticking (periodic CDP chat polling)\n this.instanceManager.startTicking(3000);\n\n // 3. Command handler\n this.commandHandler = new DaemonCommandHandler({\n cdpManagers: this.cdpManagers,\n ideType: 'unknown',\n adapters: this.cliManager.adapters,\n providerLoader: this.providerLoader,\n instanceManager: this.instanceManager,\n instanceIdMap: this.instanceIdMap,\n });\n\n // 4. Agent stream manager\n this.agentStreamManager = new DaemonAgentStreamManager(\n console.log,\n this.providerLoader,\n );\n this.commandHandler.setAgentStreamManager(this.agentStreamManager);\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.cdpManagers.values()].filter(m => m.isConnected).length;\n console.log(` CDP: ${cdpCount > 0 ? `✅ ${cdpCount} connected` : '❌ none'}`);\n console.log(` Providers: ${this.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 totalMem = os.totalmem();\n const freeMem = os.freemem();\n const loadavg = os.loadavg();\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 cdpConnected: [...this.cdpManagers.values()].some(m => m.isConnected),\n detectedIdes: this.detectedIdes.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.cdpManagers.has(i.id) && this.cdpManagers.get(i.id)!.isConnected,\n })),\n availableProviders: this.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,\n freeMem,\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.instanceManager.collectAllStates();\n const ideStates = allStates.filter((s: any) => s.category === 'ide');\n \n for (const state of ideStates) {\n const cdp = this.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.detectedIdes) {\n if (!ide.installed || coveredTypes.has(ide.id)) continue;\n const cdp = this.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.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.commandHandler) {\n return { success: false, error: 'Command handler not initialized' };\n }\n\n // Daemon-level commands\n switch (type) {\n case 'launch_ide': {\n const result = await launchWithCdp(args);\n if (result.success && result.port && result.ideId && !this.cdpManagers.has(result.ideId)) {\n const manager = new DaemonCdpManager(result.port, (msg: string) => {\n console.log(`[CDP:${result.ideId}] ${msg}`);\n });\n const connected = await manager.connect();\n if (connected) {\n this.cdpManagers.set(result.ideId, manager);\n console.log(`[CDP] Connected: ${result.ideId} (port ${result.port})`);\n }\n }\n return { success: result.success, ...result as any };\n }\n case 'detect_ides': {\n this.detectedIdes = await detectIDEs();\n return { success: true, ides: this.detectedIdes };\n }\n case 'launch_cli':\n case 'stop_cli':\n case 'restart_session':\n case 'agent_command': {\n return this.cliManager.handleCliCommand(type, args);\n }\n case 'get_logs': {\n const count = args?.count || 100;\n const minLevel = args?.minLevel || 'info';\n const sinceTs = args?.since || 0;\n let logs = getRecentLogs(count, minLevel);\n if (sinceTs > 0) {\n logs = logs.filter((l: any) => l.ts > sinceTs);\n }\n return { success: true, logs };\n }\n }\n\n // Command handler\n const result = await this.commandHandler.handle(type, args);\n logCommand({ ts: new Date().toISOString(), cmd: type, source: 'standalone', args, success: result.success, durationMs: 0 });\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.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 // ─── CDP Init ───\n\n private async initCdp(): Promise<void> {\n // Get CDP port ranges from provider configs\n const cdpPortMap = this.providerLoader.getCdpPortMap?.() || {};\n\n for (const ide of this.detectedIdes) {\n if (!ide.installed) continue;\n\n // Determine candidate ports: explicit cdpPort, or provider's cdpPorts range\n const candidates: number[] = [];\n if (ide.cdpPort) {\n candidates.push(ide.cdpPort);\n }\n const providerPorts = cdpPortMap[ide.id];\n if (providerPorts) {\n for (let p = providerPorts[0]; p <= providerPorts[1]; p++) {\n if (!candidates.includes(p)) candidates.push(p);\n }\n }\n if (candidates.length === 0) continue;\n\n for (const port of candidates) {\n try {\n // Quick probe: check if CDP is actually listening\n const probe = await fetch(`http://localhost:${port}/json/version`, {\n signal: AbortSignal.timeout(1000),\n }).then(r => r.json()).catch(() => null);\n if (!probe) continue;\n\n const manager = new DaemonCdpManager(port, (msg: string) => {\n console.log(`[CDP:${ide.id}] ${msg}`);\n });\n const connected = await manager.connect();\n if (connected) {\n const enabledExtProviders = this.providerLoader.getEnabledExtensionProviders(ide.id)\n .map((p: any) => ({\n agentType: p.type,\n extensionId: p.extensionId || '',\n extensionIdPattern: p.extensionIdPattern!,\n }));\n manager.setExtensionProviders(enabledExtProviders);\n this.cdpManagers.set(ide.id, manager);\n console.log(` ✅ CDP connected: ${ide.id} (port ${port})`);\n break; // Found a working port, stop probing\n }\n } catch {\n // Skip failed CDP connections\n }\n }\n }\n\n // Periodic CDP port scan — auto-detect newly launched IDEs\n setInterval(async () => {\n const portMap = this.providerLoader.getCdpPortMap?.() || {};\n for (const [ide, ports] of Object.entries(portMap)) {\n // Skip if manager already connected for this IDE\n const alreadyConnected = [...this.cdpManagers.entries()].some(([key, m]) =>\n m.isConnected && (key === ide || key.startsWith(ide + '_'))\n );\n if (alreadyConnected) continue;\n\n const primaryPort = ports[0];\n try {\n const probe = await fetch(`http://localhost:${primaryPort}/json/version`, {\n signal: AbortSignal.timeout(1000),\n }).then(r => r.json()).catch(() => null);\n if (!probe) continue;\n\n const manager = new DaemonCdpManager(primaryPort, (msg: string) => {\n console.log(`[CDP:${ide}] ${msg}`);\n });\n const connected = await manager.connect();\n if (connected) {\n const enabledExtProviders = this.providerLoader.getEnabledExtensionProviders(ide)\n .map((p: any) => ({\n agentType: p.type,\n extensionId: p.extensionId || '',\n extensionIdPattern: p.extensionIdPattern!,\n }));\n manager.setExtensionProviders(enabledExtProviders);\n this.cdpManagers.set(ide, manager);\n console.log(`[CDP-Scan] ✅ Auto-connected: ${ide} (port ${primaryPort})`);\n\n // Register provider instance\n const provider = this.providerLoader.resolve(ide);\n if (provider) {\n const instance = new IdeProviderInstance(provider, ide);\n await this.instanceManager.addInstance(ide, instance, {\n cdp: manager,\n serverConn: undefined,\n settings: {},\n } as any);\n this.instanceIdMap.set(instance.getInstanceId(), ide);\n }\n\n // Update DevServer cdpManagers reference\n this.broadcastStatus();\n }\n } catch {\n // Skip\n }\n }\n }, 15_000);\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 // CDP cleanup\n for (const m of this.cdpManagers.values()) {\n try { m.disconnect(); } catch { /* noop */ }\n }\n this.cdpManagers.clear();\n\n // CLI cleanup\n try { await this.cliManager.shutdownAll(); } catch { /* noop */ }\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","result"]}
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 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 totalMem = os.totalmem();\n const freeMem = os.freemem();\n const loadavg = os.loadavg();\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 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,\n freeMem,\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 return this.components.router.execute(type, args, 'standalone');\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhdev/daemon-standalone",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "ADHDev standalone daemon — embedded HTTP/WS server for local dashboard",
5
5
  "main": "dist/index.js",
6
6
  "bin": {