@adhdev/daemon-standalone 0.1.0 → 0.4.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
|
@@ -105,6 +105,7 @@ var StandaloneServer = class {
|
|
|
105
105
|
ideType: "unknown",
|
|
106
106
|
adapters: this.cliManager.adapters,
|
|
107
107
|
providerLoader: this.providerLoader,
|
|
108
|
+
instanceManager: this.instanceManager,
|
|
108
109
|
instanceIdMap: this.instanceIdMap
|
|
109
110
|
});
|
|
110
111
|
this.agentStreamManager = new import_daemon_core.DaemonAgentStreamManager(
|
|
@@ -467,7 +468,9 @@ var StandaloneServer = class {
|
|
|
467
468
|
return { success: true, ides: this.detectedIdes };
|
|
468
469
|
}
|
|
469
470
|
case "launch_cli":
|
|
470
|
-
case "stop_cli":
|
|
471
|
+
case "stop_cli":
|
|
472
|
+
case "restart_session":
|
|
473
|
+
case "agent_command": {
|
|
471
474
|
return this.cliManager.handleCliCommand(type, args);
|
|
472
475
|
}
|
|
473
476
|
case "get_logs": {
|
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 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 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 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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,kBAAmD;AACnD,gBAA2C;AAC3C,WAAsB;AACtB,SAAoB;AACpB,SAAoB;AAGpB,yBAuBO;AAIP,IAAM,eAAe;AACrB,IAAM,kBAAkB;AAqBxB,IAAM,mBAAN,MAAuB;AAAA,EACb,aAAqD;AAAA,EACrD,MAA8B;AAAA,EAC9B,UAAU,oBAAI,IAAe;AAAA,EAC7B,YAA2B;AAAA,EAC3B,cAAqC;AAAA,EACrC,UAAU;AAAA;AAAA,EAGV;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAA8C;AAAA,EAC9C,qBAAsD;AAAA,EACtD,iBAA8C;AAAA,EAC9C,cAAc,oBAAI,IAA8B;AAAA,EAChD,gBAAgB,oBAAI,IAAoB;AAAA,EACxC,eAAsB,CAAC;AAAA,EACvB,YAA8B;AAAA,EAEtC,cAAc;AACZ,SAAK,iBAAiB,IAAI,kCAAe;AAAA,MACvC,YAAiB,UAAK,WAAW,MAAM,MAAM,gBAAgB,aAAa,UAAU;AAAA,IACtF,CAAC;AACD,SAAK,eAAe,QAAQ;AAC5B,SAAK,eAAe,mBAAmB;AACvC,SAAK,kBAAkB,IAAI,2CAAwB;AACnD,SAAK,aAAa,IAAI,oCAAiB;AAAA,MACrC,eAAe,MAAM;AAAA,MACrB,QAAQ,MAAM;AAAA,MACd,gBAAgB,MAAM,KAAK,gBAAgB;AAAA,MAC3C,qBAAqB,MAAM;AAAA,MAAC;AAAA,MAC5B,oBAAoB,MAAM,KAAK;AAAA,IACjC,GAAG,KAAK,cAAc;AAAA,EACxB;AAAA,EAEA,MAAM,MAAM,UAA6B,CAAC,GAAkB;AAC1D,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,OAAO,QAAQ,QAAQ;AAG7B,SAAK,YAAY,QAAQ,SAAS,QAAQ,IAAI,gBAAgB;AAG9D,qDAAyB;AAGzB,YAAQ,IAAI,6BAAsB;AAClC,SAAK,eAAe,UAAM,+BAAW;AACrC,UAAM,YAAY,KAAK,aAAa,OAAO,CAAC,MAAW,EAAE,SAAS;AAClE,YAAQ,IAAI,YAAY,UAAU,MAAM,YAAY,UAAU,IAAI,CAAC,MAAW,EAAE,EAAE,EAAE,KAAK,IAAI,KAAK,MAAM,EAAE;AAG1G,UAAM,KAAK,QAAQ;AAGnB,QAAI,QAAQ,KAAK;AACf,WAAK,YAAY,IAAI,6BAAU;AAAA,QAC7B,gBAAgB,KAAK;AAAA,QACrB,aAAa,KAAK;AAAA,QAClB,OAAO,CAAC,QAAQ,QAAQ,IAAI,GAAG;AAAA,MACjC,CAAC;AACD,YAAM,KAAK,UAAU,MAAM;AAAA,IAC7B;AAGA,eAAW,OAAO,KAAK,cAAc;AACnC,UAAI,CAAC,IAAI,UAAW;AACpB,YAAM,MAAM,KAAK,YAAY,IAAI,IAAI,EAAE;AACvC,UAAI,CAAC,IAAK;AACV,YAAM,WAAW,KAAK,eAAe,QAAQ,IAAI,EAAE;AACnD,UAAI,CAAC,SAAU;AACf,YAAM,WAAW,IAAI,uCAAoB,UAAU,IAAI,EAAE;AACzD,YAAM,UAAU;AAAA,QACd,KAAK,OAAO;AAAA,QACZ,YAAY;AAAA,QACZ,UAAU,CAAC;AAAA,MACb;AACA,YAAM,KAAK,gBAAgB,YAAY,IAAI,IAAI,UAAU,OAAc;AACvE,WAAK,cAAc,IAAI,SAAS,cAAc,GAAG,IAAI,EAAE;AAAA,IACzD;AAEA,SAAK,gBAAgB,aAAa,GAAI;AAGtC,SAAK,iBAAiB,IAAI,wCAAqB;AAAA,MAC7C,aAAa,KAAK;AAAA,MAClB,SAAS;AAAA,MACT,UAAU,KAAK,WAAW;AAAA,MAC1B,gBAAgB,KAAK;AAAA,MACrB,iBAAiB,KAAK;AAAA,MACtB,eAAe,KAAK;AAAA,IACtB,CAAC;AAGD,SAAK,qBAAqB,IAAI;AAAA,MAC5B,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AACA,SAAK,eAAe,sBAAsB,KAAK,kBAAkB;AAGjE,SAAK,iBAAa,0BAAa,CAAC,KAAK,QAAQ;AAC3C,WAAK,WAAW,KAAK,KAAK,QAAQ,SAAS;AAAA,IAC7C,CAAC;AAGD,SAAK,MAAM,IAAI,0BAAgB,EAAE,UAAU,KAAK,CAAC;AACjD,SAAK,WAAW,GAAG,WAAW,CAAC,KAAK,QAAQ,SAAS;AACnD,YAAM,QAAQ,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,QAAQ,WAAW,EAAE;AACjF,UAAI,MAAM,aAAa,OAAO;AAE5B,YAAI,KAAK,WAAW;AAClB,gBAAM,WAAW,MAAM,aAAa,IAAI,OAAO;AAC/C,cAAI,aAAa,KAAK,WAAW;AAC/B,mBAAO,MAAM,mCAAmC;AAChD,mBAAO,QAAQ;AACf;AAAA,UACF;AAAA,QACF;AACA,aAAK,IAAK,cAAc,KAAK,QAAQ,MAAM,CAAC,OAAO;AACjD,eAAK,mBAAmB,EAAE;AAAA,QAC5B,CAAC;AAAA,MACH,OAAO;AACL,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAGD,SAAK,cAAc,YAAY,MAAM;AACnC,WAAK,gBAAgB;AAAA,IACvB,GAAG,eAAe;AAGlB,SAAK,UAAU;AACf,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,WAAK,WAAY,OAAO,MAAM,MAAM,MAAM;AACxC,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAED,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,oCAA6B;AACzC,YAAQ,IAAI,aAAa,SAAS,YAAY,cAAc,IAAI,IAAI,IAAI,EAAE;AAC1E,YAAQ,IAAI,WAAW,SAAS,YAAY,cAAc,IAAI,IAAI,IAAI,KAAK;AAC3E,QAAI,SAAS,WAAW;AACtB,YAAM,SAAS,KAAK,UAAU;AAC9B,iBAAW,MAAM,QAAQ;AACvB,gBAAQ,IAAI,aAAa,EAAE,IAAI,IAAI,SAAS;AAAA,MAC9C;AAAA,IACF;AACA,QAAI,KAAK,WAAW;AAClB,cAAQ,IAAI,uBAAgB,KAAK,SAAS,EAAE;AAAA,IAC9C;AACA,YAAQ,IAAI,EAAE;AAEd,UAAM,WAAW,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,EAAE;AAC3E,YAAQ,IAAI,WAAW,WAAW,IAAI,UAAK,QAAQ,eAAe,aAAQ,EAAE;AAC5E,YAAQ,IAAI,iBAAiB,KAAK,eAAe,OAAO,EAAE,MAAM,SAAS;AACzE,QAAI,QAAQ,KAAK;AACf,cAAQ,IAAI,wDAA4C;AAAA,IAC1D;AACA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,0BAA0B;AACtC,YAAQ,IAAI,EAAE;AAGd,QAAI,QAAQ,SAAS,OAAO;AAC1B,UAAI;AACF,cAAM,QAAQ,MAAM,OAAO,MAAM,GAAG;AACpC,cAAM,KAAK,oBAAoB,IAAI,EAAE;AAAA,MACvC,QAAQ;AAAA,MAAa;AAAA,IACvB;AAGA,YAAQ,GAAG,UAAU,MAAM,KAAK,KAAK,CAAC;AACtC,YAAQ,GAAG,WAAW,MAAM,KAAK,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA,EAIQ,WACN,KACA,KACA,WACM;AACN,UAAM,MAAM,IAAI,OAAO;AACvB,UAAM,SAAS,IAAI,UAAU;AAG7B,QAAI,UAAU,+BAA+B,GAAG;AAChD,QAAI,UAAU,gCAAgC,oBAAoB;AAClE,QAAI,UAAU,gCAAgC,6BAA6B;AAC3E,QAAI,WAAW,WAAW;AACxB,UAAI,UAAU,GAAG;AACjB,UAAI,IAAI;AACR;AAAA,IACF;AAGA,QAAI,KAAK,aAAa,IAAI,WAAW,OAAO,GAAG;AAC7C,YAAM,aAAa,IAAI,QAAQ,eAAe;AAC9C,YAAM,cAAc,YAAY,WAAW,SAAS,IAAI,WAAW,MAAM,CAAC,IAAI;AAC9E,YAAM,aAAa,IAAI,IAAI,KAAK,UAAU,IAAI,QAAQ,QAAQ,WAAW,EAAE,EAAE,aAAa,IAAI,OAAO;AACrG,UAAI,gBAAgB,KAAK,aAAa,eAAe,KAAK,WAAW;AACnE,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,yEAAyE,CAAC,CAAC;AAC3G;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,IAAI,WAAW,UAAU,IAAI,IAAI,MAAM,CAAC,IAAI;AAE5D,QAAI,YAAY,aAAa,WAAW,OAAO;AAC7C,YAAM,SAAS,KAAK,UAAU;AAC9B,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,MAAM,CAAC;AAC9B;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,WAAW,OAAO;AAC3C,YAAM,OAAO,KAAK,QAAQ;AAC1B,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,KAAK,CAAC,CAAC;AAChC;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,WAAW,OAAO;AAC3C,YAAM,OAAO,KAAK,QAAQ;AAC1B,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,KAAK,CAAC,CAAC;AAChC;AAAA,IACF;AAEA,QAAI,YAAY,aAAa,WAAW,OAAO;AAC7C,YAAM,OAAO,KAAK,QAAQ;AAC1B,YAAM,SAAuB,CAAC;AAC9B,iBAAW,OAAO,MAAM;AAEtB,cAAM,OAAO,IAAI;AACjB,YAAI,MAAM;AACR,iBAAO,KAAK;AAAA,YACV,OAAO,IAAI;AAAA,YACX,MAAM,IAAI;AAAA,YACV,MAAM,IAAI,QAAQ,IAAI;AAAA,YACtB,QAAQ,KAAK,UAAU;AAAA,YACvB,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAEA,mBAAW,UAAW,IAAI,gBAAgB,CAAC,GAAI;AAC7C,iBAAO,KAAK;AAAA,YACV,OAAO,IAAI;AAAA,YACX,MAAM,OAAO;AAAA,YACb,MAAM,OAAO;AAAA,YACb,QAAQ,OAAO,UAAU;AAAA,YACzB,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;AAClC;AAAA,IACF;AAEA,QAAI,YAAY,cAAc,WAAW,QAAQ;AAC/C,UAAI,OAAO;AACX,UAAI,GAAG,QAAQ,CAAC,UAAU;AAAE,gBAAQ;AAAA,MAAO,CAAC;AAC5C,UAAI,GAAG,OAAO,YAAY;AACxB,YAAI;AACF,gBAAM,EAAE,MAAM,SAAS,OAAO,IAAI,KAAK,MAAM,IAAI;AACjD,gBAAM,OAAO,EAAE,GAAG,SAAS,iBAAiB,OAAO;AACnD,gBAAM,SAAS,MAAM,KAAK,eAAe,MAAM,IAAI;AACnD,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,QAChC,SAAS,GAAQ;AACf,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,QAC9D;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAGA,QAAI,WAAW;AACb,YAAM,WAAW,QAAQ,MAAM,gBAAgB;AAC/C,YAAM,WAAgB,UAAK,WAAW,QAAQ;AAC9C,UAAO,cAAW,QAAQ,KAAQ,YAAS,QAAQ,EAAE,OAAO,GAAG;AAC7D,cAAM,MAAW,aAAQ,QAAQ;AACjC,cAAM,YAAoC;AAAA,UACxC,SAAS;AAAA,UACT,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AACA,YAAI,UAAU,KAAK,EAAE,gBAAgB,UAAU,GAAG,KAAK,2BAA2B,CAAC;AACnF,QAAG,oBAAiB,QAAQ,EAAE,KAAK,GAAG;AACtC;AAAA,MACF;AAEA,YAAM,YAAiB,UAAK,WAAW,YAAY;AACnD,UAAO,cAAW,SAAS,KAAK,CAAC,IAAI,WAAW,OAAO,GAAG;AACxD,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,QAAG,oBAAiB,SAAS,EAAE,KAAK,GAAG;AACvC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,QAAI,IAAI,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,CAAC;AAAA,EAChD;AAAA;AAAA,EAIQ,mBAAmB,IAAqB;AAE9C,UAAM,iBAAiB;AACvB,QAAI,KAAK,QAAQ,QAAQ,gBAAgB;AAEvC,YAAM,SAAS,KAAK,QAAQ,OAAO,EAAE,KAAK,EAAE;AAC5C,UAAI,QAAQ;AACV,YAAI;AAAE,UAAC,OAAqB,MAAM,KAAM,sBAAsB;AAAA,QAAG,QAAQ;AAAA,QAAC;AAC1E,aAAK,QAAQ,OAAO,MAAM;AAAA,MAC5B;AAAA,IACF;AACA,SAAK,QAAQ,IAAI,EAAE;AACnB,YAAQ,IAAI,iCAAiC,KAAK,QAAQ,IAAI,GAAG;AAGjE,UAAM,SAAS,KAAK,UAAU;AAC9B,OAAG,KAAK,KAAK,UAAU,EAAE,MAAM,UAAU,MAAM,OAAO,CAAC,CAAC;AAExD,OAAG,GAAG,WAAW,OAAO,QAAQ;AAC9B,UAAI;AACF,cAAM,MAAiB,KAAK,MAAM,IAAI,SAAS,CAAC;AAChD,YAAI,IAAI,SAAS,aAAa,IAAI,MAAM;AACtC,gBAAM,EAAE,MAAM,SAAS,OAAO,IAAI,IAAI;AACtC,gBAAM,YAAY,IAAI;AACtB,gBAAM,OAAO,EAAE,GAAG,SAAS,iBAAiB,OAAO;AACnD,gBAAM,SAAS,MAAM,KAAK,eAAe,MAAM,IAAI;AACnD,aAAG,KAAK,KAAK,UAAU,EAAE,MAAM,kBAAkB,WAAW,MAAM,OAAO,CAAC,CAAC;AAAA,QAC7E;AAAA,MACF,SAAS,GAAQ;AACf,cAAM,aAAa,MAAM;AAAE,cAAI;AAAE,mBAAO,KAAK,MAAM,IAAI,SAAS,CAAC,EAAE;AAAA,UAAW,QAAQ;AAAE,mBAAO;AAAA,UAAW;AAAA,QAAE,GAAG;AAC/G,WAAG,KAAK,KAAK,UAAU,EAAE,MAAM,SAAS,WAAW,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;AAAA,MACpF;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,WAAK,QAAQ,OAAO,EAAE;AACtB,cAAQ,IAAI,oCAAoC,KAAK,QAAQ,IAAI,GAAG;AAAA,IACtE,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,WAAK,QAAQ,OAAO,EAAE;AAAA,IACxB,CAAC;AAAA,EACH;AAAA;AAAA,EAIQ,YAA4B;AAClC,UAAM,YAAe,YAAS,EAAE,QAAQ,iBAAiB,GAAG;AAC5D,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAMA,QAAU,QAAK;AACrB,UAAM,WAAc,YAAS;AAC7B,UAAM,UAAa,WAAQ;AAC3B,UAAMC,WAAa,WAAQ;AAE3B,WAAO;AAAA,MACL,IAAI,cAAc,SAAS;AAAA,MAC3B,MAAM;AAAA,MACN,UAAa,YAAS;AAAA,MACtB,UAAa,YAAS;AAAA,MACtB,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,MACA,cAAc,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,WAAW;AAAA,MACpE,cAAc,KAAK,aAAa,OAAO,CAAC,MAAW,EAAE,SAAS,EAAE,IAAI,CAAC,OAAY;AAAA,QAC/E,IAAI,EAAE;AAAA,QAAI,MAAM,EAAE;AAAA,QAAI,MAAM,EAAE,eAAe,EAAE;AAAA,QAAM,WAAW;AAAA,QAChE,SAAS,KAAK,YAAY,IAAI,EAAE,EAAE,KAAK,KAAK,YAAY,IAAI,EAAE,EAAE,EAAG;AAAA,MACrE,EAAE;AAAA,MACF,oBAAoB,KAAK,eAAe,OAAO,EAAE,IAAI,CAAC,OAAY;AAAA,QAChE,MAAM,EAAE;AAAA,QAAM,MAAM,EAAE,QAAQ;AAAA,QAAM,aAAa,EAAE,eAAe,EAAE;AAAA,QACpE,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,MACF,QAAQ;AAAA,QACN,MAAMD,MAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,SAAAC;AAAA,QACA,QAAW,UAAO;AAAA,QAClB,MAAS,QAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,UAAsB;AAC5B,UAAM,SAAqB,CAAC;AAG5B,UAAM,YAAY,KAAK,gBAAgB,iBAAiB;AACxD,UAAM,YAAY,UAAU,OAAO,CAAC,MAAW,EAAE,aAAa,KAAK;AAEnE,eAAW,SAAS,WAAW;AAC7B,YAAM,MAAM,KAAK,YAAY,IAAI,MAAM,IAAI;AAC3C,aAAO,KAAK;AAAA,QACV,IAAI,kBAAkB,MAAM,cAAc,MAAM,IAAI;AAAA,QACpD,YAAY,MAAM,cAAc,MAAM;AAAA,QACtC,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM,QAAQ,MAAM;AAAA,QAC1B,cAAc,KAAK,eAAe;AAAA,QAClC,SAAS,KAAK,UAAU;AAAA,QACxB,aAAa,MAAM,YAAY,YAAY,CAAC;AAAA,QAC5C,YAAY,MAAM,cAAc;AAAA,QAChC,QAAQ,CAAC;AAAA,QACT,eAAe,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,SAAc;AAAA,UACxD,WAAW,IAAI;AAAA,UACf,WAAW,IAAI;AAAA,UACf,aAAa,IAAI;AAAA,UACjB,QAAQ,IAAI,UAAU;AAAA,UACtB,UAAU,IAAI,YAAY,YAAY,CAAC;AAAA,UACvC,cAAc,IAAI,YAAY,gBAAgB;AAAA,UAC9C,aAAa,IAAI,YAAY,eAAe;AAAA,QAC9C,EAAE;AAAA,QACF,kBAAkB,MAAM,oBAAoB,CAAC;AAAA,QAC7C,YAAY,MAAM,cAAc;AAAA,QAChC,cAAc,MAAM;AAAA,QACpB,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAGA,UAAM,eAAe,IAAI,IAAI,UAAU,IAAI,CAAC,MAAW,EAAE,IAAI,CAAC;AAC9D,eAAW,OAAO,KAAK,cAAc;AACnC,UAAI,CAAC,IAAI,aAAa,aAAa,IAAI,IAAI,EAAE,EAAG;AAChD,YAAM,MAAM,KAAK,YAAY,IAAI,IAAI,EAAE;AACvC,UAAI,CAAC,KAAK,YAAa;AACvB,aAAO,KAAK;AAAA,QACV,IAAI,kBAAkB,IAAI,EAAE;AAAA,QAC5B,YAAY,IAAI;AAAA,QAChB,MAAM,IAAI;AAAA,QACV,MAAM,IAAI,eAAe,IAAI;AAAA,QAC7B,cAAc;AAAA,QACd,SAAS,KAAK,UAAU;AAAA,QACxB,aAAa,CAAC;AAAA,QACd,YAAY;AAAA,QACZ,QAAQ,CAAC;AAAA,QACT,cAAc,CAAC;AAAA,MACjB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAsB;AAC5B,UAAM,SAAqB,CAAC;AAC5B,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,WAAW,SAAS,QAAQ,GAAG;AAC/D,aAAO,KAAK;AAAA,QACV,IAAI,kBAAkB,GAAG;AAAA,QACzB,OAAO;AAAA,QACP,MAAO,QAAgB,WAAW;AAAA,QAClC,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,MAAc,MAAyB;AAClE,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO,EAAE,SAAS,OAAO,OAAO,kCAAkC;AAAA,IACpE;AAGA,YAAQ,MAAM;AAAA,MACZ,KAAK,cAAc;AACjB,cAAMC,UAAS,UAAM,kCAAc,IAAI;AACvC,YAAIA,QAAO,WAAWA,QAAO,QAAQA,QAAO,SAAS,CAAC,KAAK,YAAY,IAAIA,QAAO,KAAK,GAAG;AACxF,gBAAM,UAAU,IAAI,oCAAiBA,QAAO,MAAM,CAAC,QAAgB;AACjE,oBAAQ,IAAI,QAAQA,QAAO,KAAK,KAAK,GAAG,EAAE;AAAA,UAC5C,CAAC;AACD,gBAAM,YAAY,MAAM,QAAQ,QAAQ;AACxC,cAAI,WAAW;AACb,iBAAK,YAAY,IAAIA,QAAO,OAAO,OAAO;AAC1C,oBAAQ,IAAI,oBAAoBA,QAAO,KAAK,UAAUA,QAAO,IAAI,GAAG;AAAA,UACtE;AAAA,QACF;AACA,eAAO,EAAE,SAASA,QAAO,SAAS,GAAGA,QAAc;AAAA,MACrD;AAAA,MACA,KAAK,eAAe;AAClB,aAAK,eAAe,UAAM,+BAAW;AACrC,eAAO,EAAE,SAAS,MAAM,MAAM,KAAK,aAAa;AAAA,MAClD;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,iBAAiB;AACpB,eAAO,KAAK,WAAW,iBAAiB,MAAM,IAAI;AAAA,MACpD;AAAA,MACA,KAAK,YAAY;AACf,cAAM,QAAQ,MAAM,SAAS;AAC7B,cAAM,WAAW,MAAM,YAAY;AACnC,cAAM,UAAU,MAAM,SAAS;AAC/B,YAAI,WAAO,kCAAc,OAAO,QAAQ;AACxC,YAAI,UAAU,GAAG;AACf,iBAAO,KAAK,OAAO,CAAC,MAAW,EAAE,KAAK,OAAO;AAAA,QAC/C;AACA,eAAO,EAAE,SAAS,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,KAAK,eAAe,OAAO,MAAM,IAAI;AAC1D,uCAAW,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK,MAAM,QAAQ,cAAc,MAAM,SAAS,OAAO,SAAS,YAAY,EAAE,CAAC;AAC1H,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,QAAQ,SAAS,EAAG;AAC7B,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,MAAM,KAAK,UAAU,EAAE,MAAM,UAAU,MAAM,OAAO,CAAC;AAC3D,UAAM,WAAW,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,EAAE;AAC3E,2BAAI,MAAM,aAAa,iBAAY,KAAK,QAAQ,IAAI,eAAgB,OAAe,MAAM,UAAU,CAAC,YAAY,QAAQ,MAAM;AAC9H,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,OAAO,eAAe,oBAAU,MAAM;AACxC,eAAO,KAAK,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,UAAyB;AAErC,UAAM,aAAa,KAAK,eAAe,gBAAgB,KAAK,CAAC;AAE7D,eAAW,OAAO,KAAK,cAAc;AACnC,UAAI,CAAC,IAAI,UAAW;AAGpB,YAAM,aAAuB,CAAC;AAC9B,UAAI,IAAI,SAAS;AACf,mBAAW,KAAK,IAAI,OAAO;AAAA,MAC7B;AACA,YAAM,gBAAgB,WAAW,IAAI,EAAE;AACvC,UAAI,eAAe;AACjB,iBAAS,IAAI,cAAc,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG,KAAK;AACzD,cAAI,CAAC,WAAW,SAAS,CAAC,EAAG,YAAW,KAAK,CAAC;AAAA,QAChD;AAAA,MACF;AACA,UAAI,WAAW,WAAW,EAAG;AAE7B,iBAAW,QAAQ,YAAY;AAC7B,YAAI;AAEF,gBAAM,QAAQ,MAAM,MAAM,oBAAoB,IAAI,iBAAiB;AAAA,YACjE,QAAQ,YAAY,QAAQ,GAAI;AAAA,UAClC,CAAC,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC,EAAE,MAAM,MAAM,IAAI;AACvC,cAAI,CAAC,MAAO;AAEZ,gBAAM,UAAU,IAAI,oCAAiB,MAAM,CAAC,QAAgB;AAC1D,oBAAQ,IAAI,QAAQ,IAAI,EAAE,KAAK,GAAG,EAAE;AAAA,UACtC,CAAC;AACD,gBAAM,YAAY,MAAM,QAAQ,QAAQ;AACxC,cAAI,WAAW;AACb,kBAAM,sBAAsB,KAAK,eAAe,6BAA6B,IAAI,EAAE,EAChF,IAAI,CAAC,OAAY;AAAA,cAChB,WAAW,EAAE;AAAA,cACb,aAAa,EAAE,eAAe;AAAA,cAC9B,oBAAoB,EAAE;AAAA,YACxB,EAAE;AACJ,oBAAQ,sBAAsB,mBAAmB;AACjD,iBAAK,YAAY,IAAI,IAAI,IAAI,OAAO;AACpC,oBAAQ,IAAI,4BAAuB,IAAI,EAAE,UAAU,IAAI,GAAG;AAC1D;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAGA,gBAAY,YAAY;AACtB,YAAM,UAAU,KAAK,eAAe,gBAAgB,KAAK,CAAC;AAC1D,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAElD,cAAM,mBAAmB,CAAC,GAAG,KAAK,YAAY,QAAQ,CAAC,EAAE;AAAA,UAAK,CAAC,CAAC,KAAK,CAAC,MACpE,EAAE,gBAAgB,QAAQ,OAAO,IAAI,WAAW,MAAM,GAAG;AAAA,QAC3D;AACA,YAAI,iBAAkB;AAEtB,cAAM,cAAc,MAAM,CAAC;AAC3B,YAAI;AACF,gBAAM,QAAQ,MAAM,MAAM,oBAAoB,WAAW,iBAAiB;AAAA,YACxE,QAAQ,YAAY,QAAQ,GAAI;AAAA,UAClC,CAAC,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC,EAAE,MAAM,MAAM,IAAI;AACvC,cAAI,CAAC,MAAO;AAEZ,gBAAM,UAAU,IAAI,oCAAiB,aAAa,CAAC,QAAgB;AACjE,oBAAQ,IAAI,QAAQ,GAAG,KAAK,GAAG,EAAE;AAAA,UACnC,CAAC;AACD,gBAAM,YAAY,MAAM,QAAQ,QAAQ;AACxC,cAAI,WAAW;AACb,kBAAM,sBAAsB,KAAK,eAAe,6BAA6B,GAAG,EAC7E,IAAI,CAAC,OAAY;AAAA,cAChB,WAAW,EAAE;AAAA,cACb,aAAa,EAAE,eAAe;AAAA,cAC9B,oBAAoB,EAAE;AAAA,YACxB,EAAE;AACJ,oBAAQ,sBAAsB,mBAAmB;AACjD,iBAAK,YAAY,IAAI,KAAK,OAAO;AACjC,oBAAQ,IAAI,qCAAgC,GAAG,UAAU,WAAW,GAAG;AAGvE,kBAAM,WAAW,KAAK,eAAe,QAAQ,GAAG;AAChD,gBAAI,UAAU;AACZ,oBAAM,WAAW,IAAI,uCAAoB,UAAU,GAAG;AACtD,oBAAM,KAAK,gBAAgB,YAAY,KAAK,UAAU;AAAA,gBACpD,KAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,UAAU,CAAC;AAAA,cACb,CAAQ;AACR,mBAAK,cAAc,IAAI,SAAS,cAAc,GAAG,GAAG;AAAA,YACtD;AAGA,iBAAK,gBAAgB;AAAA,UACvB;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,GAAG,IAAM;AAAA,EACX;AAAA;AAAA,EAGQ,YAAsB;AAC5B,UAAM,aAAgB,qBAAkB;AACxC,UAAM,MAAgB,CAAC;AACvB,eAAW,SAAS,OAAO,OAAO,UAAU,GAAG;AAC7C,UAAI,CAAC,MAAO;AACZ,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,UAAU,CAAC,KAAK,UAAU;AAC5C,cAAI,KAAK,KAAK,OAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,UAAU;AAEf,YAAQ,IAAI,uBAAuB;AAEnC,QAAI,KAAK,aAAa;AACpB,oBAAc,KAAK,WAAW;AAC9B,WAAK,cAAc;AAAA,IACrB;AAGA,eAAW,MAAM,KAAK,SAAS;AAC7B,UAAI;AAAE,WAAG,MAAM;AAAA,MAAG,QAAQ;AAAA,MAAa;AAAA,IACzC;AACA,SAAK,QAAQ,MAAM;AAGnB,QAAI,KAAK,KAAK;AACZ,WAAK,IAAI,MAAM;AACf,WAAK,MAAM;AAAA,IACb;AAGA,eAAW,KAAK,KAAK,YAAY,OAAO,GAAG;AACzC,UAAI;AAAE,UAAE,WAAW;AAAA,MAAG,QAAQ;AAAA,MAAa;AAAA,IAC7C;AACA,SAAK,YAAY,MAAM;AAGvB,QAAI;AAAE,YAAM,KAAK,WAAW,YAAY;AAAA,IAAG,QAAQ;AAAA,IAAa;AAGhE,QAAI,KAAK,YAAY;AACnB,WAAK,WAAW,MAAM;AACtB,WAAK,aAAa;AAAA,IACpB;AAEA,YAAQ,IAAI,wCAAmC;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,eAAe,OAAsB;AACnC,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,UAA6B,CAAC;AAGpC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,SAAK,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,SAAS,KAAK,IAAI,CAAC,GAAG;AAC7D,cAAQ,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC;AACnC;AAAA,IACF;AACA,QAAI,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,MAAM;AAC5C,cAAQ,OAAO;AAAA,IACjB;AACA,QAAI,KAAK,CAAC,MAAM,cAAc,KAAK,IAAI,CAAC,GAAG;AACzC,cAAQ,YAAY,KAAK,IAAI,CAAC;AAC9B;AAAA,IACF;AACA,QAAI,KAAK,CAAC,MAAM,aAAa;AAC3B,cAAQ,OAAO;AAAA,IACjB;AACA,QAAI,KAAK,CAAC,MAAM,SAAS;AACvB,MAAC,QAAgB,MAAM;AAAA,IACzB;AACA,QAAI,KAAK,CAAC,MAAM,aAAa,KAAK,IAAI,CAAC,GAAG;AACxC,cAAQ,QAAQ,KAAK,IAAI,CAAC;AAC1B;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,aAAa;AAAA,MACZ,UAAK,WAAW,2BAA2B;AAAA,MAC3C,UAAK,WAAW,WAAW;AAAA,MAC3B,UAAK,QAAQ,IAAI,GAAG,QAAQ;AAAA,IACnC;AACA,eAAW,aAAa,YAAY;AAClC,UAAO,cAAgB,UAAK,WAAW,YAAY,CAAC,GAAG;AACrD,gBAAQ,YAAY;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,iBAAiB;AACpC,QAAM,OAAO,MAAM,OAAO;AAG1B,QAAM,IAAI,QAAc,MAAM;AAAA,EAAC,CAAC;AAClC;AAEA,KAAK,EAAE,MAAM,CAAC,MAAM;AAClB,UAAQ,MAAM,gBAAgB,CAAC;AAC/B,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["cpus","loadavg","result"]}
|