sparkecoder 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/index.ts","../../src/server/routes/sessions.ts","../../src/db/index.ts","../../src/db/schema.ts","../../src/agent/index.ts","../../src/config/index.ts","../../src/config/types.ts","../../src/tools/bash.ts","../../src/utils/truncate.ts","../../src/tools/read-file.ts","../../src/tools/write-file.ts","../../src/tools/todo.ts","../../src/tools/load-skill.ts","../../src/skills/index.ts","../../src/tools/terminal.ts","../../src/terminal/manager.ts","../../src/tools/index.ts","../../src/agent/context.ts","../../src/agent/prompts.ts","../../src/server/routes/agents.ts","../../src/server/routes/health.ts","../../src/server/routes/terminals.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport { serve, type ServerType } from '@hono/node-server';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { sessions } from './routes/sessions.js';\nimport { agents } from './routes/agents.js';\nimport { health } from './routes/health.js';\nimport { terminals } from './routes/terminals.js';\nimport { getTerminalManager } from '../terminal/index.js';\nimport { loadConfig, getConfig } from '../config/index.js';\nimport { initDatabase, closeDatabase } from '../db/index.js';\n\nlet serverInstance: ServerType | null = null;\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n workingDirectory?: string;\n configPath?: string;\n}\n\nexport async function createApp() {\n const app = new Hono();\n\n // Middleware\n app.use('*', cors());\n app.use('*', logger());\n\n // Health checks\n app.route('/health', health);\n\n // API routes\n app.route('/sessions', sessions);\n app.route('/agents', agents);\n app.route('/sessions', terminals); // Terminal routes are nested under /sessions/:sessionId/terminals\n\n // OpenAPI spec (manual, simplified)\n app.get('/openapi.json', async (c) => {\n return c.json(generateOpenAPISpec());\n });\n\n // Swagger UI\n app.get('/swagger', (c) => {\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>Sparkecoder API - Swagger UI</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\">\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n <script>\n SwaggerUIBundle({\n url: '/openapi.json',\n dom_id: '#swagger-ui',\n presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],\n layout: \"BaseLayout\"\n });\n </script>\n</body>\n</html>`;\n return c.html(html);\n });\n\n // Root endpoint\n app.get('/', (c) => {\n return c.json({\n name: 'Sparkecoder API',\n version: '0.1.0',\n description: 'A powerful coding agent CLI with HTTP API',\n docs: '/openapi.json',\n endpoints: {\n health: '/health',\n sessions: '/sessions',\n agents: '/agents',\n terminals: '/sessions/:sessionId/terminals',\n },\n });\n });\n\n return app;\n}\n\nexport async function startServer(options: ServerOptions = {}) {\n // Load config\n const config = await loadConfig(options.configPath, options.workingDirectory);\n\n // Override working directory if provided\n if (options.workingDirectory) {\n config.resolvedWorkingDirectory = options.workingDirectory;\n }\n\n // Ensure working directory exists (create agent-workspace if needed)\n if (!existsSync(config.resolvedWorkingDirectory)) {\n mkdirSync(config.resolvedWorkingDirectory, { recursive: true });\n console.log(`šŸ“ Created agent workspace: ${config.resolvedWorkingDirectory}`);\n }\n\n // Initialize database\n initDatabase(config.resolvedDatabasePath);\n\n const port = options.port || config.server.port;\n const host = options.host || config.server.host || '0.0.0.0';\n\n const app = await createApp();\n\n console.log(`\\nšŸš€ Sparkecoder API Server`);\n console.log(` → Running at http://${host}:${port}`);\n console.log(` → Working directory: ${config.resolvedWorkingDirectory}`);\n console.log(` → Default model: ${config.defaultModel}`);\n console.log(` → OpenAPI spec: http://${host}:${port}/openapi.json\\n`);\n\n serverInstance = serve({\n fetch: app.fetch,\n port,\n hostname: host,\n });\n\n return { app, port, host };\n}\n\nexport function stopServer() {\n // Kill all running terminals\n try {\n const manager = getTerminalManager();\n // Clean up all terminals across all sessions\n manager.cleanup();\n } catch (e) {\n // Terminal manager might not be initialized\n }\n \n if (serverInstance) {\n serverInstance.close();\n serverInstance = null;\n }\n closeDatabase();\n}\n\nfunction generateOpenAPISpec() {\n return {\n openapi: '3.1.0',\n info: {\n title: 'Sparkecoder API',\n version: '0.1.0',\n description:\n 'A powerful coding agent CLI with HTTP API for development environments. Supports streaming responses following the Vercel AI SDK data stream protocol.',\n },\n servers: [{ url: 'http://localhost:3141', description: 'Local development' }],\n paths: {\n '/': {\n get: {\n summary: 'API Info',\n description: 'Get basic API information and available endpoints',\n responses: {\n 200: {\n description: 'API information',\n content: { 'application/json': {} },\n },\n },\n },\n },\n '/health': {\n get: {\n summary: 'Health Check',\n description: 'Check API health status and configuration',\n responses: {\n 200: {\n description: 'API is healthy',\n content: { 'application/json': {} },\n },\n },\n },\n },\n '/health/ready': {\n get: {\n summary: 'Readiness Check',\n description: 'Check if the API is ready to accept requests',\n responses: {\n 200: { description: 'API is ready' },\n 503: { description: 'API is not ready' },\n },\n },\n },\n '/sessions': {\n get: {\n summary: 'List Sessions',\n description: 'Get a list of all agent sessions',\n parameters: [\n { name: 'limit', in: 'query', schema: { type: 'integer', default: 50 } },\n { name: 'offset', in: 'query', schema: { type: 'integer', default: 0 } },\n ],\n responses: {\n 200: { description: 'List of sessions' },\n },\n },\n post: {\n summary: 'Create Session',\n description: 'Create a new agent session',\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n workingDirectory: { type: 'string' },\n model: { type: 'string' },\n toolApprovals: { type: 'object' },\n },\n },\n },\n },\n },\n responses: {\n 201: { description: 'Session created' },\n },\n },\n },\n '/sessions/{id}': {\n get: {\n summary: 'Get Session',\n description: 'Get details of a specific session',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n 200: { description: 'Session details' },\n 404: { description: 'Session not found' },\n },\n },\n delete: {\n summary: 'Delete Session',\n description: 'Delete a session and all its data',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n 200: { description: 'Session deleted' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/sessions/{id}/messages': {\n get: {\n summary: 'Get Messages',\n description: 'Get message history for a session',\n parameters: [\n { name: 'id', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'limit', in: 'query', schema: { type: 'integer', default: 100 } },\n ],\n responses: {\n 200: { description: 'Message history' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/sessions/{id}/clear': {\n post: {\n summary: 'Clear Context',\n description: 'Clear conversation context for a session',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n 200: { description: 'Context cleared' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/agents/{id}/run': {\n post: {\n summary: 'Run Agent (Streaming)',\n description:\n 'Run the agent with a prompt and receive streaming response. Returns SSE stream following Vercel AI SDK data stream protocol.',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['prompt'],\n properties: {\n prompt: { type: 'string' },\n },\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'SSE stream of agent output',\n content: { 'text/event-stream': {} },\n },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/agents/{id}/generate': {\n post: {\n summary: 'Run Agent (Non-streaming)',\n description: 'Run the agent and receive complete response',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['prompt'],\n properties: {\n prompt: { type: 'string' },\n },\n },\n },\n },\n },\n responses: {\n 200: { description: 'Agent response' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/agents/{id}/approve/{toolCallId}': {\n post: {\n summary: 'Approve Tool',\n description: 'Approve a pending tool execution',\n parameters: [\n { name: 'id', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'toolCallId', in: 'path', required: true, schema: { type: 'string' } },\n ],\n responses: {\n 200: { description: 'Tool approved and executed' },\n 400: { description: 'Approval failed' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/agents/{id}/reject/{toolCallId}': {\n post: {\n summary: 'Reject Tool',\n description: 'Reject a pending tool execution',\n parameters: [\n { name: 'id', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'toolCallId', in: 'path', required: true, schema: { type: 'string' } },\n ],\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n reason: { type: 'string' },\n },\n },\n },\n },\n },\n responses: {\n 200: { description: 'Tool rejected' },\n 400: { description: 'Rejection failed' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/agents/{id}/approvals': {\n get: {\n summary: 'Get Pending Approvals',\n description: 'Get all pending tool approvals for a session',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n 200: { description: 'Pending approvals' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/agents/quick': {\n post: {\n summary: 'Quick Start',\n description: 'Create a session and run agent in one request',\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['prompt'],\n properties: {\n prompt: { type: 'string' },\n name: { type: 'string' },\n workingDirectory: { type: 'string' },\n model: { type: 'string' },\n toolApprovals: { type: 'object' },\n },\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'SSE stream of agent output',\n content: { 'text/event-stream': {} },\n },\n },\n },\n },\n '/sessions/{sessionId}/terminals': {\n get: {\n summary: 'List Terminals',\n description: 'Get all terminals for a session',\n parameters: [{ name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n 200: { description: 'List of terminals' },\n 404: { description: 'Session not found' },\n },\n },\n post: {\n summary: 'Spawn Terminal',\n description: 'Start a new background process',\n parameters: [{ name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } }],\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['command'],\n properties: {\n command: { type: 'string' },\n cwd: { type: 'string' },\n name: { type: 'string' },\n },\n },\n },\n },\n },\n responses: {\n 201: { description: 'Terminal spawned' },\n 404: { description: 'Session not found' },\n },\n },\n },\n '/sessions/{sessionId}/terminals/{terminalId}': {\n get: {\n summary: 'Get Terminal Status',\n description: 'Get status and details of a terminal',\n parameters: [\n { name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'terminalId', in: 'path', required: true, schema: { type: 'string' } },\n ],\n responses: {\n 200: { description: 'Terminal status' },\n 404: { description: 'Terminal not found' },\n },\n },\n },\n '/sessions/{sessionId}/terminals/{terminalId}/logs': {\n get: {\n summary: 'Get Terminal Logs',\n description: 'Get output logs from a terminal',\n parameters: [\n { name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'terminalId', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'tail', in: 'query', schema: { type: 'integer' } },\n ],\n responses: {\n 200: { description: 'Terminal logs' },\n 404: { description: 'Terminal not found' },\n },\n },\n },\n '/sessions/{sessionId}/terminals/{terminalId}/kill': {\n post: {\n summary: 'Kill Terminal',\n description: 'Stop a running terminal process',\n parameters: [\n { name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'terminalId', in: 'path', required: true, schema: { type: 'string' } },\n ],\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n signal: { type: 'string', enum: ['SIGTERM', 'SIGKILL'] },\n },\n },\n },\n },\n },\n responses: {\n 200: { description: 'Terminal killed' },\n 400: { description: 'Failed to kill terminal' },\n },\n },\n },\n '/sessions/{sessionId}/terminals/{terminalId}/write': {\n post: {\n summary: 'Write to Terminal',\n description: 'Send input to terminal stdin',\n parameters: [\n { name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'terminalId', in: 'path', required: true, schema: { type: 'string' } },\n ],\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['input'],\n properties: {\n input: { type: 'string' },\n },\n },\n },\n },\n },\n responses: {\n 200: { description: 'Input sent' },\n 400: { description: 'Failed to write' },\n },\n },\n },\n '/sessions/{sessionId}/terminals/{terminalId}/stream': {\n get: {\n summary: 'Stream Terminal Output',\n description: 'SSE stream of terminal output',\n parameters: [\n { name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'terminalId', in: 'path', required: true, schema: { type: 'string' } },\n ],\n responses: {\n 200: { description: 'SSE stream', content: { 'text/event-stream': {} } },\n 404: { description: 'Terminal not found' },\n },\n },\n },\n '/sessions/{sessionId}/terminals/kill-all': {\n post: {\n summary: 'Kill All Terminals',\n description: 'Stop all running terminals for a session',\n parameters: [{ name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n 200: { description: 'Terminals killed' },\n },\n },\n },\n },\n components: {\n schemas: {\n Session: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n workingDirectory: { type: 'string' },\n model: { type: 'string' },\n status: { type: 'string', enum: ['active', 'waiting', 'completed', 'error'] },\n createdAt: { type: 'string', format: 'date-time' },\n updatedAt: { type: 'string', format: 'date-time' },\n },\n },\n Message: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n role: { type: 'string', enum: ['user', 'assistant', 'system', 'tool'] },\n content: { type: 'object' },\n createdAt: { type: 'string', format: 'date-time' },\n },\n },\n ToolExecution: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n toolCallId: { type: 'string' },\n toolName: { type: 'string' },\n input: { type: 'object' },\n output: { type: 'object' },\n status: { type: 'string', enum: ['pending', 'approved', 'rejected', 'completed', 'error'] },\n requiresApproval: { type: 'boolean' },\n },\n },\n Terminal: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n command: { type: 'string' },\n cwd: { type: 'string' },\n pid: { type: 'integer' },\n status: { type: 'string', enum: ['running', 'stopped', 'error'] },\n exitCode: { type: 'integer' },\n error: { type: 'string' },\n createdAt: { type: 'string', format: 'date-time' },\n stoppedAt: { type: 'string', format: 'date-time' },\n },\n },\n },\n },\n };\n}\n\n","import { Hono } from 'hono';\nimport { zValidator } from '@hono/zod-validator';\nimport { z } from 'zod';\nimport { sessionQueries, messageQueries, todoQueries, toolExecutionQueries, terminalQueries } from '../../db/index.js';\nimport { Agent } from '../../agent/index.js';\nimport { getConfig } from '../../config/index.js';\nimport { getTerminalManager } from '../../terminal/index.js';\n\nconst sessions = new Hono();\n\n// Schemas\nconst createSessionSchema = z.object({\n name: z.string().optional(),\n workingDirectory: z.string().optional(),\n model: z.string().optional(),\n toolApprovals: z.record(z.string(), z.boolean()).optional(),\n});\n\nconst paginationQuerySchema = z.object({\n limit: z.string().optional(),\n offset: z.string().optional(),\n});\n\nconst messagesQuerySchema = z.object({\n limit: z.string().optional(),\n});\n\n// List all sessions\nsessions.get(\n '/',\n zValidator('query', paginationQuerySchema),\n async (c) => {\n const query = c.req.valid('query');\n const limit = parseInt(query.limit || '50');\n const offset = parseInt(query.offset || '0');\n\n const allSessions = sessionQueries.list(limit, offset);\n\n return c.json({\n sessions: allSessions.map((s) => ({\n id: s.id,\n name: s.name,\n workingDirectory: s.workingDirectory,\n model: s.model,\n status: s.status,\n createdAt: s.createdAt.toISOString(),\n updatedAt: s.updatedAt.toISOString(),\n })),\n count: allSessions.length,\n limit,\n offset,\n });\n }\n);\n\n// Create a new session\nsessions.post(\n '/',\n zValidator('json', createSessionSchema),\n async (c) => {\n const body = c.req.valid('json');\n const config = getConfig();\n\n const agent = await Agent.create({\n name: body.name,\n workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,\n model: body.model || config.defaultModel,\n sessionConfig: body.toolApprovals ? { toolApprovals: body.toolApprovals } : undefined,\n });\n\n const session = agent.getSession();\n\n return c.json({\n id: session.id,\n name: session.name,\n workingDirectory: session.workingDirectory,\n model: session.model,\n status: session.status,\n createdAt: session.createdAt.toISOString(),\n }, 201);\n }\n);\n\n// Get a specific session\nsessions.get('/:id', async (c) => {\n const id = c.req.param('id');\n const session = sessionQueries.getById(id);\n\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const contextStats = await (async () => {\n const agent = await Agent.create({ sessionId: id });\n return agent.getContextStats();\n })();\n\n const todos = todoQueries.getBySession(id);\n const pendingApprovals = toolExecutionQueries.getPendingApprovals(id);\n\n return c.json({\n id: session.id,\n name: session.name,\n workingDirectory: session.workingDirectory,\n model: session.model,\n status: session.status,\n config: session.config,\n createdAt: session.createdAt.toISOString(),\n updatedAt: session.updatedAt.toISOString(),\n context: contextStats,\n todos: todos.map((t) => ({\n id: t.id,\n content: t.content,\n status: t.status,\n order: t.order,\n })),\n pendingApprovals: pendingApprovals.map((p) => ({\n id: p.id,\n toolCallId: p.toolCallId,\n toolName: p.toolName,\n input: p.input,\n })),\n });\n});\n\n// Get session messages (returns AI SDK ModelMessage format)\nsessions.get(\n '/:id/messages',\n zValidator('query', messagesQuerySchema),\n async (c) => {\n const id = c.req.param('id');\n const query = c.req.valid('query');\n const limit = parseInt(query.limit || '100');\n\n const session = sessionQueries.getById(id);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const messages = messageQueries.getRecentBySession(id, limit);\n\n return c.json({\n sessionId: id,\n messages: messages.map((m) => ({\n id: m.id,\n ...m.modelMessage, // Spread the AI SDK ModelMessage (role, content)\n createdAt: m.createdAt.toISOString(),\n })),\n count: messages.length,\n });\n }\n);\n\n// Get session tool executions\nsessions.get('/:id/tools', async (c) => {\n const id = c.req.param('id');\n\n const session = sessionQueries.getById(id);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const executions = toolExecutionQueries.getBySession(id);\n\n return c.json({\n sessionId: id,\n executions: executions.map((e) => ({\n id: e.id,\n toolCallId: e.toolCallId,\n toolName: e.toolName,\n input: e.input,\n output: e.output,\n status: e.status,\n requiresApproval: e.requiresApproval,\n error: e.error,\n startedAt: e.startedAt.toISOString(),\n completedAt: e.completedAt?.toISOString(),\n })),\n count: executions.length,\n });\n});\n\n// Delete a session\nsessions.delete('/:id', async (c) => {\n const id = c.req.param('id');\n\n // Kill all running terminals for this session before deleting\n try {\n const manager = getTerminalManager();\n manager.killAll(id);\n } catch (e) {\n // Terminal manager might not be initialized\n }\n\n const deleted = sessionQueries.delete(id);\n if (!deleted) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n return c.json({ success: true, id });\n});\n\n// Clear session context\nsessions.post('/:id/clear', async (c) => {\n const id = c.req.param('id');\n\n const session = sessionQueries.getById(id);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = await Agent.create({ sessionId: id });\n agent.clearContext();\n\n return c.json({ success: true, sessionId: id });\n});\n\nexport { sessions };\n","import Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { eq, desc, and, sql } from 'drizzle-orm';\nimport { nanoid } from 'nanoid';\nimport * as schema from './schema.js';\nimport type {\n Session,\n NewSession,\n Message,\n NewMessage,\n ToolExecution,\n NewToolExecution,\n TodoItem,\n NewTodoItem,\n SessionConfig,\n ModelMessage,\n Terminal,\n NewTerminal,\n} from './schema.js';\n\nlet db: ReturnType<typeof drizzle<typeof schema>> | null = null;\nlet sqlite: Database.Database | null = null;\n\nexport function initDatabase(dbPath: string) {\n sqlite = new Database(dbPath);\n sqlite.pragma('journal_mode = WAL');\n db = drizzle(sqlite, { schema });\n\n // Drop and recreate tables with new schema\n sqlite.exec(`\n DROP TABLE IF EXISTS terminals;\n DROP TABLE IF EXISTS loaded_skills;\n DROP TABLE IF EXISTS todo_items;\n DROP TABLE IF EXISTS tool_executions;\n DROP TABLE IF EXISTS messages;\n DROP TABLE IF EXISTS sessions;\n\n CREATE TABLE sessions (\n id TEXT PRIMARY KEY,\n name TEXT,\n working_directory TEXT NOT NULL,\n model TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n config TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE messages (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n model_message TEXT NOT NULL,\n sequence INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL\n );\n\n CREATE TABLE tool_executions (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n message_id TEXT REFERENCES messages(id) ON DELETE CASCADE,\n tool_name TEXT NOT NULL,\n tool_call_id TEXT NOT NULL,\n input TEXT,\n output TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n requires_approval INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n started_at INTEGER NOT NULL,\n completed_at INTEGER\n );\n\n CREATE TABLE todo_items (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n content TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n \"order\" INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE loaded_skills (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n skill_name TEXT NOT NULL,\n loaded_at INTEGER NOT NULL\n );\n\n CREATE TABLE terminals (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n name TEXT,\n command TEXT NOT NULL,\n cwd TEXT NOT NULL,\n pid INTEGER,\n status TEXT NOT NULL DEFAULT 'running',\n exit_code INTEGER,\n error TEXT,\n created_at INTEGER NOT NULL,\n stopped_at INTEGER\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\n CREATE INDEX IF NOT EXISTS idx_tool_executions_session ON tool_executions(session_id);\n CREATE INDEX IF NOT EXISTS idx_todo_items_session ON todo_items(session_id);\n CREATE INDEX IF NOT EXISTS idx_loaded_skills_session ON loaded_skills(session_id);\n CREATE INDEX IF NOT EXISTS idx_terminals_session ON terminals(session_id);\n `);\n\n return db;\n}\n\nexport function getDb() {\n if (!db) {\n throw new Error('Database not initialized. Call initDatabase first.');\n }\n return db;\n}\n\nexport function closeDatabase() {\n if (sqlite) {\n sqlite.close();\n sqlite = null;\n db = null;\n }\n}\n\n// Session queries\nexport const sessionQueries = {\n create(data: Omit<NewSession, 'id' | 'createdAt' | 'updatedAt'>): Session {\n const id = nanoid();\n const now = new Date();\n const result = getDb()\n .insert(schema.sessions)\n .values({\n id,\n ...data,\n createdAt: now,\n updatedAt: now,\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Session | undefined {\n return getDb().select().from(schema.sessions).where(eq(schema.sessions.id, id)).get();\n },\n\n list(limit = 50, offset = 0): Session[] {\n return getDb()\n .select()\n .from(schema.sessions)\n .orderBy(desc(schema.sessions.createdAt))\n .limit(limit)\n .offset(offset)\n .all();\n },\n\n updateStatus(id: string, status: Session['status']): Session | undefined {\n return getDb()\n .update(schema.sessions)\n .set({ status, updatedAt: new Date() })\n .where(eq(schema.sessions.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb().delete(schema.sessions).where(eq(schema.sessions.id, id)).run();\n return result.changes > 0;\n },\n};\n\n// Message queries - stores AI SDK ModelMessage directly\nexport const messageQueries = {\n /**\n * Get the next sequence number for a session\n */\n getNextSequence(sessionId: string): number {\n const result = getDb()\n .select({ maxSeq: sql<number>`COALESCE(MAX(sequence), -1)` })\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .get();\n return (result?.maxSeq ?? -1) + 1;\n },\n\n /**\n * Create a single message from a ModelMessage\n */\n create(sessionId: string, modelMessage: ModelMessage): Message {\n const id = nanoid();\n const sequence = this.getNextSequence(sessionId);\n const result = getDb()\n .insert(schema.messages)\n .values({\n id,\n sessionId,\n modelMessage,\n sequence,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n /**\n * Add multiple ModelMessages at once (from response.messages)\n * Maintains insertion order via sequence numbers\n */\n addMany(sessionId: string, modelMessages: ModelMessage[]): Message[] {\n const results: Message[] = [];\n let sequence = this.getNextSequence(sessionId);\n for (const msg of modelMessages) {\n const id = nanoid();\n const result = getDb()\n .insert(schema.messages)\n .values({\n id,\n sessionId,\n modelMessage: msg,\n sequence,\n createdAt: new Date(),\n })\n .returning()\n .get();\n results.push(result);\n sequence++;\n }\n return results;\n },\n\n /**\n * Get all messages for a session as ModelMessage[]\n * Ordered by sequence to maintain exact insertion order\n */\n getBySession(sessionId: string): Message[] {\n return getDb()\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .orderBy(schema.messages.sequence)\n .all();\n },\n\n /**\n * Get ModelMessages directly (for passing to AI SDK)\n */\n getModelMessages(sessionId: string): ModelMessage[] {\n const messages = this.getBySession(sessionId);\n return messages.map(m => m.modelMessage);\n },\n\n getRecentBySession(sessionId: string, limit = 50): Message[] {\n return getDb()\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .orderBy(desc(schema.messages.sequence))\n .limit(limit)\n .all()\n .reverse();\n },\n\n countBySession(sessionId: string): number {\n const result = getDb()\n .select({ count: sql<number>`count(*)` })\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .get();\n return result?.count ?? 0;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Tool execution queries\nexport const toolExecutionQueries = {\n create(data: Omit<NewToolExecution, 'id' | 'startedAt'>): ToolExecution {\n const id = nanoid();\n const result = getDb()\n .insert(schema.toolExecutions)\n .values({\n id,\n ...data,\n startedAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): ToolExecution | undefined {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.id, id))\n .get();\n },\n\n getByToolCallId(toolCallId: string): ToolExecution | undefined {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.toolCallId, toolCallId))\n .get();\n },\n\n getPendingApprovals(sessionId: string): ToolExecution[] {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(\n and(\n eq(schema.toolExecutions.sessionId, sessionId),\n eq(schema.toolExecutions.status, 'pending'),\n eq(schema.toolExecutions.requiresApproval, true)\n )\n )\n .all();\n },\n\n approve(id: string): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({ status: 'approved' })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n reject(id: string): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({ status: 'rejected' })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n complete(\n id: string,\n output: unknown,\n error?: string\n ): ToolExecution | undefined {\n return getDb()\n .update(schema.toolExecutions)\n .set({\n status: error ? 'error' : 'completed',\n output: output as any,\n error,\n completedAt: new Date(),\n })\n .where(eq(schema.toolExecutions.id, id))\n .returning()\n .get();\n },\n\n getBySession(sessionId: string): ToolExecution[] {\n return getDb()\n .select()\n .from(schema.toolExecutions)\n .where(eq(schema.toolExecutions.sessionId, sessionId))\n .orderBy(schema.toolExecutions.startedAt)\n .all();\n },\n};\n\n// Todo item queries\nexport const todoQueries = {\n create(data: Omit<NewTodoItem, 'id' | 'createdAt' | 'updatedAt'>): TodoItem {\n const id = nanoid();\n const now = new Date();\n const result = getDb()\n .insert(schema.todoItems)\n .values({\n id,\n ...data,\n createdAt: now,\n updatedAt: now,\n })\n .returning()\n .get();\n return result;\n },\n\n createMany(\n sessionId: string,\n items: Array<{ content: string; order?: number }>\n ): TodoItem[] {\n const now = new Date();\n const values = items.map((item, index) => ({\n id: nanoid(),\n sessionId,\n content: item.content,\n order: item.order ?? index,\n createdAt: now,\n updatedAt: now,\n }));\n\n return getDb().insert(schema.todoItems).values(values).returning().all();\n },\n\n getBySession(sessionId: string): TodoItem[] {\n return getDb()\n .select()\n .from(schema.todoItems)\n .where(eq(schema.todoItems.sessionId, sessionId))\n .orderBy(schema.todoItems.order)\n .all();\n },\n\n updateStatus(\n id: string,\n status: TodoItem['status']\n ): TodoItem | undefined {\n return getDb()\n .update(schema.todoItems)\n .set({ status, updatedAt: new Date() })\n .where(eq(schema.todoItems.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb()\n .delete(schema.todoItems)\n .where(eq(schema.todoItems.id, id))\n .run();\n return result.changes > 0;\n },\n\n clearSession(sessionId: string): number {\n const result = getDb()\n .delete(schema.todoItems)\n .where(eq(schema.todoItems.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\n// Loaded skills queries\nexport const skillQueries = {\n load(sessionId: string, skillName: string): schema.LoadedSkill {\n const id = nanoid();\n const result = getDb()\n .insert(schema.loadedSkills)\n .values({\n id,\n sessionId,\n skillName,\n loadedAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getBySession(sessionId: string): schema.LoadedSkill[] {\n return getDb()\n .select()\n .from(schema.loadedSkills)\n .where(eq(schema.loadedSkills.sessionId, sessionId))\n .orderBy(schema.loadedSkills.loadedAt)\n .all();\n },\n\n isLoaded(sessionId: string, skillName: string): boolean {\n const result = getDb()\n .select()\n .from(schema.loadedSkills)\n .where(\n and(\n eq(schema.loadedSkills.sessionId, sessionId),\n eq(schema.loadedSkills.skillName, skillName)\n )\n )\n .get();\n return !!result;\n },\n};\n\n// Terminal queries\nexport const terminalQueries = {\n create(data: Omit<NewTerminal, 'id' | 'createdAt'>): Terminal {\n const id = nanoid();\n const result = getDb()\n .insert(schema.terminals)\n .values({\n id,\n ...data,\n createdAt: new Date(),\n })\n .returning()\n .get();\n return result;\n },\n\n getById(id: string): Terminal | undefined {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(eq(schema.terminals.id, id))\n .get();\n },\n\n getBySession(sessionId: string): Terminal[] {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(eq(schema.terminals.sessionId, sessionId))\n .orderBy(desc(schema.terminals.createdAt))\n .all();\n },\n\n getRunning(sessionId: string): Terminal[] {\n return getDb()\n .select()\n .from(schema.terminals)\n .where(\n and(\n eq(schema.terminals.sessionId, sessionId),\n eq(schema.terminals.status, 'running')\n )\n )\n .all();\n },\n\n updateStatus(\n id: string,\n status: Terminal['status'],\n exitCode?: number,\n error?: string\n ): Terminal | undefined {\n return getDb()\n .update(schema.terminals)\n .set({\n status,\n exitCode,\n error,\n stoppedAt: status !== 'running' ? new Date() : undefined,\n })\n .where(eq(schema.terminals.id, id))\n .returning()\n .get();\n },\n\n updatePid(id: string, pid: number): Terminal | undefined {\n return getDb()\n .update(schema.terminals)\n .set({ pid })\n .where(eq(schema.terminals.id, id))\n .returning()\n .get();\n },\n\n delete(id: string): boolean {\n const result = getDb()\n .delete(schema.terminals)\n .where(eq(schema.terminals.id, id))\n .run();\n return result.changes > 0;\n },\n\n deleteBySession(sessionId: string): number {\n const result = getDb()\n .delete(schema.terminals)\n .where(eq(schema.terminals.sessionId, sessionId))\n .run();\n return result.changes;\n },\n};\n\nexport type { \n Session, \n Message, \n ToolExecution, \n TodoItem, \n SessionConfig, \n ModelMessage,\n Terminal,\n};\n","import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\n\n// Sessions table - represents an agent session/thread\nexport const sessions = sqliteTable('sessions', {\n id: text('id').primaryKey(),\n name: text('name'),\n workingDirectory: text('working_directory').notNull(),\n model: text('model').notNull(),\n status: text('status', { enum: ['active', 'waiting', 'completed', 'error'] })\n .notNull()\n .default('active'),\n config: text('config', { mode: 'json' }).$type<SessionConfig>(),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Messages table - stores AI SDK ModelMessage directly\nexport const messages = sqliteTable('messages', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n // Store the entire ModelMessage as JSON (role + content)\n modelMessage: text('model_message', { mode: 'json' }).$type<ModelMessage>().notNull(),\n // Sequence number within session to maintain exact ordering\n sequence: integer('sequence').notNull().default(0),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Tool executions - tracks all tool calls and their results\nexport const toolExecutions = sqliteTable('tool_executions', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n messageId: text('message_id').references(() => messages.id, { onDelete: 'cascade' }),\n toolName: text('tool_name').notNull(),\n toolCallId: text('tool_call_id').notNull(),\n input: text('input', { mode: 'json' }),\n output: text('output', { mode: 'json' }),\n status: text('status', { enum: ['pending', 'approved', 'rejected', 'completed', 'error'] })\n .notNull()\n .default('pending'),\n requiresApproval: integer('requires_approval', { mode: 'boolean' }).notNull().default(false),\n error: text('error'),\n startedAt: integer('started_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n completedAt: integer('completed_at', { mode: 'timestamp' }),\n});\n\n// Todo items for the planning tool\nexport const todoItems = sqliteTable('todo_items', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n content: text('content').notNull(),\n status: text('status', { enum: ['pending', 'in_progress', 'completed', 'cancelled'] })\n .notNull()\n .default('pending'),\n order: integer('order').notNull().default(0),\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Skills loaded into sessions\nexport const loadedSkills = sqliteTable('loaded_skills', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n skillName: text('skill_name').notNull(),\n loadedAt: integer('loaded_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n});\n\n// Terminal sessions - background processes managed by agents\nexport const terminals = sqliteTable('terminals', {\n id: text('id').primaryKey(),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n name: text('name'), // Optional friendly name (e.g., \"dev-server\")\n command: text('command').notNull(), // The command that was run\n cwd: text('cwd').notNull(), // Working directory\n pid: integer('pid'), // Process ID (null if not running)\n status: text('status', { enum: ['running', 'stopped', 'error'] })\n .notNull()\n .default('running'),\n exitCode: integer('exit_code'), // Exit code if stopped\n error: text('error'), // Error message if status is 'error'\n createdAt: integer('created_at', { mode: 'timestamp' })\n .notNull()\n .$defaultFn(() => new Date()),\n stoppedAt: integer('stopped_at', { mode: 'timestamp' }),\n});\n\n// Types for JSON columns\nexport interface SessionConfig {\n toolApprovals?: Record<string, boolean>;\n approvalWebhook?: string;\n skillsDirectory?: string;\n maxContextChars?: number;\n}\n\n// AI SDK ModelMessage types - stored directly for accurate context passing\n// These match the exact format from AI SDK's response.messages\nexport type ModelMessage = \n | SystemModelMessage\n | UserModelMessage\n | AssistantModelMessage\n | ToolModelMessage;\n\nexport interface SystemModelMessage {\n role: 'system';\n content: string;\n}\n\nexport interface UserModelMessage {\n role: 'user';\n content: string;\n}\n\nexport interface AssistantModelMessage {\n role: 'assistant';\n content: string | AssistantContentPart[];\n}\n\nexport interface ToolModelMessage {\n role: 'tool';\n content: ToolResultPart[];\n}\n\nexport interface AssistantContentPart {\n type: 'text' | 'tool-call';\n text?: string;\n toolCallId?: string;\n toolName?: string;\n input?: unknown;\n}\n\nexport interface ToolResultPart {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: unknown;\n}\n\n// Type exports for queries\nexport type Session = typeof sessions.$inferSelect;\nexport type NewSession = typeof sessions.$inferInsert;\nexport type Message = typeof messages.$inferSelect;\nexport type NewMessage = typeof messages.$inferInsert;\nexport type ToolExecution = typeof toolExecutions.$inferSelect;\nexport type NewToolExecution = typeof toolExecutions.$inferInsert;\nexport type TodoItem = typeof todoItems.$inferSelect;\nexport type NewTodoItem = typeof todoItems.$inferInsert;\nexport type LoadedSkill = typeof loadedSkills.$inferSelect;\nexport type Terminal = typeof terminals.$inferSelect;\nexport type NewTerminal = typeof terminals.$inferInsert;","import {\n streamText,\n generateText,\n tool,\n stepCountIs,\n type ToolSet,\n type ModelMessage,\n} from 'ai';\nimport { gateway } from '@ai-sdk/gateway';\nimport { z } from 'zod';\nimport { nanoid } from 'nanoid';\nimport {\n sessionQueries,\n toolExecutionQueries,\n Session,\n ToolExecution,\n} from '../db/index.js';\nimport { getConfig, requiresApproval, SessionConfig } from '../config/index.js';\nimport { createTools } from '../tools/index.js';\nimport { ContextManager } from './context.js';\nimport { buildSystemPrompt } from './prompts.js';\n\n// Shared store for approval resolvers (needed because approve/reject come from different HTTP requests)\nconst approvalResolvers = new Map<string, { \n resolve: (approved: boolean) => void; \n reason?: string;\n sessionId: string;\n}>();\n\nexport interface AgentOptions {\n sessionId?: string;\n name?: string;\n workingDirectory?: string;\n model?: string;\n sessionConfig?: Partial<SessionConfig>;\n}\n\nexport interface AgentRunOptions {\n prompt: string;\n onText?: (text: string) => void;\n onToolCall?: (toolCall: { toolCallId: string; toolName: string; input: unknown }) => void;\n onToolResult?: (result: { toolCallId: string; toolName: string; output: unknown }) => void;\n onApprovalRequired?: (execution: ToolExecution) => void;\n onStepFinish?: (step: { text?: string; toolCalls?: unknown[]; usage?: unknown }) => void;\n}\n\nexport interface AgentStreamResult {\n sessionId: string;\n stream: ReturnType<typeof streamText>;\n waitForApprovals: () => Promise<ToolExecution[]>;\n /** Call this after stream completes to save response messages */\n saveResponseMessages: () => Promise<void>;\n}\n\n/**\n * The main coding agent that orchestrates LLM interactions\n */\nexport class Agent {\n private session: Session;\n private context: ContextManager;\n private tools: ToolSet;\n private pendingApprovals: Map<string, ToolExecution> = new Map();\n\n private constructor(session: Session, context: ContextManager, tools: ToolSet) {\n this.session = session;\n this.context = context;\n this.tools = tools;\n }\n\n /**\n * Create or resume an agent session\n */\n static async create(options: AgentOptions = {}): Promise<Agent> {\n const config = getConfig();\n\n // Get or create session\n let session: Session;\n\n if (options.sessionId) {\n const existing = sessionQueries.getById(options.sessionId);\n if (!existing) {\n throw new Error(`Session not found: ${options.sessionId}`);\n }\n session = existing;\n } else {\n session = sessionQueries.create({\n name: options.name,\n workingDirectory: options.workingDirectory || config.resolvedWorkingDirectory,\n model: options.model || config.defaultModel,\n config: options.sessionConfig as SessionConfig,\n });\n }\n\n // Create context manager\n const context = new ContextManager({\n sessionId: session.id,\n maxContextChars: config.context?.maxChars || 200_000,\n keepRecentMessages: config.context?.keepRecentMessages || 10,\n autoSummarize: config.context?.autoSummarize ?? true,\n });\n\n // Create tools\n const tools = createTools({\n sessionId: session.id,\n workingDirectory: session.workingDirectory,\n skillsDirectories: config.resolvedSkillsDirectories,\n });\n\n return new Agent(session, context, tools);\n }\n\n /**\n * Get the session ID\n */\n get sessionId(): string {\n return this.session.id;\n }\n\n /**\n * Get session details\n */\n getSession(): Session {\n return this.session;\n }\n\n /**\n * Run the agent with a prompt (streaming)\n */\n async stream(options: AgentRunOptions): Promise<AgentStreamResult> {\n const config = getConfig();\n\n // Add user message to context\n this.context.addUserMessage(options.prompt);\n\n // Update session status\n sessionQueries.updateStatus(this.session.id, 'active');\n\n // Build system prompt\n const systemPrompt = await buildSystemPrompt({\n workingDirectory: this.session.workingDirectory,\n skillsDirectories: config.resolvedSkillsDirectories,\n sessionId: this.session.id,\n });\n\n // Get conversation history\n const messages = await this.context.getMessages();\n\n // Wrap tools with approval checking\n const wrappedTools = this.wrapToolsWithApproval(options);\n\n // Create stream\n const stream = streamText({\n model: gateway(this.session.model) as any,\n system: systemPrompt,\n messages: messages as any,\n tools: wrappedTools,\n stopWhen: stepCountIs(20),\n onStepFinish: async (step) => {\n options.onStepFinish?.(step as any);\n },\n });\n\n // Helper to save response messages after stream completes\n const saveResponseMessages = async () => {\n const result = await stream;\n const response = await result.response;\n const responseMessages = response.messages as ModelMessage[];\n this.context.addResponseMessages(responseMessages);\n };\n\n return {\n sessionId: this.session.id,\n stream,\n waitForApprovals: () => this.waitForApprovals(),\n saveResponseMessages,\n };\n }\n\n /**\n * Run the agent with a prompt (non-streaming)\n */\n async run(options: Omit<AgentRunOptions, 'onText'>): Promise<{ text: string; steps: unknown[] }> {\n const config = getConfig();\n\n // Add user message to context\n this.context.addUserMessage(options.prompt);\n\n // Build system prompt\n const systemPrompt = await buildSystemPrompt({\n workingDirectory: this.session.workingDirectory,\n skillsDirectories: config.resolvedSkillsDirectories,\n sessionId: this.session.id,\n });\n\n // Get conversation history\n const messages = await this.context.getMessages();\n\n // Wrap tools with approval checking\n const wrappedTools = this.wrapToolsWithApproval(options);\n\n const result = await generateText({\n model: gateway(this.session.model) as any,\n system: systemPrompt,\n messages: messages as any,\n tools: wrappedTools,\n stopWhen: stepCountIs(20),\n });\n\n // Save response messages using the proper AI SDK format\n const responseMessages = result.response.messages as ModelMessage[];\n this.context.addResponseMessages(responseMessages);\n\n return {\n text: result.text,\n steps: result.steps,\n };\n }\n\n /**\n * Wrap tools to add approval checking\n */\n private wrapToolsWithApproval(options: AgentRunOptions): ToolSet {\n const sessionConfig = this.session.config;\n const wrappedTools: ToolSet = {};\n\n for (const [name, originalTool] of Object.entries(this.tools)) {\n const needsApproval = requiresApproval(name, sessionConfig ?? undefined);\n\n if (!needsApproval) {\n wrappedTools[name] = originalTool;\n continue;\n }\n\n // Create wrapped tool that checks for approval and waits\n wrappedTools[name] = tool({\n description: originalTool.description || '',\n inputSchema: (originalTool as any).inputSchema || z.object({}),\n execute: async (input: unknown, toolOptions: { toolCallId?: string }) => {\n const toolCallId = toolOptions.toolCallId || nanoid();\n\n // Record the execution\n const execution = toolExecutionQueries.create({\n sessionId: this.session.id,\n toolName: name,\n toolCallId,\n input: input as any,\n requiresApproval: true,\n status: 'pending',\n });\n\n // Store pending approval\n this.pendingApprovals.set(toolCallId, execution);\n\n // Notify about approval requirement\n options.onApprovalRequired?.(execution);\n\n // Update session status\n sessionQueries.updateStatus(this.session.id, 'waiting');\n\n // Wait for approval decision (using shared store for cross-request access)\n const approved = await new Promise<boolean>((resolve) => {\n approvalResolvers.set(toolCallId, { resolve, sessionId: this.session.id });\n });\n\n // Get any rejection reason\n const resolverData = approvalResolvers.get(toolCallId);\n approvalResolvers.delete(toolCallId);\n this.pendingApprovals.delete(toolCallId);\n\n if (!approved) {\n // Tool was rejected\n const reason = resolverData?.reason || 'User rejected the tool execution';\n toolExecutionQueries.reject(execution.id);\n sessionQueries.updateStatus(this.session.id, 'active');\n \n return {\n status: 'rejected',\n toolCallId,\n rejected: true,\n reason,\n message: `Tool \"${name}\" was rejected by the user. Reason: ${reason}`,\n };\n }\n\n // Tool was approved - execute the original tool\n toolExecutionQueries.approve(execution.id);\n sessionQueries.updateStatus(this.session.id, 'active');\n\n try {\n const result = await (originalTool as any).execute(input, toolOptions);\n toolExecutionQueries.complete(execution.id, result);\n return result;\n } catch (error: any) {\n toolExecutionQueries.complete(execution.id, null, error.message);\n throw error;\n }\n },\n });\n }\n\n return wrappedTools;\n }\n\n /**\n * Wait for all pending approvals\n */\n async waitForApprovals(): Promise<ToolExecution[]> {\n return Array.from(this.pendingApprovals.values());\n }\n\n /**\n * Approve a pending tool execution\n */\n async approve(toolCallId: string): Promise<{ approved: true }> {\n // Check shared resolver store (the streaming Agent is waiting on this)\n const resolver = approvalResolvers.get(toolCallId);\n if (resolver) {\n resolver.resolve(true);\n return { approved: true };\n }\n\n // Fall back to database lookup\n const pendingFromDb = toolExecutionQueries.getPendingApprovals(this.session.id);\n const execution = pendingFromDb.find((e) => e.toolCallId === toolCallId);\n \n if (!execution) {\n throw new Error(`No pending approval for tool call: ${toolCallId}`);\n }\n\n // Mark as approved in DB\n toolExecutionQueries.approve(execution.id);\n return { approved: true };\n }\n\n /**\n * Reject a pending tool execution\n */\n reject(toolCallId: string, reason?: string): { rejected: true } {\n // Check shared resolver store (the streaming Agent is waiting on this)\n const resolver = approvalResolvers.get(toolCallId);\n if (resolver) {\n resolver.reason = reason;\n resolver.resolve(false);\n return { rejected: true };\n }\n\n // Fall back to database lookup\n const pendingFromDb = toolExecutionQueries.getPendingApprovals(this.session.id);\n const execution = pendingFromDb.find((e) => e.toolCallId === toolCallId);\n \n if (!execution) {\n throw new Error(`No pending approval for tool call: ${toolCallId}`);\n }\n\n // Mark as rejected in DB\n toolExecutionQueries.reject(execution.id);\n return { rejected: true };\n }\n\n /**\n * Get pending approvals\n */\n getPendingApprovals(): ToolExecution[] {\n return toolExecutionQueries.getPendingApprovals(this.session.id);\n }\n\n /**\n * Get context statistics\n */\n getContextStats() {\n return this.context.getStats();\n }\n\n /**\n * Clear conversation context (start fresh)\n */\n clearContext(): void {\n this.context.clear();\n }\n}\n\nexport { ContextManager } from './context.js';\nexport { buildSystemPrompt } from './prompts.js';\n","import { existsSync, readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport {\n SparkcoderConfig,\n SparkcoderConfigSchema,\n ResolvedConfig,\n} from './types.js';\n\nconst CONFIG_FILE_NAMES = [\n 'sparkecoder.config.json',\n 'sparkecoder.json',\n '.sparkecoder.json',\n];\n\nlet cachedConfig: ResolvedConfig | null = null;\n\n/**\n * Find the config file by searching up the directory tree\n */\nfunction findConfigFile(startDir: string): string | null {\n let currentDir = startDir;\n\n while (currentDir !== dirname(currentDir)) {\n for (const fileName of CONFIG_FILE_NAMES) {\n const configPath = resolve(currentDir, fileName);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n currentDir = dirname(currentDir);\n }\n\n return null;\n}\n\n/**\n * Load and parse the config file\n */\nexport function loadConfig(\n configPath?: string,\n workingDirectory?: string\n): ResolvedConfig {\n const cwd = workingDirectory || process.cwd();\n\n // Try to find config file\n let rawConfig: Partial<SparkcoderConfig> = {};\n let configDir = cwd;\n\n if (configPath) {\n if (!existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n const content = readFileSync(configPath, 'utf-8');\n rawConfig = JSON.parse(content);\n configDir = dirname(resolve(configPath));\n } else {\n const foundPath = findConfigFile(cwd);\n if (foundPath) {\n const content = readFileSync(foundPath, 'utf-8');\n rawConfig = JSON.parse(content);\n configDir = dirname(foundPath);\n }\n }\n\n // Override with environment variables\n if (process.env.SPARKECODER_MODEL) {\n rawConfig.defaultModel = process.env.SPARKECODER_MODEL;\n }\n if (process.env.SPARKECODER_PORT) {\n rawConfig.server = {\n port: parseInt(process.env.SPARKECODER_PORT, 10),\n host: rawConfig.server?.host ?? '127.0.0.1',\n };\n }\n if (process.env.DATABASE_PATH) {\n rawConfig.databasePath = process.env.DATABASE_PATH;\n }\n\n // Parse and validate\n const config = SparkcoderConfigSchema.parse(rawConfig);\n\n // Resolve paths\n const resolvedWorkingDirectory = config.workingDirectory\n ? resolve(configDir, config.workingDirectory)\n : cwd;\n\n const resolvedSkillsDirectories = [\n resolve(configDir, config.skills?.directory || './skills'),\n // Built-in skills\n resolve(dirname(import.meta.url.replace('file://', '')), '../skills/default'),\n ...(config.skills?.additionalDirectories || []).map((dir) =>\n resolve(configDir, dir)\n ),\n ].filter((dir) => {\n try {\n return existsSync(dir);\n } catch {\n return false;\n }\n });\n\n const resolvedDatabasePath = resolve(configDir, config.databasePath || './sparkecoder.db');\n\n const resolved: ResolvedConfig = {\n ...config,\n server: {\n port: config.server.port,\n host: config.server.host ?? '127.0.0.1',\n },\n resolvedWorkingDirectory,\n resolvedSkillsDirectories,\n resolvedDatabasePath,\n };\n\n cachedConfig = resolved;\n return resolved;\n}\n\n/**\n * Get the cached config (must call loadConfig first)\n */\nexport function getConfig(): ResolvedConfig {\n if (!cachedConfig) {\n throw new Error('Config not loaded. Call loadConfig first.');\n }\n return cachedConfig;\n}\n\n/**\n * Check if a tool requires approval\n */\nexport function requiresApproval(\n toolName: string,\n sessionConfig?: { toolApprovals?: Record<string, boolean> }\n): boolean {\n const config = getConfig();\n\n // Session-level override takes precedence\n if (sessionConfig?.toolApprovals?.[toolName] !== undefined) {\n return sessionConfig.toolApprovals[toolName];\n }\n\n // Check global config\n const globalApprovals = config.toolApprovals as Record<string, boolean>;\n if (globalApprovals[toolName] !== undefined) {\n return globalApprovals[toolName];\n }\n\n // Default: bash requires approval, others don't\n if (toolName === 'bash') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Create a default config file\n */\nexport function createDefaultConfig(): SparkcoderConfig {\n return {\n defaultModel: 'anthropic/claude-opus-4-5',\n workingDirectory: '.',\n toolApprovals: {\n bash: true,\n write_file: false,\n read_file: false,\n load_skill: false,\n todo: false,\n },\n skills: {\n directory: './skills',\n additionalDirectories: [],\n },\n context: {\n maxChars: 200_000,\n autoSummarize: true,\n keepRecentMessages: 10,\n },\n server: {\n port: 3141,\n host: '127.0.0.1',\n },\n databasePath: './sparkecoder.db',\n };\n}\n\nexport * from './types.js';\n","import { z } from 'zod';\n\n// Tool approval configuration\nexport const ToolApprovalConfigSchema = z.object({\n bash: z.boolean().optional().default(true),\n write_file: z.boolean().optional().default(false),\n read_file: z.boolean().optional().default(false),\n load_skill: z.boolean().optional().default(false),\n todo: z.boolean().optional().default(false),\n});\n\n// Skill definition (from frontmatter)\nexport const SkillMetadataSchema = z.object({\n name: z.string(),\n description: z.string(),\n});\n\n// Session-specific config (stored in DB)\nexport const SessionConfigSchema = z.object({\n toolApprovals: z.record(z.string(), z.boolean()).optional(),\n approvalWebhook: z.string().url().optional(),\n skillsDirectory: z.string().optional(),\n maxContextChars: z.number().optional().default(200_000),\n});\n\n// Main sparkecoder config file schema\nexport const SparkcoderConfigSchema = z.object({\n // Default model to use (Vercel AI Gateway format)\n defaultModel: z.string().default('anthropic/claude-opus-4-5'),\n\n // Working directory for file operations\n workingDirectory: z.string().optional(),\n\n // Tool approval settings\n toolApprovals: ToolApprovalConfigSchema.optional().default({}),\n\n // Approval webhook URL (called when approval is needed)\n approvalWebhook: z.string().url().optional(),\n\n // Skills configuration\n skills: z\n .object({\n // Directory containing skill files\n directory: z.string().optional().default('./skills'),\n // Additional skill directories to include\n additionalDirectories: z.array(z.string()).optional().default([]),\n })\n .optional()\n .default({}),\n\n // Context management\n context: z\n .object({\n // Maximum context size before summarization (in characters)\n maxChars: z.number().optional().default(200_000),\n // Enable automatic summarization\n autoSummarize: z.boolean().optional().default(true),\n // Number of recent messages to keep after summarization\n keepRecentMessages: z.number().optional().default(10),\n })\n .optional()\n .default({}),\n\n // Server configuration\n server: z\n .object({\n port: z.number().default(3141),\n host: z.string().default('127.0.0.1'),\n })\n .default({ port: 3141, host: '127.0.0.1' }),\n\n // Database path\n databasePath: z.string().optional().default('./sparkecoder.db'),\n});\n\nexport type ToolApprovalConfig = z.infer<typeof ToolApprovalConfigSchema>;\nexport type SkillMetadata = z.infer<typeof SkillMetadataSchema>;\nexport type SessionConfig = z.infer<typeof SessionConfigSchema>;\nexport type SparkcoderConfig = z.infer<typeof SparkcoderConfigSchema>;\n\n// Runtime config with resolved paths\nexport interface ResolvedConfig extends Omit<SparkcoderConfig, 'server'> {\n server: {\n port: number;\n host: string;\n };\n resolvedWorkingDirectory: string;\n resolvedSkillsDirectories: string[];\n resolvedDatabasePath: string;\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { truncateOutput } from '../utils/truncate.js';\n\nconst execAsync = promisify(exec);\n\nconst COMMAND_TIMEOUT = 60_000; // 60 seconds\nconst MAX_OUTPUT_CHARS = 10_000;\n\n// Commands that are blocked for safety\nconst BLOCKED_COMMANDS = [\n 'rm -rf /',\n 'rm -rf ~',\n 'mkfs',\n 'dd if=/dev/zero',\n ':(){:|:&};:',\n 'chmod -R 777 /',\n];\n\n/**\n * Check if a command is blocked\n */\nfunction isBlockedCommand(command: string): boolean {\n const normalizedCommand = command.toLowerCase().trim();\n return BLOCKED_COMMANDS.some((blocked) =>\n normalizedCommand.includes(blocked.toLowerCase())\n );\n}\n\nexport interface BashToolOptions {\n workingDirectory: string;\n onOutput?: (output: string) => void;\n}\n\nconst bashInputSchema = z.object({\n command: z\n .string()\n .describe('The bash command to execute. Can be a single command or a pipeline.'),\n});\n\nexport function createBashTool(options: BashToolOptions) {\n return tool({\n description: `Execute a bash command in the terminal. The command runs in the working directory: ${options.workingDirectory}. \nUse this for running shell commands, scripts, git operations, package managers (npm, pip, etc.), and other CLI tools.\nLong outputs will be automatically truncated. Commands have a 60 second timeout.\nIMPORTANT: Avoid destructive commands. Be careful with rm, chmod, and similar operations.`,\n\n inputSchema: bashInputSchema,\n\n execute: async ({ command }: z.infer<typeof bashInputSchema>) => {\n // Safety check\n if (isBlockedCommand(command)) {\n return {\n success: false,\n error: 'This command is blocked for safety reasons.',\n stdout: '',\n stderr: '',\n exitCode: 1,\n };\n }\n\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: options.workingDirectory,\n timeout: COMMAND_TIMEOUT,\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer\n shell: '/bin/bash',\n });\n\n const truncatedStdout = truncateOutput(stdout, MAX_OUTPUT_CHARS);\n const truncatedStderr = truncateOutput(stderr, MAX_OUTPUT_CHARS / 2);\n\n if (options.onOutput) {\n options.onOutput(truncatedStdout);\n }\n\n return {\n success: true,\n stdout: truncatedStdout,\n stderr: truncatedStderr,\n exitCode: 0,\n };\n } catch (error: any) {\n const stdout = error.stdout ? truncateOutput(error.stdout, MAX_OUTPUT_CHARS) : '';\n const stderr = error.stderr ? truncateOutput(error.stderr, MAX_OUTPUT_CHARS) : '';\n\n if (options.onOutput) {\n options.onOutput(stderr || error.message);\n }\n\n // Handle timeout\n if (error.killed) {\n return {\n success: false,\n error: `Command timed out after ${COMMAND_TIMEOUT / 1000} seconds`,\n stdout,\n stderr,\n exitCode: 124, // Standard timeout exit code\n };\n }\n\n return {\n success: false,\n error: error.message,\n stdout,\n stderr,\n exitCode: error.code ?? 1,\n };\n }\n },\n });\n}\n\nexport type BashTool = ReturnType<typeof createBashTool>;\n","const MAX_OUTPUT_CHARS = 10_000;\n\n/**\n * Truncate a string if it exceeds the max length\n */\nexport function truncateOutput(\n output: string,\n maxChars: number = MAX_OUTPUT_CHARS\n): string {\n if (output.length <= maxChars) {\n return output;\n }\n\n const halfMax = Math.floor(maxChars / 2);\n const truncatedChars = output.length - maxChars;\n\n return (\n output.slice(0, halfMax) +\n `\\n\\n... [TRUNCATED: ${truncatedChars.toLocaleString()} characters omitted] ...\\n\\n` +\n output.slice(-halfMax)\n );\n}\n\n/**\n * Calculate the total character count of messages\n */\nexport function calculateContextSize(messages: Array<{ content: unknown }>): number {\n return messages.reduce((total, msg) => {\n const content = typeof msg.content === 'string' \n ? msg.content \n : JSON.stringify(msg.content);\n return total + content.length;\n }, 0);\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Format number with commas\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString();\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { readFile, stat } from 'node:fs/promises';\nimport { resolve, relative, isAbsolute } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { truncateOutput } from '../utils/truncate.js';\n\nconst MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB\nconst MAX_OUTPUT_CHARS = 50_000;\n\nexport interface ReadFileToolOptions {\n workingDirectory: string;\n}\n\nconst readFileInputSchema = z.object({\n path: z\n .string()\n .describe('The path to the file to read. Can be relative to working directory or absolute.'),\n startLine: z\n .number()\n .optional()\n .describe('Optional: Start reading from this line number (1-indexed)'),\n endLine: z\n .number()\n .optional()\n .describe('Optional: Stop reading at this line number (1-indexed, inclusive)'),\n});\n\nexport function createReadFileTool(options: ReadFileToolOptions) {\n return tool({\n description: `Read the contents of a file. Provide a path relative to the working directory (${options.workingDirectory}) or an absolute path.\nLarge files will be automatically truncated. Binary files are not supported.\nUse this to understand existing code, check file contents, or gather context.`,\n\n inputSchema: readFileInputSchema,\n\n execute: async ({ path, startLine, endLine }: z.infer<typeof readFileInputSchema>) => {\n try {\n // Resolve the path\n const absolutePath = isAbsolute(path)\n ? path\n : resolve(options.workingDirectory, path);\n\n // Security check: ensure path is within working directory or is explicitly absolute\n const relativePath = relative(options.workingDirectory, absolutePath);\n if (relativePath.startsWith('..') && !isAbsolute(path)) {\n return {\n success: false,\n error: 'Path escapes the working directory. Use an absolute path if intentional.',\n content: null,\n };\n }\n\n // Check if file exists\n if (!existsSync(absolutePath)) {\n return {\n success: false,\n error: `File not found: ${path}`,\n content: null,\n };\n }\n\n // Check file size\n const stats = await stat(absolutePath);\n if (stats.size > MAX_FILE_SIZE) {\n return {\n success: false,\n error: `File is too large (${(stats.size / 1024 / 1024).toFixed(2)}MB). Maximum size is ${MAX_FILE_SIZE / 1024 / 1024}MB.`,\n content: null,\n };\n }\n\n // Check if it's a directory\n if (stats.isDirectory()) {\n return {\n success: false,\n error: 'Path is a directory, not a file. Use bash with \"ls\" to list directory contents.',\n content: null,\n };\n }\n\n // Read the file\n let content = await readFile(absolutePath, 'utf-8');\n\n // Handle line range\n if (startLine !== undefined || endLine !== undefined) {\n const lines = content.split('\\n');\n const start = (startLine ?? 1) - 1;\n const end = endLine ?? lines.length;\n \n if (start < 0 || start >= lines.length) {\n return {\n success: false,\n error: `Start line ${startLine} is out of range. File has ${lines.length} lines.`,\n content: null,\n };\n }\n\n content = lines.slice(start, end).join('\\n');\n \n // Add line number context\n const lineNumbers = lines\n .slice(start, end)\n .map((line, idx) => `${(start + idx + 1).toString().padStart(4)}: ${line}`)\n .join('\\n');\n \n content = lineNumbers;\n }\n\n // Truncate if necessary\n const truncatedContent = truncateOutput(content, MAX_OUTPUT_CHARS);\n const wasTruncated = truncatedContent.length < content.length;\n\n return {\n success: true,\n path: absolutePath,\n relativePath: relative(options.workingDirectory, absolutePath),\n content: truncatedContent,\n lineCount: content.split('\\n').length,\n wasTruncated,\n sizeBytes: stats.size,\n };\n } catch (error: any) {\n // Check for binary file\n if (error.code === 'ERR_INVALID_ARG_VALUE' || error.message.includes('encoding')) {\n return {\n success: false,\n error: 'File appears to be binary and cannot be read as text.',\n content: null,\n };\n }\n\n return {\n success: false,\n error: error.message,\n content: null,\n };\n }\n },\n });\n}\n\nexport type ReadFileTool = ReturnType<typeof createReadFileTool>;\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { resolve, relative, isAbsolute, dirname } from 'node:path';\nimport { existsSync } from 'node:fs';\n\nexport interface WriteFileToolOptions {\n workingDirectory: string;\n}\n\nconst writeFileInputSchema = z.object({\n path: z\n .string()\n .describe('The path to the file. Can be relative to working directory or absolute.'),\n mode: z\n .enum(['full', 'str_replace'])\n .describe('Write mode: \"full\" for complete file write, \"str_replace\" for targeted string replacement'),\n content: z\n .string()\n .optional()\n .describe('For \"full\" mode: The complete content to write to the file'),\n old_string: z\n .string()\n .optional()\n .describe('For \"str_replace\" mode: The exact string to find and replace'),\n new_string: z\n .string()\n .optional()\n .describe('For \"str_replace\" mode: The string to replace old_string with'),\n});\n\nexport function createWriteFileTool(options: WriteFileToolOptions) {\n return tool({\n description: `Write content to a file. Supports two modes:\n1. \"full\" - Write the entire file content (creates new file or replaces existing)\n2. \"str_replace\" - Replace a specific string in an existing file (for precise edits)\n\nFor str_replace mode:\n- Provide the exact string to find (old_string) and its replacement (new_string)\n- The old_string must match EXACTLY (including whitespace and indentation)\n- Only the first occurrence is replaced\n- Use this for surgical edits to existing code\n\nFor full mode:\n- Provide the complete file content\n- Creates parent directories if they don't exist\n- Use this for new files or complete rewrites\n\nWorking directory: ${options.workingDirectory}`,\n\n inputSchema: writeFileInputSchema,\n\n execute: async ({ path, mode, content, old_string, new_string }: z.infer<typeof writeFileInputSchema>) => {\n try {\n // Resolve the path\n const absolutePath = isAbsolute(path)\n ? path\n : resolve(options.workingDirectory, path);\n\n // Security check\n const relativePath = relative(options.workingDirectory, absolutePath);\n if (relativePath.startsWith('..') && !isAbsolute(path)) {\n return {\n success: false,\n error: 'Path escapes the working directory. Use an absolute path if intentional.',\n };\n }\n\n if (mode === 'full') {\n // Full file write\n if (content === undefined) {\n return {\n success: false,\n error: 'Content is required for \"full\" mode',\n };\n }\n\n // Create parent directories if needed\n const dir = dirname(absolutePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n const existed = existsSync(absolutePath);\n await writeFile(absolutePath, content, 'utf-8');\n\n return {\n success: true,\n path: absolutePath,\n relativePath: relative(options.workingDirectory, absolutePath),\n mode: 'full',\n action: existed ? 'replaced' : 'created',\n bytesWritten: Buffer.byteLength(content, 'utf-8'),\n lineCount: content.split('\\n').length,\n };\n } else if (mode === 'str_replace') {\n // String replacement mode\n if (old_string === undefined || new_string === undefined) {\n return {\n success: false,\n error: 'Both old_string and new_string are required for \"str_replace\" mode',\n };\n }\n\n if (!existsSync(absolutePath)) {\n return {\n success: false,\n error: `File not found: ${path}. Use \"full\" mode to create new files.`,\n };\n }\n\n // Read current content\n const currentContent = await readFile(absolutePath, 'utf-8');\n\n // Check if old_string exists\n if (!currentContent.includes(old_string)) {\n // Provide helpful debugging info\n const lines = currentContent.split('\\n');\n const preview = lines.slice(0, 20).join('\\n');\n \n return {\n success: false,\n error: 'old_string not found in file. The string must match EXACTLY including whitespace.',\n hint: 'Check for differences in indentation, line endings, or invisible characters.',\n filePreview: lines.length > 20 \n ? `${preview}\\n... (${lines.length - 20} more lines)`\n : preview,\n };\n }\n\n // Check for multiple occurrences\n const occurrences = currentContent.split(old_string).length - 1;\n if (occurrences > 1) {\n return {\n success: false,\n error: `Found ${occurrences} occurrences of old_string. Please provide more context to make it unique.`,\n hint: 'Include surrounding lines or more specific content in old_string.',\n };\n }\n\n // Perform replacement\n const newContent = currentContent.replace(old_string, new_string);\n await writeFile(absolutePath, newContent, 'utf-8');\n\n // Calculate diff info\n const oldLines = old_string.split('\\n').length;\n const newLines = new_string.split('\\n').length;\n\n return {\n success: true,\n path: absolutePath,\n relativePath: relative(options.workingDirectory, absolutePath),\n mode: 'str_replace',\n linesRemoved: oldLines,\n linesAdded: newLines,\n lineDelta: newLines - oldLines,\n };\n }\n\n return {\n success: false,\n error: `Invalid mode: ${mode}`,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message,\n };\n }\n },\n });\n}\n\nexport type WriteFileTool = ReturnType<typeof createWriteFileTool>;\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { todoQueries, TodoItem } from '../db/index.js';\n\nexport interface TodoToolOptions {\n sessionId: string;\n}\n\nconst todoInputSchema = z.object({\n action: z\n .enum(['add', 'list', 'mark', 'clear'])\n .describe('The action to perform on the todo list'),\n items: z\n .array(\n z.object({\n content: z.string().describe('Description of the task'),\n order: z.number().optional().describe('Optional order/priority (lower = higher priority)'),\n })\n )\n .optional()\n .describe('For \"add\" action: Array of todo items to add'),\n todoId: z\n .string()\n .optional()\n .describe('For \"mark\" action: The ID of the todo item to update'),\n status: z\n .enum(['pending', 'in_progress', 'completed', 'cancelled'])\n .optional()\n .describe('For \"mark\" action: The new status for the todo item'),\n});\n\nexport function createTodoTool(options: TodoToolOptions) {\n return tool({\n description: `Manage your task list for the current session. Use this to:\n- Break down complex tasks into smaller steps\n- Track progress on multi-step operations\n- Organize your work systematically\n\nAvailable actions:\n- \"add\": Add one or more new todo items to the list\n- \"list\": View all current todo items and their status\n- \"mark\": Update the status of a todo item (pending, in_progress, completed, cancelled)\n- \"clear\": Remove all todo items from the list\n\nBest practices:\n- Add todos before starting complex tasks\n- Mark items as \"in_progress\" when actively working on them\n- Update status as you complete each step`,\n\n inputSchema: todoInputSchema,\n\n execute: async ({ action, items, todoId, status }: z.infer<typeof todoInputSchema>) => {\n try {\n switch (action) {\n case 'add': {\n if (!items || items.length === 0) {\n return {\n success: false,\n error: 'No items provided. Include at least one todo item.',\n };\n }\n\n const created = todoQueries.createMany(options.sessionId, items);\n \n return {\n success: true,\n action: 'add',\n itemsAdded: created.length,\n items: created.map(formatTodoItem),\n };\n }\n\n case 'list': {\n const todos = todoQueries.getBySession(options.sessionId);\n \n const stats = {\n total: todos.length,\n pending: todos.filter((t) => t.status === 'pending').length,\n inProgress: todos.filter((t) => t.status === 'in_progress').length,\n completed: todos.filter((t) => t.status === 'completed').length,\n cancelled: todos.filter((t) => t.status === 'cancelled').length,\n };\n\n return {\n success: true,\n action: 'list',\n stats,\n items: todos.map(formatTodoItem),\n };\n }\n\n case 'mark': {\n if (!todoId) {\n return {\n success: false,\n error: 'todoId is required for \"mark\" action',\n };\n }\n\n if (!status) {\n return {\n success: false,\n error: 'status is required for \"mark\" action',\n };\n }\n\n const updated = todoQueries.updateStatus(todoId, status);\n \n if (!updated) {\n return {\n success: false,\n error: `Todo item not found: ${todoId}`,\n };\n }\n\n return {\n success: true,\n action: 'mark',\n item: formatTodoItem(updated),\n };\n }\n\n case 'clear': {\n const count = todoQueries.clearSession(options.sessionId);\n \n return {\n success: true,\n action: 'clear',\n itemsRemoved: count,\n };\n }\n\n default:\n return {\n success: false,\n error: `Unknown action: ${action}`,\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error.message,\n };\n }\n },\n });\n}\n\nfunction formatTodoItem(item: TodoItem) {\n return {\n id: item.id,\n content: item.content,\n status: item.status,\n order: item.order,\n createdAt: item.createdAt.toISOString(),\n };\n}\n\nexport type TodoTool = ReturnType<typeof createTodoTool>;\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { loadAllSkills, loadSkillContent, formatSkillsForContext } from '../skills/index.js';\nimport { skillQueries } from '../db/index.js';\n\nexport interface LoadSkillToolOptions {\n sessionId: string;\n skillsDirectories: string[];\n}\n\nconst loadSkillInputSchema = z.object({\n action: z\n .enum(['list', 'load'])\n .describe('Action to perform: \"list\" to see available skills, \"load\" to load a skill'),\n skillName: z\n .string()\n .optional()\n .describe('For \"load\" action: The name of the skill to load'),\n});\n\nexport function createLoadSkillTool(options: LoadSkillToolOptions) {\n return tool({\n description: `Load a skill document into the conversation context. Skills are specialized knowledge files that provide guidance on specific topics like debugging, code review, architecture patterns, etc.\n\nAvailable actions:\n- \"list\": Show all available skills with their descriptions\n- \"load\": Load a specific skill's full content into context\n\nUse this when you need specialized knowledge or guidance for a particular task.\nOnce loaded, a skill's content will be available in the conversation context.`,\n\n inputSchema: loadSkillInputSchema,\n\n execute: async ({ action, skillName }: z.infer<typeof loadSkillInputSchema>) => {\n try {\n switch (action) {\n case 'list': {\n const skills = await loadAllSkills(options.skillsDirectories);\n \n return {\n success: true,\n action: 'list',\n skillCount: skills.length,\n skills: skills.map((s) => ({\n name: s.name,\n description: s.description,\n })),\n formatted: formatSkillsForContext(skills),\n };\n }\n\n case 'load': {\n if (!skillName) {\n return {\n success: false,\n error: 'skillName is required for \"load\" action',\n };\n }\n\n // Check if already loaded\n if (skillQueries.isLoaded(options.sessionId, skillName)) {\n return {\n success: false,\n error: `Skill \"${skillName}\" is already loaded in this session`,\n };\n }\n\n // Load the skill content\n const skill = await loadSkillContent(skillName, options.skillsDirectories);\n \n if (!skill) {\n const allSkills = await loadAllSkills(options.skillsDirectories);\n return {\n success: false,\n error: `Skill \"${skillName}\" not found`,\n availableSkills: allSkills.map((s) => s.name),\n };\n }\n\n // Record that we loaded this skill\n skillQueries.load(options.sessionId, skillName);\n\n return {\n success: true,\n action: 'load',\n skillName: skill.name,\n description: skill.description,\n content: skill.content,\n contentLength: skill.content.length,\n };\n }\n\n default:\n return {\n success: false,\n error: `Unknown action: ${action}`,\n };\n }\n } catch (error: any) {\n return {\n success: false,\n error: error.message,\n };\n }\n },\n });\n}\n\nexport type LoadSkillTool = ReturnType<typeof createLoadSkillTool>;\n","import { readFile, readdir } from 'node:fs/promises';\nimport { resolve, basename, extname } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { SkillMetadata, SkillMetadataSchema } from '../config/types.js';\n\nexport interface Skill {\n name: string;\n description: string;\n filePath: string;\n content?: string; // Only loaded when explicitly requested\n}\n\nexport interface SkillWithContent extends Skill {\n content: string;\n}\n\n/**\n * Parse skill metadata from frontmatter\n */\nfunction parseSkillFrontmatter(content: string): { metadata: SkillMetadata; body: string } | null {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n \n if (!frontmatterMatch) {\n return null;\n }\n\n const [, frontmatter, body] = frontmatterMatch;\n \n try {\n // Simple YAML-like parsing for name and description\n const lines = frontmatter.split('\\n');\n const data: Record<string, string> = {};\n \n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n let value = line.slice(colonIndex + 1).trim();\n // Remove quotes if present\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n data[key] = value;\n }\n }\n\n const metadata = SkillMetadataSchema.parse(data);\n return { metadata, body: body.trim() };\n } catch {\n return null;\n }\n}\n\n/**\n * Get skill name from filename if no frontmatter\n */\nfunction getSkillNameFromPath(filePath: string): string {\n return basename(filePath, extname(filePath))\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Load all skills from a directory (metadata only)\n */\nexport async function loadSkillsFromDirectory(directory: string): Promise<Skill[]> {\n if (!existsSync(directory)) {\n return [];\n }\n\n const skills: Skill[] = [];\n const files = await readdir(directory);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filePath = resolve(directory, file);\n const content = await readFile(filePath, 'utf-8');\n const parsed = parseSkillFrontmatter(content);\n\n if (parsed) {\n skills.push({\n name: parsed.metadata.name,\n description: parsed.metadata.description,\n filePath,\n });\n } else {\n // Use filename as name, first paragraph as description\n const name = getSkillNameFromPath(filePath);\n const firstParagraph = content.split('\\n\\n')[0]?.slice(0, 200) || 'No description';\n \n skills.push({\n name,\n description: firstParagraph.replace(/^#\\s*/, '').trim(),\n filePath,\n });\n }\n }\n\n return skills;\n}\n\n/**\n * Load all skills from multiple directories\n */\nexport async function loadAllSkills(directories: string[]): Promise<Skill[]> {\n const allSkills: Skill[] = [];\n const seenNames = new Set<string>();\n\n for (const dir of directories) {\n const skills = await loadSkillsFromDirectory(dir);\n for (const skill of skills) {\n // Avoid duplicates (first one wins)\n if (!seenNames.has(skill.name.toLowerCase())) {\n seenNames.add(skill.name.toLowerCase());\n allSkills.push(skill);\n }\n }\n }\n\n return allSkills;\n}\n\n/**\n * Load a skill's full content by name\n */\nexport async function loadSkillContent(\n skillName: string,\n directories: string[]\n): Promise<SkillWithContent | null> {\n const allSkills = await loadAllSkills(directories);\n const skill = allSkills.find(\n (s) => s.name.toLowerCase() === skillName.toLowerCase()\n );\n\n if (!skill) {\n return null;\n }\n\n const content = await readFile(skill.filePath, 'utf-8');\n const parsed = parseSkillFrontmatter(content);\n\n return {\n ...skill,\n content: parsed ? parsed.body : content,\n };\n}\n\n/**\n * Format skills list for context\n */\nexport function formatSkillsForContext(skills: Skill[]): string {\n if (skills.length === 0) {\n return 'No skills available.';\n }\n\n const lines = ['Available skills (use load_skill tool to load into context):'];\n for (const skill of skills) {\n lines.push(`- ${skill.name}: ${skill.description}`);\n }\n\n return lines.join('\\n');\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport { getTerminalManager, TerminalInfo } from '../terminal/index.js';\n\n// Single schema with action as an enum and optional fields for each action type\nconst TerminalInputSchema = z.object({\n action: z.enum(['spawn', 'logs', 'status', 'kill', 'write', 'list']).describe(\n 'The action to perform: spawn (start process), logs (get output), status (check if running), kill (stop process), write (send stdin), list (show all)'\n ),\n // For spawn\n command: z.string().optional().describe('For spawn: The command to run (e.g., \"npm run dev\")'),\n cwd: z.string().optional().describe('For spawn: Working directory for the command'),\n name: z.string().optional().describe('For spawn: Optional friendly name (e.g., \"dev-server\")'),\n // For logs, status, kill, write\n terminalId: z.string().optional().describe('For logs/status/kill/write: The terminal ID'),\n tail: z.number().optional().describe('For logs: Number of lines to return from the end'),\n // For kill\n signal: z.enum(['SIGTERM', 'SIGKILL']).optional().describe('For kill: Signal to send (default: SIGTERM)'),\n // For write\n input: z.string().optional().describe('For write: The input to send to stdin'),\n});\n\ntype TerminalInput = z.infer<typeof TerminalInputSchema>;\n\nexport interface TerminalToolOptions {\n sessionId: string;\n workingDirectory: string;\n}\n\n/**\n * Create the terminal tool for managing background processes\n */\nexport function createTerminalTool(options: TerminalToolOptions) {\n const { sessionId, workingDirectory } = options;\n\n return tool({\n description: `Manage background terminal processes. Use this for long-running commands like dev servers, watchers, or any process that shouldn't block.\n\nActions:\n- spawn: Start a new background process. Requires 'command'. Returns terminal ID.\n- logs: Get output from a terminal. Requires 'terminalId'. Optional 'tail' for recent lines.\n- status: Check if a terminal is still running. Requires 'terminalId'.\n- kill: Stop a terminal process. Requires 'terminalId'. Optional 'signal'.\n- write: Send input to a terminal's stdin. Requires 'terminalId' and 'input'.\n- list: Show all terminals for this session. No other params needed.\n\nExample workflow:\n1. spawn with command=\"npm run dev\", name=\"dev-server\" → { id: \"abc123\", status: \"running\" }\n2. logs with terminalId=\"abc123\", tail=10 → \"Ready on http://localhost:3000\"\n3. kill with terminalId=\"abc123\" → { success: true }`,\n inputSchema: TerminalInputSchema,\n execute: async (input: TerminalInput) => {\n const manager = getTerminalManager();\n\n switch (input.action) {\n case 'spawn': {\n if (!input.command) {\n return { success: false, error: 'spawn requires a \"command\" parameter' };\n }\n const terminal = manager.spawn({\n sessionId,\n command: input.command,\n cwd: input.cwd || workingDirectory,\n name: input.name,\n });\n return {\n success: true,\n terminal: formatTerminal(terminal),\n message: `Started \"${input.command}\" with terminal ID: ${terminal.id}`,\n };\n }\n\n case 'logs': {\n if (!input.terminalId) {\n return { success: false, error: 'logs requires a \"terminalId\" parameter' };\n }\n const result = manager.getLogs(input.terminalId, input.tail);\n if (!result) {\n return {\n success: false,\n error: `Terminal not found: ${input.terminalId}`,\n };\n }\n return {\n success: true,\n terminalId: input.terminalId,\n logs: result.logs,\n lineCount: result.lineCount,\n };\n }\n\n case 'status': {\n if (!input.terminalId) {\n return { success: false, error: 'status requires a \"terminalId\" parameter' };\n }\n const status = manager.getStatus(input.terminalId);\n if (!status) {\n return {\n success: false,\n error: `Terminal not found: ${input.terminalId}`,\n };\n }\n return {\n success: true,\n terminal: formatTerminal(status),\n };\n }\n\n case 'kill': {\n if (!input.terminalId) {\n return { success: false, error: 'kill requires a \"terminalId\" parameter' };\n }\n const success = manager.kill(input.terminalId, input.signal);\n if (!success) {\n return {\n success: false,\n error: `Failed to kill terminal: ${input.terminalId}`,\n };\n }\n return {\n success: true,\n message: `Sent ${input.signal || 'SIGTERM'} to terminal ${input.terminalId}`,\n };\n }\n\n case 'write': {\n if (!input.terminalId) {\n return { success: false, error: 'write requires a \"terminalId\" parameter' };\n }\n if (!input.input) {\n return { success: false, error: 'write requires an \"input\" parameter' };\n }\n const success = manager.write(input.terminalId, input.input);\n if (!success) {\n return {\n success: false,\n error: `Failed to write to terminal: ${input.terminalId}`,\n };\n }\n return {\n success: true,\n message: `Sent input to terminal ${input.terminalId}`,\n };\n }\n\n case 'list': {\n const terminals = manager.list(sessionId);\n return {\n success: true,\n terminals: terminals.map(formatTerminal),\n count: terminals.length,\n running: terminals.filter(t => t.status === 'running').length,\n };\n }\n\n default:\n return { success: false, error: `Unknown action: ${input.action}` };\n }\n },\n });\n}\n\nfunction formatTerminal(t: TerminalInfo) {\n return {\n id: t.id,\n name: t.name,\n command: t.command,\n cwd: t.cwd,\n pid: t.pid,\n status: t.status,\n exitCode: t.exitCode,\n error: t.error,\n createdAt: t.createdAt.toISOString(),\n stoppedAt: t.stoppedAt?.toISOString() || null,\n };\n}\n","import { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { terminalQueries, Terminal } from '../db/index.js';\n\n// Ring buffer for storing logs with a max size\nclass LogBuffer {\n private buffer: string[] = [];\n private maxSize: number;\n private totalBytes = 0;\n private readonly maxBytes: number;\n\n constructor(maxBytes = 50 * 1024) { // 50KB default\n this.maxBytes = maxBytes;\n this.maxSize = 1000; // Max lines\n }\n\n append(data: string): void {\n const lines = data.split('\\n');\n for (const line of lines) {\n if (line) {\n this.buffer.push(line);\n this.totalBytes += line.length;\n }\n }\n\n // Trim if over max bytes\n while (this.totalBytes > this.maxBytes && this.buffer.length > 1) {\n const removed = this.buffer.shift();\n if (removed) {\n this.totalBytes -= removed.length;\n }\n }\n\n // Trim if over max lines\n while (this.buffer.length > this.maxSize) {\n const removed = this.buffer.shift();\n if (removed) {\n this.totalBytes -= removed.length;\n }\n }\n }\n\n getAll(): string {\n return this.buffer.join('\\n');\n }\n\n getTail(lines: number): string {\n const start = Math.max(0, this.buffer.length - lines);\n return this.buffer.slice(start).join('\\n');\n }\n\n clear(): void {\n this.buffer = [];\n this.totalBytes = 0;\n }\n\n get lineCount(): number {\n return this.buffer.length;\n }\n}\n\nexport interface ManagedProcess {\n id: string;\n process: ChildProcess;\n logs: LogBuffer;\n terminal: Terminal;\n}\n\nexport interface SpawnOptions {\n sessionId: string;\n command: string;\n cwd?: string;\n name?: string;\n env?: Record<string, string>;\n}\n\nexport interface TerminalInfo {\n id: string;\n name: string | null;\n command: string;\n cwd: string;\n pid: number | null;\n status: 'running' | 'stopped' | 'error';\n exitCode: number | null;\n error: string | null;\n createdAt: Date;\n stoppedAt: Date | null;\n}\n\n/**\n * Manages terminal processes for agent sessions\n * - Spawns background processes\n * - Captures stdout/stderr in ring buffers\n * - Tracks process lifecycle\n * - Provides log access\n */\nexport class TerminalManager extends EventEmitter {\n private processes: Map<string, ManagedProcess> = new Map();\n private static instance: TerminalManager | null = null;\n\n private constructor() {\n super();\n }\n\n static getInstance(): TerminalManager {\n if (!TerminalManager.instance) {\n TerminalManager.instance = new TerminalManager();\n }\n return TerminalManager.instance;\n }\n\n /**\n * Spawn a new background process\n */\n spawn(options: SpawnOptions): TerminalInfo {\n const { sessionId, command, cwd, name, env } = options;\n\n // Parse command into executable and args\n const parts = this.parseCommand(command);\n const executable = parts[0];\n const args = parts.slice(1);\n\n // Create terminal record in DB first\n const terminal = terminalQueries.create({\n sessionId,\n name: name || null,\n command,\n cwd: cwd || process.cwd(),\n status: 'running',\n });\n\n // Spawn the process\n const proc = spawn(executable, args, {\n cwd: cwd || process.cwd(),\n shell: true,\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env, ...env },\n detached: false,\n });\n\n // Update PID in DB\n if (proc.pid) {\n terminalQueries.updatePid(terminal.id, proc.pid);\n }\n\n // Create log buffer\n const logs = new LogBuffer();\n\n // Capture stdout\n proc.stdout?.on('data', (data: Buffer) => {\n const text = data.toString();\n logs.append(text);\n this.emit('stdout', { terminalId: terminal.id, data: text });\n });\n\n // Capture stderr\n proc.stderr?.on('data', (data: Buffer) => {\n const text = data.toString();\n logs.append(`[stderr] ${text}`);\n this.emit('stderr', { terminalId: terminal.id, data: text });\n });\n\n // Handle process exit\n proc.on('exit', (code, signal) => {\n const exitCode = code ?? (signal ? 128 : 0);\n terminalQueries.updateStatus(terminal.id, 'stopped', exitCode);\n this.emit('exit', { terminalId: terminal.id, code: exitCode, signal });\n \n // Keep in map for log access, but mark as stopped\n const managed = this.processes.get(terminal.id);\n if (managed) {\n managed.terminal = { ...managed.terminal, status: 'stopped', exitCode };\n }\n });\n\n // Handle errors\n proc.on('error', (err) => {\n terminalQueries.updateStatus(terminal.id, 'error', undefined, err.message);\n this.emit('error', { terminalId: terminal.id, error: err.message });\n \n const managed = this.processes.get(terminal.id);\n if (managed) {\n managed.terminal = { ...managed.terminal, status: 'error', error: err.message };\n }\n });\n\n // Store in memory\n const managed: ManagedProcess = {\n id: terminal.id,\n process: proc,\n logs,\n terminal: { ...terminal, pid: proc.pid ?? null },\n };\n this.processes.set(terminal.id, managed);\n\n return this.toTerminalInfo(managed.terminal);\n }\n\n /**\n * Get logs from a terminal\n */\n getLogs(terminalId: string, tail?: number): { logs: string; lineCount: number } | null {\n const managed = this.processes.get(terminalId);\n if (!managed) {\n return null;\n }\n\n return {\n logs: tail ? managed.logs.getTail(tail) : managed.logs.getAll(),\n lineCount: managed.logs.lineCount,\n };\n }\n\n /**\n * Get terminal status\n */\n getStatus(terminalId: string): TerminalInfo | null {\n // First check in-memory\n const managed = this.processes.get(terminalId);\n if (managed) {\n // Update status from process if running\n if (managed.process.exitCode !== null) {\n managed.terminal = {\n ...managed.terminal,\n status: 'stopped',\n exitCode: managed.process.exitCode,\n };\n }\n return this.toTerminalInfo(managed.terminal);\n }\n\n // Fall back to DB\n const terminal = terminalQueries.getById(terminalId);\n if (terminal) {\n return this.toTerminalInfo(terminal);\n }\n\n return null;\n }\n\n /**\n * Kill a terminal process\n */\n kill(terminalId: string, signal: 'SIGTERM' | 'SIGKILL' = 'SIGTERM'): boolean {\n const managed = this.processes.get(terminalId);\n if (!managed) {\n return false;\n }\n\n try {\n managed.process.kill(signal);\n return true;\n } catch (err) {\n console.error(`Failed to kill terminal ${terminalId}:`, err);\n return false;\n }\n }\n\n /**\n * Write to a terminal's stdin\n */\n write(terminalId: string, input: string): boolean {\n const managed = this.processes.get(terminalId);\n if (!managed || !managed.process.stdin) {\n return false;\n }\n\n try {\n managed.process.stdin.write(input);\n return true;\n } catch (err) {\n console.error(`Failed to write to terminal ${terminalId}:`, err);\n return false;\n }\n }\n\n /**\n * List all terminals for a session\n */\n list(sessionId: string): TerminalInfo[] {\n // Get from DB for full history\n const terminals = terminalQueries.getBySession(sessionId);\n \n // Merge with in-memory status\n return terminals.map(t => {\n const managed = this.processes.get(t.id);\n if (managed) {\n return this.toTerminalInfo(managed.terminal);\n }\n return this.toTerminalInfo(t);\n });\n }\n\n /**\n * Get all running terminals for a session\n */\n getRunning(sessionId: string): TerminalInfo[] {\n return this.list(sessionId).filter(t => t.status === 'running');\n }\n\n /**\n * Kill all terminals for a session (cleanup)\n */\n killAll(sessionId: string): number {\n let killed = 0;\n for (const [id, managed] of this.processes) {\n if (managed.terminal.sessionId === sessionId) {\n if (this.kill(id)) {\n killed++;\n }\n }\n }\n return killed;\n }\n\n /**\n * Clean up stopped terminals from memory (keep DB records)\n */\n cleanup(sessionId?: string): number {\n let cleaned = 0;\n for (const [id, managed] of this.processes) {\n if (sessionId && managed.terminal.sessionId !== sessionId) {\n continue;\n }\n if (managed.terminal.status !== 'running') {\n this.processes.delete(id);\n cleaned++;\n }\n }\n return cleaned;\n }\n\n /**\n * Parse a command string into executable and arguments\n */\n private parseCommand(command: string): string[] {\n // Simple parsing - shell: true handles complex cases\n const parts: string[] = [];\n let current = '';\n let inQuote = false;\n let quoteChar = '';\n\n for (const char of command) {\n if ((char === '\"' || char === \"'\") && !inQuote) {\n inQuote = true;\n quoteChar = char;\n } else if (char === quoteChar && inQuote) {\n inQuote = false;\n quoteChar = '';\n } else if (char === ' ' && !inQuote) {\n if (current) {\n parts.push(current);\n current = '';\n }\n } else {\n current += char;\n }\n }\n if (current) {\n parts.push(current);\n }\n\n return parts.length > 0 ? parts : [command];\n }\n\n private toTerminalInfo(terminal: Terminal): TerminalInfo {\n return {\n id: terminal.id,\n name: terminal.name,\n command: terminal.command,\n cwd: terminal.cwd,\n pid: terminal.pid,\n status: terminal.status as 'running' | 'stopped' | 'error',\n exitCode: terminal.exitCode,\n error: terminal.error,\n createdAt: terminal.createdAt,\n stoppedAt: terminal.stoppedAt,\n };\n }\n}\n\n// Export singleton getter\nexport function getTerminalManager(): TerminalManager {\n return TerminalManager.getInstance();\n}\n","import { ToolSet } from 'ai';\nimport { createBashTool, BashToolOptions } from './bash.js';\nimport { createReadFileTool, ReadFileToolOptions } from './read-file.js';\nimport { createWriteFileTool, WriteFileToolOptions } from './write-file.js';\nimport { createTodoTool, TodoToolOptions } from './todo.js';\nimport { createLoadSkillTool, LoadSkillToolOptions } from './load-skill.js';\nimport { createTerminalTool, TerminalToolOptions } from './terminal.js';\n\nexport interface CreateToolsOptions {\n sessionId: string;\n workingDirectory: string;\n skillsDirectories: string[];\n onBashOutput?: (output: string) => void;\n}\n\n/**\n * Create all tools for an agent session\n */\nexport function createTools(options: CreateToolsOptions): ToolSet {\n return {\n bash: createBashTool({\n workingDirectory: options.workingDirectory,\n onOutput: options.onBashOutput,\n }),\n\n read_file: createReadFileTool({\n workingDirectory: options.workingDirectory,\n }),\n\n write_file: createWriteFileTool({\n workingDirectory: options.workingDirectory,\n }),\n\n todo: createTodoTool({\n sessionId: options.sessionId,\n }),\n\n load_skill: createLoadSkillTool({\n sessionId: options.sessionId,\n skillsDirectories: options.skillsDirectories,\n }),\n\n terminal: createTerminalTool({\n sessionId: options.sessionId,\n workingDirectory: options.workingDirectory,\n }),\n };\n}\n\n// Re-export individual tool creators for customization\nexport { createBashTool } from './bash.js';\nexport { createReadFileTool } from './read-file.js';\nexport { createWriteFileTool } from './write-file.js';\nexport { createTodoTool } from './todo.js';\nexport { createLoadSkillTool } from './load-skill.js';\nexport { createTerminalTool } from './terminal.js';\n\n// Export types\nexport type { BashToolOptions } from './bash.js';\nexport type { ReadFileToolOptions } from './read-file.js';\nexport type { WriteFileToolOptions } from './write-file.js';\nexport type { TodoToolOptions } from './todo.js';\nexport type { LoadSkillToolOptions } from './load-skill.js';\nexport type { TerminalToolOptions } from './terminal.js';","import { generateText, type ModelMessage as AIModelMessage } from 'ai';\nimport { gateway } from '@ai-sdk/gateway';\nimport { messageQueries, ModelMessage } from '../db/index.js';\nimport { calculateContextSize } from '../utils/truncate.js';\nimport { createSummaryPrompt } from './prompts.js';\nimport { getConfig } from '../config/index.js';\n\nexport interface ContextManagerOptions {\n sessionId: string;\n maxContextChars: number;\n keepRecentMessages: number;\n autoSummarize: boolean;\n}\n\n/**\n * Manages conversation context including history and summarization\n * \n * Uses AI SDK's ModelMessage format directly for accurate message passing.\n * Messages are stored in the exact format returned by response.messages.\n */\nexport class ContextManager {\n private sessionId: string;\n private maxContextChars: number;\n private keepRecentMessages: number;\n private autoSummarize: boolean;\n private summary: string | null = null;\n\n constructor(options: ContextManagerOptions) {\n this.sessionId = options.sessionId;\n this.maxContextChars = options.maxContextChars;\n this.keepRecentMessages = options.keepRecentMessages;\n this.autoSummarize = options.autoSummarize;\n }\n\n /**\n * Get messages for the current context\n * Returns ModelMessage[] that can be passed directly to streamText/generateText\n */\n async getMessages(): Promise<AIModelMessage[]> {\n let modelMessages = messageQueries.getModelMessages(this.sessionId) as AIModelMessage[];\n\n // Calculate context size\n const contextSize = calculateContextSize(modelMessages);\n\n // Check if we need to summarize\n if (this.autoSummarize && contextSize > this.maxContextChars) {\n modelMessages = await this.summarizeContext(modelMessages);\n }\n\n // Prepend summary if exists\n if (this.summary) {\n modelMessages = [\n {\n role: 'system' as const,\n content: `[Previous conversation summary]\\n${this.summary}`,\n },\n ...modelMessages,\n ];\n }\n\n return modelMessages;\n }\n\n /**\n * Summarize older messages to reduce context size\n */\n private async summarizeContext(messages: AIModelMessage[]): Promise<AIModelMessage[]> {\n if (messages.length <= this.keepRecentMessages) {\n return messages;\n }\n\n // Split into old and recent messages\n const splitIndex = messages.length - this.keepRecentMessages;\n const oldMessages = messages.slice(0, splitIndex);\n const recentMessages = messages.slice(splitIndex);\n\n // Format old messages for summarization\n const historyText = oldMessages\n .map((msg) => {\n const content = typeof msg.content === 'string' \n ? msg.content \n : JSON.stringify(msg.content);\n return `[${msg.role}]: ${content}`;\n })\n .join('\\n\\n');\n\n // Generate summary\n try {\n const config = getConfig();\n const summaryPrompt = createSummaryPrompt(historyText);\n\n const result = await generateText({\n model: gateway(config.defaultModel) as any,\n prompt: summaryPrompt,\n });\n\n this.summary = result.text;\n \n console.log(`[Context] Summarized ${oldMessages.length} messages into ${this.summary.length} chars`);\n\n return recentMessages;\n } catch (error) {\n console.error('[Context] Failed to summarize:', error);\n // Fall back to truncating old messages\n return recentMessages;\n }\n }\n\n /**\n * Add a user message to the context\n */\n addUserMessage(text: string): void {\n const userMessage: ModelMessage = {\n role: 'user',\n content: text,\n };\n messageQueries.create(this.sessionId, userMessage);\n }\n\n /**\n * Add response messages from AI SDK directly\n * This is the preferred method - use result.response.messages from streamText/generateText\n */\n addResponseMessages(messages: AIModelMessage[]): void {\n messageQueries.addMany(this.sessionId, messages as ModelMessage[]);\n }\n\n /**\n * Get current context statistics\n */\n getStats(): { messageCount: number; contextChars: number; hasSummary: boolean } {\n const messages = messageQueries.getModelMessages(this.sessionId) as AIModelMessage[];\n \n return {\n messageCount: messages.length,\n contextChars: calculateContextSize(messages),\n hasSummary: this.summary !== null,\n };\n }\n\n /**\n * Clear all messages in the context\n */\n clear(): void {\n messageQueries.deleteBySession(this.sessionId);\n this.summary = null;\n }\n}\n","import { loadAllSkills, formatSkillsForContext } from '../skills/index.js';\nimport { todoQueries, TodoItem } from '../db/index.js';\n\n/**\n * Build the system prompt for the coding agent\n */\nexport async function buildSystemPrompt(options: {\n workingDirectory: string;\n skillsDirectories: string[];\n sessionId: string;\n customInstructions?: string;\n}): Promise<string> {\n const { workingDirectory, skillsDirectories, sessionId, customInstructions } = options;\n\n // Load available skills\n const skills = await loadAllSkills(skillsDirectories);\n const skillsContext = formatSkillsForContext(skills);\n\n // Load current todos\n const todos = todoQueries.getBySession(sessionId);\n const todosContext = formatTodosForContext(todos);\n\n const systemPrompt = `You are Sparkecoder, an expert AI coding assistant. You help developers write, debug, and improve code.\n\n## Working Directory\nYou are working in: ${workingDirectory}\n\n## Core Capabilities\nYou have access to powerful tools for:\n- **bash**: Execute shell commands, run scripts, install packages, use git\n- **read_file**: Read file contents to understand code and context\n- **write_file**: Create new files or edit existing ones (supports targeted string replacement)\n- **todo**: Manage your task list to track progress on complex operations\n- **load_skill**: Load specialized knowledge documents for specific tasks\n\n## Guidelines\n\n### Code Quality\n- Write clean, maintainable, well-documented code\n- Follow existing code style and conventions in the project\n- Use meaningful variable and function names\n- Add comments for complex logic\n\n### Problem Solving\n- Before making changes, understand the existing code structure\n- Break complex tasks into smaller, manageable steps using the todo tool\n- Test changes when possible using the bash tool\n- Handle errors gracefully and provide helpful error messages\n\n### File Operations\n- Use \\`read_file\\` to understand code before modifying\n- Use \\`write_file\\` with mode \"str_replace\" for targeted edits to existing files\n- Use \\`write_file\\` with mode \"full\" only for new files or complete rewrites\n- Always verify changes by reading files after modifications\n\n### Communication\n- Explain your reasoning and approach\n- Be concise but thorough\n- Ask clarifying questions when requirements are ambiguous\n- Report progress on multi-step tasks\n\n## Skills\n${skillsContext}\n\n## Current Task List\n${todosContext}\n\n${customInstructions ? `## Custom Instructions\\n${customInstructions}` : ''}\n\nRemember: You are a helpful, capable coding assistant. Take initiative, be thorough, and deliver high-quality results.`;\n\n return systemPrompt;\n}\n\n/**\n * Format todos for system prompt context\n */\nfunction formatTodosForContext(todos: TodoItem[]): string {\n if (todos.length === 0) {\n return 'No active tasks. Use the todo tool to create a plan for complex operations.';\n }\n\n const statusEmoji: Record<string, string> = {\n pending: '⬜',\n in_progress: 'šŸ”„',\n completed: 'āœ…',\n cancelled: 'āŒ',\n };\n\n const lines = ['Current tasks:'];\n for (const todo of todos) {\n const emoji = statusEmoji[todo.status] || '•';\n lines.push(`${emoji} [${todo.id}] ${todo.content}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create a summary prompt for context compression\n */\nexport function createSummaryPrompt(conversationHistory: string): string {\n return `Please provide a concise summary of the following conversation history. Focus on:\n1. The main task or goal being worked on\n2. Key decisions made\n3. Important code changes or file operations performed\n4. Current state and any pending actions\n\nKeep the summary under 2000 characters while preserving essential context for continuing the work.\n\nConversation to summarize:\n${conversationHistory}\n\nSummary:`;\n}\n","import { Hono } from 'hono';\nimport { zValidator } from '@hono/zod-validator';\nimport { streamSSE } from 'hono/streaming';\nimport { z } from 'zod';\nimport { sessionQueries, toolExecutionQueries } from '../../db/index.js';\nimport { Agent } from '../../agent/index.js';\nimport { getConfig } from '../../config/index.js';\n\nconst agents = new Hono();\n\n// Schemas\nconst runPromptSchema = z.object({\n prompt: z.string().min(1),\n});\n\nconst quickStartSchema = z.object({\n prompt: z.string().min(1),\n name: z.string().optional(),\n workingDirectory: z.string().optional(),\n model: z.string().optional(),\n toolApprovals: z.record(z.string(), z.boolean()).optional(),\n});\n\nconst rejectSchema = z.object({\n reason: z.string().optional(),\n}).optional();\n\n// Run agent with streaming response\nagents.post(\n '/:id/run',\n zValidator('json', runPromptSchema),\n async (c) => {\n const id = c.req.param('id');\n const { prompt } = c.req.valid('json');\n\n const session = sessionQueries.getById(id);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n // Set headers for SSE - following Vercel AI SDK data stream protocol\n c.header('Content-Type', 'text/event-stream');\n c.header('Cache-Control', 'no-cache');\n c.header('Connection', 'keep-alive');\n c.header('x-vercel-ai-ui-message-stream', 'v1');\n\n return streamSSE(c, async (stream) => {\n try {\n const agent = await Agent.create({ sessionId: id });\n\n // Send message start\n const messageId = `msg_${Date.now()}`;\n await stream.writeSSE({\n data: JSON.stringify({ type: 'start', messageId }),\n });\n\n let textId = `text_${Date.now()}`;\n let textStarted = false;\n\n const result = await agent.stream({\n prompt,\n onToolCall: async (toolCall) => {\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'tool-input-start',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n }),\n });\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'tool-input-available',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n }),\n });\n },\n onToolResult: async (result) => {\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'tool-output-available',\n toolCallId: result.toolCallId,\n output: result.output,\n }),\n });\n },\n onApprovalRequired: async (execution) => {\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'data-approval-required',\n data: {\n id: execution.id,\n toolCallId: execution.toolCallId,\n toolName: execution.toolName,\n input: execution.input,\n },\n }),\n });\n },\n onStepFinish: async () => {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'finish-step' }),\n });\n\n // Reset text state for next step\n if (textStarted) {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-end', id: textId }),\n });\n textStarted = false;\n textId = `text_${Date.now()}`;\n }\n },\n });\n\n // Consume the stream - use fullStream for full visibility\n for await (const part of result.stream.fullStream) {\n if (part.type === 'text-delta') {\n if (!textStarted) {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-start', id: textId }),\n });\n textStarted = true;\n }\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-delta', id: textId, delta: part.text }),\n });\n } else if (part.type === 'tool-call') {\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'tool-input-available',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n }),\n });\n } else if (part.type === 'tool-result') {\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'tool-output-available',\n toolCallId: part.toolCallId,\n output: part.output,\n }),\n });\n } else if (part.type === 'error') {\n console.error('Stream error:', part.error);\n await stream.writeSSE({\n data: JSON.stringify({ type: 'error', errorText: String(part.error) }),\n });\n }\n }\n\n // End text if started\n if (textStarted) {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-end', id: textId }),\n });\n }\n\n // Note: Approvals are already sent via onApprovalRequired callback\n // No need to call waitForApprovals() again to avoid duplicates\n\n // Save response messages to context (uses AI SDK's response.messages)\n await result.saveResponseMessages();\n\n // Send finish message\n await stream.writeSSE({\n data: JSON.stringify({ type: 'finish' }),\n });\n\n // Send done marker\n await stream.writeSSE({ data: '[DONE]' });\n } catch (error: any) {\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'error',\n errorText: error.message,\n }),\n });\n await stream.writeSSE({ data: '[DONE]' });\n }\n });\n }\n);\n\n// Run agent without streaming (for simple integrations)\nagents.post(\n '/:id/generate',\n zValidator('json', runPromptSchema),\n async (c) => {\n const id = c.req.param('id');\n const { prompt } = c.req.valid('json');\n\n const session = sessionQueries.getById(id);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n try {\n const agent = await Agent.create({ sessionId: id });\n const result = await agent.run({ prompt });\n\n return c.json({\n sessionId: id,\n text: result.text,\n stepCount: result.steps.length,\n });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n }\n);\n\n// Approve a tool execution\nagents.post('/:id/approve/:toolCallId', async (c) => {\n const sessionId = c.req.param('id');\n const toolCallId = c.req.param('toolCallId');\n\n const session = sessionQueries.getById(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n try {\n const agent = await Agent.create({ sessionId });\n const result = await agent.approve(toolCallId);\n\n return c.json({\n success: true,\n toolCallId,\n result,\n });\n } catch (error: any) {\n return c.json({ error: error.message }, 400);\n }\n});\n\n// Reject a tool execution\nagents.post(\n '/:id/reject/:toolCallId',\n zValidator('json', rejectSchema),\n async (c) => {\n const sessionId = c.req.param('id');\n const toolCallId = c.req.param('toolCallId');\n const body = c.req.valid('json');\n\n const session = sessionQueries.getById(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n try {\n const agent = await Agent.create({ sessionId });\n agent.reject(toolCallId, body?.reason);\n\n return c.json({\n success: true,\n toolCallId,\n rejected: true,\n });\n } catch (error: any) {\n return c.json({ error: error.message }, 400);\n }\n }\n);\n\n// Get pending approvals for a session\nagents.get('/:id/approvals', async (c) => {\n const sessionId = c.req.param('id');\n\n const session = sessionQueries.getById(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const pendingApprovals = toolExecutionQueries.getPendingApprovals(sessionId);\n\n return c.json({\n sessionId,\n pendingApprovals: pendingApprovals.map((p) => ({\n id: p.id,\n toolCallId: p.toolCallId,\n toolName: p.toolName,\n input: p.input,\n startedAt: p.startedAt.toISOString(),\n })),\n count: pendingApprovals.length,\n });\n});\n\n// Quick start: create session and run in one request\nagents.post(\n '/quick',\n zValidator('json', quickStartSchema),\n async (c) => {\n const body = c.req.valid('json');\n const config = getConfig();\n\n // Create new session\n const agent = await Agent.create({\n name: body.name,\n workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,\n model: body.model || config.defaultModel,\n sessionConfig: body.toolApprovals ? { toolApprovals: body.toolApprovals } : undefined,\n });\n\n const session = agent.getSession();\n\n // Set headers for SSE\n c.header('Content-Type', 'text/event-stream');\n c.header('Cache-Control', 'no-cache');\n c.header('Connection', 'keep-alive');\n c.header('x-vercel-ai-ui-message-stream', 'v1');\n\n return streamSSE(c, async (stream) => {\n try {\n // Send session info\n await stream.writeSSE({\n data: JSON.stringify({\n type: 'data-session',\n data: {\n id: session.id,\n name: session.name,\n workingDirectory: session.workingDirectory,\n model: session.model,\n },\n }),\n });\n\n const messageId = `msg_${Date.now()}`;\n await stream.writeSSE({\n data: JSON.stringify({ type: 'start', messageId }),\n });\n\n let textId = `text_${Date.now()}`;\n let textStarted = false;\n\n const result = await agent.stream({\n prompt: body.prompt,\n onStepFinish: async () => {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'finish-step' }),\n });\n if (textStarted) {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-end', id: textId }),\n });\n textStarted = false;\n textId = `text_${Date.now()}`;\n }\n },\n });\n\n for await (const part of result.stream.fullStream) {\n if (part.type === 'text-delta') {\n if (!textStarted) {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-start', id: textId }),\n });\n textStarted = true;\n }\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-delta', id: textId, delta: part.text }),\n });\n } else if (part.type === 'error') {\n console.error('Stream error:', part.error);\n await stream.writeSSE({\n data: JSON.stringify({ type: 'error', errorText: String(part.error) }),\n });\n }\n }\n\n if (textStarted) {\n await stream.writeSSE({\n data: JSON.stringify({ type: 'text-end', id: textId }),\n });\n }\n\n // Save response messages to context (uses AI SDK's response.messages)\n await result.saveResponseMessages();\n\n await stream.writeSSE({\n data: JSON.stringify({ type: 'finish' }),\n });\n await stream.writeSSE({ data: '[DONE]' });\n } catch (error: any) {\n console.error('Agent error:', error);\n await stream.writeSSE({\n data: JSON.stringify({ type: 'error', errorText: error.message }),\n });\n await stream.writeSSE({ data: '[DONE]' });\n }\n });\n }\n);\n\nexport { agents };\n","import { Hono } from 'hono';\nimport { getConfig } from '../../config/index.js';\n\nconst health = new Hono();\n\nhealth.get('/', async (c) => {\n const config = getConfig();\n\n return c.json({\n status: 'ok',\n version: '0.1.0',\n uptime: process.uptime(),\n config: {\n workingDirectory: config.resolvedWorkingDirectory,\n defaultModel: config.defaultModel,\n port: config.server.port,\n },\n timestamp: new Date().toISOString(),\n });\n});\n\nhealth.get('/ready', async (c) => {\n try {\n // Check if config is loaded\n getConfig();\n\n return c.json({\n status: 'ready',\n timestamp: new Date().toISOString(),\n });\n } catch (error: any) {\n return c.json(\n {\n status: 'not_ready',\n error: error.message,\n timestamp: new Date().toISOString(),\n },\n 503\n );\n }\n});\n\nexport { health };\n","import { Hono } from 'hono';\nimport { zValidator } from '@hono/zod-validator';\nimport { z } from 'zod';\nimport { getTerminalManager } from '../../terminal/index.js';\nimport { sessionQueries, terminalQueries } from '../../db/index.js';\n\nexport const terminals = new Hono();\n\n// Spawn a new terminal\nconst spawnSchema = z.object({\n command: z.string(),\n cwd: z.string().optional(),\n name: z.string().optional(),\n});\n\nterminals.post(\n '/:sessionId/terminals',\n zValidator('json', spawnSchema),\n async (c) => {\n const sessionId = c.req.param('sessionId');\n const body = c.req.valid('json');\n\n // Verify session exists\n const session = sessionQueries.getById(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const manager = getTerminalManager();\n const terminal = manager.spawn({\n sessionId,\n command: body.command,\n cwd: body.cwd || session.workingDirectory,\n name: body.name,\n });\n\n return c.json(terminal, 201);\n }\n);\n\n// List terminals for a session\nterminals.get('/:sessionId/terminals', async (c) => {\n const sessionId = c.req.param('sessionId');\n\n const session = sessionQueries.getById(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const manager = getTerminalManager();\n const terminalList = manager.list(sessionId);\n\n return c.json({\n sessionId,\n terminals: terminalList,\n count: terminalList.length,\n running: terminalList.filter(t => t.status === 'running').length,\n });\n});\n\n// Get terminal status\nterminals.get('/:sessionId/terminals/:terminalId', async (c) => {\n const sessionId = c.req.param('sessionId');\n const terminalId = c.req.param('terminalId');\n\n const manager = getTerminalManager();\n const terminal = manager.getStatus(terminalId);\n\n if (!terminal) {\n return c.json({ error: 'Terminal not found' }, 404);\n }\n\n return c.json(terminal);\n});\n\n// Get terminal logs\nconst logsQuerySchema = z.object({\n tail: z.string().optional().transform(v => v ? parseInt(v, 10) : undefined),\n});\n\nterminals.get(\n '/:sessionId/terminals/:terminalId/logs',\n zValidator('query', logsQuerySchema),\n async (c) => {\n const terminalId = c.req.param('terminalId');\n const query = c.req.valid('query');\n\n const manager = getTerminalManager();\n const result = manager.getLogs(terminalId, query.tail);\n\n if (!result) {\n return c.json({ error: 'Terminal not found' }, 404);\n }\n\n return c.json({\n terminalId,\n logs: result.logs,\n lineCount: result.lineCount,\n });\n }\n);\n\n// Kill a terminal\nconst killSchema = z.object({\n signal: z.enum(['SIGTERM', 'SIGKILL']).optional(),\n});\n\nterminals.post(\n '/:sessionId/terminals/:terminalId/kill',\n zValidator('json', killSchema.optional()),\n async (c) => {\n const terminalId = c.req.param('terminalId');\n const body = await c.req.json().catch(() => ({}));\n\n const manager = getTerminalManager();\n const success = manager.kill(terminalId, body.signal);\n\n if (!success) {\n return c.json({ error: 'Failed to kill terminal' }, 400);\n }\n\n return c.json({ success: true, message: `Sent ${body.signal || 'SIGTERM'} to terminal` });\n }\n);\n\n// Write to terminal stdin\nconst writeSchema = z.object({\n input: z.string(),\n});\n\nterminals.post(\n '/:sessionId/terminals/:terminalId/write',\n zValidator('json', writeSchema),\n async (c) => {\n const terminalId = c.req.param('terminalId');\n const body = c.req.valid('json');\n\n const manager = getTerminalManager();\n const success = manager.write(terminalId, body.input);\n\n if (!success) {\n return c.json({ error: 'Failed to write to terminal' }, 400);\n }\n\n return c.json({ success: true });\n }\n);\n\n// Kill all terminals for a session (cleanup endpoint)\nterminals.post('/:sessionId/terminals/kill-all', async (c) => {\n const sessionId = c.req.param('sessionId');\n\n const manager = getTerminalManager();\n const killed = manager.killAll(sessionId);\n\n return c.json({ success: true, killed });\n});\n\n// Stream terminal logs (SSE)\nterminals.get('/:sessionId/terminals/:terminalId/stream', async (c) => {\n const terminalId = c.req.param('terminalId');\n\n const manager = getTerminalManager();\n const terminal = manager.getStatus(terminalId);\n\n if (!terminal) {\n return c.json({ error: 'Terminal not found' }, 404);\n }\n\n // Set up SSE\n c.header('Content-Type', 'text/event-stream');\n c.header('Cache-Control', 'no-cache');\n c.header('Connection', 'keep-alive');\n\n return new Response(\n new ReadableStream({\n start(controller) {\n const encoder = new TextEncoder();\n\n // Send initial logs\n const initialLogs = manager.getLogs(terminalId);\n if (initialLogs) {\n controller.enqueue(\n encoder.encode(`event: logs\\ndata: ${JSON.stringify({ logs: initialLogs.logs })}\\n\\n`)\n );\n }\n\n // Listen for new output\n const onStdout = ({ terminalId: tid, data }: { terminalId: string; data: string }) => {\n if (tid === terminalId) {\n controller.enqueue(\n encoder.encode(`event: stdout\\ndata: ${JSON.stringify({ data })}\\n\\n`)\n );\n }\n };\n\n const onStderr = ({ terminalId: tid, data }: { terminalId: string; data: string }) => {\n if (tid === terminalId) {\n controller.enqueue(\n encoder.encode(`event: stderr\\ndata: ${JSON.stringify({ data })}\\n\\n`)\n );\n }\n };\n\n const onExit = ({ terminalId: tid, code, signal }: { terminalId: string; code: number; signal?: string }) => {\n if (tid === terminalId) {\n controller.enqueue(\n encoder.encode(`event: exit\\ndata: ${JSON.stringify({ code, signal })}\\n\\n`)\n );\n cleanup();\n controller.close();\n }\n };\n\n const cleanup = () => {\n manager.off('stdout', onStdout);\n manager.off('stderr', onStderr);\n manager.off('exit', onExit);\n };\n\n manager.on('stdout', onStdout);\n manager.on('stderr', onStderr);\n manager.on('exit', onExit);\n\n // If terminal is already stopped, close the stream\n if (terminal.status !== 'running') {\n controller.enqueue(\n encoder.encode(`event: exit\\ndata: ${JSON.stringify({ code: terminal.exitCode, status: terminal.status })}\\n\\n`)\n );\n cleanup();\n controller.close();\n }\n },\n }),\n {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n },\n }\n );\n});\n"],"mappings":"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","names":["Hono","existsSync","z","messages","generateText","tool","gateway","z","nanoid","z","messages","MAX_OUTPUT_CHARS","z","tool","z","resolve","existsSync","MAX_OUTPUT_CHARS","z","tool","resolve","existsSync","tool","z","readFile","resolve","relative","isAbsolute","dirname","existsSync","tool","z","z","tool","tool","z","readFile","resolve","existsSync","existsSync","resolve","readFile","z","tool","tool","z","text","managed","terminals","z","tool","terminals","messages","text","messages","gateway","generateText","tool","z","nanoid","resolve","sessions","z","messages","Hono","zValidator","z","Hono","z","zValidator","result","Hono","Hono","Hono","zValidator","z","terminals","Hono","z","zValidator","Hono","sessions","terminals","existsSync"]}