@openqa/cli 1.3.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent/brain/diff-analyzer.js +140 -0
- package/dist/agent/brain/diff-analyzer.js.map +1 -0
- package/dist/agent/brain/llm-cache.js +47 -0
- package/dist/agent/brain/llm-cache.js.map +1 -0
- package/dist/agent/brain/llm-resilience.js +252 -0
- package/dist/agent/brain/llm-resilience.js.map +1 -0
- package/dist/agent/config/index.js +588 -0
- package/dist/agent/config/index.js.map +1 -0
- package/dist/agent/coverage/index.js +74 -0
- package/dist/agent/coverage/index.js.map +1 -0
- package/dist/agent/export/index.js +158 -0
- package/dist/agent/export/index.js.map +1 -0
- package/dist/agent/index-v2.js +2795 -0
- package/dist/agent/index-v2.js.map +1 -0
- package/dist/agent/index.js +387 -55
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/logger.js +41 -0
- package/dist/agent/logger.js.map +1 -0
- package/dist/agent/metrics.js +39 -0
- package/dist/agent/metrics.js.map +1 -0
- package/dist/agent/notifications/index.js +106 -0
- package/dist/agent/notifications/index.js.map +1 -0
- package/dist/agent/openapi/spec.js +338 -0
- package/dist/agent/openapi/spec.js.map +1 -0
- package/dist/agent/tools/project-runner.js +481 -0
- package/dist/agent/tools/project-runner.js.map +1 -0
- package/dist/cli/config.html.js +454 -0
- package/dist/cli/daemon.js +7572 -0
- package/dist/cli/dashboard.html.js +1619 -0
- package/dist/cli/index.js +3624 -1675
- package/dist/cli/kanban.html.js +577 -0
- package/dist/cli/routes.js +895 -0
- package/dist/cli/routes.js.map +1 -0
- package/dist/cli/server.js +3564 -1646
- package/dist/database/index.js +503 -10
- package/dist/database/index.js.map +1 -1
- package/dist/database/sqlite.js +281 -0
- package/dist/database/sqlite.js.map +1 -0
- package/package.json +18 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../agent/coverage/index.ts","../../cli/routes.ts","../../agent/export/index.ts","../../agent/openapi/spec.ts","../../agent/metrics.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { OpenQADatabase } from '../../database/index.js';\n\nexport interface CoverageEntry {\n url: string;\n method: string;\n tested: boolean;\n lastTestedAt?: string;\n testCount: number;\n}\n\nexport interface CoverageReport {\n total: number;\n tested: number;\n untested: number;\n coveragePercent: number;\n entries: CoverageEntry[];\n}\n\nexport class CoverageTracker {\n private routes = new Map<string, CoverageEntry>();\n\n /**\n * Register a known route (from code analysis or sitemap)\n */\n registerRoute(method: string, url: string): void {\n const key = `${method.toUpperCase()} ${url}`;\n if (!this.routes.has(key)) {\n this.routes.set(key, { url, method: method.toUpperCase(), tested: false, testCount: 0 });\n }\n }\n\n /**\n * Record that a route was exercised during a test session\n */\n recordTest(method: string, url: string): void {\n const key = `${method.toUpperCase()} ${url}`;\n const existing = this.routes.get(key);\n if (existing) {\n existing.tested = true;\n existing.lastTestedAt = new Date().toISOString();\n existing.testCount++;\n } else {\n this.routes.set(key, {\n url,\n method: method.toUpperCase(),\n tested: true,\n lastTestedAt: new Date().toISOString(),\n testCount: 1,\n });\n }\n }\n\n /**\n * Build a coverage report\n */\n getReport(): CoverageReport {\n const entries = Array.from(this.routes.values());\n const tested = entries.filter(e => e.tested).length;\n const total = entries.length;\n\n return {\n total,\n tested,\n untested: total - tested,\n coveragePercent: total === 0 ? 0 : Math.round((tested / total) * 100),\n entries: entries.sort((a, b) => (a.tested === b.tested ? 0 : a.tested ? 1 : -1)),\n };\n }\n\n /**\n * Populate routes from an OpenAPI-style spec or action history\n */\n async loadFromDatabase(db: OpenQADatabase, sessionId: string): Promise<void> {\n const actions = await db.getSessionActions(sessionId);\n for (const action of actions) {\n if (action.type === 'navigate' || action.type === 'api_call' || action.type === 'request') {\n // Extract method + URL from description or input\n const urlMatch = (action.input || action.description).match(/(GET|POST|PUT|DELETE|PATCH|HEAD)\\s+(https?:\\/\\/[^\\s]+|\\/[^\\s]*)/i);\n if (urlMatch) {\n this.recordTest(urlMatch[1], urlMatch[2]);\n } else {\n // Treat navigate descriptions as GET\n const simpleUrl = (action.input || '').match(/https?:\\/\\/[^\\s]+/);\n if (simpleUrl) {\n this.recordTest('GET', simpleUrl[0]);\n }\n }\n }\n }\n }\n\n reset(): void {\n this.routes.clear();\n }\n}\n","import { Router, type Request, type Response, type NextFunction } from 'express';\nimport { z } from 'zod';\nimport { OpenQADatabase, Bug, KanbanTicket } from '../database/index.js';\nimport { ConfigManager } from '../agent/config/index.js';\nimport { ExportService, type ExportFormat } from '../agent/export/index.js';\nimport { getOpenAPISpec } from '../agent/openapi/spec.js';\nimport { metrics } from '../agent/metrics.js';\n\n// ── Body validation ────────────────────────────────────────────────────────────\n\nfunction validate(schema: z.ZodTypeAny) {\n return (req: Request, res: Response, next: NextFunction) => {\n const result = schema.safeParse(req.body);\n if (!result.success) {\n return res.status(400).json({\n error: result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', '),\n });\n }\n req.body = result.data;\n next();\n };\n}\n\nconst kanbanCreateSchema = z.object({\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(2000).optional(),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional(),\n column: z.enum(['backlog', 'todo', 'in_progress', 'done']).optional(),\n});\n\nconst kanbanUpdateSchema = z.object({\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(2000).optional(),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional(),\n column: z.enum(['backlog', 'todo', 'in_progress', 'done']).optional(),\n assignee: z.string().max(100).optional(),\n tags: z.array(z.string().max(50)).max(20).optional(),\n}).loose();\n\nconst configUpdateSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.record(z.string(), z.unknown())])\n);\n\nconst exportFormatSchema = z.enum(['json', 'csv', 'html']);\n\nexport function createApiRouter(db: OpenQADatabase, config: ConfigManager): Router {\n const router = Router();\n\n // Count every HTTP request\n router.use((_req, _res, next) => { metrics.inc('http_requests'); next(); });\n\n // Health check (enriched)\n router.get('/health', async (_req, res) => {\n const snap = metrics.snapshot();\n let dbOk = false;\n try { await db.getStorageStats(); dbOk = true; } catch { /* db unreachable */ }\n res.json({\n status: dbOk ? 'ok' : 'degraded',\n version: '1.3.4',\n uptime: snap.uptimeSeconds,\n memory: snap.memory,\n db: dbOk,\n });\n });\n\n // Metrics\n router.get('/api/metrics', (_req, res) => {\n res.json(metrics.snapshot());\n });\n\n // Status\n router.get('/api/status', (_req, res) => {\n res.json({ isRunning: true });\n });\n\n // Sessions\n router.get('/api/sessions', async (req, res) => {\n const limit = parseInt(req.query.limit as string) || 10;\n const sessions = await db.getRecentSessions(limit);\n res.json(sessions);\n });\n\n router.get('/api/sessions/:id/actions', async (req, res) => {\n const actions = await db.getSessionActions(req.params.id);\n res.json(actions);\n });\n\n // Bugs\n router.get('/api/bugs', async (req, res) => {\n const status = req.query.status as string | undefined;\n const bugs = status ? await db.getBugsByStatus(status as Bug['status']) : await db.getAllBugs();\n res.json(bugs);\n });\n\n // Kanban\n router.get('/api/kanban/tickets', async (req, res) => {\n const column = req.query.column as string | undefined;\n const tickets = column ? await db.getKanbanTicketsByColumn(column as KanbanTicket['column']) : await db.getKanbanTickets();\n res.json(tickets);\n });\n\n router.get('/api/kanban', async (_req, res) => {\n const tickets = await db.getKanbanTickets();\n res.json(tickets);\n });\n\n router.post('/api/kanban', validate(kanbanCreateSchema), async (req, res) => {\n try {\n const { title, description, priority, column } = req.body;\n const ticket = await db.createKanbanTicket({\n title: title || 'New Ticket',\n description: description || '',\n priority: priority || 'medium',\n column: column || 'backlog'\n });\n res.json(ticket);\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.put('/api/kanban/:id', validate(kanbanUpdateSchema), async (req, res) => {\n try {\n const { id } = req.params;\n const updates = req.body;\n await db.updateKanbanTicket(id, updates);\n res.json({ success: true });\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.delete('/api/kanban/:id', async (req, res) => {\n try {\n const { id } = req.params;\n await db.deleteKanbanTicket(id);\n res.json({ success: true });\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.patch('/api/kanban/tickets/:id', validate(kanbanUpdateSchema), async (req, res) => {\n const { id } = req.params;\n const updates = req.body;\n await db.updateKanbanTicket(id, updates);\n res.json({ success: true });\n });\n\n // Config\n router.get('/api/config', async (_req, res) => {\n const cfg = await config.getConfig();\n // Ensure proper JSON serialization\n res.json(JSON.parse(JSON.stringify(cfg)));\n });\n\n router.post('/api/config', validate(configUpdateSchema), async (req, res) => {\n try {\n const configData = req.body;\n // Handle nested config objects properly\n for (const [section, values] of Object.entries(configData)) {\n if (typeof values === 'object' && values !== null) {\n for (const [key, value] of Object.entries(values as Record<string, unknown>)) {\n await config.set(`${section}.${key}`, String(value));\n }\n } else {\n await config.set(section, String(values));\n }\n }\n res.json({ success: true });\n } catch (error: unknown) {\n res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.post('/api/config/reset', async (_req, res) => {\n try {\n await db.clearAllConfig();\n res.json({ success: true });\n } catch (error: unknown) {\n res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n // Test connection — verify a URL is reachable\n router.post('/api/test-connection', async (req, res) => {\n const urlStr = (req.body as { url?: string }).url;\n if (!urlStr) {\n return res.status(400).json({ success: false, error: 'url is required' });\n }\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n const response = await fetch(urlStr, {\n method: 'HEAD',\n signal: controller.signal,\n redirect: 'follow',\n });\n clearTimeout(timeoutId);\n res.json({ success: true, status: response.status, ok: response.ok });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n res.status(200).json({ success: false, error: message });\n }\n });\n\n // OpenAPI\n router.get('/api/openapi.json', (_req, res) => {\n res.json(getOpenAPISpec());\n });\n\n router.get('/api/docs', (_req, res) => {\n const spec = JSON.stringify(getOpenAPISpec());\n res.setHeader('Content-Type', 'text/html');\n res.send(`<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>OpenQA API Docs</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\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({ spec: ${spec}, dom_id: '#swagger-ui', presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset], layout: 'BaseLayout' });\n </script>\n</body>\n</html>`);\n });\n\n // Coverage\n router.get('/api/coverage/:sessionId', async (req, res) => {\n try {\n const { CoverageTracker } = await import('../agent/coverage/index.js');\n const tracker = new CoverageTracker();\n await tracker.loadFromDatabase(db, req.params.sessionId);\n res.json(tracker.getReport());\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n // Cleanup & storage stats\n router.post('/api/cleanup', async (req, res) => {\n try {\n const maxAgeDays = parseInt(req.query.maxAgeDays as string) || 30;\n const result = await db.pruneOldSessions(maxAgeDays);\n res.json({ success: true, ...result });\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.get('/api/storage', async (_req, res) => {\n try {\n const stats = await db.getStorageStats();\n res.json(stats);\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n // Export\n router.get('/api/export/:sessionId', async (req, res) => {\n try {\n const { sessionId } = req.params;\n const fmtResult = exportFormatSchema.safeParse(req.query.format || 'json');\n if (!fmtResult.success) {\n return res.status(400).json({ error: 'Invalid format. Use json, csv, or html.' });\n }\n const format = fmtResult.data as ExportFormat;\n\n const exportService = new ExportService(db);\n const result = await exportService.exportSession(sessionId, format);\n\n res.setHeader('Content-Type', result.contentType);\n res.setHeader('Content-Disposition', `attachment; filename=\"${result.filename}\"`);\n res.send(result.content);\n } catch (error: unknown) {\n res.status(404).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n // Tasks & Issues (mock data)\n router.get('/api/tasks', async (_req, res) => {\n try {\n const tasks = await db.getCurrentTasks();\n res.json(tasks);\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.get('/api/issues', async (_req, res) => {\n try {\n const issues = await db.getCurrentIssues();\n res.json(issues);\n } catch (error: unknown) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n return router;\n}\n","import { OpenQADatabase, TestSession, Action, Bug } from '../../database/index.js';\n\nexport type ExportFormat = 'json' | 'csv' | 'html';\n\ninterface SessionExport {\n session: TestSession;\n actions: Action[];\n bugs: Bug[];\n}\n\nexport class ExportService {\n constructor(private db: OpenQADatabase) {}\n\n async exportSession(sessionId: string, format: ExportFormat): Promise<{ content: string; contentType: string; filename: string }> {\n const session = await this.db.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const actions = await this.db.getSessionActions(sessionId);\n const allBugs = await this.db.getAllBugs();\n const bugs = allBugs.filter(b => b.session_id === sessionId);\n\n const data: SessionExport = { session, actions, bugs };\n\n switch (format) {\n case 'json':\n return {\n content: JSON.stringify(data, null, 2),\n contentType: 'application/json',\n filename: `openqa-session-${sessionId}.json`,\n };\n case 'csv':\n return {\n content: this.toCSV(data),\n contentType: 'text/csv',\n filename: `openqa-session-${sessionId}.csv`,\n };\n case 'html':\n return {\n content: this.toHTML(data),\n contentType: 'text/html',\n filename: `openqa-session-${sessionId}.html`,\n };\n }\n }\n\n private toCSV(data: SessionExport): string {\n const lines: string[] = [];\n\n // Session summary\n lines.push('# Session Summary');\n lines.push('id,started_at,ended_at,status,total_actions,bugs_found');\n lines.push([\n data.session.id,\n data.session.started_at,\n data.session.ended_at || '',\n data.session.status,\n data.session.total_actions,\n data.session.bugs_found,\n ].join(','));\n\n // Actions\n lines.push('');\n lines.push('# Actions');\n lines.push('id,timestamp,type,description');\n for (const a of data.actions) {\n lines.push([\n a.id,\n a.timestamp,\n this.csvEscape(a.type),\n this.csvEscape(a.description),\n ].join(','));\n }\n\n // Bugs\n lines.push('');\n lines.push('# Bugs');\n lines.push('id,title,severity,status,created_at');\n for (const b of data.bugs) {\n lines.push([\n b.id,\n this.csvEscape(b.title),\n b.severity,\n b.status,\n b.created_at,\n ].join(','));\n }\n\n return lines.join('\\n');\n }\n\n private csvEscape(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n\n private toHTML(data: SessionExport): string {\n const severityColor: Record<string, string> = {\n critical: '#dc2626', high: '#ea580c', medium: '#ca8a04', low: '#16a34a',\n };\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>OpenQA Report — Session ${data.session.id}</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; max-width: 960px; margin: 0 auto; padding: 2rem; color: #1a1a2e; }\n h1 { font-size: 1.5rem; margin-bottom: 0.5rem; }\n h2 { font-size: 1.2rem; margin: 2rem 0 0.5rem; border-bottom: 2px solid #e2e8f0; padding-bottom: 0.25rem; }\n .meta { color: #64748b; font-size: 0.9rem; margin-bottom: 1.5rem; }\n .stats { display: flex; gap: 1.5rem; margin-bottom: 1.5rem; }\n .stat { background: #f8fafc; border-radius: 8px; padding: 1rem; flex: 1; text-align: center; }\n .stat-value { font-size: 1.5rem; font-weight: 700; }\n .stat-label { color: #64748b; font-size: 0.8rem; }\n table { width: 100%; border-collapse: collapse; margin-top: 0.5rem; }\n th, td { text-align: left; padding: 0.5rem; border-bottom: 1px solid #e2e8f0; font-size: 0.85rem; }\n th { background: #f8fafc; font-weight: 600; }\n .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; color: white; }\n .footer { margin-top: 3rem; color: #94a3b8; font-size: 0.8rem; text-align: center; }\n </style>\n</head>\n<body>\n <h1>OpenQA Session Report</h1>\n <p class=\"meta\">${data.session.id} — ${data.session.started_at}${data.session.ended_at ? ` to ${data.session.ended_at}` : ' (in progress)'}</p>\n\n <div class=\"stats\">\n <div class=\"stat\"><div class=\"stat-value\">${data.session.total_actions}</div><div class=\"stat-label\">Actions</div></div>\n <div class=\"stat\"><div class=\"stat-value\">${data.bugs.length}</div><div class=\"stat-label\">Bugs Found</div></div>\n <div class=\"stat\"><div class=\"stat-value\">${data.session.status}</div><div class=\"stat-label\">Status</div></div>\n <div class=\"stat\"><div class=\"stat-value\">${data.session.total_actions > 0 ? Math.round(((data.session.total_actions - data.session.bugs_found) / data.session.total_actions) * 100) : 0}%</div><div class=\"stat-label\">Success Rate</div></div>\n </div>\n\n ${data.bugs.length > 0 ? `\n <h2>Bugs (${data.bugs.length})</h2>\n <table>\n <thead><tr><th>Title</th><th>Severity</th><th>Status</th><th>Date</th></tr></thead>\n <tbody>\n ${data.bugs.map(b => `<tr>\n <td>${this.htmlEscape(b.title)}</td>\n <td><span class=\"badge\" style=\"background:${severityColor[b.severity] || '#64748b'}\">${b.severity}</span></td>\n <td>${b.status}</td>\n <td>${b.created_at}</td>\n </tr>`).join('\\n ')}\n </tbody>\n </table>` : ''}\n\n ${data.actions.length > 0 ? `\n <h2>Actions (${data.actions.length})</h2>\n <table>\n <thead><tr><th>Type</th><th>Description</th><th>Timestamp</th></tr></thead>\n <tbody>\n ${data.actions.slice(0, 100).map(a => `<tr>\n <td>${this.htmlEscape(a.type)}</td>\n <td>${this.htmlEscape(a.description)}</td>\n <td>${a.timestamp}</td>\n </tr>`).join('\\n ')}\n </tbody>\n </table>\n ${data.actions.length > 100 ? `<p class=\"meta\">… and ${data.actions.length - 100} more actions</p>` : ''}` : ''}\n\n <p class=\"footer\">Generated by OpenQA on ${new Date().toISOString()}</p>\n</body>\n</html>`;\n }\n\n private htmlEscape(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n }\n}\n","export function getOpenAPISpec() {\n return {\n openapi: '3.0.3',\n info: {\n title: 'OpenQA API',\n description: 'Autonomous QA testing agent — REST API',\n version: '1.3.4',\n contact: { url: 'https://openqa.orkajs.com' },\n license: { name: 'MIT' },\n },\n servers: [{ url: '/api', description: 'OpenQA server' }],\n tags: [\n { name: 'health', description: 'Health & status' },\n { name: 'sessions', description: 'Test sessions' },\n { name: 'bugs', description: 'Bug reports' },\n { name: 'kanban', description: 'Kanban board' },\n { name: 'config', description: 'Configuration' },\n { name: 'agent', description: 'Agent control' },\n { name: 'project', description: 'Project runner' },\n { name: 'export', description: 'Result export' },\n { name: 'coverage', description: 'Test coverage' },\n { name: 'storage', description: 'Storage management' },\n ],\n paths: {\n '/health': {\n get: {\n tags: ['health'],\n summary: 'Health check',\n responses: {\n '200': {\n description: 'Service is healthy',\n content: { 'application/json': { schema: { $ref: '#/components/schemas/Health' } } },\n },\n },\n },\n },\n '/status': {\n get: {\n tags: ['health'],\n summary: 'Agent status',\n responses: {\n '200': {\n description: 'Agent running state',\n content: { 'application/json': { schema: { $ref: '#/components/schemas/Status' } } },\n },\n },\n },\n },\n '/sessions': {\n get: {\n tags: ['sessions'],\n summary: 'List recent sessions',\n parameters: [{ name: 'limit', in: 'query', schema: { type: 'integer', default: 10 } }],\n responses: {\n '200': {\n description: 'Array of sessions',\n content: { 'application/json': { schema: { type: 'array', items: { $ref: '#/components/schemas/Session' } } } },\n },\n },\n },\n },\n '/sessions/{id}/actions': {\n get: {\n tags: ['sessions'],\n summary: 'Get actions for a session',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': {\n description: 'Array of actions',\n content: { 'application/json': { schema: { type: 'array', items: { $ref: '#/components/schemas/Action' } } } },\n },\n },\n },\n },\n '/bugs': {\n get: {\n tags: ['bugs'],\n summary: 'List bugs',\n parameters: [{ name: 'status', in: 'query', schema: { type: 'string', enum: ['open', 'in-progress', 'resolved', 'closed'] } }],\n responses: {\n '200': {\n description: 'Array of bugs',\n content: { 'application/json': { schema: { type: 'array', items: { $ref: '#/components/schemas/Bug' } } } },\n },\n },\n },\n },\n '/kanban': {\n get: {\n tags: ['kanban'],\n summary: 'List all kanban tickets',\n responses: {\n '200': {\n description: 'Array of tickets',\n content: { 'application/json': { schema: { type: 'array', items: { $ref: '#/components/schemas/KanbanTicket' } } } },\n },\n },\n },\n post: {\n tags: ['kanban'],\n summary: 'Create a kanban ticket',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { $ref: '#/components/schemas/KanbanTicketInput' } } },\n },\n responses: {\n '200': { description: 'Created ticket', content: { 'application/json': { schema: { $ref: '#/components/schemas/KanbanTicket' } } } },\n },\n },\n },\n '/kanban/{id}': {\n put: {\n tags: ['kanban'],\n summary: 'Update a kanban ticket',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n requestBody: { required: true, content: { 'application/json': { schema: { $ref: '#/components/schemas/KanbanTicketInput' } } } },\n responses: { '200': { description: 'Success', content: { 'application/json': { schema: { $ref: '#/components/schemas/SuccessResponse' } } } } },\n },\n delete: {\n tags: ['kanban'],\n summary: 'Delete a kanban ticket',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: { '200': { description: 'Success', content: { 'application/json': { schema: { $ref: '#/components/schemas/SuccessResponse' } } } } },\n },\n },\n '/config': {\n get: {\n tags: ['config'],\n summary: 'Get current configuration',\n responses: { '200': { description: 'Configuration object' } },\n },\n post: {\n tags: ['config'],\n summary: 'Update configuration',\n requestBody: { required: true, content: { 'application/json': { schema: { type: 'object' } } } },\n responses: { '200': { description: 'Success', content: { 'application/json': { schema: { $ref: '#/components/schemas/SuccessResponse' } } } } },\n },\n },\n '/agent/start': {\n post: {\n tags: ['agent'],\n summary: 'Start autonomous agent session',\n responses: { '200': { description: 'Started', content: { 'application/json': { schema: { $ref: '#/components/schemas/SuccessResponse' } } } } },\n },\n },\n '/agent/stop': {\n post: {\n tags: ['agent'],\n summary: 'Stop the running agent',\n responses: { '200': { description: 'Stopped', content: { 'application/json': { schema: { $ref: '#/components/schemas/SuccessResponse' } } } } },\n },\n },\n '/project/setup': {\n post: {\n tags: ['project'],\n summary: 'Setup project — detect, install deps, optionally start dev server',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['repoPath'],\n properties: {\n repoPath: { type: 'string', description: 'Absolute path to the project' },\n startServer: { type: 'boolean', description: 'Start dev server after install' },\n },\n },\n },\n },\n },\n responses: { '200': { description: 'Project status', content: { 'application/json': { schema: { $ref: '#/components/schemas/ProjectStatus' } } } } },\n },\n },\n '/project/status': {\n get: {\n tags: ['project'],\n summary: 'Get project runner status',\n responses: { '200': { description: 'Status', content: { 'application/json': { schema: { $ref: '#/components/schemas/ProjectStatus' } } } } },\n },\n },\n '/project/test': {\n post: {\n tags: ['project'],\n summary: 'Run existing project tests',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', required: ['repoPath'], properties: { repoPath: { type: 'string' } } } } },\n },\n responses: { '200': { description: 'Test results', content: { 'application/json': { schema: { $ref: '#/components/schemas/TestRunResult' } } } } },\n },\n },\n '/export/{sessionId}': {\n get: {\n tags: ['export'],\n summary: 'Export session results',\n parameters: [\n { name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } },\n { name: 'format', in: 'query', schema: { type: 'string', enum: ['json', 'csv', 'html'], default: 'json' } },\n ],\n responses: {\n '200': { description: 'File download (json / csv / html)' },\n '404': { description: 'Session not found' },\n },\n },\n },\n '/coverage/{sessionId}': {\n get: {\n tags: ['coverage'],\n summary: 'Get coverage report for a session',\n parameters: [{ name: 'sessionId', in: 'path', required: true, schema: { type: 'string' } }],\n responses: { '200': { description: 'Coverage report', content: { 'application/json': { schema: { $ref: '#/components/schemas/CoverageReport' } } } } },\n },\n },\n '/storage': {\n get: {\n tags: ['storage'],\n summary: 'Get storage statistics',\n responses: { '200': { description: 'Storage stats' } },\n },\n },\n '/cleanup': {\n post: {\n tags: ['storage'],\n summary: 'Prune old sessions',\n parameters: [{ name: 'maxAgeDays', in: 'query', schema: { type: 'integer', default: 30 } }],\n responses: { '200': { description: 'Cleanup result' } },\n },\n },\n },\n components: {\n schemas: {\n Health: {\n type: 'object',\n properties: { status: { type: 'string' }, uptime: { type: 'number' }, version: { type: 'string' } },\n },\n Status: {\n type: 'object',\n properties: { isRunning: { type: 'boolean' }, sessionId: { type: 'string' } },\n },\n Session: {\n type: 'object',\n properties: {\n id: { type: 'string' }, started_at: { type: 'string', format: 'date-time' },\n ended_at: { type: 'string', format: 'date-time', nullable: true },\n status: { type: 'string', enum: ['running', 'completed', 'failed'] },\n total_actions: { type: 'integer' }, bugs_found: { type: 'integer' },\n },\n },\n Action: {\n type: 'object',\n properties: {\n id: { type: 'string' }, session_id: { type: 'string' },\n timestamp: { type: 'string', format: 'date-time' },\n type: { type: 'string' }, description: { type: 'string' },\n },\n },\n Bug: {\n type: 'object',\n properties: {\n id: { type: 'string' }, session_id: { type: 'string' },\n title: { type: 'string' }, description: { type: 'string' },\n severity: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },\n status: { type: 'string', enum: ['open', 'in-progress', 'resolved', 'closed'] },\n github_issue_url: { type: 'string', nullable: true },\n created_at: { type: 'string', format: 'date-time' },\n },\n },\n KanbanTicket: {\n type: 'object',\n properties: {\n id: { type: 'string' }, title: { type: 'string' }, description: { type: 'string' },\n priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },\n column: { type: 'string', enum: ['backlog', 'to-do', 'in-progress', 'done'] },\n created_at: { type: 'string', format: 'date-time' },\n },\n },\n KanbanTicketInput: {\n type: 'object',\n properties: {\n title: { type: 'string' }, description: { type: 'string' },\n priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },\n column: { type: 'string', enum: ['backlog', 'to-do', 'in-progress', 'done'] },\n },\n },\n ProjectStatus: {\n type: 'object',\n properties: {\n repoPath: { type: 'string' }, installed: { type: 'boolean' },\n serverRunning: { type: 'boolean' }, serverUrl: { type: 'string', nullable: true },\n serverPid: { type: 'integer', nullable: true },\n },\n },\n TestRunResult: {\n type: 'object',\n properties: {\n runner: { type: 'string' }, passed: { type: 'integer' }, failed: { type: 'integer' },\n skipped: { type: 'integer' }, total: { type: 'integer' }, durationMs: { type: 'integer' },\n },\n },\n CoverageReport: {\n type: 'object',\n properties: {\n total: { type: 'integer' }, tested: { type: 'integer' }, untested: { type: 'integer' },\n coveragePercent: { type: 'integer' },\n entries: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, method: { type: 'string' }, tested: { type: 'boolean' }, testCount: { type: 'integer' } } } },\n },\n },\n SuccessResponse: {\n type: 'object',\n properties: { success: { type: 'boolean' } },\n },\n },\n },\n };\n}\n","const startedAt = Date.now();\n\nconst counters: Record<string, number> = {\n llm_calls: 0,\n llm_cache_hits: 0,\n llm_retries: 0,\n llm_fallbacks: 0,\n llm_circuit_opens: 0,\n tests_generated: 0,\n tests_run: 0,\n tests_passed: 0,\n tests_failed: 0,\n bugs_found: 0,\n sessions_started: 0,\n ws_connections: 0,\n http_requests: 0,\n};\n\nexport const metrics = {\n inc(key: keyof typeof counters, by = 1) {\n if (key in counters) counters[key] += by;\n },\n\n snapshot() {\n const memMB = process.memoryUsage();\n return {\n uptimeSeconds: Math.floor((Date.now() - startedAt) / 1000),\n memory: {\n heapUsedMB: Math.round(memMB.heapUsed / 1024 / 1024),\n heapTotalMB: Math.round(memMB.heapTotal / 1024 / 1024),\n rssMB: Math.round(memMB.rss / 1024 / 1024),\n },\n counters: { ...counters },\n cacheHitRate: counters.llm_calls > 0\n ? Math.round((counters.llm_cache_hits / (counters.llm_calls + counters.llm_cache_hits)) * 100)\n : 0,\n };\n },\n};\n"],"mappings":"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","names":["CoverageTracker"]}
|