@adhdev/daemon-standalone 0.4.0 → 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,80 +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
- builtinDir: path.join(__dirname, "..", "..", "daemon-cloud", "providers", "_builtin")
56
- });
57
- this.providerLoader.loadAll();
58
- this.providerLoader.registerToDetector();
59
- this.instanceManager = new import_daemon_core.ProviderInstanceManager();
60
- this.cliManager = new import_daemon_core.DaemonCliManager({
61
- getServerConn: () => null,
62
- getP2p: () => null,
63
- onStatusChange: () => this.broadcastStatus(),
64
- removeAgentTracking: () => {
65
- },
66
- getInstanceManager: () => this.instanceManager
67
- }, this.providerLoader);
68
- }
69
44
  async start(options = {}) {
70
45
  const port = options.port || DEFAULT_PORT;
71
46
  const host = options.host || "127.0.0.1";
72
47
  this.authToken = options.token || process.env.ADHDEV_TOKEN || null;
73
- (0, import_daemon_core.installGlobalInterceptor)();
74
- console.log("\u{1F50D} Detecting IDEs...");
75
- this.detectedIdes = await (0, import_daemon_core.detectIDEs)();
76
- const installed = this.detectedIdes.filter((i) => i.installed);
77
- console.log(` Found ${installed.length} IDE(s): ${installed.map((i) => i.id).join(", ") || "none"}`);
78
- 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
+ });
79
63
  if (options.dev) {
80
64
  this.devServer = new import_daemon_core.DevServer({
81
- providerLoader: this.providerLoader,
82
- cdpManagers: this.cdpManagers,
65
+ providerLoader: this.components.providerLoader,
66
+ cdpManagers: this.components.cdpManagers,
83
67
  logFn: (msg) => console.log(msg)
84
68
  });
85
69
  await this.devServer.start();
86
70
  }
87
- for (const ide of this.detectedIdes) {
88
- if (!ide.installed) continue;
89
- const cdp = this.cdpManagers.get(ide.id);
90
- if (!cdp) continue;
91
- const provider = this.providerLoader.resolve(ide.id);
92
- if (!provider) continue;
93
- const instance = new import_daemon_core.IdeProviderInstance(provider, ide.id);
94
- const context = {
95
- cdp: cdp || void 0,
96
- serverConn: void 0,
97
- settings: {}
98
- };
99
- await this.instanceManager.addInstance(ide.id, instance, context);
100
- this.instanceIdMap.set(instance.getInstanceId(), ide.id);
101
- }
102
- this.instanceManager.startTicking(3e3);
103
- this.commandHandler = new import_daemon_core.DaemonCommandHandler({
104
- cdpManagers: this.cdpManagers,
105
- ideType: "unknown",
106
- adapters: this.cliManager.adapters,
107
- providerLoader: this.providerLoader,
108
- instanceManager: this.instanceManager,
109
- instanceIdMap: this.instanceIdMap
110
- });
111
- this.agentStreamManager = new import_daemon_core.DaemonAgentStreamManager(
112
- console.log,
113
- this.providerLoader
114
- );
115
- this.commandHandler.setAgentStreamManager(this.agentStreamManager);
116
71
  this.httpServer = (0, import_http.createServer)((req, res) => {
117
72
  this.handleHttp(req, res, options.publicDir);
118
73
  });
@@ -158,9 +113,9 @@ var StandaloneServer = class {
158
113
  console.log(` \u{1F511} Token: ${this.authToken}`);
159
114
  }
160
115
  console.log("");
161
- const cdpCount = [...this.cdpManagers.values()].filter((m) => m.isConnected).length;
116
+ const cdpCount = [...this.components.cdpManagers.values()].filter((m) => m.isConnected).length;
162
117
  console.log(` CDP: ${cdpCount > 0 ? `\u2705 ${cdpCount} connected` : "\u274C none"}`);
163
- console.log(` Providers: ${this.providerLoader.getAll().length} loaded`);
118
+ console.log(` Providers: ${this.components.providerLoader.getAll().length} loaded`);
164
119
  if (options.dev) {
165
120
  console.log(` \u{1F6E0}\uFE0F DevConsole: http://127.0.0.1:19280`);
166
121
  }
@@ -357,15 +312,15 @@ var StandaloneServer = class {
357
312
  timestamp: Date.now(),
358
313
  ides,
359
314
  clis,
360
- cdpConnected: [...this.cdpManagers.values()].some((m) => m.isConnected),
361
- 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) => ({
362
317
  id: i.id,
363
318
  type: i.id,
364
319
  name: i.displayName || i.name,
365
320
  installed: true,
366
- 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
367
322
  })),
