@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 +35 -210
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/index-DFCUpKg_.js +186 -0
- package/public/index.html +1 -1
- package/public/assets/index-cRQTVeAI.js +0 -186
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
|
-
|
|
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.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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.
|
|
449
|
-
return { success: false, error: "
|
|
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
|
-
|
|
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
|
-
|
|
622
|
-
|
|
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"]}
|