diragent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +1621 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/index.d.ts +63 -0
- package/dist/client/index.js +145 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.d.ts +256 -0
- package/dist/index.js +879 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.js +861 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +90 -0
- package/scripts/install.sh +67 -0
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
interface DirigentClientOptions {
|
|
2
|
+
url: string;
|
|
3
|
+
token?: string;
|
|
4
|
+
autoReconnect?: boolean;
|
|
5
|
+
}
|
|
6
|
+
interface Agent {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
template: string;
|
|
10
|
+
status: string;
|
|
11
|
+
workspace?: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
pid?: number;
|
|
14
|
+
currentTask?: string;
|
|
15
|
+
createdAt: number;
|
|
16
|
+
startedAt?: number;
|
|
17
|
+
stoppedAt?: number;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
interface SpawnOptions {
|
|
21
|
+
template: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
workspace?: string;
|
|
24
|
+
task?: string;
|
|
25
|
+
model?: string;
|
|
26
|
+
}
|
|
27
|
+
declare class DirigentClient {
|
|
28
|
+
private url;
|
|
29
|
+
private token?;
|
|
30
|
+
private socket;
|
|
31
|
+
private listeners;
|
|
32
|
+
constructor(options: DirigentClientOptions);
|
|
33
|
+
private fetch;
|
|
34
|
+
status(): Promise<{
|
|
35
|
+
status: string;
|
|
36
|
+
uptime: number;
|
|
37
|
+
agents: {
|
|
38
|
+
total: number;
|
|
39
|
+
running: number;
|
|
40
|
+
idle: number;
|
|
41
|
+
stopped: number;
|
|
42
|
+
error: number;
|
|
43
|
+
list: Agent[];
|
|
44
|
+
};
|
|
45
|
+
}>;
|
|
46
|
+
listAgents(includeStopped?: boolean): Promise<Agent[]>;
|
|
47
|
+
getAgent(id: string): Promise<Agent>;
|
|
48
|
+
spawnAgent(options: SpawnOptions): Promise<Agent>;
|
|
49
|
+
stopAgent(id: string, force?: boolean): Promise<void>;
|
|
50
|
+
sendToAgent(id: string, message: string): Promise<void>;
|
|
51
|
+
getAgentLogs(id: string, lines?: number): Promise<any[]>;
|
|
52
|
+
getTemplates(): Promise<any[]>;
|
|
53
|
+
connect(): Promise<void>;
|
|
54
|
+
disconnect(): void;
|
|
55
|
+
subscribeToAgents(): void;
|
|
56
|
+
subscribeToLogs(agentId: string): void;
|
|
57
|
+
unsubscribeFromLogs(agentId: string): void;
|
|
58
|
+
on(event: string, callback: (data: any) => void): () => void;
|
|
59
|
+
private emit;
|
|
60
|
+
}
|
|
61
|
+
declare function createClient(options: DirigentClientOptions): DirigentClient;
|
|
62
|
+
|
|
63
|
+
export { type Agent, DirigentClient, type DirigentClientOptions, type SpawnOptions, createClient, DirigentClient as default };
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/client/index.ts
|
|
4
|
+
import { io } from "socket.io-client";
|
|
5
|
+
var DirigentClient = class {
|
|
6
|
+
url;
|
|
7
|
+
token;
|
|
8
|
+
socket = null;
|
|
9
|
+
listeners = /* @__PURE__ */ new Map();
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.url = options.url;
|
|
12
|
+
this.token = options.token;
|
|
13
|
+
}
|
|
14
|
+
// REST API methods
|
|
15
|
+
async fetch(path, options) {
|
|
16
|
+
const headers = {
|
|
17
|
+
"Content-Type": "application/json"
|
|
18
|
+
};
|
|
19
|
+
if (this.token) {
|
|
20
|
+
headers["Authorization"] = `Bearer ${this.token}`;
|
|
21
|
+
}
|
|
22
|
+
const res = await fetch(`${this.url}/api${path}`, {
|
|
23
|
+
...options,
|
|
24
|
+
headers: { ...headers, ...options?.headers }
|
|
25
|
+
});
|
|
26
|
+
if (!res.ok) {
|
|
27
|
+
const error = await res.json().catch(() => ({ error: res.statusText }));
|
|
28
|
+
throw new Error(error.error || error.message || "Request failed");
|
|
29
|
+
}
|
|
30
|
+
return res.json();
|
|
31
|
+
}
|
|
32
|
+
async status() {
|
|
33
|
+
return this.fetch("/status");
|
|
34
|
+
}
|
|
35
|
+
async listAgents(includeStopped = false) {
|
|
36
|
+
const result = await this.fetch(
|
|
37
|
+
`/agents${includeStopped ? "?all=true" : ""}`
|
|
38
|
+
);
|
|
39
|
+
return result.agents;
|
|
40
|
+
}
|
|
41
|
+
async getAgent(id) {
|
|
42
|
+
const result = await this.fetch(`/agents/${id}`);
|
|
43
|
+
return result.agent;
|
|
44
|
+
}
|
|
45
|
+
async spawnAgent(options) {
|
|
46
|
+
const result = await this.fetch("/agents", {
|
|
47
|
+
method: "POST",
|
|
48
|
+
body: JSON.stringify(options)
|
|
49
|
+
});
|
|
50
|
+
return result.agent;
|
|
51
|
+
}
|
|
52
|
+
async stopAgent(id, force = false) {
|
|
53
|
+
await this.fetch(`/agents/${id}${force ? "?force=true" : ""}`, {
|
|
54
|
+
method: "DELETE"
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async sendToAgent(id, message) {
|
|
58
|
+
await this.fetch(`/agents/${id}/send`, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
body: JSON.stringify({ message })
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async getAgentLogs(id, lines = 100) {
|
|
64
|
+
const result = await this.fetch(`/agents/${id}/logs?lines=${lines}`);
|
|
65
|
+
return result.logs;
|
|
66
|
+
}
|
|
67
|
+
async getTemplates() {
|
|
68
|
+
const result = await this.fetch("/templates");
|
|
69
|
+
return result.templates;
|
|
70
|
+
}
|
|
71
|
+
// WebSocket methods
|
|
72
|
+
connect() {
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
this.socket = io(this.url, {
|
|
75
|
+
auth: this.token ? { token: this.token } : void 0,
|
|
76
|
+
reconnection: true
|
|
77
|
+
});
|
|
78
|
+
this.socket.on("connect", () => {
|
|
79
|
+
if (this.token) {
|
|
80
|
+
this.socket.emit("auth", { token: this.token });
|
|
81
|
+
}
|
|
82
|
+
resolve();
|
|
83
|
+
});
|
|
84
|
+
this.socket.on("auth", (data) => {
|
|
85
|
+
if (!data.success) {
|
|
86
|
+
reject(new Error(data.error || "Authentication failed"));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
this.socket.on("disconnect", () => {
|
|
90
|
+
this.emit("disconnect", {});
|
|
91
|
+
});
|
|
92
|
+
this.socket.on("agent:created", (data) => this.emit("agent:created", data));
|
|
93
|
+
this.socket.on("agent:running", (data) => this.emit("agent:running", data));
|
|
94
|
+
this.socket.on("agent:stopped", (data) => this.emit("agent:stopped", data));
|
|
95
|
+
this.socket.on("agent:error", (data) => this.emit("agent:error", data));
|
|
96
|
+
this.socket.on("agent:log", (data) => this.emit("agent:log", data));
|
|
97
|
+
this.socket.on("connect_error", reject);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
disconnect() {
|
|
101
|
+
if (this.socket) {
|
|
102
|
+
this.socket.disconnect();
|
|
103
|
+
this.socket = null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
subscribeToAgents() {
|
|
107
|
+
if (!this.socket) throw new Error("Not connected");
|
|
108
|
+
this.socket.emit("subscribe:agents");
|
|
109
|
+
}
|
|
110
|
+
subscribeToLogs(agentId) {
|
|
111
|
+
if (!this.socket) throw new Error("Not connected");
|
|
112
|
+
this.socket.emit("subscribe:logs", { agentId });
|
|
113
|
+
}
|
|
114
|
+
unsubscribeFromLogs(agentId) {
|
|
115
|
+
if (!this.socket) throw new Error("Not connected");
|
|
116
|
+
this.socket.emit("unsubscribe:logs", { agentId });
|
|
117
|
+
}
|
|
118
|
+
on(event, callback) {
|
|
119
|
+
if (!this.listeners.has(event)) {
|
|
120
|
+
this.listeners.set(event, /* @__PURE__ */ new Set());
|
|
121
|
+
}
|
|
122
|
+
this.listeners.get(event).add(callback);
|
|
123
|
+
return () => {
|
|
124
|
+
this.listeners.get(event)?.delete(callback);
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
emit(event, data) {
|
|
128
|
+
const callbacks = this.listeners.get(event);
|
|
129
|
+
if (callbacks) {
|
|
130
|
+
for (const callback of callbacks) {
|
|
131
|
+
callback(data);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
function createClient(options) {
|
|
137
|
+
return new DirigentClient(options);
|
|
138
|
+
}
|
|
139
|
+
var client_default = DirigentClient;
|
|
140
|
+
export {
|
|
141
|
+
DirigentClient,
|
|
142
|
+
createClient,
|
|
143
|
+
client_default as default
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts"],"sourcesContent":["// Dirigent Client SDK\n\nimport { io, Socket } from 'socket.io-client';\n\nexport interface DirigentClientOptions {\n url: string;\n token?: string;\n autoReconnect?: boolean;\n}\n\nexport interface Agent {\n id: string;\n name: string;\n template: string;\n status: string;\n workspace?: string;\n model?: string;\n pid?: number;\n currentTask?: string;\n createdAt: number;\n startedAt?: number;\n stoppedAt?: number;\n error?: string;\n}\n\nexport interface SpawnOptions {\n template: string;\n name?: string;\n workspace?: string;\n task?: string;\n model?: string;\n}\n\nexport class DirigentClient {\n private url: string;\n private token?: string;\n private socket: Socket | null = null;\n private listeners: Map<string, Set<(data: any) => void>> = new Map();\n\n constructor(options: DirigentClientOptions) {\n this.url = options.url;\n this.token = options.token;\n }\n\n // REST API methods\n\n private async fetch<T>(path: string, options?: RequestInit): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n const res = await fetch(`${this.url}/api${path}`, {\n ...options,\n headers: { ...headers, ...options?.headers },\n });\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ error: res.statusText })) as { error?: string; message?: string };\n throw new Error(error.error || error.message || 'Request failed');\n }\n\n return res.json() as Promise<T>;\n }\n\n async status() {\n return this.fetch<{\n status: string;\n uptime: number;\n agents: {\n total: number;\n running: number;\n idle: number;\n stopped: number;\n error: number;\n list: Agent[];\n };\n }>('/status');\n }\n\n async listAgents(includeStopped = false) {\n const result = await this.fetch<{ agents: Agent[] }>(\n `/agents${includeStopped ? '?all=true' : ''}`\n );\n return result.agents;\n }\n\n async getAgent(id: string) {\n const result = await this.fetch<{ agent: Agent }>(`/agents/${id}`);\n return result.agent;\n }\n\n async spawnAgent(options: SpawnOptions) {\n const result = await this.fetch<{ agent: Agent }>('/agents', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n return result.agent;\n }\n\n async stopAgent(id: string, force = false) {\n await this.fetch(`/agents/${id}${force ? '?force=true' : ''}`, {\n method: 'DELETE',\n });\n }\n\n async sendToAgent(id: string, message: string) {\n await this.fetch(`/agents/${id}/send`, {\n method: 'POST',\n body: JSON.stringify({ message }),\n });\n }\n\n async getAgentLogs(id: string, lines = 100) {\n const result = await this.fetch<{ logs: any[] }>(`/agents/${id}/logs?lines=${lines}`);\n return result.logs;\n }\n\n async getTemplates() {\n const result = await this.fetch<{ templates: any[] }>('/templates');\n return result.templates;\n }\n\n // WebSocket methods\n\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.socket = io(this.url, {\n auth: this.token ? { token: this.token } : undefined,\n reconnection: true,\n });\n\n this.socket.on('connect', () => {\n if (this.token) {\n this.socket!.emit('auth', { token: this.token });\n }\n resolve();\n });\n\n this.socket.on('auth', (data) => {\n if (!data.success) {\n reject(new Error(data.error || 'Authentication failed'));\n }\n });\n\n this.socket.on('disconnect', () => {\n this.emit('disconnect', {});\n });\n\n this.socket.on('agent:created', (data) => this.emit('agent:created', data));\n this.socket.on('agent:running', (data) => this.emit('agent:running', data));\n this.socket.on('agent:stopped', (data) => this.emit('agent:stopped', data));\n this.socket.on('agent:error', (data) => this.emit('agent:error', data));\n this.socket.on('agent:log', (data) => this.emit('agent:log', data));\n\n this.socket.on('connect_error', reject);\n });\n }\n\n disconnect() {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n }\n }\n\n subscribeToAgents() {\n if (!this.socket) throw new Error('Not connected');\n this.socket.emit('subscribe:agents');\n }\n\n subscribeToLogs(agentId: string) {\n if (!this.socket) throw new Error('Not connected');\n this.socket.emit('subscribe:logs', { agentId });\n }\n\n unsubscribeFromLogs(agentId: string) {\n if (!this.socket) throw new Error('Not connected');\n this.socket.emit('unsubscribe:logs', { agentId });\n }\n\n on(event: string, callback: (data: any) => void) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n\n return () => {\n this.listeners.get(event)?.delete(callback);\n };\n }\n\n private emit(event: string, data: any) {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n for (const callback of callbacks) {\n callback(data);\n }\n }\n }\n}\n\n// Factory function\nexport function createClient(options: DirigentClientOptions): DirigentClient {\n return new DirigentClient(options);\n}\n\nexport default DirigentClient;\n"],"mappings":"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","names":[]}
|