368
- availableProviders: this.providerLoader.getAll().map((p) => ({
323
+ availableProviders: this.components.providerLoader.getAll().map((p) => ({
369
324
  type: p.type,
370
325
  icon: p.icon || "\u{1F4BB}",
371
326
  displayName: p.displayName || p.type,
@@ -383,10 +338,10 @@ var StandaloneServer = class {
383
338
  }
384
339
  getIdes() {
385
340
  const result = [];
386
- const allStates = this.instanceManager.collectAllStates();
341
+ const allStates = this.components.instanceManager.collectAllStates();
387
342
  const ideStates = allStates.filter((s) => s.category === "ide");
388
343
  for (const state of ideStates) {
389
- const cdp = this.cdpManagers.get(state.type);
344
+ const cdp = this.components.cdpManagers.get(state.type);
390
345
  result.push({
391
346
  id: `standalone:ide:${state.instanceId || state.type}`,
392
347
  instanceId: state.instanceId || state.type,
@@ -413,9 +368,9 @@ var StandaloneServer = class {
413
368
  });
414
369
  }
415
370
  const coveredTypes = new Set(ideStates.map((s) => s.type));
416
- for (const ide of this.detectedIdes) {
371
+ for (const ide of this.components.detectedIdes.value) {
417
372
  if (!ide.installed || coveredTypes.has(ide.id)) continue;
418
- const cdp = this.cdpManagers.get(ide.id);
373
+ const cdp = this.components.cdpManagers.get(ide.id);
419
374
  if (!cdp?.isConnected) continue;
420
375
  result.push({
421
376
  id: `standalone:ide:${ide.id}`,
@@ -434,7 +389,7 @@ var StandaloneServer = class {
434
389
  }
435
390
  getClis() {
436
391
  const result = [];
437
- for (const [key, adapter] of this.cliManager.adapters.entries()) {
392
+ for (const [key, adapter] of this.components.cliManager.adapters.entries()) {
438
393
  result.push({
439
394
  id: `standalone:cli:${key}`,
440
395
  cliId: key,
@@ -445,54 +400,16 @@ var StandaloneServer = class {
445
400
  return result;
446
401
  }
447
402
  async executeCommand(type, args) {
448
- if (!this.commandHandler) {
449
- return { success: false, error: "Command handler not initialized" };
450
- }
451
- switch (type) {
452
- case "launch_ide": {
453
- const result2 = await (0, import_daemon_core.launchWithCdp)(args);
454
- if (result2.success && result2.port && result2.ideId && !this.cdpManagers.has(result2.ideId)) {
455
- const manager = new import_daemon_core.DaemonCdpManager(result2.port, (msg) => {
456
- console.log(`[CDP:${result2.ideId}] ${msg}`);
457
- });
458
- const connected = await manager.connect();
459
- if (connected) {
460
- this.cdpManagers.set(result2.ideId, manager);
461
- console.log(`[CDP] Connected: ${result2.ideId} (port ${result2.port})`);
462
- }
463
- }
464
- return { success: result2.success, ...result2 };
465
- }
466
- case "detect_ides": {
467
- this.detectedIdes = await (0, import_daemon_core.detectIDEs)();
468
- return { success: true, ides: this.detectedIdes };
469
- }
470
- case "launch_cli":
471
- case "stop_cli":
472
- case "restart_session":
473
- case "agent_command": {
474
- return this.cliManager.handleCliCommand(type, args);
475
- }
476
- case "get_logs": {
477
- const count = args?.count || 100;
478
- const minLevel = args?.minLevel || "info";
479
- const sinceTs = args?.since || 0;
480
- let logs = (0, import_daemon_core.getRecentLogs)(count, minLevel);
481
- if (sinceTs > 0) {
482
- logs = logs.filter((l) => l.ts > sinceTs);
483
- }
484
- return { success: true, logs };
485
- }
403
+ if (!this.components) {
404
+ return { success: false, error: "Components not initialized" };
486
405
  }
487
- const result = await this.commandHandler.handle(type, args);
488
- (0, import_daemon_core.logCommand)({ ts: (/* @__PURE__ */ new Date()).toISOString(), cmd: type, source: "standalone", args, success: result.success, durationMs: 0 });
489
- return result;
406
+ return this.components.router.execute(type, args, "standalone");
490
407
  }
491
408
  broadcastStatus() {
492
409
  if (this.clients.size === 0) return;
493
410
  const status = this.getStatus();
494
411
  const msg = JSON.stringify({ type: "status", data: status });
495
- const cdpCount = [...this.cdpManagers.values()].filter((m) => m.isConnected).length;
412
+ const cdpCount = [...this.components.cdpManagers.values()].filter((m) => m.isConnected).length;
496
413
  import_daemon_core.LOG.debug("Broadcast", `status \u2192 ${this.clients.size} client(s), ${status.ides?.length || 0} IDE(s), ${cdpCount} CDP`);
497
414
  for (const client of this.clients) {
498
415
  if (client.readyState === import_ws.WebSocket.OPEN) {
@@ -500,90 +417,6 @@ var StandaloneServer = class {
500
417
  }
501
418
  }
502
419
  }
503
- // ─── CDP Init ───
504
- async initCdp() {
505
- const cdpPortMap = this.providerLoader.getCdpPortMap?.() || {};
506
- for (const ide of this.detectedIdes) {
507
- if (!ide.installed) continue;
508
- const candidates = [];
509
- if (ide.cdpPort) {
510
- candidates.push(ide.cdpPort);
511
- }
512
- const providerPorts = cdpPortMap[ide.id];
513
- if (providerPorts) {
514
- for (let p = providerPorts[0]; p <= providerPorts[1]; p++) {
515
- if (!candidates.includes(p)) candidates.push(p);
516
- }
517
- }
518
- if (candidates.length === 0) continue;
519
- for (const port of candidates) {
520
- try {
521
- const probe = await fetch(`http://localhost:${port}/json/version`, {
522
- signal: AbortSignal.timeout(1e3)
523
- }).then((r) => r.json()).catch(() => null);
524
- if (!probe) continue;
525
- const manager = new import_daemon_core.DaemonCdpManager(port, (msg) => {
526
- console.log(`[CDP:${ide.id}] ${msg}`);
527
- });
528
- const connected = await manager.connect();
529
- if (connected) {
530
- const enabledExtProviders = this.providerLoader.getEnabledExtensionProviders(ide.id).map((p) => ({
531
- agentType: p.type,
532
- extensionId: p.extensionId || "",
533
- extensionIdPattern: p.extensionIdPattern
534
- }));
535
- manager.setExtensionProviders(enabledExtProviders);
536
- this.cdpManagers.set(ide.id, manager);
537
- console.log(` \u2705 CDP connected: ${ide.id} (port ${port})`);
538
- break;
539
- }
540
- } catch {
541
- }
542
- }
543
- }
544
- setInterval(async () => {
545
- const portMap = this.providerLoader.getCdpPortMap?.() || {};
546
- for (const [ide, ports] of Object.entries(portMap)) {
547
- const alreadyConnected = [...this.cdpManagers.entries()].some(
548
- ([key, m]) => m.isConnected && (key === ide || key.startsWith(ide + "_"))
549
- );
550
- if (alreadyConnected) continue;
551
- const primaryPort = ports[0];
552
- try {
553
- const probe = await fetch(`http://localhost:${primaryPort}/json/version`, {
554
- signal: AbortSignal.timeout(1e3)
555
- }).then((r) => r.json()).catch(() => null);
556
- if (!probe) continue;
557
- const manager = new import_daemon_core.DaemonCdpManager(primaryPort, (msg) => {
558
- console.log(`[CDP:${ide}] ${msg}`);
559
- });
560
- const connected = await manager.connect();
561
- if (connected) {
562
- const enabledExtProviders = this.providerLoader.getEnabledExtensionProviders(ide).map((p) => ({
563
- agentType: p.type,
564
- extensionId: p.extensionId || "",
565
- extensionIdPattern: p.extensionIdPattern
566
- }));
567
- manager.setExtensionProviders(enabledExtProviders);
568
- this.cdpManagers.set(ide, manager);
569
- console.log(`[CDP-Scan] \u2705 Auto-connected: ${ide} (port ${primaryPort})`);
570
- const provider = this.providerLoader.resolve(ide);
571
- if (provider) {
572
- const instance = new import_daemon_core.IdeProviderInstance(provider, ide);
573
- await this.instanceManager.addInstance(ide, instance, {
574
- cdp: manager,
575
- serverConn: void 0,
576
- settings: {}
577
- });
578
- this.instanceIdMap.set(instance.getInstanceId(), ide);
579
- }
580
- this.broadcastStatus();
581
- }
582
- } catch {
583
- }
584
- }
585
- }, 15e3);
586
- }
587
420
  // ─── Network ───
588
421
  getLanIPs() {
589
422
  const interfaces = os.networkInterfaces();
@@ -618,16 +451,8 @@ var StandaloneServer = class {
618
451
  this.wss.close();
619
452
  this.wss = null;
620
453
  }
621
- for (const m of this.cdpManagers.values()) {
622
- try {
623
- m.disconnect();
624
- } catch {
625
- }
626
- }
627
- this.cdpManagers.clear();
628
- try {
629
- await this.cliManager.shutdownAll();
630
- } catch {
454
+ if (this.components) {
455
+ await (0, import_daemon_core.shutdownDaemonComponents)(this.components);
631
456
  }
632
457
  if (this.httpServer) {
633
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 builtinDir: path.join(__dirname, '..', '..', 'daemon-cloud', 'providers', '_builtin'),\n });\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.0",
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": {