diragent 0.1.2 → 0.1.3

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/cli/index.js CHANGED
@@ -831,7 +831,7 @@ async function startServer(options) {
831
831
  const dbPath = join4(options.dataDir, "data", "dirigent.db");
832
832
  mkdirSync3(dirname(dbPath), { recursive: true });
833
833
  initDatabase(dbPath);
834
- server = Fastify({ logger });
834
+ server = Fastify({ loggerInstance: logger });
835
835
  await server.register(fastifyCors, {
836
836
  origin: true,
837
837
  credentials: true
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/config.ts","../../src/server/db/index.ts","../../src/server/agents/manager.ts","../../src/server/api/routes.ts","../../src/server/ws/index.ts","../../src/server/index.ts","../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/up.ts","../../src/cli/commands/down.ts","../../src/cli/commands/status.ts","../../src/cli/commands/agent.ts","../../src/cli/commands/logs.ts","../../src/cli/commands/config.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nconst AgentTemplateSchema = z.object({\n driver: z.string(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n command: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nconst ConfigSchema = z.object({\n version: z.string().default('1'),\n server: z\n .object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n })\n .default({}),\n auth: z\n .object({\n enabled: z.boolean().default(true),\n adminToken: z.string().optional(),\n apiKeys: z.array(z.string()).optional(),\n })\n .default({}),\n agents: z\n .object({\n maxConcurrent: z.number().default(10),\n defaultTimeout: z.number().default(3600),\n templates: z.record(AgentTemplateSchema).default({}),\n })\n .default({}),\n logging: z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n format: z.enum(['pretty', 'json']).default('pretty'),\n file: z.string().optional(),\n })\n .default({}),\n database: z\n .object({\n path: z.string().default('data/dirigent.db'),\n })\n .default({}),\n});\n\nexport type DirigentConfig = z.infer<typeof ConfigSchema>;\nexport type AgentTemplate = z.infer<typeof AgentTemplateSchema>;\n\nlet cachedConfig: DirigentConfig | null = null;\n\nexport function loadConfig(configPath?: string): DirigentConfig {\n if (cachedConfig) return cachedConfig;\n\n const path = configPath || findConfigPath();\n\n if (!path || !existsSync(path)) {\n // Return defaults\n cachedConfig = ConfigSchema.parse({});\n return cachedConfig;\n }\n\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n cachedConfig = ConfigSchema.parse(parsed);\n\n return cachedConfig;\n}\n\nfunction findConfigPath(): string | null {\n const candidates = [\n join(process.cwd(), '.dirigent', 'config.json'),\n join(process.cwd(), 'dirigent.json'),\n join(process.env.HOME || '', '.dirigent', 'config.json'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function validateAuth(token: string, config: DirigentConfig): boolean {\n if (!config.auth.enabled) return true;\n\n // Check admin token\n if (config.auth.adminToken && token === config.auth.adminToken) return true;\n\n // Check API keys\n if (config.auth.apiKeys?.includes(token)) return true;\n\n return false;\n}\n","import Database from 'better-sqlite3';\n\nlet db: Database.Database | null = null;\n\nexport function initDatabase(path: string): Database.Database {\n db = new Database(path);\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Create tables\n db.exec(`\n -- Agents table\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n template TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'created',\n workspace TEXT,\n model TEXT,\n config TEXT,\n pid INTEGER,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n stopped_at INTEGER,\n error TEXT\n );\n\n -- Agent logs table\n CREATE TABLE IF NOT EXISTS agent_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n metadata TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Tasks table\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n agent_id TEXT,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n result TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Audit log table\n CREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n actor TEXT,\n target_type TEXT,\n target_id TEXT,\n details TEXT,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n );\n\n -- Sessions table (for WebSocket connections)\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT,\n connected_at INTEGER NOT NULL DEFAULT (unixepoch()),\n last_activity INTEGER NOT NULL DEFAULT (unixepoch()),\n metadata TEXT\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_agent_logs_agent_id ON agent_logs(agent_id);\n CREATE INDEX IF NOT EXISTS idx_agent_logs_timestamp ON agent_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_tasks_agent_id ON tasks(agent_id);\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp);\n `);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database | null {\n return db;\n}\n\n// Helper functions\nexport function insertAgent(agent: {\n id: string;\n name: string;\n template: string;\n workspace?: string;\n model?: string;\n config?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agents (id, name, template, workspace, model, config)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n agent.id,\n agent.name,\n agent.template,\n agent.workspace || null,\n agent.model || null,\n agent.config ? JSON.stringify(agent.config) : null\n );\n}\n\nexport function updateAgent(id: string, updates: Record<string, any>) {\n const keys = Object.keys(updates);\n const values = keys.map((k) => (typeof updates[k] === 'object' ? JSON.stringify(updates[k]) : updates[k]));\n\n const stmt = db!.prepare(`\n UPDATE agents SET ${keys.map((k) => `${k} = ?`).join(', ')}\n WHERE id = ?\n `);\n\n stmt.run(...values, id);\n}\n\nexport function getAgent(id: string) {\n const stmt = db!.prepare('SELECT * FROM agents WHERE id = ?');\n const row = stmt.get(id) as any;\n if (row?.config) row.config = JSON.parse(row.config);\n return row;\n}\n\nexport function getAgents(includesStopped = false) {\n const stmt = db!.prepare(\n includesStopped\n ? 'SELECT * FROM agents ORDER BY created_at DESC'\n : \"SELECT * FROM agents WHERE status != 'stopped' ORDER BY created_at DESC\"\n );\n return stmt.all().map((row: any) => {\n if (row.config) row.config = JSON.parse(row.config);\n return row;\n });\n}\n\nexport function insertLog(log: {\n agentId: string;\n level: string;\n message: string;\n metadata?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agent_logs (agent_id, level, message, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n stmt.run(log.agentId, log.level, log.message, log.metadata ? JSON.stringify(log.metadata) : null);\n}\n\nexport function getLogs(agentId: string, limit = 100) {\n const stmt = db!.prepare(`\n SELECT * FROM agent_logs\n WHERE agent_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `);\n\n return stmt.all(agentId, limit).reverse().map((row: any) => {\n if (row.metadata) row.metadata = JSON.parse(row.metadata);\n return row;\n });\n}\n\nexport function audit(action: string, actor: string | null, targetType: string | null, targetId: string | null, details?: object) {\n const stmt = db!.prepare(`\n INSERT INTO audit_log (action, actor, target_type, target_id, details)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(action, actor, targetType, targetId, details ? JSON.stringify(details) : null);\n}\n","import { EventEmitter } from 'events';\nimport { nanoid } from 'nanoid';\nimport { spawn, ChildProcess } from 'child_process';\nimport treeKill from 'tree-kill';\nimport { join } from 'path';\nimport { mkdirSync, existsSync } from 'fs';\nimport type { Logger } from 'pino';\n\nimport { DirigentConfig, AgentTemplate } from '../config.js';\nimport { insertAgent, updateAgent, getAgent, getAgents, insertLog, getLogs, audit } from '../db/index.js';\n\nexport interface Agent {\n id: string;\n name: string;\n template: string;\n status: 'created' | 'starting' | 'running' | 'idle' | 'stopping' | 'stopped' | 'error';\n workspace?: string;\n model?: string;\n pid?: number;\n process?: ChildProcess;\n currentTask?: string;\n createdAt: number;\n startedAt?: number;\n stoppedAt?: number;\n error?: string;\n}\n\ninterface ManagerOptions {\n dataDir: string;\n config: DirigentConfig;\n logger: Logger;\n}\n\nexport class AgentManager extends EventEmitter {\n private agents: Map<string, Agent> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private dataDir: string;\n private config: DirigentConfig;\n private logger: Logger;\n\n constructor(options: ManagerOptions) {\n super();\n this.dataDir = options.dataDir;\n this.config = options.config;\n this.logger = options.logger;\n\n // Load existing agents from database\n this.loadAgents();\n }\n\n private loadAgents() {\n const dbAgents = getAgents(false);\n for (const dbAgent of dbAgents) {\n // Only load non-running agents; running agents will need to be respawned\n if (dbAgent.status !== 'stopped') {\n this.agents.set(dbAgent.id, {\n id: dbAgent.id,\n name: dbAgent.name,\n template: dbAgent.template,\n status: 'stopped', // Reset to stopped since we restarted\n workspace: dbAgent.workspace,\n model: dbAgent.model,\n createdAt: dbAgent.created_at * 1000,\n });\n\n // Update database\n updateAgent(dbAgent.id, { status: 'stopped' });\n }\n }\n }\n\n async spawn(options: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n }): Promise<Agent> {\n const { template, name, workspace, task, model } = options;\n\n // Get template config\n const templateConfig = this.config.agents.templates[template];\n if (!templateConfig) {\n throw new Error(`Unknown template: ${template}`);\n }\n\n // Check max concurrent\n const runningCount = Array.from(this.agents.values()).filter(\n (a) => a.status === 'running' || a.status === 'starting'\n ).length;\n\n if (runningCount >= this.config.agents.maxConcurrent) {\n throw new Error(`Max concurrent agents (${this.config.agents.maxConcurrent}) reached`);\n }\n\n // Create agent\n const id = nanoid(12);\n const agentName = name || `${template}-${id.slice(0, 6)}`;\n const agentWorkspace = workspace || join(this.dataDir, 'workspaces', id);\n\n // Ensure workspace exists\n if (!existsSync(agentWorkspace)) {\n mkdirSync(agentWorkspace, { recursive: true });\n }\n\n const agent: Agent = {\n id,\n name: agentName,\n template,\n status: 'created',\n workspace: agentWorkspace,\n model: model || templateConfig.model,\n currentTask: task,\n createdAt: Date.now(),\n };\n\n // Save to database\n insertAgent({\n id: agent.id,\n name: agent.name,\n template: agent.template,\n workspace: agent.workspace,\n model: agent.model,\n });\n\n audit('agent.created', null, 'agent', id, { name: agentName, template });\n\n this.agents.set(id, agent);\n this.emit('agent:created', agent);\n\n // Start the agent process\n await this.startAgent(agent, templateConfig, task);\n\n return agent;\n }\n\n private async startAgent(agent: Agent, template: AgentTemplate, initialTask?: string) {\n agent.status = 'starting';\n updateAgent(agent.id, { status: 'starting' });\n this.emit('agent:starting', agent);\n\n try {\n const { command, env } = this.buildCommand(agent, template);\n\n this.logger.info({ agentId: agent.id, command }, 'Starting agent');\n\n const proc = spawn(command[0], command.slice(1), {\n cwd: agent.workspace,\n env: {\n ...process.env,\n ...env,\n DIRIGENT_AGENT_ID: agent.id,\n DIRIGENT_AGENT_NAME: agent.name,\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n agent.pid = proc.pid;\n agent.process = proc;\n agent.status = 'running';\n agent.startedAt = Date.now();\n\n updateAgent(agent.id, {\n status: 'running',\n pid: proc.pid,\n started_at: Math.floor(Date.now() / 1000),\n });\n\n this.processes.set(agent.id, proc);\n\n // Handle stdout\n proc.stdout?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'info', message);\n }\n });\n\n // Handle stderr\n proc.stderr?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'error', message);\n }\n });\n\n // Handle exit\n proc.on('exit', (code, signal) => {\n this.logger.info({ agentId: agent.id, code, signal }, 'Agent exited');\n\n agent.status = code === 0 ? 'stopped' : 'error';\n agent.stoppedAt = Date.now();\n if (code !== 0) {\n agent.error = `Exited with code ${code}`;\n }\n\n updateAgent(agent.id, {\n status: agent.status,\n stopped_at: Math.floor(Date.now() / 1000),\n error: agent.error || null,\n });\n\n this.processes.delete(agent.id);\n this.emit('agent:stopped', agent);\n\n audit('agent.stopped', null, 'agent', agent.id, { code, signal });\n });\n\n proc.on('error', (err) => {\n this.logger.error({ agentId: agent.id, err }, 'Agent process error');\n agent.status = 'error';\n agent.error = err.message;\n\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n });\n\n this.emit('agent:running', agent);\n audit('agent.started', null, 'agent', agent.id, { pid: proc.pid });\n\n // Send initial task if provided\n if (initialTask && proc.stdin) {\n proc.stdin.write(initialTask + '\\n');\n }\n } catch (err: any) {\n agent.status = 'error';\n agent.error = err.message;\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n throw err;\n }\n }\n\n private buildCommand(agent: Agent, template: AgentTemplate): { command: string[]; env: Record<string, string> } {\n const env: Record<string, string> = { ...template.env };\n\n switch (template.driver) {\n case 'claude-code':\n return {\n command: ['claude', '--dangerously-skip-permissions'],\n env: {\n ...env,\n ANTHROPIC_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'codex':\n return {\n command: ['codex', '--model', agent.model || template.model || 'codex-1'],\n env,\n };\n\n case 'clawdbot':\n return {\n command: ['clawdbot', 'agent', '--headless'],\n env: {\n ...env,\n CLAWDBOT_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'subprocess':\n if (!template.command || template.command.length === 0) {\n throw new Error('subprocess driver requires command');\n }\n return { command: template.command, env };\n\n default:\n throw new Error(`Unknown driver: ${template.driver}`);\n }\n }\n\n async stop(id: string, force = false): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running' && agent.status !== 'starting') {\n return;\n }\n\n agent.status = 'stopping';\n this.emit('agent:stopping', agent);\n\n const proc = this.processes.get(id);\n if (proc && proc.pid) {\n await new Promise<void>((resolve, reject) => {\n treeKill(proc.pid!, force ? 'SIGKILL' : 'SIGTERM', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n audit('agent.stop_requested', null, 'agent', id, { force });\n }\n\n async stopAll(): Promise<void> {\n const promises = Array.from(this.agents.values())\n .filter((a) => a.status === 'running' || a.status === 'starting')\n .map((a) => this.stop(a.id, true));\n\n await Promise.allSettled(promises);\n }\n\n async send(id: string, message: string): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running') {\n throw new Error(`Agent is not running: ${agent.status}`);\n }\n\n const proc = this.processes.get(id);\n if (!proc || !proc.stdin) {\n throw new Error('Agent process not available');\n }\n\n proc.stdin.write(message + '\\n');\n this.log(id, 'info', `[USER] ${message}`);\n\n audit('agent.message_sent', null, 'agent', id, { length: message.length });\n }\n\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n list(includeStopped = false): Agent[] {\n const agents = Array.from(this.agents.values());\n if (includeStopped) return agents;\n return agents.filter((a) => a.status !== 'stopped');\n }\n\n log(agentId: string, level: string, message: string) {\n insertLog({ agentId, level, message });\n this.emit('agent:log', { agentId, level, message, timestamp: Date.now() });\n }\n\n getLogs(agentId: string, limit = 100) {\n return getLogs(agentId, limit);\n }\n\n getStats() {\n const agents = Array.from(this.agents.values());\n return {\n total: agents.length,\n running: agents.filter((a) => a.status === 'running').length,\n idle: agents.filter((a) => a.status === 'idle').length,\n stopped: agents.filter((a) => a.status === 'stopped').length,\n error: agents.filter((a) => a.status === 'error').length,\n };\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\nimport { getAgents, audit } from '../db/index.js';\n\ninterface RouteOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n startTime: number;\n}\n\nexport function registerApiRoutes(server: FastifyInstance, options: RouteOptions) {\n const { config, agentManager, startTime } = options;\n\n // Auth middleware\n server.addHook('onRequest', async (request, reply) => {\n // Skip auth for health check\n if (request.url === '/health') return;\n\n // Skip auth for dashboard routes\n if (!request.url.startsWith('/api')) return;\n\n if (config.auth.enabled) {\n const authHeader = request.headers.authorization;\n const token = authHeader?.replace('Bearer ', '');\n\n if (!token || !validateAuth(token, config)) {\n reply.code(401).send({ error: 'Unauthorized' });\n return;\n }\n }\n });\n\n // Status\n server.get('/api/status', async () => {\n const stats = agentManager.getStats();\n const agents = agentManager.list(false);\n\n return {\n status: 'ok',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n agents: {\n ...stats,\n list: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n currentTask: a.currentTask,\n })),\n },\n };\n });\n\n // List agents\n server.get<{ Querystring: { all?: string } }>('/api/agents', async (request) => {\n const includeStopped = request.query.all === 'true';\n const agents = agentManager.list(includeStopped);\n\n return {\n agents: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n model: a.model,\n pid: a.pid,\n currentTask: a.currentTask,\n createdAt: a.createdAt,\n startedAt: a.startedAt,\n stoppedAt: a.stoppedAt,\n error: a.error,\n })),\n };\n });\n\n // Spawn agent\n server.post<{\n Body: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n };\n }>('/api/agents', async (request, reply) => {\n const { template, name, workspace, task, model } = request.body;\n\n if (!template) {\n reply.code(400).send({ error: 'template is required' });\n return;\n }\n\n try {\n const agent = await agentManager.spawn({ template, name, workspace, task, model });\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n },\n };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n });\n\n // Get agent\n server.get<{ Params: { id: string } }>('/api/agents/:id', async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n },\n };\n });\n\n // Stop agent\n server.delete<{ Params: { id: string }; Querystring: { force?: string } }>(\n '/api/agents/:id',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const force = request.query.force === 'true';\n\n try {\n await agentManager.stop(request.params.id, force);\n return { ok: true };\n } catch (err: any) {\n reply.code(500).send({ error: err.message });\n }\n }\n );\n\n // Send message to agent\n server.post<{ Params: { id: string }; Body: { message: string } }>(\n '/api/agents/:id/send',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const { message } = request.body;\n\n if (!message) {\n reply.code(400).send({ error: 'message is required' });\n return;\n }\n\n try {\n await agentManager.send(request.params.id, message);\n return { ok: true };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n }\n );\n\n // Get agent logs\n server.get<{ Params: { id: string }; Querystring: { lines?: string } }>(\n '/api/agents/:id/logs',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const limit = parseInt(request.query.lines || '100');\n const logs = agentManager.getLogs(request.params.id, limit);\n\n return { logs };\n }\n );\n\n // Templates\n server.get('/api/templates', async () => {\n return {\n templates: Object.entries(config.agents.templates).map(([name, template]) => ({\n name,\n driver: template.driver,\n model: template.model,\n })),\n };\n });\n\n // Audit log\n server.get<{ Querystring: { limit?: string } }>('/api/audit', async (request) => {\n // TODO: Implement audit log retrieval\n return { logs: [] };\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\n\ninterface WSOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n}\n\ninterface Client {\n ws: WebSocket;\n subscriptions: Set<string>;\n authenticated: boolean;\n}\n\nexport function registerWebSocket(server: FastifyInstance, options: WSOptions) {\n const { config, agentManager } = options;\n const clients: Map<string, Client> = new Map();\n\n // WebSocket route\n server.register(async (fastify) => {\n fastify.get('/ws', { websocket: true }, (connection, req) => {\n const ws = connection;\n const clientId = Math.random().toString(36).slice(2);\n\n const client: Client = {\n ws,\n subscriptions: new Set(),\n authenticated: !config.auth.enabled,\n };\n\n clients.set(clientId, client);\n\n ws.on('message', (data) => {\n try {\n const msg = JSON.parse(data.toString());\n handleMessage(clientId, client, msg);\n } catch (err) {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n }\n });\n\n ws.on('close', () => {\n clients.delete(clientId);\n });\n\n ws.on('error', (err) => {\n console.error('WebSocket error:', err);\n clients.delete(clientId);\n });\n\n // Send welcome\n send(ws, {\n type: 'welcome',\n clientId,\n authenticated: client.authenticated,\n });\n });\n });\n\n function handleMessage(clientId: string, client: Client, msg: any) {\n // Auth\n if (msg.type === 'auth') {\n if (validateAuth(msg.token, config)) {\n client.authenticated = true;\n send(client.ws, { type: 'auth', success: true });\n } else {\n send(client.ws, { type: 'auth', success: false, error: 'Invalid token' });\n }\n return;\n }\n\n // Require auth for other messages\n if (!client.authenticated) {\n send(client.ws, { type: 'error', error: 'Not authenticated' });\n return;\n }\n\n switch (msg.type) {\n case 'subscribe:logs':\n if (msg.agentId) {\n client.subscriptions.add(`logs:${msg.agentId}`);\n send(client.ws, { type: 'subscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'unsubscribe:logs':\n if (msg.agentId) {\n client.subscriptions.delete(`logs:${msg.agentId}`);\n send(client.ws, { type: 'unsubscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'subscribe:agents':\n client.subscriptions.add('agents');\n send(client.ws, { type: 'subscribed', channel: 'agents' });\n break;\n\n case 'unsubscribe:agents':\n client.subscriptions.delete('agents');\n send(client.ws, { type: 'unsubscribed', channel: 'agents' });\n break;\n\n case 'ping':\n send(client.ws, { type: 'pong', ts: Date.now() });\n break;\n\n default:\n send(client.ws, { type: 'error', error: `Unknown message type: ${msg.type}` });\n }\n }\n\n // Agent event handlers\n agentManager.on('agent:created', (agent) => {\n broadcast('agents', { type: 'agent:created', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:running', (agent) => {\n broadcast('agents', { type: 'agent:running', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:stopped', (agent) => {\n broadcast('agents', { type: 'agent:stopped', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:error', (agent, error) => {\n broadcast('agents', { type: 'agent:error', agent: sanitizeAgent(agent), error: error.message });\n });\n\n agentManager.on('agent:log', (data) => {\n broadcast(`logs:${data.agentId}`, { type: 'agent:log', ...data });\n });\n\n function broadcast(channel: string, message: object) {\n for (const client of clients.values()) {\n if (client.authenticated && client.subscriptions.has(channel)) {\n send(client.ws, message);\n }\n }\n }\n\n function send(ws: WebSocket, message: object) {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(message));\n }\n }\n\n function sanitizeAgent(agent: any) {\n return {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n };\n }\n}\n","import Fastify from 'fastify';\nimport fastifyWebsocket from '@fastify/websocket';\nimport fastifyCors from '@fastify/cors';\nimport fastifyStatic from '@fastify/static';\nimport pino from 'pino';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\n\nimport { loadConfig, DirigentConfig } from './config.js';\nimport { initDatabase, getDatabase } from './db/index.js';\nimport { AgentManager } from './agents/manager.js';\nimport { registerApiRoutes } from './api/routes.js';\nimport { registerWebSocket } from './ws/index.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ServerOptions {\n port: number;\n configPath: string;\n dataDir: string;\n}\n\nlet server: ReturnType<typeof Fastify> | null = null;\nlet agentManager: AgentManager | null = null;\nconst startTime = Date.now();\n\nexport async function startServer(options: ServerOptions) {\n const config = loadConfig(options.configPath);\n\n // Setup logging\n const logPath = join(options.dataDir, 'logs', 'dirigent.log');\n mkdirSync(dirname(logPath), { recursive: true });\n\n const logger = pino({\n level: config.logging?.level || 'info',\n transport: {\n targets: [\n {\n target: 'pino-pretty',\n options: { colorize: true },\n level: 'info',\n },\n {\n target: 'pino/file',\n options: { destination: logPath },\n level: 'debug',\n },\n ],\n },\n });\n\n // Initialize database\n const dbPath = join(options.dataDir, 'data', 'dirigent.db');\n mkdirSync(dirname(dbPath), { recursive: true });\n initDatabase(dbPath);\n\n // Create Fastify server\n server = Fastify({ logger });\n\n // Register plugins\n await server.register(fastifyCors, {\n origin: true,\n credentials: true,\n });\n\n await server.register(fastifyWebsocket);\n\n // Serve dashboard static files\n const dashboardPath = join(__dirname, '..', 'dashboard', 'dist');\n if (existsSync(dashboardPath)) {\n await server.register(fastifyStatic, {\n root: dashboardPath,\n prefix: '/',\n });\n }\n\n // Initialize agent manager\n agentManager = new AgentManager({\n dataDir: options.dataDir,\n config,\n logger,\n });\n\n // Register API routes\n registerApiRoutes(server, {\n config,\n agentManager,\n startTime,\n });\n\n // Register WebSocket handlers\n registerWebSocket(server, {\n config,\n agentManager,\n });\n\n // Health check\n server.get('/health', async () => ({ status: 'ok', uptime: Math.floor((Date.now() - startTime) / 1000) }));\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n // Stop all agents\n if (agentManager) {\n await agentManager.stopAll();\n }\n\n // Close server\n if (server) {\n await server.close();\n }\n\n // Close database\n const db = getDatabase();\n if (db) db.close();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Start server\n try {\n await server.listen({ port: options.port, host: config.server?.host || '0.0.0.0' });\n\n console.log(`\n╔══════════════════════════════════════════════════════════╗\n║ ║\n║ 🎭 DIRIGENT SERVER RUNNING ║\n║ ║\n║ Dashboard: http://localhost:${options.port.toString().padEnd(25)}║\n║ API: http://localhost:${options.port}/api${' '.repeat(21)}║\n║ WebSocket: ws://localhost:${options.port}/ws${' '.repeat(22)}║\n║ ║\n╚══════════════════════════════════════════════════════════╝\n`);\n } catch (err) {\n logger.error(err);\n process.exit(1);\n }\n}\n\n// Export for direct invocation\nif (process.env.DIRIGENT_CONFIG) {\n startServer({\n port: parseInt(process.env.DIRIGENT_PORT || '3000'),\n configPath: process.env.DIRIGENT_CONFIG,\n dataDir: process.env.DIRIGENT_DATA_DIR || '.dirigent',\n });\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport boxen from 'boxen';\nimport { initCommand } from './commands/init.js';\nimport { upCommand } from './commands/up.js';\nimport { downCommand } from './commands/down.js';\nimport { statusCommand } from './commands/status.js';\nimport { agentCommand } from './commands/agent.js';\nimport { logsCommand } from './commands/logs.js';\nimport { configCommand } from './commands/config.js';\n\nconst version = '0.1.0';\n\nconst program = new Command();\n\nconst banner = `\n${chalk.bold.cyan('╔══════════════════════════════════════╗')}\n${chalk.bold.cyan('║')} ${chalk.bold.white('🎭 DIRIGENT')} ${chalk.bold.cyan('║')}\n${chalk.bold.cyan('║')} ${chalk.dim('AI Agent Orchestration Platform')} ${chalk.bold.cyan('║')}\n${chalk.bold.cyan('╚══════════════════════════════════════╝')}\n`;\n\nprogram\n .name('dirigent')\n .description('AI Agent Orchestration Platform - Enterprise-grade orchestration for AI coding agents')\n .version(version)\n .addHelpText('beforeAll', banner);\n\n// Core commands\nprogram\n .command('init')\n .description('Initialize a new Dirigent workspace')\n .option('-y, --yes', 'Accept all defaults')\n .option('--port <port>', 'Server port', '3000')\n .option('--data-dir <dir>', 'Data directory', '.dirigent')\n .action(initCommand);\n\nprogram\n .command('up')\n .description('Start the Dirigent server')\n .option('-d, --detach', 'Run in background')\n .option('--port <port>', 'Override server port')\n .action(upCommand);\n\nprogram\n .command('down')\n .description('Stop the Dirigent server')\n .option('-f, --force', 'Force stop all agents')\n .action(downCommand);\n\nprogram\n .command('status')\n .description('Show server and agent status')\n .option('-j, --json', 'Output as JSON')\n .action(statusCommand);\n\n// Agent management\nconst agent = program\n .command('agent')\n .description('Manage agents');\n\nagent\n .command('list')\n .description('List all agents')\n .option('-a, --all', 'Include stopped agents')\n .option('-j, --json', 'Output as JSON')\n .action((opts) => agentCommand('list', opts));\n\nagent\n .command('spawn <template>')\n .description('Spawn a new agent from template')\n .option('-n, --name <name>', 'Agent name')\n .option('-w, --workspace <path>', 'Workspace directory')\n .option('-t, --task <task>', 'Initial task')\n .option('--model <model>', 'Model override')\n .action((template, opts) => agentCommand('spawn', { template, ...opts }));\n\nagent\n .command('stop <id>')\n .description('Stop an agent')\n .option('-f, --force', 'Force stop')\n .action((id, opts) => agentCommand('stop', { id, ...opts }));\n\nagent\n .command('send <id> <message>')\n .description('Send a message to an agent')\n .action((id, message) => agentCommand('send', { id, message }));\n\nagent\n .command('logs <id>')\n .description('Stream agent logs')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --lines <n>', 'Number of lines', '50')\n .action((id, opts) => agentCommand('logs', { id, ...opts }));\n\n// Logs\nprogram\n .command('logs')\n .description('View server logs')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --lines <n>', 'Number of lines', '100')\n .action(logsCommand);\n\n// Config\nprogram\n .command('config')\n .description('View or edit configuration')\n .option('--get <key>', 'Get a config value')\n .option('--set <key=value>', 'Set a config value')\n .option('--list', 'List all config')\n .option('--edit', 'Open config in editor')\n .action(configCommand);\n\n// Dashboard shortcut\nprogram\n .command('dashboard')\n .alias('ui')\n .description('Open the web dashboard')\n .option('-p, --port <port>', 'Dashboard port')\n .action(async () => {\n const config = await import('../server/config.js').then(m => m.loadConfig());\n console.log(chalk.cyan(`\\n🌐 Dashboard: ${chalk.bold(`http://localhost:${config.server.port}`)}\\n`));\n });\n\n// Parse and run\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n console.log(banner);\n program.outputHelp();\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { nanoid } from 'nanoid';\n\nasync function prompt(question: string, defaultValue?: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n const q = defaultValue ? `${question} (${defaultValue}): ` : `${question}: `;\n rl.question(q, (answer) => {\n rl.close();\n resolve(answer || defaultValue || '');\n });\n });\n}\n\nasync function confirm(question: string, defaultValue = true): Promise<boolean> {\n const answer = await prompt(`${question} (${defaultValue ? 'Y/n' : 'y/N'})`, defaultValue ? 'y' : 'n');\n return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n}\n\ninterface InitOptions {\n yes?: boolean;\n port?: string;\n dataDir?: string;\n}\n\nconst DEFAULT_CONFIG = {\n version: '1',\n server: {\n port: 3000,\n host: '0.0.0.0',\n },\n auth: {\n enabled: true,\n adminToken: '', // Generated during init\n },\n agents: {\n maxConcurrent: 10,\n defaultTimeout: 3600,\n templates: {\n claude: {\n driver: 'claude-code',\n model: 'claude-sonnet-4-5',\n maxTokens: 16000,\n },\n codex: {\n driver: 'codex',\n model: 'codex-1',\n },\n custom: {\n driver: 'subprocess',\n command: [],\n },\n },\n },\n logging: {\n level: 'info',\n format: 'pretty',\n file: 'logs/dirigent.log',\n },\n database: {\n path: 'data/dirigent.db',\n },\n};\n\nexport async function initCommand(options: InitOptions) {\n console.log(chalk.cyan('\\n🎭 Initializing Dirigent workspace\\n'));\n\n const dataDir = options.dataDir || '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n\n // Check if already initialized\n if (existsSync(configPath)) {\n const overwrite = options.yes ? true : await confirm('Dirigent is already initialized. Overwrite config?', false);\n if (!overwrite) {\n console.log(chalk.yellow('Aborted.'));\n return;\n }\n }\n\n // Gather config\n let config = { ...DEFAULT_CONFIG };\n\n if (!options.yes) {\n const portStr = await prompt('Server port', options.port || '3000');\n const authEnabled = await confirm('Enable authentication?', true);\n const maxAgentsStr = await prompt('Max concurrent agents', '10');\n\n config.server.port = parseInt(portStr) || 3000;\n config.auth.enabled = authEnabled;\n config.agents.maxConcurrent = parseInt(maxAgentsStr) || 10;\n } else {\n config.server.port = parseInt(options.port || '3000');\n }\n\n // Generate admin token\n config.auth.adminToken = nanoid(32);\n\n const spinner = ora('Creating workspace...').start();\n\n try {\n // Create directories\n const dirs = [\n dataDir,\n join(dataDir, 'data'),\n join(dataDir, 'logs'),\n join(dataDir, 'agents'),\n join(dataDir, 'workspaces'),\n ];\n\n for (const dir of dirs) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Write config\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n\n // Create .gitignore\n writeFileSync(\n join(dataDir, '.gitignore'),\n `# Dirigent data\ndata/\nlogs/\nagents/\nworkspaces/\n*.db\n*.db-journal\n`\n );\n\n spinner.succeed('Workspace created');\n\n console.log(chalk.green('\\n✅ Dirigent initialized successfully!\\n'));\n console.log(chalk.dim('Configuration:'));\n console.log(` ${chalk.cyan('Config:')} ${configPath}`);\n console.log(` ${chalk.cyan('Port:')} ${config.server.port}`);\n console.log(` ${chalk.cyan('Auth:')} ${config.auth.enabled ? 'Enabled' : 'Disabled'}`);\n\n if (config.auth.enabled) {\n console.log(chalk.yellow('\\n⚠️ Save your admin token (shown only once):'));\n console.log(chalk.bold.white(` ${config.auth.adminToken}\\n`));\n }\n\n console.log(chalk.dim('Next steps:'));\n console.log(` ${chalk.cyan('1.')} Start the server: ${chalk.bold('dirigent up')}`);\n console.log(` ${chalk.cyan('2.')} Open dashboard: ${chalk.bold(`http://localhost:${config.server.port}`)}`);\n console.log(` ${chalk.cyan('3.')} Spawn an agent: ${chalk.bold('dirigent agent spawn claude')}\\n`);\n } catch (err) {\n spinner.fail('Failed to create workspace');\n console.error(chalk.red(err));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { spawn } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport { dirname } from 'path';\n\ninterface UpOptions {\n detach?: boolean;\n port?: string;\n}\n\nexport async function upCommand(options: UpOptions) {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n const pidPath = join(process.cwd(), dataDir, 'dirigent.pid');\n\n // Check if initialized\n if (!existsSync(configPath)) {\n console.log(chalk.red('\\n❌ Dirigent not initialized. Run `dirigent init` first.\\n'));\n process.exit(1);\n }\n\n // Check if already running\n if (existsSync(pidPath)) {\n const pid = parseInt(readFileSync(pidPath, 'utf-8').trim());\n try {\n process.kill(pid, 0);\n console.log(chalk.yellow(`\\n⚠️ Dirigent is already running (PID: ${pid})`));\n console.log(chalk.dim(' Use `dirigent down` to stop it first.\\n'));\n return;\n } catch {\n // Process not running, remove stale PID file\n }\n }\n\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n const port = options.port || config.server.port;\n\n console.log(chalk.cyan('\\n🎭 Starting Dirigent server...\\n'));\n\n const spinner = ora('Starting server...').start();\n\n try {\n // Get the path to the server entry point\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const serverPath = join(__dirname, '..', '..', 'server', 'index.js');\n\n const env = {\n ...process.env,\n DIRIGENT_PORT: port.toString(),\n DIRIGENT_CONFIG: configPath,\n DIRIGENT_DATA_DIR: join(process.cwd(), dataDir),\n };\n\n if (options.detach) {\n // Run in background\n const child = spawn(process.execPath, [serverPath], {\n detached: true,\n stdio: 'ignore',\n env,\n });\n\n child.unref();\n writeFileSync(pidPath, child.pid!.toString());\n\n spinner.succeed(`Server started (PID: ${child.pid})`);\n console.log(chalk.green(`\\n✅ Dirigent is running\\n`));\n console.log(` ${chalk.cyan('Dashboard:')} http://localhost:${port}`);\n console.log(` ${chalk.cyan('API:')} http://localhost:${port}/api`);\n console.log(` ${chalk.cyan('WebSocket:')} ws://localhost:${port}/ws\\n`);\n console.log(chalk.dim(` Stop with: dirigent down\\n`));\n } else {\n // Run in foreground\n spinner.succeed('Server starting...');\n\n const { startServer } = await import('../../server/index.js');\n await startServer({\n port: parseInt(port),\n configPath,\n dataDir: join(process.cwd(), dataDir),\n });\n }\n } catch (err) {\n spinner.fail('Failed to start server');\n console.error(chalk.red(err));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync, unlinkSync } from 'fs';\nimport { join } from 'path';\nimport treeKill from 'tree-kill';\n\ninterface DownOptions {\n force?: boolean;\n}\n\nexport async function downCommand(options: DownOptions) {\n const dataDir = '.dirigent';\n const pidPath = join(process.cwd(), dataDir, 'dirigent.pid');\n\n if (!existsSync(pidPath)) {\n console.log(chalk.yellow('\\n⚠️ Dirigent is not running.\\n'));\n return;\n }\n\n const pid = parseInt(readFileSync(pidPath, 'utf-8').trim());\n const spinner = ora('Stopping Dirigent...').start();\n\n try {\n // Check if process is running\n try {\n process.kill(pid, 0);\n } catch {\n spinner.warn('Dirigent was not running (stale PID file)');\n unlinkSync(pidPath);\n return;\n }\n\n // Stop the server (and all child agents)\n await new Promise<void>((resolve, reject) => {\n const signal = options.force ? 'SIGKILL' : 'SIGTERM';\n treeKill(pid, signal, (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n\n // Remove PID file\n unlinkSync(pidPath);\n\n spinner.succeed('Dirigent stopped');\n console.log(chalk.green('\\n✅ Dirigent has been stopped.\\n'));\n } catch (err) {\n spinner.fail('Failed to stop Dirigent');\n console.error(chalk.red(err));\n \n if (options.force) {\n // Force remove PID file\n try {\n unlinkSync(pidPath);\n } catch {}\n }\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport boxen from 'boxen';\n\ninterface StatusOptions {\n json?: boolean;\n}\n\nexport async function statusCommand(options: StatusOptions) {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n const pidPath = join(process.cwd(), dataDir, 'dirigent.pid');\n\n // Check if initialized\n if (!existsSync(configPath)) {\n if (options.json) {\n console.log(JSON.stringify({ initialized: false, running: false }));\n } else {\n console.log(chalk.yellow('\\n⚠️ Dirigent not initialized. Run `dirigent init` first.\\n'));\n }\n return;\n }\n\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n let running = false;\n let pid: number | null = null;\n let serverStatus: any = null;\n\n // Check if running\n if (existsSync(pidPath)) {\n pid = parseInt(readFileSync(pidPath, 'utf-8').trim());\n try {\n process.kill(pid, 0);\n running = true;\n\n // Try to get server status via API\n try {\n const res = await fetch(`http://localhost:${config.server.port}/api/status`);\n if (res.ok) {\n serverStatus = await res.json();\n }\n } catch {\n // Server might be starting up\n }\n } catch {\n running = false;\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n initialized: true,\n running,\n pid,\n port: config.server.port,\n agents: serverStatus?.agents || [],\n uptime: serverStatus?.uptime || null,\n })\n );\n return;\n }\n\n // Pretty output\n const statusIcon = running ? chalk.green('●') : chalk.red('●');\n const statusText = running ? chalk.green('Running') : chalk.red('Stopped');\n\n console.log(\n boxen(\n `${chalk.bold.white('🎭 DIRIGENT STATUS')}\\n\\n` +\n `${chalk.dim('Status:')} ${statusIcon} ${statusText}${pid ? chalk.dim(` (PID: ${pid})`) : ''}\\n` +\n `${chalk.dim('Port:')} ${config.server.port}\\n` +\n `${chalk.dim('Auth:')} ${config.auth.enabled ? 'Enabled' : 'Disabled'}\\n` +\n (serverStatus\n ? `${chalk.dim('Uptime:')} ${formatUptime(serverStatus.uptime)}\\n` +\n `${chalk.dim('Agents:')} ${serverStatus.agents.running}/${serverStatus.agents.total} running`\n : ''),\n {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: running ? 'green' : 'red',\n }\n )\n );\n\n if (running && serverStatus?.agents?.list?.length > 0) {\n console.log(chalk.dim('\\nActive Agents:\\n'));\n for (const agent of serverStatus.agents.list) {\n const agentIcon = agent.status === 'running' ? chalk.green('●') : chalk.yellow('●');\n console.log(` ${agentIcon} ${chalk.bold(agent.name)} ${chalk.dim(`(${agent.id})`)}`);\n console.log(` ${chalk.dim('Template:')} ${agent.template}`);\n console.log(` ${chalk.dim('Workspace:')} ${agent.workspace}`);\n console.log('');\n }\n }\n\n if (!running) {\n console.log(chalk.dim(`\\n Start with: ${chalk.cyan('dirigent up')}\\n`));\n }\n}\n\nfunction formatUptime(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return `${h}h ${m}m`;\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\ninterface AgentOptions {\n template?: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n id?: string;\n message?: string;\n force?: boolean;\n follow?: boolean;\n lines?: string;\n all?: boolean;\n json?: boolean;\n}\n\nasync function getConfig() {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n\n if (!existsSync(configPath)) {\n console.log(chalk.red('\\n❌ Dirigent not initialized. Run `dirigent init` first.\\n'));\n process.exit(1);\n }\n\n return JSON.parse(readFileSync(configPath, 'utf-8'));\n}\n\nasync function apiCall(\n method: string,\n path: string,\n body?: any\n): Promise<any> {\n const config = await getConfig();\n const url = `http://localhost:${config.server.port}/api${path}`;\n\n const res = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.auth.adminToken}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ error: res.statusText }));\n throw new Error(error.error || error.message || 'API call failed');\n }\n\n return res.json();\n}\n\nexport async function agentCommand(action: string, options: AgentOptions) {\n switch (action) {\n case 'list':\n await listAgents(options);\n break;\n case 'spawn':\n await spawnAgent(options);\n break;\n case 'stop':\n await stopAgent(options);\n break;\n case 'send':\n await sendToAgent(options);\n break;\n case 'logs':\n await agentLogs(options);\n break;\n default:\n console.log(chalk.red(`Unknown action: ${action}`));\n }\n}\n\nasync function listAgents(options: AgentOptions) {\n try {\n const result = await apiCall('GET', `/agents${options.all ? '?all=true' : ''}`);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.agents.length === 0) {\n console.log(chalk.yellow('\\nNo agents found.\\n'));\n console.log(chalk.dim(' Spawn one with: dirigent agent spawn claude\\n'));\n return;\n }\n\n console.log(chalk.cyan('\\n🤖 Agents\\n'));\n\n for (const agent of result.agents) {\n const icon =\n agent.status === 'running'\n ? chalk.green('●')\n : agent.status === 'idle'\n ? chalk.yellow('●')\n : chalk.red('●');\n\n console.log(`${icon} ${chalk.bold(agent.name)} ${chalk.dim(`[${agent.id}]`)}`);\n console.log(` ${chalk.dim('Template:')} ${agent.template}`);\n console.log(` ${chalk.dim('Status:')} ${agent.status}`);\n console.log(` ${chalk.dim('Workspace:')} ${agent.workspace || 'N/A'}`);\n if (agent.currentTask) {\n console.log(` ${chalk.dim('Task:')} ${agent.currentTask.substring(0, 60)}...`);\n }\n console.log('');\n }\n } catch (err: any) {\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n console.log(chalk.dim(' Make sure Dirigent is running: dirigent up\\n'));\n }\n}\n\nasync function spawnAgent(options: AgentOptions) {\n const spinner = ora('Spawning agent...').start();\n\n try {\n const result = await apiCall('POST', '/agents', {\n template: options.template,\n name: options.name,\n workspace: options.workspace,\n task: options.task,\n model: options.model,\n });\n\n spinner.succeed(`Agent spawned: ${chalk.bold(result.agent.name)}`);\n console.log(`\\n ${chalk.dim('ID:')} ${result.agent.id}`);\n console.log(` ${chalk.dim('Template:')} ${result.agent.template}`);\n console.log(` ${chalk.dim('Workspace:')} ${result.agent.workspace}`);\n\n if (options.task) {\n console.log(` ${chalk.dim('Task:')} ${options.task.substring(0, 60)}...`);\n }\n\n console.log(chalk.dim(`\\n View logs: dirigent agent logs ${result.agent.id}\\n`));\n } catch (err: any) {\n spinner.fail('Failed to spawn agent');\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n}\n\nasync function stopAgent(options: AgentOptions) {\n const spinner = ora('Stopping agent...').start();\n\n try {\n await apiCall('DELETE', `/agents/${options.id}${options.force ? '?force=true' : ''}`);\n spinner.succeed(`Agent stopped: ${options.id}`);\n } catch (err: any) {\n spinner.fail('Failed to stop agent');\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n}\n\nasync function sendToAgent(options: AgentOptions) {\n try {\n const result = await apiCall('POST', `/agents/${options.id}/send`, {\n message: options.message,\n });\n\n console.log(chalk.green(`\\n✉️ Message sent to agent ${options.id}\\n`));\n\n if (result.response) {\n console.log(chalk.dim('Response:'));\n console.log(result.response);\n }\n } catch (err: any) {\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n}\n\nasync function agentLogs(options: AgentOptions) {\n const config = await getConfig();\n\n if (options.follow) {\n // Stream logs via WebSocket\n const { io } = await import('socket.io-client');\n const socket = io(`http://localhost:${config.server.port}`, {\n auth: { token: config.auth.adminToken },\n });\n\n socket.on('connect', () => {\n socket.emit('subscribe:logs', { agentId: options.id });\n console.log(chalk.dim(`\\nStreaming logs for agent ${options.id}...\\n`));\n });\n\n socket.on('agent:log', (data) => {\n const timestamp = chalk.dim(new Date(data.timestamp).toISOString().split('T')[1].slice(0, 8));\n const level =\n data.level === 'error'\n ? chalk.red('ERR')\n : data.level === 'warn'\n ? chalk.yellow('WRN')\n : chalk.blue('INF');\n console.log(`${timestamp} ${level} ${data.message}`);\n });\n\n socket.on('disconnect', () => {\n console.log(chalk.dim('\\nDisconnected.\\n'));\n process.exit(0);\n });\n\n // Handle Ctrl+C\n process.on('SIGINT', () => {\n socket.disconnect();\n });\n } else {\n // Fetch recent logs\n try {\n const result = await apiCall(\n 'GET',\n `/agents/${options.id}/logs?lines=${options.lines || 50}`\n );\n\n console.log(chalk.dim(`\\nLogs for agent ${options.id}:\\n`));\n\n for (const log of result.logs) {\n const timestamp = chalk.dim(new Date(log.timestamp).toISOString().split('T')[1].slice(0, 8));\n const level =\n log.level === 'error'\n ? chalk.red('ERR')\n : log.level === 'warn'\n ? chalk.yellow('WRN')\n : chalk.blue('INF');\n console.log(`${timestamp} ${level} ${log.message}`);\n }\n\n console.log(chalk.dim(`\\n Stream with: dirigent agent logs ${options.id} -f\\n`));\n } catch (err: any) {\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync, createReadStream } from 'fs';\nimport { join } from 'path';\nimport { createInterface } from 'readline';\n\ninterface LogsOptions {\n follow?: boolean;\n lines?: string;\n}\n\nexport async function logsCommand(options: LogsOptions) {\n const dataDir = '.dirigent';\n const logPath = join(process.cwd(), dataDir, 'logs', 'dirigent.log');\n\n if (!existsSync(logPath)) {\n console.log(chalk.yellow('\\n⚠️ No logs found.\\n'));\n return;\n }\n\n const lines = parseInt(options.lines || '100');\n\n if (options.follow) {\n // Use tail -f approach\n const { spawn } = await import('child_process');\n const tail = spawn('tail', ['-f', '-n', lines.toString(), logPath], {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n tail.stdout.on('data', (data) => {\n process.stdout.write(formatLog(data.toString()));\n });\n\n tail.stderr.on('data', (data) => {\n process.stderr.write(data);\n });\n\n process.on('SIGINT', () => {\n tail.kill();\n process.exit(0);\n });\n } else {\n // Read last N lines\n const content = readFileSync(logPath, 'utf-8');\n const allLines = content.trim().split('\\n');\n const lastLines = allLines.slice(-lines);\n\n for (const line of lastLines) {\n console.log(formatLog(line));\n }\n\n console.log(chalk.dim(`\\n Stream with: dirigent logs -f\\n`));\n }\n}\n\nfunction formatLog(line: string): string {\n try {\n // Try to parse as JSON (pino format)\n const parsed = JSON.parse(line);\n const time = chalk.dim(\n new Date(parsed.time).toISOString().split('T')[1].slice(0, 8)\n );\n const level =\n parsed.level <= 20\n ? chalk.dim('DBG')\n : parsed.level <= 30\n ? chalk.blue('INF')\n : parsed.level <= 40\n ? chalk.yellow('WRN')\n : chalk.red('ERR');\n const msg = parsed.msg || '';\n return `${time} ${level} ${msg}`;\n } catch {\n // Return as-is if not JSON\n return line;\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { spawn } from 'child_process';\n\ninterface ConfigOptions {\n get?: string;\n set?: string;\n list?: boolean;\n edit?: boolean;\n}\n\nexport async function configCommand(options: ConfigOptions) {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n\n if (!existsSync(configPath)) {\n console.log(chalk.red('\\n❌ Dirigent not initialized. Run `dirigent init` first.\\n'));\n process.exit(1);\n }\n\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n\n if (options.get) {\n const value = getNestedValue(config, options.get);\n if (value === undefined) {\n console.log(chalk.yellow(`\\n⚠️ Key not found: ${options.get}\\n`));\n } else {\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : value);\n }\n return;\n }\n\n if (options.set) {\n const [key, ...valueParts] = options.set.split('=');\n const value = valueParts.join('=');\n\n if (!key || value === undefined) {\n console.log(chalk.red('\\n❌ Invalid format. Use: --set key=value\\n'));\n process.exit(1);\n }\n\n // Parse value\n let parsedValue: any = value;\n if (value === 'true') parsedValue = true;\n else if (value === 'false') parsedValue = false;\n else if (!isNaN(Number(value))) parsedValue = Number(value);\n else {\n try {\n parsedValue = JSON.parse(value);\n } catch {\n // Keep as string\n }\n }\n\n setNestedValue(config, key, parsedValue);\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n console.log(chalk.green(`\\n✅ Set ${key} = ${JSON.stringify(parsedValue)}\\n`));\n console.log(chalk.dim(' Restart Dirigent for changes to take effect: dirigent down && dirigent up\\n'));\n return;\n }\n\n if (options.edit) {\n const editor = process.env.EDITOR || process.env.VISUAL || 'vim';\n const child = spawn(editor, [configPath], {\n stdio: 'inherit',\n });\n\n child.on('exit', () => {\n console.log(chalk.dim('\\n Restart Dirigent for changes to take effect: dirigent down && dirigent up\\n'));\n });\n return;\n }\n\n // Default: list all config\n console.log(chalk.cyan('\\n🔧 Configuration\\n'));\n console.log(JSON.stringify(config, null, 2));\n console.log(chalk.dim(`\\n File: ${configPath}\\n`));\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((acc, key) => acc?.[key], obj);\n}\n\nfunction setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((acc, key) => {\n if (!(key in acc)) acc[key] = {};\n return acc[key];\n }, obj);\n target[lastKey] = value;\n}\n"],"mappings":"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","names":["existsSync","join","agent","nanoid","join","mkdirSync","existsSync","agent","server","agentManager","startTime","agent","server","agentManager","agent","join","existsSync","mkdirSync","db","chalk","chalk","ora","existsSync","readFileSync","writeFileSync","join","spawn","fileURLToPath","dirname","__filename","__dirname","startServer","chalk","ora","existsSync","readFileSync","join","treeKill","chalk","existsSync","readFileSync","join","agent","chalk","ora","existsSync","readFileSync","join","agent","chalk","existsSync","readFileSync","join","spawn","chalk","existsSync","readFileSync","writeFileSync","join","spawn","chalk"]}
1
+ {"version":3,"sources":["../../src/server/config.ts","../../src/server/db/index.ts","../../src/server/agents/manager.ts","../../src/server/api/routes.ts","../../src/server/ws/index.ts","../../src/server/index.ts","../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/up.ts","../../src/cli/commands/down.ts","../../src/cli/commands/status.ts","../../src/cli/commands/agent.ts","../../src/cli/commands/logs.ts","../../src/cli/commands/config.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nconst AgentTemplateSchema = z.object({\n driver: z.string(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n command: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nconst ConfigSchema = z.object({\n version: z.string().default('1'),\n server: z\n .object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n })\n .default({}),\n auth: z\n .object({\n enabled: z.boolean().default(true),\n adminToken: z.string().optional(),\n apiKeys: z.array(z.string()).optional(),\n })\n .default({}),\n agents: z\n .object({\n maxConcurrent: z.number().default(10),\n defaultTimeout: z.number().default(3600),\n templates: z.record(AgentTemplateSchema).default({}),\n })\n .default({}),\n logging: z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n format: z.enum(['pretty', 'json']).default('pretty'),\n file: z.string().optional(),\n })\n .default({}),\n database: z\n .object({\n path: z.string().default('data/dirigent.db'),\n })\n .default({}),\n});\n\nexport type DirigentConfig = z.infer<typeof ConfigSchema>;\nexport type AgentTemplate = z.infer<typeof AgentTemplateSchema>;\n\nlet cachedConfig: DirigentConfig | null = null;\n\nexport function loadConfig(configPath?: string): DirigentConfig {\n if (cachedConfig) return cachedConfig;\n\n const path = configPath || findConfigPath();\n\n if (!path || !existsSync(path)) {\n // Return defaults\n cachedConfig = ConfigSchema.parse({});\n return cachedConfig;\n }\n\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n cachedConfig = ConfigSchema.parse(parsed);\n\n return cachedConfig;\n}\n\nfunction findConfigPath(): string | null {\n const candidates = [\n join(process.cwd(), '.dirigent', 'config.json'),\n join(process.cwd(), 'dirigent.json'),\n join(process.env.HOME || '', '.dirigent', 'config.json'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function validateAuth(token: string, config: DirigentConfig): boolean {\n if (!config.auth.enabled) return true;\n\n // Check admin token\n if (config.auth.adminToken && token === config.auth.adminToken) return true;\n\n // Check API keys\n if (config.auth.apiKeys?.includes(token)) return true;\n\n return false;\n}\n","import Database from 'better-sqlite3';\n\nlet db: Database.Database | null = null;\n\nexport function initDatabase(path: string): Database.Database {\n db = new Database(path);\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Create tables\n db.exec(`\n -- Agents table\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n template TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'created',\n workspace TEXT,\n model TEXT,\n config TEXT,\n pid INTEGER,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n stopped_at INTEGER,\n error TEXT\n );\n\n -- Agent logs table\n CREATE TABLE IF NOT EXISTS agent_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n metadata TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Tasks table\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n agent_id TEXT,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n result TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Audit log table\n CREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n actor TEXT,\n target_type TEXT,\n target_id TEXT,\n details TEXT,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n );\n\n -- Sessions table (for WebSocket connections)\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT,\n connected_at INTEGER NOT NULL DEFAULT (unixepoch()),\n last_activity INTEGER NOT NULL DEFAULT (unixepoch()),\n metadata TEXT\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_agent_logs_agent_id ON agent_logs(agent_id);\n CREATE INDEX IF NOT EXISTS idx_agent_logs_timestamp ON agent_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_tasks_agent_id ON tasks(agent_id);\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp);\n `);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database | null {\n return db;\n}\n\n// Helper functions\nexport function insertAgent(agent: {\n id: string;\n name: string;\n template: string;\n workspace?: string;\n model?: string;\n config?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agents (id, name, template, workspace, model, config)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n agent.id,\n agent.name,\n agent.template,\n agent.workspace || null,\n agent.model || null,\n agent.config ? JSON.stringify(agent.config) : null\n );\n}\n\nexport function updateAgent(id: string, updates: Record<string, any>) {\n const keys = Object.keys(updates);\n const values = keys.map((k) => (typeof updates[k] === 'object' ? JSON.stringify(updates[k]) : updates[k]));\n\n const stmt = db!.prepare(`\n UPDATE agents SET ${keys.map((k) => `${k} = ?`).join(', ')}\n WHERE id = ?\n `);\n\n stmt.run(...values, id);\n}\n\nexport function getAgent(id: string) {\n const stmt = db!.prepare('SELECT * FROM agents WHERE id = ?');\n const row = stmt.get(id) as any;\n if (row?.config) row.config = JSON.parse(row.config);\n return row;\n}\n\nexport function getAgents(includesStopped = false) {\n const stmt = db!.prepare(\n includesStopped\n ? 'SELECT * FROM agents ORDER BY created_at DESC'\n : \"SELECT * FROM agents WHERE status != 'stopped' ORDER BY created_at DESC\"\n );\n return stmt.all().map((row: any) => {\n if (row.config) row.config = JSON.parse(row.config);\n return row;\n });\n}\n\nexport function insertLog(log: {\n agentId: string;\n level: string;\n message: string;\n metadata?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agent_logs (agent_id, level, message, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n stmt.run(log.agentId, log.level, log.message, log.metadata ? JSON.stringify(log.metadata) : null);\n}\n\nexport function getLogs(agentId: string, limit = 100) {\n const stmt = db!.prepare(`\n SELECT * FROM agent_logs\n WHERE agent_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `);\n\n return stmt.all(agentId, limit).reverse().map((row: any) => {\n if (row.metadata) row.metadata = JSON.parse(row.metadata);\n return row;\n });\n}\n\nexport function audit(action: string, actor: string | null, targetType: string | null, targetId: string | null, details?: object) {\n const stmt = db!.prepare(`\n INSERT INTO audit_log (action, actor, target_type, target_id, details)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(action, actor, targetType, targetId, details ? JSON.stringify(details) : null);\n}\n","import { EventEmitter } from 'events';\nimport { nanoid } from 'nanoid';\nimport { spawn, ChildProcess } from 'child_process';\nimport treeKill from 'tree-kill';\nimport { join } from 'path';\nimport { mkdirSync, existsSync } from 'fs';\nimport type { Logger } from 'pino';\n\nimport { DirigentConfig, AgentTemplate } from '../config.js';\nimport { insertAgent, updateAgent, getAgent, getAgents, insertLog, getLogs, audit } from '../db/index.js';\n\nexport interface Agent {\n id: string;\n name: string;\n template: string;\n status: 'created' | 'starting' | 'running' | 'idle' | 'stopping' | 'stopped' | 'error';\n workspace?: string;\n model?: string;\n pid?: number;\n process?: ChildProcess;\n currentTask?: string;\n createdAt: number;\n startedAt?: number;\n stoppedAt?: number;\n error?: string;\n}\n\ninterface ManagerOptions {\n dataDir: string;\n config: DirigentConfig;\n logger: Logger;\n}\n\nexport class AgentManager extends EventEmitter {\n private agents: Map<string, Agent> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private dataDir: string;\n private config: DirigentConfig;\n private logger: Logger;\n\n constructor(options: ManagerOptions) {\n super();\n this.dataDir = options.dataDir;\n this.config = options.config;\n this.logger = options.logger;\n\n // Load existing agents from database\n this.loadAgents();\n }\n\n private loadAgents() {\n const dbAgents = getAgents(false);\n for (const dbAgent of dbAgents) {\n // Only load non-running agents; running agents will need to be respawned\n if (dbAgent.status !== 'stopped') {\n this.agents.set(dbAgent.id, {\n id: dbAgent.id,\n name: dbAgent.name,\n template: dbAgent.template,\n status: 'stopped', // Reset to stopped since we restarted\n workspace: dbAgent.workspace,\n model: dbAgent.model,\n createdAt: dbAgent.created_at * 1000,\n });\n\n // Update database\n updateAgent(dbAgent.id, { status: 'stopped' });\n }\n }\n }\n\n async spawn(options: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n }): Promise<Agent> {\n const { template, name, workspace, task, model } = options;\n\n // Get template config\n const templateConfig = this.config.agents.templates[template];\n if (!templateConfig) {\n throw new Error(`Unknown template: ${template}`);\n }\n\n // Check max concurrent\n const runningCount = Array.from(this.agents.values()).filter(\n (a) => a.status === 'running' || a.status === 'starting'\n ).length;\n\n if (runningCount >= this.config.agents.maxConcurrent) {\n throw new Error(`Max concurrent agents (${this.config.agents.maxConcurrent}) reached`);\n }\n\n // Create agent\n const id = nanoid(12);\n const agentName = name || `${template}-${id.slice(0, 6)}`;\n const agentWorkspace = workspace || join(this.dataDir, 'workspaces', id);\n\n // Ensure workspace exists\n if (!existsSync(agentWorkspace)) {\n mkdirSync(agentWorkspace, { recursive: true });\n }\n\n const agent: Agent = {\n id,\n name: agentName,\n template,\n status: 'created',\n workspace: agentWorkspace,\n model: model || templateConfig.model,\n currentTask: task,\n createdAt: Date.now(),\n };\n\n // Save to database\n insertAgent({\n id: agent.id,\n name: agent.name,\n template: agent.template,\n workspace: agent.workspace,\n model: agent.model,\n });\n\n audit('agent.created', null, 'agent', id, { name: agentName, template });\n\n this.agents.set(id, agent);\n this.emit('agent:created', agent);\n\n // Start the agent process\n await this.startAgent(agent, templateConfig, task);\n\n return agent;\n }\n\n private async startAgent(agent: Agent, template: AgentTemplate, initialTask?: string) {\n agent.status = 'starting';\n updateAgent(agent.id, { status: 'starting' });\n this.emit('agent:starting', agent);\n\n try {\n const { command, env } = this.buildCommand(agent, template);\n\n this.logger.info({ agentId: agent.id, command }, 'Starting agent');\n\n const proc = spawn(command[0], command.slice(1), {\n cwd: agent.workspace,\n env: {\n ...process.env,\n ...env,\n DIRIGENT_AGENT_ID: agent.id,\n DIRIGENT_AGENT_NAME: agent.name,\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n agent.pid = proc.pid;\n agent.process = proc;\n agent.status = 'running';\n agent.startedAt = Date.now();\n\n updateAgent(agent.id, {\n status: 'running',\n pid: proc.pid,\n started_at: Math.floor(Date.now() / 1000),\n });\n\n this.processes.set(agent.id, proc);\n\n // Handle stdout\n proc.stdout?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'info', message);\n }\n });\n\n // Handle stderr\n proc.stderr?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'error', message);\n }\n });\n\n // Handle exit\n proc.on('exit', (code, signal) => {\n this.logger.info({ agentId: agent.id, code, signal }, 'Agent exited');\n\n agent.status = code === 0 ? 'stopped' : 'error';\n agent.stoppedAt = Date.now();\n if (code !== 0) {\n agent.error = `Exited with code ${code}`;\n }\n\n updateAgent(agent.id, {\n status: agent.status,\n stopped_at: Math.floor(Date.now() / 1000),\n error: agent.error || null,\n });\n\n this.processes.delete(agent.id);\n this.emit('agent:stopped', agent);\n\n audit('agent.stopped', null, 'agent', agent.id, { code, signal });\n });\n\n proc.on('error', (err) => {\n this.logger.error({ agentId: agent.id, err }, 'Agent process error');\n agent.status = 'error';\n agent.error = err.message;\n\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n });\n\n this.emit('agent:running', agent);\n audit('agent.started', null, 'agent', agent.id, { pid: proc.pid });\n\n // Send initial task if provided\n if (initialTask && proc.stdin) {\n proc.stdin.write(initialTask + '\\n');\n }\n } catch (err: any) {\n agent.status = 'error';\n agent.error = err.message;\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n throw err;\n }\n }\n\n private buildCommand(agent: Agent, template: AgentTemplate): { command: string[]; env: Record<string, string> } {\n const env: Record<string, string> = { ...template.env };\n\n switch (template.driver) {\n case 'claude-code':\n return {\n command: ['claude', '--dangerously-skip-permissions'],\n env: {\n ...env,\n ANTHROPIC_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'codex':\n return {\n command: ['codex', '--model', agent.model || template.model || 'codex-1'],\n env,\n };\n\n case 'clawdbot':\n return {\n command: ['clawdbot', 'agent', '--headless'],\n env: {\n ...env,\n CLAWDBOT_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'subprocess':\n if (!template.command || template.command.length === 0) {\n throw new Error('subprocess driver requires command');\n }\n return { command: template.command, env };\n\n default:\n throw new Error(`Unknown driver: ${template.driver}`);\n }\n }\n\n async stop(id: string, force = false): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running' && agent.status !== 'starting') {\n return;\n }\n\n agent.status = 'stopping';\n this.emit('agent:stopping', agent);\n\n const proc = this.processes.get(id);\n if (proc && proc.pid) {\n await new Promise<void>((resolve, reject) => {\n treeKill(proc.pid!, force ? 'SIGKILL' : 'SIGTERM', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n audit('agent.stop_requested', null, 'agent', id, { force });\n }\n\n async stopAll(): Promise<void> {\n const promises = Array.from(this.agents.values())\n .filter((a) => a.status === 'running' || a.status === 'starting')\n .map((a) => this.stop(a.id, true));\n\n await Promise.allSettled(promises);\n }\n\n async send(id: string, message: string): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running') {\n throw new Error(`Agent is not running: ${agent.status}`);\n }\n\n const proc = this.processes.get(id);\n if (!proc || !proc.stdin) {\n throw new Error('Agent process not available');\n }\n\n proc.stdin.write(message + '\\n');\n this.log(id, 'info', `[USER] ${message}`);\n\n audit('agent.message_sent', null, 'agent', id, { length: message.length });\n }\n\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n list(includeStopped = false): Agent[] {\n const agents = Array.from(this.agents.values());\n if (includeStopped) return agents;\n return agents.filter((a) => a.status !== 'stopped');\n }\n\n log(agentId: string, level: string, message: string) {\n insertLog({ agentId, level, message });\n this.emit('agent:log', { agentId, level, message, timestamp: Date.now() });\n }\n\n getLogs(agentId: string, limit = 100) {\n return getLogs(agentId, limit);\n }\n\n getStats() {\n const agents = Array.from(this.agents.values());\n return {\n total: agents.length,\n running: agents.filter((a) => a.status === 'running').length,\n idle: agents.filter((a) => a.status === 'idle').length,\n stopped: agents.filter((a) => a.status === 'stopped').length,\n error: agents.filter((a) => a.status === 'error').length,\n };\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\nimport { getAgents, audit } from '../db/index.js';\n\ninterface RouteOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n startTime: number;\n}\n\nexport function registerApiRoutes(server: FastifyInstance, options: RouteOptions) {\n const { config, agentManager, startTime } = options;\n\n // Auth middleware\n server.addHook('onRequest', async (request, reply) => {\n // Skip auth for health check\n if (request.url === '/health') return;\n\n // Skip auth for dashboard routes\n if (!request.url.startsWith('/api')) return;\n\n if (config.auth.enabled) {\n const authHeader = request.headers.authorization;\n const token = authHeader?.replace('Bearer ', '');\n\n if (!token || !validateAuth(token, config)) {\n reply.code(401).send({ error: 'Unauthorized' });\n return;\n }\n }\n });\n\n // Status\n server.get('/api/status', async () => {\n const stats = agentManager.getStats();\n const agents = agentManager.list(false);\n\n return {\n status: 'ok',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n agents: {\n ...stats,\n list: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n currentTask: a.currentTask,\n })),\n },\n };\n });\n\n // List agents\n server.get<{ Querystring: { all?: string } }>('/api/agents', async (request) => {\n const includeStopped = request.query.all === 'true';\n const agents = agentManager.list(includeStopped);\n\n return {\n agents: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n model: a.model,\n pid: a.pid,\n currentTask: a.currentTask,\n createdAt: a.createdAt,\n startedAt: a.startedAt,\n stoppedAt: a.stoppedAt,\n error: a.error,\n })),\n };\n });\n\n // Spawn agent\n server.post<{\n Body: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n };\n }>('/api/agents', async (request, reply) => {\n const { template, name, workspace, task, model } = request.body;\n\n if (!template) {\n reply.code(400).send({ error: 'template is required' });\n return;\n }\n\n try {\n const agent = await agentManager.spawn({ template, name, workspace, task, model });\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n },\n };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n });\n\n // Get agent\n server.get<{ Params: { id: string } }>('/api/agents/:id', async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n },\n };\n });\n\n // Stop agent\n server.delete<{ Params: { id: string }; Querystring: { force?: string } }>(\n '/api/agents/:id',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const force = request.query.force === 'true';\n\n try {\n await agentManager.stop(request.params.id, force);\n return { ok: true };\n } catch (err: any) {\n reply.code(500).send({ error: err.message });\n }\n }\n );\n\n // Send message to agent\n server.post<{ Params: { id: string }; Body: { message: string } }>(\n '/api/agents/:id/send',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const { message } = request.body;\n\n if (!message) {\n reply.code(400).send({ error: 'message is required' });\n return;\n }\n\n try {\n await agentManager.send(request.params.id, message);\n return { ok: true };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n }\n );\n\n // Get agent logs\n server.get<{ Params: { id: string }; Querystring: { lines?: string } }>(\n '/api/agents/:id/logs',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const limit = parseInt(request.query.lines || '100');\n const logs = agentManager.getLogs(request.params.id, limit);\n\n return { logs };\n }\n );\n\n // Templates\n server.get('/api/templates', async () => {\n return {\n templates: Object.entries(config.agents.templates).map(([name, template]) => ({\n name,\n driver: template.driver,\n model: template.model,\n })),\n };\n });\n\n // Audit log\n server.get<{ Querystring: { limit?: string } }>('/api/audit', async (request) => {\n // TODO: Implement audit log retrieval\n return { logs: [] };\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\n\ninterface WSOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n}\n\ninterface Client {\n ws: WebSocket;\n subscriptions: Set<string>;\n authenticated: boolean;\n}\n\nexport function registerWebSocket(server: FastifyInstance, options: WSOptions) {\n const { config, agentManager } = options;\n const clients: Map<string, Client> = new Map();\n\n // WebSocket route\n server.register(async (fastify) => {\n fastify.get('/ws', { websocket: true }, (connection, req) => {\n const ws = connection;\n const clientId = Math.random().toString(36).slice(2);\n\n const client: Client = {\n ws,\n subscriptions: new Set(),\n authenticated: !config.auth.enabled,\n };\n\n clients.set(clientId, client);\n\n ws.on('message', (data) => {\n try {\n const msg = JSON.parse(data.toString());\n handleMessage(clientId, client, msg);\n } catch (err) {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n }\n });\n\n ws.on('close', () => {\n clients.delete(clientId);\n });\n\n ws.on('error', (err) => {\n console.error('WebSocket error:', err);\n clients.delete(clientId);\n });\n\n // Send welcome\n send(ws, {\n type: 'welcome',\n clientId,\n authenticated: client.authenticated,\n });\n });\n });\n\n function handleMessage(clientId: string, client: Client, msg: any) {\n // Auth\n if (msg.type === 'auth') {\n if (validateAuth(msg.token, config)) {\n client.authenticated = true;\n send(client.ws, { type: 'auth', success: true });\n } else {\n send(client.ws, { type: 'auth', success: false, error: 'Invalid token' });\n }\n return;\n }\n\n // Require auth for other messages\n if (!client.authenticated) {\n send(client.ws, { type: 'error', error: 'Not authenticated' });\n return;\n }\n\n switch (msg.type) {\n case 'subscribe:logs':\n if (msg.agentId) {\n client.subscriptions.add(`logs:${msg.agentId}`);\n send(client.ws, { type: 'subscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'unsubscribe:logs':\n if (msg.agentId) {\n client.subscriptions.delete(`logs:${msg.agentId}`);\n send(client.ws, { type: 'unsubscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'subscribe:agents':\n client.subscriptions.add('agents');\n send(client.ws, { type: 'subscribed', channel: 'agents' });\n break;\n\n case 'unsubscribe:agents':\n client.subscriptions.delete('agents');\n send(client.ws, { type: 'unsubscribed', channel: 'agents' });\n break;\n\n case 'ping':\n send(client.ws, { type: 'pong', ts: Date.now() });\n break;\n\n default:\n send(client.ws, { type: 'error', error: `Unknown message type: ${msg.type}` });\n }\n }\n\n // Agent event handlers\n agentManager.on('agent:created', (agent) => {\n broadcast('agents', { type: 'agent:created', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:running', (agent) => {\n broadcast('agents', { type: 'agent:running', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:stopped', (agent) => {\n broadcast('agents', { type: 'agent:stopped', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:error', (agent, error) => {\n broadcast('agents', { type: 'agent:error', agent: sanitizeAgent(agent), error: error.message });\n });\n\n agentManager.on('agent:log', (data) => {\n broadcast(`logs:${data.agentId}`, { type: 'agent:log', ...data });\n });\n\n function broadcast(channel: string, message: object) {\n for (const client of clients.values()) {\n if (client.authenticated && client.subscriptions.has(channel)) {\n send(client.ws, message);\n }\n }\n }\n\n function send(ws: WebSocket, message: object) {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(message));\n }\n }\n\n function sanitizeAgent(agent: any) {\n return {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n };\n }\n}\n","import Fastify from 'fastify';\nimport fastifyWebsocket from '@fastify/websocket';\nimport fastifyCors from '@fastify/cors';\nimport fastifyStatic from '@fastify/static';\nimport pino from 'pino';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\n\nimport { loadConfig, DirigentConfig } from './config.js';\nimport { initDatabase, getDatabase } from './db/index.js';\nimport { AgentManager } from './agents/manager.js';\nimport { registerApiRoutes } from './api/routes.js';\nimport { registerWebSocket } from './ws/index.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ServerOptions {\n port: number;\n configPath: string;\n dataDir: string;\n}\n\nlet server: ReturnType<typeof Fastify> | null = null;\nlet agentManager: AgentManager | null = null;\nconst startTime = Date.now();\n\nexport async function startServer(options: ServerOptions) {\n const config = loadConfig(options.configPath);\n\n // Setup logging\n const logPath = join(options.dataDir, 'logs', 'dirigent.log');\n mkdirSync(dirname(logPath), { recursive: true });\n\n const logger = pino({\n level: config.logging?.level || 'info',\n transport: {\n targets: [\n {\n target: 'pino-pretty',\n options: { colorize: true },\n level: 'info',\n },\n {\n target: 'pino/file',\n options: { destination: logPath },\n level: 'debug',\n },\n ],\n },\n });\n\n // Initialize database\n const dbPath = join(options.dataDir, 'data', 'dirigent.db');\n mkdirSync(dirname(dbPath), { recursive: true });\n initDatabase(dbPath);\n\n // Create Fastify server\n server = Fastify({ loggerInstance: logger });\n\n // Register plugins\n await server.register(fastifyCors, {\n origin: true,\n credentials: true,\n });\n\n await server.register(fastifyWebsocket);\n\n // Serve dashboard static files\n const dashboardPath = join(__dirname, '..', 'dashboard', 'dist');\n if (existsSync(dashboardPath)) {\n await server.register(fastifyStatic, {\n root: dashboardPath,\n prefix: '/',\n });\n }\n\n // Initialize agent manager\n agentManager = new AgentManager({\n dataDir: options.dataDir,\n config,\n logger,\n });\n\n // Register API routes\n registerApiRoutes(server, {\n config,\n agentManager,\n startTime,\n });\n\n // Register WebSocket handlers\n registerWebSocket(server, {\n config,\n agentManager,\n });\n\n // Health check\n server.get('/health', async () => ({ status: 'ok', uptime: Math.floor((Date.now() - startTime) / 1000) }));\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n // Stop all agents\n if (agentManager) {\n await agentManager.stopAll();\n }\n\n // Close server\n if (server) {\n await server.close();\n }\n\n // Close database\n const db = getDatabase();\n if (db) db.close();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Start server\n try {\n await server.listen({ port: options.port, host: config.server?.host || '0.0.0.0' });\n\n console.log(`\n╔══════════════════════════════════════════════════════════╗\n║ ║\n║ 🎭 DIRIGENT SERVER RUNNING ║\n║ ║\n║ Dashboard: http://localhost:${options.port.toString().padEnd(25)}║\n║ API: http://localhost:${options.port}/api${' '.repeat(21)}║\n║ WebSocket: ws://localhost:${options.port}/ws${' '.repeat(22)}║\n║ ║\n╚══════════════════════════════════════════════════════════╝\n`);\n } catch (err) {\n logger.error(err);\n process.exit(1);\n }\n}\n\n// Export for direct invocation\nif (process.env.DIRIGENT_CONFIG) {\n startServer({\n port: parseInt(process.env.DIRIGENT_PORT || '3000'),\n configPath: process.env.DIRIGENT_CONFIG,\n dataDir: process.env.DIRIGENT_DATA_DIR || '.dirigent',\n });\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport boxen from 'boxen';\nimport { initCommand } from './commands/init.js';\nimport { upCommand } from './commands/up.js';\nimport { downCommand } from './commands/down.js';\nimport { statusCommand } from './commands/status.js';\nimport { agentCommand } from './commands/agent.js';\nimport { logsCommand } from './commands/logs.js';\nimport { configCommand } from './commands/config.js';\n\nconst version = '0.1.0';\n\nconst program = new Command();\n\nconst banner = `\n${chalk.bold.cyan('╔══════════════════════════════════════╗')}\n${chalk.bold.cyan('║')} ${chalk.bold.white('🎭 DIRIGENT')} ${chalk.bold.cyan('║')}\n${chalk.bold.cyan('║')} ${chalk.dim('AI Agent Orchestration Platform')} ${chalk.bold.cyan('║')}\n${chalk.bold.cyan('╚══════════════════════════════════════╝')}\n`;\n\nprogram\n .name('dirigent')\n .description('AI Agent Orchestration Platform - Enterprise-grade orchestration for AI coding agents')\n .version(version)\n .addHelpText('beforeAll', banner);\n\n// Core commands\nprogram\n .command('init')\n .description('Initialize a new Dirigent workspace')\n .option('-y, --yes', 'Accept all defaults')\n .option('--port <port>', 'Server port', '3000')\n .option('--data-dir <dir>', 'Data directory', '.dirigent')\n .action(initCommand);\n\nprogram\n .command('up')\n .description('Start the Dirigent server')\n .option('-d, --detach', 'Run in background')\n .option('--port <port>', 'Override server port')\n .action(upCommand);\n\nprogram\n .command('down')\n .description('Stop the Dirigent server')\n .option('-f, --force', 'Force stop all agents')\n .action(downCommand);\n\nprogram\n .command('status')\n .description('Show server and agent status')\n .option('-j, --json', 'Output as JSON')\n .action(statusCommand);\n\n// Agent management\nconst agent = program\n .command('agent')\n .description('Manage agents');\n\nagent\n .command('list')\n .description('List all agents')\n .option('-a, --all', 'Include stopped agents')\n .option('-j, --json', 'Output as JSON')\n .action((opts) => agentCommand('list', opts));\n\nagent\n .command('spawn <template>')\n .description('Spawn a new agent from template')\n .option('-n, --name <name>', 'Agent name')\n .option('-w, --workspace <path>', 'Workspace directory')\n .option('-t, --task <task>', 'Initial task')\n .option('--model <model>', 'Model override')\n .action((template, opts) => agentCommand('spawn', { template, ...opts }));\n\nagent\n .command('stop <id>')\n .description('Stop an agent')\n .option('-f, --force', 'Force stop')\n .action((id, opts) => agentCommand('stop', { id, ...opts }));\n\nagent\n .command('send <id> <message>')\n .description('Send a message to an agent')\n .action((id, message) => agentCommand('send', { id, message }));\n\nagent\n .command('logs <id>')\n .description('Stream agent logs')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --lines <n>', 'Number of lines', '50')\n .action((id, opts) => agentCommand('logs', { id, ...opts }));\n\n// Logs\nprogram\n .command('logs')\n .description('View server logs')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --lines <n>', 'Number of lines', '100')\n .action(logsCommand);\n\n// Config\nprogram\n .command('config')\n .description('View or edit configuration')\n .option('--get <key>', 'Get a config value')\n .option('--set <key=value>', 'Set a config value')\n .option('--list', 'List all config')\n .option('--edit', 'Open config in editor')\n .action(configCommand);\n\n// Dashboard shortcut\nprogram\n .command('dashboard')\n .alias('ui')\n .description('Open the web dashboard')\n .option('-p, --port <port>', 'Dashboard port')\n .action(async () => {\n const config = await import('../server/config.js').then(m => m.loadConfig());\n console.log(chalk.cyan(`\\n🌐 Dashboard: ${chalk.bold(`http://localhost:${config.server.port}`)}\\n`));\n });\n\n// Parse and run\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n console.log(banner);\n program.outputHelp();\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { nanoid } from 'nanoid';\n\nasync function prompt(question: string, defaultValue?: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n const q = defaultValue ? `${question} (${defaultValue}): ` : `${question}: `;\n rl.question(q, (answer) => {\n rl.close();\n resolve(answer || defaultValue || '');\n });\n });\n}\n\nasync function confirm(question: string, defaultValue = true): Promise<boolean> {\n const answer = await prompt(`${question} (${defaultValue ? 'Y/n' : 'y/N'})`, defaultValue ? 'y' : 'n');\n return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n}\n\ninterface InitOptions {\n yes?: boolean;\n port?: string;\n dataDir?: string;\n}\n\nconst DEFAULT_CONFIG = {\n version: '1',\n server: {\n port: 3000,\n host: '0.0.0.0',\n },\n auth: {\n enabled: true,\n adminToken: '', // Generated during init\n },\n agents: {\n maxConcurrent: 10,\n defaultTimeout: 3600,\n templates: {\n claude: {\n driver: 'claude-code',\n model: 'claude-sonnet-4-5',\n maxTokens: 16000,\n },\n codex: {\n driver: 'codex',\n model: 'codex-1',\n },\n custom: {\n driver: 'subprocess',\n command: [],\n },\n },\n },\n logging: {\n level: 'info',\n format: 'pretty',\n file: 'logs/dirigent.log',\n },\n database: {\n path: 'data/dirigent.db',\n },\n};\n\nexport async function initCommand(options: InitOptions) {\n console.log(chalk.cyan('\\n🎭 Initializing Dirigent workspace\\n'));\n\n const dataDir = options.dataDir || '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n\n // Check if already initialized\n if (existsSync(configPath)) {\n const overwrite = options.yes ? true : await confirm('Dirigent is already initialized. Overwrite config?', false);\n if (!overwrite) {\n console.log(chalk.yellow('Aborted.'));\n return;\n }\n }\n\n // Gather config\n let config = { ...DEFAULT_CONFIG };\n\n if (!options.yes) {\n const portStr = await prompt('Server port', options.port || '3000');\n const authEnabled = await confirm('Enable authentication?', true);\n const maxAgentsStr = await prompt('Max concurrent agents', '10');\n\n config.server.port = parseInt(portStr) || 3000;\n config.auth.enabled = authEnabled;\n config.agents.maxConcurrent = parseInt(maxAgentsStr) || 10;\n } else {\n config.server.port = parseInt(options.port || '3000');\n }\n\n // Generate admin token\n config.auth.adminToken = nanoid(32);\n\n const spinner = ora('Creating workspace...').start();\n\n try {\n // Create directories\n const dirs = [\n dataDir,\n join(dataDir, 'data'),\n join(dataDir, 'logs'),\n join(dataDir, 'agents'),\n join(dataDir, 'workspaces'),\n ];\n\n for (const dir of dirs) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Write config\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n\n // Create .gitignore\n writeFileSync(\n join(dataDir, '.gitignore'),\n `# Dirigent data\ndata/\nlogs/\nagents/\nworkspaces/\n*.db\n*.db-journal\n`\n );\n\n spinner.succeed('Workspace created');\n\n console.log(chalk.green('\\n✅ Dirigent initialized successfully!\\n'));\n console.log(chalk.dim('Configuration:'));\n console.log(` ${chalk.cyan('Config:')} ${configPath}`);\n console.log(` ${chalk.cyan('Port:')} ${config.server.port}`);\n console.log(` ${chalk.cyan('Auth:')} ${config.auth.enabled ? 'Enabled' : 'Disabled'}`);\n\n if (config.auth.enabled) {\n console.log(chalk.yellow('\\n⚠️ Save your admin token (shown only once):'));\n console.log(chalk.bold.white(` ${config.auth.adminToken}\\n`));\n }\n\n console.log(chalk.dim('Next steps:'));\n console.log(` ${chalk.cyan('1.')} Start the server: ${chalk.bold('dirigent up')}`);\n console.log(` ${chalk.cyan('2.')} Open dashboard: ${chalk.bold(`http://localhost:${config.server.port}`)}`);\n console.log(` ${chalk.cyan('3.')} Spawn an agent: ${chalk.bold('dirigent agent spawn claude')}\\n`);\n } catch (err) {\n spinner.fail('Failed to create workspace');\n console.error(chalk.red(err));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { spawn } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport { dirname } from 'path';\n\ninterface UpOptions {\n detach?: boolean;\n port?: string;\n}\n\nexport async function upCommand(options: UpOptions) {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n const pidPath = join(process.cwd(), dataDir, 'dirigent.pid');\n\n // Check if initialized\n if (!existsSync(configPath)) {\n console.log(chalk.red('\\n❌ Dirigent not initialized. Run `dirigent init` first.\\n'));\n process.exit(1);\n }\n\n // Check if already running\n if (existsSync(pidPath)) {\n const pid = parseInt(readFileSync(pidPath, 'utf-8').trim());\n try {\n process.kill(pid, 0);\n console.log(chalk.yellow(`\\n⚠️ Dirigent is already running (PID: ${pid})`));\n console.log(chalk.dim(' Use `dirigent down` to stop it first.\\n'));\n return;\n } catch {\n // Process not running, remove stale PID file\n }\n }\n\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n const port = options.port || config.server.port;\n\n console.log(chalk.cyan('\\n🎭 Starting Dirigent server...\\n'));\n\n const spinner = ora('Starting server...').start();\n\n try {\n // Get the path to the server entry point\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const serverPath = join(__dirname, '..', '..', 'server', 'index.js');\n\n const env = {\n ...process.env,\n DIRIGENT_PORT: port.toString(),\n DIRIGENT_CONFIG: configPath,\n DIRIGENT_DATA_DIR: join(process.cwd(), dataDir),\n };\n\n if (options.detach) {\n // Run in background\n const child = spawn(process.execPath, [serverPath], {\n detached: true,\n stdio: 'ignore',\n env,\n });\n\n child.unref();\n writeFileSync(pidPath, child.pid!.toString());\n\n spinner.succeed(`Server started (PID: ${child.pid})`);\n console.log(chalk.green(`\\n✅ Dirigent is running\\n`));\n console.log(` ${chalk.cyan('Dashboard:')} http://localhost:${port}`);\n console.log(` ${chalk.cyan('API:')} http://localhost:${port}/api`);\n console.log(` ${chalk.cyan('WebSocket:')} ws://localhost:${port}/ws\\n`);\n console.log(chalk.dim(` Stop with: dirigent down\\n`));\n } else {\n // Run in foreground\n spinner.succeed('Server starting...');\n\n const { startServer } = await import('../../server/index.js');\n await startServer({\n port: parseInt(port),\n configPath,\n dataDir: join(process.cwd(), dataDir),\n });\n }\n } catch (err) {\n spinner.fail('Failed to start server');\n console.error(chalk.red(err));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync, unlinkSync } from 'fs';\nimport { join } from 'path';\nimport treeKill from 'tree-kill';\n\ninterface DownOptions {\n force?: boolean;\n}\n\nexport async function downCommand(options: DownOptions) {\n const dataDir = '.dirigent';\n const pidPath = join(process.cwd(), dataDir, 'dirigent.pid');\n\n if (!existsSync(pidPath)) {\n console.log(chalk.yellow('\\n⚠️ Dirigent is not running.\\n'));\n return;\n }\n\n const pid = parseInt(readFileSync(pidPath, 'utf-8').trim());\n const spinner = ora('Stopping Dirigent...').start();\n\n try {\n // Check if process is running\n try {\n process.kill(pid, 0);\n } catch {\n spinner.warn('Dirigent was not running (stale PID file)');\n unlinkSync(pidPath);\n return;\n }\n\n // Stop the server (and all child agents)\n await new Promise<void>((resolve, reject) => {\n const signal = options.force ? 'SIGKILL' : 'SIGTERM';\n treeKill(pid, signal, (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n\n // Remove PID file\n unlinkSync(pidPath);\n\n spinner.succeed('Dirigent stopped');\n console.log(chalk.green('\\n✅ Dirigent has been stopped.\\n'));\n } catch (err) {\n spinner.fail('Failed to stop Dirigent');\n console.error(chalk.red(err));\n \n if (options.force) {\n // Force remove PID file\n try {\n unlinkSync(pidPath);\n } catch {}\n }\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport boxen from 'boxen';\n\ninterface StatusOptions {\n json?: boolean;\n}\n\nexport async function statusCommand(options: StatusOptions) {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n const pidPath = join(process.cwd(), dataDir, 'dirigent.pid');\n\n // Check if initialized\n if (!existsSync(configPath)) {\n if (options.json) {\n console.log(JSON.stringify({ initialized: false, running: false }));\n } else {\n console.log(chalk.yellow('\\n⚠️ Dirigent not initialized. Run `dirigent init` first.\\n'));\n }\n return;\n }\n\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n let running = false;\n let pid: number | null = null;\n let serverStatus: any = null;\n\n // Check if running\n if (existsSync(pidPath)) {\n pid = parseInt(readFileSync(pidPath, 'utf-8').trim());\n try {\n process.kill(pid, 0);\n running = true;\n\n // Try to get server status via API\n try {\n const res = await fetch(`http://localhost:${config.server.port}/api/status`);\n if (res.ok) {\n serverStatus = await res.json();\n }\n } catch {\n // Server might be starting up\n }\n } catch {\n running = false;\n }\n }\n\n if (options.json) {\n console.log(\n JSON.stringify({\n initialized: true,\n running,\n pid,\n port: config.server.port,\n agents: serverStatus?.agents || [],\n uptime: serverStatus?.uptime || null,\n })\n );\n return;\n }\n\n // Pretty output\n const statusIcon = running ? chalk.green('●') : chalk.red('●');\n const statusText = running ? chalk.green('Running') : chalk.red('Stopped');\n\n console.log(\n boxen(\n `${chalk.bold.white('🎭 DIRIGENT STATUS')}\\n\\n` +\n `${chalk.dim('Status:')} ${statusIcon} ${statusText}${pid ? chalk.dim(` (PID: ${pid})`) : ''}\\n` +\n `${chalk.dim('Port:')} ${config.server.port}\\n` +\n `${chalk.dim('Auth:')} ${config.auth.enabled ? 'Enabled' : 'Disabled'}\\n` +\n (serverStatus\n ? `${chalk.dim('Uptime:')} ${formatUptime(serverStatus.uptime)}\\n` +\n `${chalk.dim('Agents:')} ${serverStatus.agents.running}/${serverStatus.agents.total} running`\n : ''),\n {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: running ? 'green' : 'red',\n }\n )\n );\n\n if (running && serverStatus?.agents?.list?.length > 0) {\n console.log(chalk.dim('\\nActive Agents:\\n'));\n for (const agent of serverStatus.agents.list) {\n const agentIcon = agent.status === 'running' ? chalk.green('●') : chalk.yellow('●');\n console.log(` ${agentIcon} ${chalk.bold(agent.name)} ${chalk.dim(`(${agent.id})`)}`);\n console.log(` ${chalk.dim('Template:')} ${agent.template}`);\n console.log(` ${chalk.dim('Workspace:')} ${agent.workspace}`);\n console.log('');\n }\n }\n\n if (!running) {\n console.log(chalk.dim(`\\n Start with: ${chalk.cyan('dirigent up')}\\n`));\n }\n}\n\nfunction formatUptime(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return `${h}h ${m}m`;\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\ninterface AgentOptions {\n template?: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n id?: string;\n message?: string;\n force?: boolean;\n follow?: boolean;\n lines?: string;\n all?: boolean;\n json?: boolean;\n}\n\nasync function getConfig() {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n\n if (!existsSync(configPath)) {\n console.log(chalk.red('\\n❌ Dirigent not initialized. Run `dirigent init` first.\\n'));\n process.exit(1);\n }\n\n return JSON.parse(readFileSync(configPath, 'utf-8'));\n}\n\nasync function apiCall(\n method: string,\n path: string,\n body?: any\n): Promise<any> {\n const config = await getConfig();\n const url = `http://localhost:${config.server.port}/api${path}`;\n\n const res = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.auth.adminToken}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ error: res.statusText }));\n throw new Error(error.error || error.message || 'API call failed');\n }\n\n return res.json();\n}\n\nexport async function agentCommand(action: string, options: AgentOptions) {\n switch (action) {\n case 'list':\n await listAgents(options);\n break;\n case 'spawn':\n await spawnAgent(options);\n break;\n case 'stop':\n await stopAgent(options);\n break;\n case 'send':\n await sendToAgent(options);\n break;\n case 'logs':\n await agentLogs(options);\n break;\n default:\n console.log(chalk.red(`Unknown action: ${action}`));\n }\n}\n\nasync function listAgents(options: AgentOptions) {\n try {\n const result = await apiCall('GET', `/agents${options.all ? '?all=true' : ''}`);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.agents.length === 0) {\n console.log(chalk.yellow('\\nNo agents found.\\n'));\n console.log(chalk.dim(' Spawn one with: dirigent agent spawn claude\\n'));\n return;\n }\n\n console.log(chalk.cyan('\\n🤖 Agents\\n'));\n\n for (const agent of result.agents) {\n const icon =\n agent.status === 'running'\n ? chalk.green('●')\n : agent.status === 'idle'\n ? chalk.yellow('●')\n : chalk.red('●');\n\n console.log(`${icon} ${chalk.bold(agent.name)} ${chalk.dim(`[${agent.id}]`)}`);\n console.log(` ${chalk.dim('Template:')} ${agent.template}`);\n console.log(` ${chalk.dim('Status:')} ${agent.status}`);\n console.log(` ${chalk.dim('Workspace:')} ${agent.workspace || 'N/A'}`);\n if (agent.currentTask) {\n console.log(` ${chalk.dim('Task:')} ${agent.currentTask.substring(0, 60)}...`);\n }\n console.log('');\n }\n } catch (err: any) {\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n console.log(chalk.dim(' Make sure Dirigent is running: dirigent up\\n'));\n }\n}\n\nasync function spawnAgent(options: AgentOptions) {\n const spinner = ora('Spawning agent...').start();\n\n try {\n const result = await apiCall('POST', '/agents', {\n template: options.template,\n name: options.name,\n workspace: options.workspace,\n task: options.task,\n model: options.model,\n });\n\n spinner.succeed(`Agent spawned: ${chalk.bold(result.agent.name)}`);\n console.log(`\\n ${chalk.dim('ID:')} ${result.agent.id}`);\n console.log(` ${chalk.dim('Template:')} ${result.agent.template}`);\n console.log(` ${chalk.dim('Workspace:')} ${result.agent.workspace}`);\n\n if (options.task) {\n console.log(` ${chalk.dim('Task:')} ${options.task.substring(0, 60)}...`);\n }\n\n console.log(chalk.dim(`\\n View logs: dirigent agent logs ${result.agent.id}\\n`));\n } catch (err: any) {\n spinner.fail('Failed to spawn agent');\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n}\n\nasync function stopAgent(options: AgentOptions) {\n const spinner = ora('Stopping agent...').start();\n\n try {\n await apiCall('DELETE', `/agents/${options.id}${options.force ? '?force=true' : ''}`);\n spinner.succeed(`Agent stopped: ${options.id}`);\n } catch (err: any) {\n spinner.fail('Failed to stop agent');\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n}\n\nasync function sendToAgent(options: AgentOptions) {\n try {\n const result = await apiCall('POST', `/agents/${options.id}/send`, {\n message: options.message,\n });\n\n console.log(chalk.green(`\\n✉️ Message sent to agent ${options.id}\\n`));\n\n if (result.response) {\n console.log(chalk.dim('Response:'));\n console.log(result.response);\n }\n } catch (err: any) {\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n}\n\nasync function agentLogs(options: AgentOptions) {\n const config = await getConfig();\n\n if (options.follow) {\n // Stream logs via WebSocket\n const { io } = await import('socket.io-client');\n const socket = io(`http://localhost:${config.server.port}`, {\n auth: { token: config.auth.adminToken },\n });\n\n socket.on('connect', () => {\n socket.emit('subscribe:logs', { agentId: options.id });\n console.log(chalk.dim(`\\nStreaming logs for agent ${options.id}...\\n`));\n });\n\n socket.on('agent:log', (data) => {\n const timestamp = chalk.dim(new Date(data.timestamp).toISOString().split('T')[1].slice(0, 8));\n const level =\n data.level === 'error'\n ? chalk.red('ERR')\n : data.level === 'warn'\n ? chalk.yellow('WRN')\n : chalk.blue('INF');\n console.log(`${timestamp} ${level} ${data.message}`);\n });\n\n socket.on('disconnect', () => {\n console.log(chalk.dim('\\nDisconnected.\\n'));\n process.exit(0);\n });\n\n // Handle Ctrl+C\n process.on('SIGINT', () => {\n socket.disconnect();\n });\n } else {\n // Fetch recent logs\n try {\n const result = await apiCall(\n 'GET',\n `/agents/${options.id}/logs?lines=${options.lines || 50}`\n );\n\n console.log(chalk.dim(`\\nLogs for agent ${options.id}:\\n`));\n\n for (const log of result.logs) {\n const timestamp = chalk.dim(new Date(log.timestamp).toISOString().split('T')[1].slice(0, 8));\n const level =\n log.level === 'error'\n ? chalk.red('ERR')\n : log.level === 'warn'\n ? chalk.yellow('WRN')\n : chalk.blue('INF');\n console.log(`${timestamp} ${level} ${log.message}`);\n }\n\n console.log(chalk.dim(`\\n Stream with: dirigent agent logs ${options.id} -f\\n`));\n } catch (err: any) {\n console.log(chalk.red(`\\n❌ ${err.message}\\n`));\n }\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync, createReadStream } from 'fs';\nimport { join } from 'path';\nimport { createInterface } from 'readline';\n\ninterface LogsOptions {\n follow?: boolean;\n lines?: string;\n}\n\nexport async function logsCommand(options: LogsOptions) {\n const dataDir = '.dirigent';\n const logPath = join(process.cwd(), dataDir, 'logs', 'dirigent.log');\n\n if (!existsSync(logPath)) {\n console.log(chalk.yellow('\\n⚠️ No logs found.\\n'));\n return;\n }\n\n const lines = parseInt(options.lines || '100');\n\n if (options.follow) {\n // Use tail -f approach\n const { spawn } = await import('child_process');\n const tail = spawn('tail', ['-f', '-n', lines.toString(), logPath], {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n tail.stdout.on('data', (data) => {\n process.stdout.write(formatLog(data.toString()));\n });\n\n tail.stderr.on('data', (data) => {\n process.stderr.write(data);\n });\n\n process.on('SIGINT', () => {\n tail.kill();\n process.exit(0);\n });\n } else {\n // Read last N lines\n const content = readFileSync(logPath, 'utf-8');\n const allLines = content.trim().split('\\n');\n const lastLines = allLines.slice(-lines);\n\n for (const line of lastLines) {\n console.log(formatLog(line));\n }\n\n console.log(chalk.dim(`\\n Stream with: dirigent logs -f\\n`));\n }\n}\n\nfunction formatLog(line: string): string {\n try {\n // Try to parse as JSON (pino format)\n const parsed = JSON.parse(line);\n const time = chalk.dim(\n new Date(parsed.time).toISOString().split('T')[1].slice(0, 8)\n );\n const level =\n parsed.level <= 20\n ? chalk.dim('DBG')\n : parsed.level <= 30\n ? chalk.blue('INF')\n : parsed.level <= 40\n ? chalk.yellow('WRN')\n : chalk.red('ERR');\n const msg = parsed.msg || '';\n return `${time} ${level} ${msg}`;\n } catch {\n // Return as-is if not JSON\n return line;\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { spawn } from 'child_process';\n\ninterface ConfigOptions {\n get?: string;\n set?: string;\n list?: boolean;\n edit?: boolean;\n}\n\nexport async function configCommand(options: ConfigOptions) {\n const dataDir = '.dirigent';\n const configPath = join(process.cwd(), dataDir, 'config.json');\n\n if (!existsSync(configPath)) {\n console.log(chalk.red('\\n❌ Dirigent not initialized. Run `dirigent init` first.\\n'));\n process.exit(1);\n }\n\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n\n if (options.get) {\n const value = getNestedValue(config, options.get);\n if (value === undefined) {\n console.log(chalk.yellow(`\\n⚠️ Key not found: ${options.get}\\n`));\n } else {\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : value);\n }\n return;\n }\n\n if (options.set) {\n const [key, ...valueParts] = options.set.split('=');\n const value = valueParts.join('=');\n\n if (!key || value === undefined) {\n console.log(chalk.red('\\n❌ Invalid format. Use: --set key=value\\n'));\n process.exit(1);\n }\n\n // Parse value\n let parsedValue: any = value;\n if (value === 'true') parsedValue = true;\n else if (value === 'false') parsedValue = false;\n else if (!isNaN(Number(value))) parsedValue = Number(value);\n else {\n try {\n parsedValue = JSON.parse(value);\n } catch {\n // Keep as string\n }\n }\n\n setNestedValue(config, key, parsedValue);\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n console.log(chalk.green(`\\n✅ Set ${key} = ${JSON.stringify(parsedValue)}\\n`));\n console.log(chalk.dim(' Restart Dirigent for changes to take effect: dirigent down && dirigent up\\n'));\n return;\n }\n\n if (options.edit) {\n const editor = process.env.EDITOR || process.env.VISUAL || 'vim';\n const child = spawn(editor, [configPath], {\n stdio: 'inherit',\n });\n\n child.on('exit', () => {\n console.log(chalk.dim('\\n Restart Dirigent for changes to take effect: dirigent down && dirigent up\\n'));\n });\n return;\n }\n\n // Default: list all config\n console.log(chalk.cyan('\\n🔧 Configuration\\n'));\n console.log(JSON.stringify(config, null, 2));\n console.log(chalk.dim(`\\n File: ${configPath}\\n`));\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((acc, key) => acc?.[key], obj);\n}\n\nfunction setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((acc, key) => {\n if (!(key in acc)) acc[key] = {};\n return acc[key];\n }, obj);\n target[lastKey] = value;\n}\n"],"mappings":"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","names":["existsSync","join","agent","nanoid","join","mkdirSync","existsSync","agent","server","agentManager","startTime","agent","server","agentManager","agent","join","existsSync","mkdirSync","db","chalk","chalk","ora","existsSync","readFileSync","writeFileSync","join","spawn","fileURLToPath","dirname","__filename","__dirname","startServer","chalk","ora","existsSync","readFileSync","join","treeKill","chalk","existsSync","readFileSync","join","agent","chalk","ora","existsSync","readFileSync","join","agent","chalk","existsSync","readFileSync","join","spawn","chalk","existsSync","readFileSync","writeFileSync","join","spawn","chalk"]}
package/dist/index.d.ts CHANGED
@@ -30,11 +30,11 @@ declare const ConfigSchema: z.ZodObject<{
30
30
  port: z.ZodDefault<z.ZodNumber>;
31
31
  host: z.ZodDefault<z.ZodString>;
32
32
  }, "strip", z.ZodTypeAny, {
33
- port: number;
34
33
  host: string;
34
+ port: number;
35
35
  }, {
36
- port?: number | undefined;
37
36
  host?: string | undefined;
37
+ port?: number | undefined;
38
38
  }>>;
39
39
  auth: z.ZodDefault<z.ZodObject<{
40
40
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -97,11 +97,11 @@ declare const ConfigSchema: z.ZodObject<{
97
97
  format: z.ZodDefault<z.ZodEnum<["pretty", "json"]>>;
98
98
  file: z.ZodOptional<z.ZodString>;
99
99
  }, "strip", z.ZodTypeAny, {
100
- level: "debug" | "info" | "warn" | "error";
100
+ level: "error" | "warn" | "info" | "debug";
101
101
  format: "pretty" | "json";
102
102
  file?: string | undefined;
103
103
  }, {
104
- level?: "debug" | "info" | "warn" | "error" | undefined;
104
+ level?: "error" | "warn" | "info" | "debug" | undefined;
105
105
  format?: "pretty" | "json" | undefined;
106
106
  file?: string | undefined;
107
107
  }>>;
@@ -115,8 +115,8 @@ declare const ConfigSchema: z.ZodObject<{
115
115
  }, "strip", z.ZodTypeAny, {
116
116
  version: string;
117
117
  server: {
118
- port: number;
119
118
  host: string;
119
+ port: number;
120
120
  };
121
121
  auth: {
122
122
  enabled: boolean;
@@ -135,7 +135,7 @@ declare const ConfigSchema: z.ZodObject<{
135
135
  }>;
136
136
  };
137
137
  logging: {
138
- level: "debug" | "info" | "warn" | "error";
138
+ level: "error" | "warn" | "info" | "debug";
139
139
  format: "pretty" | "json";
140
140
  file?: string | undefined;
141
141
  };
@@ -145,8 +145,8 @@ declare const ConfigSchema: z.ZodObject<{
145
145
  }, {
146
146
  version?: string | undefined;
147
147
  server?: {
148
- port?: number | undefined;
149
148
  host?: string | undefined;
149
+ port?: number | undefined;
150
150
  } | undefined;
151
151
  auth?: {
152
152
  enabled?: boolean | undefined;
@@ -165,7 +165,7 @@ declare const ConfigSchema: z.ZodObject<{
165
165
  }> | undefined;
166
166
  } | undefined;
167
167
  logging?: {
168
- level?: "debug" | "info" | "warn" | "error" | undefined;
168
+ level?: "error" | "warn" | "info" | "debug" | undefined;
169
169
  format?: "pretty" | "json" | undefined;
170
170
  file?: string | undefined;
171
171
  } | undefined;
package/dist/index.js CHANGED
@@ -794,7 +794,7 @@ async function startServer(options) {
794
794
  const dbPath = join3(options.dataDir, "data", "dirigent.db");
795
795
  mkdirSync2(dirname(dbPath), { recursive: true });
796
796
  initDatabase(dbPath);
797
- server = Fastify({ logger });
797
+ server = Fastify({ loggerInstance: logger });
798
798
  await server.register(fastifyCors, {
799
799
  origin: true,
800
800
  credentials: true
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/index.ts","../src/server/config.ts","../src/server/db/index.ts","../src/server/agents/manager.ts","../src/server/api/routes.ts","../src/server/ws/index.ts"],"sourcesContent":["import Fastify from 'fastify';\nimport fastifyWebsocket from '@fastify/websocket';\nimport fastifyCors from '@fastify/cors';\nimport fastifyStatic from '@fastify/static';\nimport pino from 'pino';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\n\nimport { loadConfig, DirigentConfig } from './config.js';\nimport { initDatabase, getDatabase } from './db/index.js';\nimport { AgentManager } from './agents/manager.js';\nimport { registerApiRoutes } from './api/routes.js';\nimport { registerWebSocket } from './ws/index.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ServerOptions {\n port: number;\n configPath: string;\n dataDir: string;\n}\n\nlet server: ReturnType<typeof Fastify> | null = null;\nlet agentManager: AgentManager | null = null;\nconst startTime = Date.now();\n\nexport async function startServer(options: ServerOptions) {\n const config = loadConfig(options.configPath);\n\n // Setup logging\n const logPath = join(options.dataDir, 'logs', 'dirigent.log');\n mkdirSync(dirname(logPath), { recursive: true });\n\n const logger = pino({\n level: config.logging?.level || 'info',\n transport: {\n targets: [\n {\n target: 'pino-pretty',\n options: { colorize: true },\n level: 'info',\n },\n {\n target: 'pino/file',\n options: { destination: logPath },\n level: 'debug',\n },\n ],\n },\n });\n\n // Initialize database\n const dbPath = join(options.dataDir, 'data', 'dirigent.db');\n mkdirSync(dirname(dbPath), { recursive: true });\n initDatabase(dbPath);\n\n // Create Fastify server\n server = Fastify({ logger });\n\n // Register plugins\n await server.register(fastifyCors, {\n origin: true,\n credentials: true,\n });\n\n await server.register(fastifyWebsocket);\n\n // Serve dashboard static files\n const dashboardPath = join(__dirname, '..', 'dashboard', 'dist');\n if (existsSync(dashboardPath)) {\n await server.register(fastifyStatic, {\n root: dashboardPath,\n prefix: '/',\n });\n }\n\n // Initialize agent manager\n agentManager = new AgentManager({\n dataDir: options.dataDir,\n config,\n logger,\n });\n\n // Register API routes\n registerApiRoutes(server, {\n config,\n agentManager,\n startTime,\n });\n\n // Register WebSocket handlers\n registerWebSocket(server, {\n config,\n agentManager,\n });\n\n // Health check\n server.get('/health', async () => ({ status: 'ok', uptime: Math.floor((Date.now() - startTime) / 1000) }));\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n // Stop all agents\n if (agentManager) {\n await agentManager.stopAll();\n }\n\n // Close server\n if (server) {\n await server.close();\n }\n\n // Close database\n const db = getDatabase();\n if (db) db.close();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Start server\n try {\n await server.listen({ port: options.port, host: config.server?.host || '0.0.0.0' });\n\n console.log(`\n╔══════════════════════════════════════════════════════════╗\n║ ║\n║ 🎭 DIRIGENT SERVER RUNNING ║\n║ ║\n║ Dashboard: http://localhost:${options.port.toString().padEnd(25)}║\n║ API: http://localhost:${options.port}/api${' '.repeat(21)}║\n║ WebSocket: ws://localhost:${options.port}/ws${' '.repeat(22)}║\n║ ║\n╚══════════════════════════════════════════════════════════╝\n`);\n } catch (err) {\n logger.error(err);\n process.exit(1);\n }\n}\n\n// Export for direct invocation\nif (process.env.DIRIGENT_CONFIG) {\n startServer({\n port: parseInt(process.env.DIRIGENT_PORT || '3000'),\n configPath: process.env.DIRIGENT_CONFIG,\n dataDir: process.env.DIRIGENT_DATA_DIR || '.dirigent',\n });\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nconst AgentTemplateSchema = z.object({\n driver: z.string(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n command: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nconst ConfigSchema = z.object({\n version: z.string().default('1'),\n server: z\n .object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n })\n .default({}),\n auth: z\n .object({\n enabled: z.boolean().default(true),\n adminToken: z.string().optional(),\n apiKeys: z.array(z.string()).optional(),\n })\n .default({}),\n agents: z\n .object({\n maxConcurrent: z.number().default(10),\n defaultTimeout: z.number().default(3600),\n templates: z.record(AgentTemplateSchema).default({}),\n })\n .default({}),\n logging: z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n format: z.enum(['pretty', 'json']).default('pretty'),\n file: z.string().optional(),\n })\n .default({}),\n database: z\n .object({\n path: z.string().default('data/dirigent.db'),\n })\n .default({}),\n});\n\nexport type DirigentConfig = z.infer<typeof ConfigSchema>;\nexport type AgentTemplate = z.infer<typeof AgentTemplateSchema>;\n\nlet cachedConfig: DirigentConfig | null = null;\n\nexport function loadConfig(configPath?: string): DirigentConfig {\n if (cachedConfig) return cachedConfig;\n\n const path = configPath || findConfigPath();\n\n if (!path || !existsSync(path)) {\n // Return defaults\n cachedConfig = ConfigSchema.parse({});\n return cachedConfig;\n }\n\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n cachedConfig = ConfigSchema.parse(parsed);\n\n return cachedConfig;\n}\n\nfunction findConfigPath(): string | null {\n const candidates = [\n join(process.cwd(), '.dirigent', 'config.json'),\n join(process.cwd(), 'dirigent.json'),\n join(process.env.HOME || '', '.dirigent', 'config.json'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function validateAuth(token: string, config: DirigentConfig): boolean {\n if (!config.auth.enabled) return true;\n\n // Check admin token\n if (config.auth.adminToken && token === config.auth.adminToken) return true;\n\n // Check API keys\n if (config.auth.apiKeys?.includes(token)) return true;\n\n return false;\n}\n","import Database from 'better-sqlite3';\n\nlet db: Database.Database | null = null;\n\nexport function initDatabase(path: string): Database.Database {\n db = new Database(path);\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Create tables\n db.exec(`\n -- Agents table\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n template TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'created',\n workspace TEXT,\n model TEXT,\n config TEXT,\n pid INTEGER,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n stopped_at INTEGER,\n error TEXT\n );\n\n -- Agent logs table\n CREATE TABLE IF NOT EXISTS agent_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n metadata TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Tasks table\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n agent_id TEXT,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n result TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Audit log table\n CREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n actor TEXT,\n target_type TEXT,\n target_id TEXT,\n details TEXT,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n );\n\n -- Sessions table (for WebSocket connections)\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT,\n connected_at INTEGER NOT NULL DEFAULT (unixepoch()),\n last_activity INTEGER NOT NULL DEFAULT (unixepoch()),\n metadata TEXT\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_agent_logs_agent_id ON agent_logs(agent_id);\n CREATE INDEX IF NOT EXISTS idx_agent_logs_timestamp ON agent_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_tasks_agent_id ON tasks(agent_id);\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp);\n `);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database | null {\n return db;\n}\n\n// Helper functions\nexport function insertAgent(agent: {\n id: string;\n name: string;\n template: string;\n workspace?: string;\n model?: string;\n config?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agents (id, name, template, workspace, model, config)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n agent.id,\n agent.name,\n agent.template,\n agent.workspace || null,\n agent.model || null,\n agent.config ? JSON.stringify(agent.config) : null\n );\n}\n\nexport function updateAgent(id: string, updates: Record<string, any>) {\n const keys = Object.keys(updates);\n const values = keys.map((k) => (typeof updates[k] === 'object' ? JSON.stringify(updates[k]) : updates[k]));\n\n const stmt = db!.prepare(`\n UPDATE agents SET ${keys.map((k) => `${k} = ?`).join(', ')}\n WHERE id = ?\n `);\n\n stmt.run(...values, id);\n}\n\nexport function getAgent(id: string) {\n const stmt = db!.prepare('SELECT * FROM agents WHERE id = ?');\n const row = stmt.get(id) as any;\n if (row?.config) row.config = JSON.parse(row.config);\n return row;\n}\n\nexport function getAgents(includesStopped = false) {\n const stmt = db!.prepare(\n includesStopped\n ? 'SELECT * FROM agents ORDER BY created_at DESC'\n : \"SELECT * FROM agents WHERE status != 'stopped' ORDER BY created_at DESC\"\n );\n return stmt.all().map((row: any) => {\n if (row.config) row.config = JSON.parse(row.config);\n return row;\n });\n}\n\nexport function insertLog(log: {\n agentId: string;\n level: string;\n message: string;\n metadata?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agent_logs (agent_id, level, message, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n stmt.run(log.agentId, log.level, log.message, log.metadata ? JSON.stringify(log.metadata) : null);\n}\n\nexport function getLogs(agentId: string, limit = 100) {\n const stmt = db!.prepare(`\n SELECT * FROM agent_logs\n WHERE agent_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `);\n\n return stmt.all(agentId, limit).reverse().map((row: any) => {\n if (row.metadata) row.metadata = JSON.parse(row.metadata);\n return row;\n });\n}\n\nexport function audit(action: string, actor: string | null, targetType: string | null, targetId: string | null, details?: object) {\n const stmt = db!.prepare(`\n INSERT INTO audit_log (action, actor, target_type, target_id, details)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(action, actor, targetType, targetId, details ? JSON.stringify(details) : null);\n}\n","import { EventEmitter } from 'events';\nimport { nanoid } from 'nanoid';\nimport { spawn, ChildProcess } from 'child_process';\nimport treeKill from 'tree-kill';\nimport { join } from 'path';\nimport { mkdirSync, existsSync } from 'fs';\nimport type { Logger } from 'pino';\n\nimport { DirigentConfig, AgentTemplate } from '../config.js';\nimport { insertAgent, updateAgent, getAgent, getAgents, insertLog, getLogs, audit } from '../db/index.js';\n\nexport interface Agent {\n id: string;\n name: string;\n template: string;\n status: 'created' | 'starting' | 'running' | 'idle' | 'stopping' | 'stopped' | 'error';\n workspace?: string;\n model?: string;\n pid?: number;\n process?: ChildProcess;\n currentTask?: string;\n createdAt: number;\n startedAt?: number;\n stoppedAt?: number;\n error?: string;\n}\n\ninterface ManagerOptions {\n dataDir: string;\n config: DirigentConfig;\n logger: Logger;\n}\n\nexport class AgentManager extends EventEmitter {\n private agents: Map<string, Agent> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private dataDir: string;\n private config: DirigentConfig;\n private logger: Logger;\n\n constructor(options: ManagerOptions) {\n super();\n this.dataDir = options.dataDir;\n this.config = options.config;\n this.logger = options.logger;\n\n // Load existing agents from database\n this.loadAgents();\n }\n\n private loadAgents() {\n const dbAgents = getAgents(false);\n for (const dbAgent of dbAgents) {\n // Only load non-running agents; running agents will need to be respawned\n if (dbAgent.status !== 'stopped') {\n this.agents.set(dbAgent.id, {\n id: dbAgent.id,\n name: dbAgent.name,\n template: dbAgent.template,\n status: 'stopped', // Reset to stopped since we restarted\n workspace: dbAgent.workspace,\n model: dbAgent.model,\n createdAt: dbAgent.created_at * 1000,\n });\n\n // Update database\n updateAgent(dbAgent.id, { status: 'stopped' });\n }\n }\n }\n\n async spawn(options: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n }): Promise<Agent> {\n const { template, name, workspace, task, model } = options;\n\n // Get template config\n const templateConfig = this.config.agents.templates[template];\n if (!templateConfig) {\n throw new Error(`Unknown template: ${template}`);\n }\n\n // Check max concurrent\n const runningCount = Array.from(this.agents.values()).filter(\n (a) => a.status === 'running' || a.status === 'starting'\n ).length;\n\n if (runningCount >= this.config.agents.maxConcurrent) {\n throw new Error(`Max concurrent agents (${this.config.agents.maxConcurrent}) reached`);\n }\n\n // Create agent\n const id = nanoid(12);\n const agentName = name || `${template}-${id.slice(0, 6)}`;\n const agentWorkspace = workspace || join(this.dataDir, 'workspaces', id);\n\n // Ensure workspace exists\n if (!existsSync(agentWorkspace)) {\n mkdirSync(agentWorkspace, { recursive: true });\n }\n\n const agent: Agent = {\n id,\n name: agentName,\n template,\n status: 'created',\n workspace: agentWorkspace,\n model: model || templateConfig.model,\n currentTask: task,\n createdAt: Date.now(),\n };\n\n // Save to database\n insertAgent({\n id: agent.id,\n name: agent.name,\n template: agent.template,\n workspace: agent.workspace,\n model: agent.model,\n });\n\n audit('agent.created', null, 'agent', id, { name: agentName, template });\n\n this.agents.set(id, agent);\n this.emit('agent:created', agent);\n\n // Start the agent process\n await this.startAgent(agent, templateConfig, task);\n\n return agent;\n }\n\n private async startAgent(agent: Agent, template: AgentTemplate, initialTask?: string) {\n agent.status = 'starting';\n updateAgent(agent.id, { status: 'starting' });\n this.emit('agent:starting', agent);\n\n try {\n const { command, env } = this.buildCommand(agent, template);\n\n this.logger.info({ agentId: agent.id, command }, 'Starting agent');\n\n const proc = spawn(command[0], command.slice(1), {\n cwd: agent.workspace,\n env: {\n ...process.env,\n ...env,\n DIRIGENT_AGENT_ID: agent.id,\n DIRIGENT_AGENT_NAME: agent.name,\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n agent.pid = proc.pid;\n agent.process = proc;\n agent.status = 'running';\n agent.startedAt = Date.now();\n\n updateAgent(agent.id, {\n status: 'running',\n pid: proc.pid,\n started_at: Math.floor(Date.now() / 1000),\n });\n\n this.processes.set(agent.id, proc);\n\n // Handle stdout\n proc.stdout?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'info', message);\n }\n });\n\n // Handle stderr\n proc.stderr?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'error', message);\n }\n });\n\n // Handle exit\n proc.on('exit', (code, signal) => {\n this.logger.info({ agentId: agent.id, code, signal }, 'Agent exited');\n\n agent.status = code === 0 ? 'stopped' : 'error';\n agent.stoppedAt = Date.now();\n if (code !== 0) {\n agent.error = `Exited with code ${code}`;\n }\n\n updateAgent(agent.id, {\n status: agent.status,\n stopped_at: Math.floor(Date.now() / 1000),\n error: agent.error || null,\n });\n\n this.processes.delete(agent.id);\n this.emit('agent:stopped', agent);\n\n audit('agent.stopped', null, 'agent', agent.id, { code, signal });\n });\n\n proc.on('error', (err) => {\n this.logger.error({ agentId: agent.id, err }, 'Agent process error');\n agent.status = 'error';\n agent.error = err.message;\n\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n });\n\n this.emit('agent:running', agent);\n audit('agent.started', null, 'agent', agent.id, { pid: proc.pid });\n\n // Send initial task if provided\n if (initialTask && proc.stdin) {\n proc.stdin.write(initialTask + '\\n');\n }\n } catch (err: any) {\n agent.status = 'error';\n agent.error = err.message;\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n throw err;\n }\n }\n\n private buildCommand(agent: Agent, template: AgentTemplate): { command: string[]; env: Record<string, string> } {\n const env: Record<string, string> = { ...template.env };\n\n switch (template.driver) {\n case 'claude-code':\n return {\n command: ['claude', '--dangerously-skip-permissions'],\n env: {\n ...env,\n ANTHROPIC_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'codex':\n return {\n command: ['codex', '--model', agent.model || template.model || 'codex-1'],\n env,\n };\n\n case 'clawdbot':\n return {\n command: ['clawdbot', 'agent', '--headless'],\n env: {\n ...env,\n CLAWDBOT_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'subprocess':\n if (!template.command || template.command.length === 0) {\n throw new Error('subprocess driver requires command');\n }\n return { command: template.command, env };\n\n default:\n throw new Error(`Unknown driver: ${template.driver}`);\n }\n }\n\n async stop(id: string, force = false): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running' && agent.status !== 'starting') {\n return;\n }\n\n agent.status = 'stopping';\n this.emit('agent:stopping', agent);\n\n const proc = this.processes.get(id);\n if (proc && proc.pid) {\n await new Promise<void>((resolve, reject) => {\n treeKill(proc.pid!, force ? 'SIGKILL' : 'SIGTERM', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n audit('agent.stop_requested', null, 'agent', id, { force });\n }\n\n async stopAll(): Promise<void> {\n const promises = Array.from(this.agents.values())\n .filter((a) => a.status === 'running' || a.status === 'starting')\n .map((a) => this.stop(a.id, true));\n\n await Promise.allSettled(promises);\n }\n\n async send(id: string, message: string): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running') {\n throw new Error(`Agent is not running: ${agent.status}`);\n }\n\n const proc = this.processes.get(id);\n if (!proc || !proc.stdin) {\n throw new Error('Agent process not available');\n }\n\n proc.stdin.write(message + '\\n');\n this.log(id, 'info', `[USER] ${message}`);\n\n audit('agent.message_sent', null, 'agent', id, { length: message.length });\n }\n\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n list(includeStopped = false): Agent[] {\n const agents = Array.from(this.agents.values());\n if (includeStopped) return agents;\n return agents.filter((a) => a.status !== 'stopped');\n }\n\n log(agentId: string, level: string, message: string) {\n insertLog({ agentId, level, message });\n this.emit('agent:log', { agentId, level, message, timestamp: Date.now() });\n }\n\n getLogs(agentId: string, limit = 100) {\n return getLogs(agentId, limit);\n }\n\n getStats() {\n const agents = Array.from(this.agents.values());\n return {\n total: agents.length,\n running: agents.filter((a) => a.status === 'running').length,\n idle: agents.filter((a) => a.status === 'idle').length,\n stopped: agents.filter((a) => a.status === 'stopped').length,\n error: agents.filter((a) => a.status === 'error').length,\n };\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\nimport { getAgents, audit } from '../db/index.js';\n\ninterface RouteOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n startTime: number;\n}\n\nexport function registerApiRoutes(server: FastifyInstance, options: RouteOptions) {\n const { config, agentManager, startTime } = options;\n\n // Auth middleware\n server.addHook('onRequest', async (request, reply) => {\n // Skip auth for health check\n if (request.url === '/health') return;\n\n // Skip auth for dashboard routes\n if (!request.url.startsWith('/api')) return;\n\n if (config.auth.enabled) {\n const authHeader = request.headers.authorization;\n const token = authHeader?.replace('Bearer ', '');\n\n if (!token || !validateAuth(token, config)) {\n reply.code(401).send({ error: 'Unauthorized' });\n return;\n }\n }\n });\n\n // Status\n server.get('/api/status', async () => {\n const stats = agentManager.getStats();\n const agents = agentManager.list(false);\n\n return {\n status: 'ok',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n agents: {\n ...stats,\n list: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n currentTask: a.currentTask,\n })),\n },\n };\n });\n\n // List agents\n server.get<{ Querystring: { all?: string } }>('/api/agents', async (request) => {\n const includeStopped = request.query.all === 'true';\n const agents = agentManager.list(includeStopped);\n\n return {\n agents: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n model: a.model,\n pid: a.pid,\n currentTask: a.currentTask,\n createdAt: a.createdAt,\n startedAt: a.startedAt,\n stoppedAt: a.stoppedAt,\n error: a.error,\n })),\n };\n });\n\n // Spawn agent\n server.post<{\n Body: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n };\n }>('/api/agents', async (request, reply) => {\n const { template, name, workspace, task, model } = request.body;\n\n if (!template) {\n reply.code(400).send({ error: 'template is required' });\n return;\n }\n\n try {\n const agent = await agentManager.spawn({ template, name, workspace, task, model });\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n },\n };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n });\n\n // Get agent\n server.get<{ Params: { id: string } }>('/api/agents/:id', async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n },\n };\n });\n\n // Stop agent\n server.delete<{ Params: { id: string }; Querystring: { force?: string } }>(\n '/api/agents/:id',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const force = request.query.force === 'true';\n\n try {\n await agentManager.stop(request.params.id, force);\n return { ok: true };\n } catch (err: any) {\n reply.code(500).send({ error: err.message });\n }\n }\n );\n\n // Send message to agent\n server.post<{ Params: { id: string }; Body: { message: string } }>(\n '/api/agents/:id/send',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const { message } = request.body;\n\n if (!message) {\n reply.code(400).send({ error: 'message is required' });\n return;\n }\n\n try {\n await agentManager.send(request.params.id, message);\n return { ok: true };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n }\n );\n\n // Get agent logs\n server.get<{ Params: { id: string }; Querystring: { lines?: string } }>(\n '/api/agents/:id/logs',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const limit = parseInt(request.query.lines || '100');\n const logs = agentManager.getLogs(request.params.id, limit);\n\n return { logs };\n }\n );\n\n // Templates\n server.get('/api/templates', async () => {\n return {\n templates: Object.entries(config.agents.templates).map(([name, template]) => ({\n name,\n driver: template.driver,\n model: template.model,\n })),\n };\n });\n\n // Audit log\n server.get<{ Querystring: { limit?: string } }>('/api/audit', async (request) => {\n // TODO: Implement audit log retrieval\n return { logs: [] };\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\n\ninterface WSOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n}\n\ninterface Client {\n ws: WebSocket;\n subscriptions: Set<string>;\n authenticated: boolean;\n}\n\nexport function registerWebSocket(server: FastifyInstance, options: WSOptions) {\n const { config, agentManager } = options;\n const clients: Map<string, Client> = new Map();\n\n // WebSocket route\n server.register(async (fastify) => {\n fastify.get('/ws', { websocket: true }, (connection, req) => {\n const ws = connection;\n const clientId = Math.random().toString(36).slice(2);\n\n const client: Client = {\n ws,\n subscriptions: new Set(),\n authenticated: !config.auth.enabled,\n };\n\n clients.set(clientId, client);\n\n ws.on('message', (data) => {\n try {\n const msg = JSON.parse(data.toString());\n handleMessage(clientId, client, msg);\n } catch (err) {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n }\n });\n\n ws.on('close', () => {\n clients.delete(clientId);\n });\n\n ws.on('error', (err) => {\n console.error('WebSocket error:', err);\n clients.delete(clientId);\n });\n\n // Send welcome\n send(ws, {\n type: 'welcome',\n clientId,\n authenticated: client.authenticated,\n });\n });\n });\n\n function handleMessage(clientId: string, client: Client, msg: any) {\n // Auth\n if (msg.type === 'auth') {\n if (validateAuth(msg.token, config)) {\n client.authenticated = true;\n send(client.ws, { type: 'auth', success: true });\n } else {\n send(client.ws, { type: 'auth', success: false, error: 'Invalid token' });\n }\n return;\n }\n\n // Require auth for other messages\n if (!client.authenticated) {\n send(client.ws, { type: 'error', error: 'Not authenticated' });\n return;\n }\n\n switch (msg.type) {\n case 'subscribe:logs':\n if (msg.agentId) {\n client.subscriptions.add(`logs:${msg.agentId}`);\n send(client.ws, { type: 'subscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'unsubscribe:logs':\n if (msg.agentId) {\n client.subscriptions.delete(`logs:${msg.agentId}`);\n send(client.ws, { type: 'unsubscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'subscribe:agents':\n client.subscriptions.add('agents');\n send(client.ws, { type: 'subscribed', channel: 'agents' });\n break;\n\n case 'unsubscribe:agents':\n client.subscriptions.delete('agents');\n send(client.ws, { type: 'unsubscribed', channel: 'agents' });\n break;\n\n case 'ping':\n send(client.ws, { type: 'pong', ts: Date.now() });\n break;\n\n default:\n send(client.ws, { type: 'error', error: `Unknown message type: ${msg.type}` });\n }\n }\n\n // Agent event handlers\n agentManager.on('agent:created', (agent) => {\n broadcast('agents', { type: 'agent:created', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:running', (agent) => {\n broadcast('agents', { type: 'agent:running', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:stopped', (agent) => {\n broadcast('agents', { type: 'agent:stopped', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:error', (agent, error) => {\n broadcast('agents', { type: 'agent:error', agent: sanitizeAgent(agent), error: error.message });\n });\n\n agentManager.on('agent:log', (data) => {\n broadcast(`logs:${data.agentId}`, { type: 'agent:log', ...data });\n });\n\n function broadcast(channel: string, message: object) {\n for (const client of clients.values()) {\n if (client.authenticated && client.subscriptions.has(channel)) {\n send(client.ws, message);\n }\n }\n }\n\n function send(ws: WebSocket, message: object) {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(message));\n }\n }\n\n function sanitizeAgent(agent: any) {\n return {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n };\n }\n}\n"],"mappings":";;;AAAA,OAAO,aAAa;AACpB,OAAO,sBAAsB;AAC7B,OAAO,iBAAiB;AACxB,OAAO,mBAAmB;AAC1B,OAAO,UAAU;AACjB,SAAS,QAAAA,OAAM,eAAe;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,cAAAC,aAAY,aAAAC,kBAA8C;;;ACPnE,SAAS,cAAc,kBAAkB;AACzC,SAAS,YAAY;AACrB,SAAS,SAAS;AAElB,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,QAAQ,EAAE,OAAO;AAAA,EACjB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC;AAED,IAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAC/B,QAAQ,EACL,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAI;AAAA,IAC7B,MAAM,EAAE,OAAO,EAAE,QAAQ,SAAS;AAAA,EACpC,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,MAAM,EACH,OAAO;AAAA,IACN,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACjC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,QAAQ,EACL,OAAO;AAAA,IACN,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACpC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IACvC,WAAW,EAAE,OAAO,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAAA,EACrD,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EACN,OAAO;AAAA,IACN,OAAO,EAAE,KAAK,CAAC,SAAS,QAAQ,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,IAChE,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,CAAC,EAAE,QAAQ,QAAQ;AAAA,IACnD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EACP,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,QAAQ,kBAAkB;AAAA,EAC7C,CAAC,EACA,QAAQ,CAAC,CAAC;AACf,CAAC;AAKD,IAAI,eAAsC;AAEnC,SAAS,WAAW,YAAqC;AAC9D,MAAI,aAAc,QAAO;AAEzB,QAAM,OAAO,cAAc,eAAe;AAE1C,MAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,GAAG;AAE9B,mBAAe,aAAa,MAAM,CAAC,CAAC;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,aAAa,MAAM,OAAO;AACtC,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,iBAAe,aAAa,MAAM,MAAM;AAExC,SAAO;AACT;AAEA,SAAS,iBAAgC;AACvC,QAAM,aAAa;AAAA,IACjB,KAAK,QAAQ,IAAI,GAAG,aAAa,aAAa;AAAA,IAC9C,KAAK,QAAQ,IAAI,GAAG,eAAe;AAAA,IACnC,KAAK,QAAQ,IAAI,QAAQ,IAAI,aAAa,aAAa;AAAA,EACzD;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,WAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAAe,QAAiC;AAC3E,MAAI,CAAC,OAAO,KAAK,QAAS,QAAO;AAGjC,MAAI,OAAO,KAAK,cAAc,UAAU,OAAO,KAAK,WAAY,QAAO;AAGvE,MAAI,OAAO,KAAK,SAAS,SAAS,KAAK,EAAG,QAAO;AAEjD,SAAO;AACT;;;AC/FA,OAAO,cAAc;AAErB,IAAI,KAA+B;AAE5B,SAAS,aAAa,MAAiC;AAC5D,OAAK,IAAI,SAAS,IAAI;AAGtB,KAAG,OAAO,oBAAoB;AAG9B,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoEP;AAED,SAAO;AACT;AAEO,SAAS,cAAwC;AACtD,SAAO;AACT;AAGO,SAAS,YAAY,OAOzB;AACD,QAAM,OAAO,GAAI,QAAQ;AAAA;AAAA;AAAA,GAGxB;AAED,OAAK;AAAA,IACH,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,aAAa;AAAA,IACnB,MAAM,SAAS;AAAA,IACf,MAAM,SAAS,KAAK,UAAU,MAAM,MAAM,IAAI;AAAA,EAChD;AACF;AAEO,SAAS,YAAY,IAAY,SAA8B;AACpE,QAAM,OAAO,OAAO,KAAK,OAAO;AAChC,QAAM,SAAS,KAAK,IAAI,CAAC,MAAO,OAAO,QAAQ,CAAC,MAAM,WAAW,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAE;AAEzG,QAAM,OAAO,GAAI,QAAQ;AAAA,wBACH,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,GAE3D;AAED,OAAK,IAAI,GAAG,QAAQ,EAAE;AACxB;AAEO,SAAS,SAAS,IAAY;AACnC,QAAM,OAAO,GAAI,QAAQ,mCAAmC;AAC5D,QAAM,MAAM,KAAK,IAAI,EAAE;AACvB,MAAI,KAAK,OAAQ,KAAI,SAAS,KAAK,MAAM,IAAI,MAAM;AACnD,SAAO;AACT;AAEO,SAAS,UAAU,kBAAkB,OAAO;AACjD,QAAM,OAAO,GAAI;AAAA,IACf,kBACI,kDACA;AAAA,EACN;AACA,SAAO,KAAK,IAAI,EAAE,IAAI,CAAC,QAAa;AAClC,QAAI,IAAI,OAAQ,KAAI,SAAS,KAAK,MAAM,IAAI,MAAM;AAClD,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,UAAU,KAKvB;AACD,QAAM,OAAO,GAAI,QAAQ;AAAA;AAAA;AAAA,GAGxB;AAED,OAAK,IAAI,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,IAAI,WAAW,KAAK,UAAU,IAAI,QAAQ,IAAI,IAAI;AAClG;AAEO,SAAS,QAAQ,SAAiB,QAAQ,KAAK;AACpD,QAAM,OAAO,GAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKxB;AAED,SAAO,KAAK,IAAI,SAAS,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAa;AAC1D,QAAI,IAAI,SAAU,KAAI,WAAW,KAAK,MAAM,IAAI,QAAQ;AACxD,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,MAAM,QAAgB,OAAsB,YAA2B,UAAyB,SAAkB;AAChI,QAAM,OAAO,GAAI,QAAQ;AAAA;AAAA;AAAA,GAGxB;AAED,OAAK,IAAI,QAAQ,OAAO,YAAY,UAAU,UAAU,KAAK,UAAU,OAAO,IAAI,IAAI;AACxF;;;AClLA,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,aAA2B;AACpC,OAAO,cAAc;AACrB,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAW,cAAAC,mBAAkB;AA4B/B,IAAM,eAAN,cAA2B,aAAa;AAAA,EACrC,SAA6B,oBAAI,IAAI;AAAA,EACrC,YAAuC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAyB;AACnC,UAAM;AACN,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ;AAGtB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,aAAa;AACnB,UAAM,WAAW,UAAU,KAAK;AAChC,eAAW,WAAW,UAAU;AAE9B,UAAI,QAAQ,WAAW,WAAW;AAChC,aAAK,OAAO,IAAI,QAAQ,IAAI;AAAA,UAC1B,IAAI,QAAQ;AAAA,UACZ,MAAM,QAAQ;AAAA,UACd,UAAU,QAAQ;AAAA,UAClB,QAAQ;AAAA;AAAA,UACR,WAAW,QAAQ;AAAA,UACnB,OAAO,QAAQ;AAAA,UACf,WAAW,QAAQ,aAAa;AAAA,QAClC,CAAC;AAGD,oBAAY,QAAQ,IAAI,EAAE,QAAQ,UAAU,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,SAMO;AACjB,UAAM,EAAE,UAAU,MAAM,WAAW,MAAM,MAAM,IAAI;AAGnD,UAAM,iBAAiB,KAAK,OAAO,OAAO,UAAU,QAAQ;AAC5D,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AAAA,IACjD;AAGA,UAAM,eAAe,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,EAAE;AAAA,MACpD,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,IAChD,EAAE;AAEF,QAAI,gBAAgB,KAAK,OAAO,OAAO,eAAe;AACpD,YAAM,IAAI,MAAM,0BAA0B,KAAK,OAAO,OAAO,aAAa,WAAW;AAAA,IACvF;AAGA,UAAM,KAAK,OAAO,EAAE;AACpB,UAAM,YAAY,QAAQ,GAAG,QAAQ,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;AACvD,UAAM,iBAAiB,aAAaC,MAAK,KAAK,SAAS,cAAc,EAAE;AAGvE,QAAI,CAACC,YAAW,cAAc,GAAG;AAC/B,gBAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,IAC/C;AAEA,UAAM,QAAe;AAAA,MACnB;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO,SAAS,eAAe;AAAA,MAC/B,aAAa;AAAA,MACb,WAAW,KAAK,IAAI;AAAA,IACtB;AAGA,gBAAY;AAAA,MACV,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,IACf,CAAC;AAED,UAAM,iBAAiB,MAAM,SAAS,IAAI,EAAE,MAAM,WAAW,SAAS,CAAC;AAEvE,SAAK,OAAO,IAAI,IAAI,KAAK;AACzB,SAAK,KAAK,iBAAiB,KAAK;AAGhC,UAAM,KAAK,WAAW,OAAO,gBAAgB,IAAI;AAEjD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,OAAc,UAAyB,aAAsB;AACpF,UAAM,SAAS;AACf,gBAAY,MAAM,IAAI,EAAE,QAAQ,WAAW,CAAC;AAC5C,SAAK,KAAK,kBAAkB,KAAK;AAEjC,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,IAAI,KAAK,aAAa,OAAO,QAAQ;AAE1D,WAAK,OAAO,KAAK,EAAE,SAAS,MAAM,IAAI,QAAQ,GAAG,gBAAgB;AAEjE,YAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG;AAAA,QAC/C,KAAK,MAAM;AAAA,QACX,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,GAAG;AAAA,UACH,mBAAmB,MAAM;AAAA,UACzB,qBAAqB,MAAM;AAAA,QAC7B;AAAA,QACA,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC,CAAC;AAED,YAAM,MAAM,KAAK;AACjB,YAAM,UAAU;AAChB,YAAM,SAAS;AACf,YAAM,YAAY,KAAK,IAAI;AAE3B,kBAAY,MAAM,IAAI;AAAA,QACpB,QAAQ;AAAA,QACR,KAAK,KAAK;AAAA,QACV,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,MAC1C,CAAC;AAED,WAAK,UAAU,IAAI,MAAM,IAAI,IAAI;AAGjC,WAAK,QAAQ,GAAG,QAAQ,CAAC,SAAS;AAChC,cAAM,UAAU,KAAK,SAAS,EAAE,KAAK;AACrC,YAAI,SAAS;AACX,eAAK,IAAI,MAAM,IAAI,QAAQ,OAAO;AAAA,QACpC;AAAA,MACF,CAAC;AAGD,WAAK,QAAQ,GAAG,QAAQ,CAAC,SAAS;AAChC,cAAM,UAAU,KAAK,SAAS,EAAE,KAAK;AACrC,YAAI,SAAS;AACX,eAAK,IAAI,MAAM,IAAI,SAAS,OAAO;AAAA,QACrC;AAAA,MACF,CAAC;AAGD,WAAK,GAAG,QAAQ,CAAC,MAAM,WAAW;AAChC,aAAK,OAAO,KAAK,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO,GAAG,cAAc;AAEpE,cAAM,SAAS,SAAS,IAAI,YAAY;AACxC,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI,SAAS,GAAG;AACd,gBAAM,QAAQ,oBAAoB,IAAI;AAAA,QACxC;AAEA,oBAAY,MAAM,IAAI;AAAA,UACpB,QAAQ,MAAM;AAAA,UACd,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,UACxC,OAAO,MAAM,SAAS;AAAA,QACxB,CAAC;AAED,aAAK,UAAU,OAAO,MAAM,EAAE;AAC9B,aAAK,KAAK,iBAAiB,KAAK;AAEhC,cAAM,iBAAiB,MAAM,SAAS,MAAM,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,MAClE,CAAC;AAED,WAAK,GAAG,SAAS,CAAC,QAAQ;AACxB,aAAK,OAAO,MAAM,EAAE,SAAS,MAAM,IAAI,IAAI,GAAG,qBAAqB;AACnE,cAAM,SAAS;AACf,cAAM,QAAQ,IAAI;AAElB,oBAAY,MAAM,IAAI,EAAE,QAAQ,SAAS,OAAO,IAAI,QAAQ,CAAC;AAC7D,aAAK,KAAK,eAAe,OAAO,GAAG;AAAA,MACrC,CAAC;AAED,WAAK,KAAK,iBAAiB,KAAK;AAChC,YAAM,iBAAiB,MAAM,SAAS,MAAM,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;AAGjE,UAAI,eAAe,KAAK,OAAO;AAC7B,aAAK,MAAM,MAAM,cAAc,IAAI;AAAA,MACrC;AAAA,IACF,SAAS,KAAU;AACjB,YAAM,SAAS;AACf,YAAM,QAAQ,IAAI;AAClB,kBAAY,MAAM,IAAI,EAAE,QAAQ,SAAS,OAAO,IAAI,QAAQ,CAAC;AAC7D,WAAK,KAAK,eAAe,OAAO,GAAG;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,aAAa,OAAc,UAA6E;AAC9G,UAAM,MAA8B,EAAE,GAAG,SAAS,IAAI;AAEtD,YAAQ,SAAS,QAAQ;AAAA,MACvB,KAAK;AACH,eAAO;AAAA,UACL,SAAS,CAAC,UAAU,gCAAgC;AAAA,UACpD,KAAK;AAAA,YACH,GAAG;AAAA,YACH,iBAAiB,MAAM,SAAS,SAAS,SAAS;AAAA,UACpD;AAAA,QACF;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,SAAS,CAAC,SAAS,WAAW,MAAM,SAAS,SAAS,SAAS,SAAS;AAAA,UACxE;AAAA,QACF;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,SAAS,CAAC,YAAY,SAAS,YAAY;AAAA,UAC3C,KAAK;AAAA,YACH,GAAG;AAAA,YACH,gBAAgB,MAAM,SAAS,SAAS,SAAS;AAAA,UACnD;AAAA,QACF;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,SAAS,WAAW,SAAS,QAAQ,WAAW,GAAG;AACtD,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AACA,eAAO,EAAE,SAAS,SAAS,SAAS,IAAI;AAAA,MAE1C;AACE,cAAM,IAAI,MAAM,mBAAmB,SAAS,MAAM,EAAE;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,IAAY,QAAQ,OAAsB;AACnD,UAAM,QAAQ,KAAK,OAAO,IAAI,EAAE;AAChC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,oBAAoB,EAAE,EAAE;AAAA,IAC1C;AAEA,QAAI,MAAM,WAAW,aAAa,MAAM,WAAW,YAAY;AAC7D;AAAA,IACF;AAEA,UAAM,SAAS;AACf,SAAK,KAAK,kBAAkB,KAAK;AAEjC,UAAM,OAAO,KAAK,UAAU,IAAI,EAAE;AAClC,QAAI,QAAQ,KAAK,KAAK;AACpB,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,iBAAS,KAAK,KAAM,QAAQ,YAAY,WAAW,CAAC,QAAQ;AAC1D,cAAI,IAAK,QAAO,GAAG;AAAA,cACd,SAAQ;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,UAAM,wBAAwB,MAAM,SAAS,IAAI,EAAE,MAAM,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,WAAW,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,EAC7C,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW,UAAU,EAC/D,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC;AAEnC,UAAM,QAAQ,WAAW,QAAQ;AAAA,EACnC;AAAA,EAEA,MAAM,KAAK,IAAY,SAAgC;AACrD,UAAM,QAAQ,KAAK,OAAO,IAAI,EAAE;AAChC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,oBAAoB,EAAE,EAAE;AAAA,IAC1C;AAEA,QAAI,MAAM,WAAW,WAAW;AAC9B,YAAM,IAAI,MAAM,yBAAyB,MAAM,MAAM,EAAE;AAAA,IACzD;AAEA,UAAM,OAAO,KAAK,UAAU,IAAI,EAAE;AAClC,QAAI,CAAC,QAAQ,CAAC,KAAK,OAAO;AACxB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,SAAK,MAAM,MAAM,UAAU,IAAI;AAC/B,SAAK,IAAI,IAAI,QAAQ,UAAU,OAAO,EAAE;AAExC,UAAM,sBAAsB,MAAM,SAAS,IAAI,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,IAAI,IAA+B;AACjC,WAAO,KAAK,OAAO,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,KAAK,iBAAiB,OAAgB;AACpC,UAAM,SAAS,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAC9C,QAAI,eAAgB,QAAO;AAC3B,WAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AAAA,EACpD;AAAA,EAEA,IAAI,SAAiB,OAAe,SAAiB;AACnD,cAAU,EAAE,SAAS,OAAO,QAAQ,CAAC;AACrC,SAAK,KAAK,aAAa,EAAE,SAAS,OAAO,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3E;AAAA,EAEA,QAAQ,SAAiB,QAAQ,KAAK;AACpC,WAAO,QAAQ,SAAS,KAAK;AAAA,EAC/B;AAAA,EAEA,WAAW;AACT,UAAM,SAAS,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAC9C,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,MACtD,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAAA,MAChD,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,MACtD,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,EAAE;AAAA,IACpD;AAAA,EACF;AACF;;;ACzVO,SAAS,kBAAkBC,SAAyB,SAAuB;AAChF,QAAM,EAAE,QAAQ,cAAAC,eAAc,WAAAC,WAAU,IAAI;AAG5C,EAAAF,QAAO,QAAQ,aAAa,OAAO,SAAS,UAAU;AAEpD,QAAI,QAAQ,QAAQ,UAAW;AAG/B,QAAI,CAAC,QAAQ,IAAI,WAAW,MAAM,EAAG;AAErC,QAAI,OAAO,KAAK,SAAS;AACvB,YAAM,aAAa,QAAQ,QAAQ;AACnC,YAAM,QAAQ,YAAY,QAAQ,WAAW,EAAE;AAE/C,UAAI,CAAC,SAAS,CAAC,aAAa,OAAO,MAAM,GAAG;AAC1C,cAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,CAAC;AAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,EAAAA,QAAO,IAAI,eAAe,YAAY;AACpC,UAAM,QAAQC,cAAa,SAAS;AACpC,UAAM,SAASA,cAAa,KAAK,KAAK;AAEtC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,KAAK,OAAO,KAAK,IAAI,IAAIC,cAAa,GAAI;AAAA,MAClD,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,MAAM,OAAO,IAAI,CAAC,OAAO;AAAA,UACvB,IAAI,EAAE;AAAA,UACN,MAAM,EAAE;AAAA,UACR,UAAU,EAAE;AAAA,UACZ,QAAQ,EAAE;AAAA,UACV,WAAW,EAAE;AAAA,UACb,aAAa,EAAE;AAAA,QACjB,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AAGD,EAAAF,QAAO,IAAuC,eAAe,OAAO,YAAY;AAC9E,UAAM,iBAAiB,QAAQ,MAAM,QAAQ;AAC7C,UAAM,SAASC,cAAa,KAAK,cAAc;AAE/C,WAAO;AAAA,MACL,QAAQ,OAAO,IAAI,CAAC,OAAO;AAAA,QACzB,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,UAAU,EAAE;AAAA,QACZ,QAAQ,EAAE;AAAA,QACV,WAAW,EAAE;AAAA,QACb,OAAO,EAAE;AAAA,QACT,KAAK,EAAE;AAAA,QACP,aAAa,EAAE;AAAA,QACf,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,EAAAD,QAAO,KAQJ,eAAe,OAAO,SAAS,UAAU;AAC1C,UAAM,EAAE,UAAU,MAAM,WAAW,MAAM,MAAM,IAAI,QAAQ;AAE3D,QAAI,CAAC,UAAU;AACb,YAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,IACF;AAEA,QAAI;AACF,YAAM,QAAQ,MAAMC,cAAa,MAAM,EAAE,UAAU,MAAM,WAAW,MAAM,MAAM,CAAC;AAEjF,aAAO;AAAA,QACL,OAAO;AAAA,UACL,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,OAAO,MAAM;AAAA,QACf;AAAA,MACF;AAAA,IACF,SAAS,KAAU;AACjB,YAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;AAAA,IAC7C;AAAA,EACF,CAAC;AAGD,EAAAD,QAAO,IAAgC,mBAAmB,OAAO,SAAS,UAAU;AAClF,UAAM,QAAQC,cAAa,IAAI,QAAQ,OAAO,EAAE;AAEhD,QAAI,CAAC,OAAO;AACV,YAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,QACL,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,KAAK,MAAM;AAAA,QACX,aAAa,MAAM;AAAA,QACnB,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAGD,EAAAD,QAAO;AAAA,IACL;AAAA,IACA,OAAO,SAAS,UAAU;AACxB,YAAM,QAAQC,cAAa,IAAI,QAAQ,OAAO,EAAE;AAEhD,UAAI,CAAC,OAAO;AACV,cAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;AAAA,MACF;AAEA,YAAM,QAAQ,QAAQ,MAAM,UAAU;AAEtC,UAAI;AACF,cAAMA,cAAa,KAAK,QAAQ,OAAO,IAAI,KAAK;AAChD,eAAO,EAAE,IAAI,KAAK;AAAA,MACpB,SAAS,KAAU;AACjB,cAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAGA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA,OAAO,SAAS,UAAU;AACxB,YAAM,QAAQC,cAAa,IAAI,QAAQ,OAAO,EAAE;AAEhD,UAAI,CAAC,OAAO;AACV,cAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;AAAA,MACF;AAEA,YAAM,EAAE,QAAQ,IAAI,QAAQ;AAE5B,UAAI,CAAC,SAAS;AACZ,cAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,CAAC;AACrD;AAAA,MACF;AAEA,UAAI;AACF,cAAMA,cAAa,KAAK,QAAQ,OAAO,IAAI,OAAO;AAClD,eAAO,EAAE,IAAI,KAAK;AAAA,MACpB,SAAS,KAAU;AACjB,cAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAGA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA,OAAO,SAAS,UAAU;AACxB,YAAM,QAAQC,cAAa,IAAI,QAAQ,OAAO,EAAE;AAEhD,UAAI,CAAC,OAAO;AACV,cAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;AAAA,MACF;AAEA,YAAM,QAAQ,SAAS,QAAQ,MAAM,SAAS,KAAK;AACnD,YAAM,OAAOA,cAAa,QAAQ,QAAQ,OAAO,IAAI,KAAK;AAE1D,aAAO,EAAE,KAAK;AAAA,IAChB;AAAA,EACF;AAGA,EAAAD,QAAO,IAAI,kBAAkB,YAAY;AACvC,WAAO;AAAA,MACL,WAAW,OAAO,QAAQ,OAAO,OAAO,SAAS,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,OAAO;AAAA,QAC5E;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,OAAO,SAAS;AAAA,MAClB,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,EAAAA,QAAO,IAAyC,cAAc,OAAO,YAAY;AAE/E,WAAO,EAAE,MAAM,CAAC,EAAE;AAAA,EACpB,CAAC;AACH;;;AC/MO,SAAS,kBAAkBG,SAAyB,SAAoB;AAC7E,QAAM,EAAE,QAAQ,cAAAC,cAAa,IAAI;AACjC,QAAM,UAA+B,oBAAI,IAAI;AAG7C,EAAAD,QAAO,SAAS,OAAO,YAAY;AACjC,YAAQ,IAAI,OAAO,EAAE,WAAW,KAAK,GAAG,CAAC,YAAY,QAAQ;AAC3D,YAAM,KAAK;AACX,YAAM,WAAW,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAEnD,YAAM,SAAiB;AAAA,QACrB;AAAA,QACA,eAAe,oBAAI,IAAI;AAAA,QACvB,eAAe,CAAC,OAAO,KAAK;AAAA,MAC9B;AAEA,cAAQ,IAAI,UAAU,MAAM;AAE5B,SAAG,GAAG,WAAW,CAAC,SAAS;AACzB,YAAI;AACF,gBAAM,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC;AACtC,wBAAc,UAAU,QAAQ,GAAG;AAAA,QACrC,SAAS,KAAK;AACZ,eAAK,IAAI,EAAE,MAAM,SAAS,OAAO,eAAe,CAAC;AAAA,QACnD;AAAA,MACF,CAAC;AAED,SAAG,GAAG,SAAS,MAAM;AACnB,gBAAQ,OAAO,QAAQ;AAAA,MACzB,CAAC;AAED,SAAG,GAAG,SAAS,CAAC,QAAQ;AACtB,gBAAQ,MAAM,oBAAoB,GAAG;AACrC,gBAAQ,OAAO,QAAQ;AAAA,MACzB,CAAC;AAGD,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,eAAe,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,WAAS,cAAc,UAAkB,QAAgB,KAAU;AAEjE,QAAI,IAAI,SAAS,QAAQ;AACvB,UAAI,aAAa,IAAI,OAAO,MAAM,GAAG;AACnC,eAAO,gBAAgB;AACvB,aAAK,OAAO,IAAI,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,MACjD,OAAO;AACL,aAAK,OAAO,IAAI,EAAE,MAAM,QAAQ,SAAS,OAAO,OAAO,gBAAgB,CAAC;AAAA,MAC1E;AACA;AAAA,IACF;AAGA,QAAI,CAAC,OAAO,eAAe;AACzB,WAAK,OAAO,IAAI,EAAE,MAAM,SAAS,OAAO,oBAAoB,CAAC;AAC7D;AAAA,IACF;AAEA,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AACH,YAAI,IAAI,SAAS;AACf,iBAAO,cAAc,IAAI,QAAQ,IAAI,OAAO,EAAE;AAC9C,eAAK,OAAO,IAAI,EAAE,MAAM,cAAc,SAAS,QAAQ,IAAI,OAAO,GAAG,CAAC;AAAA,QACxE;AACA;AAAA,MAEF,KAAK;AACH,YAAI,IAAI,SAAS;AACf,iBAAO,cAAc,OAAO,QAAQ,IAAI,OAAO,EAAE;AACjD,eAAK,OAAO,IAAI,EAAE,MAAM,gBAAgB,SAAS,QAAQ,IAAI,OAAO,GAAG,CAAC;AAAA,QAC1E;AACA;AAAA,MAEF,KAAK;AACH,eAAO,cAAc,IAAI,QAAQ;AACjC,aAAK,OAAO,IAAI,EAAE,MAAM,cAAc,SAAS,SAAS,CAAC;AACzD;AAAA,MAEF,KAAK;AACH,eAAO,cAAc,OAAO,QAAQ;AACpC,aAAK,OAAO,IAAI,EAAE,MAAM,gBAAgB,SAAS,SAAS,CAAC;AAC3D;AAAA,MAEF,KAAK;AACH,aAAK,OAAO,IAAI,EAAE,MAAM,QAAQ,IAAI,KAAK,IAAI,EAAE,CAAC;AAChD;AAAA,MAEF;AACE,aAAK,OAAO,IAAI,EAAE,MAAM,SAAS,OAAO,yBAAyB,IAAI,IAAI,GAAG,CAAC;AAAA,IACjF;AAAA,EACF;AAGA,EAAAC,cAAa,GAAG,iBAAiB,CAAC,UAAU;AAC1C,cAAU,UAAU,EAAE,MAAM,iBAAiB,OAAO,cAAc,KAAK,EAAE,CAAC;AAAA,EAC5E,CAAC;AAED,EAAAA,cAAa,GAAG,iBAAiB,CAAC,UAAU;AAC1C,cAAU,UAAU,EAAE,MAAM,iBAAiB,OAAO,cAAc,KAAK,EAAE,CAAC;AAAA,EAC5E,CAAC;AAED,EAAAA,cAAa,GAAG,iBAAiB,CAAC,UAAU;AAC1C,cAAU,UAAU,EAAE,MAAM,iBAAiB,OAAO,cAAc,KAAK,EAAE,CAAC;AAAA,EAC5E,CAAC;AAED,EAAAA,cAAa,GAAG,eAAe,CAAC,OAAO,UAAU;AAC/C,cAAU,UAAU,EAAE,MAAM,eAAe,OAAO,cAAc,KAAK,GAAG,OAAO,MAAM,QAAQ,CAAC;AAAA,EAChG,CAAC;AAED,EAAAA,cAAa,GAAG,aAAa,CAAC,SAAS;AACrC,cAAU,QAAQ,KAAK,OAAO,IAAI,EAAE,MAAM,aAAa,GAAG,KAAK,CAAC;AAAA,EAClE,CAAC;AAED,WAAS,UAAU,SAAiB,SAAiB;AACnD,eAAW,UAAU,QAAQ,OAAO,GAAG;AACrC,UAAI,OAAO,iBAAiB,OAAO,cAAc,IAAI,OAAO,GAAG;AAC7D,aAAK,OAAO,IAAI,OAAO;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,WAAS,KAAK,IAAe,SAAiB;AAC5C,QAAI,GAAG,eAAe,GAAG,MAAM;AAC7B,SAAG,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACjC;AAAA,EACF;AAEA,WAAS,cAAc,OAAY;AACjC,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,KAAK,MAAM;AAAA,MACX,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;;;ALrJA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AAQpC,IAAI,SAA4C;AAChD,IAAI,eAAoC;AACxC,IAAM,YAAY,KAAK,IAAI;AAE3B,eAAsB,YAAY,SAAwB;AACxD,QAAM,SAAS,WAAW,QAAQ,UAAU;AAG5C,QAAM,UAAUC,MAAK,QAAQ,SAAS,QAAQ,cAAc;AAC5D,EAAAC,WAAU,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAE/C,QAAM,SAAS,KAAK;AAAA,IAClB,OAAO,OAAO,SAAS,SAAS;AAAA,IAChC,WAAW;AAAA,MACT,SAAS;AAAA,QACP;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,UAAU,KAAK;AAAA,UAC1B,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,aAAa,QAAQ;AAAA,UAChC,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,SAASD,MAAK,QAAQ,SAAS,QAAQ,aAAa;AAC1D,EAAAC,WAAU,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,eAAa,MAAM;AAGnB,WAAS,QAAQ,EAAE,OAAO,CAAC;AAG3B,QAAM,OAAO,SAAS,aAAa;AAAA,IACjC,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,SAAS,gBAAgB;AAGtC,QAAM,gBAAgBD,MAAK,WAAW,MAAM,aAAa,MAAM;AAC/D,MAAIE,YAAW,aAAa,GAAG;AAC7B,UAAM,OAAO,SAAS,eAAe;AAAA,MACnC,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAGA,iBAAe,IAAI,aAAa;AAAA,IAC9B,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,EACF,CAAC;AAGD,oBAAkB,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,oBAAkB,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,WAAW,aAAa,EAAE,QAAQ,MAAM,QAAQ,KAAK,OAAO,KAAK,IAAI,IAAI,aAAa,GAAI,EAAE,EAAE;AAGzG,QAAM,WAAW,OAAO,WAAmB;AACzC,WAAO,KAAK,YAAY,MAAM,oBAAoB;AAGlD,QAAI,cAAc;AAChB,YAAM,aAAa,QAAQ;AAAA,IAC7B;AAGA,QAAI,QAAQ;AACV,YAAM,OAAO,MAAM;AAAA,IACrB;AAGA,UAAMC,MAAK,YAAY;AACvB,QAAIA,IAAI,CAAAA,IAAG,MAAM;AAEjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,WAAW,MAAM,SAAS,SAAS,CAAC;AAC/C,UAAQ,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC;AAG7C,MAAI;AACF,UAAM,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,OAAO,QAAQ,QAAQ,UAAU,CAAC;AAElF,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,wCAKmB,QAAQ,KAAK,SAAS,EAAE,OAAO,EAAE,CAAC;AAAA,wCAClC,QAAQ,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;AAAA,sCACnC,QAAQ,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;AAAA;AAAA;AAAA,CAGhE;AAAA,EACC,SAAS,KAAK;AACZ,WAAO,MAAM,GAAG;AAChB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,IAAI,QAAQ,IAAI,iBAAiB;AAC/B,cAAY;AAAA,IACV,MAAM,SAAS,QAAQ,IAAI,iBAAiB,MAAM;AAAA,IAClD,YAAY,QAAQ,IAAI;AAAA,IACxB,SAAS,QAAQ,IAAI,qBAAqB;AAAA,EAC5C,CAAC;AACH;","names":["join","existsSync","mkdirSync","join","existsSync","join","existsSync","server","agentManager","startTime","server","agentManager","join","mkdirSync","existsSync","db"]}
1
+ {"version":3,"sources":["../src/server/index.ts","../src/server/config.ts","../src/server/db/index.ts","../src/server/agents/manager.ts","../src/server/api/routes.ts","../src/server/ws/index.ts"],"sourcesContent":["import Fastify from 'fastify';\nimport fastifyWebsocket from '@fastify/websocket';\nimport fastifyCors from '@fastify/cors';\nimport fastifyStatic from '@fastify/static';\nimport pino from 'pino';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\n\nimport { loadConfig, DirigentConfig } from './config.js';\nimport { initDatabase, getDatabase } from './db/index.js';\nimport { AgentManager } from './agents/manager.js';\nimport { registerApiRoutes } from './api/routes.js';\nimport { registerWebSocket } from './ws/index.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ServerOptions {\n port: number;\n configPath: string;\n dataDir: string;\n}\n\nlet server: ReturnType<typeof Fastify> | null = null;\nlet agentManager: AgentManager | null = null;\nconst startTime = Date.now();\n\nexport async function startServer(options: ServerOptions) {\n const config = loadConfig(options.configPath);\n\n // Setup logging\n const logPath = join(options.dataDir, 'logs', 'dirigent.log');\n mkdirSync(dirname(logPath), { recursive: true });\n\n const logger = pino({\n level: config.logging?.level || 'info',\n transport: {\n targets: [\n {\n target: 'pino-pretty',\n options: { colorize: true },\n level: 'info',\n },\n {\n target: 'pino/file',\n options: { destination: logPath },\n level: 'debug',\n },\n ],\n },\n });\n\n // Initialize database\n const dbPath = join(options.dataDir, 'data', 'dirigent.db');\n mkdirSync(dirname(dbPath), { recursive: true });\n initDatabase(dbPath);\n\n // Create Fastify server\n server = Fastify({ loggerInstance: logger });\n\n // Register plugins\n await server.register(fastifyCors, {\n origin: true,\n credentials: true,\n });\n\n await server.register(fastifyWebsocket);\n\n // Serve dashboard static files\n const dashboardPath = join(__dirname, '..', 'dashboard', 'dist');\n if (existsSync(dashboardPath)) {\n await server.register(fastifyStatic, {\n root: dashboardPath,\n prefix: '/',\n });\n }\n\n // Initialize agent manager\n agentManager = new AgentManager({\n dataDir: options.dataDir,\n config,\n logger,\n });\n\n // Register API routes\n registerApiRoutes(server, {\n config,\n agentManager,\n startTime,\n });\n\n // Register WebSocket handlers\n registerWebSocket(server, {\n config,\n agentManager,\n });\n\n // Health check\n server.get('/health', async () => ({ status: 'ok', uptime: Math.floor((Date.now() - startTime) / 1000) }));\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n // Stop all agents\n if (agentManager) {\n await agentManager.stopAll();\n }\n\n // Close server\n if (server) {\n await server.close();\n }\n\n // Close database\n const db = getDatabase();\n if (db) db.close();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Start server\n try {\n await server.listen({ port: options.port, host: config.server?.host || '0.0.0.0' });\n\n console.log(`\n╔══════════════════════════════════════════════════════════╗\n║ ║\n║ 🎭 DIRIGENT SERVER RUNNING ║\n║ ║\n║ Dashboard: http://localhost:${options.port.toString().padEnd(25)}║\n║ API: http://localhost:${options.port}/api${' '.repeat(21)}║\n║ WebSocket: ws://localhost:${options.port}/ws${' '.repeat(22)}║\n║ ║\n╚══════════════════════════════════════════════════════════╝\n`);\n } catch (err) {\n logger.error(err);\n process.exit(1);\n }\n}\n\n// Export for direct invocation\nif (process.env.DIRIGENT_CONFIG) {\n startServer({\n port: parseInt(process.env.DIRIGENT_PORT || '3000'),\n configPath: process.env.DIRIGENT_CONFIG,\n dataDir: process.env.DIRIGENT_DATA_DIR || '.dirigent',\n });\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nconst AgentTemplateSchema = z.object({\n driver: z.string(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n command: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nconst ConfigSchema = z.object({\n version: z.string().default('1'),\n server: z\n .object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n })\n .default({}),\n auth: z\n .object({\n enabled: z.boolean().default(true),\n adminToken: z.string().optional(),\n apiKeys: z.array(z.string()).optional(),\n })\n .default({}),\n agents: z\n .object({\n maxConcurrent: z.number().default(10),\n defaultTimeout: z.number().default(3600),\n templates: z.record(AgentTemplateSchema).default({}),\n })\n .default({}),\n logging: z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n format: z.enum(['pretty', 'json']).default('pretty'),\n file: z.string().optional(),\n })\n .default({}),\n database: z\n .object({\n path: z.string().default('data/dirigent.db'),\n })\n .default({}),\n});\n\nexport type DirigentConfig = z.infer<typeof ConfigSchema>;\nexport type AgentTemplate = z.infer<typeof AgentTemplateSchema>;\n\nlet cachedConfig: DirigentConfig | null = null;\n\nexport function loadConfig(configPath?: string): DirigentConfig {\n if (cachedConfig) return cachedConfig;\n\n const path = configPath || findConfigPath();\n\n if (!path || !existsSync(path)) {\n // Return defaults\n cachedConfig = ConfigSchema.parse({});\n return cachedConfig;\n }\n\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n cachedConfig = ConfigSchema.parse(parsed);\n\n return cachedConfig;\n}\n\nfunction findConfigPath(): string | null {\n const candidates = [\n join(process.cwd(), '.dirigent', 'config.json'),\n join(process.cwd(), 'dirigent.json'),\n join(process.env.HOME || '', '.dirigent', 'config.json'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function validateAuth(token: string, config: DirigentConfig): boolean {\n if (!config.auth.enabled) return true;\n\n // Check admin token\n if (config.auth.adminToken && token === config.auth.adminToken) return true;\n\n // Check API keys\n if (config.auth.apiKeys?.includes(token)) return true;\n\n return false;\n}\n","import Database from 'better-sqlite3';\n\nlet db: Database.Database | null = null;\n\nexport function initDatabase(path: string): Database.Database {\n db = new Database(path);\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Create tables\n db.exec(`\n -- Agents table\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n template TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'created',\n workspace TEXT,\n model TEXT,\n config TEXT,\n pid INTEGER,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n stopped_at INTEGER,\n error TEXT\n );\n\n -- Agent logs table\n CREATE TABLE IF NOT EXISTS agent_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n metadata TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Tasks table\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n agent_id TEXT,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n result TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Audit log table\n CREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n actor TEXT,\n target_type TEXT,\n target_id TEXT,\n details TEXT,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n );\n\n -- Sessions table (for WebSocket connections)\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT,\n connected_at INTEGER NOT NULL DEFAULT (unixepoch()),\n last_activity INTEGER NOT NULL DEFAULT (unixepoch()),\n metadata TEXT\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_agent_logs_agent_id ON agent_logs(agent_id);\n CREATE INDEX IF NOT EXISTS idx_agent_logs_timestamp ON agent_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_tasks_agent_id ON tasks(agent_id);\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp);\n `);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database | null {\n return db;\n}\n\n// Helper functions\nexport function insertAgent(agent: {\n id: string;\n name: string;\n template: string;\n workspace?: string;\n model?: string;\n config?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agents (id, name, template, workspace, model, config)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n agent.id,\n agent.name,\n agent.template,\n agent.workspace || null,\n agent.model || null,\n agent.config ? JSON.stringify(agent.config) : null\n );\n}\n\nexport function updateAgent(id: string, updates: Record<string, any>) {\n const keys = Object.keys(updates);\n const values = keys.map((k) => (typeof updates[k] === 'object' ? JSON.stringify(updates[k]) : updates[k]));\n\n const stmt = db!.prepare(`\n UPDATE agents SET ${keys.map((k) => `${k} = ?`).join(', ')}\n WHERE id = ?\n `);\n\n stmt.run(...values, id);\n}\n\nexport function getAgent(id: string) {\n const stmt = db!.prepare('SELECT * FROM agents WHERE id = ?');\n const row = stmt.get(id) as any;\n if (row?.config) row.config = JSON.parse(row.config);\n return row;\n}\n\nexport function getAgents(includesStopped = false) {\n const stmt = db!.prepare(\n includesStopped\n ? 'SELECT * FROM agents ORDER BY created_at DESC'\n : \"SELECT * FROM agents WHERE status != 'stopped' ORDER BY created_at DESC\"\n );\n return stmt.all().map((row: any) => {\n if (row.config) row.config = JSON.parse(row.config);\n return row;\n });\n}\n\nexport function insertLog(log: {\n agentId: string;\n level: string;\n message: string;\n metadata?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agent_logs (agent_id, level, message, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n stmt.run(log.agentId, log.level, log.message, log.metadata ? JSON.stringify(log.metadata) : null);\n}\n\nexport function getLogs(agentId: string, limit = 100) {\n const stmt = db!.prepare(`\n SELECT * FROM agent_logs\n WHERE agent_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `);\n\n return stmt.all(agentId, limit).reverse().map((row: any) => {\n if (row.metadata) row.metadata = JSON.parse(row.metadata);\n return row;\n });\n}\n\nexport function audit(action: string, actor: string | null, targetType: string | null, targetId: string | null, details?: object) {\n const stmt = db!.prepare(`\n INSERT INTO audit_log (action, actor, target_type, target_id, details)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(action, actor, targetType, targetId, details ? JSON.stringify(details) : null);\n}\n","import { EventEmitter } from 'events';\nimport { nanoid } from 'nanoid';\nimport { spawn, ChildProcess } from 'child_process';\nimport treeKill from 'tree-kill';\nimport { join } from 'path';\nimport { mkdirSync, existsSync } from 'fs';\nimport type { Logger } from 'pino';\n\nimport { DirigentConfig, AgentTemplate } from '../config.js';\nimport { insertAgent, updateAgent, getAgent, getAgents, insertLog, getLogs, audit } from '../db/index.js';\n\nexport interface Agent {\n id: string;\n name: string;\n template: string;\n status: 'created' | 'starting' | 'running' | 'idle' | 'stopping' | 'stopped' | 'error';\n workspace?: string;\n model?: string;\n pid?: number;\n process?: ChildProcess;\n currentTask?: string;\n createdAt: number;\n startedAt?: number;\n stoppedAt?: number;\n error?: string;\n}\n\ninterface ManagerOptions {\n dataDir: string;\n config: DirigentConfig;\n logger: Logger;\n}\n\nexport class AgentManager extends EventEmitter {\n private agents: Map<string, Agent> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private dataDir: string;\n private config: DirigentConfig;\n private logger: Logger;\n\n constructor(options: ManagerOptions) {\n super();\n this.dataDir = options.dataDir;\n this.config = options.config;\n this.logger = options.logger;\n\n // Load existing agents from database\n this.loadAgents();\n }\n\n private loadAgents() {\n const dbAgents = getAgents(false);\n for (const dbAgent of dbAgents) {\n // Only load non-running agents; running agents will need to be respawned\n if (dbAgent.status !== 'stopped') {\n this.agents.set(dbAgent.id, {\n id: dbAgent.id,\n name: dbAgent.name,\n template: dbAgent.template,\n status: 'stopped', // Reset to stopped since we restarted\n workspace: dbAgent.workspace,\n model: dbAgent.model,\n createdAt: dbAgent.created_at * 1000,\n });\n\n // Update database\n updateAgent(dbAgent.id, { status: 'stopped' });\n }\n }\n }\n\n async spawn(options: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n }): Promise<Agent> {\n const { template, name, workspace, task, model } = options;\n\n // Get template config\n const templateConfig = this.config.agents.templates[template];\n if (!templateConfig) {\n throw new Error(`Unknown template: ${template}`);\n }\n\n // Check max concurrent\n const runningCount = Array.from(this.agents.values()).filter(\n (a) => a.status === 'running' || a.status === 'starting'\n ).length;\n\n if (runningCount >= this.config.agents.maxConcurrent) {\n throw new Error(`Max concurrent agents (${this.config.agents.maxConcurrent}) reached`);\n }\n\n // Create agent\n const id = nanoid(12);\n const agentName = name || `${template}-${id.slice(0, 6)}`;\n const agentWorkspace = workspace || join(this.dataDir, 'workspaces', id);\n\n // Ensure workspace exists\n if (!existsSync(agentWorkspace)) {\n mkdirSync(agentWorkspace, { recursive: true });\n }\n\n const agent: Agent = {\n id,\n name: agentName,\n template,\n status: 'created',\n workspace: agentWorkspace,\n model: model || templateConfig.model,\n currentTask: task,\n createdAt: Date.now(),\n };\n\n // Save to database\n insertAgent({\n id: agent.id,\n name: agent.name,\n template: agent.template,\n workspace: agent.workspace,\n model: agent.model,\n });\n\n audit('agent.created', null, 'agent', id, { name: agentName, template });\n\n this.agents.set(id, agent);\n this.emit('agent:created', agent);\n\n // Start the agent process\n await this.startAgent(agent, templateConfig, task);\n\n return agent;\n }\n\n private async startAgent(agent: Agent, template: AgentTemplate, initialTask?: string) {\n agent.status = 'starting';\n updateAgent(agent.id, { status: 'starting' });\n this.emit('agent:starting', agent);\n\n try {\n const { command, env } = this.buildCommand(agent, template);\n\n this.logger.info({ agentId: agent.id, command }, 'Starting agent');\n\n const proc = spawn(command[0], command.slice(1), {\n cwd: agent.workspace,\n env: {\n ...process.env,\n ...env,\n DIRIGENT_AGENT_ID: agent.id,\n DIRIGENT_AGENT_NAME: agent.name,\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n agent.pid = proc.pid;\n agent.process = proc;\n agent.status = 'running';\n agent.startedAt = Date.now();\n\n updateAgent(agent.id, {\n status: 'running',\n pid: proc.pid,\n started_at: Math.floor(Date.now() / 1000),\n });\n\n this.processes.set(agent.id, proc);\n\n // Handle stdout\n proc.stdout?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'info', message);\n }\n });\n\n // Handle stderr\n proc.stderr?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'error', message);\n }\n });\n\n // Handle exit\n proc.on('exit', (code, signal) => {\n this.logger.info({ agentId: agent.id, code, signal }, 'Agent exited');\n\n agent.status = code === 0 ? 'stopped' : 'error';\n agent.stoppedAt = Date.now();\n if (code !== 0) {\n agent.error = `Exited with code ${code}`;\n }\n\n updateAgent(agent.id, {\n status: agent.status,\n stopped_at: Math.floor(Date.now() / 1000),\n error: agent.error || null,\n });\n\n this.processes.delete(agent.id);\n this.emit('agent:stopped', agent);\n\n audit('agent.stopped', null, 'agent', agent.id, { code, signal });\n });\n\n proc.on('error', (err) => {\n this.logger.error({ agentId: agent.id, err }, 'Agent process error');\n agent.status = 'error';\n agent.error = err.message;\n\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n });\n\n this.emit('agent:running', agent);\n audit('agent.started', null, 'agent', agent.id, { pid: proc.pid });\n\n // Send initial task if provided\n if (initialTask && proc.stdin) {\n proc.stdin.write(initialTask + '\\n');\n }\n } catch (err: any) {\n agent.status = 'error';\n agent.error = err.message;\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n throw err;\n }\n }\n\n private buildCommand(agent: Agent, template: AgentTemplate): { command: string[]; env: Record<string, string> } {\n const env: Record<string, string> = { ...template.env };\n\n switch (template.driver) {\n case 'claude-code':\n return {\n command: ['claude', '--dangerously-skip-permissions'],\n env: {\n ...env,\n ANTHROPIC_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'codex':\n return {\n command: ['codex', '--model', agent.model || template.model || 'codex-1'],\n env,\n };\n\n case 'clawdbot':\n return {\n command: ['clawdbot', 'agent', '--headless'],\n env: {\n ...env,\n CLAWDBOT_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'subprocess':\n if (!template.command || template.command.length === 0) {\n throw new Error('subprocess driver requires command');\n }\n return { command: template.command, env };\n\n default:\n throw new Error(`Unknown driver: ${template.driver}`);\n }\n }\n\n async stop(id: string, force = false): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running' && agent.status !== 'starting') {\n return;\n }\n\n agent.status = 'stopping';\n this.emit('agent:stopping', agent);\n\n const proc = this.processes.get(id);\n if (proc && proc.pid) {\n await new Promise<void>((resolve, reject) => {\n treeKill(proc.pid!, force ? 'SIGKILL' : 'SIGTERM', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n audit('agent.stop_requested', null, 'agent', id, { force });\n }\n\n async stopAll(): Promise<void> {\n const promises = Array.from(this.agents.values())\n .filter((a) => a.status === 'running' || a.status === 'starting')\n .map((a) => this.stop(a.id, true));\n\n await Promise.allSettled(promises);\n }\n\n async send(id: string, message: string): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running') {\n throw new Error(`Agent is not running: ${agent.status}`);\n }\n\n const proc = this.processes.get(id);\n if (!proc || !proc.stdin) {\n throw new Error('Agent process not available');\n }\n\n proc.stdin.write(message + '\\n');\n this.log(id, 'info', `[USER] ${message}`);\n\n audit('agent.message_sent', null, 'agent', id, { length: message.length });\n }\n\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n list(includeStopped = false): Agent[] {\n const agents = Array.from(this.agents.values());\n if (includeStopped) return agents;\n return agents.filter((a) => a.status !== 'stopped');\n }\n\n log(agentId: string, level: string, message: string) {\n insertLog({ agentId, level, message });\n this.emit('agent:log', { agentId, level, message, timestamp: Date.now() });\n }\n\n getLogs(agentId: string, limit = 100) {\n return getLogs(agentId, limit);\n }\n\n getStats() {\n const agents = Array.from(this.agents.values());\n return {\n total: agents.length,\n running: agents.filter((a) => a.status === 'running').length,\n idle: agents.filter((a) => a.status === 'idle').length,\n stopped: agents.filter((a) => a.status === 'stopped').length,\n error: agents.filter((a) => a.status === 'error').length,\n };\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\nimport { getAgents, audit } from '../db/index.js';\n\ninterface RouteOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n startTime: number;\n}\n\nexport function registerApiRoutes(server: FastifyInstance, options: RouteOptions) {\n const { config, agentManager, startTime } = options;\n\n // Auth middleware\n server.addHook('onRequest', async (request, reply) => {\n // Skip auth for health check\n if (request.url === '/health') return;\n\n // Skip auth for dashboard routes\n if (!request.url.startsWith('/api')) return;\n\n if (config.auth.enabled) {\n const authHeader = request.headers.authorization;\n const token = authHeader?.replace('Bearer ', '');\n\n if (!token || !validateAuth(token, config)) {\n reply.code(401).send({ error: 'Unauthorized' });\n return;\n }\n }\n });\n\n // Status\n server.get('/api/status', async () => {\n const stats = agentManager.getStats();\n const agents = agentManager.list(false);\n\n return {\n status: 'ok',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n agents: {\n ...stats,\n list: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n currentTask: a.currentTask,\n })),\n },\n };\n });\n\n // List agents\n server.get<{ Querystring: { all?: string } }>('/api/agents', async (request) => {\n const includeStopped = request.query.all === 'true';\n const agents = agentManager.list(includeStopped);\n\n return {\n agents: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n model: a.model,\n pid: a.pid,\n currentTask: a.currentTask,\n createdAt: a.createdAt,\n startedAt: a.startedAt,\n stoppedAt: a.stoppedAt,\n error: a.error,\n })),\n };\n });\n\n // Spawn agent\n server.post<{\n Body: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n };\n }>('/api/agents', async (request, reply) => {\n const { template, name, workspace, task, model } = request.body;\n\n if (!template) {\n reply.code(400).send({ error: 'template is required' });\n return;\n }\n\n try {\n const agent = await agentManager.spawn({ template, name, workspace, task, model });\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n },\n };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n });\n\n // Get agent\n server.get<{ Params: { id: string } }>('/api/agents/:id', async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n },\n };\n });\n\n // Stop agent\n server.delete<{ Params: { id: string }; Querystring: { force?: string } }>(\n '/api/agents/:id',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const force = request.query.force === 'true';\n\n try {\n await agentManager.stop(request.params.id, force);\n return { ok: true };\n } catch (err: any) {\n reply.code(500).send({ error: err.message });\n }\n }\n );\n\n // Send message to agent\n server.post<{ Params: { id: string }; Body: { message: string } }>(\n '/api/agents/:id/send',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const { message } = request.body;\n\n if (!message) {\n reply.code(400).send({ error: 'message is required' });\n return;\n }\n\n try {\n await agentManager.send(request.params.id, message);\n return { ok: true };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n }\n );\n\n // Get agent logs\n server.get<{ Params: { id: string }; Querystring: { lines?: string } }>(\n '/api/agents/:id/logs',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const limit = parseInt(request.query.lines || '100');\n const logs = agentManager.getLogs(request.params.id, limit);\n\n return { logs };\n }\n );\n\n // Templates\n server.get('/api/templates', async () => {\n return {\n templates: Object.entries(config.agents.templates).map(([name, template]) => ({\n name,\n driver: template.driver,\n model: template.model,\n })),\n };\n });\n\n // Audit log\n server.get<{ Querystring: { limit?: string } }>('/api/audit', async (request) => {\n // TODO: Implement audit log retrieval\n return { logs: [] };\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\n\ninterface WSOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n}\n\ninterface Client {\n ws: WebSocket;\n subscriptions: Set<string>;\n authenticated: boolean;\n}\n\nexport function registerWebSocket(server: FastifyInstance, options: WSOptions) {\n const { config, agentManager } = options;\n const clients: Map<string, Client> = new Map();\n\n // WebSocket route\n server.register(async (fastify) => {\n fastify.get('/ws', { websocket: true }, (connection, req) => {\n const ws = connection;\n const clientId = Math.random().toString(36).slice(2);\n\n const client: Client = {\n ws,\n subscriptions: new Set(),\n authenticated: !config.auth.enabled,\n };\n\n clients.set(clientId, client);\n\n ws.on('message', (data) => {\n try {\n const msg = JSON.parse(data.toString());\n handleMessage(clientId, client, msg);\n } catch (err) {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n }\n });\n\n ws.on('close', () => {\n clients.delete(clientId);\n });\n\n ws.on('error', (err) => {\n console.error('WebSocket error:', err);\n clients.delete(clientId);\n });\n\n // Send welcome\n send(ws, {\n type: 'welcome',\n clientId,\n authenticated: client.authenticated,\n });\n });\n });\n\n function handleMessage(clientId: string, client: Client, msg: any) {\n // Auth\n if (msg.type === 'auth') {\n if (validateAuth(msg.token, config)) {\n client.authenticated = true;\n send(client.ws, { type: 'auth', success: true });\n } else {\n send(client.ws, { type: 'auth', success: false, error: 'Invalid token' });\n }\n return;\n }\n\n // Require auth for other messages\n if (!client.authenticated) {\n send(client.ws, { type: 'error', error: 'Not authenticated' });\n return;\n }\n\n switch (msg.type) {\n case 'subscribe:logs':\n if (msg.agentId) {\n client.subscriptions.add(`logs:${msg.agentId}`);\n send(client.ws, { type: 'subscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'unsubscribe:logs':\n if (msg.agentId) {\n client.subscriptions.delete(`logs:${msg.agentId}`);\n send(client.ws, { type: 'unsubscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'subscribe:agents':\n client.subscriptions.add('agents');\n send(client.ws, { type: 'subscribed', channel: 'agents' });\n break;\n\n case 'unsubscribe:agents':\n client.subscriptions.delete('agents');\n send(client.ws, { type: 'unsubscribed', channel: 'agents' });\n break;\n\n case 'ping':\n send(client.ws, { type: 'pong', ts: Date.now() });\n break;\n\n default:\n send(client.ws, { type: 'error', error: `Unknown message type: ${msg.type}` });\n }\n }\n\n // Agent event handlers\n agentManager.on('agent:created', (agent) => {\n broadcast('agents', { type: 'agent:created', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:running', (agent) => {\n broadcast('agents', { type: 'agent:running', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:stopped', (agent) => {\n broadcast('agents', { type: 'agent:stopped', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:error', (agent, error) => {\n broadcast('agents', { type: 'agent:error', agent: sanitizeAgent(agent), error: error.message });\n });\n\n agentManager.on('agent:log', (data) => {\n broadcast(`logs:${data.agentId}`, { type: 'agent:log', ...data });\n });\n\n function broadcast(channel: string, message: object) {\n for (const client of clients.values()) {\n if (client.authenticated && client.subscriptions.has(channel)) {\n send(client.ws, message);\n }\n }\n }\n\n function send(ws: WebSocket, message: object) {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(message));\n }\n }\n\n function sanitizeAgent(agent: any) {\n return {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n };\n }\n}\n"],"mappings":"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","names":["join","existsSync","mkdirSync","join","existsSync","join","existsSync","server","agentManager","startTime","server","agentManager","join","mkdirSync","existsSync","db"]}
@@ -788,7 +788,7 @@ async function startServer(options) {
788
788
  const dbPath = join3(options.dataDir, "data", "dirigent.db");
789
789
  mkdirSync2(dirname(dbPath), { recursive: true });
790
790
  initDatabase(dbPath);
791
- server = Fastify({ logger });
791
+ server = Fastify({ loggerInstance: logger });
792
792
  await server.register(fastifyCors, {
793
793
  origin: true,
794
794
  credentials: true
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/index.ts","../../src/server/config.ts","../../src/server/db/index.ts","../../src/server/agents/manager.ts","../../src/server/api/routes.ts","../../src/server/ws/index.ts"],"sourcesContent":["import Fastify from 'fastify';\nimport fastifyWebsocket from '@fastify/websocket';\nimport fastifyCors from '@fastify/cors';\nimport fastifyStatic from '@fastify/static';\nimport pino from 'pino';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\n\nimport { loadConfig, DirigentConfig } from './config.js';\nimport { initDatabase, getDatabase } from './db/index.js';\nimport { AgentManager } from './agents/manager.js';\nimport { registerApiRoutes } from './api/routes.js';\nimport { registerWebSocket } from './ws/index.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ServerOptions {\n port: number;\n configPath: string;\n dataDir: string;\n}\n\nlet server: ReturnType<typeof Fastify> | null = null;\nlet agentManager: AgentManager | null = null;\nconst startTime = Date.now();\n\nexport async function startServer(options: ServerOptions) {\n const config = loadConfig(options.configPath);\n\n // Setup logging\n const logPath = join(options.dataDir, 'logs', 'dirigent.log');\n mkdirSync(dirname(logPath), { recursive: true });\n\n const logger = pino({\n level: config.logging?.level || 'info',\n transport: {\n targets: [\n {\n target: 'pino-pretty',\n options: { colorize: true },\n level: 'info',\n },\n {\n target: 'pino/file',\n options: { destination: logPath },\n level: 'debug',\n },\n ],\n },\n });\n\n // Initialize database\n const dbPath = join(options.dataDir, 'data', 'dirigent.db');\n mkdirSync(dirname(dbPath), { recursive: true });\n initDatabase(dbPath);\n\n // Create Fastify server\n server = Fastify({ logger });\n\n // Register plugins\n await server.register(fastifyCors, {\n origin: true,\n credentials: true,\n });\n\n await server.register(fastifyWebsocket);\n\n // Serve dashboard static files\n const dashboardPath = join(__dirname, '..', 'dashboard', 'dist');\n if (existsSync(dashboardPath)) {\n await server.register(fastifyStatic, {\n root: dashboardPath,\n prefix: '/',\n });\n }\n\n // Initialize agent manager\n agentManager = new AgentManager({\n dataDir: options.dataDir,\n config,\n logger,\n });\n\n // Register API routes\n registerApiRoutes(server, {\n config,\n agentManager,\n startTime,\n });\n\n // Register WebSocket handlers\n registerWebSocket(server, {\n config,\n agentManager,\n });\n\n // Health check\n server.get('/health', async () => ({ status: 'ok', uptime: Math.floor((Date.now() - startTime) / 1000) }));\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n // Stop all agents\n if (agentManager) {\n await agentManager.stopAll();\n }\n\n // Close server\n if (server) {\n await server.close();\n }\n\n // Close database\n const db = getDatabase();\n if (db) db.close();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Start server\n try {\n await server.listen({ port: options.port, host: config.server?.host || '0.0.0.0' });\n\n console.log(`\n╔══════════════════════════════════════════════════════════╗\n║ ║\n║ 🎭 DIRIGENT SERVER RUNNING ║\n║ ║\n║ Dashboard: http://localhost:${options.port.toString().padEnd(25)}║\n║ API: http://localhost:${options.port}/api${' '.repeat(21)}║\n║ WebSocket: ws://localhost:${options.port}/ws${' '.repeat(22)}║\n║ ║\n╚══════════════════════════════════════════════════════════╝\n`);\n } catch (err) {\n logger.error(err);\n process.exit(1);\n }\n}\n\n// Export for direct invocation\nif (process.env.DIRIGENT_CONFIG) {\n startServer({\n port: parseInt(process.env.DIRIGENT_PORT || '3000'),\n configPath: process.env.DIRIGENT_CONFIG,\n dataDir: process.env.DIRIGENT_DATA_DIR || '.dirigent',\n });\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nconst AgentTemplateSchema = z.object({\n driver: z.string(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n command: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nconst ConfigSchema = z.object({\n version: z.string().default('1'),\n server: z\n .object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n })\n .default({}),\n auth: z\n .object({\n enabled: z.boolean().default(true),\n adminToken: z.string().optional(),\n apiKeys: z.array(z.string()).optional(),\n })\n .default({}),\n agents: z\n .object({\n maxConcurrent: z.number().default(10),\n defaultTimeout: z.number().default(3600),\n templates: z.record(AgentTemplateSchema).default({}),\n })\n .default({}),\n logging: z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n format: z.enum(['pretty', 'json']).default('pretty'),\n file: z.string().optional(),\n })\n .default({}),\n database: z\n .object({\n path: z.string().default('data/dirigent.db'),\n })\n .default({}),\n});\n\nexport type DirigentConfig = z.infer<typeof ConfigSchema>;\nexport type AgentTemplate = z.infer<typeof AgentTemplateSchema>;\n\nlet cachedConfig: DirigentConfig | null = null;\n\nexport function loadConfig(configPath?: string): DirigentConfig {\n if (cachedConfig) return cachedConfig;\n\n const path = configPath || findConfigPath();\n\n if (!path || !existsSync(path)) {\n // Return defaults\n cachedConfig = ConfigSchema.parse({});\n return cachedConfig;\n }\n\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n cachedConfig = ConfigSchema.parse(parsed);\n\n return cachedConfig;\n}\n\nfunction findConfigPath(): string | null {\n const candidates = [\n join(process.cwd(), '.dirigent', 'config.json'),\n join(process.cwd(), 'dirigent.json'),\n join(process.env.HOME || '', '.dirigent', 'config.json'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function validateAuth(token: string, config: DirigentConfig): boolean {\n if (!config.auth.enabled) return true;\n\n // Check admin token\n if (config.auth.adminToken && token === config.auth.adminToken) return true;\n\n // Check API keys\n if (config.auth.apiKeys?.includes(token)) return true;\n\n return false;\n}\n","import Database from 'better-sqlite3';\n\nlet db: Database.Database | null = null;\n\nexport function initDatabase(path: string): Database.Database {\n db = new Database(path);\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Create tables\n db.exec(`\n -- Agents table\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n template TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'created',\n workspace TEXT,\n model TEXT,\n config TEXT,\n pid INTEGER,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n stopped_at INTEGER,\n error TEXT\n );\n\n -- Agent logs table\n CREATE TABLE IF NOT EXISTS agent_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n metadata TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Tasks table\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n agent_id TEXT,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n result TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Audit log table\n CREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n actor TEXT,\n target_type TEXT,\n target_id TEXT,\n details TEXT,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n );\n\n -- Sessions table (for WebSocket connections)\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT,\n connected_at INTEGER NOT NULL DEFAULT (unixepoch()),\n last_activity INTEGER NOT NULL DEFAULT (unixepoch()),\n metadata TEXT\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_agent_logs_agent_id ON agent_logs(agent_id);\n CREATE INDEX IF NOT EXISTS idx_agent_logs_timestamp ON agent_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_tasks_agent_id ON tasks(agent_id);\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp);\n `);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database | null {\n return db;\n}\n\n// Helper functions\nexport function insertAgent(agent: {\n id: string;\n name: string;\n template: string;\n workspace?: string;\n model?: string;\n config?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agents (id, name, template, workspace, model, config)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n agent.id,\n agent.name,\n agent.template,\n agent.workspace || null,\n agent.model || null,\n agent.config ? JSON.stringify(agent.config) : null\n );\n}\n\nexport function updateAgent(id: string, updates: Record<string, any>) {\n const keys = Object.keys(updates);\n const values = keys.map((k) => (typeof updates[k] === 'object' ? JSON.stringify(updates[k]) : updates[k]));\n\n const stmt = db!.prepare(`\n UPDATE agents SET ${keys.map((k) => `${k} = ?`).join(', ')}\n WHERE id = ?\n `);\n\n stmt.run(...values, id);\n}\n\nexport function getAgent(id: string) {\n const stmt = db!.prepare('SELECT * FROM agents WHERE id = ?');\n const row = stmt.get(id) as any;\n if (row?.config) row.config = JSON.parse(row.config);\n return row;\n}\n\nexport function getAgents(includesStopped = false) {\n const stmt = db!.prepare(\n includesStopped\n ? 'SELECT * FROM agents ORDER BY created_at DESC'\n : \"SELECT * FROM agents WHERE status != 'stopped' ORDER BY created_at DESC\"\n );\n return stmt.all().map((row: any) => {\n if (row.config) row.config = JSON.parse(row.config);\n return row;\n });\n}\n\nexport function insertLog(log: {\n agentId: string;\n level: string;\n message: string;\n metadata?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agent_logs (agent_id, level, message, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n stmt.run(log.agentId, log.level, log.message, log.metadata ? JSON.stringify(log.metadata) : null);\n}\n\nexport function getLogs(agentId: string, limit = 100) {\n const stmt = db!.prepare(`\n SELECT * FROM agent_logs\n WHERE agent_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `);\n\n return stmt.all(agentId, limit).reverse().map((row: any) => {\n if (row.metadata) row.metadata = JSON.parse(row.metadata);\n return row;\n });\n}\n\nexport function audit(action: string, actor: string | null, targetType: string | null, targetId: string | null, details?: object) {\n const stmt = db!.prepare(`\n INSERT INTO audit_log (action, actor, target_type, target_id, details)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(action, actor, targetType, targetId, details ? JSON.stringify(details) : null);\n}\n","import { EventEmitter } from 'events';\nimport { nanoid } from 'nanoid';\nimport { spawn, ChildProcess } from 'child_process';\nimport treeKill from 'tree-kill';\nimport { join } from 'path';\nimport { mkdirSync, existsSync } from 'fs';\nimport type { Logger } from 'pino';\n\nimport { DirigentConfig, AgentTemplate } from '../config.js';\nimport { insertAgent, updateAgent, getAgent, getAgents, insertLog, getLogs, audit } from '../db/index.js';\n\nexport interface Agent {\n id: string;\n name: string;\n template: string;\n status: 'created' | 'starting' | 'running' | 'idle' | 'stopping' | 'stopped' | 'error';\n workspace?: string;\n model?: string;\n pid?: number;\n process?: ChildProcess;\n currentTask?: string;\n createdAt: number;\n startedAt?: number;\n stoppedAt?: number;\n error?: string;\n}\n\ninterface ManagerOptions {\n dataDir: string;\n config: DirigentConfig;\n logger: Logger;\n}\n\nexport class AgentManager extends EventEmitter {\n private agents: Map<string, Agent> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private dataDir: string;\n private config: DirigentConfig;\n private logger: Logger;\n\n constructor(options: ManagerOptions) {\n super();\n this.dataDir = options.dataDir;\n this.config = options.config;\n this.logger = options.logger;\n\n // Load existing agents from database\n this.loadAgents();\n }\n\n private loadAgents() {\n const dbAgents = getAgents(false);\n for (const dbAgent of dbAgents) {\n // Only load non-running agents; running agents will need to be respawned\n if (dbAgent.status !== 'stopped') {\n this.agents.set(dbAgent.id, {\n id: dbAgent.id,\n name: dbAgent.name,\n template: dbAgent.template,\n status: 'stopped', // Reset to stopped since we restarted\n workspace: dbAgent.workspace,\n model: dbAgent.model,\n createdAt: dbAgent.created_at * 1000,\n });\n\n // Update database\n updateAgent(dbAgent.id, { status: 'stopped' });\n }\n }\n }\n\n async spawn(options: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n }): Promise<Agent> {\n const { template, name, workspace, task, model } = options;\n\n // Get template config\n const templateConfig = this.config.agents.templates[template];\n if (!templateConfig) {\n throw new Error(`Unknown template: ${template}`);\n }\n\n // Check max concurrent\n const runningCount = Array.from(this.agents.values()).filter(\n (a) => a.status === 'running' || a.status === 'starting'\n ).length;\n\n if (runningCount >= this.config.agents.maxConcurrent) {\n throw new Error(`Max concurrent agents (${this.config.agents.maxConcurrent}) reached`);\n }\n\n // Create agent\n const id = nanoid(12);\n const agentName = name || `${template}-${id.slice(0, 6)}`;\n const agentWorkspace = workspace || join(this.dataDir, 'workspaces', id);\n\n // Ensure workspace exists\n if (!existsSync(agentWorkspace)) {\n mkdirSync(agentWorkspace, { recursive: true });\n }\n\n const agent: Agent = {\n id,\n name: agentName,\n template,\n status: 'created',\n workspace: agentWorkspace,\n model: model || templateConfig.model,\n currentTask: task,\n createdAt: Date.now(),\n };\n\n // Save to database\n insertAgent({\n id: agent.id,\n name: agent.name,\n template: agent.template,\n workspace: agent.workspace,\n model: agent.model,\n });\n\n audit('agent.created', null, 'agent', id, { name: agentName, template });\n\n this.agents.set(id, agent);\n this.emit('agent:created', agent);\n\n // Start the agent process\n await this.startAgent(agent, templateConfig, task);\n\n return agent;\n }\n\n private async startAgent(agent: Agent, template: AgentTemplate, initialTask?: string) {\n agent.status = 'starting';\n updateAgent(agent.id, { status: 'starting' });\n this.emit('agent:starting', agent);\n\n try {\n const { command, env } = this.buildCommand(agent, template);\n\n this.logger.info({ agentId: agent.id, command }, 'Starting agent');\n\n const proc = spawn(command[0], command.slice(1), {\n cwd: agent.workspace,\n env: {\n ...process.env,\n ...env,\n DIRIGENT_AGENT_ID: agent.id,\n DIRIGENT_AGENT_NAME: agent.name,\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n agent.pid = proc.pid;\n agent.process = proc;\n agent.status = 'running';\n agent.startedAt = Date.now();\n\n updateAgent(agent.id, {\n status: 'running',\n pid: proc.pid,\n started_at: Math.floor(Date.now() / 1000),\n });\n\n this.processes.set(agent.id, proc);\n\n // Handle stdout\n proc.stdout?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'info', message);\n }\n });\n\n // Handle stderr\n proc.stderr?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'error', message);\n }\n });\n\n // Handle exit\n proc.on('exit', (code, signal) => {\n this.logger.info({ agentId: agent.id, code, signal }, 'Agent exited');\n\n agent.status = code === 0 ? 'stopped' : 'error';\n agent.stoppedAt = Date.now();\n if (code !== 0) {\n agent.error = `Exited with code ${code}`;\n }\n\n updateAgent(agent.id, {\n status: agent.status,\n stopped_at: Math.floor(Date.now() / 1000),\n error: agent.error || null,\n });\n\n this.processes.delete(agent.id);\n this.emit('agent:stopped', agent);\n\n audit('agent.stopped', null, 'agent', agent.id, { code, signal });\n });\n\n proc.on('error', (err) => {\n this.logger.error({ agentId: agent.id, err }, 'Agent process error');\n agent.status = 'error';\n agent.error = err.message;\n\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n });\n\n this.emit('agent:running', agent);\n audit('agent.started', null, 'agent', agent.id, { pid: proc.pid });\n\n // Send initial task if provided\n if (initialTask && proc.stdin) {\n proc.stdin.write(initialTask + '\\n');\n }\n } catch (err: any) {\n agent.status = 'error';\n agent.error = err.message;\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n throw err;\n }\n }\n\n private buildCommand(agent: Agent, template: AgentTemplate): { command: string[]; env: Record<string, string> } {\n const env: Record<string, string> = { ...template.env };\n\n switch (template.driver) {\n case 'claude-code':\n return {\n command: ['claude', '--dangerously-skip-permissions'],\n env: {\n ...env,\n ANTHROPIC_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'codex':\n return {\n command: ['codex', '--model', agent.model || template.model || 'codex-1'],\n env,\n };\n\n case 'clawdbot':\n return {\n command: ['clawdbot', 'agent', '--headless'],\n env: {\n ...env,\n CLAWDBOT_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'subprocess':\n if (!template.command || template.command.length === 0) {\n throw new Error('subprocess driver requires command');\n }\n return { command: template.command, env };\n\n default:\n throw new Error(`Unknown driver: ${template.driver}`);\n }\n }\n\n async stop(id: string, force = false): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running' && agent.status !== 'starting') {\n return;\n }\n\n agent.status = 'stopping';\n this.emit('agent:stopping', agent);\n\n const proc = this.processes.get(id);\n if (proc && proc.pid) {\n await new Promise<void>((resolve, reject) => {\n treeKill(proc.pid!, force ? 'SIGKILL' : 'SIGTERM', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n audit('agent.stop_requested', null, 'agent', id, { force });\n }\n\n async stopAll(): Promise<void> {\n const promises = Array.from(this.agents.values())\n .filter((a) => a.status === 'running' || a.status === 'starting')\n .map((a) => this.stop(a.id, true));\n\n await Promise.allSettled(promises);\n }\n\n async send(id: string, message: string): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running') {\n throw new Error(`Agent is not running: ${agent.status}`);\n }\n\n const proc = this.processes.get(id);\n if (!proc || !proc.stdin) {\n throw new Error('Agent process not available');\n }\n\n proc.stdin.write(message + '\\n');\n this.log(id, 'info', `[USER] ${message}`);\n\n audit('agent.message_sent', null, 'agent', id, { length: message.length });\n }\n\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n list(includeStopped = false): Agent[] {\n const agents = Array.from(this.agents.values());\n if (includeStopped) return agents;\n return agents.filter((a) => a.status !== 'stopped');\n }\n\n log(agentId: string, level: string, message: string) {\n insertLog({ agentId, level, message });\n this.emit('agent:log', { agentId, level, message, timestamp: Date.now() });\n }\n\n getLogs(agentId: string, limit = 100) {\n return getLogs(agentId, limit);\n }\n\n getStats() {\n const agents = Array.from(this.agents.values());\n return {\n total: agents.length,\n running: agents.filter((a) => a.status === 'running').length,\n idle: agents.filter((a) => a.status === 'idle').length,\n stopped: agents.filter((a) => a.status === 'stopped').length,\n error: agents.filter((a) => a.status === 'error').length,\n };\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\nimport { getAgents, audit } from '../db/index.js';\n\ninterface RouteOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n startTime: number;\n}\n\nexport function registerApiRoutes(server: FastifyInstance, options: RouteOptions) {\n const { config, agentManager, startTime } = options;\n\n // Auth middleware\n server.addHook('onRequest', async (request, reply) => {\n // Skip auth for health check\n if (request.url === '/health') return;\n\n // Skip auth for dashboard routes\n if (!request.url.startsWith('/api')) return;\n\n if (config.auth.enabled) {\n const authHeader = request.headers.authorization;\n const token = authHeader?.replace('Bearer ', '');\n\n if (!token || !validateAuth(token, config)) {\n reply.code(401).send({ error: 'Unauthorized' });\n return;\n }\n }\n });\n\n // Status\n server.get('/api/status', async () => {\n const stats = agentManager.getStats();\n const agents = agentManager.list(false);\n\n return {\n status: 'ok',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n agents: {\n ...stats,\n list: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n currentTask: a.currentTask,\n })),\n },\n };\n });\n\n // List agents\n server.get<{ Querystring: { all?: string } }>('/api/agents', async (request) => {\n const includeStopped = request.query.all === 'true';\n const agents = agentManager.list(includeStopped);\n\n return {\n agents: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n model: a.model,\n pid: a.pid,\n currentTask: a.currentTask,\n createdAt: a.createdAt,\n startedAt: a.startedAt,\n stoppedAt: a.stoppedAt,\n error: a.error,\n })),\n };\n });\n\n // Spawn agent\n server.post<{\n Body: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n };\n }>('/api/agents', async (request, reply) => {\n const { template, name, workspace, task, model } = request.body;\n\n if (!template) {\n reply.code(400).send({ error: 'template is required' });\n return;\n }\n\n try {\n const agent = await agentManager.spawn({ template, name, workspace, task, model });\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n },\n };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n });\n\n // Get agent\n server.get<{ Params: { id: string } }>('/api/agents/:id', async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n },\n };\n });\n\n // Stop agent\n server.delete<{ Params: { id: string }; Querystring: { force?: string } }>(\n '/api/agents/:id',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const force = request.query.force === 'true';\n\n try {\n await agentManager.stop(request.params.id, force);\n return { ok: true };\n } catch (err: any) {\n reply.code(500).send({ error: err.message });\n }\n }\n );\n\n // Send message to agent\n server.post<{ Params: { id: string }; Body: { message: string } }>(\n '/api/agents/:id/send',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const { message } = request.body;\n\n if (!message) {\n reply.code(400).send({ error: 'message is required' });\n return;\n }\n\n try {\n await agentManager.send(request.params.id, message);\n return { ok: true };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n }\n );\n\n // Get agent logs\n server.get<{ Params: { id: string }; Querystring: { lines?: string } }>(\n '/api/agents/:id/logs',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const limit = parseInt(request.query.lines || '100');\n const logs = agentManager.getLogs(request.params.id, limit);\n\n return { logs };\n }\n );\n\n // Templates\n server.get('/api/templates', async () => {\n return {\n templates: Object.entries(config.agents.templates).map(([name, template]) => ({\n name,\n driver: template.driver,\n model: template.model,\n })),\n };\n });\n\n // Audit log\n server.get<{ Querystring: { limit?: string } }>('/api/audit', async (request) => {\n // TODO: Implement audit log retrieval\n return { logs: [] };\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\n\ninterface WSOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n}\n\ninterface Client {\n ws: WebSocket;\n subscriptions: Set<string>;\n authenticated: boolean;\n}\n\nexport function registerWebSocket(server: FastifyInstance, options: WSOptions) {\n const { config, agentManager } = options;\n const clients: Map<string, Client> = new Map();\n\n // WebSocket route\n server.register(async (fastify) => {\n fastify.get('/ws', { websocket: true }, (connection, req) => {\n const ws = connection;\n const clientId = Math.random().toString(36).slice(2);\n\n const client: Client = {\n ws,\n subscriptions: new Set(),\n authenticated: !config.auth.enabled,\n };\n\n clients.set(clientId, client);\n\n ws.on('message', (data) => {\n try {\n const msg = JSON.parse(data.toString());\n handleMessage(clientId, client, msg);\n } catch (err) {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n }\n });\n\n ws.on('close', () => {\n clients.delete(clientId);\n });\n\n ws.on('error', (err) => {\n console.error('WebSocket error:', err);\n clients.delete(clientId);\n });\n\n // Send welcome\n send(ws, {\n type: 'welcome',\n clientId,\n authenticated: client.authenticated,\n });\n });\n });\n\n function handleMessage(clientId: string, client: Client, msg: any) {\n // Auth\n if (msg.type === 'auth') {\n if (validateAuth(msg.token, config)) {\n client.authenticated = true;\n send(client.ws, { type: 'auth', success: true });\n } else {\n send(client.ws, { type: 'auth', success: false, error: 'Invalid token' });\n }\n return;\n }\n\n // Require auth for other messages\n if (!client.authenticated) {\n send(client.ws, { type: 'error', error: 'Not authenticated' });\n return;\n }\n\n switch (msg.type) {\n case 'subscribe:logs':\n if (msg.agentId) {\n client.subscriptions.add(`logs:${msg.agentId}`);\n send(client.ws, { type: 'subscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'unsubscribe:logs':\n if (msg.agentId) {\n client.subscriptions.delete(`logs:${msg.agentId}`);\n send(client.ws, { type: 'unsubscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'subscribe:agents':\n client.subscriptions.add('agents');\n send(client.ws, { type: 'subscribed', channel: 'agents' });\n break;\n\n case 'unsubscribe:agents':\n client.subscriptions.delete('agents');\n send(client.ws, { type: 'unsubscribed', channel: 'agents' });\n break;\n\n case 'ping':\n send(client.ws, { type: 'pong', ts: Date.now() });\n break;\n\n default:\n send(client.ws, { type: 'error', error: `Unknown message type: ${msg.type}` });\n }\n }\n\n // Agent event handlers\n agentManager.on('agent:created', (agent) => {\n broadcast('agents', { type: 'agent:created', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:running', (agent) => {\n broadcast('agents', { type: 'agent:running', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:stopped', (agent) => {\n broadcast('agents', { type: 'agent:stopped', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:error', (agent, error) => {\n broadcast('agents', { type: 'agent:error', agent: sanitizeAgent(agent), error: error.message });\n });\n\n agentManager.on('agent:log', (data) => {\n broadcast(`logs:${data.agentId}`, { type: 'agent:log', ...data });\n });\n\n function broadcast(channel: string, message: object) {\n for (const client of clients.values()) {\n if (client.authenticated && client.subscriptions.has(channel)) {\n send(client.ws, message);\n }\n }\n }\n\n function send(ws: WebSocket, message: object) {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(message));\n }\n }\n\n function sanitizeAgent(agent: any) {\n return {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n };\n }\n}\n"],"mappings":"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","names":["join","existsSync","mkdirSync","join","existsSync","join","existsSync","server","agentManager","startTime","server","agentManager","join","mkdirSync","existsSync","db"]}
1
+ {"version":3,"sources":["../../src/server/index.ts","../../src/server/config.ts","../../src/server/db/index.ts","../../src/server/agents/manager.ts","../../src/server/api/routes.ts","../../src/server/ws/index.ts"],"sourcesContent":["import Fastify from 'fastify';\nimport fastifyWebsocket from '@fastify/websocket';\nimport fastifyCors from '@fastify/cors';\nimport fastifyStatic from '@fastify/static';\nimport pino from 'pino';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\n\nimport { loadConfig, DirigentConfig } from './config.js';\nimport { initDatabase, getDatabase } from './db/index.js';\nimport { AgentManager } from './agents/manager.js';\nimport { registerApiRoutes } from './api/routes.js';\nimport { registerWebSocket } from './ws/index.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ServerOptions {\n port: number;\n configPath: string;\n dataDir: string;\n}\n\nlet server: ReturnType<typeof Fastify> | null = null;\nlet agentManager: AgentManager | null = null;\nconst startTime = Date.now();\n\nexport async function startServer(options: ServerOptions) {\n const config = loadConfig(options.configPath);\n\n // Setup logging\n const logPath = join(options.dataDir, 'logs', 'dirigent.log');\n mkdirSync(dirname(logPath), { recursive: true });\n\n const logger = pino({\n level: config.logging?.level || 'info',\n transport: {\n targets: [\n {\n target: 'pino-pretty',\n options: { colorize: true },\n level: 'info',\n },\n {\n target: 'pino/file',\n options: { destination: logPath },\n level: 'debug',\n },\n ],\n },\n });\n\n // Initialize database\n const dbPath = join(options.dataDir, 'data', 'dirigent.db');\n mkdirSync(dirname(dbPath), { recursive: true });\n initDatabase(dbPath);\n\n // Create Fastify server\n server = Fastify({ loggerInstance: logger });\n\n // Register plugins\n await server.register(fastifyCors, {\n origin: true,\n credentials: true,\n });\n\n await server.register(fastifyWebsocket);\n\n // Serve dashboard static files\n const dashboardPath = join(__dirname, '..', 'dashboard', 'dist');\n if (existsSync(dashboardPath)) {\n await server.register(fastifyStatic, {\n root: dashboardPath,\n prefix: '/',\n });\n }\n\n // Initialize agent manager\n agentManager = new AgentManager({\n dataDir: options.dataDir,\n config,\n logger,\n });\n\n // Register API routes\n registerApiRoutes(server, {\n config,\n agentManager,\n startTime,\n });\n\n // Register WebSocket handlers\n registerWebSocket(server, {\n config,\n agentManager,\n });\n\n // Health check\n server.get('/health', async () => ({ status: 'ok', uptime: Math.floor((Date.now() - startTime) / 1000) }));\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n // Stop all agents\n if (agentManager) {\n await agentManager.stopAll();\n }\n\n // Close server\n if (server) {\n await server.close();\n }\n\n // Close database\n const db = getDatabase();\n if (db) db.close();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Start server\n try {\n await server.listen({ port: options.port, host: config.server?.host || '0.0.0.0' });\n\n console.log(`\n╔══════════════════════════════════════════════════════════╗\n║ ║\n║ 🎭 DIRIGENT SERVER RUNNING ║\n║ ║\n║ Dashboard: http://localhost:${options.port.toString().padEnd(25)}║\n║ API: http://localhost:${options.port}/api${' '.repeat(21)}║\n║ WebSocket: ws://localhost:${options.port}/ws${' '.repeat(22)}║\n║ ║\n╚══════════════════════════════════════════════════════════╝\n`);\n } catch (err) {\n logger.error(err);\n process.exit(1);\n }\n}\n\n// Export for direct invocation\nif (process.env.DIRIGENT_CONFIG) {\n startServer({\n port: parseInt(process.env.DIRIGENT_PORT || '3000'),\n configPath: process.env.DIRIGENT_CONFIG,\n dataDir: process.env.DIRIGENT_DATA_DIR || '.dirigent',\n });\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nconst AgentTemplateSchema = z.object({\n driver: z.string(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n command: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nconst ConfigSchema = z.object({\n version: z.string().default('1'),\n server: z\n .object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n })\n .default({}),\n auth: z\n .object({\n enabled: z.boolean().default(true),\n adminToken: z.string().optional(),\n apiKeys: z.array(z.string()).optional(),\n })\n .default({}),\n agents: z\n .object({\n maxConcurrent: z.number().default(10),\n defaultTimeout: z.number().default(3600),\n templates: z.record(AgentTemplateSchema).default({}),\n })\n .default({}),\n logging: z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n format: z.enum(['pretty', 'json']).default('pretty'),\n file: z.string().optional(),\n })\n .default({}),\n database: z\n .object({\n path: z.string().default('data/dirigent.db'),\n })\n .default({}),\n});\n\nexport type DirigentConfig = z.infer<typeof ConfigSchema>;\nexport type AgentTemplate = z.infer<typeof AgentTemplateSchema>;\n\nlet cachedConfig: DirigentConfig | null = null;\n\nexport function loadConfig(configPath?: string): DirigentConfig {\n if (cachedConfig) return cachedConfig;\n\n const path = configPath || findConfigPath();\n\n if (!path || !existsSync(path)) {\n // Return defaults\n cachedConfig = ConfigSchema.parse({});\n return cachedConfig;\n }\n\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n cachedConfig = ConfigSchema.parse(parsed);\n\n return cachedConfig;\n}\n\nfunction findConfigPath(): string | null {\n const candidates = [\n join(process.cwd(), '.dirigent', 'config.json'),\n join(process.cwd(), 'dirigent.json'),\n join(process.env.HOME || '', '.dirigent', 'config.json'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function validateAuth(token: string, config: DirigentConfig): boolean {\n if (!config.auth.enabled) return true;\n\n // Check admin token\n if (config.auth.adminToken && token === config.auth.adminToken) return true;\n\n // Check API keys\n if (config.auth.apiKeys?.includes(token)) return true;\n\n return false;\n}\n","import Database from 'better-sqlite3';\n\nlet db: Database.Database | null = null;\n\nexport function initDatabase(path: string): Database.Database {\n db = new Database(path);\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Create tables\n db.exec(`\n -- Agents table\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n template TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'created',\n workspace TEXT,\n model TEXT,\n config TEXT,\n pid INTEGER,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n stopped_at INTEGER,\n error TEXT\n );\n\n -- Agent logs table\n CREATE TABLE IF NOT EXISTS agent_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n metadata TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Tasks table\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n agent_id TEXT,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n result TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (agent_id) REFERENCES agents(id)\n );\n\n -- Audit log table\n CREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action TEXT NOT NULL,\n actor TEXT,\n target_type TEXT,\n target_id TEXT,\n details TEXT,\n timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n );\n\n -- Sessions table (for WebSocket connections)\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT,\n connected_at INTEGER NOT NULL DEFAULT (unixepoch()),\n last_activity INTEGER NOT NULL DEFAULT (unixepoch()),\n metadata TEXT\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_agent_logs_agent_id ON agent_logs(agent_id);\n CREATE INDEX IF NOT EXISTS idx_agent_logs_timestamp ON agent_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_tasks_agent_id ON tasks(agent_id);\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp);\n `);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database | null {\n return db;\n}\n\n// Helper functions\nexport function insertAgent(agent: {\n id: string;\n name: string;\n template: string;\n workspace?: string;\n model?: string;\n config?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agents (id, name, template, workspace, model, config)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n agent.id,\n agent.name,\n agent.template,\n agent.workspace || null,\n agent.model || null,\n agent.config ? JSON.stringify(agent.config) : null\n );\n}\n\nexport function updateAgent(id: string, updates: Record<string, any>) {\n const keys = Object.keys(updates);\n const values = keys.map((k) => (typeof updates[k] === 'object' ? JSON.stringify(updates[k]) : updates[k]));\n\n const stmt = db!.prepare(`\n UPDATE agents SET ${keys.map((k) => `${k} = ?`).join(', ')}\n WHERE id = ?\n `);\n\n stmt.run(...values, id);\n}\n\nexport function getAgent(id: string) {\n const stmt = db!.prepare('SELECT * FROM agents WHERE id = ?');\n const row = stmt.get(id) as any;\n if (row?.config) row.config = JSON.parse(row.config);\n return row;\n}\n\nexport function getAgents(includesStopped = false) {\n const stmt = db!.prepare(\n includesStopped\n ? 'SELECT * FROM agents ORDER BY created_at DESC'\n : \"SELECT * FROM agents WHERE status != 'stopped' ORDER BY created_at DESC\"\n );\n return stmt.all().map((row: any) => {\n if (row.config) row.config = JSON.parse(row.config);\n return row;\n });\n}\n\nexport function insertLog(log: {\n agentId: string;\n level: string;\n message: string;\n metadata?: object;\n}) {\n const stmt = db!.prepare(`\n INSERT INTO agent_logs (agent_id, level, message, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n stmt.run(log.agentId, log.level, log.message, log.metadata ? JSON.stringify(log.metadata) : null);\n}\n\nexport function getLogs(agentId: string, limit = 100) {\n const stmt = db!.prepare(`\n SELECT * FROM agent_logs\n WHERE agent_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `);\n\n return stmt.all(agentId, limit).reverse().map((row: any) => {\n if (row.metadata) row.metadata = JSON.parse(row.metadata);\n return row;\n });\n}\n\nexport function audit(action: string, actor: string | null, targetType: string | null, targetId: string | null, details?: object) {\n const stmt = db!.prepare(`\n INSERT INTO audit_log (action, actor, target_type, target_id, details)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(action, actor, targetType, targetId, details ? JSON.stringify(details) : null);\n}\n","import { EventEmitter } from 'events';\nimport { nanoid } from 'nanoid';\nimport { spawn, ChildProcess } from 'child_process';\nimport treeKill from 'tree-kill';\nimport { join } from 'path';\nimport { mkdirSync, existsSync } from 'fs';\nimport type { Logger } from 'pino';\n\nimport { DirigentConfig, AgentTemplate } from '../config.js';\nimport { insertAgent, updateAgent, getAgent, getAgents, insertLog, getLogs, audit } from '../db/index.js';\n\nexport interface Agent {\n id: string;\n name: string;\n template: string;\n status: 'created' | 'starting' | 'running' | 'idle' | 'stopping' | 'stopped' | 'error';\n workspace?: string;\n model?: string;\n pid?: number;\n process?: ChildProcess;\n currentTask?: string;\n createdAt: number;\n startedAt?: number;\n stoppedAt?: number;\n error?: string;\n}\n\ninterface ManagerOptions {\n dataDir: string;\n config: DirigentConfig;\n logger: Logger;\n}\n\nexport class AgentManager extends EventEmitter {\n private agents: Map<string, Agent> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private dataDir: string;\n private config: DirigentConfig;\n private logger: Logger;\n\n constructor(options: ManagerOptions) {\n super();\n this.dataDir = options.dataDir;\n this.config = options.config;\n this.logger = options.logger;\n\n // Load existing agents from database\n this.loadAgents();\n }\n\n private loadAgents() {\n const dbAgents = getAgents(false);\n for (const dbAgent of dbAgents) {\n // Only load non-running agents; running agents will need to be respawned\n if (dbAgent.status !== 'stopped') {\n this.agents.set(dbAgent.id, {\n id: dbAgent.id,\n name: dbAgent.name,\n template: dbAgent.template,\n status: 'stopped', // Reset to stopped since we restarted\n workspace: dbAgent.workspace,\n model: dbAgent.model,\n createdAt: dbAgent.created_at * 1000,\n });\n\n // Update database\n updateAgent(dbAgent.id, { status: 'stopped' });\n }\n }\n }\n\n async spawn(options: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n }): Promise<Agent> {\n const { template, name, workspace, task, model } = options;\n\n // Get template config\n const templateConfig = this.config.agents.templates[template];\n if (!templateConfig) {\n throw new Error(`Unknown template: ${template}`);\n }\n\n // Check max concurrent\n const runningCount = Array.from(this.agents.values()).filter(\n (a) => a.status === 'running' || a.status === 'starting'\n ).length;\n\n if (runningCount >= this.config.agents.maxConcurrent) {\n throw new Error(`Max concurrent agents (${this.config.agents.maxConcurrent}) reached`);\n }\n\n // Create agent\n const id = nanoid(12);\n const agentName = name || `${template}-${id.slice(0, 6)}`;\n const agentWorkspace = workspace || join(this.dataDir, 'workspaces', id);\n\n // Ensure workspace exists\n if (!existsSync(agentWorkspace)) {\n mkdirSync(agentWorkspace, { recursive: true });\n }\n\n const agent: Agent = {\n id,\n name: agentName,\n template,\n status: 'created',\n workspace: agentWorkspace,\n model: model || templateConfig.model,\n currentTask: task,\n createdAt: Date.now(),\n };\n\n // Save to database\n insertAgent({\n id: agent.id,\n name: agent.name,\n template: agent.template,\n workspace: agent.workspace,\n model: agent.model,\n });\n\n audit('agent.created', null, 'agent', id, { name: agentName, template });\n\n this.agents.set(id, agent);\n this.emit('agent:created', agent);\n\n // Start the agent process\n await this.startAgent(agent, templateConfig, task);\n\n return agent;\n }\n\n private async startAgent(agent: Agent, template: AgentTemplate, initialTask?: string) {\n agent.status = 'starting';\n updateAgent(agent.id, { status: 'starting' });\n this.emit('agent:starting', agent);\n\n try {\n const { command, env } = this.buildCommand(agent, template);\n\n this.logger.info({ agentId: agent.id, command }, 'Starting agent');\n\n const proc = spawn(command[0], command.slice(1), {\n cwd: agent.workspace,\n env: {\n ...process.env,\n ...env,\n DIRIGENT_AGENT_ID: agent.id,\n DIRIGENT_AGENT_NAME: agent.name,\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n agent.pid = proc.pid;\n agent.process = proc;\n agent.status = 'running';\n agent.startedAt = Date.now();\n\n updateAgent(agent.id, {\n status: 'running',\n pid: proc.pid,\n started_at: Math.floor(Date.now() / 1000),\n });\n\n this.processes.set(agent.id, proc);\n\n // Handle stdout\n proc.stdout?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'info', message);\n }\n });\n\n // Handle stderr\n proc.stderr?.on('data', (data) => {\n const message = data.toString().trim();\n if (message) {\n this.log(agent.id, 'error', message);\n }\n });\n\n // Handle exit\n proc.on('exit', (code, signal) => {\n this.logger.info({ agentId: agent.id, code, signal }, 'Agent exited');\n\n agent.status = code === 0 ? 'stopped' : 'error';\n agent.stoppedAt = Date.now();\n if (code !== 0) {\n agent.error = `Exited with code ${code}`;\n }\n\n updateAgent(agent.id, {\n status: agent.status,\n stopped_at: Math.floor(Date.now() / 1000),\n error: agent.error || null,\n });\n\n this.processes.delete(agent.id);\n this.emit('agent:stopped', agent);\n\n audit('agent.stopped', null, 'agent', agent.id, { code, signal });\n });\n\n proc.on('error', (err) => {\n this.logger.error({ agentId: agent.id, err }, 'Agent process error');\n agent.status = 'error';\n agent.error = err.message;\n\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n });\n\n this.emit('agent:running', agent);\n audit('agent.started', null, 'agent', agent.id, { pid: proc.pid });\n\n // Send initial task if provided\n if (initialTask && proc.stdin) {\n proc.stdin.write(initialTask + '\\n');\n }\n } catch (err: any) {\n agent.status = 'error';\n agent.error = err.message;\n updateAgent(agent.id, { status: 'error', error: err.message });\n this.emit('agent:error', agent, err);\n throw err;\n }\n }\n\n private buildCommand(agent: Agent, template: AgentTemplate): { command: string[]; env: Record<string, string> } {\n const env: Record<string, string> = { ...template.env };\n\n switch (template.driver) {\n case 'claude-code':\n return {\n command: ['claude', '--dangerously-skip-permissions'],\n env: {\n ...env,\n ANTHROPIC_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'codex':\n return {\n command: ['codex', '--model', agent.model || template.model || 'codex-1'],\n env,\n };\n\n case 'clawdbot':\n return {\n command: ['clawdbot', 'agent', '--headless'],\n env: {\n ...env,\n CLAWDBOT_MODEL: agent.model || template.model || 'claude-sonnet-4-5',\n },\n };\n\n case 'subprocess':\n if (!template.command || template.command.length === 0) {\n throw new Error('subprocess driver requires command');\n }\n return { command: template.command, env };\n\n default:\n throw new Error(`Unknown driver: ${template.driver}`);\n }\n }\n\n async stop(id: string, force = false): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running' && agent.status !== 'starting') {\n return;\n }\n\n agent.status = 'stopping';\n this.emit('agent:stopping', agent);\n\n const proc = this.processes.get(id);\n if (proc && proc.pid) {\n await new Promise<void>((resolve, reject) => {\n treeKill(proc.pid!, force ? 'SIGKILL' : 'SIGTERM', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n audit('agent.stop_requested', null, 'agent', id, { force });\n }\n\n async stopAll(): Promise<void> {\n const promises = Array.from(this.agents.values())\n .filter((a) => a.status === 'running' || a.status === 'starting')\n .map((a) => this.stop(a.id, true));\n\n await Promise.allSettled(promises);\n }\n\n async send(id: string, message: string): Promise<void> {\n const agent = this.agents.get(id);\n if (!agent) {\n throw new Error(`Agent not found: ${id}`);\n }\n\n if (agent.status !== 'running') {\n throw new Error(`Agent is not running: ${agent.status}`);\n }\n\n const proc = this.processes.get(id);\n if (!proc || !proc.stdin) {\n throw new Error('Agent process not available');\n }\n\n proc.stdin.write(message + '\\n');\n this.log(id, 'info', `[USER] ${message}`);\n\n audit('agent.message_sent', null, 'agent', id, { length: message.length });\n }\n\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n list(includeStopped = false): Agent[] {\n const agents = Array.from(this.agents.values());\n if (includeStopped) return agents;\n return agents.filter((a) => a.status !== 'stopped');\n }\n\n log(agentId: string, level: string, message: string) {\n insertLog({ agentId, level, message });\n this.emit('agent:log', { agentId, level, message, timestamp: Date.now() });\n }\n\n getLogs(agentId: string, limit = 100) {\n return getLogs(agentId, limit);\n }\n\n getStats() {\n const agents = Array.from(this.agents.values());\n return {\n total: agents.length,\n running: agents.filter((a) => a.status === 'running').length,\n idle: agents.filter((a) => a.status === 'idle').length,\n stopped: agents.filter((a) => a.status === 'stopped').length,\n error: agents.filter((a) => a.status === 'error').length,\n };\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\nimport { getAgents, audit } from '../db/index.js';\n\ninterface RouteOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n startTime: number;\n}\n\nexport function registerApiRoutes(server: FastifyInstance, options: RouteOptions) {\n const { config, agentManager, startTime } = options;\n\n // Auth middleware\n server.addHook('onRequest', async (request, reply) => {\n // Skip auth for health check\n if (request.url === '/health') return;\n\n // Skip auth for dashboard routes\n if (!request.url.startsWith('/api')) return;\n\n if (config.auth.enabled) {\n const authHeader = request.headers.authorization;\n const token = authHeader?.replace('Bearer ', '');\n\n if (!token || !validateAuth(token, config)) {\n reply.code(401).send({ error: 'Unauthorized' });\n return;\n }\n }\n });\n\n // Status\n server.get('/api/status', async () => {\n const stats = agentManager.getStats();\n const agents = agentManager.list(false);\n\n return {\n status: 'ok',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n agents: {\n ...stats,\n list: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n currentTask: a.currentTask,\n })),\n },\n };\n });\n\n // List agents\n server.get<{ Querystring: { all?: string } }>('/api/agents', async (request) => {\n const includeStopped = request.query.all === 'true';\n const agents = agentManager.list(includeStopped);\n\n return {\n agents: agents.map((a) => ({\n id: a.id,\n name: a.name,\n template: a.template,\n status: a.status,\n workspace: a.workspace,\n model: a.model,\n pid: a.pid,\n currentTask: a.currentTask,\n createdAt: a.createdAt,\n startedAt: a.startedAt,\n stoppedAt: a.stoppedAt,\n error: a.error,\n })),\n };\n });\n\n // Spawn agent\n server.post<{\n Body: {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n };\n }>('/api/agents', async (request, reply) => {\n const { template, name, workspace, task, model } = request.body;\n\n if (!template) {\n reply.code(400).send({ error: 'template is required' });\n return;\n }\n\n try {\n const agent = await agentManager.spawn({ template, name, workspace, task, model });\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n },\n };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n });\n\n // Get agent\n server.get<{ Params: { id: string } }>('/api/agents/:id', async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n },\n };\n });\n\n // Stop agent\n server.delete<{ Params: { id: string }; Querystring: { force?: string } }>(\n '/api/agents/:id',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const force = request.query.force === 'true';\n\n try {\n await agentManager.stop(request.params.id, force);\n return { ok: true };\n } catch (err: any) {\n reply.code(500).send({ error: err.message });\n }\n }\n );\n\n // Send message to agent\n server.post<{ Params: { id: string }; Body: { message: string } }>(\n '/api/agents/:id/send',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const { message } = request.body;\n\n if (!message) {\n reply.code(400).send({ error: 'message is required' });\n return;\n }\n\n try {\n await agentManager.send(request.params.id, message);\n return { ok: true };\n } catch (err: any) {\n reply.code(400).send({ error: err.message });\n }\n }\n );\n\n // Get agent logs\n server.get<{ Params: { id: string }; Querystring: { lines?: string } }>(\n '/api/agents/:id/logs',\n async (request, reply) => {\n const agent = agentManager.get(request.params.id);\n\n if (!agent) {\n reply.code(404).send({ error: 'Agent not found' });\n return;\n }\n\n const limit = parseInt(request.query.lines || '100');\n const logs = agentManager.getLogs(request.params.id, limit);\n\n return { logs };\n }\n );\n\n // Templates\n server.get('/api/templates', async () => {\n return {\n templates: Object.entries(config.agents.templates).map(([name, template]) => ({\n name,\n driver: template.driver,\n model: template.model,\n })),\n };\n });\n\n // Audit log\n server.get<{ Querystring: { limit?: string } }>('/api/audit', async (request) => {\n // TODO: Implement audit log retrieval\n return { logs: [] };\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { validateAuth, DirigentConfig } from '../config.js';\nimport { AgentManager } from '../agents/manager.js';\n\ninterface WSOptions {\n config: DirigentConfig;\n agentManager: AgentManager;\n}\n\ninterface Client {\n ws: WebSocket;\n subscriptions: Set<string>;\n authenticated: boolean;\n}\n\nexport function registerWebSocket(server: FastifyInstance, options: WSOptions) {\n const { config, agentManager } = options;\n const clients: Map<string, Client> = new Map();\n\n // WebSocket route\n server.register(async (fastify) => {\n fastify.get('/ws', { websocket: true }, (connection, req) => {\n const ws = connection;\n const clientId = Math.random().toString(36).slice(2);\n\n const client: Client = {\n ws,\n subscriptions: new Set(),\n authenticated: !config.auth.enabled,\n };\n\n clients.set(clientId, client);\n\n ws.on('message', (data) => {\n try {\n const msg = JSON.parse(data.toString());\n handleMessage(clientId, client, msg);\n } catch (err) {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n }\n });\n\n ws.on('close', () => {\n clients.delete(clientId);\n });\n\n ws.on('error', (err) => {\n console.error('WebSocket error:', err);\n clients.delete(clientId);\n });\n\n // Send welcome\n send(ws, {\n type: 'welcome',\n clientId,\n authenticated: client.authenticated,\n });\n });\n });\n\n function handleMessage(clientId: string, client: Client, msg: any) {\n // Auth\n if (msg.type === 'auth') {\n if (validateAuth(msg.token, config)) {\n client.authenticated = true;\n send(client.ws, { type: 'auth', success: true });\n } else {\n send(client.ws, { type: 'auth', success: false, error: 'Invalid token' });\n }\n return;\n }\n\n // Require auth for other messages\n if (!client.authenticated) {\n send(client.ws, { type: 'error', error: 'Not authenticated' });\n return;\n }\n\n switch (msg.type) {\n case 'subscribe:logs':\n if (msg.agentId) {\n client.subscriptions.add(`logs:${msg.agentId}`);\n send(client.ws, { type: 'subscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'unsubscribe:logs':\n if (msg.agentId) {\n client.subscriptions.delete(`logs:${msg.agentId}`);\n send(client.ws, { type: 'unsubscribed', channel: `logs:${msg.agentId}` });\n }\n break;\n\n case 'subscribe:agents':\n client.subscriptions.add('agents');\n send(client.ws, { type: 'subscribed', channel: 'agents' });\n break;\n\n case 'unsubscribe:agents':\n client.subscriptions.delete('agents');\n send(client.ws, { type: 'unsubscribed', channel: 'agents' });\n break;\n\n case 'ping':\n send(client.ws, { type: 'pong', ts: Date.now() });\n break;\n\n default:\n send(client.ws, { type: 'error', error: `Unknown message type: ${msg.type}` });\n }\n }\n\n // Agent event handlers\n agentManager.on('agent:created', (agent) => {\n broadcast('agents', { type: 'agent:created', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:running', (agent) => {\n broadcast('agents', { type: 'agent:running', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:stopped', (agent) => {\n broadcast('agents', { type: 'agent:stopped', agent: sanitizeAgent(agent) });\n });\n\n agentManager.on('agent:error', (agent, error) => {\n broadcast('agents', { type: 'agent:error', agent: sanitizeAgent(agent), error: error.message });\n });\n\n agentManager.on('agent:log', (data) => {\n broadcast(`logs:${data.agentId}`, { type: 'agent:log', ...data });\n });\n\n function broadcast(channel: string, message: object) {\n for (const client of clients.values()) {\n if (client.authenticated && client.subscriptions.has(channel)) {\n send(client.ws, message);\n }\n }\n }\n\n function send(ws: WebSocket, message: object) {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(message));\n }\n }\n\n function sanitizeAgent(agent: any) {\n return {\n id: agent.id,\n name: agent.name,\n template: agent.template,\n status: agent.status,\n workspace: agent.workspace,\n model: agent.model,\n pid: agent.pid,\n currentTask: agent.currentTask,\n createdAt: agent.createdAt,\n startedAt: agent.startedAt,\n stoppedAt: agent.stoppedAt,\n error: agent.error,\n };\n }\n}\n"],"mappings":"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","names":["join","existsSync","mkdirSync","join","existsSync","join","existsSync","server","agentManager","startTime","server","agentManager","join","mkdirSync","existsSync","db"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "diragent",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "AI Agent Orchestration Platform - Enterprise-grade orchestration for AI coding agents",
5
5
  "author": "Anindya Roy <anindya@anindya.me>",
6
6
  "license": "Apache-2.0",