devmentorai-server 1.3.0 → 1.4.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/routes/health.ts","../src/routes/sessions.ts","../src/services/thumbnail-service.ts","../src/routes/chat.ts","../src/services/context-prompt-builder.ts","../src/routes/models.ts","../src/routes/account.ts","../src/routes/images.ts","../src/routes/updates.ts","../src/routes/tools.ts","../src/services/copilot.service.ts","../src/tools/devops-tools.ts","../src/services/session.service.ts","../src/db/index.ts"],"sourcesContent":["import Fastify from 'fastify';\nimport cors from '@fastify/cors';\nimport { healthRoutes } from './routes/health.js';\nimport { sessionRoutes } from './routes/sessions.js';\nimport { chatRoutes } from './routes/chat.js';\nimport { modelsRoutes } from './routes/models.js';\nimport { accountRoutes } from './routes/account.js';\nimport { imagesRoutes } from './routes/images.js';\nimport { updatesRoutes } from './routes/updates.js';\nimport { registerToolsRoutes } from './routes/tools.js';\nimport { CopilotService } from './services/copilot.service.js';\nimport { SessionService } from './services/session.service.js';\nimport { initDatabase } from './db/index.js';\nimport { DEFAULT_CONFIG } from '@devmentorai/shared';\n\nconst PORT = Number.parseInt(process.env.DEVMENTORAI_PORT || '', 10) || DEFAULT_CONFIG.DEFAULT_PORT;\nconst HOST = '0.0.0.0';\n\n// Observability mode - enable with DEVMENTORAI_DEBUG=true\nconst DEBUG_MODE = true;\n\n/**\n * Truncate long strings for logging\n */\nfunction truncate(str: string | undefined | null, maxLen = 500): string {\n if (!str) return '';\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen) + `... [truncated ${str.length - maxLen} chars]`;\n}\n\nexport async function createServer() {\n const fastify = Fastify({\n // Allow large payloads for image uploads (data URLs can be 10-30MB for full-page screenshots)\n bodyLimit: 50 * 1024 * 1024, // 50MB\n logger: {\n level: DEBUG_MODE ? 'debug' : 'info',\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'HH:MM:ss Z',\n ignore: 'pid,hostname',\n },\n },\n },\n });\n\n // Observability middleware - log all requests and responses\n if (DEBUG_MODE) {\n fastify.log.info('🔍 Debug mode enabled - logging all requests and responses');\n \n // Log after body is parsed\n fastify.addHook('preHandler', async (request) => {\n const body = request.body ? truncate(JSON.stringify(request.body)) : null;\n fastify.log.debug({\n type: '→ REQUEST',\n method: request.method,\n url: request.url,\n headers: {\n 'content-type': request.headers['content-type'],\n 'user-agent': request.headers['user-agent'],\n },\n body: body,\n });\n });\n\n fastify.addHook('onSend', async (request, reply, payload) => {\n const statusCode = reply.statusCode;\n let responseBody: string | null = null;\n \n // Skip logging SSE streams (too verbose)\n if (reply.getHeader('content-type') === 'text/event-stream') {\n responseBody = '[SSE Stream]';\n } else if (typeof payload === 'string') {\n responseBody = truncate(payload);\n } else if (Buffer.isBuffer(payload)) {\n responseBody = truncate(payload.toString());\n }\n \n fastify.log.debug({\n type: '← RESPONSE',\n method: request.method,\n url: request.url,\n statusCode,\n body: responseBody,\n });\n \n return payload;\n });\n\n fastify.addHook('onError', async (request, reply, error) => {\n fastify.log.error({\n type: '✗ ERROR',\n method: request.method,\n url: request.url,\n error: error.message,\n stack: error.stack,\n });\n });\n }\n\n // Initialize database\n const db = initDatabase();\n fastify.log.info('Database initialized');\n\n // Initialize services\n const sessionService = new SessionService(db);\n const copilotService = new CopilotService(sessionService);\n \n try {\n await copilotService.initialize();\n fastify.log.info('CopilotService initialized');\n } catch (err) {\n fastify.log.error({ err }, 'Failed to initialize CopilotService');\n fastify.log.warn('Running in mock mode - Copilot features will be simulated');\n }\n\n // Decorate fastify with services\n fastify.decorate('sessionService', sessionService);\n fastify.decorate('copilotService', copilotService);\n\n // Register plugins\n await fastify.register(cors, {\n origin: true, // Allow all origins in development\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization'],\n });\n\n // Register routes\n await fastify.register(healthRoutes, { prefix: '/api' });\n await fastify.register(sessionRoutes, { prefix: '/api' });\n await fastify.register(chatRoutes, { prefix: '/api' });\n await fastify.register(modelsRoutes, { prefix: '/api' });\n await fastify.register(accountRoutes, { prefix: '/api' });\n await fastify.register(updatesRoutes, { prefix: '/api' });\n await fastify.register(imagesRoutes, { prefix: '/api/images' });\n \n // Register tools routes (not prefixed - has /api in route definitions)\n registerToolsRoutes(fastify, copilotService);\n\n return fastify;\n}\n\nasync function main() {\n const fastify = await createServer();\n let shuttingDown = false;\n\n // Graceful shutdown\n const shutdown = async (\n reason: 'SIGINT' | 'SIGTERM' | 'UNCAUGHT_EXCEPTION',\n error?: unknown,\n ) => {\n if (shuttingDown) return;\n shuttingDown = true;\n\n fastify.log.warn({ reason }, 'Shutting down...');\n if (error) {\n fastify.log.error({ err: error }, 'Fatal process error');\n }\n\n let exitCode = 0;\n try {\n await fastify.copilotService.shutdown();\n await fastify.close();\n } catch (err) {\n exitCode = 1;\n fastify.log.error({ err }, 'Error during shutdown');\n } finally {\n process.exit(exitCode);\n }\n };\n\n process.on('SIGINT', () => {\n void shutdown('SIGINT');\n });\n process.on('SIGTERM', () => {\n void shutdown('SIGTERM');\n });\n\n // Keep process alive on unhandled promise rejections and log root cause.\n process.on('unhandledRejection', (reason) => {\n fastify.log.error({ err: reason }, 'Unhandled promise rejection');\n });\n\n // For uncaught exceptions, perform a controlled shutdown.\n process.on('uncaughtException', (error) => {\n void shutdown('UNCAUGHT_EXCEPTION', error);\n });\n\n // Start server\n try {\n await fastify.listen({ port: PORT, host: HOST });\n fastify.log.info(`🚀 DevMentorAI backend running at http://${HOST}:${PORT}`);\n } catch (error) {\n fastify.log.error(error);\n process.exit(1);\n }\n}\n\ntry {\n await main();\n} catch (error) {\n // Fallback logger for bootstrap failures before Fastify is fully available\n console.error('[DevMentorAI] Fatal startup error:', error);\n process.exit(1);\n}\n\n// Type augmentation for Fastify\ndeclare module 'fastify' {\n interface FastifyInstance {\n sessionService: SessionService;\n copilotService: CopilotService;\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { ApiResponse, HealthResponse } from '@devmentorai/shared';\nimport { checkForUpdate } from '@devmentorai/shared';\nimport { BACKEND_VERSION } from '../version.js';\n\nconst startTime = Date.now();\n\n// Cache update info in background\nlet cachedUpdateInfo: { latestVersion: string; updateAvailable: boolean } | null = null;\n\nasync function refreshUpdateInfo() {\n try {\n const info = await checkForUpdate('backend', BACKEND_VERSION);\n cachedUpdateInfo = { latestVersion: info.latestVersion, updateAvailable: info.hasUpdate };\n } catch {\n // Ignore — keep last cached value\n }\n}\n\n// Check on startup and every hour\nrefreshUpdateInfo();\nsetInterval(refreshUpdateInfo, 60 * 60 * 1000);\n\nexport async function healthRoutes(fastify: FastifyInstance) {\n fastify.get<{\n Reply: ApiResponse<HealthResponse>;\n }>('/health', async (_request, reply) => {\n const copilotService = fastify.copilotService;\n \n const healthData: HealthResponse = {\n status: copilotService.isReady() ? 'healthy' : 'degraded',\n version: BACKEND_VERSION,\n copilotConnected: copilotService.isReady() && !copilotService.isMockMode(),\n uptime: Math.floor((Date.now() - startTime) / 1000),\n timestamp: new Date().toISOString(),\n ...(cachedUpdateInfo || {}),\n };\n\n return reply.send({\n success: true,\n data: healthData,\n });\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport { z } from 'zod';\nimport type {\n ApiResponse,\n PaginatedResponse,\n Session,\n CreateSessionRequest,\n UpdateSessionRequest,\n Message,\n} from '@devmentorai/shared';\nimport { deleteSessionImages } from '../services/thumbnail-service.js';\n\nconst createSessionSchema = z.object({\n name: z.string().min(1).max(100),\n type: z.enum(['devops', 'writing', 'development', 'general']),\n model: z.string().optional(),\n systemPrompt: z.string().optional(),\n});\n\nconst updateSessionSchema = z.object({\n name: z.string().min(1).max(100).optional(),\n status: z.enum(['active', 'paused', 'closed']).optional(),\n model: z.string().min(1).optional(),\n});\n\nexport async function sessionRoutes(fastify: FastifyInstance) {\n // List sessions\n fastify.get<{\n Querystring: { page?: string; pageSize?: string };\n Reply: ApiResponse<PaginatedResponse<Session>>;\n }>('/sessions', async (request, reply) => {\n const page = Number.parseInt(request.query.page || '1', 10);\n const pageSize = Number.parseInt(request.query.pageSize || '50', 10);\n\n const sessions = fastify.sessionService.listSessions(page, pageSize);\n\n return reply.send({\n success: true,\n data: sessions,\n });\n });\n\n // Create session\n fastify.post<{\n Body: CreateSessionRequest;\n Reply: ApiResponse<Session>;\n }>('/sessions', async (request, reply) => {\n try {\n const body = createSessionSchema.parse(request.body);\n console.log('[sessionRoutes] Creating session with body:', body);\n \n // Create in database\n const session = fastify.sessionService.createSession(body);\n \n // Create Copilot session\n await fastify.copilotService.createCopilotSession(\n session.id,\n session.type,\n session.model,\n session.systemPrompt\n );\n\n return reply.code(201).send({\n success: true,\n data: session,\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: { errors: error.errors },\n },\n });\n }\n throw error;\n }\n });\n\n // Get session\n fastify.get<{\n Params: { id: string };\n Reply: ApiResponse<Session>;\n }>('/sessions/:id', async (request, reply) => {\n const session = fastify.sessionService.getSession(request.params.id);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n return reply.send({\n success: true,\n data: session,\n });\n });\n\n // Update session\n fastify.patch<{\n Params: { id: string };\n Body: UpdateSessionRequest;\n Reply: ApiResponse<Session>;\n }>('/sessions/:id', async (request, reply) => {\n try {\n const body = updateSessionSchema.parse(request.body);\n const currentSession = fastify.sessionService.getSession(request.params.id);\n\n if (!currentSession) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n if (body.model && body.model !== currentSession.model) {\n await fastify.copilotService.switchSessionModel(\n currentSession.id,\n currentSession.type,\n body.model,\n currentSession.systemPrompt\n );\n }\n\n const session = fastify.sessionService.updateSession(request.params.id, body);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n return reply.send({\n success: true,\n data: session,\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: { errors: error.errors },\n },\n });\n }\n throw error;\n }\n });\n\n // Delete session\n fastify.delete<{\n Params: { id: string };\n Reply: ApiResponse<{ deleted: boolean; sessionId: string }>;\n }>('/sessions/:id', async (request, reply) => {\n const sessionId = request.params.id;\n \n console.log(`[SessionRoute] Deleting session: ${sessionId}`);\n\n // First check if session exists\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Destroy Copilot session first (handles cleanup of SDK resources)\n try {\n await fastify.copilotService.destroySession(sessionId);\n } catch (error) {\n console.error(`[SessionRoute] Error destroying Copilot session:`, error);\n // Continue with DB deletion even if Copilot cleanup fails\n }\n\n // Clean up images for this session\n try {\n deleteSessionImages(sessionId);\n } catch (error) {\n console.error(`[SessionRoute] Error deleting session images:`, error);\n // Continue with DB deletion even if image cleanup fails\n }\n\n // Delete from database (CASCADE will delete messages)\n const deleted = fastify.sessionService.deleteSession(sessionId);\n \n console.log(`[SessionRoute] Session ${sessionId} deleted: ${deleted}`);\n\n return reply.code(200).send({ \n success: true,\n data: { deleted, sessionId }\n });\n });\n\n // Resume session\n fastify.post<{\n Params: { id: string };\n Reply: ApiResponse<Session>;\n }>('/sessions/:id/resume', async (request, reply) => {\n const sessionId = request.params.id;\n const session = fastify.sessionService.getSession(sessionId);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Resume Copilot session\n const resumed = await fastify.copilotService.resumeCopilotSession(sessionId);\n\n if (!resumed) {\n // Create new Copilot session if resume failed\n await fastify.copilotService.createCopilotSession(\n session.id,\n session.type,\n session.model,\n session.systemPrompt\n );\n }\n\n // Update status to active\n const updatedSession = fastify.sessionService.updateSession(sessionId, { status: 'active' });\n\n return reply.send({\n success: true,\n data: updatedSession!,\n });\n });\n\n // Abort request\n fastify.post<{\n Params: { id: string };\n Reply: ApiResponse<void>;\n }>('/sessions/:id/abort', async (request, reply) => {\n await fastify.copilotService.abortRequest(request.params.id);\n\n return reply.send({\n success: true,\n });\n });\n\n // Get session messages\n fastify.get<{\n Params: { id: string };\n Querystring: { page?: string; pageSize?: string };\n Reply: ApiResponse<PaginatedResponse<Message>>;\n }>('/sessions/:id/messages', async (request, reply) => {\n const session = fastify.sessionService.getSession(request.params.id);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const page = Number.parseInt(request.query.page || '1', 10);\n const pageSize = Number.parseInt(request.query.pageSize || '100', 10);\n\n const messages = fastify.sessionService.listMessages(request.params.id, page, pageSize);\n\n return reply.send({\n success: true,\n data: messages,\n });\n });\n}\n","/**\n * ThumbnailService\n * \n * Handles image processing and thumbnail generation.\n * Stores thumbnails AND full images on disk and provides URLs for serving.\n */\n\nimport sharp from 'sharp';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n getMessageImagesDir,\n getSessionImagesDir,\n getThumbnailPath,\n toRelativePath,\n toImageRelativePath,\n toUrlPath,\n ensureDir,\n deleteDir,\n fileExists,\n} from '../lib/paths.js';\nimport type { ImageAttachment, ImageSource, ImageMimeType } from '@devmentorai/shared';\n\n/** Thumbnail generation settings */\nconst THUMBNAIL_CONFIG = {\n maxDimension: 200,\n quality: 60,\n format: 'jpeg' as const,\n};\n\n/** Full image generation settings */\nconst FULL_IMAGE_CONFIG = {\n maxDimension: 2000,\n quality: 80,\n format: 'jpeg' as const,\n};\n\nexport interface ImageInput {\n id: string;\n dataUrl: string;\n mimeType: ImageMimeType;\n source: ImageSource;\n}\n\nexport interface ProcessedImage {\n id: string;\n source: ImageSource;\n mimeType: ImageMimeType;\n dimensions: { width: number; height: number };\n fileSize: number;\n timestamp: string;\n thumbnailUrl: string;\n /** Relative path for DB storage */\n thumbnailPath: string;\n /** Absolute path to full image (for Copilot SDK attachments) */\n fullImagePath: string;\n /** URL to serve full image to client */\n fullImageUrl: string;\n}\n\n/**\n * Extract base64 data and mime type from a data URL\n */\nfunction parseDataUrl(dataUrl: string): { buffer: Buffer; mimeType: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n \n const [, mimeType, base64Data] = match;\n const buffer = Buffer.from(base64Data, 'base64');\n \n return { buffer, mimeType };\n}\n\n/**\n * Get image dimensions from a buffer\n */\nasync function getImageDimensions(buffer: Buffer): Promise<{ width: number; height: number }> {\n const metadata = await sharp(buffer).metadata();\n return {\n width: metadata.width || 0,\n height: metadata.height || 0,\n };\n}\n\n/**\n * Generate a thumbnail from an image buffer\n */\nasync function generateThumbnail(buffer: Buffer): Promise<Buffer> {\n return sharp(buffer)\n .resize(THUMBNAIL_CONFIG.maxDimension, THUMBNAIL_CONFIG.maxDimension, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .jpeg({ quality: THUMBNAIL_CONFIG.quality })\n .toBuffer();\n}\n\n/**\n * Generate a compressed full-size image from an image buffer\n */\nasync function generateFullImage(buffer: Buffer): Promise<Buffer> {\n return sharp(buffer)\n .resize(FULL_IMAGE_CONFIG.maxDimension, FULL_IMAGE_CONFIG.maxDimension, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .jpeg({ quality: FULL_IMAGE_CONFIG.quality })\n .toBuffer();\n}\n\n/**\n * Get the file extension for a MIME type\n */\nfunction getExtensionForMimeType(mimeType: string): string {\n const extensions: Record<string, string> = {\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/webp': 'webp',\n 'image/gif': 'gif',\n };\n return extensions[mimeType] || 'jpg';\n}\n\n/**\n * Get the file path for a full image\n */\nexport function getFullImagePath(sessionId: string, messageId: string, index: number, extension: string): string {\n const messageDir = getMessageImagesDir(sessionId, messageId);\n return path.join(messageDir, `image_${index}.${extension}`);\n}\n\n/**\n * Process images for a message, generating and storing thumbnails AND full images\n * \n * @param sessionId - The session ID\n * @param messageId - The message ID\n * @param images - Array of image inputs with data URLs\n * @param backendUrl - Base URL for thumbnail serving\n * @returns Array of processed images with thumbnail URLs and full image paths\n */\nexport async function processMessageImages(\n sessionId: string,\n messageId: string,\n images: ImageInput[],\n backendUrl: string\n): Promise<ProcessedImage[]> {\n if (!images || images.length === 0) return [];\n\n // Ensure the message images directory exists\n const messageDir = getMessageImagesDir(sessionId, messageId);\n ensureDir(messageDir);\n\n const processedImages: ProcessedImage[] = [];\n\n for (let index = 0; index < images.length; index++) {\n const image = images[index];\n \n try {\n // Parse the data URL\n const parsed = parseDataUrl(image.dataUrl);\n if (!parsed) {\n console.error(`[ThumbnailService] Failed to parse data URL for image ${image.id}`);\n continue;\n }\n\n const { buffer, mimeType } = parsed;\n\n // Get original dimensions\n const dimensions = await getImageDimensions(buffer);\n\n // Generate thumbnail\n const thumbnailBuffer = await generateThumbnail(buffer);\n\n // Save thumbnail to disk\n const thumbnailAbsPath = getThumbnailPath(sessionId, messageId, index);\n fs.writeFileSync(thumbnailAbsPath, thumbnailBuffer);\n\n // Save FULL IMAGE to disk (for Copilot SDK attachments and lightbox view)\n // Resize and compress to avoid huge payloads crashing the backend\n const fullImageBuffer = await generateFullImage(buffer);\n const extension = 'jpg'; // Always jpeg as per FULL_IMAGE_CONFIG\n const fullImageAbsPath = getFullImagePath(sessionId, messageId, index, extension);\n fs.writeFileSync(fullImageAbsPath, fullImageBuffer);\n console.log(`[ThumbnailService] Saved compressed full image to ${fullImageAbsPath}`);\n\n // Generate relative paths for DB storage (from DATA_DIR)\n const thumbnailRelativePath = toRelativePath(thumbnailAbsPath);\n \n // Generate URL paths for serving (from IMAGES_DIR, no \"images/\" prefix)\n const thumbnailUrlPath = toUrlPath(toImageRelativePath(thumbnailAbsPath));\n const fullImageUrlPath = toUrlPath(toImageRelativePath(fullImageAbsPath));\n\n processedImages.push({\n id: image.id,\n source: image.source,\n mimeType: image.mimeType,\n dimensions,\n fileSize: buffer.length,\n timestamp: new Date().toISOString(),\n thumbnailUrl: `${backendUrl}/api/images/${thumbnailUrlPath}`,\n thumbnailPath: thumbnailRelativePath,\n fullImagePath: fullImageAbsPath,\n fullImageUrl: `${backendUrl}/api/images/${fullImageUrlPath}`,\n });\n\n console.log(`[ThumbnailService] Processed image ${index + 1}/${images.length} for message ${messageId}`);\n } catch (error) {\n console.error(`[ThumbnailService] Failed to process image ${image.id}:`, error);\n // Continue with other images even if one fails\n }\n }\n\n return processedImages;\n}\n\n/**\n * Get the absolute path for a thumbnail from URL path segments\n * \n * @param sessionId - The session ID\n * @param messageId - The message ID\n * @param index - The image index\n * @returns Absolute path to the thumbnail file, or null if not found\n */\nexport function getThumbnailFilePath(\n sessionId: string,\n messageId: string,\n index: number\n): string | null {\n const thumbnailPath = getThumbnailPath(sessionId, messageId, index);\n return fileExists(thumbnailPath) ? thumbnailPath : null;\n}\n\n/**\n * Delete all images for a session (cleanup)\n * \n * @param sessionId - The session ID\n */\nexport function deleteSessionImages(sessionId: string): void {\n const sessionDir = getSessionImagesDir(sessionId);\n deleteDir(sessionDir);\n console.log(`[ThumbnailService] Deleted images for session ${sessionId}`);\n}\n\n/**\n * Delete all images for a message (cleanup)\n * \n * @param sessionId - The session ID\n * @param messageId - The message ID\n */\nexport function deleteMessageImages(sessionId: string, messageId: string): void {\n const messageDir = getMessageImagesDir(sessionId, messageId);\n deleteDir(messageDir);\n console.log(`[ThumbnailService] Deleted images for message ${messageId}`);\n}\n\n/**\n * Convert processed images to ImageAttachment format for storage\n */\nexport function toImageAttachments(processedImages: ProcessedImage[]): ImageAttachment[] {\n return processedImages.map(img => ({\n id: img.id,\n source: img.source,\n mimeType: img.mimeType,\n dimensions: img.dimensions,\n fileSize: img.fileSize,\n timestamp: img.timestamp,\n thumbnailUrl: img.thumbnailUrl,\n fullImageUrl: img.fullImageUrl,\n // Note: dataUrl is NOT included - it's only used during processing\n }));\n}\n","import type { FastifyInstance } from 'fastify';\nimport { z } from 'zod';\nimport type { SessionEvent } from '@github/copilot-sdk';\nimport type {\n ApiResponse,\n Message,\n SendMessageRequest,\n StreamEvent,\n ImageAttachment,\n} from '@devmentorai/shared';\nimport {\n buildContextAwarePrompt,\n buildSimplePrompt,\n validateContext,\n sanitizeContext,\n} from '../services/context-prompt-builder.js';\nimport {\n processMessageImages,\n toImageAttachments,\n type ProcessedImage,\n} from '../services/thumbnail-service.js';\n\n// Schema for simple context (backward compatible)\nconst simpleContextSchema = z.object({\n pageUrl: z.string().optional(),\n pageTitle: z.string().optional(),\n selectedText: z.string().optional(),\n action: z.enum([\n 'explain',\n 'translate',\n 'rewrite',\n 'fix_grammar',\n 'summarize',\n 'expand',\n 'analyze_config',\n 'diagnose_error',\n ]).optional(),\n});\n\n// Schema for full context payload\nconst fullContextSchema = z.object({\n metadata: z.object({\n captureTimestamp: z.string(),\n captureMode: z.enum(['auto', 'manual']),\n browserInfo: z.object({\n userAgent: z.string(),\n viewport: z.object({ width: z.number(), height: z.number() }),\n language: z.string(),\n }),\n }),\n page: z.object({\n url: z.string(),\n urlParsed: z.object({\n protocol: z.string(),\n hostname: z.string(),\n pathname: z.string(),\n search: z.string(),\n hash: z.string(),\n }),\n title: z.string(),\n platform: z.object({\n type: z.string(),\n confidence: z.number(),\n indicators: z.array(z.string()),\n specificProduct: z.string().optional(),\n }),\n }),\n text: z.object({\n selectedText: z.string().optional(),\n visibleText: z.string(),\n headings: z.array(z.object({\n level: z.number(),\n text: z.string(),\n })),\n errors: z.array(z.object({\n type: z.enum(['error', 'warning', 'info']),\n message: z.string(),\n source: z.enum(['console', 'ui', 'network', 'dom']).optional(),\n severity: z.enum(['critical', 'high', 'medium', 'low']),\n context: z.string().optional(),\n })),\n metadata: z.object({\n totalLength: z.number(),\n truncated: z.boolean(),\n }),\n }),\n structure: z.object({\n relevantSections: z.array(z.any()),\n errorContainers: z.array(z.any()),\n activeElements: z.any(),\n metadata: z.any(),\n }),\n session: z.object({\n sessionId: z.string(),\n sessionType: z.string(),\n intent: z.object({\n primary: z.string(),\n keywords: z.array(z.string()),\n implicitSignals: z.array(z.string()),\n explicitGoal: z.string().optional(),\n }),\n previousMessages: z.object({\n count: z.number(),\n lastN: z.array(z.any()),\n }),\n }),\n privacy: z.object({\n redactedFields: z.array(z.string()),\n sensitiveDataDetected: z.boolean(),\n consentGiven: z.boolean(),\n dataRetention: z.enum(['session', 'none']),\n }),\n}).passthrough();\n\n// Schema for image payload (inline data URL - legacy / small images)\nconst imagePayloadSchema = z.object({\n id: z.string(),\n dataUrl: z.string(),\n mimeType: z.enum(['image/png', 'image/jpeg', 'image/webp']),\n source: z.enum(['screenshot', 'paste', 'drop']),\n});\n\n// Schema for pre-uploaded image reference (from /api/images/upload endpoint)\nconst preUploadedImageSchema = z.object({\n id: z.string(),\n fullImagePath: z.string(),\n mimeType: z.string(),\n thumbnailUrl: z.string().optional(),\n fullImageUrl: z.string().optional(),\n dimensions: z.object({ width: z.number(), height: z.number() }).optional(),\n fileSize: z.number().optional(),\n});\n\nconst sendMessageSchema = z.object({\n prompt: z.string().min(1),\n context: simpleContextSchema.optional(),\n fullContext: fullContextSchema.optional(),\n useContextAwareMode: z.boolean().optional(),\n images: z.array(imagePayloadSchema).max(5).optional(),\n /** Pre-uploaded image references (already processed on disk) */\n preUploadedImages: z.array(preUploadedImageSchema).max(5).optional(),\n});\n\nexport async function chatRoutes(fastify: FastifyInstance) {\n // Helper to build the appropriate prompt based on context type\n // Returns userPrompt (enriched with context) and promptType\n // systemPrompt is always null - we don't override Copilot's default\n const buildPrompt = (\n body: { prompt: string; context?: any; fullContext?: any; useContextAwareMode?: boolean }\n ): { userPrompt: string; promptType: string } => {\n // If full context is provided and context-aware mode is enabled\n if (body.fullContext && body.useContextAwareMode !== false) {\n if (validateContext(body.fullContext)) {\n const sanitizedContext = sanitizeContext(body.fullContext);\n const { userPrompt } = buildContextAwarePrompt(sanitizedContext, body.prompt);\n return { userPrompt, promptType: 'context-aware' };\n }\n }\n \n // Fall back to simple prompt\n const { userPrompt } = buildSimplePrompt(\n body.prompt,\n body.context?.pageUrl,\n body.context?.pageTitle,\n body.context?.selectedText\n );\n return { userPrompt, promptType: 'simple' };\n };\n\n // Send message (non-streaming)\n fastify.post<{\n Params: { id: string };\n Body: SendMessageRequest;\n Reply: ApiResponse<Message>;\n }>('/sessions/:id/chat', async (request, reply) => {\n try {\n const body = sendMessageSchema.parse(request.body);\n const sessionId = request.params.id;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Build the prompt (enriched with context, no system prompt override)\n const { userPrompt, promptType } = buildPrompt(body);\n console.log(`[ChatRoute] Using ${promptType} prompt`);\n\n // Save user message\n const userMessage = fastify.sessionService.addMessage(\n sessionId,\n 'user',\n body.prompt,\n body.context ? {\n pageUrl: body.context.pageUrl,\n selectedText: body.context.selectedText,\n action: body.context.action,\n } : undefined\n );\n\n // Persist context if fullContext is provided (Phase 5)\n if (body.fullContext) {\n try {\n fastify.sessionService.saveContext(\n sessionId,\n JSON.stringify(body.fullContext),\n userMessage.id,\n body.fullContext.page?.url,\n body.fullContext.page?.title,\n body.fullContext.page?.platform?.type\n );\n console.log(`[ChatRoute] Context saved for message ${userMessage.id}`);\n } catch (err) {\n console.error('[ChatRoute] Failed to persist context:', err);\n }\n }\n\n // Get response from Copilot (no system prompt - uses customAgents from session)\n const response = await fastify.copilotService.sendMessage(\n sessionId,\n userPrompt,\n body.context\n // NOT passing systemPrompt - preserves Copilot's intelligence\n );\n\n // Save assistant message\n const assistantMessage = fastify.sessionService.addMessage(\n sessionId,\n 'assistant',\n response\n );\n\n return reply.send({\n success: true,\n data: assistantMessage,\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: { errors: error.errors },\n },\n });\n }\n throw error;\n }\n });\n\n // Send message (streaming via SSE)\n fastify.post<{\n Params: { id: string };\n Body: SendMessageRequest;\n }>('/sessions/:id/chat/stream', async (request, reply) => {\n try {\n const body = sendMessageSchema.parse(request.body);\n const sessionId = request.params.id;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Build the prompt (enriched with context, no system prompt override)\n const { userPrompt, promptType } = buildPrompt(body);\n console.log(`[ChatRoute] Using ${promptType} prompt for streaming`);\n\n // Process images if provided\n let processedImagesRaw: ProcessedImage[] = [];\n let processedImages: ImageAttachment[] = [];\n let copilotAttachments: Array<{ type: 'file'; path: string; displayName: string }> = [];\n // Build backend URL with port for image serving\n const host = request.headers.host || `${request.hostname}:3847`;\n const backendUrl = `http://${host}`;\n \n // We'll need the message ID before processing images\n // First save the user message without images\n const userMessage = fastify.sessionService.addMessage(\n sessionId,\n 'user',\n body.prompt,\n body.context ? {\n pageUrl: body.context.pageUrl,\n selectedText: body.context.selectedText,\n action: body.context.action,\n contextAware: body.useContextAwareMode,\n } : { contextAware: body.useContextAwareMode }\n );\n\n // Process images after we have the message ID\n // Prefer pre-uploaded images (already on disk) over inline data URLs\n if (body.preUploadedImages && body.preUploadedImages.length > 0) {\n // Images were already processed via /api/images/upload endpoint\n console.log(`[ChatRoute] Using ${body.preUploadedImages.length} pre-uploaded images`);\n copilotAttachments = body.preUploadedImages.map((img, index) => ({\n type: 'file' as const,\n path: img.fullImagePath,\n displayName: `image_${index + 1}.${(img.mimeType || 'image/jpeg').split('/')[1] || 'jpg'}`,\n }));\n\n // Build metadata for message storage\n processedImages = body.preUploadedImages.map(img => ({\n id: img.id,\n source: 'screenshot' as const,\n mimeType: (img.mimeType || 'image/jpeg') as any,\n dimensions: img.dimensions || { width: 0, height: 0 },\n fileSize: img.fileSize || 0,\n timestamp: new Date().toISOString(),\n thumbnailUrl: img.thumbnailUrl,\n fullImageUrl: img.fullImageUrl,\n }));\n\n fastify.sessionService.updateMessageMetadata(userMessage.id, {\n ...userMessage.metadata,\n images: processedImages,\n });\n } else if (body.images && body.images.length > 0) {\n // Inline image upload (legacy path for small images)\n try {\n console.log(`[ChatRoute] Processing ${body.images.length} inline images for message ${userMessage.id}`);\n processedImagesRaw = await processMessageImages(\n sessionId,\n userMessage.id,\n body.images,\n backendUrl\n );\n processedImages = toImageAttachments(processedImagesRaw);\n \n // Update message metadata with images\n fastify.sessionService.updateMessageMetadata(userMessage.id, {\n ...userMessage.metadata,\n images: processedImages,\n });\n \n copilotAttachments = processedImagesRaw.map((img, index) => ({\n type: 'file' as const,\n path: img.fullImagePath,\n displayName: `image_${index + 1}.${img.mimeType.split('/')[1] || 'jpg'}`,\n }));\n \n console.log(`[ChatRoute] Processed ${processedImages.length} images successfully`);\n } catch (err) {\n console.error('[ChatRoute] Failed to process images:', err);\n // Continue without images - don't fail the message\n }\n }\n \n if (copilotAttachments.length > 0) {\n console.log(`[ChatRoute] Built ${copilotAttachments.length} attachments for Copilot:`, copilotAttachments);\n }\n\n // Persist context if fullContext is provided (Phase 5)\n if (body.fullContext) {\n try {\n fastify.sessionService.saveContext(\n sessionId,\n JSON.stringify(body.fullContext),\n userMessage.id,\n body.fullContext.page?.url,\n body.fullContext.page?.title,\n body.fullContext.page?.platform?.type\n );\n console.log(`[ChatRoute] Context saved for message ${userMessage.id}`);\n } catch (err) {\n console.error('[ChatRoute] Failed to persist context:', err);\n }\n }\n\n // Set up SSE\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.setHeader('Access-Control-Allow-Origin', '*');\n\n let fullContent = '';\n let assistantMessageId: string | null = null;\n let streamEnded = false;\n let lastActivityTime = Date.now();\n\n // Global timeout for the entire streaming operation (2 minutes)\n const STREAM_TIMEOUT_MS = 120000;\n // Idle timeout - if no events received for this duration, consider it stuck\n const IDLE_TIMEOUT_MS = 30000;\n\n const sendSSE = (event: StreamEvent) => {\n if (!streamEnded) {\n reply.raw.write(`data: ${JSON.stringify(event)}\\n\\n`);\n lastActivityTime = Date.now();\n }\n };\n\n const endStream = (reason: string = 'completed') => {\n if (streamEnded) return;\n streamEnded = true;\n \n console.log(`[ChatRoute] Stream ending: ${reason}. Content length: ${fullContent.length}`);\n \n // Save message if we have content\n if (fullContent && !assistantMessageId) {\n const message = fastify.sessionService.addMessage(\n sessionId,\n 'assistant',\n fullContent\n );\n assistantMessageId = message.id;\n }\n\n sendSSE({ type: 'done', data: { messageId: assistantMessageId || undefined, reason } });\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n };\n\n // Create a Promise that resolves when streaming is complete\n const streamComplete = new Promise<void>((resolve) => {\n const cleanupTimers = () => {\n clearTimeout(globalTimeout);\n clearInterval(idleCheckInterval);\n };\n\n // Set up global timeout\n const globalTimeout = setTimeout(() => {\n console.warn('[ChatRoute] Global stream timeout reached');\n cleanupTimers();\n endStream('timeout');\n fastify.copilotService.abortRequest(sessionId).catch(() => {});\n resolve();\n }, STREAM_TIMEOUT_MS);\n\n // Set up idle timeout check\n const idleCheckInterval = setInterval(() => {\n const idleTime = Date.now() - lastActivityTime;\n if (idleTime > IDLE_TIMEOUT_MS && !streamEnded) {\n console.warn(`[ChatRoute] Stream idle for ${idleTime}ms, ending`);\n cleanupTimers();\n endStream('idle_timeout');\n fastify.copilotService.abortRequest(sessionId).catch(() => {});\n resolve();\n }\n }, 5000);\n\n // Handle Copilot events\n const handleEvent = (event: SessionEvent) => {\n if (streamEnded) return;\n \n console.log('[ChatRoute] Received event:', event.type);\n lastActivityTime = Date.now();\n \n switch (event.type) {\n case 'assistant.message_delta':\n fullContent += event.data.deltaContent || '';\n sendSSE({\n type: 'message_delta',\n data: { deltaContent: event.data.deltaContent },\n });\n break;\n\n case 'assistant.message':\n fullContent = event.data.content || fullContent;\n sendSSE({\n type: 'message_complete',\n data: { content: fullContent },\n });\n break;\n\n case 'tool.execution_start':\n sendSSE({\n type: 'tool_start',\n data: {\n toolName: (event.data as any).toolName,\n toolCallId: (event.data as any).toolCallId,\n },\n });\n break;\n\n case 'tool.execution_complete':\n sendSSE({\n type: 'tool_complete',\n data: { toolCallId: (event.data as any).toolCallId },\n });\n break;\n\n case 'session.idle':\n cleanupTimers();\n endStream('completed');\n resolve();\n break;\n }\n };\n\n // Start streaming with attachments (no system prompt - uses customAgents from session)\n const streamStart = fastify.copilotService.streamMessage(\n sessionId,\n userPrompt,\n body.context,\n handleEvent,\n copilotAttachments.length > 0 ? copilotAttachments : undefined\n );\n\n streamStart.catch((streamError) => {\n console.error('[ChatRoute] Failed to start Copilot stream:', streamError);\n cleanupTimers();\n\n if (!streamEnded) {\n if (!reply.raw.headersSent) {\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.setHeader('Access-Control-Allow-Origin', '*');\n }\n sendSSE({\n type: 'error',\n data: {\n error: streamError instanceof Error ? streamError.message : 'Failed to start stream',\n },\n });\n endStream('copilot_error');\n }\n\n resolve();\n });\n });\n\n // Handle client disconnect\n request.raw.on('close', () => {\n if (!streamEnded) {\n console.log('[ChatRoute] Client disconnected, aborting');\n streamEnded = true;\n fastify.copilotService.abortRequest(sessionId).catch((abortError) => {\n console.error('[ChatRoute] Failed to abort request after disconnect:', abortError);\n });\n reply.raw.end();\n }\n });\n\n // Wait for streaming to complete before allowing Fastify to close the connection\n await streamComplete;\n\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: error.errors,\n },\n });\n }\n \n // Send error via SSE\n if (!reply.raw.headersSent) {\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.setHeader('Access-Control-Allow-Origin', '*');\n }\n const errorEvent: StreamEvent = {\n type: 'error',\n data: { error: error instanceof Error ? error.message : 'Unknown error' },\n };\n reply.raw.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n }\n });\n\n // Get session context history (Phase 5)\n fastify.get<{\n Params: { id: string };\n Querystring: { limit?: number };\n }>('/sessions/:id/context', async (request, reply) => {\n const sessionId = request.params.id;\n const limit = request.query.limit || 10;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const latestContext = fastify.sessionService.getLatestContext(sessionId);\n const contextHistory = fastify.sessionService.getContextHistory(sessionId, limit);\n const contextCount = fastify.sessionService.getContextCount(sessionId);\n\n return reply.send({\n success: true,\n data: {\n latest: latestContext,\n history: contextHistory,\n totalCount: contextCount,\n },\n });\n });\n\n // Get specific context by ID (Phase 5)\n fastify.get<{\n Params: { id: string; contextId: string };\n }>('/sessions/:id/context/:contextId', async (request, reply) => {\n const { id: sessionId, contextId } = request.params;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const context = fastify.sessionService.getContext(contextId);\n if (!context || context.sessionId !== sessionId) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Context not found',\n },\n });\n }\n\n return reply.send({\n success: true,\n data: {\n ...context,\n contextData: JSON.parse(context.contextJson),\n },\n });\n });\n\n // Cleanup old contexts for a session (Phase 5)\n fastify.post<{\n Params: { id: string };\n Body: { keepCount?: number };\n }>('/sessions/:id/context/cleanup', async (request, reply) => {\n const sessionId = request.params.id;\n const keepCount = request.body?.keepCount || 20;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const deletedCount = fastify.sessionService.cleanupOldContexts(sessionId, keepCount);\n\n return reply.send({\n success: true,\n data: {\n deletedCount,\n remainingCount: fastify.sessionService.getContextCount(sessionId),\n },\n });\n });\n}\n","/**\n * Context Prompt Builder Service\n * \n * Builds context-enriched prompts for the Copilot SDK based on extracted page context.\n * \n * PHASE 3 DESIGN PRINCIPLE - AUTONOMOUS AGENT:\n * ============================================\n * 1. We provide PURELY FACTUAL context (what's on the page)\n * 2. We do NOT tell the agent what to do (no \"Task:\" instructions)\n * 3. We do NOT interpret user intent (the LLM decides)\n * 4. We do NOT use keyword matching (multilingual support, agent autonomy)\n * 5. The agent (Copilot) is fully autonomous in deciding:\n * - What the user wants\n * - How to respond \n * - What context is relevant\n * \n * CustomAgents (DevOps Mentor, etc.) are set at session creation and provide\n * domain expertise. This function ONLY adds situational context from the page.\n */\n\nimport type {\n ContextPayload,\n PlatformDetection,\n ExtractedError,\n HTMLSection,\n Heading,\n} from '@devmentorai/shared';\n\n// ============================================================================\n// Platform-Specific Context Notes (Factual, NOT instructions)\n// ============================================================================\n\n/**\n * Platform context notes - FACTUAL ONLY\n * These describe where relevant information can be found, NOT what the agent should do.\n */\nconst PLATFORM_CONTEXT_NOTES: Record<string, string> = {\n azure: `**Platform:** Azure Portal\nCommon diagnostic locations: Activity Log, Diagnose and solve problems, Resource health`,\n\n aws: `**Platform:** AWS Console \nCommon diagnostic locations: CloudTrail, CloudWatch Logs, IAM policies`,\n\n gcp: `**Platform:** Google Cloud Console\nCommon diagnostic locations: Cloud Logging, Error Reporting, IAM bindings`,\n\n github: `**Platform:** GitHub\nCommon diagnostic locations: Actions tab, Issues, Pull Requests`,\n\n gitlab: `**Platform:** GitLab\nCommon diagnostic locations: Pipelines, Merge Requests, Project settings`,\n\n kubernetes: `**Platform:** Kubernetes Dashboard\nCommon diagnostic commands: kubectl logs, kubectl describe, kubectl get events`,\n\n jenkins: `**Platform:** Jenkins\nCommon diagnostic locations: Console output, Pipeline syntax, Agent status`,\n\n datadog: `**Platform:** Datadog\nCommon diagnostic locations: Metric graphs, Alert conditions, Integration status`,\n\n grafana: `**Platform:** Grafana\nCommon diagnostic locations: Query editor, Data source config, Alert rules`,\n\n generic: ``,\n};\n\n// ============================================================================\n// Context Formatting Functions\n// ============================================================================\n\n/**\n * Format page context section for the prompt\n */\nfunction formatPageContext(page: ContextPayload['page']): string {\n const { platform } = page;\n const platformLabel = platform.specificProduct || platform.type.toUpperCase();\n \n let section = `## Page Context\\n`;\n section += `- **Platform:** ${platformLabel}`;\n if (platform.confidence < 0.8) {\n section += ` (confidence: ${Math.round(platform.confidence * 100)}%)`;\n }\n section += '\\n';\n section += `- **URL:** ${page.url}\\n`;\n section += `- **Title:** ${page.title}\\n`;\n \n return section;\n}\n\n/**\n * Format errors section for the prompt - FACTUAL ONLY\n * No severity emojis - the agent interprets severity\n */\nfunction formatErrors(errors: ExtractedError[]): string {\n if (errors.length === 0) return '';\n\n let section = `## Errors and Alerts on Page\\n`;\n section += `${errors.length} issue(s) detected:\\n\\n`;\n\n for (const error of errors) {\n section += `- **[${error.severity.toUpperCase()}]** ${error.message}\\n`;\n if (error.source) section += ` Source: ${error.source}\\n`;\n if (error.context) section += ` Context: ${error.context}\\n`;\n if (error.stackTrace) section += ` Stack: ${error.stackTrace.slice(0, 200)}...\\n`;\n section += '\\n';\n }\n\n return section;\n}\n\n/**\n * Format headings hierarchy for the prompt\n */\nfunction formatHeadings(headings: Heading[]): string {\n if (headings.length === 0) return '';\n\n let section = `## Page Structure (Headings)\\n`;\n for (const heading of headings.slice(0, 10)) {\n const indent = ' '.repeat(heading.level - 1);\n section += `${indent}- ${heading.text}\\n`;\n }\n return section + '\\n';\n}\n\n/**\n * Format relevant HTML sections for the prompt\n */\nfunction formatRelevantSections(sections: HTMLSection[]): string {\n if (sections.length === 0) return '';\n\n let section = `## Relevant UI Elements\\n`;\n for (const s of sections.slice(0, 5)) {\n section += `### ${s.purpose.replace('-', ' ').toUpperCase()}\\n`;\n section += `\\`\\`\\`\\n${s.textContent.slice(0, 300)}\\n\\`\\`\\`\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format code blocks for the prompt (Phase 2)\n */\nfunction formatCodeBlocks(codeBlocks?: HTMLSection[]): string {\n if (!codeBlocks || codeBlocks.length === 0) return '';\n\n let section = `## Code Snippets Found on Page\\n`;\n for (const block of codeBlocks.slice(0, 3)) {\n const lang = block.attributes.detectedLanguage || 'text';\n section += `### ${lang.toUpperCase()}\\n`;\n section += `\\`\\`\\`${lang}\\n${block.textContent.slice(0, 500)}\\n\\`\\`\\`\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format tables for the prompt (Phase 2)\n */\nfunction formatTables(tables?: HTMLSection[]): string {\n if (!tables || tables.length === 0) return '';\n\n let section = `## Data Tables\\n`;\n for (const table of tables.slice(0, 2)) {\n const rows = table.attributes.rowCount || '?';\n const cols = table.attributes.columnCount || '?';\n section += `### Table (${rows} rows × ${cols} cols)\\n`;\n section += `\\`\\`\\`\\n${table.textContent.slice(0, 400)}\\n\\`\\`\\`\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format console logs for the prompt (Phase 2) - FACTUAL ONLY\n */\nfunction formatConsoleLogs(logs?: Array<{ level: string; message: string; timestamp: string; stackTrace?: string }>): string {\n if (!logs || logs.length === 0) return '';\n\n const errors = logs.filter(l => l.level === 'error' || l.level === 'warn');\n if (errors.length === 0) return '';\n\n let section = `## Browser Console Logs\\n`;\n section += `${errors.length} error/warning message(s):\\n\\n`;\n \n for (const log of errors.slice(0, 5)) {\n section += `- **${log.level.toUpperCase()}:** ${log.message.slice(0, 200)}\\n`;\n if (log.stackTrace) {\n section += ` Stack: ${log.stackTrace.slice(0, 150)}...\\n`;\n }\n section += '\\n';\n }\n return section;\n}\n\n/**\n * Format network errors for the prompt (Phase 2) - FACTUAL ONLY\n */\nfunction formatNetworkErrors(errors?: Array<{ url: string; method: string; status?: number; errorMessage?: string }>): string {\n if (!errors || errors.length === 0) return '';\n\n let section = `## Network Requests Failed\\n`;\n section += `${errors.length} failed request(s):\\n\\n`;\n \n for (const err of errors.slice(0, 5)) {\n const status = err.status ? `HTTP ${err.status}` : (err.errorMessage || 'Failed');\n section += `- **${err.method}** ${err.url.slice(0, 80)}${err.url.length > 80 ? '...' : ''}\\n`;\n section += ` Status: ${status}\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format modal content for the prompt (Phase 2)\n */\nfunction formatModalContent(modal?: HTMLSection): string {\n if (!modal) return '';\n\n let section = `## Active Modal/Dialog\\n`;\n const title = modal.attributes.title || 'Modal';\n section += `### ${title}\\n`;\n section += `\\`\\`\\`\\n${modal.textContent.slice(0, 400)}\\n\\`\\`\\`\\n\\n`;\n return section;\n}\n\n/**\n * Format platform-specific context for the prompt (Phase 2)\n */\nfunction formatPlatformSpecificContext(platformContext?: Record<string, unknown>): string {\n if (!platformContext || Object.keys(platformContext).length === 0) return '';\n\n let section = `## Platform-Specific Details\\n`;\n for (const [key, value] of Object.entries(platformContext)) {\n if (value !== undefined && value !== null) {\n section += `- **${key}:** ${String(value)}\\n`;\n }\n }\n return section + '\\n';\n}\n\n/**\n * Format UI state for the prompt\n */\nfunction formatUIState(uiState: {\n pageState: string;\n loadingIndicators: number;\n disabledButtons: number;\n emptyStates: number;\n errorStates: number;\n toastNotifications: number;\n modalOpen: boolean;\n formValidationErrors: number;\n}): string {\n let section = `## UI State\\n`;\n section += `- **Page State:** ${uiState.pageState}\\n`;\n \n const issues: string[] = [];\n if (uiState.loadingIndicators > 0) issues.push(`${uiState.loadingIndicators} loading indicator(s)`);\n if (uiState.errorStates > 0) issues.push(`${uiState.errorStates} error state(s)`);\n if (uiState.emptyStates > 0) issues.push(`${uiState.emptyStates} empty state(s)`);\n if (uiState.toastNotifications > 0) issues.push(`${uiState.toastNotifications} notification(s)`);\n if (uiState.formValidationErrors > 0) issues.push(`${uiState.formValidationErrors} form validation error(s)`);\n if (uiState.disabledButtons > 0) issues.push(`${uiState.disabledButtons} disabled button(s)`);\n if (uiState.modalOpen) issues.push(`modal/dialog open`);\n \n if (issues.length > 0) {\n section += `- **UI Issues:** ${issues.join(', ')}\\n`;\n }\n \n return section + '\\n';\n}\n\n/**\n * Format runtime JavaScript errors for the prompt\n */\nfunction formatRuntimeErrors(errors: Array<{\n message: string;\n source?: string;\n lineno?: number;\n colno?: number;\n stack?: string;\n type: string;\n}>): string {\n if (errors.length === 0) return '';\n\n let section = `## JavaScript Runtime Errors\\n`;\n section += `${errors.length} runtime error(s) detected:\\n\\n`;\n \n for (const err of errors.slice(0, 5)) {\n const errType = err.type === 'unhandledrejection' ? 'Promise Rejection' : 'JS Error';\n section += `- **${errType}:** ${err.message.slice(0, 200)}\\n`;\n if (err.source) {\n section += ` Source: ${err.source}${err.lineno ? `:${err.lineno}` : ''}${err.colno ? `:${err.colno}` : ''}\\n`;\n }\n if (err.stack) {\n section += ` Stack: ${err.stack.slice(0, 150)}...\\n`;\n }\n section += '\\n';\n }\n return section;\n}\n\n/**\n * Format user selection for the prompt\n */\nfunction formatSelectedText(selectedText?: string): string {\n if (!selectedText) return '';\n \n return `## User Selected Text\\nThe user has highlighted this text on the page:\\n\\`\\`\\`\\n${selectedText}\\n\\`\\`\\`\\n\\n`;\n}\n\n/**\n * Format session history for the prompt - FACTUAL ONLY\n */\nfunction formatSessionHistory(messages: { count: number; lastN: Array<{ role: string; content: string }> }): string {\n if (messages.count === 0 || messages.lastN.length === 0) return '';\n\n let section = `## Recent Conversation (${messages.count} messages total)\\n`;\n for (const msg of messages.lastN) {\n const role = msg.role === 'user' ? 'User' : 'Assistant';\n section += `**${role}:** ${msg.content.slice(0, 200)}${msg.content.length > 200 ? '...' : ''}\\n\\n`;\n }\n return section;\n}\n\n// ============================================================================\n// Main Prompt Builder\n// ============================================================================\n\nexport interface ContextAwarePromptOptions {\n includePlatformNotes?: boolean;\n includeErrors?: boolean;\n includeStructure?: boolean;\n // Phase 2 options\n includeCodeBlocks?: boolean;\n includeTables?: boolean;\n includeConsoleLogs?: boolean;\n includeNetworkErrors?: boolean;\n includeModal?: boolean;\n includePlatformSpecific?: boolean;\n maxContextLength?: number;\n // Phase 3: intentInstructions REMOVED - agent is autonomous\n}\n\nconst DEFAULT_OPTIONS: ContextAwarePromptOptions = {\n includePlatformNotes: true,\n includeErrors: true,\n includeStructure: true,\n // Phase 2 defaults\n includeCodeBlocks: true,\n includeTables: true,\n includeConsoleLogs: true,\n includeNetworkErrors: true,\n includeModal: true,\n includePlatformSpecific: true,\n maxContextLength: 10000, // Increased for Phase 2\n};\n\n/**\n * Build a context-enriched user prompt from extracted page context.\n * \n * PHASE 3 - AUTONOMOUS AGENT DESIGN:\n * ==================================\n * - Returns ONLY factual context (what's on the page)\n * - Does NOT tell the agent what to do\n * - Does NOT interpret user intent\n * - The agent decides everything based on the context and user message\n * \n * CustomAgents (DevOps Mentor, etc.) are set at session creation and provide\n * domain expertise. This function ONLY adds situational context.\n * \n * IMPORTANT: The context comes from the user's authenticated browser session.\n * The agent should use this context to answer questions about private/internal\n * pages that are not publicly accessible.\n */\nexport function buildContextAwarePrompt(\n context: ContextPayload,\n userMessage: string,\n options: ContextAwarePromptOptions = {}\n): { systemPrompt: string | null; userPrompt: string } {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n \n // Build the enriched user prompt with FACTUAL context sections\n let enrichedPrompt = '';\n \n // Context header - explains that this data comes from user's browser\n enrichedPrompt += `# Browser Context (from user's authenticated session)\\n\\n`;\n enrichedPrompt += `The following context was extracted from the user's browser. `;\n enrichedPrompt += `This may include private or authenticated content that is not publicly accessible. `;\n enrichedPrompt += `Use this context to answer the user's question - DO NOT attempt to fetch URLs externally.\\n\\n`;\n\n // Page context (always included)\n enrichedPrompt += formatPageContext(context.page);\n\n // UI State (if available) - helps understand page state\n if ((context.page as any).uiState) {\n enrichedPrompt += formatUIState((context.page as any).uiState);\n }\n\n // Platform-specific notes (factual locations, NOT instructions)\n if (opts.includePlatformNotes) {\n const platformNotes = PLATFORM_CONTEXT_NOTES[context.page.platform.type] || \n PLATFORM_CONTEXT_NOTES.generic;\n if (platformNotes) {\n enrichedPrompt += platformNotes + '\\n\\n';\n }\n }\n\n // Phase 2: Platform-specific context details\n if (opts.includePlatformSpecific && context.page.platform.specificContext) {\n enrichedPrompt += formatPlatformSpecificContext(context.page.platform.specificContext);\n }\n\n // Errors (factual listing)\n if (opts.includeErrors) {\n enrichedPrompt += formatErrors(context.text.errors);\n }\n\n // Console errors\n if (opts.includeConsoleLogs && context.text.consoleLogs) {\n enrichedPrompt += formatConsoleLogs(context.text.consoleLogs);\n }\n\n // Network errors\n if (opts.includeNetworkErrors && context.text.networkErrors) {\n enrichedPrompt += formatNetworkErrors(context.text.networkErrors);\n }\n\n // Runtime JavaScript errors (new)\n if ((context.text as any).runtimeErrors?.length > 0) {\n enrichedPrompt += formatRuntimeErrors((context.text as any).runtimeErrors);\n }\n\n // Selected text (user highlighted something specific)\n enrichedPrompt += formatSelectedText(context.text.selectedText);\n\n // Modal content (if present)\n if (opts.includeModal && context.structure.modal) {\n enrichedPrompt += formatModalContent(context.structure.modal);\n }\n\n // Structure (headings + sections) - helps AI understand page layout\n if (opts.includeStructure) {\n enrichedPrompt += formatHeadings(context.text.headings);\n enrichedPrompt += formatRelevantSections(context.structure.relevantSections);\n }\n\n // Code blocks\n if (opts.includeCodeBlocks && context.structure.codeBlocks) {\n enrichedPrompt += formatCodeBlocks(context.structure.codeBlocks);\n }\n\n // Tables\n if (opts.includeTables && context.structure.tables) {\n enrichedPrompt += formatTables(context.structure.tables);\n }\n\n // Session history (for continuity)\n enrichedPrompt += formatSessionHistory(context.session.previousMessages);\n\n // Privacy note\n if (context.privacy?.privacyMaskingApplied) {\n enrichedPrompt += `\\n**Note:** Some sensitive data (${context.privacy.sensitiveDataTypes?.join(', ') || 'various types'}) has been redacted for privacy.\\n\\n`;\n }\n\n // Add the actual user message\n enrichedPrompt += `---\\n\\n## User Message\\n${userMessage}\\n`;\n\n // Truncate if too long\n if (enrichedPrompt.length > (opts.maxContextLength || 10000)) {\n enrichedPrompt = truncatePrompt(enrichedPrompt, opts.maxContextLength || 10000, userMessage);\n }\n\n // Return null for systemPrompt - we don't override Copilot's default\n return { systemPrompt: null, userPrompt: enrichedPrompt };\n}\n\n/**\n * Truncate prompt while preserving the user's actual message\n */\nfunction truncatePrompt(prompt: string, maxLength: number, userMessage: string): string {\n const userMessageSection = `## User Message\\n${userMessage}\\n`;\n const reservedLength = userMessageSection.length + 500; // Reserve space for user message + buffer\n const availableLength = maxLength - reservedLength;\n\n if (availableLength < 500) {\n // Not enough space for context, just return user message\n return userMessageSection;\n }\n\n // Find a good truncation point\n const truncatedContext = prompt.slice(0, availableLength);\n const lastNewline = truncatedContext.lastIndexOf('\\n');\n \n return truncatedContext.slice(0, lastNewline) + '\\n\\n[Context truncated for length]\\n\\n' + userMessageSection;\n}\n\n/**\n * Build a simple prompt without full context (fallback)\n * \n * This also does NOT replace Copilot's system prompt.\n * Just enriches the user message with available context.\n */\nexport function buildSimplePrompt(\n userMessage: string,\n pageUrl?: string,\n pageTitle?: string,\n selectedText?: string\n): { systemPrompt: string | null; userPrompt: string } {\n let userPrompt = '';\n \n // Add any available context to the user message\n if (pageUrl || pageTitle || selectedText) {\n userPrompt += `**Context:**\\n`;\n if (pageUrl) userPrompt += `- Page URL: ${pageUrl}\\n`;\n if (pageTitle) userPrompt += `- Page Title: ${pageTitle}\\n`;\n if (selectedText) userPrompt += `- Selected Text: \"${selectedText.slice(0, 500)}${selectedText.length > 500 ? '...' : ''}\"\\n`;\n userPrompt += '\\n**Question:** ';\n }\n \n userPrompt += userMessage;\n\n // Return null for systemPrompt - we don't override Copilot's default\n return { systemPrompt: null, userPrompt };\n}\n\n/**\n * Validate context payload before using it for prompt building\n */\nexport function validateContext(context: unknown): context is ContextPayload {\n if (!context || typeof context !== 'object') return false;\n \n const c = context as Record<string, unknown>;\n \n // Check required fields\n if (!c.metadata || typeof c.metadata !== 'object') return false;\n if (!c.page || typeof c.page !== 'object') return false;\n if (!c.text || typeof c.text !== 'object') return false;\n if (!c.session || typeof c.session !== 'object') return false;\n \n return true;\n}\n\n/**\n * Sanitize context payload by removing any remaining sensitive data\n */\nexport function sanitizeContext(context: ContextPayload): ContextPayload {\n // Create a deep copy to avoid mutations\n const sanitized = JSON.parse(JSON.stringify(context)) as ContextPayload;\n\n // Additional sanitization patterns\n const sensitivePatterns = [\n /Bearer\\s+[A-Za-z0-9\\-_]+/gi,\n /api[_-]?key[=:]\\s*[A-Za-z0-9\\-_]+/gi,\n /password[=:]\\s*\\S+/gi,\n /token[=:]\\s*[A-Za-z0-9\\-_]+/gi,\n ];\n\n // Sanitize visible text\n let visibleText = sanitized.text.visibleText;\n for (const pattern of sensitivePatterns) {\n visibleText = visibleText.replace(pattern, '[REDACTED]');\n }\n sanitized.text.visibleText = visibleText;\n\n // Sanitize URL query params\n const url = new URL(sanitized.page.url);\n const sensitiveParams = ['token', 'key', 'secret', 'password', 'auth'];\n for (const param of sensitiveParams) {\n if (url.searchParams.has(param)) {\n url.searchParams.set(param, '[REDACTED]');\n }\n }\n sanitized.page.url = url.toString();\n sanitized.page.urlParsed.search = url.search;\n\n return sanitized;\n}\n","import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\nimport type { ApiResponse, ModelInfo, ModelPricingTier } from '@devmentorai/shared';\n\nconst TIER_ORDER: ModelPricingTier[] = ['free', 'cheap', 'standard', 'premium'];\n\nconst FALLBACK_MODEL: ModelInfo = {\n id: 'gpt-4.1',\n name: 'GPT-4.1',\n description: 'Recommended baseline model for DevMentorAI sessions',\n provider: 'openai',\n available: true,\n isDefault: true,\n pricingTier: 'free',\n pricingMultiplier: 0,\n};\n\nfunction sortModelsByTierAndName(models: ModelInfo[]): ModelInfo[] {\n return [...models].sort((a, b) => {\n const aTier = a.pricingTier || 'standard';\n const bTier = b.pricingTier || 'standard';\n const tierDiff = TIER_ORDER.indexOf(aTier) - TIER_ORDER.indexOf(bTier);\n if (tierDiff !== 0) return tierDiff;\n\n return a.name.localeCompare(b.name);\n });\n}\n\nasync function getModelsPayload(fastify: FastifyInstance): Promise<{ models: ModelInfo[]; default: string }> {\n const response = await fastify.copilotService.listModels();\n\n if (!response.models || response.models.length === 0) {\n return {\n models: [FALLBACK_MODEL],\n default: FALLBACK_MODEL.id,\n };\n }\n\n const sortedModels = sortModelsByTierAndName(response.models);\n const defaultModel =\n sortedModels.find((model) => model.id === response.default)?.id ||\n sortedModels.find((model) => model.isDefault)?.id ||\n FALLBACK_MODEL.id;\n\n return {\n models: sortedModels.map((model) => ({\n ...model,\n isDefault: model.id === defaultModel,\n })),\n default: defaultModel,\n };\n}\n\nexport async function modelsRoutes(fastify: FastifyInstance): Promise<void> {\n // List all available models\n fastify.get<{\n Reply: ApiResponse<{ models: ModelInfo[]; default: string }>;\n }>('/models', async (_request: FastifyRequest, reply: FastifyReply) => {\n const payload = await getModelsPayload(fastify);\n\n return reply.send({\n success: true,\n data: payload,\n });\n });\n\n // Get specific model info\n fastify.get<{\n Params: { id: string };\n Reply: ApiResponse<ModelInfo>;\n }>('/models/:id', async (request, reply) => {\n const modelId = request.params.id;\n const payload = await getModelsPayload(fastify);\n const model = payload.models.find((m) => m.id === modelId);\n\n if (!model) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: `Model '${modelId}' not found`,\n },\n });\n }\n\n return reply.send({\n success: true,\n data: model,\n });\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { ApiResponse, CopilotAuthStatus, CopilotQuotaStatus } from '@devmentorai/shared';\n\nexport async function accountRoutes(fastify: FastifyInstance): Promise<void> {\n fastify.get<{\n Reply: ApiResponse<CopilotAuthStatus>;\n }>('/account/auth', async (_request, reply) => {\n const auth = await fastify.copilotService.getAuthStatus();\n\n return reply.send({\n success: true,\n data: auth,\n });\n });\n\n fastify.get<{\n Reply: ApiResponse<CopilotQuotaStatus>;\n }>('/account/quota', async (_request, reply) => {\n const quota = await fastify.copilotService.getQuota();\n\n return reply.send({\n success: true,\n data: quota,\n });\n });\n}\n","/**\n * Images Route\n * \n * Serves thumbnail and full images stored on disk.\n * Also provides an upload endpoint for pre-uploading images before chat.\n * \n * Routes:\n * GET /api/images/:sessionId/:messageId/thumb_:index.jpg - Thumbnail\n * GET /api/images/:sessionId/:messageId/image_:index.:ext - Full image\n * POST /api/images/upload/:sessionId/:messageId - Pre-upload images\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { z } from 'zod';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { IMAGES_DIR } from '../lib/paths.js';\nimport {\n getThumbnailFilePath,\n processMessageImages,\n toImageAttachments,\n} from '../services/thumbnail-service.js';\n\ninterface ImageParams {\n sessionId: string;\n messageId: string;\n filename: string;\n}\n\n// MIME types for supported image formats\nconst MIME_TYPES: Record<string, string> = {\n 'jpg': 'image/jpeg',\n 'jpeg': 'image/jpeg',\n 'png': 'image/png',\n 'webp': 'image/webp',\n 'gif': 'image/gif',\n};\n\n// Schema for identifying a single image in an upload payload\nconst uploadImageSchema = z.object({\n id: z.string(),\n dataUrl: z.string(),\n mimeType: z.enum(['image/png', 'image/jpeg', 'image/webp']),\n source: z.enum(['screenshot', 'paste', 'drop']),\n});\n\nconst uploadBodySchema = z.object({\n images: z.array(uploadImageSchema).min(1).max(5),\n});\n\nexport async function imagesRoutes(fastify: FastifyInstance) {\n /**\n * POST /api/images/upload/:sessionId/:messageId\n * Pre-upload images before sending the chat message.\n * Returns processed image info (thumbnailUrl, fullImageUrl, fullImagePath).\n */\n fastify.post<{\n Params: { sessionId: string; messageId: string };\n Body: z.infer<typeof uploadBodySchema>;\n }>(\n '/upload/:sessionId/:messageId',\n async (request, reply) => {\n try {\n const { sessionId, messageId } = request.params;\n const body = uploadBodySchema.parse(request.body);\n\n // Build backend URL for image serving\n const host = request.headers.host || `${request.hostname}:3847`;\n const backendUrl = `http://${host}`;\n\n console.log(`[ImagesRoute] Pre-uploading ${body.images.length} images for ${sessionId}/${messageId}`);\n\n const processedImagesRaw = await processMessageImages(\n sessionId,\n messageId,\n body.images,\n backendUrl\n );\n\n const processedImages = toImageAttachments(processedImagesRaw);\n\n // Return the processed image metadata + absolute paths for Copilot SDK attachments\n const responseImages = processedImagesRaw.map((img, i) => ({\n id: img.id,\n thumbnailUrl: img.thumbnailUrl,\n fullImageUrl: img.fullImageUrl,\n fullImagePath: img.fullImagePath,\n mimeType: img.mimeType,\n dimensions: img.dimensions,\n fileSize: img.fileSize,\n }));\n\n console.log(`[ImagesRoute] Pre-upload complete: ${responseImages.length} images processed`);\n\n return reply.send({\n success: true,\n data: { images: responseImages },\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid upload body',\n details: error.errors,\n },\n });\n }\n console.error('[ImagesRoute] Upload failed:', error);\n return reply.code(500).send({\n success: false,\n error: {\n code: 'UPLOAD_ERROR',\n message: error instanceof Error ? error.message : 'Failed to process images',\n },\n });\n }\n }\n );\n\n /**\n * GET /api/images/:sessionId/:messageId/:filename\n * Serves thumbnail or full image\n * \n * Filename patterns:\n * - thumb_0.jpg (thumbnail)\n * - image_0.jpg (full image)\n * - image_0.png (full image)\n */\n fastify.get<{ Params: ImageParams }>(\n '/:sessionId/:messageId/:filename',\n async (request: FastifyRequest<{ Params: ImageParams }>, reply: FastifyReply) => {\n const { sessionId, messageId, filename } = request.params;\n\n // Validate session and message IDs (basic security check)\n if (!sessionId?.match(/^session_[a-z0-9]+$/) || !messageId?.match(/^msg_[a-z0-9]+$/)) {\n return reply.code(400).send({ error: 'Invalid session or message ID format' });\n }\n\n // Parse filename - support thumb_N.jpg and image_N.ext\n let filePath: string | null = null;\n let mimeType = 'image/jpeg';\n\n // Check for thumbnail: thumb_0.jpg\n const thumbMatch = filename.match(/^thumb_(\\d+)\\.jpg$/);\n if (thumbMatch) {\n const imageIndex = parseInt(thumbMatch[1], 10);\n filePath = getThumbnailFilePath(sessionId, messageId, imageIndex);\n mimeType = 'image/jpeg';\n }\n\n // Check for full image: image_0.jpg, image_0.png, etc.\n const imageMatch = filename.match(/^image_(\\d+)\\.(jpg|jpeg|png|webp|gif)$/i);\n if (imageMatch) {\n const ext = imageMatch[2].toLowerCase();\n mimeType = MIME_TYPES[ext] || 'image/jpeg';\n // Build path directly\n filePath = path.join(IMAGES_DIR, sessionId, messageId, filename);\n }\n\n if (!filePath) {\n return reply.code(400).send({ error: 'Invalid filename format' });\n }\n\n // Check if file exists\n if (!fs.existsSync(filePath)) {\n console.log(`[ImagesRoute] File not found: ${filePath}`);\n return reply.code(404).send({ error: 'Image not found' });\n }\n\n // Read and send the file\n try {\n const fileBuffer = fs.readFileSync(filePath);\n \n return reply\n .code(200)\n .header('Content-Type', mimeType)\n .header('Cache-Control', 'public, max-age=31536000, immutable') // Cache for 1 year\n .header('Content-Length', fileBuffer.length)\n .send(fileBuffer);\n } catch (error) {\n console.error('[ImagesRoute] Failed to read image file:', error);\n return reply.code(500).send({ error: 'Failed to read image' });\n }\n }\n );\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { ApiResponse } from '@devmentorai/shared';\nimport { checkForUpdate, type UpdateInfo } from '@devmentorai/shared';\n\ninterface UpdatesResponse {\n backend: UpdateInfo;\n extension: UpdateInfo;\n}\n\nexport async function updatesRoutes(fastify: FastifyInstance) {\n fastify.get<{\n Reply: ApiResponse<UpdatesResponse>;\n }>('/updates', async (_request, reply) => {\n const [backend, extension] = await Promise.all([\n checkForUpdate('backend', '1.0.0'),\n checkForUpdate('extension', '1.0.0'),\n ]);\n\n return reply.send({\n success: true,\n data: { backend, extension },\n });\n });\n}\n","/**\n * Tools API Routes\n * \n * Exposes custom DevOps tools for direct execution\n * and provides tool metadata for the extension.\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\nimport type { CopilotService } from '../services/copilot.service.js';\nimport type { SessionType } from '@devmentorai/shared';\n\ninterface ToolExecuteBody {\n toolName: string;\n params: Record<string, unknown>;\n}\n\nexport function registerToolsRoutes(\n app: FastifyInstance, \n copilotService: CopilotService\n): void {\n \n // List available tools\n app.get('/api/tools', async (\n request: FastifyRequest<{ Querystring: { type?: SessionType } }>,\n reply: FastifyReply\n ) => {\n const sessionType = request.query.type || 'devops';\n const tools = copilotService.getAvailableTools(sessionType);\n \n return reply.send({\n success: true,\n data: tools,\n });\n });\n \n // Execute a tool directly\n app.post('/api/tools/execute', async (\n request: FastifyRequest<{ Body: ToolExecuteBody }>,\n reply: FastifyReply\n ) => {\n const { toolName, params } = request.body;\n \n if (!toolName) {\n return reply.status(400).send({\n success: false,\n error: 'toolName is required',\n });\n }\n \n const result = await copilotService.executeTool(toolName, params || {});\n \n if (!result.success) {\n return reply.status(400).send({\n success: false,\n error: result.error,\n });\n }\n \n return reply.send({\n success: true,\n data: {\n toolName,\n result: result.result,\n },\n });\n });\n \n // Analyze config endpoint (convenience wrapper)\n app.post('/api/tools/analyze-config', async (\n request: FastifyRequest<{ Body: { content: string; type?: string } }>,\n reply: FastifyReply\n ) => {\n const { content, type } = request.body;\n \n if (!content) {\n return reply.status(400).send({\n success: false,\n error: 'content is required',\n });\n }\n \n const result = await copilotService.executeTool('analyze_config', {\n content,\n type: type || 'auto',\n });\n \n return reply.send({\n success: result.success,\n data: result.result,\n error: result.error,\n });\n });\n \n // Analyze error endpoint (convenience wrapper)\n app.post('/api/tools/analyze-error', async (\n request: FastifyRequest<{ Body: { error: string; context?: string } }>,\n reply: FastifyReply\n ) => {\n const { error, context } = request.body;\n \n if (!error) {\n return reply.status(400).send({\n success: false,\n error: 'error is required',\n });\n }\n \n const result = await copilotService.executeTool('analyze_error', {\n error,\n context: context || 'general',\n });\n \n return reply.send({\n success: result.success,\n data: result.result,\n error: result.error,\n });\n });\n}\n","import { CopilotClient, type SessionEvent, type Tool as CopilotTool, approveAll } from '@github/copilot-sdk';\nimport { SessionService } from './session.service.js';\nimport { getAgentConfig, SESSION_TYPE_CONFIGS } from '@devmentorai/shared';\nimport type {\n SessionType,\n MessageContext,\n ModelInfo,\n CopilotAuthStatus,\n CopilotQuotaStatus,\n ModelPricingTier,\n} from '@devmentorai/shared';\nimport { devopsTools, getToolByName } from '../tools/devops-tools.js';\n\ninterface CopilotSession {\n sessionId: string;\n session: Awaited<ReturnType<CopilotClient['createSession']>>;\n type: SessionType;\n}\n\n// MCP server configurations for different integrations\nconst MCP_SERVERS: Record<string, { type: 'http'; url: string; tools: string[] }> = {\n github: {\n type: 'http',\n url: 'https://api.githubcopilot.com/mcp/',\n tools: ['*'],\n },\n};\n\nconst RECOMMENDED_DEFAULT_MODEL = 'gpt-4.1';\n\ninterface RawSdkModel {\n id?: unknown;\n name?: unknown;\n description?: unknown;\n provider?: unknown;\n isDefault?: unknown;\n billing?: {\n multiplier?: unknown;\n };\n supportedReasoningEfforts?: unknown;\n}\n\nexport class CopilotService {\n private client: CopilotClient | null = null;\n private readonly sessions: Map<string, CopilotSession> = new Map();\n private initialized = false;\n private mockMode = false;\n\n constructor(private readonly sessionService: SessionService) {}\n\n async initialize(): Promise<void> {\n try {\n this.client = new CopilotClient();\n await this.client.start();\n this.initialized = true;\n console.log('[CopilotService] Initialized successfully');\n } catch (error) {\n console.error('[CopilotService] Failed to initialize:', error);\n this.mockMode = true;\n this.initialized = true;\n console.warn('[CopilotService] Running in mock mode');\n }\n }\n\n isReady(): boolean {\n return this.initialized;\n }\n\n isMockMode(): boolean {\n return this.mockMode;\n }\n\n async getAuthStatus(): Promise<CopilotAuthStatus> {\n if (this.mockMode || !this.client) {\n return {\n isAuthenticated: false,\n login: null,\n reason: 'Copilot SDK unavailable (mock mode)',\n };\n }\n\n try {\n const client = this.client as unknown as {\n getAuthStatus?: () => Promise<{ isAuthenticated?: unknown; login?: unknown }>;\n };\n\n if (!client.getAuthStatus) {\n return {\n isAuthenticated: false,\n login: null,\n reason: 'Copilot auth API not available in this SDK version',\n };\n }\n\n const auth = await client.getAuthStatus();\n return {\n isAuthenticated: Boolean(auth?.isAuthenticated),\n login: typeof auth?.login === 'string' ? auth.login : null,\n };\n } catch (error) {\n return {\n isAuthenticated: false,\n login: null,\n reason: error instanceof Error ? error.message : 'Failed to get auth status',\n };\n }\n }\n\n async listModels(): Promise<{ models: ModelInfo[]; default: string }> {\n if (this.mockMode || !this.client) {\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n\n try {\n const client = this.client as unknown as {\n listModels?: () => Promise<RawSdkModel[]>;\n };\n\n if (!client.listModels) {\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n\n const rawModels = await client.listModels();\n if (!Array.isArray(rawModels)) {\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n\n const models = rawModels\n .map((raw) => this.normalizeModel(raw))\n .filter((model): model is ModelInfo => Boolean(model?.id));\n\n const recommendedAvailable = models.some((model) => model.id === RECOMMENDED_DEFAULT_MODEL);\n const sdkDefault = models.find((model) => model.isDefault)?.id;\n const fallbackFirst = models[0]?.id;\n\n const defaultModel =\n (recommendedAvailable && RECOMMENDED_DEFAULT_MODEL) ||\n sdkDefault ||\n fallbackFirst ||\n RECOMMENDED_DEFAULT_MODEL;\n\n const modelsWithDefaultFlag = models.map((model) => ({\n ...model,\n isDefault: model.id === defaultModel,\n }));\n\n return { models: modelsWithDefaultFlag, default: defaultModel };\n } catch (error) {\n console.error('[CopilotService] Failed to list models:', error);\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n }\n\n async getQuota(): Promise<CopilotQuotaStatus> {\n if (this.mockMode || !this.client) {\n return {\n used: null,\n included: null,\n remaining: null,\n percentageUsed: null,\n percentageRemaining: null,\n raw: {},\n };\n }\n\n try {\n const client = this.client as unknown as {\n rpc?: {\n account?: {\n getQuota?: () => Promise<unknown>;\n };\n };\n };\n\n const quotaData = await client.rpc?.account?.getQuota?.();\n if (!quotaData || typeof quotaData !== 'object') {\n return {\n used: null,\n included: null,\n remaining: null,\n percentageUsed: null,\n percentageRemaining: null,\n raw: {},\n };\n }\n\n return this.normalizeQuota(quotaData as Record<string, unknown>);\n } catch (error) {\n return {\n used: null,\n included: null,\n remaining: null,\n percentageUsed: null,\n percentageRemaining: null,\n raw: {\n error: error instanceof Error ? error.message : 'Failed to get quota',\n },\n };\n }\n }\n\n async switchSessionModel(\n sessionId: string,\n type: SessionType,\n model: string,\n systemPrompt?: string\n ): Promise<void> {\n const existing = this.sessions.get(sessionId);\n\n if (existing?.session && !this.mockMode) {\n try {\n await existing.session.abort().catch(() => undefined);\n await existing.session.destroy();\n } catch (error) {\n console.warn(`[CopilotService] Failed to destroy previous session before model switch: ${sessionId}`, error);\n }\n }\n\n this.sessions.delete(sessionId);\n\n if (this.client && !this.mockMode) {\n try {\n await this.client.deleteSession(sessionId);\n } catch {\n // Ignore when session files don't exist yet.\n }\n }\n\n await this.createCopilotSession(sessionId, type, model, systemPrompt);\n }\n\n private normalizeModel(raw: RawSdkModel): ModelInfo {\n const id = typeof raw.id === 'string' ? raw.id : '';\n const name = typeof raw.name === 'string' ? raw.name : id;\n const description =\n typeof raw.description === 'string' && raw.description.trim().length > 0\n ? raw.description\n : `AI model ${id}`;\n const provider =\n typeof raw.provider === 'string' && raw.provider.trim().length > 0\n ? raw.provider\n : this.inferProviderFromModelId(id);\n const multiplier =\n typeof raw.billing?.multiplier === 'number' && Number.isFinite(raw.billing.multiplier)\n ? raw.billing.multiplier\n : undefined;\n const supportedReasoningEfforts = Array.isArray(raw.supportedReasoningEfforts)\n ? raw.supportedReasoningEfforts.filter((effort): effort is string => typeof effort === 'string')\n : undefined;\n\n return {\n id,\n name,\n description,\n provider,\n available: true,\n isDefault: Boolean(raw.isDefault),\n pricingMultiplier: multiplier,\n pricingTier: this.mapPricingTier(multiplier),\n supportedReasoningEfforts,\n };\n }\n\n private inferProviderFromModelId(modelId: string): string {\n const normalized = modelId.toLowerCase();\n if (normalized.startsWith('gpt')) return 'openai';\n if (normalized.startsWith('claude')) return 'anthropic';\n if (normalized.startsWith('gemini')) return 'google';\n return 'unknown';\n }\n\n private mapPricingTier(multiplier?: number): ModelPricingTier {\n if (multiplier === 0) return 'free';\n if (typeof multiplier === 'number' && multiplier > 0 && multiplier < 1) return 'cheap';\n if (typeof multiplier === 'number' && multiplier > 1) return 'premium';\n return 'standard';\n }\n\n private normalizeQuota(raw: Record<string, unknown>): CopilotQuotaStatus {\n const used = this.readNumber(raw, ['used', 'consumed', 'usage', 'quotaUsed', 'totalUsed']);\n const included = this.readNumber(raw, ['included', 'limit', 'quota', 'total', 'quotaTotal', 'allowed']);\n const computedRemaining =\n typeof included === 'number' && typeof used === 'number' ? Math.max(included - used, 0) : null;\n const remaining = this.readNumber(raw, ['remaining', 'left', 'available']) ?? computedRemaining;\n\n const computedPercentageUsed =\n typeof included === 'number' && included > 0 && typeof used === 'number'\n ? Math.min(100, (used / included) * 100)\n : null;\n const percentageUsed =\n this.readNumber(raw, ['percentageUsed', 'usedPercent', 'percentUsed']) ?? computedPercentageUsed;\n const percentageRemaining =\n this.readNumber(raw, ['percentageRemaining', 'remainingPercent', 'percentRemaining']) ??\n (typeof percentageUsed === 'number' ? Math.max(0, 100 - percentageUsed) : null);\n\n return {\n used,\n included,\n remaining,\n percentageUsed,\n percentageRemaining,\n periodStart: this.readString(raw, ['periodStart', 'startAt', 'windowStart']),\n periodEnd: this.readString(raw, ['periodEnd', 'endAt', 'windowEnd']),\n raw,\n };\n }\n\n private readNumber(source: Record<string, unknown>, keys: string[]): number | null {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n }\n return null;\n }\n\n private readString(source: Record<string, unknown>, keys: string[]): string | null {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return null;\n }\n\n async createCopilotSession(\n sessionId: string,\n type: SessionType,\n model: string,\n systemPrompt?: string,\n enableMcp: boolean = false\n ): Promise<void> {\n if (this.mockMode || !this.client) {\n // Create mock session\n this.sessions.set(sessionId, {\n sessionId,\n session: null as any,\n type,\n });\n return;\n }\n\n const agentConfig = getAgentConfig(type);\n const typeConfig = SESSION_TYPE_CONFIGS[type];\n\n // Build SDK-compatible tools for DevOps sessions\n // The SDK calls tool.handler() directly and uses the return value as the result\n const tools = type === 'devops' ? this.buildSdkTools() : undefined;\n\n // Build MCP server config if enabled\n const mcpServers = enableMcp ? MCP_SERVERS : undefined;\n\n const session = await this.client.createSession({\n sessionId,\n model: model || typeConfig.defaultModel,\n streaming: true,\n customAgents: agentConfig ? [agentConfig] : undefined,\n systemMessage: systemPrompt ? { content: systemPrompt } : undefined,\n tools,\n mcpServers,\n onPermissionRequest: approveAll,\n });\n\n this.sessions.set(sessionId, { sessionId, session, type });\n }\n\n /**\n * Convert our Tool definitions to Copilot SDK Tool format.\n * The SDK expects tools with a `handler` function — it calls the handler\n * directly and uses the return value as the tool result (no sendToolResult needed).\n */\n private buildSdkTools(): CopilotTool<any>[] {\n return devopsTools.map((tool): CopilotTool<any> => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n handler: async (args: Record<string, unknown>) => {\n console.log(`[CopilotService] Executing tool ${tool.name}`);\n try {\n return await tool.handler(args);\n } catch (error) {\n console.error(`[CopilotService] Tool ${tool.name} failed:`, error);\n return `Error: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n },\n }));\n }\n\n async resumeCopilotSession(sessionId: string): Promise<boolean> {\n if (this.mockMode || !this.client) {\n return true;\n }\n\n // First, try to resume existing session\n try {\n const session = await this.client.resumeSession(sessionId, { onPermissionRequest: approveAll });\n // Try to get type from DB, fallback to 'general'\n const dbSession = this.sessionService.getSession(sessionId);\n this.sessions.set(sessionId, { sessionId, session, type: dbSession?.type || 'general' });\n console.log(`[CopilotService] Session ${sessionId} resumed from disk`);\n return true;\n } catch (resumeError) {\n console.log(`[CopilotService] Could not resume session ${sessionId}, will try to create new`);\n console.log('[CopilotService] Resume error:', resumeError);\n }\n\n // If resume fails, try to create a new session using DB info\n try {\n const dbSession = this.sessionService.getSession(sessionId);\n if (!dbSession) {\n console.error(`[CopilotService] Session ${sessionId} not found in database`);\n return false;\n }\n\n // Create new Copilot session with same parameters\n await this.createCopilotSession(\n sessionId,\n dbSession.type,\n dbSession.model,\n dbSession.systemPrompt || undefined,\n false // MCP disabled by default on recreate\n );\n console.log(`[CopilotService] Session ${sessionId} recreated successfully`);\n return true;\n } catch (createError) {\n console.error(`[CopilotService] Failed to create session ${sessionId}:`, createError);\n return false;\n }\n }\n\n async sendMessage(\n sessionId: string,\n prompt: string,\n context?: MessageContext,\n onEvent?: (event: SessionEvent) => void\n ): Promise<string> {\n return this.withRetry(async () => {\n const copilotSession = this.sessions.get(sessionId);\n \n // Note: The prompt should already be enriched with context by the route\n // We only add basic context fallback if the prompt doesn't contain it\n let fullPrompt = prompt;\n if (context?.selectedText && !prompt.includes(context.selectedText)) {\n fullPrompt = `Context (selected text):\\n${context.selectedText}\\n\\nUser request: ${prompt}`;\n }\n if (context?.pageUrl && !prompt.includes(context.pageUrl)) {\n fullPrompt = `Page: ${context.pageUrl}\\n${fullPrompt}`;\n }\n\n if (this.mockMode || !copilotSession?.session) {\n // Mock response\n return this.generateMockResponse(prompt, context);\n }\n\n let responseContent = '';\n\n // Set up event listener\n if (onEvent) {\n copilotSession.session.on(onEvent);\n }\n\n copilotSession.session.on((event: SessionEvent) => {\n if (event.type === 'assistant.message') {\n responseContent = event.data.content || '';\n }\n });\n\n // Send message - no systemMessage override to preserve Copilot's intelligence\n // The customAgents from session creation provide the persona/expertise\n const response = await copilotSession.session.sendAndWait({ prompt: fullPrompt });\n console.log(`[CopilotService] Received response for session ${sessionId}`);\n console.log('[CopilotService] Response payload:', response?.data);\n console.log(`[CopilotService] responseContent: ${responseContent}...`);\n \n return response?.data.content || responseContent;\n }, 3, 1000);\n }\n\n async streamMessage(\n sessionId: string,\n prompt: string,\n context?: MessageContext,\n onEvent?: (event: SessionEvent) => void,\n attachments?: Array<{ type: 'file' | 'directory'; path: string; displayName?: string }>\n ): Promise<void> {\n let copilotSession = this.sessions.get(sessionId);\n\n // Auto-resume session if not in memory (e.g., after browser restart)\n if (!copilotSession?.session && !this.mockMode) {\n console.log(`[CopilotService] Session ${sessionId} not in memory, attempting auto-resume...`);\n const resumed = await this.resumeCopilotSession(sessionId);\n if (resumed) {\n copilotSession = this.sessions.get(sessionId);\n console.log(`[CopilotService] Session ${sessionId} auto-resumed successfully`);\n } else {\n console.warn(`[CopilotService] Failed to auto-resume session ${sessionId}, falling back to mock`);\n }\n }\n\n // Note: The prompt should already be enriched with context by the route\n // We only add basic context fallback if the prompt doesn't contain it\n let fullPrompt = prompt;\n if (context?.selectedText && !prompt.includes(context.selectedText)) {\n fullPrompt = `Context (selected text):\\n${context.selectedText}\\n\\nUser request: ${prompt}`;\n }\n\n if (this.mockMode || !copilotSession?.session) {\n // Mock streaming response\n console.log('[CopilotService] Streaming mock response');\n await this.streamMockResponse(prompt, context, onEvent);\n return;\n }\n\n console.log('[CopilotService] Starting real stream for session', sessionId);\n if (attachments && attachments.length > 0) {\n console.log(`[CopilotService] Sending ${attachments.length} attachments:`, attachments.map(a => a.path));\n }\n \n // Set up event listener\n if (onEvent) {\n copilotSession.session.on(onEvent);\n }\n\n // Send message with attachments if provided\n // The customAgents from session creation provide the persona/expertise\n await copilotSession.session.send({\n prompt: fullPrompt,\n attachments,\n });\n console.log('[CopilotService] Message sent, waiting for events...');\n }\n\n /**\n * Retry logic for transient errors\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n maxRetries: number = 3,\n delayMs: number = 1000\n ): Promise<T> {\n let lastError: Error | undefined;\n \n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n \n // Don't retry on certain errors\n const nonRetryableErrors = ['authentication', 'invalid_session', 'rate_limit'];\n const errorMessage = (lastError?.message || '').toLowerCase();\n if (nonRetryableErrors.some(e => errorMessage.includes(e))) {\n throw lastError;\n }\n \n if (attempt < maxRetries) {\n console.warn(`[CopilotService] Attempt ${attempt} failed, retrying in ${delayMs}ms...`);\n await new Promise(resolve => setTimeout(resolve, delayMs));\n delayMs *= 2; // Exponential backoff\n }\n }\n }\n \n throw lastError;\n }\n\n /**\n * Get available tools for a session type\n */\n getAvailableTools(type: SessionType): Array<{ name: string; description: string }> {\n if (type === 'devops') {\n return devopsTools.map(t => ({ name: t.name, description: t.description }));\n }\n return [];\n }\n\n /**\n * Execute a tool directly (for testing or standalone use)\n */\n async executeTool(\n toolName: string, \n params: Record<string, unknown>\n ): Promise<{ success: boolean; result?: string; error?: string }> {\n const tool = getToolByName(toolName);\n if (!tool) {\n return { success: false, error: `Unknown tool: ${toolName}` };\n }\n \n try {\n const result = await tool.handler(params);\n return { success: true, result };\n } catch (error) {\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n\n async abortRequest(sessionId: string): Promise<void> {\n const copilotSession = this.sessions.get(sessionId);\n if (copilotSession?.session && !this.mockMode) {\n await copilotSession.session.abort();\n }\n }\n\n async destroySession(sessionId: string): Promise<void> {\n const copilotSession = this.sessions.get(sessionId);\n \n if (copilotSession?.session && !this.mockMode) {\n try {\n // Abort any pending requests first\n await copilotSession.session.abort().catch(() => {});\n // Destroy the session (releases resources but doesn't delete files)\n await copilotSession.session.destroy();\n console.log(`[CopilotService] Session ${sessionId} destroyed successfully`);\n } catch (error) {\n console.error(`[CopilotService] Error destroying session ${sessionId}:`, error);\n // Continue with cleanup even if destroy fails\n }\n }\n \n // Delete session data from disk using SDK's deleteSession\n if (this.client && !this.mockMode) {\n try {\n await this.client.deleteSession(sessionId);\n console.log(`[CopilotService] Session ${sessionId} files deleted from disk`);\n } catch (error) {\n // Session might not exist on disk, that's OK\n console.log('[CopilotService] deleteSession error:', error);\n console.log(`[CopilotService] Could not delete session files (may not exist): ${sessionId}`);\n }\n }\n \n // Remove from in-memory map\n this.sessions.delete(sessionId);\n console.log(`[CopilotService] Session ${sessionId} removed from memory`);\n }\n\n async shutdown(): Promise<void> {\n // Destroy all sessions\n for (const [sessionId, copilotSession] of this.sessions) {\n try {\n if (copilotSession.session && !this.mockMode) {\n await copilotSession.session.destroy();\n }\n } catch (error) {\n console.error(`[CopilotService] Failed to destroy session ${sessionId}:`, error);\n }\n }\n this.sessions.clear();\n\n // Stop client\n if (this.client && !this.mockMode) {\n try {\n await this.client.stop();\n } catch (error) {\n console.error('[CopilotService] Failed to stop client:', error);\n }\n }\n\n this.initialized = false;\n }\n\n // Mock implementations for development without Copilot CLI\n private generateMockResponse(prompt: string, context?: MessageContext): string {\n const action = context?.action;\n \n if (action === 'explain') {\n return `**Explanation:**\\n\\nThis appears to be ${context?.selectedText?.slice(0, 50)}...\\n\\nIn essence, this code/text demonstrates a common pattern used in software development. The key points are:\\n\\n1. It handles a specific use case\\n2. It follows best practices\\n3. It can be extended for additional functionality`;\n }\n \n if (action === 'translate') {\n return `**Translation:**\\n\\n${context?.selectedText || 'No text provided'}`;\n }\n \n if (action === 'rewrite') {\n return `**Rewritten:**\\n\\n${context?.selectedText || prompt}`;\n }\n \n if (action === 'fix_grammar') {\n return `**Corrected:**\\n\\n${context?.selectedText || prompt}`;\n }\n\n return `**Mock Response:**\\n\\nI understand you're asking about: \"${prompt.slice(0, 100)}...\"\\n\\nThis is a mock response because the Copilot SDK is not available. In production, you would receive intelligent responses powered by GitHub Copilot.\\n\\nTo enable real responses:\\n1. Install GitHub Copilot CLI\\n2. Authenticate with your GitHub account\\n3. Restart the DevMentorAI backend`;\n }\n\n private async streamMockResponse(\n prompt: string,\n context?: MessageContext,\n onEvent?: (event: SessionEvent) => void\n ): Promise<void> {\n const response = this.generateMockResponse(prompt, context);\n const words = response.split(' ');\n\n // Simulate streaming with delays\n for (let i = 0; i < words.length; i++) {\n await new Promise(resolve => setTimeout(resolve, 50));\n \n onEvent?.({\n type: 'assistant.message_delta',\n data: { deltaContent: words[i] + (i < words.length - 1 ? ' ' : '') },\n } as SessionEvent);\n }\n\n onEvent?.({\n type: 'assistant.message',\n data: { content: response },\n } as SessionEvent);\n\n onEvent?.({\n type: 'session.idle',\n data: {},\n } as SessionEvent);\n }\n}\n","/**\n * Custom DevOps Analysis Tools for DevMentorAI\n * \n * These tools extend Copilot's capabilities with specialized DevOps functionality:\n * - Configuration file analysis\n * - Infrastructure best practices checking\n * - Log analysis\n * - Cost estimation helpers\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport interface Tool {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, {\n type: string;\n description: string;\n enum?: string[];\n }>;\n required: string[];\n };\n handler: (params: Record<string, unknown>) => Promise<string>;\n}\n\n// Allowed directories for file access (security sandbox)\nconst ALLOWED_DIRECTORIES = [\n process.env.HOME || '/home',\n '/tmp',\n];\n\nfunction isPathAllowed(filePath: string): boolean {\n const resolved = path.resolve(filePath);\n return ALLOWED_DIRECTORIES.some(dir => resolved.startsWith(dir));\n}\n\n/**\n * Read file contents with security checks\n */\nexport const readFileTool: Tool = {\n name: 'read_file',\n description: 'Read the contents of a local file. Use this to analyze configuration files, logs, or code.',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Absolute or relative path to the file to read',\n },\n maxLines: {\n type: 'number',\n description: 'Maximum number of lines to read (default: 500)',\n },\n },\n required: ['path'],\n },\n handler: async (params) => {\n const filePath = params.path as string;\n const maxLines = (params.maxLines as number) || 500;\n\n if (!isPathAllowed(filePath)) {\n return `Error: Access denied. Path \"${filePath}\" is outside allowed directories.`;\n }\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n \n if (lines.length > maxLines) {\n return lines.slice(0, maxLines).join('\\n') + \n `\\n\\n[Truncated: ${lines.length - maxLines} more lines]`;\n }\n \n return content;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return `Error: File not found: ${filePath}`;\n }\n return `Error reading file: ${error}`;\n }\n },\n};\n\n/**\n * List directory contents\n */\nexport const listDirectoryTool: Tool = {\n name: 'list_directory',\n description: 'List contents of a directory. Useful for exploring project structure.',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the directory to list',\n },\n recursive: {\n type: 'boolean',\n description: 'Whether to list recursively (default: false, max depth: 3)',\n },\n },\n required: ['path'],\n },\n handler: async (params) => {\n const dirPath = params.path as string;\n const recursive = params.recursive as boolean || false;\n\n if (!isPathAllowed(dirPath)) {\n return `Error: Access denied. Path \"${dirPath}\" is outside allowed directories.`;\n }\n\n async function listDir(dir: string, depth: number = 0): Promise<string[]> {\n if (depth > 3) return [];\n \n const entries = await fs.readdir(dir, { withFileTypes: true });\n const results: string[] = [];\n \n for (const entry of entries) {\n const prefix = ' '.repeat(depth);\n const fullPath = path.join(dir, entry.name);\n \n if (entry.isDirectory()) {\n results.push(`${prefix}📁 ${entry.name}/`);\n if (recursive) {\n results.push(...await listDir(fullPath, depth + 1));\n }\n } else {\n const stats = await fs.stat(fullPath);\n const size = formatSize(stats.size);\n results.push(`${prefix}📄 ${entry.name} (${size})`);\n }\n }\n \n return results;\n }\n\n try {\n const contents = await listDir(dirPath);\n return contents.join('\\n');\n } catch (error) {\n return `Error listing directory: ${error}`;\n }\n },\n};\n\nfunction formatSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n}\n\n/**\n * Analyze configuration file for best practices\n */\nexport const analyzeConfigTool: Tool = {\n name: 'analyze_config',\n description: 'Analyze a configuration file for DevOps best practices. Supports Kubernetes, Docker, Terraform, and CloudFormation.',\n parameters: {\n type: 'object',\n properties: {\n content: {\n type: 'string',\n description: 'The configuration file content to analyze',\n },\n type: {\n type: 'string',\n enum: ['kubernetes', 'docker', 'terraform', 'cloudformation', 'github-actions', 'auto'],\n description: 'Type of configuration (auto-detect if not specified)',\n },\n },\n required: ['content'],\n },\n handler: async (params) => {\n const content = params.content as string;\n let configType = params.type as string || 'auto';\n\n // Auto-detect config type\n if (configType === 'auto') {\n configType = detectConfigType(content);\n }\n\n const issues: string[] = [];\n const suggestions: string[] = [];\n\n switch (configType) {\n case 'kubernetes':\n analyzeKubernetes(content, issues, suggestions);\n break;\n case 'docker':\n analyzeDocker(content, issues, suggestions);\n break;\n case 'terraform':\n analyzeTerraform(content, issues, suggestions);\n break;\n case 'cloudformation':\n analyzeCloudFormation(content, issues, suggestions);\n break;\n case 'github-actions':\n analyzeGitHubActions(content, issues, suggestions);\n break;\n default:\n return `Could not determine configuration type. Please specify the type parameter.`;\n }\n\n let result = `## Configuration Analysis (${configType})\\n\\n`;\n \n if (issues.length > 0) {\n result += `### ⚠️ Issues Found\\n`;\n issues.forEach((issue, i) => {\n result += `${i + 1}. ${issue}\\n`;\n });\n result += '\\n';\n } else {\n result += `### ✅ No Critical Issues Found\\n\\n`;\n }\n\n if (suggestions.length > 0) {\n result += `### 💡 Suggestions\\n`;\n suggestions.forEach((suggestion, i) => {\n result += `${i + 1}. ${suggestion}\\n`;\n });\n }\n\n return result;\n },\n};\n\nfunction detectConfigType(content: string): string {\n if (content.includes('apiVersion:') && content.includes('kind:')) return 'kubernetes';\n if (content.includes('FROM ') || content.includes('COPY ') || content.includes('RUN ')) return 'docker';\n if (content.includes('resource \"') || content.includes('provider \"')) return 'terraform';\n if (content.includes('AWSTemplateFormatVersion') || content.includes('Resources:')) return 'cloudformation';\n if (content.includes('jobs:') && content.includes('runs-on:')) return 'github-actions';\n return 'unknown';\n}\n\nfunction analyzeKubernetes(content: string, issues: string[], suggestions: string[]): void {\n // Resource limits\n if (!content.includes('resources:') || !content.includes('limits:')) {\n issues.push('Missing resource limits. Pods without limits can consume excessive cluster resources.');\n }\n \n // Security context\n if (!content.includes('securityContext:')) {\n suggestions.push('Consider adding securityContext to restrict container privileges.');\n }\n \n // Image tag\n if (content.includes(':latest')) {\n issues.push('Using :latest tag. Pin specific image versions for reproducible deployments.');\n }\n \n // Probes\n if (!content.includes('livenessProbe:') && !content.includes('readinessProbe:')) {\n suggestions.push('Add health probes (livenessProbe/readinessProbe) for better reliability.');\n }\n \n // Namespace\n if (!content.includes('namespace:')) {\n suggestions.push('Explicitly specify namespace to avoid deploying to default namespace.');\n }\n\n // Run as non-root\n if (content.includes('runAsRoot: true') || content.includes('privileged: true')) {\n issues.push('Container configured to run as root or privileged. This is a security risk.');\n }\n}\n\nfunction analyzeDocker(content: string, issues: string[], suggestions: string[]): void {\n const lines = content.split('\\n');\n \n // Base image\n const fromLine = lines.find(l => l.trim().startsWith('FROM '));\n if (fromLine?.includes(':latest')) {\n issues.push('Using :latest base image. Pin a specific version for reproducible builds.');\n }\n \n // Multiple RUN commands\n const runCount = lines.filter(l => l.trim().startsWith('RUN ')).length;\n if (runCount > 5) {\n suggestions.push(`${runCount} separate RUN commands. Consider combining them to reduce image layers.`);\n }\n \n // COPY vs ADD\n if (content.includes('ADD ') && !content.includes('.tar') && !content.includes('http')) {\n suggestions.push('Use COPY instead of ADD for simple file copying. ADD has extra features that may be unnecessary.');\n }\n \n // .dockerignore reminder\n if (content.includes('COPY . ') || content.includes('COPY ./ ')) {\n suggestions.push('Copying entire context. Ensure .dockerignore is configured to exclude unnecessary files.');\n }\n \n // Non-root user\n if (!content.includes('USER ')) {\n suggestions.push('No USER directive. Consider running as non-root user for security.');\n }\n \n // Multi-stage builds\n if (!content.includes('AS ') && content.includes('npm install') || content.includes('go build')) {\n suggestions.push('Consider multi-stage builds to reduce final image size.');\n }\n}\n\nfunction analyzeTerraform(content: string, issues: string[], suggestions: string[]): void {\n // Version constraints\n if (!content.includes('required_version') && !content.includes('required_providers')) {\n issues.push('Missing version constraints. Pin Terraform and provider versions for reproducibility.');\n }\n \n // Hardcoded values\n const hardcodedPatterns = [\n /ami-[a-z0-9]+/,\n /subnet-[a-z0-9]+/,\n /sg-[a-z0-9]+/,\n /vpc-[a-z0-9]+/,\n ];\n for (const pattern of hardcodedPatterns) {\n if (pattern.test(content)) {\n suggestions.push('Hardcoded AWS resource IDs detected. Consider using data sources or variables.');\n break;\n }\n }\n \n // State backend\n if (!content.includes('backend \"')) {\n suggestions.push('No remote backend configured. Use S3/GCS/Azure for team collaboration.');\n }\n \n // Sensitive variables\n if (content.includes('password') || content.includes('secret') || content.includes('api_key')) {\n if (!content.includes('sensitive = true')) {\n issues.push('Potentially sensitive variables without sensitive = true flag.');\n }\n }\n \n // Encryption\n if (content.includes('aws_s3_bucket') && !content.includes('server_side_encryption')) {\n suggestions.push('S3 bucket without explicit encryption configuration.');\n }\n}\n\nfunction analyzeCloudFormation(content: string, issues: string[], suggestions: string[]): void {\n // DeletionPolicy\n if (content.includes('AWS::RDS::') || content.includes('AWS::S3::Bucket')) {\n if (!content.includes('DeletionPolicy')) {\n issues.push('Stateful resources without DeletionPolicy. Data may be lost on stack deletion.');\n }\n }\n \n // UpdateReplacePolicy\n if (!content.includes('UpdateReplacePolicy')) {\n suggestions.push('Consider adding UpdateReplacePolicy for stateful resources.');\n }\n \n // Stack drift detection hint\n suggestions.push('Run `aws cloudformation detect-stack-drift` regularly to catch manual changes.');\n \n // Parameters without constraints\n if (content.includes('Parameters:') && !content.includes('AllowedValues')) {\n suggestions.push('Consider adding AllowedValues constraints to parameters.');\n }\n}\n\nfunction analyzeGitHubActions(content: string, issues: string[], suggestions: string[]): void {\n // Pinned actions\n if (content.includes('uses: ') && !content.includes('@v') && !content.includes('@sha')) {\n issues.push('Actions without version pinning. Pin to specific versions or SHA for security.');\n }\n \n // Secrets in env\n if (content.includes('${{ secrets.') && content.includes('echo ')) {\n issues.push('Potential secret exposure in echo/print commands.');\n }\n \n // Permissions\n if (!content.includes('permissions:')) {\n suggestions.push('Explicitly define job permissions for better security (least privilege).');\n }\n \n // Caching\n if ((content.includes('npm ') || content.includes('pip ') || content.includes('go ')) && \n !content.includes('actions/cache')) {\n suggestions.push('Consider adding caching to speed up workflows.');\n }\n \n // Timeout\n if (!content.includes('timeout-minutes:')) {\n suggestions.push('Add timeout-minutes to prevent stuck workflows from running indefinitely.');\n }\n}\n\n/**\n * Analyze error logs\n */\nexport const analyzeErrorTool: Tool = {\n name: 'analyze_error',\n description: 'Analyze error messages or logs to diagnose issues and suggest solutions.',\n parameters: {\n type: 'object',\n properties: {\n error: {\n type: 'string',\n description: 'The error message or log content to analyze',\n },\n context: {\n type: 'string',\n enum: ['kubernetes', 'docker', 'terraform', 'aws', 'linux', 'nodejs', 'python', 'general'],\n description: 'Context/environment where the error occurred',\n },\n },\n required: ['error'],\n },\n handler: async (params) => {\n const error = params.error as string;\n const context = params.context as string || 'general';\n\n const analysis: string[] = [];\n const possibleCauses: string[] = [];\n const solutions: string[] = [];\n\n // Common patterns\n if (error.includes('permission denied') || error.includes('EACCES')) {\n possibleCauses.push('Insufficient file system permissions');\n solutions.push('Check file/directory permissions with `ls -la`');\n solutions.push('Try running with appropriate user or `sudo` if necessary');\n }\n\n if (error.includes('connection refused') || error.includes('ECONNREFUSED')) {\n possibleCauses.push('Target service is not running or not listening on expected port');\n solutions.push('Verify the service is running: `systemctl status <service>`');\n solutions.push('Check if the port is open: `netstat -tlnp | grep <port>`');\n }\n\n if (error.includes('out of memory') || error.includes('OOMKilled')) {\n possibleCauses.push('Application exceeded memory limits');\n solutions.push('Increase memory limits if possible');\n solutions.push('Profile memory usage to find leaks');\n solutions.push('Consider horizontal scaling');\n }\n\n if (error.includes('timeout') || error.includes('ETIMEDOUT')) {\n possibleCauses.push('Network latency or unreachable endpoint');\n possibleCauses.push('Slow database queries or API responses');\n solutions.push('Check network connectivity: `ping`, `traceroute`');\n solutions.push('Review and optimize slow queries');\n solutions.push('Consider increasing timeout values');\n }\n\n // Context-specific patterns\n if (context === 'kubernetes') {\n if (error.includes('CrashLoopBackOff')) {\n possibleCauses.push('Container fails to start or crashes immediately');\n solutions.push('Check container logs: `kubectl logs <pod> --previous`');\n solutions.push('Verify image exists and is pullable');\n solutions.push('Check resource limits and requests');\n }\n if (error.includes('ImagePullBackOff')) {\n possibleCauses.push('Cannot pull container image');\n solutions.push('Verify image name and tag');\n solutions.push('Check image registry credentials (imagePullSecrets)');\n }\n }\n\n if (context === 'docker') {\n if (error.includes('no space left on device')) {\n possibleCauses.push('Docker disk space exhausted');\n solutions.push('Clean up: `docker system prune -a`');\n solutions.push('Remove unused images: `docker image prune`');\n }\n }\n\n if (possibleCauses.length === 0) {\n analysis.push('No specific pattern matched. Consider:');\n analysis.push('- Searching the error message in documentation');\n analysis.push('- Checking application logs for more context');\n analysis.push('- Verifying configuration and environment variables');\n }\n\n let result = `## Error Analysis\\n\\n`;\n result += `**Context:** ${context}\\n\\n`;\n \n if (possibleCauses.length > 0) {\n result += `### Possible Causes\\n`;\n possibleCauses.forEach(cause => result += `- ${cause}\\n`);\n result += '\\n';\n }\n \n if (solutions.length > 0) {\n result += `### Suggested Solutions\\n`;\n solutions.forEach((solution, i) => result += `${i + 1}. ${solution}\\n`);\n result += '\\n';\n }\n \n if (analysis.length > 0) {\n result += `### Notes\\n`;\n analysis.forEach(note => result += `${note}\\n`);\n }\n\n return result;\n },\n};\n\n/**\n * Fetch public URL content\n */\nexport const fetchUrlTool: Tool = {\n name: 'fetch_url',\n description: 'Fetch the text content of a public URL. Use this to read documentation, github issues, or other public web pages when the user shares a URL.',\n parameters: {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description: 'The HTTP or HTTPS URL to fetch',\n },\n },\n required: ['url'],\n },\n handler: async (params) => {\n const targetUrl = params.url as string;\n \n if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {\n return `Error: Only HTTP/HTTPS URLs are supported, got \"${targetUrl}\"`;\n }\n\n try {\n // Abort after 10 seconds to avoid hanging\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n \n const response = await fetch(targetUrl, {\n signal: controller.signal,\n headers: {\n 'User-Agent': 'DevMentorAI/1.0',\n 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8',\n },\n });\n \n clearTimeout(timeoutId);\n \n if (!response.ok) {\n return `Error: Server responded with status ${response.status} ${response.statusText}`;\n }\n \n const contentType = response.headers.get('content-type') || '';\n const text = await response.text();\n \n // If it's an HTML page, we should ideally strip tags, but for a simple tool, \n // returning the raw text/HTML up to a reasonable limit is a good start.\n // We'll limit the response size to avoid overwhelming the LLM context.\n const MAX_LENGTH = 15000;\n \n if (text.length > MAX_LENGTH) {\n return text.substring(0, MAX_LENGTH) + `\\n\\n[Content truncated at ${MAX_LENGTH} characters]`;\n }\n \n return text;\n } catch (error) {\n if ((error as any).name === 'AbortError') {\n return `Error: Request to ${targetUrl} timed out after 10 seconds.`;\n }\n return `Error fetching URL: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n};\n\n/**\n * Export all DevOps tools\n */\nexport const devopsTools: Tool[] = [\n readFileTool,\n listDirectoryTool,\n analyzeConfigTool,\n analyzeErrorTool,\n fetchUrlTool,\n];\n\nexport function getToolByName(name: string): Tool | undefined {\n return devopsTools.find(tool => tool.name === name);\n}\n","import type { Database } from 'better-sqlite3';\nimport {\n generateSessionId,\n generateMessageId,\n formatDate,\n getAgentConfig,\n getDefaultModel,\n} from '@devmentorai/shared';\nimport type {\n Session,\n SessionType,\n SessionStatus,\n CreateSessionRequest,\n UpdateSessionRequest,\n Message,\n MessageMetadata,\n PaginatedResponse,\n} from '@devmentorai/shared';\n\ninterface DbSession {\n id: string;\n name: string;\n type: SessionType;\n status: SessionStatus;\n model: string;\n system_prompt: string | null;\n custom_agent: string | null;\n message_count: number;\n created_at: string;\n updated_at: string;\n}\n\ninterface DbMessage {\n id: string;\n session_id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: string;\n metadata: string | null;\n}\n\nexport class SessionService {\n constructor(private readonly db: Database) {}\n\n // Sessions\n listSessions(page = 1, pageSize = 50): PaginatedResponse<Session> {\n const offset = (page - 1) * pageSize;\n \n const countStmt = this.db.prepare('SELECT COUNT(*) as count FROM sessions');\n const count = (countStmt.get() as { count: number }).count;\n\n const stmt = this.db.prepare(`\n SELECT * FROM sessions \n ORDER BY updated_at DESC \n LIMIT ? OFFSET ?\n `);\n const rows = stmt.all(pageSize, offset) as DbSession[];\n\n return {\n items: rows.map(this.mapDbSession),\n total: count,\n page,\n pageSize,\n hasMore: offset + rows.length < count,\n };\n }\n\n getSession(id: string): Session | null {\n const stmt = this.db.prepare('SELECT * FROM sessions WHERE id = ?');\n const row = stmt.get(id) as DbSession | undefined;\n return row ? this.mapDbSession(row) : null;\n }\n\n createSession(request: CreateSessionRequest): Session {\n const id = generateSessionId();\n const now = formatDate();\n const agentConfig = getAgentConfig(request.type);\n const model = request.model || getDefaultModel(request.type);\n \n const stmt = this.db.prepare(`\n INSERT INTO sessions (id, name, type, model, system_prompt, custom_agent, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n id,\n request.name,\n request.type,\n model,\n request.systemPrompt || agentConfig?.prompt || null,\n agentConfig?.name || null,\n now,\n now\n );\n\n return this.getSession(id)!;\n }\n\n updateSession(id: string, request: UpdateSessionRequest): Session | null {\n const session = this.getSession(id);\n if (!session) return null;\n\n const updates: string[] = [];\n const values: (string | number)[] = [];\n\n if (request.name !== undefined) {\n updates.push('name = ?');\n values.push(request.name);\n }\n if (request.status !== undefined) {\n updates.push('status = ?');\n values.push(request.status);\n }\n if (request.model !== undefined) {\n updates.push('model = ?');\n values.push(request.model);\n }\n\n if (updates.length === 0) return session;\n\n updates.push('updated_at = ?');\n values.push(formatDate());\n values.push(id);\n\n const stmt = this.db.prepare(`\n UPDATE sessions SET ${updates.join(', ')} WHERE id = ?\n `);\n stmt.run(...values);\n\n return this.getSession(id);\n }\n\n deleteSession(id: string): boolean {\n const stmt = this.db.prepare('DELETE FROM sessions WHERE id = ?');\n const result = stmt.run(id);\n return result.changes > 0;\n }\n\n incrementMessageCount(sessionId: string): void {\n const stmt = this.db.prepare(`\n UPDATE sessions \n SET message_count = message_count + 1, updated_at = ?\n WHERE id = ?\n `);\n stmt.run(formatDate(), sessionId);\n }\n\n // Messages\n listMessages(sessionId: string, page = 1, pageSize = 100): PaginatedResponse<Message> {\n const offset = (page - 1) * pageSize;\n\n const countStmt = this.db.prepare('SELECT COUNT(*) as count FROM messages WHERE session_id = ?');\n const count = (countStmt.get(sessionId) as { count: number }).count;\n\n const stmt = this.db.prepare(`\n SELECT * FROM messages \n WHERE session_id = ?\n ORDER BY timestamp ASC\n LIMIT ? OFFSET ?\n `);\n const rows = stmt.all(sessionId, pageSize, offset) as DbMessage[];\n\n return {\n items: rows.map(row => this.mapDbMessage(row)),\n total: count,\n page,\n pageSize,\n hasMore: offset + rows.length < count,\n };\n }\n\n addMessage(\n sessionId: string,\n role: 'user' | 'assistant' | 'system',\n content: string,\n metadata?: MessageMetadata\n ): Message {\n const id = generateMessageId();\n const timestamp = formatDate();\n\n const stmt = this.db.prepare(`\n INSERT INTO messages (id, session_id, role, content, timestamp, metadata)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n id,\n sessionId,\n role,\n content,\n timestamp,\n metadata ? JSON.stringify(metadata) : null\n );\n\n this.incrementMessageCount(sessionId);\n\n return {\n id,\n sessionId,\n role,\n content,\n timestamp,\n metadata,\n };\n }\n\n updateMessageContent(messageId: string, content: string): void {\n const stmt = this.db.prepare('UPDATE messages SET content = ? WHERE id = ?');\n stmt.run(content, messageId);\n }\n\n updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): void {\n const stmt = this.db.prepare('UPDATE messages SET metadata = ? WHERE id = ?');\n stmt.run(JSON.stringify(metadata), messageId);\n }\n\n // ============================================================================\n // Context Persistence (Phase 5)\n // ============================================================================\n\n /**\n * Save context for a session (associated with a message)\n */\n saveContext(\n sessionId: string,\n contextJson: string,\n messageId?: string,\n pageUrl?: string,\n pageTitle?: string,\n platform?: string\n ): string {\n const id = `ctx_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n const now = formatDate();\n\n const stmt = this.db.prepare(`\n INSERT INTO session_contexts (id, session_id, message_id, context_json, page_url, page_title, platform, extracted_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(id, sessionId, messageId || null, contextJson, pageUrl || null, pageTitle || null, platform || null, now);\n\n return id;\n }\n\n /**\n * Get the most recent context for a session\n */\n getLatestContext(sessionId: string): { id: string; contextJson: string; pageUrl?: string; platform?: string; extractedAt: string } | null {\n const stmt = this.db.prepare(`\n SELECT id, context_json, page_url, platform, extracted_at\n FROM session_contexts\n WHERE session_id = ?\n ORDER BY extracted_at DESC\n LIMIT 1\n `);\n\n const row = stmt.get(sessionId) as { id: string; context_json: string; page_url: string | null; platform: string | null; extracted_at: string } | undefined;\n\n if (!row) return null;\n\n return {\n id: row.id,\n contextJson: row.context_json,\n pageUrl: row.page_url || undefined,\n platform: row.platform || undefined,\n extractedAt: row.extracted_at,\n };\n }\n\n /**\n * Get context history for a session\n */\n getContextHistory(sessionId: string, limit: number = 10): Array<{\n id: string;\n messageId?: string;\n pageUrl?: string;\n pageTitle?: string;\n platform?: string;\n extractedAt: string;\n }> {\n const stmt = this.db.prepare(`\n SELECT id, message_id, page_url, page_title, platform, extracted_at\n FROM session_contexts\n WHERE session_id = ?\n ORDER BY extracted_at DESC\n LIMIT ?\n `);\n\n const rows = stmt.all(sessionId, limit) as Array<{\n id: string;\n message_id: string | null;\n page_url: string | null;\n page_title: string | null;\n platform: string | null;\n extracted_at: string;\n }>;\n\n return rows.map(row => ({\n id: row.id,\n messageId: row.message_id || undefined,\n pageUrl: row.page_url || undefined,\n pageTitle: row.page_title || undefined,\n platform: row.platform || undefined,\n extractedAt: row.extracted_at,\n }));\n }\n\n /**\n * Get a specific context by ID\n */\n getContext(contextId: string): { id: string; sessionId: string; contextJson: string; extractedAt: string } | null {\n const stmt = this.db.prepare(`\n SELECT id, session_id, context_json, extracted_at\n FROM session_contexts\n WHERE id = ?\n `);\n\n const row = stmt.get(contextId) as { id: string; session_id: string; context_json: string; extracted_at: string } | undefined;\n\n if (!row) return null;\n\n return {\n id: row.id,\n sessionId: row.session_id,\n contextJson: row.context_json,\n extractedAt: row.extracted_at,\n };\n }\n\n /**\n * Clean up old contexts for a session (keep only last N)\n */\n cleanupOldContexts(sessionId: string, keepCount: number = 20): number {\n // Get IDs to keep\n const keepStmt = this.db.prepare(`\n SELECT id FROM session_contexts\n WHERE session_id = ?\n ORDER BY extracted_at DESC\n LIMIT ?\n `);\n const idsToKeep = (keepStmt.all(sessionId, keepCount) as Array<{ id: string }>).map(r => r.id);\n\n if (idsToKeep.length === 0) return 0;\n\n // Delete older contexts\n const deleteStmt = this.db.prepare(`\n DELETE FROM session_contexts\n WHERE session_id = ?\n AND id NOT IN (${idsToKeep.map(() => '?').join(',')})\n `);\n\n const result = deleteStmt.run(sessionId, ...idsToKeep);\n return result.changes;\n }\n\n /**\n * Get context count for a session\n */\n getContextCount(sessionId: string): number {\n const stmt = this.db.prepare('SELECT COUNT(*) as count FROM session_contexts WHERE session_id = ?');\n const result = stmt.get(sessionId) as { count: number };\n return result.count;\n }\n\n private mapDbSession(row: DbSession): Session {\n return {\n id: row.id,\n name: row.name,\n type: row.type,\n status: row.status,\n model: row.model,\n systemPrompt: row.system_prompt || undefined,\n customAgent: row.custom_agent || undefined,\n messageCount: row.message_count,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n private mapDbMessage(row: DbMessage): Message {\n let metadata = row.metadata ? JSON.parse(row.metadata) : undefined;\n \n // Fix legacy image URLs that have incorrect format\n if (metadata?.images) {\n metadata.images = metadata.images.map((img: Record<string, unknown>) => ({\n ...img,\n thumbnailUrl: this.fixImageUrl(img.thumbnailUrl as string | undefined),\n fullImageUrl: this.fixImageUrl(img.fullImageUrl as string | undefined),\n }));\n }\n \n return {\n id: row.id,\n sessionId: row.session_id,\n role: row.role,\n content: row.content,\n timestamp: row.timestamp,\n metadata,\n };\n }\n\n /**\n * Fix legacy image URLs that have incorrect format\n * - Adds missing port (localhost -> localhost:3847)\n * - Removes duplicate \"images/images/\" path\n */\n private fixImageUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n \n let fixed = url;\n \n // Fix missing port: http://localhost/api -> http://localhost:3847/api\n if (fixed.includes('http://localhost/api')) {\n fixed = fixed.replace('http://localhost/api', 'http://localhost:3847/api');\n }\n \n // Fix duplicate images path: /api/images/images/ -> /api/images/\n if (fixed.includes('/api/images/images/')) {\n fixed = fixed.replace('/api/images/images/', '/api/images/');\n }\n \n return fixed;\n }\n}\n","import Database from 'better-sqlite3';\nimport path from 'path';\nimport os from 'os';\nimport fs from 'fs';\n\nconst DB_DIR = path.join(os.homedir(), '.devmentorai');\nconst DB_PATH = path.join(DB_DIR, 'devmentorai.db');\n\nconsole.log(`Database path: ${DB_PATH}`);\n\nexport function initDatabase(): Database.Database {\n // Ensure directory exists\n if (!fs.existsSync(DB_DIR)) {\n fs.mkdirSync(DB_DIR, { recursive: true });\n }\n\n const db = new Database(DB_PATH);\n \n // Enable WAL mode for better performance\n db.pragma('journal_mode = WAL');\n \n // Create tables\n db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n type TEXT NOT NULL CHECK (type IN ('devops', 'writing', 'development', 'general')),\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'closed')),\n model TEXT NOT NULL DEFAULT 'gpt-4.1',\n system_prompt TEXT,\n custom_agent TEXT,\n message_count INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system')),\n content TEXT NOT NULL,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n metadata TEXT,\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n );\n\n -- New table for session context persistence (Phase 5)\n CREATE TABLE IF NOT EXISTS session_contexts (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n message_id TEXT,\n context_json TEXT NOT NULL,\n page_url TEXT,\n page_title TEXT,\n platform TEXT,\n extracted_at TEXT NOT NULL DEFAULT (datetime('now')),\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages(session_id);\n CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp);\n CREATE INDEX IF NOT EXISTS idx_session_contexts_session_id ON session_contexts(session_id);\n CREATE INDEX IF NOT EXISTS idx_session_contexts_extracted_at ON session_contexts(extracted_at);\n `);\n\n return db;\n}\n\nexport type { Database };\n"],"mappings":"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","names":["z","z","userPrompt","resolve","z","fs","path","z","path","fs","fs","path","resolve","path","fs"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/is.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messages.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/linkedMap.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/disposable.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/ral.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/events.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/cancellation.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/semaphore.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messageReader.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messageWriter.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/connection.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/api.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/node/ril.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/node/main.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/node.js","../src/server.ts","../src/routes/health.ts","../src/routes/sessions.ts","../src/services/thumbnail-service.ts","../src/routes/chat.ts","../src/services/context-prompt-builder.ts","../src/routes/models.ts","../src/routes/account.ts","../src/routes/images.ts","../src/routes/updates.ts","../src/routes/tools.ts","../../../node_modules/.pnpm/@github+copilot-sdk@0.1.28/node_modules/@github/copilot-sdk/dist/client.js","../../../node_modules/.pnpm/@github+copilot-sdk@0.1.28/node_modules/@github/copilot-sdk/dist/generated/rpc.js","../../../node_modules/.pnpm/@github+copilot-sdk@0.1.28/node_modules/@github/copilot-sdk/dist/sdkProtocolVersion.js","../../../node_modules/.pnpm/@github+copilot-sdk@0.1.28/node_modules/@github/copilot-sdk/dist/session.js","../../../node_modules/.pnpm/@github+copilot-sdk@0.1.28/node_modules/@github/copilot-sdk/dist/types.js","../src/tools/devops-tools.ts","../src/services/copilot.service.ts","../src/services/session.service.ts","../src/db/index.ts"],"sourcesContent":["\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Message = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType = exports.RequestType0 = exports.AbstractMessageSignature = exports.ParameterStructures = exports.ResponseError = exports.ErrorCodes = void 0;\nconst is = require(\"./is\");\n/**\n * Predefined error codes.\n */\nvar ErrorCodes;\n(function (ErrorCodes) {\n // Defined by JSON RPC\n ErrorCodes.ParseError = -32700;\n ErrorCodes.InvalidRequest = -32600;\n ErrorCodes.MethodNotFound = -32601;\n ErrorCodes.InvalidParams = -32602;\n ErrorCodes.InternalError = -32603;\n /**\n * This is the start range of JSON RPC reserved error codes.\n * It doesn't denote a real error code. No application error codes should\n * be defined between the start and end range. For backwards\n * compatibility the `ServerNotInitialized` and the `UnknownErrorCode`\n * are left in the range.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeStart = -32099;\n /** @deprecated use jsonrpcReservedErrorRangeStart */\n ErrorCodes.serverErrorStart = -32099;\n /**\n * An error occurred when write a message to the transport layer.\n */\n ErrorCodes.MessageWriteError = -32099;\n /**\n * An error occurred when reading a message from the transport layer.\n */\n ErrorCodes.MessageReadError = -32098;\n /**\n * The connection got disposed or lost and all pending responses got\n * rejected.\n */\n ErrorCodes.PendingResponseRejected = -32097;\n /**\n * The connection is inactive and a use of it failed.\n */\n ErrorCodes.ConnectionInactive = -32096;\n /**\n * Error code indicating that a server received a notification or\n * request before the server has received the `initialize` request.\n */\n ErrorCodes.ServerNotInitialized = -32002;\n ErrorCodes.UnknownErrorCode = -32001;\n /**\n * This is the end range of JSON RPC reserved error codes.\n * It doesn't denote a real error code.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeEnd = -32000;\n /** @deprecated use jsonrpcReservedErrorRangeEnd */\n ErrorCodes.serverErrorEnd = -32000;\n})(ErrorCodes || (exports.ErrorCodes = ErrorCodes = {}));\n/**\n * An error object return in a response in case a request\n * has failed.\n */\nclass ResponseError extends Error {\n constructor(code, message, data) {\n super(message);\n this.code = is.number(code) ? code : ErrorCodes.UnknownErrorCode;\n this.data = data;\n Object.setPrototypeOf(this, ResponseError.prototype);\n }\n toJson() {\n const result = {\n code: this.code,\n message: this.message\n };\n if (this.data !== undefined) {\n result.data = this.data;\n }\n return result;\n }\n}\nexports.ResponseError = ResponseError;\nclass ParameterStructures {\n constructor(kind) {\n this.kind = kind;\n }\n static is(value) {\n return value === ParameterStructures.auto || value === ParameterStructures.byName || value === ParameterStructures.byPosition;\n }\n toString() {\n return this.kind;\n }\n}\nexports.ParameterStructures = ParameterStructures;\n/**\n * The parameter structure is automatically inferred on the number of parameters\n * and the parameter type in case of a single param.\n */\nParameterStructures.auto = new ParameterStructures('auto');\n/**\n * Forces `byPosition` parameter structure. This is useful if you have a single\n * parameter which has a literal type.\n */\nParameterStructures.byPosition = new ParameterStructures('byPosition');\n/**\n * Forces `byName` parameter structure. This is only useful when having a single\n * parameter. The library will report errors if used with a different number of\n * parameters.\n */\nParameterStructures.byName = new ParameterStructures('byName');\n/**\n * An abstract implementation of a MessageType.\n */\nclass AbstractMessageSignature {\n constructor(method, numberOfParams) {\n this.method = method;\n this.numberOfParams = numberOfParams;\n }\n get parameterStructures() {\n return ParameterStructures.auto;\n }\n}\nexports.AbstractMessageSignature = AbstractMessageSignature;\n/**\n * Classes to type request response pairs\n */\nclass RequestType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.RequestType0 = RequestType0;\nclass RequestType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType = RequestType;\nclass RequestType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType1 = RequestType1;\nclass RequestType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.RequestType2 = RequestType2;\nclass RequestType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.RequestType3 = RequestType3;\nclass RequestType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.RequestType4 = RequestType4;\nclass RequestType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.RequestType5 = RequestType5;\nclass RequestType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.RequestType6 = RequestType6;\nclass RequestType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.RequestType7 = RequestType7;\nclass RequestType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.RequestType8 = RequestType8;\nclass RequestType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.RequestType9 = RequestType9;\nclass NotificationType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType = NotificationType;\nclass NotificationType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.NotificationType0 = NotificationType0;\nclass NotificationType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType1 = NotificationType1;\nclass NotificationType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.NotificationType2 = NotificationType2;\nclass NotificationType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.NotificationType3 = NotificationType3;\nclass NotificationType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.NotificationType4 = NotificationType4;\nclass NotificationType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.NotificationType5 = NotificationType5;\nclass NotificationType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.NotificationType6 = NotificationType6;\nclass NotificationType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.NotificationType7 = NotificationType7;\nclass NotificationType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.NotificationType8 = NotificationType8;\nclass NotificationType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.NotificationType9 = NotificationType9;\nvar Message;\n(function (Message) {\n /**\n * Tests if the given message is a request message\n */\n function isRequest(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && (is.string(candidate.id) || is.number(candidate.id));\n }\n Message.isRequest = isRequest;\n /**\n * Tests if the given message is a notification message\n */\n function isNotification(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && message.id === void 0;\n }\n Message.isNotification = isNotification;\n /**\n * Tests if the given message is a response message\n */\n function isResponse(message) {\n const candidate = message;\n return candidate && (candidate.result !== void 0 || !!candidate.error) && (is.string(candidate.id) || is.number(candidate.id) || candidate.id === null);\n }\n Message.isResponse = isResponse;\n})(Message || (exports.Message = Message = {}));\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LRUCache = exports.LinkedMap = exports.Touch = void 0;\nvar Touch;\n(function (Touch) {\n Touch.None = 0;\n Touch.First = 1;\n Touch.AsOld = Touch.First;\n Touch.Last = 2;\n Touch.AsNew = Touch.Last;\n})(Touch || (exports.Touch = Touch = {}));\nclass LinkedMap {\n constructor() {\n this[_a] = 'LinkedMap';\n this._map = new Map();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state = 0;\n }\n clear() {\n this._map.clear();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state++;\n }\n isEmpty() {\n return !this._head && !this._tail;\n }\n get size() {\n return this._size;\n }\n get first() {\n return this._head?.value;\n }\n get last() {\n return this._tail?.value;\n }\n has(key) {\n return this._map.has(key);\n }\n get(key, touch = Touch.None) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n return item.value;\n }\n set(key, value, touch = Touch.None) {\n let item = this._map.get(key);\n if (item) {\n item.value = value;\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n }\n else {\n item = { key, value, next: undefined, previous: undefined };\n switch (touch) {\n case Touch.None:\n this.addItemLast(item);\n break;\n case Touch.First:\n this.addItemFirst(item);\n break;\n case Touch.Last:\n this.addItemLast(item);\n break;\n default:\n this.addItemLast(item);\n break;\n }\n this._map.set(key, item);\n this._size++;\n }\n return this;\n }\n delete(key) {\n return !!this.remove(key);\n }\n remove(key) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n this._map.delete(key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n shift() {\n if (!this._head && !this._tail) {\n return undefined;\n }\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n const item = this._head;\n this._map.delete(item.key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n forEach(callbackfn, thisArg) {\n const state = this._state;\n let current = this._head;\n while (current) {\n if (thisArg) {\n callbackfn.bind(thisArg)(current.value, current.key, this);\n }\n else {\n callbackfn(current.value, current.key, this);\n }\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n current = current.next;\n }\n }\n keys() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.key, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n values() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.value, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n entries() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: [current.key, current.value], done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n [(_a = Symbol.toStringTag, Symbol.iterator)]() {\n return this.entries();\n }\n trimOld(newSize) {\n if (newSize >= this.size) {\n return;\n }\n if (newSize === 0) {\n this.clear();\n return;\n }\n let current = this._head;\n let currentSize = this.size;\n while (current && currentSize > newSize) {\n this._map.delete(current.key);\n current = current.next;\n currentSize--;\n }\n this._head = current;\n this._size = currentSize;\n if (current) {\n current.previous = undefined;\n }\n this._state++;\n }\n addItemFirst(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._tail = item;\n }\n else if (!this._head) {\n throw new Error('Invalid list');\n }\n else {\n item.next = this._head;\n this._head.previous = item;\n }\n this._head = item;\n this._state++;\n }\n addItemLast(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._head = item;\n }\n else if (!this._tail) {\n throw new Error('Invalid list');\n }\n else {\n item.previous = this._tail;\n this._tail.next = item;\n }\n this._tail = item;\n this._state++;\n }\n removeItem(item) {\n if (item === this._head && item === this._tail) {\n this._head = undefined;\n this._tail = undefined;\n }\n else if (item === this._head) {\n // This can only happened if size === 1 which is handle\n // by the case above.\n if (!item.next) {\n throw new Error('Invalid list');\n }\n item.next.previous = undefined;\n this._head = item.next;\n }\n else if (item === this._tail) {\n // This can only happened if size === 1 which is handle\n // by the case above.\n if (!item.previous) {\n throw new Error('Invalid list');\n }\n item.previous.next = undefined;\n this._tail = item.previous;\n }\n else {\n const next = item.next;\n const previous = item.previous;\n if (!next || !previous) {\n throw new Error('Invalid list');\n }\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = undefined;\n this._state++;\n }\n touch(item, touch) {\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n if ((touch !== Touch.First && touch !== Touch.Last)) {\n return;\n }\n if (touch === Touch.First) {\n if (item === this._head) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item\n if (item === this._tail) {\n // previous must be defined since item was not head but is tail\n // So there are more than on item in the map\n previous.next = undefined;\n this._tail = previous;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n // Insert the node at head\n item.previous = undefined;\n item.next = this._head;\n this._head.previous = item;\n this._head = item;\n this._state++;\n }\n else if (touch === Touch.Last) {\n if (item === this._tail) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item.\n if (item === this._head) {\n // next must be defined since item was not tail but is head\n // So there are more than on item in the map\n next.previous = undefined;\n this._head = next;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = this._tail;\n this._tail.next = item;\n this._tail = item;\n this._state++;\n }\n }\n toJSON() {\n const data = [];\n this.forEach((value, key) => {\n data.push([key, value]);\n });\n return data;\n }\n fromJSON(data) {\n this.clear();\n for (const [key, value] of data) {\n this.set(key, value);\n }\n }\n}\nexports.LinkedMap = LinkedMap;\nclass LRUCache extends LinkedMap {\n constructor(limit, ratio = 1) {\n super();\n this._limit = limit;\n this._ratio = Math.min(Math.max(0, ratio), 1);\n }\n get limit() {\n return this._limit;\n }\n set limit(limit) {\n this._limit = limit;\n this.checkTrim();\n }\n get ratio() {\n return this._ratio;\n }\n set ratio(ratio) {\n this._ratio = Math.min(Math.max(0, ratio), 1);\n this.checkTrim();\n }\n get(key, touch = Touch.AsNew) {\n return super.get(key, touch);\n }\n peek(key) {\n return super.get(key, Touch.None);\n }\n set(key, value) {\n super.set(key, value, Touch.Last);\n this.checkTrim();\n return this;\n }\n checkTrim() {\n if (this.size > this._limit) {\n this.trimOld(Math.round(this._limit * this._ratio));\n }\n }\n}\nexports.LRUCache = LRUCache;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Disposable = void 0;\nvar Disposable;\n(function (Disposable) {\n function create(func) {\n return {\n dispose: func\n };\n }\n Disposable.create = create;\n})(Disposable || (exports.Disposable = Disposable = {}));\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nlet _ral;\nfunction RAL() {\n if (_ral === undefined) {\n throw new Error(`No runtime abstraction layer installed`);\n }\n return _ral;\n}\n(function (RAL) {\n function install(ral) {\n if (ral === undefined) {\n throw new Error(`No runtime abstraction layer provided`);\n }\n _ral = ral;\n }\n RAL.install = install;\n})(RAL || (RAL = {}));\nexports.default = RAL;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Emitter = exports.Event = void 0;\nconst ral_1 = require(\"./ral\");\nvar Event;\n(function (Event) {\n const _disposable = { dispose() { } };\n Event.None = function () { return _disposable; };\n})(Event || (exports.Event = Event = {}));\nclass CallbackList {\n add(callback, context = null, bucket) {\n if (!this._callbacks) {\n this._callbacks = [];\n this._contexts = [];\n }\n this._callbacks.push(callback);\n this._contexts.push(context);\n if (Array.isArray(bucket)) {\n bucket.push({ dispose: () => this.remove(callback, context) });\n }\n }\n remove(callback, context = null) {\n if (!this._callbacks) {\n return;\n }\n let foundCallbackWithDifferentContext = false;\n for (let i = 0, len = this._callbacks.length; i < len; i++) {\n if (this._callbacks[i] === callback) {\n if (this._contexts[i] === context) {\n // callback & context match => remove it\n this._callbacks.splice(i, 1);\n this._contexts.splice(i, 1);\n return;\n }\n else {\n foundCallbackWithDifferentContext = true;\n }\n }\n }\n if (foundCallbackWithDifferentContext) {\n throw new Error('When adding a listener with a context, you should remove it with the same context');\n }\n }\n invoke(...args) {\n if (!this._callbacks) {\n return [];\n }\n const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);\n for (let i = 0, len = callbacks.length; i < len; i++) {\n try {\n ret.push(callbacks[i].apply(contexts[i], args));\n }\n catch (e) {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.error(e);\n }\n }\n return ret;\n }\n isEmpty() {\n return !this._callbacks || this._callbacks.length === 0;\n }\n dispose() {\n this._callbacks = undefined;\n this._contexts = undefined;\n }\n}\nclass Emitter {\n constructor(_options) {\n this._options = _options;\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n if (!this._event) {\n this._event = (listener, thisArgs, disposables) => {\n if (!this._callbacks) {\n this._callbacks = new CallbackList();\n }\n if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {\n this._options.onFirstListenerAdd(this);\n }\n this._callbacks.add(listener, thisArgs);\n const result = {\n dispose: () => {\n if (!this._callbacks) {\n // disposable is disposed after emitter is disposed.\n return;\n }\n this._callbacks.remove(listener, thisArgs);\n result.dispose = Emitter._noop;\n if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {\n this._options.onLastListenerRemove(this);\n }\n }\n };\n if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n };\n }\n return this._event;\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n if (this._callbacks) {\n this._callbacks.invoke.call(this._callbacks, event);\n }\n }\n dispose() {\n if (this._callbacks) {\n this._callbacks.dispose();\n this._callbacks = undefined;\n }\n }\n}\nexports.Emitter = Emitter;\nEmitter._noop = function () { };\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancellationTokenSource = exports.CancellationToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nvar CancellationToken;\n(function (CancellationToken) {\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: events_1.Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: events_1.Event.None\n });\n function is(value) {\n const candidate = value;\n return candidate && (candidate === CancellationToken.None\n || candidate === CancellationToken.Cancelled\n || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));\n }\n CancellationToken.is = is;\n})(CancellationToken || (exports.CancellationToken = CancellationToken = {}));\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = (0, ral_1.default)().timer.setTimeout(callback.bind(context), 0);\n return { dispose() { handle.dispose(); } };\n});\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new events_1.Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = undefined;\n }\n }\n}\nclass CancellationTokenSource {\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else {\n this._token.cancel();\n }\n }\n dispose() {\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\nexports.CancellationTokenSource = CancellationTokenSource;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SharedArrayReceiverStrategy = exports.SharedArraySenderStrategy = void 0;\nconst cancellation_1 = require(\"./cancellation\");\nvar CancellationState;\n(function (CancellationState) {\n CancellationState.Continue = 0;\n CancellationState.Cancelled = 1;\n})(CancellationState || (CancellationState = {}));\nclass SharedArraySenderStrategy {\n constructor() {\n this.buffers = new Map();\n }\n enableCancellation(request) {\n if (request.id === null) {\n return;\n }\n const buffer = new SharedArrayBuffer(4);\n const data = new Int32Array(buffer, 0, 1);\n data[0] = CancellationState.Continue;\n this.buffers.set(request.id, buffer);\n request.$cancellationData = buffer;\n }\n async sendCancellation(_conn, id) {\n const buffer = this.buffers.get(id);\n if (buffer === undefined) {\n return;\n }\n const data = new Int32Array(buffer, 0, 1);\n Atomics.store(data, 0, CancellationState.Cancelled);\n }\n cleanup(id) {\n this.buffers.delete(id);\n }\n dispose() {\n this.buffers.clear();\n }\n}\nexports.SharedArraySenderStrategy = SharedArraySenderStrategy;\nclass SharedArrayBufferCancellationToken {\n constructor(buffer) {\n this.data = new Int32Array(buffer, 0, 1);\n }\n get isCancellationRequested() {\n return Atomics.load(this.data, 0) === CancellationState.Cancelled;\n }\n get onCancellationRequested() {\n throw new Error(`Cancellation over SharedArrayBuffer doesn't support cancellation events`);\n }\n}\nclass SharedArrayBufferCancellationTokenSource {\n constructor(buffer) {\n this.token = new SharedArrayBufferCancellationToken(buffer);\n }\n cancel() {\n }\n dispose() {\n }\n}\nclass SharedArrayReceiverStrategy {\n constructor() {\n this.kind = 'request';\n }\n createCancellationTokenSource(request) {\n const buffer = request.$cancellationData;\n if (buffer === undefined) {\n return new cancellation_1.CancellationTokenSource();\n }\n return new SharedArrayBufferCancellationTokenSource(buffer);\n }\n}\nexports.SharedArrayReceiverStrategy = SharedArrayReceiverStrategy;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Semaphore = void 0;\nconst ral_1 = require(\"./ral\");\nclass Semaphore {\n constructor(capacity = 1) {\n if (capacity <= 0) {\n throw new Error('Capacity must be greater than 0');\n }\n this._capacity = capacity;\n this._active = 0;\n this._waiting = [];\n }\n lock(thunk) {\n return new Promise((resolve, reject) => {\n this._waiting.push({ thunk, resolve, reject });\n this.runNext();\n });\n }\n get active() {\n return this._active;\n }\n runNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n (0, ral_1.default)().timer.setImmediate(() => this.doRunNext());\n }\n doRunNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n const next = this._waiting.shift();\n this._active++;\n if (this._active > this._capacity) {\n throw new Error(`To many thunks active`);\n }\n try {\n const result = next.thunk();\n if (result instanceof Promise) {\n result.then((value) => {\n this._active--;\n next.resolve(value);\n this.runNext();\n }, (err) => {\n this._active--;\n next.reject(err);\n this.runNext();\n });\n }\n else {\n this._active--;\n next.resolve(result);\n this.runNext();\n }\n }\n catch (err) {\n this._active--;\n next.reject(err);\n this.runNext();\n }\n }\n}\nexports.Semaphore = Semaphore;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nconst semaphore_1 = require(\"./semaphore\");\nvar MessageReader;\n(function (MessageReader) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.listen) && Is.func(candidate.dispose) &&\n Is.func(candidate.onError) && Is.func(candidate.onClose) && Is.func(candidate.onPartialMessage);\n }\n MessageReader.is = is;\n})(MessageReader || (exports.MessageReader = MessageReader = {}));\nclass AbstractMessageReader {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n this.partialMessageEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error) {\n this.errorEmitter.fire(this.asError(error));\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n get onPartialMessage() {\n return this.partialMessageEmitter.event;\n }\n firePartialMessage(info) {\n this.partialMessageEmitter.fire(info);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Reader received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageReader = AbstractMessageReader;\nvar ResolvedMessageReaderOptions;\n(function (ResolvedMessageReaderOptions) {\n function fromOptions(options) {\n let charset;\n let result;\n let contentDecoder;\n const contentDecoders = new Map();\n let contentTypeDecoder;\n const contentTypeDecoders = new Map();\n if (options === undefined || typeof options === 'string') {\n charset = options ?? 'utf-8';\n }\n else {\n charset = options.charset ?? 'utf-8';\n if (options.contentDecoder !== undefined) {\n contentDecoder = options.contentDecoder;\n contentDecoders.set(contentDecoder.name, contentDecoder);\n }\n if (options.contentDecoders !== undefined) {\n for (const decoder of options.contentDecoders) {\n contentDecoders.set(decoder.name, decoder);\n }\n }\n if (options.contentTypeDecoder !== undefined) {\n contentTypeDecoder = options.contentTypeDecoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n if (options.contentTypeDecoders !== undefined) {\n for (const decoder of options.contentTypeDecoders) {\n contentTypeDecoders.set(decoder.name, decoder);\n }\n }\n }\n if (contentTypeDecoder === undefined) {\n contentTypeDecoder = (0, ral_1.default)().applicationJson.decoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n return { charset, contentDecoder, contentDecoders, contentTypeDecoder, contentTypeDecoders };\n }\n ResolvedMessageReaderOptions.fromOptions = fromOptions;\n})(ResolvedMessageReaderOptions || (ResolvedMessageReaderOptions = {}));\nclass ReadableStreamMessageReader extends AbstractMessageReader {\n constructor(readable, options) {\n super();\n this.readable = readable;\n this.options = ResolvedMessageReaderOptions.fromOptions(options);\n this.buffer = (0, ral_1.default)().messageBuffer.create(this.options.charset);\n this._partialMessageTimeout = 10000;\n this.nextMessageLength = -1;\n this.messageToken = 0;\n this.readSemaphore = new semaphore_1.Semaphore(1);\n }\n set partialMessageTimeout(timeout) {\n this._partialMessageTimeout = timeout;\n }\n get partialMessageTimeout() {\n return this._partialMessageTimeout;\n }\n listen(callback) {\n this.nextMessageLength = -1;\n this.messageToken = 0;\n this.partialMessageTimer = undefined;\n this.callback = callback;\n const result = this.readable.onData((data) => {\n this.onData(data);\n });\n this.readable.onError((error) => this.fireError(error));\n this.readable.onClose(() => this.fireClose());\n return result;\n }\n onData(data) {\n try {\n this.buffer.append(data);\n while (true) {\n if (this.nextMessageLength === -1) {\n const headers = this.buffer.tryReadHeaders(true);\n if (!headers) {\n return;\n }\n const contentLength = headers.get('content-length');\n if (!contentLength) {\n this.fireError(new Error(`Header must provide a Content-Length property.\\n${JSON.stringify(Object.fromEntries(headers))}`));\n return;\n }\n const length = parseInt(contentLength);\n if (isNaN(length)) {\n this.fireError(new Error(`Content-Length value must be a number. Got ${contentLength}`));\n return;\n }\n this.nextMessageLength = length;\n }\n const body = this.buffer.tryReadBody(this.nextMessageLength);\n if (body === undefined) {\n /** We haven't received the full message yet. */\n this.setPartialMessageTimer();\n return;\n }\n this.clearPartialMessageTimer();\n this.nextMessageLength = -1;\n // Make sure that we convert one received message after the\n // other. Otherwise it could happen that a decoding of a second\n // smaller message finished before the decoding of a first larger\n // message and then we would deliver the second message first.\n this.readSemaphore.lock(async () => {\n const bytes = this.options.contentDecoder !== undefined\n ? await this.options.contentDecoder.decode(body)\n : body;\n const message = await this.options.contentTypeDecoder.decode(bytes, this.options);\n this.callback(message);\n }).catch((error) => {\n this.fireError(error);\n });\n }\n }\n catch (error) {\n this.fireError(error);\n }\n }\n clearPartialMessageTimer() {\n if (this.partialMessageTimer) {\n this.partialMessageTimer.dispose();\n this.partialMessageTimer = undefined;\n }\n }\n setPartialMessageTimer() {\n this.clearPartialMessageTimer();\n if (this._partialMessageTimeout <= 0) {\n return;\n }\n this.partialMessageTimer = (0, ral_1.default)().timer.setTimeout((token, timeout) => {\n this.partialMessageTimer = undefined;\n if (token === this.messageToken) {\n this.firePartialMessage({ messageToken: token, waitingTime: timeout });\n this.setPartialMessageTimer();\n }\n }, this._partialMessageTimeout, this.messageToken, this._partialMessageTimeout);\n }\n}\nexports.ReadableStreamMessageReader = ReadableStreamMessageReader;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst semaphore_1 = require(\"./semaphore\");\nconst events_1 = require(\"./events\");\nconst ContentLength = 'Content-Length: ';\nconst CRLF = '\\r\\n';\nvar MessageWriter;\n(function (MessageWriter) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) &&\n Is.func(candidate.onError) && Is.func(candidate.write);\n }\n MessageWriter.is = is;\n})(MessageWriter || (exports.MessageWriter = MessageWriter = {}));\nclass AbstractMessageWriter {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error, message, count) {\n this.errorEmitter.fire([this.asError(error), message, count]);\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageWriter = AbstractMessageWriter;\nvar ResolvedMessageWriterOptions;\n(function (ResolvedMessageWriterOptions) {\n function fromOptions(options) {\n if (options === undefined || typeof options === 'string') {\n return { charset: options ?? 'utf-8', contentTypeEncoder: (0, ral_1.default)().applicationJson.encoder };\n }\n else {\n return { charset: options.charset ?? 'utf-8', contentEncoder: options.contentEncoder, contentTypeEncoder: options.contentTypeEncoder ?? (0, ral_1.default)().applicationJson.encoder };\n }\n }\n ResolvedMessageWriterOptions.fromOptions = fromOptions;\n})(ResolvedMessageWriterOptions || (ResolvedMessageWriterOptions = {}));\nclass WriteableStreamMessageWriter extends AbstractMessageWriter {\n constructor(writable, options) {\n super();\n this.writable = writable;\n this.options = ResolvedMessageWriterOptions.fromOptions(options);\n this.errorCount = 0;\n this.writeSemaphore = new semaphore_1.Semaphore(1);\n this.writable.onError((error) => this.fireError(error));\n this.writable.onClose(() => this.fireClose());\n }\n async write(msg) {\n return this.writeSemaphore.lock(async () => {\n const payload = this.options.contentTypeEncoder.encode(msg, this.options).then((buffer) => {\n if (this.options.contentEncoder !== undefined) {\n return this.options.contentEncoder.encode(buffer);\n }\n else {\n return buffer;\n }\n });\n return payload.then((buffer) => {\n const headers = [];\n headers.push(ContentLength, buffer.byteLength.toString(), CRLF);\n headers.push(CRLF);\n return this.doWrite(msg, headers, buffer);\n }, (error) => {\n this.fireError(error);\n throw error;\n });\n });\n }\n async doWrite(msg, headers, data) {\n try {\n await this.writable.write(headers.join(''), 'ascii');\n return this.writable.write(data);\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n this.writable.end();\n }\n}\nexports.WriteableStreamMessageWriter = WriteableStreamMessageWriter;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AbstractMessageBuffer = void 0;\nconst CR = 13;\nconst LF = 10;\nconst CRLF = '\\r\\n';\nclass AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n this._encoding = encoding;\n this._chunks = [];\n this._totalLength = 0;\n }\n get encoding() {\n return this._encoding;\n }\n append(chunk) {\n const toAppend = typeof chunk === 'string' ? this.fromString(chunk, this._encoding) : chunk;\n this._chunks.push(toAppend);\n this._totalLength += toAppend.byteLength;\n }\n tryReadHeaders(lowerCaseKeys = false) {\n if (this._chunks.length === 0) {\n return undefined;\n }\n let state = 0;\n let chunkIndex = 0;\n let offset = 0;\n let chunkBytesRead = 0;\n row: while (chunkIndex < this._chunks.length) {\n const chunk = this._chunks[chunkIndex];\n offset = 0;\n column: while (offset < chunk.length) {\n const value = chunk[offset];\n switch (value) {\n case CR:\n switch (state) {\n case 0:\n state = 1;\n break;\n case 2:\n state = 3;\n break;\n default:\n state = 0;\n }\n break;\n case LF:\n switch (state) {\n case 1:\n state = 2;\n break;\n case 3:\n state = 4;\n offset++;\n break row;\n default:\n state = 0;\n }\n break;\n default:\n state = 0;\n }\n offset++;\n }\n chunkBytesRead += chunk.byteLength;\n chunkIndex++;\n }\n if (state !== 4) {\n return undefined;\n }\n // The buffer contains the two CRLF at the end. So we will\n // have two empty lines after the split at the end as well.\n const buffer = this._read(chunkBytesRead + offset);\n const result = new Map();\n const headers = this.toString(buffer, 'ascii').split(CRLF);\n if (headers.length < 2) {\n return result;\n }\n for (let i = 0; i < headers.length - 2; i++) {\n const header = headers[i];\n const index = header.indexOf(':');\n if (index === -1) {\n throw new Error(`Message header must separate key and value using ':'\\n${header}`);\n }\n const key = header.substr(0, index);\n const value = header.substr(index + 1).trim();\n result.set(lowerCaseKeys ? key.toLowerCase() : key, value);\n }\n return result;\n }\n tryReadBody(length) {\n if (this._totalLength < length) {\n return undefined;\n }\n return this._read(length);\n }\n get numberOfBytes() {\n return this._totalLength;\n }\n _read(byteCount) {\n if (byteCount === 0) {\n return this.emptyBuffer();\n }\n if (byteCount > this._totalLength) {\n throw new Error(`Cannot read so many bytes!`);\n }\n if (this._chunks[0].byteLength === byteCount) {\n // super fast path, precisely first chunk must be returned\n const chunk = this._chunks[0];\n this._chunks.shift();\n this._totalLength -= byteCount;\n return this.asNative(chunk);\n }\n if (this._chunks[0].byteLength > byteCount) {\n // fast path, the reading is entirely within the first chunk\n const chunk = this._chunks[0];\n const result = this.asNative(chunk, byteCount);\n this._chunks[0] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n return result;\n }\n const result = this.allocNative(byteCount);\n let resultOffset = 0;\n let chunkIndex = 0;\n while (byteCount > 0) {\n const chunk = this._chunks[chunkIndex];\n if (chunk.byteLength > byteCount) {\n // this chunk will survive\n const chunkPart = chunk.slice(0, byteCount);\n result.set(chunkPart, resultOffset);\n resultOffset += byteCount;\n this._chunks[chunkIndex] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n byteCount -= byteCount;\n }\n else {\n // this chunk will be entirely read\n result.set(chunk, resultOffset);\n resultOffset += chunk.byteLength;\n this._chunks.shift();\n this._totalLength -= chunk.byteLength;\n byteCount -= chunk.byteLength;\n }\n }\n return result;\n }\n}\nexports.AbstractMessageBuffer = AbstractMessageBuffer;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.ConnectionOptions = exports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.RequestCancellationReceiverStrategy = exports.IdCancellationReceiverStrategy = exports.ConnectionStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.Trace = exports.NullLogger = exports.ProgressType = exports.ProgressToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst messages_1 = require(\"./messages\");\nconst linkedMap_1 = require(\"./linkedMap\");\nconst events_1 = require(\"./events\");\nconst cancellation_1 = require(\"./cancellation\");\nvar CancelNotification;\n(function (CancelNotification) {\n CancelNotification.type = new messages_1.NotificationType('$/cancelRequest');\n})(CancelNotification || (CancelNotification = {}));\nvar ProgressToken;\n(function (ProgressToken) {\n function is(value) {\n return typeof value === 'string' || typeof value === 'number';\n }\n ProgressToken.is = is;\n})(ProgressToken || (exports.ProgressToken = ProgressToken = {}));\nvar ProgressNotification;\n(function (ProgressNotification) {\n ProgressNotification.type = new messages_1.NotificationType('$/progress');\n})(ProgressNotification || (ProgressNotification = {}));\nclass ProgressType {\n constructor() {\n }\n}\nexports.ProgressType = ProgressType;\nvar StarRequestHandler;\n(function (StarRequestHandler) {\n function is(value) {\n return Is.func(value);\n }\n StarRequestHandler.is = is;\n})(StarRequestHandler || (StarRequestHandler = {}));\nexports.NullLogger = Object.freeze({\n error: () => { },\n warn: () => { },\n info: () => { },\n log: () => { }\n});\nvar Trace;\n(function (Trace) {\n Trace[Trace[\"Off\"] = 0] = \"Off\";\n Trace[Trace[\"Messages\"] = 1] = \"Messages\";\n Trace[Trace[\"Compact\"] = 2] = \"Compact\";\n Trace[Trace[\"Verbose\"] = 3] = \"Verbose\";\n})(Trace || (exports.Trace = Trace = {}));\nvar TraceValues;\n(function (TraceValues) {\n /**\n * Turn tracing off.\n */\n TraceValues.Off = 'off';\n /**\n * Trace messages only.\n */\n TraceValues.Messages = 'messages';\n /**\n * Compact message tracing.\n */\n TraceValues.Compact = 'compact';\n /**\n * Verbose message tracing.\n */\n TraceValues.Verbose = 'verbose';\n})(TraceValues || (exports.TraceValues = TraceValues = {}));\n(function (Trace) {\n function fromString(value) {\n if (!Is.string(value)) {\n return Trace.Off;\n }\n value = value.toLowerCase();\n switch (value) {\n case 'off':\n return Trace.Off;\n case 'messages':\n return Trace.Messages;\n case 'compact':\n return Trace.Compact;\n case 'verbose':\n return Trace.Verbose;\n default:\n return Trace.Off;\n }\n }\n Trace.fromString = fromString;\n function toString(value) {\n switch (value) {\n case Trace.Off:\n return 'off';\n case Trace.Messages:\n return 'messages';\n case Trace.Compact:\n return 'compact';\n case Trace.Verbose:\n return 'verbose';\n default:\n return 'off';\n }\n }\n Trace.toString = toString;\n})(Trace || (exports.Trace = Trace = {}));\nvar TraceFormat;\n(function (TraceFormat) {\n TraceFormat[\"Text\"] = \"text\";\n TraceFormat[\"JSON\"] = \"json\";\n})(TraceFormat || (exports.TraceFormat = TraceFormat = {}));\n(function (TraceFormat) {\n function fromString(value) {\n if (!Is.string(value)) {\n return TraceFormat.Text;\n }\n value = value.toLowerCase();\n if (value === 'json') {\n return TraceFormat.JSON;\n }\n else {\n return TraceFormat.Text;\n }\n }\n TraceFormat.fromString = fromString;\n})(TraceFormat || (exports.TraceFormat = TraceFormat = {}));\nvar SetTraceNotification;\n(function (SetTraceNotification) {\n SetTraceNotification.type = new messages_1.NotificationType('$/setTrace');\n})(SetTraceNotification || (exports.SetTraceNotification = SetTraceNotification = {}));\nvar LogTraceNotification;\n(function (LogTraceNotification) {\n LogTraceNotification.type = new messages_1.NotificationType('$/logTrace');\n})(LogTraceNotification || (exports.LogTraceNotification = LogTraceNotification = {}));\nvar ConnectionErrors;\n(function (ConnectionErrors) {\n /**\n * The connection is closed.\n */\n ConnectionErrors[ConnectionErrors[\"Closed\"] = 1] = \"Closed\";\n /**\n * The connection got disposed.\n */\n ConnectionErrors[ConnectionErrors[\"Disposed\"] = 2] = \"Disposed\";\n /**\n * The connection is already in listening mode.\n */\n ConnectionErrors[ConnectionErrors[\"AlreadyListening\"] = 3] = \"AlreadyListening\";\n})(ConnectionErrors || (exports.ConnectionErrors = ConnectionErrors = {}));\nclass ConnectionError extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n Object.setPrototypeOf(this, ConnectionError.prototype);\n }\n}\nexports.ConnectionError = ConnectionError;\nvar ConnectionStrategy;\n(function (ConnectionStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.cancelUndispatched);\n }\n ConnectionStrategy.is = is;\n})(ConnectionStrategy || (exports.ConnectionStrategy = ConnectionStrategy = {}));\nvar IdCancellationReceiverStrategy;\n(function (IdCancellationReceiverStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && (candidate.kind === undefined || candidate.kind === 'id') && Is.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is.func(candidate.dispose));\n }\n IdCancellationReceiverStrategy.is = is;\n})(IdCancellationReceiverStrategy || (exports.IdCancellationReceiverStrategy = IdCancellationReceiverStrategy = {}));\nvar RequestCancellationReceiverStrategy;\n(function (RequestCancellationReceiverStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && candidate.kind === 'request' && Is.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is.func(candidate.dispose));\n }\n RequestCancellationReceiverStrategy.is = is;\n})(RequestCancellationReceiverStrategy || (exports.RequestCancellationReceiverStrategy = RequestCancellationReceiverStrategy = {}));\nvar CancellationReceiverStrategy;\n(function (CancellationReceiverStrategy) {\n CancellationReceiverStrategy.Message = Object.freeze({\n createCancellationTokenSource(_) {\n return new cancellation_1.CancellationTokenSource();\n }\n });\n function is(value) {\n return IdCancellationReceiverStrategy.is(value) || RequestCancellationReceiverStrategy.is(value);\n }\n CancellationReceiverStrategy.is = is;\n})(CancellationReceiverStrategy || (exports.CancellationReceiverStrategy = CancellationReceiverStrategy = {}));\nvar CancellationSenderStrategy;\n(function (CancellationSenderStrategy) {\n CancellationSenderStrategy.Message = Object.freeze({\n sendCancellation(conn, id) {\n return conn.sendNotification(CancelNotification.type, { id });\n },\n cleanup(_) { }\n });\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.sendCancellation) && Is.func(candidate.cleanup);\n }\n CancellationSenderStrategy.is = is;\n})(CancellationSenderStrategy || (exports.CancellationSenderStrategy = CancellationSenderStrategy = {}));\nvar CancellationStrategy;\n(function (CancellationStrategy) {\n CancellationStrategy.Message = Object.freeze({\n receiver: CancellationReceiverStrategy.Message,\n sender: CancellationSenderStrategy.Message\n });\n function is(value) {\n const candidate = value;\n return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender);\n }\n CancellationStrategy.is = is;\n})(CancellationStrategy || (exports.CancellationStrategy = CancellationStrategy = {}));\nvar MessageStrategy;\n(function (MessageStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.handleMessage);\n }\n MessageStrategy.is = is;\n})(MessageStrategy || (exports.MessageStrategy = MessageStrategy = {}));\nvar ConnectionOptions;\n(function (ConnectionOptions) {\n function is(value) {\n const candidate = value;\n return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy) || MessageStrategy.is(candidate.messageStrategy));\n }\n ConnectionOptions.is = is;\n})(ConnectionOptions || (exports.ConnectionOptions = ConnectionOptions = {}));\nvar ConnectionState;\n(function (ConnectionState) {\n ConnectionState[ConnectionState[\"New\"] = 1] = \"New\";\n ConnectionState[ConnectionState[\"Listening\"] = 2] = \"Listening\";\n ConnectionState[ConnectionState[\"Closed\"] = 3] = \"Closed\";\n ConnectionState[ConnectionState[\"Disposed\"] = 4] = \"Disposed\";\n})(ConnectionState || (ConnectionState = {}));\nfunction createMessageConnection(messageReader, messageWriter, _logger, options) {\n const logger = _logger !== undefined ? _logger : exports.NullLogger;\n let sequenceNumber = 0;\n let notificationSequenceNumber = 0;\n let unknownResponseSequenceNumber = 0;\n const version = '2.0';\n let starRequestHandler = undefined;\n const requestHandlers = new Map();\n let starNotificationHandler = undefined;\n const notificationHandlers = new Map();\n const progressHandlers = new Map();\n let timer;\n let messageQueue = new linkedMap_1.LinkedMap();\n let responsePromises = new Map();\n let knownCanceledRequests = new Set();\n let requestTokens = new Map();\n let trace = Trace.Off;\n let traceFormat = TraceFormat.Text;\n let tracer;\n let state = ConnectionState.New;\n const errorEmitter = new events_1.Emitter();\n const closeEmitter = new events_1.Emitter();\n const unhandledNotificationEmitter = new events_1.Emitter();\n const unhandledProgressEmitter = new events_1.Emitter();\n const disposeEmitter = new events_1.Emitter();\n const cancellationStrategy = (options && options.cancellationStrategy) ? options.cancellationStrategy : CancellationStrategy.Message;\n function createRequestQueueKey(id) {\n if (id === null) {\n throw new Error(`Can't send requests with id null since the response can't be correlated.`);\n }\n return 'req-' + id.toString();\n }\n function createResponseQueueKey(id) {\n if (id === null) {\n return 'res-unknown-' + (++unknownResponseSequenceNumber).toString();\n }\n else {\n return 'res-' + id.toString();\n }\n }\n function createNotificationQueueKey() {\n return 'not-' + (++notificationSequenceNumber).toString();\n }\n function addMessageToQueue(queue, message) {\n if (messages_1.Message.isRequest(message)) {\n queue.set(createRequestQueueKey(message.id), message);\n }\n else if (messages_1.Message.isResponse(message)) {\n queue.set(createResponseQueueKey(message.id), message);\n }\n else {\n queue.set(createNotificationQueueKey(), message);\n }\n }\n function cancelUndispatched(_message) {\n return undefined;\n }\n function isListening() {\n return state === ConnectionState.Listening;\n }\n function isClosed() {\n return state === ConnectionState.Closed;\n }\n function isDisposed() {\n return state === ConnectionState.Disposed;\n }\n function closeHandler() {\n if (state === ConnectionState.New || state === ConnectionState.Listening) {\n state = ConnectionState.Closed;\n closeEmitter.fire(undefined);\n }\n // If the connection is disposed don't sent close events.\n }\n function readErrorHandler(error) {\n errorEmitter.fire([error, undefined, undefined]);\n }\n function writeErrorHandler(data) {\n errorEmitter.fire(data);\n }\n messageReader.onClose(closeHandler);\n messageReader.onError(readErrorHandler);\n messageWriter.onClose(closeHandler);\n messageWriter.onError(writeErrorHandler);\n function triggerMessageQueue() {\n if (timer || messageQueue.size === 0) {\n return;\n }\n timer = (0, ral_1.default)().timer.setImmediate(() => {\n timer = undefined;\n processMessageQueue();\n });\n }\n function handleMessage(message) {\n if (messages_1.Message.isRequest(message)) {\n handleRequest(message);\n }\n else if (messages_1.Message.isNotification(message)) {\n handleNotification(message);\n }\n else if (messages_1.Message.isResponse(message)) {\n handleResponse(message);\n }\n else {\n handleInvalidMessage(message);\n }\n }\n function processMessageQueue() {\n if (messageQueue.size === 0) {\n return;\n }\n const message = messageQueue.shift();\n try {\n const messageStrategy = options?.messageStrategy;\n if (MessageStrategy.is(messageStrategy)) {\n messageStrategy.handleMessage(message, handleMessage);\n }\n else {\n handleMessage(message);\n }\n }\n finally {\n triggerMessageQueue();\n }\n }\n const callback = (message) => {\n try {\n // We have received a cancellation message. Check if the message is still in the queue\n // and cancel it if allowed to do so.\n if (messages_1.Message.isNotification(message) && message.method === CancelNotification.type.method) {\n const cancelId = message.params.id;\n const key = createRequestQueueKey(cancelId);\n const toCancel = messageQueue.get(key);\n if (messages_1.Message.isRequest(toCancel)) {\n const strategy = options?.connectionStrategy;\n const response = (strategy && strategy.cancelUndispatched) ? strategy.cancelUndispatched(toCancel, cancelUndispatched) : cancelUndispatched(toCancel);\n if (response && (response.error !== undefined || response.result !== undefined)) {\n messageQueue.delete(key);\n requestTokens.delete(cancelId);\n response.id = toCancel.id;\n traceSendingResponse(response, message.method, Date.now());\n messageWriter.write(response).catch(() => logger.error(`Sending response for canceled message failed.`));\n return;\n }\n }\n const cancellationToken = requestTokens.get(cancelId);\n // The request is already running. Cancel the token\n if (cancellationToken !== undefined) {\n cancellationToken.cancel();\n traceReceivedNotification(message);\n return;\n }\n else {\n // Remember the cancel but still queue the message to\n // clean up state in process message.\n knownCanceledRequests.add(cancelId);\n }\n }\n addMessageToQueue(messageQueue, message);\n }\n finally {\n triggerMessageQueue();\n }\n };\n function handleRequest(requestMessage) {\n if (isDisposed()) {\n // we return here silently since we fired an event when the\n // connection got disposed.\n return;\n }\n function reply(resultOrError, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id\n };\n if (resultOrError instanceof messages_1.ResponseError) {\n message.error = resultOrError.toJson();\n }\n else {\n message.result = resultOrError === undefined ? null : resultOrError;\n }\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n function replyError(error, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n error: error.toJson()\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n function replySuccess(result, method, startTime) {\n // The JSON RPC defines that a response must either have a result or an error\n // So we can't treat undefined as a valid response result.\n if (result === undefined) {\n result = null;\n }\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n result: result\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n traceReceivedRequest(requestMessage);\n const element = requestHandlers.get(requestMessage.method);\n let type;\n let requestHandler;\n if (element) {\n type = element.type;\n requestHandler = element.handler;\n }\n const startTime = Date.now();\n if (requestHandler || starRequestHandler) {\n const tokenKey = requestMessage.id ?? String(Date.now()); //\n const cancellationSource = IdCancellationReceiverStrategy.is(cancellationStrategy.receiver)\n ? cancellationStrategy.receiver.createCancellationTokenSource(tokenKey)\n : cancellationStrategy.receiver.createCancellationTokenSource(requestMessage);\n if (requestMessage.id !== null && knownCanceledRequests.has(requestMessage.id)) {\n cancellationSource.cancel();\n }\n if (requestMessage.id !== null) {\n requestTokens.set(tokenKey, cancellationSource);\n }\n try {\n let handlerResult;\n if (requestHandler) {\n if (requestMessage.params === undefined) {\n if (type !== undefined && type.numberOfParams !== 0) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines ${type.numberOfParams} params but received none.`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(cancellationSource.token);\n }\n else if (Array.isArray(requestMessage.params)) {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byName) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by name but received parameters by position`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(...requestMessage.params, cancellationSource.token);\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by position but received parameters by name`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(requestMessage.params, cancellationSource.token);\n }\n }\n else if (starRequestHandler) {\n handlerResult = starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);\n }\n const promise = handlerResult;\n if (!handlerResult) {\n requestTokens.delete(tokenKey);\n replySuccess(handlerResult, requestMessage.method, startTime);\n }\n else if (promise.then) {\n promise.then((resultOrError) => {\n requestTokens.delete(tokenKey);\n reply(resultOrError, requestMessage.method, startTime);\n }, error => {\n requestTokens.delete(tokenKey);\n if (error instanceof messages_1.ResponseError) {\n replyError(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n });\n }\n else {\n requestTokens.delete(tokenKey);\n reply(handlerResult, requestMessage.method, startTime);\n }\n }\n catch (error) {\n requestTokens.delete(tokenKey);\n if (error instanceof messages_1.ResponseError) {\n reply(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n }\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);\n }\n }\n function handleResponse(responseMessage) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n if (responseMessage.id === null) {\n if (responseMessage.error) {\n logger.error(`Received response message without id: Error is: \\n${JSON.stringify(responseMessage.error, undefined, 4)}`);\n }\n else {\n logger.error(`Received response message without id. No further error information provided.`);\n }\n }\n else {\n const key = responseMessage.id;\n const responsePromise = responsePromises.get(key);\n traceReceivedResponse(responseMessage, responsePromise);\n if (responsePromise !== undefined) {\n responsePromises.delete(key);\n try {\n if (responseMessage.error) {\n const error = responseMessage.error;\n responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));\n }\n else if (responseMessage.result !== undefined) {\n responsePromise.resolve(responseMessage.result);\n }\n else {\n throw new Error('Should never happen.');\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Response handler '${responsePromise.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Response handler '${responsePromise.method}' failed unexpectedly.`);\n }\n }\n }\n }\n }\n function handleNotification(message) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n let type = undefined;\n let notificationHandler;\n if (message.method === CancelNotification.type.method) {\n const cancelId = message.params.id;\n knownCanceledRequests.delete(cancelId);\n traceReceivedNotification(message);\n return;\n }\n else {\n const element = notificationHandlers.get(message.method);\n if (element) {\n notificationHandler = element.handler;\n type = element.type;\n }\n }\n if (notificationHandler || starNotificationHandler) {\n try {\n traceReceivedNotification(message);\n if (notificationHandler) {\n if (message.params === undefined) {\n if (type !== undefined) {\n if (type.numberOfParams !== 0 && type.parameterStructures !== messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received none.`);\n }\n }\n notificationHandler();\n }\n else if (Array.isArray(message.params)) {\n // There are JSON-RPC libraries that send progress message as positional params although\n // specified as named. So convert them if this is the case.\n const params = message.params;\n if (message.method === ProgressNotification.type.method && params.length === 2 && ProgressToken.is(params[0])) {\n notificationHandler({ token: params[0], value: params[1] });\n }\n else {\n if (type !== undefined) {\n if (type.parameterStructures === messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines parameters by name but received parameters by position`);\n }\n if (type.numberOfParams !== message.params.length) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received ${params.length} arguments`);\n }\n }\n notificationHandler(...params);\n }\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n logger.error(`Notification ${message.method} defines parameters by position but received parameters by name`);\n }\n notificationHandler(message.params);\n }\n }\n else if (starNotificationHandler) {\n starNotificationHandler(message.method, message.params);\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Notification handler '${message.method}' failed unexpectedly.`);\n }\n }\n }\n else {\n unhandledNotificationEmitter.fire(message);\n }\n }\n function handleInvalidMessage(message) {\n if (!message) {\n logger.error('Received empty message.');\n return;\n }\n logger.error(`Received message which is neither a response nor a notification message:\\n${JSON.stringify(message, null, 4)}`);\n // Test whether we find an id to reject the promise\n const responseMessage = message;\n if (Is.string(responseMessage.id) || Is.number(responseMessage.id)) {\n const key = responseMessage.id;\n const responseHandler = responsePromises.get(key);\n if (responseHandler) {\n responseHandler.reject(new Error('The received response has neither a result nor an error property.'));\n }\n }\n }\n function stringifyTrace(params) {\n if (params === undefined || params === null) {\n return undefined;\n }\n switch (trace) {\n case Trace.Verbose:\n return JSON.stringify(params, null, 4);\n case Trace.Compact:\n return JSON.stringify(params);\n default:\n return undefined;\n }\n }\n function traceSendingRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('send-request', message);\n }\n }\n function traceSendingNotification(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Sending notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('send-notification', message);\n }\n }\n function traceSendingResponse(message, method, startTime) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.error && message.error.data) {\n data = `Error data: ${stringifyTrace(message.error.data)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${stringifyTrace(message.result)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n tracer.log(`Sending response '${method} - (${message.id})'. Processing request took ${Date.now() - startTime}ms`, data);\n }\n else {\n logLSPMessage('send-response', message);\n }\n }\n function traceReceivedRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n tracer.log(`Received request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('receive-request', message);\n }\n }\n function traceReceivedNotification(message) {\n if (trace === Trace.Off || !tracer || message.method === LogTraceNotification.type.method) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Received notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('receive-notification', message);\n }\n }\n function traceReceivedResponse(message, responsePromise) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.error && message.error.data) {\n data = `Error data: ${stringifyTrace(message.error.data)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${stringifyTrace(message.result)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n if (responsePromise) {\n const error = message.error ? ` Request failed: ${message.error.message} (${message.error.code}).` : '';\n tracer.log(`Received response '${responsePromise.method} - (${message.id})' in ${Date.now() - responsePromise.timerStart}ms.${error}`, data);\n }\n else {\n tracer.log(`Received response ${message.id} without active response promise.`, data);\n }\n }\n else {\n logLSPMessage('receive-response', message);\n }\n }\n function logLSPMessage(type, message) {\n if (!tracer || trace === Trace.Off) {\n return;\n }\n const lspMessage = {\n isLSPMessage: true,\n type,\n message,\n timestamp: Date.now()\n };\n tracer.log(lspMessage);\n }\n function throwIfClosedOrDisposed() {\n if (isClosed()) {\n throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');\n }\n if (isDisposed()) {\n throw new ConnectionError(ConnectionErrors.Disposed, 'Connection is disposed.');\n }\n }\n function throwIfListening() {\n if (isListening()) {\n throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');\n }\n }\n function throwIfNotListening() {\n if (!isListening()) {\n throw new Error('Call listen() first.');\n }\n }\n function undefinedToNull(param) {\n if (param === undefined) {\n return null;\n }\n else {\n return param;\n }\n }\n function nullToUndefined(param) {\n if (param === null) {\n return undefined;\n }\n else {\n return param;\n }\n }\n function isNamedParam(param) {\n return param !== undefined && param !== null && !Array.isArray(param) && typeof param === 'object';\n }\n function computeSingleParam(parameterStructures, param) {\n switch (parameterStructures) {\n case messages_1.ParameterStructures.auto:\n if (isNamedParam(param)) {\n return nullToUndefined(param);\n }\n else {\n return [undefinedToNull(param)];\n }\n case messages_1.ParameterStructures.byName:\n if (!isNamedParam(param)) {\n throw new Error(`Received parameters by name but param is not an object literal.`);\n }\n return nullToUndefined(param);\n case messages_1.ParameterStructures.byPosition:\n return [undefinedToNull(param)];\n default:\n throw new Error(`Unknown parameter structure ${parameterStructures.toString()}`);\n }\n }\n function computeMessageParams(type, params) {\n let result;\n const numberOfParams = type.numberOfParams;\n switch (numberOfParams) {\n case 0:\n result = undefined;\n break;\n case 1:\n result = computeSingleParam(type.parameterStructures, params[0]);\n break;\n default:\n result = [];\n for (let i = 0; i < params.length && i < numberOfParams; i++) {\n result.push(undefinedToNull(params[i]));\n }\n if (params.length < numberOfParams) {\n for (let i = params.length; i < numberOfParams; i++) {\n result.push(null);\n }\n }\n break;\n }\n return result;\n }\n const connection = {\n sendNotification: (type, ...args) => {\n throwIfClosedOrDisposed();\n let method;\n let messageParams;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Received ${numberOfParams} parameters for 'by Name' notification parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n }\n const notificationMessage = {\n jsonrpc: version,\n method: method,\n params: messageParams\n };\n traceSendingNotification(notificationMessage);\n return messageWriter.write(notificationMessage).catch((error) => {\n logger.error(`Sending notification failed.`);\n throw error;\n });\n },\n onNotification: (type, handler) => {\n throwIfClosedOrDisposed();\n let method;\n if (Is.func(type)) {\n starNotificationHandler = type;\n }\n else if (handler) {\n if (Is.string(type)) {\n method = type;\n notificationHandlers.set(type, { type: undefined, handler });\n }\n else {\n method = type.method;\n notificationHandlers.set(type.method, { type, handler });\n }\n }\n return {\n dispose: () => {\n if (method !== undefined) {\n notificationHandlers.delete(method);\n }\n else {\n starNotificationHandler = undefined;\n }\n }\n };\n },\n onProgress: (_type, token, handler) => {\n if (progressHandlers.has(token)) {\n throw new Error(`Progress handler for token ${token} already registered`);\n }\n progressHandlers.set(token, handler);\n return {\n dispose: () => {\n progressHandlers.delete(token);\n }\n };\n },\n sendProgress: (_type, token, value) => {\n // This should not await but simple return to ensure that we don't have another\n // async scheduling. Otherwise one send could overtake another send.\n return connection.sendNotification(ProgressNotification.type, { token, value });\n },\n onUnhandledProgress: unhandledProgressEmitter.event,\n sendRequest: (type, ...args) => {\n throwIfClosedOrDisposed();\n throwIfNotListening();\n let method;\n let messageParams;\n let token = undefined;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n const last = args[args.length - 1];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n if (cancellation_1.CancellationToken.is(last)) {\n paramEnd = paramEnd - 1;\n token = last;\n }\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Received ${numberOfParams} parameters for 'by Name' request parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n const numberOfParams = type.numberOfParams;\n token = cancellation_1.CancellationToken.is(params[numberOfParams]) ? params[numberOfParams] : undefined;\n }\n const id = sequenceNumber++;\n let disposable;\n if (token) {\n disposable = token.onCancellationRequested(() => {\n const p = cancellationStrategy.sender.sendCancellation(connection, id);\n if (p === undefined) {\n logger.log(`Received no promise from cancellation strategy when cancelling id ${id}`);\n return Promise.resolve();\n }\n else {\n return p.catch(() => {\n logger.log(`Sending cancellation messages for id ${id} failed`);\n });\n }\n });\n }\n const requestMessage = {\n jsonrpc: version,\n id: id,\n method: method,\n params: messageParams\n };\n traceSendingRequest(requestMessage);\n if (typeof cancellationStrategy.sender.enableCancellation === 'function') {\n cancellationStrategy.sender.enableCancellation(requestMessage);\n }\n return new Promise(async (resolve, reject) => {\n const resolveWithCleanup = (r) => {\n resolve(r);\n cancellationStrategy.sender.cleanup(id);\n disposable?.dispose();\n };\n const rejectWithCleanup = (r) => {\n reject(r);\n cancellationStrategy.sender.cleanup(id);\n disposable?.dispose();\n };\n const responsePromise = { method: method, timerStart: Date.now(), resolve: resolveWithCleanup, reject: rejectWithCleanup };\n try {\n responsePromises.set(id, responsePromise);\n await messageWriter.write(requestMessage);\n }\n catch (error) {\n // Writing the message failed. So we need to delete it from the response promises and\n // reject it.\n responsePromises.delete(id);\n responsePromise.reject(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, error.message ? error.message : 'Unknown reason'));\n logger.error(`Sending request failed.`);\n throw error;\n }\n });\n },\n onRequest: (type, handler) => {\n throwIfClosedOrDisposed();\n let method = null;\n if (StarRequestHandler.is(type)) {\n method = undefined;\n starRequestHandler = type;\n }\n else if (Is.string(type)) {\n method = null;\n if (handler !== undefined) {\n method = type;\n requestHandlers.set(type, { handler: handler, type: undefined });\n }\n }\n else {\n if (handler !== undefined) {\n method = type.method;\n requestHandlers.set(type.method, { type, handler });\n }\n }\n return {\n dispose: () => {\n if (method === null) {\n return;\n }\n if (method !== undefined) {\n requestHandlers.delete(method);\n }\n else {\n starRequestHandler = undefined;\n }\n }\n };\n },\n hasPendingResponse: () => {\n return responsePromises.size > 0;\n },\n trace: async (_value, _tracer, sendNotificationOrTraceOptions) => {\n let _sendNotification = false;\n let _traceFormat = TraceFormat.Text;\n if (sendNotificationOrTraceOptions !== undefined) {\n if (Is.boolean(sendNotificationOrTraceOptions)) {\n _sendNotification = sendNotificationOrTraceOptions;\n }\n else {\n _sendNotification = sendNotificationOrTraceOptions.sendNotification || false;\n _traceFormat = sendNotificationOrTraceOptions.traceFormat || TraceFormat.Text;\n }\n }\n trace = _value;\n traceFormat = _traceFormat;\n if (trace === Trace.Off) {\n tracer = undefined;\n }\n else {\n tracer = _tracer;\n }\n if (_sendNotification && !isClosed() && !isDisposed()) {\n await connection.sendNotification(SetTraceNotification.type, { value: Trace.toString(_value) });\n }\n },\n onError: errorEmitter.event,\n onClose: closeEmitter.event,\n onUnhandledNotification: unhandledNotificationEmitter.event,\n onDispose: disposeEmitter.event,\n end: () => {\n messageWriter.end();\n },\n dispose: () => {\n if (isDisposed()) {\n return;\n }\n state = ConnectionState.Disposed;\n disposeEmitter.fire(undefined);\n const error = new messages_1.ResponseError(messages_1.ErrorCodes.PendingResponseRejected, 'Pending response rejected since connection got disposed');\n for (const promise of responsePromises.values()) {\n promise.reject(error);\n }\n responsePromises = new Map();\n requestTokens = new Map();\n knownCanceledRequests = new Set();\n messageQueue = new linkedMap_1.LinkedMap();\n // Test for backwards compatibility\n if (Is.func(messageWriter.dispose)) {\n messageWriter.dispose();\n }\n if (Is.func(messageReader.dispose)) {\n messageReader.dispose();\n }\n },\n listen: () => {\n throwIfClosedOrDisposed();\n throwIfListening();\n state = ConnectionState.Listening;\n messageReader.listen(callback);\n },\n inspect: () => {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.log('inspect');\n }\n };\n connection.onNotification(LogTraceNotification.type, (params) => {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n const verbose = trace === Trace.Verbose || trace === Trace.Compact;\n tracer.log(params.message, verbose ? params.verbose : undefined);\n });\n connection.onNotification(ProgressNotification.type, (params) => {\n const handler = progressHandlers.get(params.token);\n if (handler) {\n handler(params.value);\n }\n else {\n unhandledProgressEmitter.fire(params);\n }\n });\n return connection;\n}\nexports.createMessageConnection = createMessageConnection;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n/// <reference path=\"../../typings/thenable.d.ts\" />\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProgressType = exports.ProgressToken = exports.createMessageConnection = exports.NullLogger = exports.ConnectionOptions = exports.ConnectionStrategy = exports.AbstractMessageBuffer = exports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = exports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = exports.SharedArrayReceiverStrategy = exports.SharedArraySenderStrategy = exports.CancellationToken = exports.CancellationTokenSource = exports.Emitter = exports.Event = exports.Disposable = exports.LRUCache = exports.Touch = exports.LinkedMap = exports.ParameterStructures = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.ErrorCodes = exports.ResponseError = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType0 = exports.RequestType = exports.Message = exports.RAL = void 0;\nexports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.Trace = void 0;\nconst messages_1 = require(\"./messages\");\nObject.defineProperty(exports, \"Message\", { enumerable: true, get: function () { return messages_1.Message; } });\nObject.defineProperty(exports, \"RequestType\", { enumerable: true, get: function () { return messages_1.RequestType; } });\nObject.defineProperty(exports, \"RequestType0\", { enumerable: true, get: function () { return messages_1.RequestType0; } });\nObject.defineProperty(exports, \"RequestType1\", { enumerable: true, get: function () { return messages_1.RequestType1; } });\nObject.defineProperty(exports, \"RequestType2\", { enumerable: true, get: function () { return messages_1.RequestType2; } });\nObject.defineProperty(exports, \"RequestType3\", { enumerable: true, get: function () { return messages_1.RequestType3; } });\nObject.defineProperty(exports, \"RequestType4\", { enumerable: true, get: function () { return messages_1.RequestType4; } });\nObject.defineProperty(exports, \"RequestType5\", { enumerable: true, get: function () { return messages_1.RequestType5; } });\nObject.defineProperty(exports, \"RequestType6\", { enumerable: true, get: function () { return messages_1.RequestType6; } });\nObject.defineProperty(exports, \"RequestType7\", { enumerable: true, get: function () { return messages_1.RequestType7; } });\nObject.defineProperty(exports, \"RequestType8\", { enumerable: true, get: function () { return messages_1.RequestType8; } });\nObject.defineProperty(exports, \"RequestType9\", { enumerable: true, get: function () { return messages_1.RequestType9; } });\nObject.defineProperty(exports, \"ResponseError\", { enumerable: true, get: function () { return messages_1.ResponseError; } });\nObject.defineProperty(exports, \"ErrorCodes\", { enumerable: true, get: function () { return messages_1.ErrorCodes; } });\nObject.defineProperty(exports, \"NotificationType\", { enumerable: true, get: function () { return messages_1.NotificationType; } });\nObject.defineProperty(exports, \"NotificationType0\", { enumerable: true, get: function () { return messages_1.NotificationType0; } });\nObject.defineProperty(exports, \"NotificationType1\", { enumerable: true, get: function () { return messages_1.NotificationType1; } });\nObject.defineProperty(exports, \"NotificationType2\", { enumerable: true, get: function () { return messages_1.NotificationType2; } });\nObject.defineProperty(exports, \"NotificationType3\", { enumerable: true, get: function () { return messages_1.NotificationType3; } });\nObject.defineProperty(exports, \"NotificationType4\", { enumerable: true, get: function () { return messages_1.NotificationType4; } });\nObject.defineProperty(exports, \"NotificationType5\", { enumerable: true, get: function () { return messages_1.NotificationType5; } });\nObject.defineProperty(exports, \"NotificationType6\", { enumerable: true, get: function () { return messages_1.NotificationType6; } });\nObject.defineProperty(exports, \"NotificationType7\", { enumerable: true, get: function () { return messages_1.NotificationType7; } });\nObject.defineProperty(exports, \"NotificationType8\", { enumerable: true, get: function () { return messages_1.NotificationType8; } });\nObject.defineProperty(exports, \"NotificationType9\", { enumerable: true, get: function () { return messages_1.NotificationType9; } });\nObject.defineProperty(exports, \"ParameterStructures\", { enumerable: true, get: function () { return messages_1.ParameterStructures; } });\nconst linkedMap_1 = require(\"./linkedMap\");\nObject.defineProperty(exports, \"LinkedMap\", { enumerable: true, get: function () { return linkedMap_1.LinkedMap; } });\nObject.defineProperty(exports, \"LRUCache\", { enumerable: true, get: function () { return linkedMap_1.LRUCache; } });\nObject.defineProperty(exports, \"Touch\", { enumerable: true, get: function () { return linkedMap_1.Touch; } });\nconst disposable_1 = require(\"./disposable\");\nObject.defineProperty(exports, \"Disposable\", { enumerable: true, get: function () { return disposable_1.Disposable; } });\nconst events_1 = require(\"./events\");\nObject.defineProperty(exports, \"Event\", { enumerable: true, get: function () { return events_1.Event; } });\nObject.defineProperty(exports, \"Emitter\", { enumerable: true, get: function () { return events_1.Emitter; } });\nconst cancellation_1 = require(\"./cancellation\");\nObject.defineProperty(exports, \"CancellationTokenSource\", { enumerable: true, get: function () { return cancellation_1.CancellationTokenSource; } });\nObject.defineProperty(exports, \"CancellationToken\", { enumerable: true, get: function () { return cancellation_1.CancellationToken; } });\nconst sharedArrayCancellation_1 = require(\"./sharedArrayCancellation\");\nObject.defineProperty(exports, \"SharedArraySenderStrategy\", { enumerable: true, get: function () { return sharedArrayCancellation_1.SharedArraySenderStrategy; } });\nObject.defineProperty(exports, \"SharedArrayReceiverStrategy\", { enumerable: true, get: function () { return sharedArrayCancellation_1.SharedArrayReceiverStrategy; } });\nconst messageReader_1 = require(\"./messageReader\");\nObject.defineProperty(exports, \"MessageReader\", { enumerable: true, get: function () { return messageReader_1.MessageReader; } });\nObject.defineProperty(exports, \"AbstractMessageReader\", { enumerable: true, get: function () { return messageReader_1.AbstractMessageReader; } });\nObject.defineProperty(exports, \"ReadableStreamMessageReader\", { enumerable: true, get: function () { return messageReader_1.ReadableStreamMessageReader; } });\nconst messageWriter_1 = require(\"./messageWriter\");\nObject.defineProperty(exports, \"MessageWriter\", { enumerable: true, get: function () { return messageWriter_1.MessageWriter; } });\nObject.defineProperty(exports, \"AbstractMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.AbstractMessageWriter; } });\nObject.defineProperty(exports, \"WriteableStreamMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.WriteableStreamMessageWriter; } });\nconst messageBuffer_1 = require(\"./messageBuffer\");\nObject.defineProperty(exports, \"AbstractMessageBuffer\", { enumerable: true, get: function () { return messageBuffer_1.AbstractMessageBuffer; } });\nconst connection_1 = require(\"./connection\");\nObject.defineProperty(exports, \"ConnectionStrategy\", { enumerable: true, get: function () { return connection_1.ConnectionStrategy; } });\nObject.defineProperty(exports, \"ConnectionOptions\", { enumerable: true, get: function () { return connection_1.ConnectionOptions; } });\nObject.defineProperty(exports, \"NullLogger\", { enumerable: true, get: function () { return connection_1.NullLogger; } });\nObject.defineProperty(exports, \"createMessageConnection\", { enumerable: true, get: function () { return connection_1.createMessageConnection; } });\nObject.defineProperty(exports, \"ProgressToken\", { enumerable: true, get: function () { return connection_1.ProgressToken; } });\nObject.defineProperty(exports, \"ProgressType\", { enumerable: true, get: function () { return connection_1.ProgressType; } });\nObject.defineProperty(exports, \"Trace\", { enumerable: true, get: function () { return connection_1.Trace; } });\nObject.defineProperty(exports, \"TraceValues\", { enumerable: true, get: function () { return connection_1.TraceValues; } });\nObject.defineProperty(exports, \"TraceFormat\", { enumerable: true, get: function () { return connection_1.TraceFormat; } });\nObject.defineProperty(exports, \"SetTraceNotification\", { enumerable: true, get: function () { return connection_1.SetTraceNotification; } });\nObject.defineProperty(exports, \"LogTraceNotification\", { enumerable: true, get: function () { return connection_1.LogTraceNotification; } });\nObject.defineProperty(exports, \"ConnectionErrors\", { enumerable: true, get: function () { return connection_1.ConnectionErrors; } });\nObject.defineProperty(exports, \"ConnectionError\", { enumerable: true, get: function () { return connection_1.ConnectionError; } });\nObject.defineProperty(exports, \"CancellationReceiverStrategy\", { enumerable: true, get: function () { return connection_1.CancellationReceiverStrategy; } });\nObject.defineProperty(exports, \"CancellationSenderStrategy\", { enumerable: true, get: function () { return connection_1.CancellationSenderStrategy; } });\nObject.defineProperty(exports, \"CancellationStrategy\", { enumerable: true, get: function () { return connection_1.CancellationStrategy; } });\nObject.defineProperty(exports, \"MessageStrategy\", { enumerable: true, get: function () { return connection_1.MessageStrategy; } });\nconst ral_1 = require(\"./ral\");\nexports.RAL = ral_1.default;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"util\");\nconst api_1 = require(\"../common/api\");\nclass MessageBuffer extends api_1.AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n super(encoding);\n }\n emptyBuffer() {\n return MessageBuffer.emptyBuffer;\n }\n fromString(value, encoding) {\n return Buffer.from(value, encoding);\n }\n toString(value, encoding) {\n if (value instanceof Buffer) {\n return value.toString(encoding);\n }\n else {\n return new util_1.TextDecoder(encoding).decode(value);\n }\n }\n asNative(buffer, length) {\n if (length === undefined) {\n return buffer instanceof Buffer ? buffer : Buffer.from(buffer);\n }\n else {\n return buffer instanceof Buffer ? buffer.slice(0, length) : Buffer.from(buffer, 0, length);\n }\n }\n allocNative(length) {\n return Buffer.allocUnsafe(length);\n }\n}\nMessageBuffer.emptyBuffer = Buffer.allocUnsafe(0);\nclass ReadableStreamWrapper {\n constructor(stream) {\n this.stream = stream;\n }\n onClose(listener) {\n this.stream.on('close', listener);\n return api_1.Disposable.create(() => this.stream.off('close', listener));\n }\n onError(listener) {\n this.stream.on('error', listener);\n return api_1.Disposable.create(() => this.stream.off('error', listener));\n }\n onEnd(listener) {\n this.stream.on('end', listener);\n return api_1.Disposable.create(() => this.stream.off('end', listener));\n }\n onData(listener) {\n this.stream.on('data', listener);\n return api_1.Disposable.create(() => this.stream.off('data', listener));\n }\n}\nclass WritableStreamWrapper {\n constructor(stream) {\n this.stream = stream;\n }\n onClose(listener) {\n this.stream.on('close', listener);\n return api_1.Disposable.create(() => this.stream.off('close', listener));\n }\n onError(listener) {\n this.stream.on('error', listener);\n return api_1.Disposable.create(() => this.stream.off('error', listener));\n }\n onEnd(listener) {\n this.stream.on('end', listener);\n return api_1.Disposable.create(() => this.stream.off('end', listener));\n }\n write(data, encoding) {\n return new Promise((resolve, reject) => {\n const callback = (error) => {\n if (error === undefined || error === null) {\n resolve();\n }\n else {\n reject(error);\n }\n };\n if (typeof data === 'string') {\n this.stream.write(data, encoding, callback);\n }\n else {\n this.stream.write(data, callback);\n }\n });\n }\n end() {\n this.stream.end();\n }\n}\nconst _ril = Object.freeze({\n messageBuffer: Object.freeze({\n create: (encoding) => new MessageBuffer(encoding)\n }),\n applicationJson: Object.freeze({\n encoder: Object.freeze({\n name: 'application/json',\n encode: (msg, options) => {\n try {\n return Promise.resolve(Buffer.from(JSON.stringify(msg, undefined, 0), options.charset));\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n }),\n decoder: Object.freeze({\n name: 'application/json',\n decode: (buffer, options) => {\n try {\n if (buffer instanceof Buffer) {\n return Promise.resolve(JSON.parse(buffer.toString(options.charset)));\n }\n else {\n return Promise.resolve(JSON.parse(new util_1.TextDecoder(options.charset).decode(buffer)));\n }\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n })\n }),\n stream: Object.freeze({\n asReadableStream: (stream) => new ReadableStreamWrapper(stream),\n asWritableStream: (stream) => new WritableStreamWrapper(stream)\n }),\n console: console,\n timer: Object.freeze({\n setTimeout(callback, ms, ...args) {\n const handle = setTimeout(callback, ms, ...args);\n return { dispose: () => clearTimeout(handle) };\n },\n setImmediate(callback, ...args) {\n const handle = setImmediate(callback, ...args);\n return { dispose: () => clearImmediate(handle) };\n },\n setInterval(callback, ms, ...args) {\n const handle = setInterval(callback, ms, ...args);\n return { dispose: () => clearInterval(handle) };\n }\n })\n});\nfunction RIL() {\n return _ril;\n}\n(function (RIL) {\n function install() {\n api_1.RAL.install(_ril);\n }\n RIL.install = install;\n})(RIL || (RIL = {}));\nexports.default = RIL;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.createServerSocketTransport = exports.createClientSocketTransport = exports.createServerPipeTransport = exports.createClientPipeTransport = exports.generateRandomPipeName = exports.StreamMessageWriter = exports.StreamMessageReader = exports.SocketMessageWriter = exports.SocketMessageReader = exports.PortMessageWriter = exports.PortMessageReader = exports.IPCMessageWriter = exports.IPCMessageReader = void 0;\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ----------------------------------------------------------------------------------------- */\nconst ril_1 = require(\"./ril\");\n// Install the node runtime abstract.\nril_1.default.install();\nconst path = require(\"path\");\nconst os = require(\"os\");\nconst crypto_1 = require(\"crypto\");\nconst net_1 = require(\"net\");\nconst api_1 = require(\"../common/api\");\n__exportStar(require(\"../common/api\"), exports);\nclass IPCMessageReader extends api_1.AbstractMessageReader {\n constructor(process) {\n super();\n this.process = process;\n let eventEmitter = this.process;\n eventEmitter.on('error', (error) => this.fireError(error));\n eventEmitter.on('close', () => this.fireClose());\n }\n listen(callback) {\n this.process.on('message', callback);\n return api_1.Disposable.create(() => this.process.off('message', callback));\n }\n}\nexports.IPCMessageReader = IPCMessageReader;\nclass IPCMessageWriter extends api_1.AbstractMessageWriter {\n constructor(process) {\n super();\n this.process = process;\n this.errorCount = 0;\n const eventEmitter = this.process;\n eventEmitter.on('error', (error) => this.fireError(error));\n eventEmitter.on('close', () => this.fireClose);\n }\n write(msg) {\n try {\n if (typeof this.process.send === 'function') {\n this.process.send(msg, undefined, undefined, (error) => {\n if (error) {\n this.errorCount++;\n this.handleError(error, msg);\n }\n else {\n this.errorCount = 0;\n }\n });\n }\n return Promise.resolve();\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n }\n}\nexports.IPCMessageWriter = IPCMessageWriter;\nclass PortMessageReader extends api_1.AbstractMessageReader {\n constructor(port) {\n super();\n this.onData = new api_1.Emitter;\n port.on('close', () => this.fireClose);\n port.on('error', (error) => this.fireError(error));\n port.on('message', (message) => {\n this.onData.fire(message);\n });\n }\n listen(callback) {\n return this.onData.event(callback);\n }\n}\nexports.PortMessageReader = PortMessageReader;\nclass PortMessageWriter extends api_1.AbstractMessageWriter {\n constructor(port) {\n super();\n this.port = port;\n this.errorCount = 0;\n port.on('close', () => this.fireClose());\n port.on('error', (error) => this.fireError(error));\n }\n write(msg) {\n try {\n this.port.postMessage(msg);\n return Promise.resolve();\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n }\n}\nexports.PortMessageWriter = PortMessageWriter;\nclass SocketMessageReader extends api_1.ReadableStreamMessageReader {\n constructor(socket, encoding = 'utf-8') {\n super((0, ril_1.default)().stream.asReadableStream(socket), encoding);\n }\n}\nexports.SocketMessageReader = SocketMessageReader;\nclass SocketMessageWriter extends api_1.WriteableStreamMessageWriter {\n constructor(socket, options) {\n super((0, ril_1.default)().stream.asWritableStream(socket), options);\n this.socket = socket;\n }\n dispose() {\n super.dispose();\n this.socket.destroy();\n }\n}\nexports.SocketMessageWriter = SocketMessageWriter;\nclass StreamMessageReader extends api_1.ReadableStreamMessageReader {\n constructor(readable, encoding) {\n super((0, ril_1.default)().stream.asReadableStream(readable), encoding);\n }\n}\nexports.StreamMessageReader = StreamMessageReader;\nclass StreamMessageWriter extends api_1.WriteableStreamMessageWriter {\n constructor(writable, options) {\n super((0, ril_1.default)().stream.asWritableStream(writable), options);\n }\n}\nexports.StreamMessageWriter = StreamMessageWriter;\nconst XDG_RUNTIME_DIR = process.env['XDG_RUNTIME_DIR'];\nconst safeIpcPathLengths = new Map([\n ['linux', 107],\n ['darwin', 103]\n]);\nfunction generateRandomPipeName() {\n const randomSuffix = (0, crypto_1.randomBytes)(21).toString('hex');\n if (process.platform === 'win32') {\n return `\\\\\\\\.\\\\pipe\\\\vscode-jsonrpc-${randomSuffix}-sock`;\n }\n let result;\n if (XDG_RUNTIME_DIR) {\n result = path.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`);\n }\n else {\n result = path.join(os.tmpdir(), `vscode-${randomSuffix}.sock`);\n }\n const limit = safeIpcPathLengths.get(process.platform);\n if (limit !== undefined && result.length > limit) {\n (0, ril_1.default)().console.warn(`WARNING: IPC handle \"${result}\" is longer than ${limit} characters.`);\n }\n return result;\n}\nexports.generateRandomPipeName = generateRandomPipeName;\nfunction createClientPipeTransport(pipeName, encoding = 'utf-8') {\n let connectResolve;\n const connected = new Promise((resolve, _reject) => {\n connectResolve = resolve;\n });\n return new Promise((resolve, reject) => {\n let server = (0, net_1.createServer)((socket) => {\n server.close();\n connectResolve([\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ]);\n });\n server.on('error', reject);\n server.listen(pipeName, () => {\n server.removeListener('error', reject);\n resolve({\n onConnected: () => { return connected; }\n });\n });\n });\n}\nexports.createClientPipeTransport = createClientPipeTransport;\nfunction createServerPipeTransport(pipeName, encoding = 'utf-8') {\n const socket = (0, net_1.createConnection)(pipeName);\n return [\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ];\n}\nexports.createServerPipeTransport = createServerPipeTransport;\nfunction createClientSocketTransport(port, encoding = 'utf-8') {\n let connectResolve;\n const connected = new Promise((resolve, _reject) => {\n connectResolve = resolve;\n });\n return new Promise((resolve, reject) => {\n const server = (0, net_1.createServer)((socket) => {\n server.close();\n connectResolve([\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ]);\n });\n server.on('error', reject);\n server.listen(port, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve({\n onConnected: () => { return connected; }\n });\n });\n });\n}\nexports.createClientSocketTransport = createClientSocketTransport;\nfunction createServerSocketTransport(port, encoding = 'utf-8') {\n const socket = (0, net_1.createConnection)(port, '127.0.0.1');\n return [\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ];\n}\nexports.createServerSocketTransport = createServerSocketTransport;\nfunction isReadableStream(value) {\n const candidate = value;\n return candidate.read !== undefined && candidate.addListener !== undefined;\n}\nfunction isWritableStream(value) {\n const candidate = value;\n return candidate.write !== undefined && candidate.addListener !== undefined;\n}\nfunction createMessageConnection(input, output, logger, options) {\n if (!logger) {\n logger = api_1.NullLogger;\n }\n const reader = isReadableStream(input) ? new StreamMessageReader(input) : input;\n const writer = isWritableStream(output) ? new StreamMessageWriter(output) : output;\n if (api_1.ConnectionStrategy.is(options)) {\n options = { connectionStrategy: options };\n }\n return (0, api_1.createMessageConnection)(reader, writer, logger, options);\n}\nexports.createMessageConnection = createMessageConnection;\n","/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ----------------------------------------------------------------------------------------- */\n'use strict';\n\nmodule.exports = require('./lib/node/main');","import Fastify from 'fastify';\nimport cors from '@fastify/cors';\nimport { healthRoutes } from './routes/health.js';\nimport { sessionRoutes } from './routes/sessions.js';\nimport { chatRoutes } from './routes/chat.js';\nimport { modelsRoutes } from './routes/models.js';\nimport { accountRoutes } from './routes/account.js';\nimport { imagesRoutes } from './routes/images.js';\nimport { updatesRoutes } from './routes/updates.js';\nimport { registerToolsRoutes } from './routes/tools.js';\nimport { CopilotService } from './services/copilot.service.js';\nimport { SessionService } from './services/session.service.js';\nimport { initDatabase } from './db/index.js';\nimport { DEFAULT_CONFIG } from '@devmentorai/shared';\n\nconst PORT = Number.parseInt(process.env.DEVMENTORAI_PORT || '', 10) || DEFAULT_CONFIG.DEFAULT_PORT;\nconst HOST = '0.0.0.0';\n\n// Observability mode - enable with DEVMENTORAI_DEBUG=true\nconst DEBUG_MODE = true;\n\n/**\n * Truncate long strings for logging\n */\nfunction truncate(str: string | undefined | null, maxLen = 500): string {\n if (!str) return '';\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen) + `... [truncated ${str.length - maxLen} chars]`;\n}\n\nexport async function createServer() {\n const fastify = Fastify({\n // Allow large payloads for image uploads (data URLs can be 10-30MB for full-page screenshots)\n bodyLimit: 50 * 1024 * 1024, // 50MB\n logger: {\n level: DEBUG_MODE ? 'debug' : 'info',\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'HH:MM:ss Z',\n ignore: 'pid,hostname',\n },\n },\n },\n });\n\n // Observability middleware - log all requests and responses\n if (DEBUG_MODE) {\n fastify.log.info('🔍 Debug mode enabled - logging all requests and responses');\n \n // Log after body is parsed\n fastify.addHook('preHandler', async (request) => {\n const body = request.body ? truncate(JSON.stringify(request.body)) : null;\n fastify.log.debug({\n type: '→ REQUEST',\n method: request.method,\n url: request.url,\n headers: {\n 'content-type': request.headers['content-type'],\n 'user-agent': request.headers['user-agent'],\n },\n body: body,\n });\n });\n\n fastify.addHook('onSend', async (request, reply, payload) => {\n const statusCode = reply.statusCode;\n let responseBody: string | null = null;\n \n // Skip logging SSE streams (too verbose)\n if (reply.getHeader('content-type') === 'text/event-stream') {\n responseBody = '[SSE Stream]';\n } else if (typeof payload === 'string') {\n responseBody = truncate(payload);\n } else if (Buffer.isBuffer(payload)) {\n responseBody = truncate(payload.toString());\n }\n \n fastify.log.debug({\n type: '← RESPONSE',\n method: request.method,\n url: request.url,\n statusCode,\n body: responseBody,\n });\n \n return payload;\n });\n\n fastify.addHook('onError', async (request, reply, error) => {\n fastify.log.error({\n type: '✗ ERROR',\n method: request.method,\n url: request.url,\n error: error.message,\n stack: error.stack,\n });\n });\n }\n\n // Initialize database\n const db = initDatabase();\n fastify.log.info('Database initialized');\n\n // Initialize services\n const sessionService = new SessionService(db);\n const copilotService = new CopilotService(sessionService);\n \n try {\n await copilotService.initialize();\n fastify.log.info('CopilotService initialized');\n } catch (err) {\n fastify.log.error({ err }, 'Failed to initialize CopilotService');\n fastify.log.warn('Running in mock mode - Copilot features will be simulated');\n }\n\n // Decorate fastify with services\n fastify.decorate('sessionService', sessionService);\n fastify.decorate('copilotService', copilotService);\n\n // Register plugins\n await fastify.register(cors, {\n origin: true, // Allow all origins in development\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization'],\n });\n\n // Register routes\n await fastify.register(healthRoutes, { prefix: '/api' });\n await fastify.register(sessionRoutes, { prefix: '/api' });\n await fastify.register(chatRoutes, { prefix: '/api' });\n await fastify.register(modelsRoutes, { prefix: '/api' });\n await fastify.register(accountRoutes, { prefix: '/api' });\n await fastify.register(updatesRoutes, { prefix: '/api' });\n await fastify.register(imagesRoutes, { prefix: '/api/images' });\n \n // Register tools routes (not prefixed - has /api in route definitions)\n registerToolsRoutes(fastify, copilotService);\n\n return fastify;\n}\n\nasync function main() {\n const fastify = await createServer();\n let shuttingDown = false;\n\n // Graceful shutdown\n const shutdown = async (\n reason: 'SIGINT' | 'SIGTERM' | 'UNCAUGHT_EXCEPTION',\n error?: unknown,\n ) => {\n if (shuttingDown) return;\n shuttingDown = true;\n\n fastify.log.warn({ reason }, 'Shutting down...');\n if (error) {\n fastify.log.error({ err: error }, 'Fatal process error');\n }\n\n let exitCode = 0;\n try {\n await fastify.copilotService.shutdown();\n await fastify.close();\n } catch (err) {\n exitCode = 1;\n fastify.log.error({ err }, 'Error during shutdown');\n } finally {\n process.exit(exitCode);\n }\n };\n\n process.on('SIGINT', () => {\n void shutdown('SIGINT');\n });\n process.on('SIGTERM', () => {\n void shutdown('SIGTERM');\n });\n\n // Keep process alive on unhandled promise rejections and log root cause.\n process.on('unhandledRejection', (reason) => {\n fastify.log.error({ err: reason }, 'Unhandled promise rejection');\n });\n\n // For uncaught exceptions, perform a controlled shutdown.\n process.on('uncaughtException', (error) => {\n void shutdown('UNCAUGHT_EXCEPTION', error);\n });\n\n // Start server\n try {\n await fastify.listen({ port: PORT, host: HOST });\n fastify.log.info(`🚀 DevMentorAI backend running at http://${HOST}:${PORT}`);\n } catch (error) {\n fastify.log.error(error);\n process.exit(1);\n }\n}\n\ntry {\n await main();\n} catch (error) {\n // Fallback logger for bootstrap failures before Fastify is fully available\n console.error('[DevMentorAI] Fatal startup error:', error);\n process.exit(1);\n}\n\n// Type augmentation for Fastify\ndeclare module 'fastify' {\n interface FastifyInstance {\n sessionService: SessionService;\n copilotService: CopilotService;\n }\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { ApiResponse, HealthResponse } from '@devmentorai/shared';\nimport { checkForUpdate } from '@devmentorai/shared';\nimport { BACKEND_VERSION } from '../version.js';\n\nconst startTime = Date.now();\n\n// Cache update info in background\nlet cachedUpdateInfo: { latestVersion: string; updateAvailable: boolean } | null = null;\n\nasync function refreshUpdateInfo() {\n try {\n const info = await checkForUpdate('backend', BACKEND_VERSION);\n cachedUpdateInfo = { latestVersion: info.latestVersion, updateAvailable: info.hasUpdate };\n } catch {\n // Ignore — keep last cached value\n }\n}\n\n// Check on startup and every hour\nrefreshUpdateInfo();\nsetInterval(refreshUpdateInfo, 60 * 60 * 1000);\n\nexport async function healthRoutes(fastify: FastifyInstance) {\n fastify.get<{\n Reply: ApiResponse<HealthResponse>;\n }>('/health', async (_request, reply) => {\n const copilotService = fastify.copilotService;\n \n const healthData: HealthResponse = {\n status: copilotService.isReady() ? 'healthy' : 'degraded',\n version: BACKEND_VERSION,\n copilotConnected: copilotService.isReady() && !copilotService.isMockMode(),\n uptime: Math.floor((Date.now() - startTime) / 1000),\n timestamp: new Date().toISOString(),\n ...(cachedUpdateInfo || {}),\n };\n\n return reply.send({\n success: true,\n data: healthData,\n });\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport { z } from 'zod';\nimport type {\n ApiResponse,\n PaginatedResponse,\n Session,\n CreateSessionRequest,\n UpdateSessionRequest,\n Message,\n} from '@devmentorai/shared';\nimport { deleteSessionImages } from '../services/thumbnail-service.js';\n\nconst createSessionSchema = z.object({\n name: z.string().min(1).max(100),\n type: z.enum(['devops', 'writing', 'development', 'general']),\n model: z.string().optional(),\n systemPrompt: z.string().optional(),\n});\n\nconst updateSessionSchema = z.object({\n name: z.string().min(1).max(100).optional(),\n status: z.enum(['active', 'paused', 'closed']).optional(),\n model: z.string().min(1).optional(),\n});\n\nexport async function sessionRoutes(fastify: FastifyInstance) {\n // List sessions\n fastify.get<{\n Querystring: { page?: string; pageSize?: string };\n Reply: ApiResponse<PaginatedResponse<Session>>;\n }>('/sessions', async (request, reply) => {\n const page = Number.parseInt(request.query.page || '1', 10);\n const pageSize = Number.parseInt(request.query.pageSize || '50', 10);\n\n const sessions = fastify.sessionService.listSessions(page, pageSize);\n\n return reply.send({\n success: true,\n data: sessions,\n });\n });\n\n // Create session\n fastify.post<{\n Body: CreateSessionRequest;\n Reply: ApiResponse<Session>;\n }>('/sessions', async (request, reply) => {\n try {\n const body = createSessionSchema.parse(request.body);\n console.log('[sessionRoutes] Creating session with body:', body);\n \n // Create in database\n const session = fastify.sessionService.createSession(body);\n \n // Create Copilot session\n await fastify.copilotService.createCopilotSession(\n session.id,\n session.type,\n session.model,\n session.systemPrompt\n );\n\n return reply.code(201).send({\n success: true,\n data: session,\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: { errors: error.errors },\n },\n });\n }\n throw error;\n }\n });\n\n // Get session\n fastify.get<{\n Params: { id: string };\n Reply: ApiResponse<Session>;\n }>('/sessions/:id', async (request, reply) => {\n const session = fastify.sessionService.getSession(request.params.id);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n return reply.send({\n success: true,\n data: session,\n });\n });\n\n // Update session\n fastify.patch<{\n Params: { id: string };\n Body: UpdateSessionRequest;\n Reply: ApiResponse<Session>;\n }>('/sessions/:id', async (request, reply) => {\n try {\n const body = updateSessionSchema.parse(request.body);\n const currentSession = fastify.sessionService.getSession(request.params.id);\n\n if (!currentSession) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n if (body.model && body.model !== currentSession.model) {\n await fastify.copilotService.switchSessionModel(\n currentSession.id,\n currentSession.type,\n body.model,\n currentSession.systemPrompt\n );\n }\n\n const session = fastify.sessionService.updateSession(request.params.id, body);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n return reply.send({\n success: true,\n data: session,\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: { errors: error.errors },\n },\n });\n }\n throw error;\n }\n });\n\n // Delete session\n fastify.delete<{\n Params: { id: string };\n Reply: ApiResponse<{ deleted: boolean; sessionId: string }>;\n }>('/sessions/:id', async (request, reply) => {\n const sessionId = request.params.id;\n \n console.log(`[SessionRoute] Deleting session: ${sessionId}`);\n\n // First check if session exists\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Destroy Copilot session first (handles cleanup of SDK resources)\n try {\n await fastify.copilotService.destroySession(sessionId);\n } catch (error) {\n console.error(`[SessionRoute] Error destroying Copilot session:`, error);\n // Continue with DB deletion even if Copilot cleanup fails\n }\n\n // Clean up images for this session\n try {\n deleteSessionImages(sessionId);\n } catch (error) {\n console.error(`[SessionRoute] Error deleting session images:`, error);\n // Continue with DB deletion even if image cleanup fails\n }\n\n // Delete from database (CASCADE will delete messages)\n const deleted = fastify.sessionService.deleteSession(sessionId);\n \n console.log(`[SessionRoute] Session ${sessionId} deleted: ${deleted}`);\n\n return reply.code(200).send({ \n success: true,\n data: { deleted, sessionId }\n });\n });\n\n // Resume session\n fastify.post<{\n Params: { id: string };\n Reply: ApiResponse<Session>;\n }>('/sessions/:id/resume', async (request, reply) => {\n const sessionId = request.params.id;\n const session = fastify.sessionService.getSession(sessionId);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Resume Copilot session\n const resumed = await fastify.copilotService.resumeCopilotSession(sessionId);\n\n if (!resumed) {\n // Create new Copilot session if resume failed\n await fastify.copilotService.createCopilotSession(\n session.id,\n session.type,\n session.model,\n session.systemPrompt\n );\n }\n\n // Update status to active\n const updatedSession = fastify.sessionService.updateSession(sessionId, { status: 'active' });\n\n return reply.send({\n success: true,\n data: updatedSession!,\n });\n });\n\n // Abort request\n fastify.post<{\n Params: { id: string };\n Reply: ApiResponse<void>;\n }>('/sessions/:id/abort', async (request, reply) => {\n await fastify.copilotService.abortRequest(request.params.id);\n\n return reply.send({\n success: true,\n });\n });\n\n // Get session messages\n fastify.get<{\n Params: { id: string };\n Querystring: { page?: string; pageSize?: string };\n Reply: ApiResponse<PaginatedResponse<Message>>;\n }>('/sessions/:id/messages', async (request, reply) => {\n const session = fastify.sessionService.getSession(request.params.id);\n\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const page = Number.parseInt(request.query.page || '1', 10);\n const pageSize = Number.parseInt(request.query.pageSize || '100', 10);\n\n const messages = fastify.sessionService.listMessages(request.params.id, page, pageSize);\n\n return reply.send({\n success: true,\n data: messages,\n });\n });\n}\n","/**\n * ThumbnailService\n * \n * Handles image processing and thumbnail generation.\n * Stores thumbnails AND full images on disk and provides URLs for serving.\n */\n\nimport sharp from 'sharp';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n getMessageImagesDir,\n getSessionImagesDir,\n getThumbnailPath,\n toRelativePath,\n toImageRelativePath,\n toUrlPath,\n ensureDir,\n deleteDir,\n fileExists,\n} from '../lib/paths.js';\nimport type { ImageAttachment, ImageSource, ImageMimeType } from '@devmentorai/shared';\n\n/** Thumbnail generation settings */\nconst THUMBNAIL_CONFIG = {\n maxDimension: 200,\n quality: 60,\n format: 'jpeg' as const,\n};\n\n/** Full image generation settings */\nconst FULL_IMAGE_CONFIG = {\n maxDimension: 2000,\n quality: 80,\n format: 'jpeg' as const,\n};\n\nexport interface ImageInput {\n id: string;\n dataUrl: string;\n mimeType: ImageMimeType;\n source: ImageSource;\n}\n\nexport interface ProcessedImage {\n id: string;\n source: ImageSource;\n mimeType: ImageMimeType;\n dimensions: { width: number; height: number };\n fileSize: number;\n timestamp: string;\n thumbnailUrl: string;\n /** Relative path for DB storage */\n thumbnailPath: string;\n /** Absolute path to full image (for Copilot SDK attachments) */\n fullImagePath: string;\n /** URL to serve full image to client */\n fullImageUrl: string;\n}\n\n/**\n * Extract base64 data and mime type from a data URL\n */\nfunction parseDataUrl(dataUrl: string): { buffer: Buffer; mimeType: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n \n const [, mimeType, base64Data] = match;\n const buffer = Buffer.from(base64Data, 'base64');\n \n return { buffer, mimeType };\n}\n\n/**\n * Get image dimensions from a buffer\n */\nasync function getImageDimensions(buffer: Buffer): Promise<{ width: number; height: number }> {\n const metadata = await sharp(buffer).metadata();\n return {\n width: metadata.width || 0,\n height: metadata.height || 0,\n };\n}\n\n/**\n * Generate a thumbnail from an image buffer\n */\nasync function generateThumbnail(buffer: Buffer): Promise<Buffer> {\n return sharp(buffer)\n .resize(THUMBNAIL_CONFIG.maxDimension, THUMBNAIL_CONFIG.maxDimension, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .jpeg({ quality: THUMBNAIL_CONFIG.quality })\n .toBuffer();\n}\n\n/**\n * Generate a compressed full-size image from an image buffer\n */\nasync function generateFullImage(buffer: Buffer): Promise<Buffer> {\n return sharp(buffer)\n .resize(FULL_IMAGE_CONFIG.maxDimension, FULL_IMAGE_CONFIG.maxDimension, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .jpeg({ quality: FULL_IMAGE_CONFIG.quality })\n .toBuffer();\n}\n\n/**\n * Get the file extension for a MIME type\n */\nfunction getExtensionForMimeType(mimeType: string): string {\n const extensions: Record<string, string> = {\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/webp': 'webp',\n 'image/gif': 'gif',\n };\n return extensions[mimeType] || 'jpg';\n}\n\n/**\n * Get the file path for a full image\n */\nexport function getFullImagePath(sessionId: string, messageId: string, index: number, extension: string): string {\n const messageDir = getMessageImagesDir(sessionId, messageId);\n return path.join(messageDir, `image_${index}.${extension}`);\n}\n\n/**\n * Process images for a message, generating and storing thumbnails AND full images\n * \n * @param sessionId - The session ID\n * @param messageId - The message ID\n * @param images - Array of image inputs with data URLs\n * @param backendUrl - Base URL for thumbnail serving\n * @returns Array of processed images with thumbnail URLs and full image paths\n */\nexport async function processMessageImages(\n sessionId: string,\n messageId: string,\n images: ImageInput[],\n backendUrl: string\n): Promise<ProcessedImage[]> {\n if (!images || images.length === 0) return [];\n\n // Ensure the message images directory exists\n const messageDir = getMessageImagesDir(sessionId, messageId);\n ensureDir(messageDir);\n\n const processedImages: ProcessedImage[] = [];\n\n for (let index = 0; index < images.length; index++) {\n const image = images[index];\n \n try {\n // Parse the data URL\n const parsed = parseDataUrl(image.dataUrl);\n if (!parsed) {\n console.error(`[ThumbnailService] Failed to parse data URL for image ${image.id}`);\n continue;\n }\n\n const { buffer, mimeType } = parsed;\n\n // Get original dimensions\n const dimensions = await getImageDimensions(buffer);\n\n // Generate thumbnail\n const thumbnailBuffer = await generateThumbnail(buffer);\n\n // Save thumbnail to disk\n const thumbnailAbsPath = getThumbnailPath(sessionId, messageId, index);\n fs.writeFileSync(thumbnailAbsPath, thumbnailBuffer);\n\n // Save FULL IMAGE to disk (for Copilot SDK attachments and lightbox view)\n // Resize and compress to avoid huge payloads crashing the backend\n const fullImageBuffer = await generateFullImage(buffer);\n const extension = 'jpg'; // Always jpeg as per FULL_IMAGE_CONFIG\n const fullImageAbsPath = getFullImagePath(sessionId, messageId, index, extension);\n fs.writeFileSync(fullImageAbsPath, fullImageBuffer);\n console.log(`[ThumbnailService] Saved compressed full image to ${fullImageAbsPath}`);\n\n // Generate relative paths for DB storage (from DATA_DIR)\n const thumbnailRelativePath = toRelativePath(thumbnailAbsPath);\n \n // Generate URL paths for serving (from IMAGES_DIR, no \"images/\" prefix)\n const thumbnailUrlPath = toUrlPath(toImageRelativePath(thumbnailAbsPath));\n const fullImageUrlPath = toUrlPath(toImageRelativePath(fullImageAbsPath));\n\n processedImages.push({\n id: image.id,\n source: image.source,\n mimeType: image.mimeType,\n dimensions,\n fileSize: buffer.length,\n timestamp: new Date().toISOString(),\n thumbnailUrl: `${backendUrl}/api/images/${thumbnailUrlPath}`,\n thumbnailPath: thumbnailRelativePath,\n fullImagePath: fullImageAbsPath,\n fullImageUrl: `${backendUrl}/api/images/${fullImageUrlPath}`,\n });\n\n console.log(`[ThumbnailService] Processed image ${index + 1}/${images.length} for message ${messageId}`);\n } catch (error) {\n console.error(`[ThumbnailService] Failed to process image ${image.id}:`, error);\n // Continue with other images even if one fails\n }\n }\n\n return processedImages;\n}\n\n/**\n * Get the absolute path for a thumbnail from URL path segments\n * \n * @param sessionId - The session ID\n * @param messageId - The message ID\n * @param index - The image index\n * @returns Absolute path to the thumbnail file, or null if not found\n */\nexport function getThumbnailFilePath(\n sessionId: string,\n messageId: string,\n index: number\n): string | null {\n const thumbnailPath = getThumbnailPath(sessionId, messageId, index);\n return fileExists(thumbnailPath) ? thumbnailPath : null;\n}\n\n/**\n * Delete all images for a session (cleanup)\n * \n * @param sessionId - The session ID\n */\nexport function deleteSessionImages(sessionId: string): void {\n const sessionDir = getSessionImagesDir(sessionId);\n deleteDir(sessionDir);\n console.log(`[ThumbnailService] Deleted images for session ${sessionId}`);\n}\n\n/**\n * Delete all images for a message (cleanup)\n * \n * @param sessionId - The session ID\n * @param messageId - The message ID\n */\nexport function deleteMessageImages(sessionId: string, messageId: string): void {\n const messageDir = getMessageImagesDir(sessionId, messageId);\n deleteDir(messageDir);\n console.log(`[ThumbnailService] Deleted images for message ${messageId}`);\n}\n\n/**\n * Convert processed images to ImageAttachment format for storage\n */\nexport function toImageAttachments(processedImages: ProcessedImage[]): ImageAttachment[] {\n return processedImages.map(img => ({\n id: img.id,\n source: img.source,\n mimeType: img.mimeType,\n dimensions: img.dimensions,\n fileSize: img.fileSize,\n timestamp: img.timestamp,\n thumbnailUrl: img.thumbnailUrl,\n fullImageUrl: img.fullImageUrl,\n // Note: dataUrl is NOT included - it's only used during processing\n }));\n}\n","import type { FastifyInstance } from 'fastify';\nimport { z } from 'zod';\nimport type { SessionEvent } from '@github/copilot-sdk';\nimport type {\n ApiResponse,\n Message,\n SendMessageRequest,\n StreamEvent,\n ImageAttachment,\n} from '@devmentorai/shared';\nimport {\n buildContextAwarePrompt,\n buildSimplePrompt,\n validateContext,\n sanitizeContext,\n} from '../services/context-prompt-builder.js';\nimport {\n processMessageImages,\n toImageAttachments,\n type ProcessedImage,\n} from '../services/thumbnail-service.js';\n\n// Schema for simple context (backward compatible)\nconst simpleContextSchema = z.object({\n pageUrl: z.string().optional(),\n pageTitle: z.string().optional(),\n selectedText: z.string().optional(),\n action: z.enum([\n 'explain',\n 'translate',\n 'rewrite',\n 'fix_grammar',\n 'summarize',\n 'expand',\n 'analyze_config',\n 'diagnose_error',\n ]).optional(),\n});\n\n// Schema for full context payload\nconst fullContextSchema = z.object({\n metadata: z.object({\n captureTimestamp: z.string(),\n captureMode: z.enum(['auto', 'manual']),\n browserInfo: z.object({\n userAgent: z.string(),\n viewport: z.object({ width: z.number(), height: z.number() }),\n language: z.string(),\n }),\n }),\n page: z.object({\n url: z.string(),\n urlParsed: z.object({\n protocol: z.string(),\n hostname: z.string(),\n pathname: z.string(),\n search: z.string(),\n hash: z.string(),\n }),\n title: z.string(),\n platform: z.object({\n type: z.string(),\n confidence: z.number(),\n indicators: z.array(z.string()),\n specificProduct: z.string().optional(),\n }),\n }),\n text: z.object({\n selectedText: z.string().optional(),\n visibleText: z.string(),\n headings: z.array(z.object({\n level: z.number(),\n text: z.string(),\n })),\n errors: z.array(z.object({\n type: z.enum(['error', 'warning', 'info']),\n message: z.string(),\n source: z.enum(['console', 'ui', 'network', 'dom']).optional(),\n severity: z.enum(['critical', 'high', 'medium', 'low']),\n context: z.string().optional(),\n })),\n metadata: z.object({\n totalLength: z.number(),\n truncated: z.boolean(),\n }),\n }),\n structure: z.object({\n relevantSections: z.array(z.any()),\n errorContainers: z.array(z.any()),\n activeElements: z.any(),\n metadata: z.any(),\n }),\n session: z.object({\n sessionId: z.string(),\n sessionType: z.string(),\n intent: z.object({\n primary: z.string(),\n keywords: z.array(z.string()),\n implicitSignals: z.array(z.string()),\n explicitGoal: z.string().optional(),\n }),\n previousMessages: z.object({\n count: z.number(),\n lastN: z.array(z.any()),\n }),\n }),\n privacy: z.object({\n redactedFields: z.array(z.string()),\n sensitiveDataDetected: z.boolean(),\n consentGiven: z.boolean(),\n dataRetention: z.enum(['session', 'none']),\n }),\n}).passthrough();\n\n// Schema for image payload (inline data URL - legacy / small images)\nconst imagePayloadSchema = z.object({\n id: z.string(),\n dataUrl: z.string(),\n mimeType: z.enum(['image/png', 'image/jpeg', 'image/webp']),\n source: z.enum(['screenshot', 'paste', 'drop']),\n});\n\n// Schema for pre-uploaded image reference (from /api/images/upload endpoint)\nconst preUploadedImageSchema = z.object({\n id: z.string(),\n fullImagePath: z.string(),\n mimeType: z.string(),\n thumbnailUrl: z.string().optional(),\n fullImageUrl: z.string().optional(),\n dimensions: z.object({ width: z.number(), height: z.number() }).optional(),\n fileSize: z.number().optional(),\n});\n\nconst sendMessageSchema = z.object({\n prompt: z.string().min(1),\n context: simpleContextSchema.optional(),\n fullContext: fullContextSchema.optional(),\n useContextAwareMode: z.boolean().optional(),\n images: z.array(imagePayloadSchema).max(5).optional(),\n /** Pre-uploaded image references (already processed on disk) */\n preUploadedImages: z.array(preUploadedImageSchema).max(5).optional(),\n});\n\nexport async function chatRoutes(fastify: FastifyInstance) {\n // Helper to build the appropriate prompt based on context type\n // Returns userPrompt (enriched with context) and promptType\n // systemPrompt is always null - we don't override Copilot's default\n const buildPrompt = (\n body: { prompt: string; context?: any; fullContext?: any; useContextAwareMode?: boolean }\n ): { userPrompt: string; promptType: string } => {\n // If full context is provided and context-aware mode is enabled\n if (body.fullContext && body.useContextAwareMode !== false) {\n if (validateContext(body.fullContext)) {\n const sanitizedContext = sanitizeContext(body.fullContext);\n const { userPrompt } = buildContextAwarePrompt(sanitizedContext, body.prompt);\n return { userPrompt, promptType: 'context-aware' };\n }\n }\n \n // Fall back to simple prompt\n const { userPrompt } = buildSimplePrompt(\n body.prompt,\n body.context?.pageUrl,\n body.context?.pageTitle,\n body.context?.selectedText\n );\n return { userPrompt, promptType: 'simple' };\n };\n\n // Send message (non-streaming)\n fastify.post<{\n Params: { id: string };\n Body: SendMessageRequest;\n Reply: ApiResponse<Message>;\n }>('/sessions/:id/chat', async (request, reply) => {\n try {\n const body = sendMessageSchema.parse(request.body);\n const sessionId = request.params.id;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Build the prompt (enriched with context, no system prompt override)\n const { userPrompt, promptType } = buildPrompt(body);\n console.log(`[ChatRoute] Using ${promptType} prompt`);\n\n // Save user message\n const userMessage = fastify.sessionService.addMessage(\n sessionId,\n 'user',\n body.prompt,\n body.context ? {\n pageUrl: body.context.pageUrl,\n selectedText: body.context.selectedText,\n action: body.context.action,\n } : undefined\n );\n\n // Persist context if fullContext is provided (Phase 5)\n if (body.fullContext) {\n try {\n fastify.sessionService.saveContext(\n sessionId,\n JSON.stringify(body.fullContext),\n userMessage.id,\n body.fullContext.page?.url,\n body.fullContext.page?.title,\n body.fullContext.page?.platform?.type\n );\n console.log(`[ChatRoute] Context saved for message ${userMessage.id}`);\n } catch (err) {\n console.error('[ChatRoute] Failed to persist context:', err);\n }\n }\n\n // Get response from Copilot (no system prompt - uses customAgents from session)\n const response = await fastify.copilotService.sendMessage(\n sessionId,\n userPrompt,\n body.context\n // NOT passing systemPrompt - preserves Copilot's intelligence\n );\n\n // Save assistant message\n const assistantMessage = fastify.sessionService.addMessage(\n sessionId,\n 'assistant',\n response\n );\n\n return reply.send({\n success: true,\n data: assistantMessage,\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: { errors: error.errors },\n },\n });\n }\n throw error;\n }\n });\n\n // Send message (streaming via SSE)\n fastify.post<{\n Params: { id: string };\n Body: SendMessageRequest;\n }>('/sessions/:id/chat/stream', async (request, reply) => {\n try {\n const body = sendMessageSchema.parse(request.body);\n const sessionId = request.params.id;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n // Build the prompt (enriched with context, no system prompt override)\n const { userPrompt, promptType } = buildPrompt(body);\n console.log(`[ChatRoute] Using ${promptType} prompt for streaming`);\n\n // Process images if provided\n let processedImagesRaw: ProcessedImage[] = [];\n let processedImages: ImageAttachment[] = [];\n let copilotAttachments: Array<{ type: 'file'; path: string; displayName: string }> = [];\n // Build backend URL with port for image serving\n const host = request.headers.host || `${request.hostname}:3847`;\n const backendUrl = `http://${host}`;\n \n // We'll need the message ID before processing images\n // First save the user message without images\n const userMessage = fastify.sessionService.addMessage(\n sessionId,\n 'user',\n body.prompt,\n body.context ? {\n pageUrl: body.context.pageUrl,\n selectedText: body.context.selectedText,\n action: body.context.action,\n contextAware: body.useContextAwareMode,\n } : { contextAware: body.useContextAwareMode }\n );\n\n // Process images after we have the message ID\n // Prefer pre-uploaded images (already on disk) over inline data URLs\n if (body.preUploadedImages && body.preUploadedImages.length > 0) {\n // Images were already processed via /api/images/upload endpoint\n console.log(`[ChatRoute] Using ${body.preUploadedImages.length} pre-uploaded images`);\n copilotAttachments = body.preUploadedImages.map((img, index) => ({\n type: 'file' as const,\n path: img.fullImagePath,\n displayName: `image_${index + 1}.${(img.mimeType || 'image/jpeg').split('/')[1] || 'jpg'}`,\n }));\n\n // Build metadata for message storage\n processedImages = body.preUploadedImages.map(img => ({\n id: img.id,\n source: 'screenshot' as const,\n mimeType: (img.mimeType || 'image/jpeg') as any,\n dimensions: img.dimensions || { width: 0, height: 0 },\n fileSize: img.fileSize || 0,\n timestamp: new Date().toISOString(),\n thumbnailUrl: img.thumbnailUrl,\n fullImageUrl: img.fullImageUrl,\n }));\n\n fastify.sessionService.updateMessageMetadata(userMessage.id, {\n ...userMessage.metadata,\n images: processedImages,\n });\n } else if (body.images && body.images.length > 0) {\n // Inline image upload (legacy path for small images)\n try {\n console.log(`[ChatRoute] Processing ${body.images.length} inline images for message ${userMessage.id}`);\n processedImagesRaw = await processMessageImages(\n sessionId,\n userMessage.id,\n body.images,\n backendUrl\n );\n processedImages = toImageAttachments(processedImagesRaw);\n \n // Update message metadata with images\n fastify.sessionService.updateMessageMetadata(userMessage.id, {\n ...userMessage.metadata,\n images: processedImages,\n });\n \n copilotAttachments = processedImagesRaw.map((img, index) => ({\n type: 'file' as const,\n path: img.fullImagePath,\n displayName: `image_${index + 1}.${img.mimeType.split('/')[1] || 'jpg'}`,\n }));\n \n console.log(`[ChatRoute] Processed ${processedImages.length} images successfully`);\n } catch (err) {\n console.error('[ChatRoute] Failed to process images:', err);\n // Continue without images - don't fail the message\n }\n }\n \n if (copilotAttachments.length > 0) {\n console.log(`[ChatRoute] Built ${copilotAttachments.length} attachments for Copilot:`, copilotAttachments);\n }\n\n // Persist context if fullContext is provided (Phase 5)\n if (body.fullContext) {\n try {\n fastify.sessionService.saveContext(\n sessionId,\n JSON.stringify(body.fullContext),\n userMessage.id,\n body.fullContext.page?.url,\n body.fullContext.page?.title,\n body.fullContext.page?.platform?.type\n );\n console.log(`[ChatRoute] Context saved for message ${userMessage.id}`);\n } catch (err) {\n console.error('[ChatRoute] Failed to persist context:', err);\n }\n }\n\n // Set up SSE\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.setHeader('Access-Control-Allow-Origin', '*');\n\n let fullContent = '';\n let assistantMessageId: string | null = null;\n let streamEnded = false;\n let lastActivityTime = Date.now();\n\n // Global timeout for the entire streaming operation (2 minutes)\n const STREAM_TIMEOUT_MS = 120000;\n // Idle timeout - if no events received for this duration, consider it stuck\n const IDLE_TIMEOUT_MS = 30000;\n\n const sendSSE = (event: StreamEvent) => {\n if (!streamEnded) {\n reply.raw.write(`data: ${JSON.stringify(event)}\\n\\n`);\n lastActivityTime = Date.now();\n }\n };\n\n const endStream = (reason: string = 'completed') => {\n if (streamEnded) return;\n streamEnded = true;\n \n console.log(`[ChatRoute] Stream ending: ${reason}. Content length: ${fullContent.length}`);\n \n // Save message if we have content\n if (fullContent && !assistantMessageId) {\n const message = fastify.sessionService.addMessage(\n sessionId,\n 'assistant',\n fullContent\n );\n assistantMessageId = message.id;\n }\n\n sendSSE({ type: 'done', data: { messageId: assistantMessageId || undefined, reason } });\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n };\n\n // Create a Promise that resolves when streaming is complete\n const streamComplete = new Promise<void>((resolve) => {\n const cleanupTimers = () => {\n clearTimeout(globalTimeout);\n clearInterval(idleCheckInterval);\n };\n\n // Set up global timeout\n const globalTimeout = setTimeout(() => {\n console.warn('[ChatRoute] Global stream timeout reached');\n cleanupTimers();\n endStream('timeout');\n fastify.copilotService.abortRequest(sessionId).catch(() => {});\n resolve();\n }, STREAM_TIMEOUT_MS);\n\n // Set up idle timeout check\n const idleCheckInterval = setInterval(() => {\n const idleTime = Date.now() - lastActivityTime;\n if (idleTime > IDLE_TIMEOUT_MS && !streamEnded) {\n console.warn(`[ChatRoute] Stream idle for ${idleTime}ms, ending`);\n cleanupTimers();\n endStream('idle_timeout');\n fastify.copilotService.abortRequest(sessionId).catch(() => {});\n resolve();\n }\n }, 5000);\n\n // Handle Copilot events\n const handleEvent = (event: SessionEvent) => {\n if (streamEnded) return;\n \n console.log('[ChatRoute] Received event:', event.type);\n lastActivityTime = Date.now();\n \n switch (event.type) {\n case 'assistant.message_delta':\n fullContent += event.data.deltaContent || '';\n sendSSE({\n type: 'message_delta',\n data: { deltaContent: event.data.deltaContent },\n });\n break;\n\n case 'assistant.message':\n fullContent = event.data.content || fullContent;\n sendSSE({\n type: 'message_complete',\n data: { content: fullContent },\n });\n break;\n\n case 'tool.execution_start':\n sendSSE({\n type: 'tool_start',\n data: {\n toolName: (event.data as any).toolName,\n toolCallId: (event.data as any).toolCallId,\n },\n });\n break;\n\n case 'tool.execution_complete':\n sendSSE({\n type: 'tool_complete',\n data: { toolCallId: (event.data as any).toolCallId },\n });\n break;\n\n case 'session.idle':\n cleanupTimers();\n endStream('completed');\n resolve();\n break;\n }\n };\n\n // Start streaming with attachments (no system prompt - uses customAgents from session)\n const streamStart = fastify.copilotService.streamMessage(\n sessionId,\n userPrompt,\n body.context,\n handleEvent,\n copilotAttachments.length > 0 ? copilotAttachments : undefined\n );\n\n streamStart.catch((streamError) => {\n console.error('[ChatRoute] Failed to start Copilot stream:', streamError);\n cleanupTimers();\n\n if (!streamEnded) {\n if (!reply.raw.headersSent) {\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.setHeader('Access-Control-Allow-Origin', '*');\n }\n sendSSE({\n type: 'error',\n data: {\n error: streamError instanceof Error ? streamError.message : 'Failed to start stream',\n },\n });\n endStream('copilot_error');\n }\n\n resolve();\n });\n });\n\n // Handle client disconnect\n request.raw.on('close', () => {\n if (!streamEnded) {\n console.log('[ChatRoute] Client disconnected, aborting');\n streamEnded = true;\n fastify.copilotService.abortRequest(sessionId).catch((abortError) => {\n console.error('[ChatRoute] Failed to abort request after disconnect:', abortError);\n });\n reply.raw.end();\n }\n });\n\n // Wait for streaming to complete before allowing Fastify to close the connection\n await streamComplete;\n\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid request body',\n details: error.errors,\n },\n });\n }\n \n // Send error via SSE\n if (!reply.raw.headersSent) {\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.setHeader('Access-Control-Allow-Origin', '*');\n }\n const errorEvent: StreamEvent = {\n type: 'error',\n data: { error: error instanceof Error ? error.message : 'Unknown error' },\n };\n reply.raw.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n }\n });\n\n // Get session context history (Phase 5)\n fastify.get<{\n Params: { id: string };\n Querystring: { limit?: number };\n }>('/sessions/:id/context', async (request, reply) => {\n const sessionId = request.params.id;\n const limit = request.query.limit || 10;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const latestContext = fastify.sessionService.getLatestContext(sessionId);\n const contextHistory = fastify.sessionService.getContextHistory(sessionId, limit);\n const contextCount = fastify.sessionService.getContextCount(sessionId);\n\n return reply.send({\n success: true,\n data: {\n latest: latestContext,\n history: contextHistory,\n totalCount: contextCount,\n },\n });\n });\n\n // Get specific context by ID (Phase 5)\n fastify.get<{\n Params: { id: string; contextId: string };\n }>('/sessions/:id/context/:contextId', async (request, reply) => {\n const { id: sessionId, contextId } = request.params;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const context = fastify.sessionService.getContext(contextId);\n if (!context || context.sessionId !== sessionId) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Context not found',\n },\n });\n }\n\n return reply.send({\n success: true,\n data: {\n ...context,\n contextData: JSON.parse(context.contextJson),\n },\n });\n });\n\n // Cleanup old contexts for a session (Phase 5)\n fastify.post<{\n Params: { id: string };\n Body: { keepCount?: number };\n }>('/sessions/:id/context/cleanup', async (request, reply) => {\n const sessionId = request.params.id;\n const keepCount = request.body?.keepCount || 20;\n\n const session = fastify.sessionService.getSession(sessionId);\n if (!session) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: 'Session not found',\n },\n });\n }\n\n const deletedCount = fastify.sessionService.cleanupOldContexts(sessionId, keepCount);\n\n return reply.send({\n success: true,\n data: {\n deletedCount,\n remainingCount: fastify.sessionService.getContextCount(sessionId),\n },\n });\n });\n}\n","/**\n * Context Prompt Builder Service\n * \n * Builds context-enriched prompts for the Copilot SDK based on extracted page context.\n * \n * PHASE 3 DESIGN PRINCIPLE - AUTONOMOUS AGENT:\n * ============================================\n * 1. We provide PURELY FACTUAL context (what's on the page)\n * 2. We do NOT tell the agent what to do (no \"Task:\" instructions)\n * 3. We do NOT interpret user intent (the LLM decides)\n * 4. We do NOT use keyword matching (multilingual support, agent autonomy)\n * 5. The agent (Copilot) is fully autonomous in deciding:\n * - What the user wants\n * - How to respond \n * - What context is relevant\n * \n * CustomAgents (DevOps Mentor, etc.) are set at session creation and provide\n * domain expertise. This function ONLY adds situational context from the page.\n */\n\nimport type {\n ContextPayload,\n PlatformDetection,\n ExtractedError,\n HTMLSection,\n Heading,\n} from '@devmentorai/shared';\n\n// ============================================================================\n// Platform-Specific Context Notes (Factual, NOT instructions)\n// ============================================================================\n\n/**\n * Platform context notes - FACTUAL ONLY\n * These describe where relevant information can be found, NOT what the agent should do.\n */\nconst PLATFORM_CONTEXT_NOTES: Record<string, string> = {\n azure: `**Platform:** Azure Portal\nCommon diagnostic locations: Activity Log, Diagnose and solve problems, Resource health`,\n\n aws: `**Platform:** AWS Console \nCommon diagnostic locations: CloudTrail, CloudWatch Logs, IAM policies`,\n\n gcp: `**Platform:** Google Cloud Console\nCommon diagnostic locations: Cloud Logging, Error Reporting, IAM bindings`,\n\n github: `**Platform:** GitHub\nCommon diagnostic locations: Actions tab, Issues, Pull Requests`,\n\n gitlab: `**Platform:** GitLab\nCommon diagnostic locations: Pipelines, Merge Requests, Project settings`,\n\n kubernetes: `**Platform:** Kubernetes Dashboard\nCommon diagnostic commands: kubectl logs, kubectl describe, kubectl get events`,\n\n jenkins: `**Platform:** Jenkins\nCommon diagnostic locations: Console output, Pipeline syntax, Agent status`,\n\n datadog: `**Platform:** Datadog\nCommon diagnostic locations: Metric graphs, Alert conditions, Integration status`,\n\n grafana: `**Platform:** Grafana\nCommon diagnostic locations: Query editor, Data source config, Alert rules`,\n\n generic: ``,\n};\n\n// ============================================================================\n// Context Formatting Functions\n// ============================================================================\n\n/**\n * Format page context section for the prompt\n */\nfunction formatPageContext(page: ContextPayload['page']): string {\n const { platform } = page;\n const platformLabel = platform.specificProduct || platform.type.toUpperCase();\n \n let section = `## Page Context\\n`;\n section += `- **Platform:** ${platformLabel}`;\n if (platform.confidence < 0.8) {\n section += ` (confidence: ${Math.round(platform.confidence * 100)}%)`;\n }\n section += '\\n';\n section += `- **URL:** ${page.url}\\n`;\n section += `- **Title:** ${page.title}\\n`;\n \n return section;\n}\n\n/**\n * Format errors section for the prompt - FACTUAL ONLY\n * No severity emojis - the agent interprets severity\n */\nfunction formatErrors(errors: ExtractedError[]): string {\n if (errors.length === 0) return '';\n\n let section = `## Errors and Alerts on Page\\n`;\n section += `${errors.length} issue(s) detected:\\n\\n`;\n\n for (const error of errors) {\n section += `- **[${error.severity.toUpperCase()}]** ${error.message}\\n`;\n if (error.source) section += ` Source: ${error.source}\\n`;\n if (error.context) section += ` Context: ${error.context}\\n`;\n if (error.stackTrace) section += ` Stack: ${error.stackTrace.slice(0, 200)}...\\n`;\n section += '\\n';\n }\n\n return section;\n}\n\n/**\n * Format headings hierarchy for the prompt\n */\nfunction formatHeadings(headings: Heading[]): string {\n if (headings.length === 0) return '';\n\n let section = `## Page Structure (Headings)\\n`;\n for (const heading of headings.slice(0, 10)) {\n const indent = ' '.repeat(heading.level - 1);\n section += `${indent}- ${heading.text}\\n`;\n }\n return section + '\\n';\n}\n\n/**\n * Format relevant HTML sections for the prompt\n */\nfunction formatRelevantSections(sections: HTMLSection[]): string {\n if (sections.length === 0) return '';\n\n let section = `## Relevant UI Elements\\n`;\n for (const s of sections.slice(0, 5)) {\n section += `### ${s.purpose.replace('-', ' ').toUpperCase()}\\n`;\n section += `\\`\\`\\`\\n${s.textContent.slice(0, 300)}\\n\\`\\`\\`\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format code blocks for the prompt (Phase 2)\n */\nfunction formatCodeBlocks(codeBlocks?: HTMLSection[]): string {\n if (!codeBlocks || codeBlocks.length === 0) return '';\n\n let section = `## Code Snippets Found on Page\\n`;\n for (const block of codeBlocks.slice(0, 3)) {\n const lang = block.attributes.detectedLanguage || 'text';\n section += `### ${lang.toUpperCase()}\\n`;\n section += `\\`\\`\\`${lang}\\n${block.textContent.slice(0, 500)}\\n\\`\\`\\`\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format tables for the prompt (Phase 2)\n */\nfunction formatTables(tables?: HTMLSection[]): string {\n if (!tables || tables.length === 0) return '';\n\n let section = `## Data Tables\\n`;\n for (const table of tables.slice(0, 2)) {\n const rows = table.attributes.rowCount || '?';\n const cols = table.attributes.columnCount || '?';\n section += `### Table (${rows} rows × ${cols} cols)\\n`;\n section += `\\`\\`\\`\\n${table.textContent.slice(0, 400)}\\n\\`\\`\\`\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format console logs for the prompt (Phase 2) - FACTUAL ONLY\n */\nfunction formatConsoleLogs(logs?: Array<{ level: string; message: string; timestamp: string; stackTrace?: string }>): string {\n if (!logs || logs.length === 0) return '';\n\n const errors = logs.filter(l => l.level === 'error' || l.level === 'warn');\n if (errors.length === 0) return '';\n\n let section = `## Browser Console Logs\\n`;\n section += `${errors.length} error/warning message(s):\\n\\n`;\n \n for (const log of errors.slice(0, 5)) {\n section += `- **${log.level.toUpperCase()}:** ${log.message.slice(0, 200)}\\n`;\n if (log.stackTrace) {\n section += ` Stack: ${log.stackTrace.slice(0, 150)}...\\n`;\n }\n section += '\\n';\n }\n return section;\n}\n\n/**\n * Format network errors for the prompt (Phase 2) - FACTUAL ONLY\n */\nfunction formatNetworkErrors(errors?: Array<{ url: string; method: string; status?: number; errorMessage?: string }>): string {\n if (!errors || errors.length === 0) return '';\n\n let section = `## Network Requests Failed\\n`;\n section += `${errors.length} failed request(s):\\n\\n`;\n \n for (const err of errors.slice(0, 5)) {\n const status = err.status ? `HTTP ${err.status}` : (err.errorMessage || 'Failed');\n section += `- **${err.method}** ${err.url.slice(0, 80)}${err.url.length > 80 ? '...' : ''}\\n`;\n section += ` Status: ${status}\\n\\n`;\n }\n return section;\n}\n\n/**\n * Format modal content for the prompt (Phase 2)\n */\nfunction formatModalContent(modal?: HTMLSection): string {\n if (!modal) return '';\n\n let section = `## Active Modal/Dialog\\n`;\n const title = modal.attributes.title || 'Modal';\n section += `### ${title}\\n`;\n section += `\\`\\`\\`\\n${modal.textContent.slice(0, 400)}\\n\\`\\`\\`\\n\\n`;\n return section;\n}\n\n/**\n * Format platform-specific context for the prompt (Phase 2)\n */\nfunction formatPlatformSpecificContext(platformContext?: Record<string, unknown>): string {\n if (!platformContext || Object.keys(platformContext).length === 0) return '';\n\n let section = `## Platform-Specific Details\\n`;\n for (const [key, value] of Object.entries(platformContext)) {\n if (value !== undefined && value !== null) {\n section += `- **${key}:** ${String(value)}\\n`;\n }\n }\n return section + '\\n';\n}\n\n/**\n * Format UI state for the prompt\n */\nfunction formatUIState(uiState: {\n pageState: string;\n loadingIndicators: number;\n disabledButtons: number;\n emptyStates: number;\n errorStates: number;\n toastNotifications: number;\n modalOpen: boolean;\n formValidationErrors: number;\n}): string {\n let section = `## UI State\\n`;\n section += `- **Page State:** ${uiState.pageState}\\n`;\n \n const issues: string[] = [];\n if (uiState.loadingIndicators > 0) issues.push(`${uiState.loadingIndicators} loading indicator(s)`);\n if (uiState.errorStates > 0) issues.push(`${uiState.errorStates} error state(s)`);\n if (uiState.emptyStates > 0) issues.push(`${uiState.emptyStates} empty state(s)`);\n if (uiState.toastNotifications > 0) issues.push(`${uiState.toastNotifications} notification(s)`);\n if (uiState.formValidationErrors > 0) issues.push(`${uiState.formValidationErrors} form validation error(s)`);\n if (uiState.disabledButtons > 0) issues.push(`${uiState.disabledButtons} disabled button(s)`);\n if (uiState.modalOpen) issues.push(`modal/dialog open`);\n \n if (issues.length > 0) {\n section += `- **UI Issues:** ${issues.join(', ')}\\n`;\n }\n \n return section + '\\n';\n}\n\n/**\n * Format runtime JavaScript errors for the prompt\n */\nfunction formatRuntimeErrors(errors: Array<{\n message: string;\n source?: string;\n lineno?: number;\n colno?: number;\n stack?: string;\n type: string;\n}>): string {\n if (errors.length === 0) return '';\n\n let section = `## JavaScript Runtime Errors\\n`;\n section += `${errors.length} runtime error(s) detected:\\n\\n`;\n \n for (const err of errors.slice(0, 5)) {\n const errType = err.type === 'unhandledrejection' ? 'Promise Rejection' : 'JS Error';\n section += `- **${errType}:** ${err.message.slice(0, 200)}\\n`;\n if (err.source) {\n section += ` Source: ${err.source}${err.lineno ? `:${err.lineno}` : ''}${err.colno ? `:${err.colno}` : ''}\\n`;\n }\n if (err.stack) {\n section += ` Stack: ${err.stack.slice(0, 150)}...\\n`;\n }\n section += '\\n';\n }\n return section;\n}\n\n/**\n * Format user selection for the prompt\n */\nfunction formatSelectedText(selectedText?: string): string {\n if (!selectedText) return '';\n \n return `## User Selected Text\\nThe user has highlighted this text on the page:\\n\\`\\`\\`\\n${selectedText}\\n\\`\\`\\`\\n\\n`;\n}\n\n/**\n * Format session history for the prompt - FACTUAL ONLY\n */\nfunction formatSessionHistory(messages: { count: number; lastN: Array<{ role: string; content: string }> }): string {\n if (messages.count === 0 || messages.lastN.length === 0) return '';\n\n let section = `## Recent Conversation (${messages.count} messages total)\\n`;\n for (const msg of messages.lastN) {\n const role = msg.role === 'user' ? 'User' : 'Assistant';\n section += `**${role}:** ${msg.content.slice(0, 200)}${msg.content.length > 200 ? '...' : ''}\\n\\n`;\n }\n return section;\n}\n\n// ============================================================================\n// Main Prompt Builder\n// ============================================================================\n\nexport interface ContextAwarePromptOptions {\n includePlatformNotes?: boolean;\n includeErrors?: boolean;\n includeStructure?: boolean;\n // Phase 2 options\n includeCodeBlocks?: boolean;\n includeTables?: boolean;\n includeConsoleLogs?: boolean;\n includeNetworkErrors?: boolean;\n includeModal?: boolean;\n includePlatformSpecific?: boolean;\n maxContextLength?: number;\n // Phase 3: intentInstructions REMOVED - agent is autonomous\n}\n\nconst DEFAULT_OPTIONS: ContextAwarePromptOptions = {\n includePlatformNotes: true,\n includeErrors: true,\n includeStructure: true,\n // Phase 2 defaults\n includeCodeBlocks: true,\n includeTables: true,\n includeConsoleLogs: true,\n includeNetworkErrors: true,\n includeModal: true,\n includePlatformSpecific: true,\n maxContextLength: 10000, // Increased for Phase 2\n};\n\n/**\n * Build a context-enriched user prompt from extracted page context.\n * \n * PHASE 3 - AUTONOMOUS AGENT DESIGN:\n * ==================================\n * - Returns ONLY factual context (what's on the page)\n * - Does NOT tell the agent what to do\n * - Does NOT interpret user intent\n * - The agent decides everything based on the context and user message\n * \n * CustomAgents (DevOps Mentor, etc.) are set at session creation and provide\n * domain expertise. This function ONLY adds situational context.\n * \n * IMPORTANT: The context comes from the user's authenticated browser session.\n * The agent should use this context to answer questions about private/internal\n * pages that are not publicly accessible.\n */\nexport function buildContextAwarePrompt(\n context: ContextPayload,\n userMessage: string,\n options: ContextAwarePromptOptions = {}\n): { systemPrompt: string | null; userPrompt: string } {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n \n // Build the enriched user prompt with FACTUAL context sections\n let enrichedPrompt = '';\n \n // Context header - explains that this data comes from user's browser\n enrichedPrompt += `# Browser Context (from user's authenticated session)\\n\\n`;\n enrichedPrompt += `The following context was extracted from the user's browser. `;\n enrichedPrompt += `This may include private or authenticated content that is not publicly accessible. `;\n enrichedPrompt += `Use this context to answer the user's question - DO NOT attempt to fetch URLs externally.\\n\\n`;\n\n // Page context (always included)\n enrichedPrompt += formatPageContext(context.page);\n\n // UI State (if available) - helps understand page state\n if ((context.page as any).uiState) {\n enrichedPrompt += formatUIState((context.page as any).uiState);\n }\n\n // Platform-specific notes (factual locations, NOT instructions)\n if (opts.includePlatformNotes) {\n const platformNotes = PLATFORM_CONTEXT_NOTES[context.page.platform.type] || \n PLATFORM_CONTEXT_NOTES.generic;\n if (platformNotes) {\n enrichedPrompt += platformNotes + '\\n\\n';\n }\n }\n\n // Phase 2: Platform-specific context details\n if (opts.includePlatformSpecific && context.page.platform.specificContext) {\n enrichedPrompt += formatPlatformSpecificContext(context.page.platform.specificContext);\n }\n\n // Errors (factual listing)\n if (opts.includeErrors) {\n enrichedPrompt += formatErrors(context.text.errors);\n }\n\n // Console errors\n if (opts.includeConsoleLogs && context.text.consoleLogs) {\n enrichedPrompt += formatConsoleLogs(context.text.consoleLogs);\n }\n\n // Network errors\n if (opts.includeNetworkErrors && context.text.networkErrors) {\n enrichedPrompt += formatNetworkErrors(context.text.networkErrors);\n }\n\n // Runtime JavaScript errors (new)\n if ((context.text as any).runtimeErrors?.length > 0) {\n enrichedPrompt += formatRuntimeErrors((context.text as any).runtimeErrors);\n }\n\n // Selected text (user highlighted something specific)\n enrichedPrompt += formatSelectedText(context.text.selectedText);\n\n // Modal content (if present)\n if (opts.includeModal && context.structure.modal) {\n enrichedPrompt += formatModalContent(context.structure.modal);\n }\n\n // Structure (headings + sections) - helps AI understand page layout\n if (opts.includeStructure) {\n enrichedPrompt += formatHeadings(context.text.headings);\n enrichedPrompt += formatRelevantSections(context.structure.relevantSections);\n }\n\n // Code blocks\n if (opts.includeCodeBlocks && context.structure.codeBlocks) {\n enrichedPrompt += formatCodeBlocks(context.structure.codeBlocks);\n }\n\n // Tables\n if (opts.includeTables && context.structure.tables) {\n enrichedPrompt += formatTables(context.structure.tables);\n }\n\n // Session history (for continuity)\n enrichedPrompt += formatSessionHistory(context.session.previousMessages);\n\n // Privacy note\n if (context.privacy?.privacyMaskingApplied) {\n enrichedPrompt += `\\n**Note:** Some sensitive data (${context.privacy.sensitiveDataTypes?.join(', ') || 'various types'}) has been redacted for privacy.\\n\\n`;\n }\n\n // Add the actual user message\n enrichedPrompt += `---\\n\\n## User Message\\n${userMessage}\\n`;\n\n // Truncate if too long\n if (enrichedPrompt.length > (opts.maxContextLength || 10000)) {\n enrichedPrompt = truncatePrompt(enrichedPrompt, opts.maxContextLength || 10000, userMessage);\n }\n\n // Return null for systemPrompt - we don't override Copilot's default\n return { systemPrompt: null, userPrompt: enrichedPrompt };\n}\n\n/**\n * Truncate prompt while preserving the user's actual message\n */\nfunction truncatePrompt(prompt: string, maxLength: number, userMessage: string): string {\n const userMessageSection = `## User Message\\n${userMessage}\\n`;\n const reservedLength = userMessageSection.length + 500; // Reserve space for user message + buffer\n const availableLength = maxLength - reservedLength;\n\n if (availableLength < 500) {\n // Not enough space for context, just return user message\n return userMessageSection;\n }\n\n // Find a good truncation point\n const truncatedContext = prompt.slice(0, availableLength);\n const lastNewline = truncatedContext.lastIndexOf('\\n');\n \n return truncatedContext.slice(0, lastNewline) + '\\n\\n[Context truncated for length]\\n\\n' + userMessageSection;\n}\n\n/**\n * Build a simple prompt without full context (fallback)\n * \n * This also does NOT replace Copilot's system prompt.\n * Just enriches the user message with available context.\n */\nexport function buildSimplePrompt(\n userMessage: string,\n pageUrl?: string,\n pageTitle?: string,\n selectedText?: string\n): { systemPrompt: string | null; userPrompt: string } {\n let userPrompt = '';\n \n // Add any available context to the user message\n if (pageUrl || pageTitle || selectedText) {\n userPrompt += `**Context:**\\n`;\n if (pageUrl) userPrompt += `- Page URL: ${pageUrl}\\n`;\n if (pageTitle) userPrompt += `- Page Title: ${pageTitle}\\n`;\n if (selectedText) userPrompt += `- Selected Text: \"${selectedText.slice(0, 500)}${selectedText.length > 500 ? '...' : ''}\"\\n`;\n userPrompt += '\\n**Question:** ';\n }\n \n userPrompt += userMessage;\n\n // Return null for systemPrompt - we don't override Copilot's default\n return { systemPrompt: null, userPrompt };\n}\n\n/**\n * Validate context payload before using it for prompt building\n */\nexport function validateContext(context: unknown): context is ContextPayload {\n if (!context || typeof context !== 'object') return false;\n \n const c = context as Record<string, unknown>;\n \n // Check required fields\n if (!c.metadata || typeof c.metadata !== 'object') return false;\n if (!c.page || typeof c.page !== 'object') return false;\n if (!c.text || typeof c.text !== 'object') return false;\n if (!c.session || typeof c.session !== 'object') return false;\n \n return true;\n}\n\n/**\n * Sanitize context payload by removing any remaining sensitive data\n */\nexport function sanitizeContext(context: ContextPayload): ContextPayload {\n // Create a deep copy to avoid mutations\n const sanitized = JSON.parse(JSON.stringify(context)) as ContextPayload;\n\n // Additional sanitization patterns\n const sensitivePatterns = [\n /Bearer\\s+[A-Za-z0-9\\-_]+/gi,\n /api[_-]?key[=:]\\s*[A-Za-z0-9\\-_]+/gi,\n /password[=:]\\s*\\S+/gi,\n /token[=:]\\s*[A-Za-z0-9\\-_]+/gi,\n ];\n\n // Sanitize visible text\n let visibleText = sanitized.text.visibleText;\n for (const pattern of sensitivePatterns) {\n visibleText = visibleText.replace(pattern, '[REDACTED]');\n }\n sanitized.text.visibleText = visibleText;\n\n // Sanitize URL query params\n const url = new URL(sanitized.page.url);\n const sensitiveParams = ['token', 'key', 'secret', 'password', 'auth'];\n for (const param of sensitiveParams) {\n if (url.searchParams.has(param)) {\n url.searchParams.set(param, '[REDACTED]');\n }\n }\n sanitized.page.url = url.toString();\n sanitized.page.urlParsed.search = url.search;\n\n return sanitized;\n}\n","import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\nimport type { ApiResponse, ModelInfo, ModelPricingTier } from '@devmentorai/shared';\n\nconst TIER_ORDER: ModelPricingTier[] = ['free', 'cheap', 'standard', 'premium'];\n\nconst FALLBACK_MODEL: ModelInfo = {\n id: 'gpt-4.1',\n name: 'GPT-4.1',\n description: 'Recommended baseline model for DevMentorAI sessions',\n provider: 'openai',\n available: true,\n isDefault: true,\n pricingTier: 'free',\n pricingMultiplier: 0,\n};\n\nfunction sortModelsByTierAndName(models: ModelInfo[]): ModelInfo[] {\n return [...models].sort((a, b) => {\n const aTier = a.pricingTier || 'standard';\n const bTier = b.pricingTier || 'standard';\n const tierDiff = TIER_ORDER.indexOf(aTier) - TIER_ORDER.indexOf(bTier);\n if (tierDiff !== 0) return tierDiff;\n\n return a.name.localeCompare(b.name);\n });\n}\n\nasync function getModelsPayload(fastify: FastifyInstance): Promise<{ models: ModelInfo[]; default: string }> {\n const response = await fastify.copilotService.listModels();\n\n if (!response.models || response.models.length === 0) {\n return {\n models: [FALLBACK_MODEL],\n default: FALLBACK_MODEL.id,\n };\n }\n\n const sortedModels = sortModelsByTierAndName(response.models);\n const defaultModel =\n sortedModels.find((model) => model.id === response.default)?.id ||\n sortedModels.find((model) => model.isDefault)?.id ||\n FALLBACK_MODEL.id;\n\n return {\n models: sortedModels.map((model) => ({\n ...model,\n isDefault: model.id === defaultModel,\n })),\n default: defaultModel,\n };\n}\n\nexport async function modelsRoutes(fastify: FastifyInstance): Promise<void> {\n // List all available models\n fastify.get<{\n Reply: ApiResponse<{ models: ModelInfo[]; default: string }>;\n }>('/models', async (_request: FastifyRequest, reply: FastifyReply) => {\n const payload = await getModelsPayload(fastify);\n\n return reply.send({\n success: true,\n data: payload,\n });\n });\n\n // Get specific model info\n fastify.get<{\n Params: { id: string };\n Reply: ApiResponse<ModelInfo>;\n }>('/models/:id', async (request, reply) => {\n const modelId = request.params.id;\n const payload = await getModelsPayload(fastify);\n const model = payload.models.find((m) => m.id === modelId);\n\n if (!model) {\n return reply.code(404).send({\n success: false,\n error: {\n code: 'NOT_FOUND',\n message: `Model '${modelId}' not found`,\n },\n });\n }\n\n return reply.send({\n success: true,\n data: model,\n });\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { ApiResponse, CopilotAuthStatus, CopilotQuotaStatus } from '@devmentorai/shared';\n\nexport async function accountRoutes(fastify: FastifyInstance): Promise<void> {\n fastify.get<{\n Reply: ApiResponse<CopilotAuthStatus>;\n }>('/account/auth', async (_request, reply) => {\n const auth = await fastify.copilotService.getAuthStatus();\n\n return reply.send({\n success: true,\n data: auth,\n });\n });\n\n fastify.get<{\n Reply: ApiResponse<CopilotQuotaStatus>;\n }>('/account/quota', async (_request, reply) => {\n const quota = await fastify.copilotService.getQuota();\n\n return reply.send({\n success: true,\n data: quota,\n });\n });\n}\n","/**\n * Images Route\n * \n * Serves thumbnail and full images stored on disk.\n * Also provides an upload endpoint for pre-uploading images before chat.\n * \n * Routes:\n * GET /api/images/:sessionId/:messageId/thumb_:index.jpg - Thumbnail\n * GET /api/images/:sessionId/:messageId/image_:index.:ext - Full image\n * POST /api/images/upload/:sessionId/:messageId - Pre-upload images\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { z } from 'zod';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { IMAGES_DIR } from '../lib/paths.js';\nimport {\n getThumbnailFilePath,\n processMessageImages,\n toImageAttachments,\n} from '../services/thumbnail-service.js';\n\ninterface ImageParams {\n sessionId: string;\n messageId: string;\n filename: string;\n}\n\n// MIME types for supported image formats\nconst MIME_TYPES: Record<string, string> = {\n 'jpg': 'image/jpeg',\n 'jpeg': 'image/jpeg',\n 'png': 'image/png',\n 'webp': 'image/webp',\n 'gif': 'image/gif',\n};\n\n// Schema for identifying a single image in an upload payload\nconst uploadImageSchema = z.object({\n id: z.string(),\n dataUrl: z.string(),\n mimeType: z.enum(['image/png', 'image/jpeg', 'image/webp']),\n source: z.enum(['screenshot', 'paste', 'drop']),\n});\n\nconst uploadBodySchema = z.object({\n images: z.array(uploadImageSchema).min(1).max(5),\n});\n\nexport async function imagesRoutes(fastify: FastifyInstance) {\n /**\n * POST /api/images/upload/:sessionId/:messageId\n * Pre-upload images before sending the chat message.\n * Returns processed image info (thumbnailUrl, fullImageUrl, fullImagePath).\n */\n fastify.post<{\n Params: { sessionId: string; messageId: string };\n Body: z.infer<typeof uploadBodySchema>;\n }>(\n '/upload/:sessionId/:messageId',\n async (request, reply) => {\n try {\n const { sessionId, messageId } = request.params;\n const body = uploadBodySchema.parse(request.body);\n\n // Build backend URL for image serving\n const host = request.headers.host || `${request.hostname}:3847`;\n const backendUrl = `http://${host}`;\n\n console.log(`[ImagesRoute] Pre-uploading ${body.images.length} images for ${sessionId}/${messageId}`);\n\n const processedImagesRaw = await processMessageImages(\n sessionId,\n messageId,\n body.images,\n backendUrl\n );\n\n const processedImages = toImageAttachments(processedImagesRaw);\n\n // Return the processed image metadata + absolute paths for Copilot SDK attachments\n const responseImages = processedImagesRaw.map((img, i) => ({\n id: img.id,\n thumbnailUrl: img.thumbnailUrl,\n fullImageUrl: img.fullImageUrl,\n fullImagePath: img.fullImagePath,\n mimeType: img.mimeType,\n dimensions: img.dimensions,\n fileSize: img.fileSize,\n }));\n\n console.log(`[ImagesRoute] Pre-upload complete: ${responseImages.length} images processed`);\n\n return reply.send({\n success: true,\n data: { images: responseImages },\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return reply.code(400).send({\n success: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Invalid upload body',\n details: error.errors,\n },\n });\n }\n console.error('[ImagesRoute] Upload failed:', error);\n return reply.code(500).send({\n success: false,\n error: {\n code: 'UPLOAD_ERROR',\n message: error instanceof Error ? error.message : 'Failed to process images',\n },\n });\n }\n }\n );\n\n /**\n * GET /api/images/:sessionId/:messageId/:filename\n * Serves thumbnail or full image\n * \n * Filename patterns:\n * - thumb_0.jpg (thumbnail)\n * - image_0.jpg (full image)\n * - image_0.png (full image)\n */\n fastify.get<{ Params: ImageParams }>(\n '/:sessionId/:messageId/:filename',\n async (request: FastifyRequest<{ Params: ImageParams }>, reply: FastifyReply) => {\n const { sessionId, messageId, filename } = request.params;\n\n // Validate session and message IDs (basic security check)\n if (!sessionId?.match(/^session_[a-z0-9]+$/) || !messageId?.match(/^msg_[a-z0-9]+$/)) {\n return reply.code(400).send({ error: 'Invalid session or message ID format' });\n }\n\n // Parse filename - support thumb_N.jpg and image_N.ext\n let filePath: string | null = null;\n let mimeType = 'image/jpeg';\n\n // Check for thumbnail: thumb_0.jpg\n const thumbMatch = filename.match(/^thumb_(\\d+)\\.jpg$/);\n if (thumbMatch) {\n const imageIndex = parseInt(thumbMatch[1], 10);\n filePath = getThumbnailFilePath(sessionId, messageId, imageIndex);\n mimeType = 'image/jpeg';\n }\n\n // Check for full image: image_0.jpg, image_0.png, etc.\n const imageMatch = filename.match(/^image_(\\d+)\\.(jpg|jpeg|png|webp|gif)$/i);\n if (imageMatch) {\n const ext = imageMatch[2].toLowerCase();\n mimeType = MIME_TYPES[ext] || 'image/jpeg';\n // Build path directly\n filePath = path.join(IMAGES_DIR, sessionId, messageId, filename);\n }\n\n if (!filePath) {\n return reply.code(400).send({ error: 'Invalid filename format' });\n }\n\n // Check if file exists\n if (!fs.existsSync(filePath)) {\n console.log(`[ImagesRoute] File not found: ${filePath}`);\n return reply.code(404).send({ error: 'Image not found' });\n }\n\n // Read and send the file\n try {\n const fileBuffer = fs.readFileSync(filePath);\n \n return reply\n .code(200)\n .header('Content-Type', mimeType)\n .header('Cache-Control', 'public, max-age=31536000, immutable') // Cache for 1 year\n .header('Content-Length', fileBuffer.length)\n .send(fileBuffer);\n } catch (error) {\n console.error('[ImagesRoute] Failed to read image file:', error);\n return reply.code(500).send({ error: 'Failed to read image' });\n }\n }\n );\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { ApiResponse } from '@devmentorai/shared';\nimport { checkForUpdate, type UpdateInfo } from '@devmentorai/shared';\n\ninterface UpdatesResponse {\n backend: UpdateInfo;\n extension: UpdateInfo;\n}\n\nexport async function updatesRoutes(fastify: FastifyInstance) {\n fastify.get<{\n Reply: ApiResponse<UpdatesResponse>;\n }>('/updates', async (_request, reply) => {\n const [backend, extension] = await Promise.all([\n checkForUpdate('backend', '1.0.0'),\n checkForUpdate('extension', '1.0.0'),\n ]);\n\n return reply.send({\n success: true,\n data: { backend, extension },\n });\n });\n}\n","/**\n * Tools API Routes\n * \n * Exposes custom DevOps tools for direct execution\n * and provides tool metadata for the extension.\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\nimport type { CopilotService } from '../services/copilot.service.js';\nimport type { SessionType } from '@devmentorai/shared';\n\ninterface ToolExecuteBody {\n toolName: string;\n params: Record<string, unknown>;\n}\n\nexport function registerToolsRoutes(\n app: FastifyInstance, \n copilotService: CopilotService\n): void {\n \n // List available tools\n app.get('/api/tools', async (\n request: FastifyRequest<{ Querystring: { type?: SessionType } }>,\n reply: FastifyReply\n ) => {\n const sessionType = request.query.type || 'devops';\n const tools = copilotService.getAvailableTools(sessionType);\n \n return reply.send({\n success: true,\n data: tools,\n });\n });\n \n // Execute a tool directly\n app.post('/api/tools/execute', async (\n request: FastifyRequest<{ Body: ToolExecuteBody }>,\n reply: FastifyReply\n ) => {\n const { toolName, params } = request.body;\n \n if (!toolName) {\n return reply.status(400).send({\n success: false,\n error: 'toolName is required',\n });\n }\n \n const result = await copilotService.executeTool(toolName, params || {});\n \n if (!result.success) {\n return reply.status(400).send({\n success: false,\n error: result.error,\n });\n }\n \n return reply.send({\n success: true,\n data: {\n toolName,\n result: result.result,\n },\n });\n });\n \n // Analyze config endpoint (convenience wrapper)\n app.post('/api/tools/analyze-config', async (\n request: FastifyRequest<{ Body: { content: string; type?: string } }>,\n reply: FastifyReply\n ) => {\n const { content, type } = request.body;\n \n if (!content) {\n return reply.status(400).send({\n success: false,\n error: 'content is required',\n });\n }\n \n const result = await copilotService.executeTool('analyze_config', {\n content,\n type: type || 'auto',\n });\n \n return reply.send({\n success: result.success,\n data: result.result,\n error: result.error,\n });\n });\n \n // Analyze error endpoint (convenience wrapper)\n app.post('/api/tools/analyze-error', async (\n request: FastifyRequest<{ Body: { error: string; context?: string } }>,\n reply: FastifyReply\n ) => {\n const { error, context } = request.body;\n \n if (!error) {\n return reply.status(400).send({\n success: false,\n error: 'error is required',\n });\n }\n \n const result = await copilotService.executeTool('analyze_error', {\n error,\n context: context || 'general',\n });\n \n return reply.send({\n success: result.success,\n data: result.result,\n error: result.error,\n });\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { Socket } from \"node:net\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n createMessageConnection,\n StreamMessageReader,\n StreamMessageWriter\n} from \"vscode-jsonrpc/node.js\";\nimport { createServerRpc } from \"./generated/rpc.js\";\nimport { getSdkProtocolVersion } from \"./sdkProtocolVersion.js\";\nimport { CopilotSession } from \"./session.js\";\nfunction isZodSchema(value) {\n return value != null && typeof value === \"object\" && \"toJSONSchema\" in value && typeof value.toJSONSchema === \"function\";\n}\nfunction toJsonSchema(parameters) {\n if (!parameters) return void 0;\n if (isZodSchema(parameters)) {\n return parameters.toJSONSchema();\n }\n return parameters;\n}\nfunction getNodeExecPath() {\n if (process.versions.bun) {\n return \"node\";\n }\n return process.execPath;\n}\nfunction getBundledCliPath() {\n const sdkUrl = import.meta.resolve(\"@github/copilot/sdk\");\n const sdkPath = fileURLToPath(sdkUrl);\n return join(dirname(dirname(sdkPath)), \"index.js\");\n}\nclass CopilotClient {\n cliProcess = null;\n connection = null;\n socket = null;\n actualPort = null;\n actualHost = \"localhost\";\n state = \"disconnected\";\n sessions = /* @__PURE__ */ new Map();\n stderrBuffer = \"\";\n // Captures CLI stderr for error messages\n options;\n isExternalServer = false;\n forceStopping = false;\n modelsCache = null;\n modelsCacheLock = Promise.resolve();\n sessionLifecycleHandlers = /* @__PURE__ */ new Set();\n typedLifecycleHandlers = /* @__PURE__ */ new Map();\n _rpc = null;\n processExitPromise = null;\n // Rejects when CLI process exits\n /**\n * Typed server-scoped RPC methods.\n * @throws Error if the client is not connected\n */\n get rpc() {\n if (!this.connection) {\n throw new Error(\"Client is not connected. Call start() first.\");\n }\n if (!this._rpc) {\n this._rpc = createServerRpc(this.connection);\n }\n return this._rpc;\n }\n /**\n * Creates a new CopilotClient instance.\n *\n * @param options - Configuration options for the client\n * @throws Error if mutually exclusive options are provided (e.g., cliUrl with useStdio or cliPath)\n *\n * @example\n * ```typescript\n * // Default options - spawns CLI server using stdio\n * const client = new CopilotClient();\n *\n * // Connect to an existing server\n * const client = new CopilotClient({ cliUrl: \"localhost:3000\" });\n *\n * // Custom CLI path with specific log level\n * const client = new CopilotClient({\n * cliPath: \"/usr/local/bin/copilot\",\n * logLevel: \"debug\"\n * });\n * ```\n */\n constructor(options = {}) {\n if (options.cliUrl && (options.useStdio === true || options.cliPath)) {\n throw new Error(\"cliUrl is mutually exclusive with useStdio and cliPath\");\n }\n if (options.cliUrl && (options.githubToken || options.useLoggedInUser !== void 0)) {\n throw new Error(\n \"githubToken and useLoggedInUser cannot be used with cliUrl (external server manages its own auth)\"\n );\n }\n if (options.cliUrl) {\n const { host, port } = this.parseCliUrl(options.cliUrl);\n this.actualHost = host;\n this.actualPort = port;\n this.isExternalServer = true;\n }\n this.options = {\n cliPath: options.cliPath || getBundledCliPath(),\n cliArgs: options.cliArgs ?? [],\n cwd: options.cwd ?? process.cwd(),\n port: options.port || 0,\n useStdio: options.cliUrl ? false : options.useStdio ?? true,\n // Default to stdio unless cliUrl is provided\n cliUrl: options.cliUrl,\n logLevel: options.logLevel || \"debug\",\n autoStart: options.autoStart ?? true,\n autoRestart: options.autoRestart ?? true,\n env: options.env ?? process.env,\n githubToken: options.githubToken,\n // Default useLoggedInUser to false when githubToken is provided, otherwise true\n useLoggedInUser: options.useLoggedInUser ?? (options.githubToken ? false : true)\n };\n }\n /**\n * Parse CLI URL into host and port\n * Supports formats: \"host:port\", \"http://host:port\", \"https://host:port\", or just \"port\"\n */\n parseCliUrl(url) {\n let cleanUrl = url.replace(/^https?:\\/\\//, \"\");\n if (/^\\d+$/.test(cleanUrl)) {\n return { host: \"localhost\", port: parseInt(cleanUrl, 10) };\n }\n const parts = cleanUrl.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\n `Invalid cliUrl format: ${url}. Expected \"host:port\", \"http://host:port\", or \"port\"`\n );\n }\n const host = parts[0] || \"localhost\";\n const port = parseInt(parts[1], 10);\n if (isNaN(port) || port <= 0 || port > 65535) {\n throw new Error(`Invalid port in cliUrl: ${url}`);\n }\n return { host, port };\n }\n /**\n * Starts the CLI server and establishes a connection.\n *\n * If connecting to an external server (via cliUrl), only establishes the connection.\n * Otherwise, spawns the CLI server process and then connects.\n *\n * This method is called automatically when creating a session if `autoStart` is true (default).\n *\n * @returns A promise that resolves when the connection is established\n * @throws Error if the server fails to start or the connection fails\n *\n * @example\n * ```typescript\n * const client = new CopilotClient({ autoStart: false });\n * await client.start();\n * // Now ready to create sessions\n * ```\n */\n async start() {\n if (this.state === \"connected\") {\n return;\n }\n this.state = \"connecting\";\n try {\n if (!this.isExternalServer) {\n await this.startCLIServer();\n }\n await this.connectToServer();\n await this.verifyProtocolVersion();\n this.state = \"connected\";\n } catch (error) {\n this.state = \"error\";\n throw error;\n }\n }\n /**\n * Stops the CLI server and closes all active sessions.\n *\n * This method performs graceful cleanup:\n * 1. Destroys all active sessions with retry logic\n * 2. Closes the JSON-RPC connection\n * 3. Terminates the CLI server process (if spawned by this client)\n *\n * @returns A promise that resolves with an array of errors encountered during cleanup.\n * An empty array indicates all cleanup succeeded.\n *\n * @example\n * ```typescript\n * const errors = await client.stop();\n * if (errors.length > 0) {\n * console.error(\"Cleanup errors:\", errors);\n * }\n * ```\n */\n async stop() {\n const errors = [];\n for (const session of this.sessions.values()) {\n const sessionId = session.sessionId;\n let lastError = null;\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n await session.destroy();\n lastError = null;\n break;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (attempt < 3) {\n const delay = 100 * Math.pow(2, attempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n if (lastError) {\n errors.push(\n new Error(\n `Failed to destroy session ${sessionId} after 3 attempts: ${lastError.message}`\n )\n );\n }\n }\n this.sessions.clear();\n if (this.connection) {\n try {\n this.connection.dispose();\n } catch (error) {\n errors.push(\n new Error(\n `Failed to dispose connection: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n this.connection = null;\n this._rpc = null;\n }\n this.modelsCache = null;\n if (this.socket) {\n try {\n this.socket.end();\n } catch (error) {\n errors.push(\n new Error(\n `Failed to close socket: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n this.socket = null;\n }\n if (this.cliProcess && !this.isExternalServer) {\n try {\n this.cliProcess.kill();\n } catch (error) {\n errors.push(\n new Error(\n `Failed to kill CLI process: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n this.cliProcess = null;\n }\n this.state = \"disconnected\";\n this.actualPort = null;\n this.stderrBuffer = \"\";\n this.processExitPromise = null;\n return errors;\n }\n /**\n * Forcefully stops the CLI server without graceful cleanup.\n *\n * Use this when {@link stop} fails or takes too long. This method:\n * - Clears all sessions immediately without destroying them\n * - Force closes the connection\n * - Sends SIGKILL to the CLI process (if spawned by this client)\n *\n * @returns A promise that resolves when the force stop is complete\n *\n * @example\n * ```typescript\n * // If normal stop hangs, force stop\n * const stopPromise = client.stop();\n * const timeout = new Promise((_, reject) =>\n * setTimeout(() => reject(new Error(\"Timeout\")), 5000)\n * );\n *\n * try {\n * await Promise.race([stopPromise, timeout]);\n * } catch {\n * await client.forceStop();\n * }\n * ```\n */\n async forceStop() {\n this.forceStopping = true;\n this.sessions.clear();\n if (this.connection) {\n try {\n this.connection.dispose();\n } catch {\n }\n this.connection = null;\n this._rpc = null;\n }\n this.modelsCache = null;\n if (this.socket) {\n try {\n this.socket.destroy();\n } catch {\n }\n this.socket = null;\n }\n if (this.cliProcess && !this.isExternalServer) {\n try {\n this.cliProcess.kill(\"SIGKILL\");\n } catch {\n }\n this.cliProcess = null;\n }\n this.state = \"disconnected\";\n this.actualPort = null;\n this.stderrBuffer = \"\";\n this.processExitPromise = null;\n }\n /**\n * Creates a new conversation session with the Copilot CLI.\n *\n * Sessions maintain conversation state, handle events, and manage tool execution.\n * If the client is not connected and `autoStart` is enabled, this will automatically\n * start the connection.\n *\n * @param config - Optional configuration for the session\n * @returns A promise that resolves with the created session\n * @throws Error if the client is not connected and autoStart is disabled\n *\n * @example\n * ```typescript\n * // Basic session\n * const session = await client.createSession({ onPermissionRequest: approveAll });\n *\n * // Session with model and tools\n * const session = await client.createSession({\n * onPermissionRequest: approveAll,\n * model: \"gpt-4\",\n * tools: [{\n * name: \"get_weather\",\n * description: \"Get weather for a location\",\n * parameters: { type: \"object\", properties: { location: { type: \"string\" } } },\n * handler: async (args) => ({ temperature: 72 })\n * }]\n * });\n * ```\n */\n async createSession(config) {\n if (!config?.onPermissionRequest) {\n throw new Error(\n \"An onPermissionRequest handler is required when creating a session. For example, to allow all permissions, use { onPermissionRequest: approveAll }.\"\n );\n }\n if (!this.connection) {\n if (this.options.autoStart) {\n await this.start();\n } else {\n throw new Error(\"Client not connected. Call start() first.\");\n }\n }\n const response = await this.connection.sendRequest(\"session.create\", {\n model: config.model,\n sessionId: config.sessionId,\n clientName: config.clientName,\n reasoningEffort: config.reasoningEffort,\n tools: config.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: toJsonSchema(tool.parameters)\n })),\n systemMessage: config.systemMessage,\n availableTools: config.availableTools,\n excludedTools: config.excludedTools,\n provider: config.provider,\n requestPermission: true,\n requestUserInput: !!config.onUserInputRequest,\n hooks: !!(config.hooks && Object.values(config.hooks).some(Boolean)),\n workingDirectory: config.workingDirectory,\n streaming: config.streaming,\n mcpServers: config.mcpServers,\n envValueMode: \"direct\",\n customAgents: config.customAgents,\n configDir: config.configDir,\n skillDirectories: config.skillDirectories,\n disabledSkills: config.disabledSkills,\n infiniteSessions: config.infiniteSessions\n });\n const { sessionId, workspacePath } = response;\n const session = new CopilotSession(sessionId, this.connection, workspacePath);\n session.registerTools(config.tools);\n session.registerPermissionHandler(config.onPermissionRequest);\n if (config.onUserInputRequest) {\n session.registerUserInputHandler(config.onUserInputRequest);\n }\n if (config.hooks) {\n session.registerHooks(config.hooks);\n }\n this.sessions.set(sessionId, session);\n return session;\n }\n /**\n * Resumes an existing conversation session by its ID.\n *\n * This allows you to continue a previous conversation, maintaining all\n * conversation history. The session must have been previously created\n * and not deleted.\n *\n * @param sessionId - The ID of the session to resume\n * @param config - Optional configuration for the resumed session\n * @returns A promise that resolves with the resumed session\n * @throws Error if the session does not exist or the client is not connected\n *\n * @example\n * ```typescript\n * // Resume a previous session\n * const session = await client.resumeSession(\"session-123\", { onPermissionRequest: approveAll });\n *\n * // Resume with new tools\n * const session = await client.resumeSession(\"session-123\", {\n * onPermissionRequest: approveAll,\n * tools: [myNewTool]\n * });\n * ```\n */\n async resumeSession(sessionId, config) {\n if (!config?.onPermissionRequest) {\n throw new Error(\n \"An onPermissionRequest handler is required when resuming a session. For example, to allow all permissions, use { onPermissionRequest: approveAll }.\"\n );\n }\n if (!this.connection) {\n if (this.options.autoStart) {\n await this.start();\n } else {\n throw new Error(\"Client not connected. Call start() first.\");\n }\n }\n const response = await this.connection.sendRequest(\"session.resume\", {\n sessionId,\n clientName: config.clientName,\n model: config.model,\n reasoningEffort: config.reasoningEffort,\n systemMessage: config.systemMessage,\n availableTools: config.availableTools,\n excludedTools: config.excludedTools,\n tools: config.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: toJsonSchema(tool.parameters)\n })),\n provider: config.provider,\n requestPermission: true,\n requestUserInput: !!config.onUserInputRequest,\n hooks: !!(config.hooks && Object.values(config.hooks).some(Boolean)),\n workingDirectory: config.workingDirectory,\n configDir: config.configDir,\n streaming: config.streaming,\n mcpServers: config.mcpServers,\n envValueMode: \"direct\",\n customAgents: config.customAgents,\n skillDirectories: config.skillDirectories,\n disabledSkills: config.disabledSkills,\n infiniteSessions: config.infiniteSessions,\n disableResume: config.disableResume\n });\n const { sessionId: resumedSessionId, workspacePath } = response;\n const session = new CopilotSession(resumedSessionId, this.connection, workspacePath);\n session.registerTools(config.tools);\n session.registerPermissionHandler(config.onPermissionRequest);\n if (config.onUserInputRequest) {\n session.registerUserInputHandler(config.onUserInputRequest);\n }\n if (config.hooks) {\n session.registerHooks(config.hooks);\n }\n this.sessions.set(resumedSessionId, session);\n return session;\n }\n /**\n * Gets the current connection state of the client.\n *\n * @returns The current connection state: \"disconnected\", \"connecting\", \"connected\", or \"error\"\n *\n * @example\n * ```typescript\n * if (client.getState() === \"connected\") {\n * const session = await client.createSession({ onPermissionRequest: approveAll });\n * }\n * ```\n */\n getState() {\n return this.state;\n }\n /**\n * Sends a ping request to the server to verify connectivity.\n *\n * @param message - Optional message to include in the ping\n * @returns A promise that resolves with the ping response containing the message and timestamp\n * @throws Error if the client is not connected\n *\n * @example\n * ```typescript\n * const response = await client.ping(\"health check\");\n * console.log(`Server responded at ${new Date(response.timestamp)}`);\n * ```\n */\n async ping(message) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const result = await this.connection.sendRequest(\"ping\", { message });\n return result;\n }\n /**\n * Get CLI status including version and protocol information\n */\n async getStatus() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const result = await this.connection.sendRequest(\"status.get\", {});\n return result;\n }\n /**\n * Get current authentication status\n */\n async getAuthStatus() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const result = await this.connection.sendRequest(\"auth.getStatus\", {});\n return result;\n }\n /**\n * List available models with their metadata.\n *\n * Results are cached after the first successful call to avoid rate limiting.\n * The cache is cleared when the client disconnects.\n *\n * @throws Error if not authenticated\n */\n async listModels() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n await this.modelsCacheLock;\n let resolveLock;\n this.modelsCacheLock = new Promise((resolve) => {\n resolveLock = resolve;\n });\n try {\n if (this.modelsCache !== null) {\n return [...this.modelsCache];\n }\n const result = await this.connection.sendRequest(\"models.list\", {});\n const response = result;\n const models = response.models;\n this.modelsCache = models;\n return [...models];\n } finally {\n resolveLock();\n }\n }\n /**\n * Verify that the server's protocol version matches the SDK's expected version\n */\n async verifyProtocolVersion() {\n const expectedVersion = getSdkProtocolVersion();\n let pingResult;\n if (this.processExitPromise) {\n pingResult = await Promise.race([this.ping(), this.processExitPromise]);\n } else {\n pingResult = await this.ping();\n }\n const serverVersion = pingResult.protocolVersion;\n if (serverVersion === void 0) {\n throw new Error(\n `SDK protocol version mismatch: SDK expects version ${expectedVersion}, but server does not report a protocol version. Please update your server to ensure compatibility.`\n );\n }\n if (serverVersion !== expectedVersion) {\n throw new Error(\n `SDK protocol version mismatch: SDK expects version ${expectedVersion}, but server reports version ${serverVersion}. Please update your SDK or server to ensure compatibility.`\n );\n }\n }\n /**\n * Gets the ID of the most recently updated session.\n *\n * This is useful for resuming the last conversation when the session ID\n * was not stored.\n *\n * @returns A promise that resolves with the session ID, or undefined if no sessions exist\n * @throws Error if the client is not connected\n *\n * @example\n * ```typescript\n * const lastId = await client.getLastSessionId();\n * if (lastId) {\n * const session = await client.resumeSession(lastId, { onPermissionRequest: approveAll });\n * }\n * ```\n */\n async getLastSessionId() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.getLastId\", {});\n return response.sessionId;\n }\n /**\n * Deletes a session and its data from disk.\n *\n * This permanently removes the session and all its conversation history.\n * The session cannot be resumed after deletion.\n *\n * @param sessionId - The ID of the session to delete\n * @returns A promise that resolves when the session is deleted\n * @throws Error if the session does not exist or deletion fails\n *\n * @example\n * ```typescript\n * await client.deleteSession(\"session-123\");\n * ```\n */\n async deleteSession(sessionId) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.delete\", {\n sessionId\n });\n const { success, error } = response;\n if (!success) {\n throw new Error(`Failed to delete session ${sessionId}: ${error || \"Unknown error\"}`);\n }\n this.sessions.delete(sessionId);\n }\n /**\n * List all available sessions.\n *\n * @param filter - Optional filter to limit returned sessions by context fields\n *\n * @example\n * // List all sessions\n * const sessions = await client.listSessions();\n *\n * @example\n * // List sessions for a specific repository\n * const sessions = await client.listSessions({ repository: \"owner/repo\" });\n */\n async listSessions(filter) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.list\", { filter });\n const { sessions } = response;\n return sessions.map((s) => ({\n sessionId: s.sessionId,\n startTime: new Date(s.startTime),\n modifiedTime: new Date(s.modifiedTime),\n summary: s.summary,\n isRemote: s.isRemote,\n context: s.context\n }));\n }\n /**\n * Gets the foreground session ID in TUI+server mode.\n *\n * This returns the ID of the session currently displayed in the TUI.\n * Only available when connecting to a server running in TUI+server mode (--ui-server).\n *\n * @returns A promise that resolves with the foreground session ID, or undefined if none\n * @throws Error if the client is not connected\n *\n * @example\n * ```typescript\n * const sessionId = await client.getForegroundSessionId();\n * if (sessionId) {\n * console.log(`TUI is displaying session: ${sessionId}`);\n * }\n * ```\n */\n async getForegroundSessionId() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.getForeground\", {});\n return response.sessionId;\n }\n /**\n * Sets the foreground session in TUI+server mode.\n *\n * This requests the TUI to switch to displaying the specified session.\n * Only available when connecting to a server running in TUI+server mode (--ui-server).\n *\n * @param sessionId - The ID of the session to display in the TUI\n * @returns A promise that resolves when the session is switched\n * @throws Error if the client is not connected or if the operation fails\n *\n * @example\n * ```typescript\n * // Switch the TUI to display a specific session\n * await client.setForegroundSessionId(\"session-123\");\n * ```\n */\n async setForegroundSessionId(sessionId) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.setForeground\", { sessionId });\n const result = response;\n if (!result.success) {\n throw new Error(result.error || \"Failed to set foreground session\");\n }\n }\n on(eventTypeOrHandler, handler) {\n if (typeof eventTypeOrHandler === \"string\" && handler) {\n const eventType = eventTypeOrHandler;\n if (!this.typedLifecycleHandlers.has(eventType)) {\n this.typedLifecycleHandlers.set(eventType, /* @__PURE__ */ new Set());\n }\n const storedHandler = handler;\n this.typedLifecycleHandlers.get(eventType).add(storedHandler);\n return () => {\n const handlers = this.typedLifecycleHandlers.get(eventType);\n if (handlers) {\n handlers.delete(storedHandler);\n }\n };\n }\n const wildcardHandler = eventTypeOrHandler;\n this.sessionLifecycleHandlers.add(wildcardHandler);\n return () => {\n this.sessionLifecycleHandlers.delete(wildcardHandler);\n };\n }\n /**\n * Start the CLI server process\n */\n async startCLIServer() {\n return new Promise((resolve, reject) => {\n this.stderrBuffer = \"\";\n const args = [\n ...this.options.cliArgs,\n \"--headless\",\n \"--no-auto-update\",\n \"--log-level\",\n this.options.logLevel\n ];\n if (this.options.useStdio) {\n args.push(\"--stdio\");\n } else if (this.options.port > 0) {\n args.push(\"--port\", this.options.port.toString());\n }\n if (this.options.githubToken) {\n args.push(\"--auth-token-env\", \"COPILOT_SDK_AUTH_TOKEN\");\n }\n if (!this.options.useLoggedInUser) {\n args.push(\"--no-auto-login\");\n }\n const envWithoutNodeDebug = { ...this.options.env };\n delete envWithoutNodeDebug.NODE_DEBUG;\n if (this.options.githubToken) {\n envWithoutNodeDebug.COPILOT_SDK_AUTH_TOKEN = this.options.githubToken;\n }\n if (!existsSync(this.options.cliPath)) {\n throw new Error(\n `Copilot CLI not found at ${this.options.cliPath}. Ensure @github/copilot is installed.`\n );\n }\n const stdioConfig = this.options.useStdio ? [\"pipe\", \"pipe\", \"pipe\"] : [\"ignore\", \"pipe\", \"pipe\"];\n const isJsFile = this.options.cliPath.endsWith(\".js\");\n if (isJsFile) {\n this.cliProcess = spawn(getNodeExecPath(), [this.options.cliPath, ...args], {\n stdio: stdioConfig,\n cwd: this.options.cwd,\n env: envWithoutNodeDebug,\n windowsHide: true\n });\n } else {\n this.cliProcess = spawn(this.options.cliPath, args, {\n stdio: stdioConfig,\n cwd: this.options.cwd,\n env: envWithoutNodeDebug,\n windowsHide: true\n });\n }\n let stdout = \"\";\n let resolved = false;\n if (this.options.useStdio) {\n resolved = true;\n resolve();\n } else {\n this.cliProcess.stdout?.on(\"data\", (data) => {\n stdout += data.toString();\n const match = stdout.match(/listening on port (\\d+)/i);\n if (match && !resolved) {\n this.actualPort = parseInt(match[1], 10);\n resolved = true;\n resolve();\n }\n });\n }\n this.cliProcess.stderr?.on(\"data\", (data) => {\n this.stderrBuffer += data.toString();\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n if (line.trim()) {\n process.stderr.write(`[CLI subprocess] ${line}\n`);\n }\n }\n });\n this.cliProcess.on(\"error\", (error) => {\n if (!resolved) {\n resolved = true;\n const stderrOutput = this.stderrBuffer.trim();\n if (stderrOutput) {\n reject(\n new Error(\n `Failed to start CLI server: ${error.message}\nstderr: ${stderrOutput}`\n )\n );\n } else {\n reject(new Error(`Failed to start CLI server: ${error.message}`));\n }\n }\n });\n this.processExitPromise = new Promise((_, rejectProcessExit) => {\n this.cliProcess.on(\"exit\", (code) => {\n setTimeout(() => {\n const stderrOutput = this.stderrBuffer.trim();\n if (stderrOutput) {\n rejectProcessExit(\n new Error(\n `CLI server exited with code ${code}\nstderr: ${stderrOutput}`\n )\n );\n } else {\n rejectProcessExit(\n new Error(`CLI server exited unexpectedly with code ${code}`)\n );\n }\n }, 50);\n });\n });\n this.processExitPromise.catch(() => {\n });\n this.cliProcess.on(\"exit\", (code) => {\n if (!resolved) {\n resolved = true;\n const stderrOutput = this.stderrBuffer.trim();\n if (stderrOutput) {\n reject(\n new Error(\n `CLI server exited with code ${code}\nstderr: ${stderrOutput}`\n )\n );\n } else {\n reject(new Error(`CLI server exited with code ${code}`));\n }\n } else if (this.options.autoRestart && this.state === \"connected\") {\n void this.reconnect();\n }\n });\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n reject(new Error(\"Timeout waiting for CLI server to start\"));\n }\n }, 1e4);\n });\n }\n /**\n * Connect to the CLI server (via socket or stdio)\n */\n async connectToServer() {\n if (this.options.useStdio) {\n return this.connectViaStdio();\n } else {\n return this.connectViaTcp();\n }\n }\n /**\n * Connect via stdio pipes\n */\n async connectViaStdio() {\n if (!this.cliProcess) {\n throw new Error(\"CLI process not started\");\n }\n this.cliProcess.stdin?.on(\"error\", (err) => {\n if (!this.forceStopping) {\n throw err;\n }\n });\n this.connection = createMessageConnection(\n new StreamMessageReader(this.cliProcess.stdout),\n new StreamMessageWriter(this.cliProcess.stdin)\n );\n this.attachConnectionHandlers();\n this.connection.listen();\n }\n /**\n * Connect to the CLI server via TCP socket\n */\n async connectViaTcp() {\n if (!this.actualPort) {\n throw new Error(\"Server port not available\");\n }\n return new Promise((resolve, reject) => {\n this.socket = new Socket();\n this.socket.connect(this.actualPort, this.actualHost, () => {\n this.connection = createMessageConnection(\n new StreamMessageReader(this.socket),\n new StreamMessageWriter(this.socket)\n );\n this.attachConnectionHandlers();\n this.connection.listen();\n resolve();\n });\n this.socket.on(\"error\", (error) => {\n reject(new Error(`Failed to connect to CLI server: ${error.message}`));\n });\n });\n }\n attachConnectionHandlers() {\n if (!this.connection) {\n return;\n }\n this.connection.onNotification(\"session.event\", (notification) => {\n this.handleSessionEventNotification(notification);\n });\n this.connection.onNotification(\"session.lifecycle\", (notification) => {\n this.handleSessionLifecycleNotification(notification);\n });\n this.connection.onRequest(\n \"tool.call\",\n async (params) => await this.handleToolCallRequest(params)\n );\n this.connection.onRequest(\n \"permission.request\",\n async (params) => await this.handlePermissionRequest(params)\n );\n this.connection.onRequest(\n \"userInput.request\",\n async (params) => await this.handleUserInputRequest(params)\n );\n this.connection.onRequest(\n \"hooks.invoke\",\n async (params) => await this.handleHooksInvoke(params)\n );\n this.connection.onClose(() => {\n if (this.state === \"connected\" && this.options.autoRestart) {\n void this.reconnect();\n }\n });\n this.connection.onError((_error) => {\n });\n }\n handleSessionEventNotification(notification) {\n if (typeof notification !== \"object\" || !notification || !(\"sessionId\" in notification) || typeof notification.sessionId !== \"string\" || !(\"event\" in notification)) {\n return;\n }\n const session = this.sessions.get(notification.sessionId);\n if (session) {\n session._dispatchEvent(notification.event);\n }\n }\n handleSessionLifecycleNotification(notification) {\n if (typeof notification !== \"object\" || !notification || !(\"type\" in notification) || typeof notification.type !== \"string\" || !(\"sessionId\" in notification) || typeof notification.sessionId !== \"string\") {\n return;\n }\n const event = notification;\n const typedHandlers = this.typedLifecycleHandlers.get(event.type);\n if (typedHandlers) {\n for (const handler of typedHandlers) {\n try {\n handler(event);\n } catch {\n }\n }\n }\n for (const handler of this.sessionLifecycleHandlers) {\n try {\n handler(event);\n } catch {\n }\n }\n }\n async handleToolCallRequest(params) {\n if (!params || typeof params.sessionId !== \"string\" || typeof params.toolCallId !== \"string\" || typeof params.toolName !== \"string\") {\n throw new Error(\"Invalid tool call payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Unknown session ${params.sessionId}`);\n }\n const handler = session.getToolHandler(params.toolName);\n if (!handler) {\n return { result: this.buildUnsupportedToolResult(params.toolName) };\n }\n return await this.executeToolCall(handler, params);\n }\n async executeToolCall(handler, request) {\n try {\n const invocation = {\n sessionId: request.sessionId,\n toolCallId: request.toolCallId,\n toolName: request.toolName,\n arguments: request.arguments\n };\n const result = await handler(request.arguments, invocation);\n return { result: this.normalizeToolResult(result) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n result: {\n // Don't expose detailed error information to the LLM for security reasons\n textResultForLlm: \"Invoking this tool produced an error. Detailed information is not available.\",\n resultType: \"failure\",\n error: message,\n toolTelemetry: {}\n }\n };\n }\n }\n async handlePermissionRequest(params) {\n if (!params || typeof params.sessionId !== \"string\" || !params.permissionRequest) {\n throw new Error(\"Invalid permission request payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Session not found: ${params.sessionId}`);\n }\n try {\n const result = await session._handlePermissionRequest(params.permissionRequest);\n return { result };\n } catch (_error) {\n return {\n result: {\n kind: \"denied-no-approval-rule-and-could-not-request-from-user\"\n }\n };\n }\n }\n async handleUserInputRequest(params) {\n if (!params || typeof params.sessionId !== \"string\" || typeof params.question !== \"string\") {\n throw new Error(\"Invalid user input request payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Session not found: ${params.sessionId}`);\n }\n const result = await session._handleUserInputRequest({\n question: params.question,\n choices: params.choices,\n allowFreeform: params.allowFreeform\n });\n return result;\n }\n async handleHooksInvoke(params) {\n if (!params || typeof params.sessionId !== \"string\" || typeof params.hookType !== \"string\") {\n throw new Error(\"Invalid hooks invoke payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Session not found: ${params.sessionId}`);\n }\n const output = await session._handleHooksInvoke(params.hookType, params.input);\n return { output };\n }\n normalizeToolResult(result) {\n if (result === void 0 || result === null) {\n return {\n textResultForLlm: \"Tool returned no result\",\n resultType: \"failure\",\n error: \"tool returned no result\",\n toolTelemetry: {}\n };\n }\n if (this.isToolResultObject(result)) {\n return result;\n }\n const textResult = typeof result === \"string\" ? result : JSON.stringify(result);\n return {\n textResultForLlm: textResult,\n resultType: \"success\",\n toolTelemetry: {}\n };\n }\n isToolResultObject(value) {\n return typeof value === \"object\" && value !== null && \"textResultForLlm\" in value && typeof value.textResultForLlm === \"string\" && \"resultType\" in value;\n }\n buildUnsupportedToolResult(toolName) {\n return {\n textResultForLlm: `Tool '${toolName}' is not supported by this client instance.`,\n resultType: \"failure\",\n error: `tool '${toolName}' not supported`,\n toolTelemetry: {}\n };\n }\n /**\n * Attempt to reconnect to the server\n */\n async reconnect() {\n this.state = \"disconnected\";\n try {\n await this.stop();\n await this.start();\n } catch (_error) {\n }\n }\n}\nexport {\n CopilotClient\n};\n","function createServerRpc(connection) {\n return {\n ping: async (params) => connection.sendRequest(\"ping\", params),\n models: {\n list: async () => connection.sendRequest(\"models.list\", {})\n },\n tools: {\n list: async (params) => connection.sendRequest(\"tools.list\", params)\n },\n account: {\n getQuota: async () => connection.sendRequest(\"account.getQuota\", {})\n }\n };\n}\nfunction createSessionRpc(connection, sessionId) {\n return {\n model: {\n getCurrent: async () => connection.sendRequest(\"session.model.getCurrent\", { sessionId }),\n switchTo: async (params) => connection.sendRequest(\"session.model.switchTo\", { sessionId, ...params })\n },\n mode: {\n get: async () => connection.sendRequest(\"session.mode.get\", { sessionId }),\n set: async (params) => connection.sendRequest(\"session.mode.set\", { sessionId, ...params })\n },\n plan: {\n read: async () => connection.sendRequest(\"session.plan.read\", { sessionId }),\n update: async (params) => connection.sendRequest(\"session.plan.update\", { sessionId, ...params }),\n delete: async () => connection.sendRequest(\"session.plan.delete\", { sessionId })\n },\n workspace: {\n listFiles: async () => connection.sendRequest(\"session.workspace.listFiles\", { sessionId }),\n readFile: async (params) => connection.sendRequest(\"session.workspace.readFile\", { sessionId, ...params }),\n createFile: async (params) => connection.sendRequest(\"session.workspace.createFile\", { sessionId, ...params })\n },\n fleet: {\n start: async (params) => connection.sendRequest(\"session.fleet.start\", { sessionId, ...params })\n },\n agent: {\n list: async () => connection.sendRequest(\"session.agent.list\", { sessionId }),\n getCurrent: async () => connection.sendRequest(\"session.agent.getCurrent\", { sessionId }),\n select: async (params) => connection.sendRequest(\"session.agent.select\", { sessionId, ...params }),\n deselect: async () => connection.sendRequest(\"session.agent.deselect\", { sessionId })\n },\n compaction: {\n compact: async () => connection.sendRequest(\"session.compaction.compact\", { sessionId })\n }\n };\n}\nexport {\n createServerRpc,\n createSessionRpc\n};\n","const SDK_PROTOCOL_VERSION = 2;\nfunction getSdkProtocolVersion() {\n return SDK_PROTOCOL_VERSION;\n}\nexport {\n SDK_PROTOCOL_VERSION,\n getSdkProtocolVersion\n};\n","import { createSessionRpc } from \"./generated/rpc.js\";\nclass CopilotSession {\n /**\n * Creates a new CopilotSession instance.\n *\n * @param sessionId - The unique identifier for this session\n * @param connection - The JSON-RPC message connection to the Copilot CLI\n * @param workspacePath - Path to the session workspace directory (when infinite sessions enabled)\n * @internal This constructor is internal. Use {@link CopilotClient.createSession} to create sessions.\n */\n constructor(sessionId, connection, _workspacePath) {\n this.sessionId = sessionId;\n this.connection = connection;\n this._workspacePath = _workspacePath;\n }\n eventHandlers = /* @__PURE__ */ new Set();\n typedEventHandlers = /* @__PURE__ */ new Map();\n toolHandlers = /* @__PURE__ */ new Map();\n permissionHandler;\n userInputHandler;\n hooks;\n _rpc = null;\n /**\n * Typed session-scoped RPC methods.\n */\n get rpc() {\n if (!this._rpc) {\n this._rpc = createSessionRpc(this.connection, this.sessionId);\n }\n return this._rpc;\n }\n /**\n * Path to the session workspace directory when infinite sessions are enabled.\n * Contains checkpoints/, plan.md, and files/ subdirectories.\n * Undefined if infinite sessions are disabled.\n */\n get workspacePath() {\n return this._workspacePath;\n }\n /**\n * Sends a message to this session and waits for the response.\n *\n * The message is processed asynchronously. Subscribe to events via {@link on}\n * to receive streaming responses and other session events.\n *\n * @param options - The message options including the prompt and optional attachments\n * @returns A promise that resolves with the message ID of the response\n * @throws Error if the session has been destroyed or the connection fails\n *\n * @example\n * ```typescript\n * const messageId = await session.send({\n * prompt: \"Explain this code\",\n * attachments: [{ type: \"file\", path: \"./src/index.ts\" }]\n * });\n * ```\n */\n async send(options) {\n const response = await this.connection.sendRequest(\"session.send\", {\n sessionId: this.sessionId,\n prompt: options.prompt,\n attachments: options.attachments,\n mode: options.mode\n });\n return response.messageId;\n }\n /**\n * Sends a message to this session and waits until the session becomes idle.\n *\n * This is a convenience method that combines {@link send} with waiting for\n * the `session.idle` event. Use this when you want to block until the\n * assistant has finished processing the message.\n *\n * Events are still delivered to handlers registered via {@link on} while waiting.\n *\n * @param options - The message options including the prompt and optional attachments\n * @param timeout - Timeout in milliseconds (default: 60000). Controls how long to wait; does not abort in-flight agent work.\n * @returns A promise that resolves with the final assistant message when the session becomes idle,\n * or undefined if no assistant message was received\n * @throws Error if the timeout is reached before the session becomes idle\n * @throws Error if the session has been destroyed or the connection fails\n *\n * @example\n * ```typescript\n * // Send and wait for completion with default 60s timeout\n * const response = await session.sendAndWait({ prompt: \"What is 2+2?\" });\n * console.log(response?.data.content); // \"4\"\n * ```\n */\n async sendAndWait(options, timeout) {\n const effectiveTimeout = timeout ?? 6e4;\n let resolveIdle;\n let rejectWithError;\n const idlePromise = new Promise((resolve, reject) => {\n resolveIdle = resolve;\n rejectWithError = reject;\n });\n let lastAssistantMessage;\n const unsubscribe = this.on((event) => {\n if (event.type === \"assistant.message\") {\n lastAssistantMessage = event;\n } else if (event.type === \"session.idle\") {\n resolveIdle();\n } else if (event.type === \"session.error\") {\n const error = new Error(event.data.message);\n error.stack = event.data.stack;\n rejectWithError(error);\n }\n });\n let timeoutId;\n try {\n await this.send(options);\n const timeoutPromise = new Promise((_, reject) => {\n timeoutId = setTimeout(\n () => reject(\n new Error(\n `Timeout after ${effectiveTimeout}ms waiting for session.idle`\n )\n ),\n effectiveTimeout\n );\n });\n await Promise.race([idlePromise, timeoutPromise]);\n return lastAssistantMessage;\n } finally {\n if (timeoutId !== void 0) {\n clearTimeout(timeoutId);\n }\n unsubscribe();\n }\n }\n on(eventTypeOrHandler, handler) {\n if (typeof eventTypeOrHandler === \"string\" && handler) {\n const eventType = eventTypeOrHandler;\n if (!this.typedEventHandlers.has(eventType)) {\n this.typedEventHandlers.set(eventType, /* @__PURE__ */ new Set());\n }\n const storedHandler = handler;\n this.typedEventHandlers.get(eventType).add(storedHandler);\n return () => {\n const handlers = this.typedEventHandlers.get(eventType);\n if (handlers) {\n handlers.delete(storedHandler);\n }\n };\n }\n const wildcardHandler = eventTypeOrHandler;\n this.eventHandlers.add(wildcardHandler);\n return () => {\n this.eventHandlers.delete(wildcardHandler);\n };\n }\n /**\n * Dispatches an event to all registered handlers.\n *\n * @param event - The session event to dispatch\n * @internal This method is for internal use by the SDK.\n */\n _dispatchEvent(event) {\n const typedHandlers = this.typedEventHandlers.get(event.type);\n if (typedHandlers) {\n for (const handler of typedHandlers) {\n try {\n handler(event);\n } catch (_error) {\n }\n }\n }\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch (_error) {\n }\n }\n }\n /**\n * Registers custom tool handlers for this session.\n *\n * Tools allow the assistant to execute custom functions. When the assistant\n * invokes a tool, the corresponding handler is called with the tool arguments.\n *\n * @param tools - An array of tool definitions with their handlers, or undefined to clear all tools\n * @internal This method is typically called internally when creating a session with tools.\n */\n registerTools(tools) {\n this.toolHandlers.clear();\n if (!tools) {\n return;\n }\n for (const tool of tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n }\n }\n /**\n * Retrieves a registered tool handler by name.\n *\n * @param name - The name of the tool to retrieve\n * @returns The tool handler if found, or undefined\n * @internal This method is for internal use by the SDK.\n */\n getToolHandler(name) {\n return this.toolHandlers.get(name);\n }\n /**\n * Registers a handler for permission requests.\n *\n * When the assistant needs permission to perform certain actions (e.g., file operations),\n * this handler is called to approve or deny the request.\n *\n * @param handler - The permission handler function, or undefined to remove the handler\n * @internal This method is typically called internally when creating a session.\n */\n registerPermissionHandler(handler) {\n this.permissionHandler = handler;\n }\n /**\n * Registers a user input handler for ask_user requests.\n *\n * When the agent needs input from the user (via ask_user tool),\n * this handler is called to provide the response.\n *\n * @param handler - The user input handler function, or undefined to remove the handler\n * @internal This method is typically called internally when creating a session.\n */\n registerUserInputHandler(handler) {\n this.userInputHandler = handler;\n }\n /**\n * Registers hook handlers for session lifecycle events.\n *\n * Hooks allow custom logic to be executed at various points during\n * the session lifecycle (before/after tool use, session start/end, etc.).\n *\n * @param hooks - The hook handlers object, or undefined to remove all hooks\n * @internal This method is typically called internally when creating a session.\n */\n registerHooks(hooks) {\n this.hooks = hooks;\n }\n /**\n * Handles a permission request from the Copilot CLI.\n *\n * @param request - The permission request data from the CLI\n * @returns A promise that resolves with the permission decision\n * @internal This method is for internal use by the SDK.\n */\n async _handlePermissionRequest(request) {\n if (!this.permissionHandler) {\n return { kind: \"denied-no-approval-rule-and-could-not-request-from-user\" };\n }\n try {\n const result = await this.permissionHandler(request, {\n sessionId: this.sessionId\n });\n return result;\n } catch (_error) {\n return { kind: \"denied-no-approval-rule-and-could-not-request-from-user\" };\n }\n }\n /**\n * Handles a user input request from the Copilot CLI.\n *\n * @param request - The user input request data from the CLI\n * @returns A promise that resolves with the user's response\n * @internal This method is for internal use by the SDK.\n */\n async _handleUserInputRequest(request) {\n if (!this.userInputHandler) {\n throw new Error(\"User input requested but no handler registered\");\n }\n try {\n const result = await this.userInputHandler(request, {\n sessionId: this.sessionId\n });\n return result;\n } catch (error) {\n throw error;\n }\n }\n /**\n * Handles a hooks invocation from the Copilot CLI.\n *\n * @param hookType - The type of hook being invoked\n * @param input - The input data for the hook\n * @returns A promise that resolves with the hook output, or undefined\n * @internal This method is for internal use by the SDK.\n */\n async _handleHooksInvoke(hookType, input) {\n if (!this.hooks) {\n return void 0;\n }\n const handlerMap = {\n preToolUse: this.hooks.onPreToolUse,\n postToolUse: this.hooks.onPostToolUse,\n userPromptSubmitted: this.hooks.onUserPromptSubmitted,\n sessionStart: this.hooks.onSessionStart,\n sessionEnd: this.hooks.onSessionEnd,\n errorOccurred: this.hooks.onErrorOccurred\n };\n const handler = handlerMap[hookType];\n if (!handler) {\n return void 0;\n }\n try {\n const result = await handler(input, { sessionId: this.sessionId });\n return result;\n } catch (_error) {\n return void 0;\n }\n }\n /**\n * Retrieves all events and messages from this session's history.\n *\n * This returns the complete conversation history including user messages,\n * assistant responses, tool executions, and other session events.\n *\n * @returns A promise that resolves with an array of all session events\n * @throws Error if the session has been destroyed or the connection fails\n *\n * @example\n * ```typescript\n * const events = await session.getMessages();\n * for (const event of events) {\n * if (event.type === \"assistant.message\") {\n * console.log(\"Assistant:\", event.data.content);\n * }\n * }\n * ```\n */\n async getMessages() {\n const response = await this.connection.sendRequest(\"session.getMessages\", {\n sessionId: this.sessionId\n });\n return response.events;\n }\n /**\n * Destroys this session and releases all associated resources.\n *\n * After calling this method, the session can no longer be used. All event\n * handlers and tool handlers are cleared. To continue the conversation,\n * use {@link CopilotClient.resumeSession} with the session ID.\n *\n * @returns A promise that resolves when the session is destroyed\n * @throws Error if the connection fails\n *\n * @example\n * ```typescript\n * // Clean up when done\n * await session.destroy();\n * ```\n */\n async destroy() {\n await this.connection.sendRequest(\"session.destroy\", {\n sessionId: this.sessionId\n });\n this.eventHandlers.clear();\n this.typedEventHandlers.clear();\n this.toolHandlers.clear();\n this.permissionHandler = void 0;\n }\n /**\n * Aborts the currently processing message in this session.\n *\n * Use this to cancel a long-running request. The session remains valid\n * and can continue to be used for new messages.\n *\n * @returns A promise that resolves when the abort request is acknowledged\n * @throws Error if the session has been destroyed or the connection fails\n *\n * @example\n * ```typescript\n * // Start a long-running request\n * const messagePromise = session.send({ prompt: \"Write a very long story...\" });\n *\n * // Abort after 5 seconds\n * setTimeout(async () => {\n * await session.abort();\n * }, 5000);\n * ```\n */\n async abort() {\n await this.connection.sendRequest(\"session.abort\", {\n sessionId: this.sessionId\n });\n }\n}\nexport {\n CopilotSession\n};\n","function defineTool(name, config) {\n return { name, ...config };\n}\nconst approveAll = () => ({ kind: \"approved\" });\nexport {\n approveAll,\n defineTool\n};\n","/**\n * Custom DevOps Analysis Tools for DevMentorAI\n * \n * These tools extend Copilot's capabilities with specialized DevOps functionality:\n * - Configuration file analysis\n * - Infrastructure best practices checking\n * - Log analysis\n * - Cost estimation helpers\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport interface Tool {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, {\n type: string;\n description: string;\n enum?: string[];\n }>;\n required: string[];\n };\n handler: (params: Record<string, unknown>) => Promise<string>;\n}\n\n// Allowed directories for file access (security sandbox)\nconst ALLOWED_DIRECTORIES = [\n process.env.HOME || '/home',\n '/tmp',\n];\n\nfunction isPathAllowed(filePath: string): boolean {\n const resolved = path.resolve(filePath);\n return ALLOWED_DIRECTORIES.some(dir => resolved.startsWith(dir));\n}\n\n/**\n * Read file contents with security checks\n */\nexport const readFileTool: Tool = {\n name: 'read_file',\n description: 'Read the contents of a local file. Use this to analyze configuration files, logs, or code.',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Absolute or relative path to the file to read',\n },\n maxLines: {\n type: 'number',\n description: 'Maximum number of lines to read (default: 500)',\n },\n },\n required: ['path'],\n },\n handler: async (params) => {\n const filePath = params.path as string;\n const maxLines = (params.maxLines as number) || 500;\n\n if (!isPathAllowed(filePath)) {\n return `Error: Access denied. Path \"${filePath}\" is outside allowed directories.`;\n }\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n \n if (lines.length > maxLines) {\n return lines.slice(0, maxLines).join('\\n') + \n `\\n\\n[Truncated: ${lines.length - maxLines} more lines]`;\n }\n \n return content;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return `Error: File not found: ${filePath}`;\n }\n return `Error reading file: ${error}`;\n }\n },\n};\n\n/**\n * List directory contents\n */\nexport const listDirectoryTool: Tool = {\n name: 'list_directory',\n description: 'List contents of a directory. Useful for exploring project structure.',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the directory to list',\n },\n recursive: {\n type: 'boolean',\n description: 'Whether to list recursively (default: false, max depth: 3)',\n },\n },\n required: ['path'],\n },\n handler: async (params) => {\n const dirPath = params.path as string;\n const recursive = params.recursive as boolean || false;\n\n if (!isPathAllowed(dirPath)) {\n return `Error: Access denied. Path \"${dirPath}\" is outside allowed directories.`;\n }\n\n async function listDir(dir: string, depth: number = 0): Promise<string[]> {\n if (depth > 3) return [];\n \n const entries = await fs.readdir(dir, { withFileTypes: true });\n const results: string[] = [];\n \n for (const entry of entries) {\n const prefix = ' '.repeat(depth);\n const fullPath = path.join(dir, entry.name);\n \n if (entry.isDirectory()) {\n results.push(`${prefix}📁 ${entry.name}/`);\n if (recursive) {\n results.push(...await listDir(fullPath, depth + 1));\n }\n } else {\n const stats = await fs.stat(fullPath);\n const size = formatSize(stats.size);\n results.push(`${prefix}📄 ${entry.name} (${size})`);\n }\n }\n \n return results;\n }\n\n try {\n const contents = await listDir(dirPath);\n return contents.join('\\n');\n } catch (error) {\n return `Error listing directory: ${error}`;\n }\n },\n};\n\nfunction formatSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n}\n\n/**\n * Analyze configuration file for best practices\n */\nexport const analyzeConfigTool: Tool = {\n name: 'analyze_config',\n description: 'Analyze a configuration file for DevOps best practices. Supports Kubernetes, Docker, Terraform, and CloudFormation.',\n parameters: {\n type: 'object',\n properties: {\n content: {\n type: 'string',\n description: 'The configuration file content to analyze',\n },\n type: {\n type: 'string',\n enum: ['kubernetes', 'docker', 'terraform', 'cloudformation', 'github-actions', 'auto'],\n description: 'Type of configuration (auto-detect if not specified)',\n },\n },\n required: ['content'],\n },\n handler: async (params) => {\n const content = params.content as string;\n let configType = params.type as string || 'auto';\n\n // Auto-detect config type\n if (configType === 'auto') {\n configType = detectConfigType(content);\n }\n\n const issues: string[] = [];\n const suggestions: string[] = [];\n\n switch (configType) {\n case 'kubernetes':\n analyzeKubernetes(content, issues, suggestions);\n break;\n case 'docker':\n analyzeDocker(content, issues, suggestions);\n break;\n case 'terraform':\n analyzeTerraform(content, issues, suggestions);\n break;\n case 'cloudformation':\n analyzeCloudFormation(content, issues, suggestions);\n break;\n case 'github-actions':\n analyzeGitHubActions(content, issues, suggestions);\n break;\n default:\n return `Could not determine configuration type. Please specify the type parameter.`;\n }\n\n let result = `## Configuration Analysis (${configType})\\n\\n`;\n \n if (issues.length > 0) {\n result += `### ⚠️ Issues Found\\n`;\n issues.forEach((issue, i) => {\n result += `${i + 1}. ${issue}\\n`;\n });\n result += '\\n';\n } else {\n result += `### ✅ No Critical Issues Found\\n\\n`;\n }\n\n if (suggestions.length > 0) {\n result += `### 💡 Suggestions\\n`;\n suggestions.forEach((suggestion, i) => {\n result += `${i + 1}. ${suggestion}\\n`;\n });\n }\n\n return result;\n },\n};\n\nfunction detectConfigType(content: string): string {\n if (content.includes('apiVersion:') && content.includes('kind:')) return 'kubernetes';\n if (content.includes('FROM ') || content.includes('COPY ') || content.includes('RUN ')) return 'docker';\n if (content.includes('resource \"') || content.includes('provider \"')) return 'terraform';\n if (content.includes('AWSTemplateFormatVersion') || content.includes('Resources:')) return 'cloudformation';\n if (content.includes('jobs:') && content.includes('runs-on:')) return 'github-actions';\n return 'unknown';\n}\n\nfunction analyzeKubernetes(content: string, issues: string[], suggestions: string[]): void {\n // Resource limits\n if (!content.includes('resources:') || !content.includes('limits:')) {\n issues.push('Missing resource limits. Pods without limits can consume excessive cluster resources.');\n }\n \n // Security context\n if (!content.includes('securityContext:')) {\n suggestions.push('Consider adding securityContext to restrict container privileges.');\n }\n \n // Image tag\n if (content.includes(':latest')) {\n issues.push('Using :latest tag. Pin specific image versions for reproducible deployments.');\n }\n \n // Probes\n if (!content.includes('livenessProbe:') && !content.includes('readinessProbe:')) {\n suggestions.push('Add health probes (livenessProbe/readinessProbe) for better reliability.');\n }\n \n // Namespace\n if (!content.includes('namespace:')) {\n suggestions.push('Explicitly specify namespace to avoid deploying to default namespace.');\n }\n\n // Run as non-root\n if (content.includes('runAsRoot: true') || content.includes('privileged: true')) {\n issues.push('Container configured to run as root or privileged. This is a security risk.');\n }\n}\n\nfunction analyzeDocker(content: string, issues: string[], suggestions: string[]): void {\n const lines = content.split('\\n');\n \n // Base image\n const fromLine = lines.find(l => l.trim().startsWith('FROM '));\n if (fromLine?.includes(':latest')) {\n issues.push('Using :latest base image. Pin a specific version for reproducible builds.');\n }\n \n // Multiple RUN commands\n const runCount = lines.filter(l => l.trim().startsWith('RUN ')).length;\n if (runCount > 5) {\n suggestions.push(`${runCount} separate RUN commands. Consider combining them to reduce image layers.`);\n }\n \n // COPY vs ADD\n if (content.includes('ADD ') && !content.includes('.tar') && !content.includes('http')) {\n suggestions.push('Use COPY instead of ADD for simple file copying. ADD has extra features that may be unnecessary.');\n }\n \n // .dockerignore reminder\n if (content.includes('COPY . ') || content.includes('COPY ./ ')) {\n suggestions.push('Copying entire context. Ensure .dockerignore is configured to exclude unnecessary files.');\n }\n \n // Non-root user\n if (!content.includes('USER ')) {\n suggestions.push('No USER directive. Consider running as non-root user for security.');\n }\n \n // Multi-stage builds\n if (!content.includes('AS ') && content.includes('npm install') || content.includes('go build')) {\n suggestions.push('Consider multi-stage builds to reduce final image size.');\n }\n}\n\nfunction analyzeTerraform(content: string, issues: string[], suggestions: string[]): void {\n // Version constraints\n if (!content.includes('required_version') && !content.includes('required_providers')) {\n issues.push('Missing version constraints. Pin Terraform and provider versions for reproducibility.');\n }\n \n // Hardcoded values\n const hardcodedPatterns = [\n /ami-[a-z0-9]+/,\n /subnet-[a-z0-9]+/,\n /sg-[a-z0-9]+/,\n /vpc-[a-z0-9]+/,\n ];\n for (const pattern of hardcodedPatterns) {\n if (pattern.test(content)) {\n suggestions.push('Hardcoded AWS resource IDs detected. Consider using data sources or variables.');\n break;\n }\n }\n \n // State backend\n if (!content.includes('backend \"')) {\n suggestions.push('No remote backend configured. Use S3/GCS/Azure for team collaboration.');\n }\n \n // Sensitive variables\n if (content.includes('password') || content.includes('secret') || content.includes('api_key')) {\n if (!content.includes('sensitive = true')) {\n issues.push('Potentially sensitive variables without sensitive = true flag.');\n }\n }\n \n // Encryption\n if (content.includes('aws_s3_bucket') && !content.includes('server_side_encryption')) {\n suggestions.push('S3 bucket without explicit encryption configuration.');\n }\n}\n\nfunction analyzeCloudFormation(content: string, issues: string[], suggestions: string[]): void {\n // DeletionPolicy\n if (content.includes('AWS::RDS::') || content.includes('AWS::S3::Bucket')) {\n if (!content.includes('DeletionPolicy')) {\n issues.push('Stateful resources without DeletionPolicy. Data may be lost on stack deletion.');\n }\n }\n \n // UpdateReplacePolicy\n if (!content.includes('UpdateReplacePolicy')) {\n suggestions.push('Consider adding UpdateReplacePolicy for stateful resources.');\n }\n \n // Stack drift detection hint\n suggestions.push('Run `aws cloudformation detect-stack-drift` regularly to catch manual changes.');\n \n // Parameters without constraints\n if (content.includes('Parameters:') && !content.includes('AllowedValues')) {\n suggestions.push('Consider adding AllowedValues constraints to parameters.');\n }\n}\n\nfunction analyzeGitHubActions(content: string, issues: string[], suggestions: string[]): void {\n // Pinned actions\n if (content.includes('uses: ') && !content.includes('@v') && !content.includes('@sha')) {\n issues.push('Actions without version pinning. Pin to specific versions or SHA for security.');\n }\n \n // Secrets in env\n if (content.includes('${{ secrets.') && content.includes('echo ')) {\n issues.push('Potential secret exposure in echo/print commands.');\n }\n \n // Permissions\n if (!content.includes('permissions:')) {\n suggestions.push('Explicitly define job permissions for better security (least privilege).');\n }\n \n // Caching\n if ((content.includes('npm ') || content.includes('pip ') || content.includes('go ')) && \n !content.includes('actions/cache')) {\n suggestions.push('Consider adding caching to speed up workflows.');\n }\n \n // Timeout\n if (!content.includes('timeout-minutes:')) {\n suggestions.push('Add timeout-minutes to prevent stuck workflows from running indefinitely.');\n }\n}\n\n/**\n * Analyze error logs\n */\nexport const analyzeErrorTool: Tool = {\n name: 'analyze_error',\n description: 'Analyze error messages or logs to diagnose issues and suggest solutions.',\n parameters: {\n type: 'object',\n properties: {\n error: {\n type: 'string',\n description: 'The error message or log content to analyze',\n },\n context: {\n type: 'string',\n enum: ['kubernetes', 'docker', 'terraform', 'aws', 'linux', 'nodejs', 'python', 'general'],\n description: 'Context/environment where the error occurred',\n },\n },\n required: ['error'],\n },\n handler: async (params) => {\n const error = params.error as string;\n const context = params.context as string || 'general';\n\n const analysis: string[] = [];\n const possibleCauses: string[] = [];\n const solutions: string[] = [];\n\n // Common patterns\n if (error.includes('permission denied') || error.includes('EACCES')) {\n possibleCauses.push('Insufficient file system permissions');\n solutions.push('Check file/directory permissions with `ls -la`');\n solutions.push('Try running with appropriate user or `sudo` if necessary');\n }\n\n if (error.includes('connection refused') || error.includes('ECONNREFUSED')) {\n possibleCauses.push('Target service is not running or not listening on expected port');\n solutions.push('Verify the service is running: `systemctl status <service>`');\n solutions.push('Check if the port is open: `netstat -tlnp | grep <port>`');\n }\n\n if (error.includes('out of memory') || error.includes('OOMKilled')) {\n possibleCauses.push('Application exceeded memory limits');\n solutions.push('Increase memory limits if possible');\n solutions.push('Profile memory usage to find leaks');\n solutions.push('Consider horizontal scaling');\n }\n\n if (error.includes('timeout') || error.includes('ETIMEDOUT')) {\n possibleCauses.push('Network latency or unreachable endpoint');\n possibleCauses.push('Slow database queries or API responses');\n solutions.push('Check network connectivity: `ping`, `traceroute`');\n solutions.push('Review and optimize slow queries');\n solutions.push('Consider increasing timeout values');\n }\n\n // Context-specific patterns\n if (context === 'kubernetes') {\n if (error.includes('CrashLoopBackOff')) {\n possibleCauses.push('Container fails to start or crashes immediately');\n solutions.push('Check container logs: `kubectl logs <pod> --previous`');\n solutions.push('Verify image exists and is pullable');\n solutions.push('Check resource limits and requests');\n }\n if (error.includes('ImagePullBackOff')) {\n possibleCauses.push('Cannot pull container image');\n solutions.push('Verify image name and tag');\n solutions.push('Check image registry credentials (imagePullSecrets)');\n }\n }\n\n if (context === 'docker') {\n if (error.includes('no space left on device')) {\n possibleCauses.push('Docker disk space exhausted');\n solutions.push('Clean up: `docker system prune -a`');\n solutions.push('Remove unused images: `docker image prune`');\n }\n }\n\n if (possibleCauses.length === 0) {\n analysis.push('No specific pattern matched. Consider:');\n analysis.push('- Searching the error message in documentation');\n analysis.push('- Checking application logs for more context');\n analysis.push('- Verifying configuration and environment variables');\n }\n\n let result = `## Error Analysis\\n\\n`;\n result += `**Context:** ${context}\\n\\n`;\n \n if (possibleCauses.length > 0) {\n result += `### Possible Causes\\n`;\n possibleCauses.forEach(cause => result += `- ${cause}\\n`);\n result += '\\n';\n }\n \n if (solutions.length > 0) {\n result += `### Suggested Solutions\\n`;\n solutions.forEach((solution, i) => result += `${i + 1}. ${solution}\\n`);\n result += '\\n';\n }\n \n if (analysis.length > 0) {\n result += `### Notes\\n`;\n analysis.forEach(note => result += `${note}\\n`);\n }\n\n return result;\n },\n};\n\n/**\n * Fetch public URL content\n */\nexport const fetchUrlTool: Tool = {\n name: 'fetch_url',\n description: 'Fetch the text content of a public URL. Use this to read documentation, github issues, or other public web pages when the user shares a URL.',\n parameters: {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description: 'The HTTP or HTTPS URL to fetch',\n },\n },\n required: ['url'],\n },\n handler: async (params) => {\n const targetUrl = params.url as string;\n \n if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {\n return `Error: Only HTTP/HTTPS URLs are supported, got \"${targetUrl}\"`;\n }\n\n try {\n // Abort after 10 seconds to avoid hanging\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n \n const response = await fetch(targetUrl, {\n signal: controller.signal,\n headers: {\n 'User-Agent': 'DevMentorAI/1.0',\n 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8',\n },\n });\n \n clearTimeout(timeoutId);\n \n if (!response.ok) {\n return `Error: Server responded with status ${response.status} ${response.statusText}`;\n }\n \n const contentType = response.headers.get('content-type') || '';\n const text = await response.text();\n \n // If it's an HTML page, we should ideally strip tags, but for a simple tool, \n // returning the raw text/HTML up to a reasonable limit is a good start.\n // We'll limit the response size to avoid overwhelming the LLM context.\n const MAX_LENGTH = 15000;\n \n if (text.length > MAX_LENGTH) {\n return text.substring(0, MAX_LENGTH) + `\\n\\n[Content truncated at ${MAX_LENGTH} characters]`;\n }\n \n return text;\n } catch (error) {\n if ((error as any).name === 'AbortError') {\n return `Error: Request to ${targetUrl} timed out after 10 seconds.`;\n }\n return `Error fetching URL: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n};\n\n/**\n * Export all DevOps tools\n */\nexport const devopsTools: Tool[] = [\n readFileTool,\n listDirectoryTool,\n analyzeConfigTool,\n analyzeErrorTool,\n fetchUrlTool,\n];\n\nexport function getToolByName(name: string): Tool | undefined {\n return devopsTools.find(tool => tool.name === name);\n}\n","import { CopilotClient, type SessionEvent, type Tool as CopilotTool, approveAll } from '@github/copilot-sdk';\nimport { SessionService } from './session.service.js';\nimport { getAgentConfig, SESSION_TYPE_CONFIGS } from '@devmentorai/shared';\nimport type {\n SessionType,\n MessageContext,\n ModelInfo,\n CopilotAuthStatus,\n CopilotQuotaStatus,\n ModelPricingTier,\n} from '@devmentorai/shared';\nimport { devopsTools, getToolByName } from '../tools/devops-tools.js';\n\ninterface CopilotSession {\n sessionId: string;\n session: Awaited<ReturnType<CopilotClient['createSession']>>;\n type: SessionType;\n}\n\n// MCP server configurations for different integrations\nconst MCP_SERVERS: Record<string, { type: 'http'; url: string; tools: string[] }> = {\n github: {\n type: 'http',\n url: 'https://api.githubcopilot.com/mcp/',\n tools: ['*'],\n },\n};\n\nconst RECOMMENDED_DEFAULT_MODEL = 'gpt-4.1';\n\ninterface RawSdkModel {\n id?: unknown;\n name?: unknown;\n description?: unknown;\n provider?: unknown;\n isDefault?: unknown;\n billing?: {\n multiplier?: unknown;\n };\n supportedReasoningEfforts?: unknown;\n}\n\nexport class CopilotService {\n private client: CopilotClient | null = null;\n private readonly sessions: Map<string, CopilotSession> = new Map();\n private initialized = false;\n private mockMode = false;\n\n constructor(private readonly sessionService: SessionService) {}\n\n async initialize(): Promise<void> {\n try {\n this.client = new CopilotClient();\n await this.client.start();\n this.initialized = true;\n console.log('[CopilotService] Initialized successfully');\n } catch (error) {\n console.error('[CopilotService] Failed to initialize:', error);\n this.mockMode = true;\n this.initialized = true;\n console.warn('[CopilotService] Running in mock mode');\n }\n }\n\n isReady(): boolean {\n return this.initialized;\n }\n\n isMockMode(): boolean {\n return this.mockMode;\n }\n\n async getAuthStatus(): Promise<CopilotAuthStatus> {\n if (this.mockMode || !this.client) {\n return {\n isAuthenticated: false,\n login: null,\n reason: 'Copilot SDK unavailable (mock mode)',\n };\n }\n\n try {\n const client = this.client as unknown as {\n getAuthStatus?: () => Promise<{ isAuthenticated?: unknown; login?: unknown }>;\n };\n\n if (!client.getAuthStatus) {\n return {\n isAuthenticated: false,\n login: null,\n reason: 'Copilot auth API not available in this SDK version',\n };\n }\n\n const auth = await client.getAuthStatus();\n return {\n isAuthenticated: Boolean(auth?.isAuthenticated),\n login: typeof auth?.login === 'string' ? auth.login : null,\n };\n } catch (error) {\n return {\n isAuthenticated: false,\n login: null,\n reason: error instanceof Error ? error.message : 'Failed to get auth status',\n };\n }\n }\n\n async listModels(): Promise<{ models: ModelInfo[]; default: string }> {\n if (this.mockMode || !this.client) {\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n\n try {\n const client = this.client as unknown as {\n listModels?: () => Promise<RawSdkModel[]>;\n };\n\n if (!client.listModels) {\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n\n const rawModels = await client.listModels();\n if (!Array.isArray(rawModels)) {\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n\n const models = rawModels\n .map((raw) => this.normalizeModel(raw))\n .filter((model): model is ModelInfo => Boolean(model?.id));\n\n const recommendedAvailable = models.some((model) => model.id === RECOMMENDED_DEFAULT_MODEL);\n const sdkDefault = models.find((model) => model.isDefault)?.id;\n const fallbackFirst = models[0]?.id;\n\n const defaultModel =\n (recommendedAvailable && RECOMMENDED_DEFAULT_MODEL) ||\n sdkDefault ||\n fallbackFirst ||\n RECOMMENDED_DEFAULT_MODEL;\n\n const modelsWithDefaultFlag = models.map((model) => ({\n ...model,\n isDefault: model.id === defaultModel,\n }));\n\n return { models: modelsWithDefaultFlag, default: defaultModel };\n } catch (error) {\n console.error('[CopilotService] Failed to list models:', error);\n return { models: [], default: RECOMMENDED_DEFAULT_MODEL };\n }\n }\n\n async getQuota(): Promise<CopilotQuotaStatus> {\n if (this.mockMode || !this.client) {\n return {\n used: null,\n included: null,\n remaining: null,\n percentageUsed: null,\n percentageRemaining: null,\n raw: {},\n };\n }\n\n try {\n const client = this.client as unknown as {\n rpc?: {\n account?: {\n getQuota?: () => Promise<unknown>;\n };\n };\n };\n\n const quotaData = await client.rpc?.account?.getQuota?.();\n if (!quotaData || typeof quotaData !== 'object') {\n return {\n used: null,\n included: null,\n remaining: null,\n percentageUsed: null,\n percentageRemaining: null,\n raw: {},\n };\n }\n\n return this.normalizeQuota(quotaData as Record<string, unknown>);\n } catch (error) {\n return {\n used: null,\n included: null,\n remaining: null,\n percentageUsed: null,\n percentageRemaining: null,\n raw: {\n error: error instanceof Error ? error.message : 'Failed to get quota',\n },\n };\n }\n }\n\n async switchSessionModel(\n sessionId: string,\n type: SessionType,\n model: string,\n systemPrompt?: string\n ): Promise<void> {\n const existing = this.sessions.get(sessionId);\n\n if (existing?.session && !this.mockMode) {\n try {\n await existing.session.abort().catch(() => undefined);\n await existing.session.destroy();\n } catch (error) {\n console.warn(`[CopilotService] Failed to destroy previous session before model switch: ${sessionId}`, error);\n }\n }\n\n this.sessions.delete(sessionId);\n\n if (this.client && !this.mockMode) {\n try {\n await this.client.deleteSession(sessionId);\n } catch {\n // Ignore when session files don't exist yet.\n }\n }\n\n await this.createCopilotSession(sessionId, type, model, systemPrompt);\n }\n\n private normalizeModel(raw: RawSdkModel): ModelInfo {\n const id = typeof raw.id === 'string' ? raw.id : '';\n const name = typeof raw.name === 'string' ? raw.name : id;\n const description =\n typeof raw.description === 'string' && raw.description.trim().length > 0\n ? raw.description\n : `AI model ${id}`;\n const provider =\n typeof raw.provider === 'string' && raw.provider.trim().length > 0\n ? raw.provider\n : this.inferProviderFromModelId(id);\n const multiplier =\n typeof raw.billing?.multiplier === 'number' && Number.isFinite(raw.billing.multiplier)\n ? raw.billing.multiplier\n : undefined;\n const supportedReasoningEfforts = Array.isArray(raw.supportedReasoningEfforts)\n ? raw.supportedReasoningEfforts.filter((effort): effort is string => typeof effort === 'string')\n : undefined;\n\n return {\n id,\n name,\n description,\n provider,\n available: true,\n isDefault: Boolean(raw.isDefault),\n pricingMultiplier: multiplier,\n pricingTier: this.mapPricingTier(multiplier),\n supportedReasoningEfforts,\n };\n }\n\n private inferProviderFromModelId(modelId: string): string {\n const normalized = modelId.toLowerCase();\n if (normalized.startsWith('gpt')) return 'openai';\n if (normalized.startsWith('claude')) return 'anthropic';\n if (normalized.startsWith('gemini')) return 'google';\n return 'unknown';\n }\n\n private mapPricingTier(multiplier?: number): ModelPricingTier {\n if (multiplier === 0) return 'free';\n if (typeof multiplier === 'number' && multiplier > 0 && multiplier < 1) return 'cheap';\n if (typeof multiplier === 'number' && multiplier > 1) return 'premium';\n return 'standard';\n }\n\n private normalizeQuota(raw: Record<string, unknown>): CopilotQuotaStatus {\n const used = this.readNumber(raw, ['used', 'consumed', 'usage', 'quotaUsed', 'totalUsed']);\n const included = this.readNumber(raw, ['included', 'limit', 'quota', 'total', 'quotaTotal', 'allowed']);\n const computedRemaining =\n typeof included === 'number' && typeof used === 'number' ? Math.max(included - used, 0) : null;\n const remaining = this.readNumber(raw, ['remaining', 'left', 'available']) ?? computedRemaining;\n\n const computedPercentageUsed =\n typeof included === 'number' && included > 0 && typeof used === 'number'\n ? Math.min(100, (used / included) * 100)\n : null;\n const percentageUsed =\n this.readNumber(raw, ['percentageUsed', 'usedPercent', 'percentUsed']) ?? computedPercentageUsed;\n const percentageRemaining =\n this.readNumber(raw, ['percentageRemaining', 'remainingPercent', 'percentRemaining']) ??\n (typeof percentageUsed === 'number' ? Math.max(0, 100 - percentageUsed) : null);\n\n return {\n used,\n included,\n remaining,\n percentageUsed,\n percentageRemaining,\n periodStart: this.readString(raw, ['periodStart', 'startAt', 'windowStart']),\n periodEnd: this.readString(raw, ['periodEnd', 'endAt', 'windowEnd']),\n raw,\n };\n }\n\n private readNumber(source: Record<string, unknown>, keys: string[]): number | null {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n }\n return null;\n }\n\n private readString(source: Record<string, unknown>, keys: string[]): string | null {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === 'string' && value.trim().length > 0) return value;\n }\n return null;\n }\n\n async createCopilotSession(\n sessionId: string,\n type: SessionType,\n model: string,\n systemPrompt?: string,\n enableMcp: boolean = false\n ): Promise<void> {\n if (this.mockMode || !this.client) {\n // Create mock session\n this.sessions.set(sessionId, {\n sessionId,\n session: null as any,\n type,\n });\n return;\n }\n\n const agentConfig = getAgentConfig(type);\n const typeConfig = SESSION_TYPE_CONFIGS[type];\n\n // Build SDK-compatible tools for DevOps sessions\n // The SDK calls tool.handler() directly and uses the return value as the result\n const tools = type === 'devops' ? this.buildSdkTools() : undefined;\n\n // Build MCP server config if enabled\n const mcpServers = enableMcp ? MCP_SERVERS : undefined;\n\n const session = await this.client.createSession({\n sessionId,\n model: model || typeConfig.defaultModel,\n streaming: true,\n customAgents: agentConfig ? [agentConfig] : undefined,\n systemMessage: systemPrompt ? { content: systemPrompt } : undefined,\n tools,\n mcpServers,\n onPermissionRequest: approveAll,\n });\n\n this.sessions.set(sessionId, { sessionId, session, type });\n }\n\n /**\n * Convert our Tool definitions to Copilot SDK Tool format.\n * The SDK expects tools with a `handler` function — it calls the handler\n * directly and uses the return value as the tool result (no sendToolResult needed).\n */\n private buildSdkTools(): CopilotTool<any>[] {\n return devopsTools.map((tool): CopilotTool<any> => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n handler: async (args: Record<string, unknown>) => {\n console.log(`[CopilotService] Executing tool ${tool.name}`);\n try {\n return await tool.handler(args);\n } catch (error) {\n console.error(`[CopilotService] Tool ${tool.name} failed:`, error);\n return `Error: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n },\n }));\n }\n\n async resumeCopilotSession(sessionId: string): Promise<boolean> {\n if (this.mockMode || !this.client) {\n return true;\n }\n\n // First, try to resume existing session\n try {\n const session = await this.client.resumeSession(sessionId, { onPermissionRequest: approveAll });\n // Try to get type from DB, fallback to 'general'\n const dbSession = this.sessionService.getSession(sessionId);\n this.sessions.set(sessionId, { sessionId, session, type: dbSession?.type || 'general' });\n console.log(`[CopilotService] Session ${sessionId} resumed from disk`);\n return true;\n } catch (resumeError) {\n console.log(`[CopilotService] Could not resume session ${sessionId}, will try to create new`);\n console.log('[CopilotService] Resume error:', resumeError);\n }\n\n // If resume fails, try to create a new session using DB info\n try {\n const dbSession = this.sessionService.getSession(sessionId);\n if (!dbSession) {\n console.error(`[CopilotService] Session ${sessionId} not found in database`);\n return false;\n }\n\n // Create new Copilot session with same parameters\n await this.createCopilotSession(\n sessionId,\n dbSession.type,\n dbSession.model,\n dbSession.systemPrompt || undefined,\n false // MCP disabled by default on recreate\n );\n console.log(`[CopilotService] Session ${sessionId} recreated successfully`);\n return true;\n } catch (createError) {\n console.error(`[CopilotService] Failed to create session ${sessionId}:`, createError);\n return false;\n }\n }\n\n async sendMessage(\n sessionId: string,\n prompt: string,\n context?: MessageContext,\n onEvent?: (event: SessionEvent) => void\n ): Promise<string> {\n return this.withRetry(async () => {\n const copilotSession = this.sessions.get(sessionId);\n \n // Note: The prompt should already be enriched with context by the route\n // We only add basic context fallback if the prompt doesn't contain it\n let fullPrompt = prompt;\n if (context?.selectedText && !prompt.includes(context.selectedText)) {\n fullPrompt = `Context (selected text):\\n${context.selectedText}\\n\\nUser request: ${prompt}`;\n }\n if (context?.pageUrl && !prompt.includes(context.pageUrl)) {\n fullPrompt = `Page: ${context.pageUrl}\\n${fullPrompt}`;\n }\n\n if (this.mockMode || !copilotSession?.session) {\n // Mock response\n return this.generateMockResponse(prompt, context);\n }\n\n let responseContent = '';\n\n // Set up event listener\n if (onEvent) {\n copilotSession.session.on(onEvent);\n }\n\n copilotSession.session.on((event: SessionEvent) => {\n if (event.type === 'assistant.message') {\n responseContent = event.data.content || '';\n }\n });\n\n // Send message - no systemMessage override to preserve Copilot's intelligence\n // The customAgents from session creation provide the persona/expertise\n const response = await copilotSession.session.sendAndWait({ prompt: fullPrompt });\n console.log(`[CopilotService] Received response for session ${sessionId}`);\n console.log('[CopilotService] Response payload:', response?.data);\n console.log(`[CopilotService] responseContent: ${responseContent}...`);\n \n return response?.data.content || responseContent;\n }, 3, 1000);\n }\n\n async streamMessage(\n sessionId: string,\n prompt: string,\n context?: MessageContext,\n onEvent?: (event: SessionEvent) => void,\n attachments?: Array<{ type: 'file' | 'directory'; path: string; displayName?: string }>\n ): Promise<void> {\n let copilotSession = this.sessions.get(sessionId);\n\n // Auto-resume session if not in memory (e.g., after browser restart)\n if (!copilotSession?.session && !this.mockMode) {\n console.log(`[CopilotService] Session ${sessionId} not in memory, attempting auto-resume...`);\n const resumed = await this.resumeCopilotSession(sessionId);\n if (resumed) {\n copilotSession = this.sessions.get(sessionId);\n console.log(`[CopilotService] Session ${sessionId} auto-resumed successfully`);\n } else {\n console.warn(`[CopilotService] Failed to auto-resume session ${sessionId}, falling back to mock`);\n }\n }\n\n // Note: The prompt should already be enriched with context by the route\n // We only add basic context fallback if the prompt doesn't contain it\n let fullPrompt = prompt;\n if (context?.selectedText && !prompt.includes(context.selectedText)) {\n fullPrompt = `Context (selected text):\\n${context.selectedText}\\n\\nUser request: ${prompt}`;\n }\n\n if (this.mockMode || !copilotSession?.session) {\n // Mock streaming response\n console.log('[CopilotService] Streaming mock response');\n await this.streamMockResponse(prompt, context, onEvent);\n return;\n }\n\n console.log('[CopilotService] Starting real stream for session', sessionId);\n if (attachments && attachments.length > 0) {\n console.log(`[CopilotService] Sending ${attachments.length} attachments:`, attachments.map(a => a.path));\n }\n \n // Set up event listener\n if (onEvent) {\n copilotSession.session.on(onEvent);\n }\n\n // Send message with attachments if provided\n // The customAgents from session creation provide the persona/expertise\n await copilotSession.session.send({\n prompt: fullPrompt,\n attachments,\n });\n console.log('[CopilotService] Message sent, waiting for events...');\n }\n\n /**\n * Retry logic for transient errors\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n maxRetries: number = 3,\n delayMs: number = 1000\n ): Promise<T> {\n let lastError: Error | undefined;\n \n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n \n // Don't retry on certain errors\n const nonRetryableErrors = ['authentication', 'invalid_session', 'rate_limit'];\n const errorMessage = (lastError?.message || '').toLowerCase();\n if (nonRetryableErrors.some(e => errorMessage.includes(e))) {\n throw lastError;\n }\n \n if (attempt < maxRetries) {\n console.warn(`[CopilotService] Attempt ${attempt} failed, retrying in ${delayMs}ms...`);\n await new Promise(resolve => setTimeout(resolve, delayMs));\n delayMs *= 2; // Exponential backoff\n }\n }\n }\n \n throw lastError;\n }\n\n /**\n * Get available tools for a session type\n */\n getAvailableTools(type: SessionType): Array<{ name: string; description: string }> {\n if (type === 'devops') {\n return devopsTools.map(t => ({ name: t.name, description: t.description }));\n }\n return [];\n }\n\n /**\n * Execute a tool directly (for testing or standalone use)\n */\n async executeTool(\n toolName: string, \n params: Record<string, unknown>\n ): Promise<{ success: boolean; result?: string; error?: string }> {\n const tool = getToolByName(toolName);\n if (!tool) {\n return { success: false, error: `Unknown tool: ${toolName}` };\n }\n \n try {\n const result = await tool.handler(params);\n return { success: true, result };\n } catch (error) {\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n\n async abortRequest(sessionId: string): Promise<void> {\n const copilotSession = this.sessions.get(sessionId);\n if (copilotSession?.session && !this.mockMode) {\n await copilotSession.session.abort();\n }\n }\n\n async destroySession(sessionId: string): Promise<void> {\n const copilotSession = this.sessions.get(sessionId);\n \n if (copilotSession?.session && !this.mockMode) {\n try {\n // Abort any pending requests first\n await copilotSession.session.abort().catch(() => {});\n // Destroy the session (releases resources but doesn't delete files)\n await copilotSession.session.destroy();\n console.log(`[CopilotService] Session ${sessionId} destroyed successfully`);\n } catch (error) {\n console.error(`[CopilotService] Error destroying session ${sessionId}:`, error);\n // Continue with cleanup even if destroy fails\n }\n }\n \n // Delete session data from disk using SDK's deleteSession\n if (this.client && !this.mockMode) {\n try {\n await this.client.deleteSession(sessionId);\n console.log(`[CopilotService] Session ${sessionId} files deleted from disk`);\n } catch (error) {\n // Session might not exist on disk, that's OK\n console.log('[CopilotService] deleteSession error:', error);\n console.log(`[CopilotService] Could not delete session files (may not exist): ${sessionId}`);\n }\n }\n \n // Remove from in-memory map\n this.sessions.delete(sessionId);\n console.log(`[CopilotService] Session ${sessionId} removed from memory`);\n }\n\n async shutdown(): Promise<void> {\n // Destroy all sessions\n for (const [sessionId, copilotSession] of this.sessions) {\n try {\n if (copilotSession.session && !this.mockMode) {\n await copilotSession.session.destroy();\n }\n } catch (error) {\n console.error(`[CopilotService] Failed to destroy session ${sessionId}:`, error);\n }\n }\n this.sessions.clear();\n\n // Stop client\n if (this.client && !this.mockMode) {\n try {\n await this.client.stop();\n } catch (error) {\n console.error('[CopilotService] Failed to stop client:', error);\n }\n }\n\n this.initialized = false;\n }\n\n // Mock implementations for development without Copilot CLI\n private generateMockResponse(prompt: string, context?: MessageContext): string {\n const action = context?.action;\n \n if (action === 'explain') {\n return `**Explanation:**\\n\\nThis appears to be ${context?.selectedText?.slice(0, 50)}...\\n\\nIn essence, this code/text demonstrates a common pattern used in software development. The key points are:\\n\\n1. It handles a specific use case\\n2. It follows best practices\\n3. It can be extended for additional functionality`;\n }\n \n if (action === 'translate') {\n return `**Translation:**\\n\\n${context?.selectedText || 'No text provided'}`;\n }\n \n if (action === 'rewrite') {\n return `**Rewritten:**\\n\\n${context?.selectedText || prompt}`;\n }\n \n if (action === 'fix_grammar') {\n return `**Corrected:**\\n\\n${context?.selectedText || prompt}`;\n }\n\n return `**Mock Response:**\\n\\nI understand you're asking about: \"${prompt.slice(0, 100)}...\"\\n\\nThis is a mock response because the Copilot SDK is not available. In production, you would receive intelligent responses powered by GitHub Copilot.\\n\\nTo enable real responses:\\n1. Install GitHub Copilot CLI\\n2. Authenticate with your GitHub account\\n3. Restart the DevMentorAI backend`;\n }\n\n private async streamMockResponse(\n prompt: string,\n context?: MessageContext,\n onEvent?: (event: SessionEvent) => void\n ): Promise<void> {\n const response = this.generateMockResponse(prompt, context);\n const words = response.split(' ');\n\n // Simulate streaming with delays\n for (let i = 0; i < words.length; i++) {\n await new Promise(resolve => setTimeout(resolve, 50));\n \n onEvent?.({\n type: 'assistant.message_delta',\n data: { deltaContent: words[i] + (i < words.length - 1 ? ' ' : '') },\n } as SessionEvent);\n }\n\n onEvent?.({\n type: 'assistant.message',\n data: { content: response },\n } as SessionEvent);\n\n onEvent?.({\n type: 'session.idle',\n data: {},\n } as SessionEvent);\n }\n}\n","import type { Database } from 'better-sqlite3';\nimport {\n generateSessionId,\n generateMessageId,\n formatDate,\n getAgentConfig,\n getDefaultModel,\n} from '@devmentorai/shared';\nimport type {\n Session,\n SessionType,\n SessionStatus,\n CreateSessionRequest,\n UpdateSessionRequest,\n Message,\n MessageMetadata,\n PaginatedResponse,\n} from '@devmentorai/shared';\n\ninterface DbSession {\n id: string;\n name: string;\n type: SessionType;\n status: SessionStatus;\n model: string;\n system_prompt: string | null;\n custom_agent: string | null;\n message_count: number;\n created_at: string;\n updated_at: string;\n}\n\ninterface DbMessage {\n id: string;\n session_id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: string;\n metadata: string | null;\n}\n\nexport class SessionService {\n constructor(private readonly db: Database) {}\n\n // Sessions\n listSessions(page = 1, pageSize = 50): PaginatedResponse<Session> {\n const offset = (page - 1) * pageSize;\n \n const countStmt = this.db.prepare('SELECT COUNT(*) as count FROM sessions');\n const count = (countStmt.get() as { count: number }).count;\n\n const stmt = this.db.prepare(`\n SELECT * FROM sessions \n ORDER BY updated_at DESC \n LIMIT ? OFFSET ?\n `);\n const rows = stmt.all(pageSize, offset) as DbSession[];\n\n return {\n items: rows.map(this.mapDbSession),\n total: count,\n page,\n pageSize,\n hasMore: offset + rows.length < count,\n };\n }\n\n getSession(id: string): Session | null {\n const stmt = this.db.prepare('SELECT * FROM sessions WHERE id = ?');\n const row = stmt.get(id) as DbSession | undefined;\n return row ? this.mapDbSession(row) : null;\n }\n\n createSession(request: CreateSessionRequest): Session {\n const id = generateSessionId();\n const now = formatDate();\n const agentConfig = getAgentConfig(request.type);\n const model = request.model || getDefaultModel(request.type);\n \n const stmt = this.db.prepare(`\n INSERT INTO sessions (id, name, type, model, system_prompt, custom_agent, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n id,\n request.name,\n request.type,\n model,\n request.systemPrompt || agentConfig?.prompt || null,\n agentConfig?.name || null,\n now,\n now\n );\n\n return this.getSession(id)!;\n }\n\n updateSession(id: string, request: UpdateSessionRequest): Session | null {\n const session = this.getSession(id);\n if (!session) return null;\n\n const updates: string[] = [];\n const values: (string | number)[] = [];\n\n if (request.name !== undefined) {\n updates.push('name = ?');\n values.push(request.name);\n }\n if (request.status !== undefined) {\n updates.push('status = ?');\n values.push(request.status);\n }\n if (request.model !== undefined) {\n updates.push('model = ?');\n values.push(request.model);\n }\n\n if (updates.length === 0) return session;\n\n updates.push('updated_at = ?');\n values.push(formatDate());\n values.push(id);\n\n const stmt = this.db.prepare(`\n UPDATE sessions SET ${updates.join(', ')} WHERE id = ?\n `);\n stmt.run(...values);\n\n return this.getSession(id);\n }\n\n deleteSession(id: string): boolean {\n const stmt = this.db.prepare('DELETE FROM sessions WHERE id = ?');\n const result = stmt.run(id);\n return result.changes > 0;\n }\n\n incrementMessageCount(sessionId: string): void {\n const stmt = this.db.prepare(`\n UPDATE sessions \n SET message_count = message_count + 1, updated_at = ?\n WHERE id = ?\n `);\n stmt.run(formatDate(), sessionId);\n }\n\n // Messages\n listMessages(sessionId: string, page = 1, pageSize = 100): PaginatedResponse<Message> {\n const offset = (page - 1) * pageSize;\n\n const countStmt = this.db.prepare('SELECT COUNT(*) as count FROM messages WHERE session_id = ?');\n const count = (countStmt.get(sessionId) as { count: number }).count;\n\n const stmt = this.db.prepare(`\n SELECT * FROM messages \n WHERE session_id = ?\n ORDER BY timestamp ASC\n LIMIT ? OFFSET ?\n `);\n const rows = stmt.all(sessionId, pageSize, offset) as DbMessage[];\n\n return {\n items: rows.map(row => this.mapDbMessage(row)),\n total: count,\n page,\n pageSize,\n hasMore: offset + rows.length < count,\n };\n }\n\n addMessage(\n sessionId: string,\n role: 'user' | 'assistant' | 'system',\n content: string,\n metadata?: MessageMetadata\n ): Message {\n const id = generateMessageId();\n const timestamp = formatDate();\n\n const stmt = this.db.prepare(`\n INSERT INTO messages (id, session_id, role, content, timestamp, metadata)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n id,\n sessionId,\n role,\n content,\n timestamp,\n metadata ? JSON.stringify(metadata) : null\n );\n\n this.incrementMessageCount(sessionId);\n\n return {\n id,\n sessionId,\n role,\n content,\n timestamp,\n metadata,\n };\n }\n\n updateMessageContent(messageId: string, content: string): void {\n const stmt = this.db.prepare('UPDATE messages SET content = ? WHERE id = ?');\n stmt.run(content, messageId);\n }\n\n updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): void {\n const stmt = this.db.prepare('UPDATE messages SET metadata = ? WHERE id = ?');\n stmt.run(JSON.stringify(metadata), messageId);\n }\n\n // ============================================================================\n // Context Persistence (Phase 5)\n // ============================================================================\n\n /**\n * Save context for a session (associated with a message)\n */\n saveContext(\n sessionId: string,\n contextJson: string,\n messageId?: string,\n pageUrl?: string,\n pageTitle?: string,\n platform?: string\n ): string {\n const id = `ctx_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n const now = formatDate();\n\n const stmt = this.db.prepare(`\n INSERT INTO session_contexts (id, session_id, message_id, context_json, page_url, page_title, platform, extracted_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(id, sessionId, messageId || null, contextJson, pageUrl || null, pageTitle || null, platform || null, now);\n\n return id;\n }\n\n /**\n * Get the most recent context for a session\n */\n getLatestContext(sessionId: string): { id: string; contextJson: string; pageUrl?: string; platform?: string; extractedAt: string } | null {\n const stmt = this.db.prepare(`\n SELECT id, context_json, page_url, platform, extracted_at\n FROM session_contexts\n WHERE session_id = ?\n ORDER BY extracted_at DESC\n LIMIT 1\n `);\n\n const row = stmt.get(sessionId) as { id: string; context_json: string; page_url: string | null; platform: string | null; extracted_at: string } | undefined;\n\n if (!row) return null;\n\n return {\n id: row.id,\n contextJson: row.context_json,\n pageUrl: row.page_url || undefined,\n platform: row.platform || undefined,\n extractedAt: row.extracted_at,\n };\n }\n\n /**\n * Get context history for a session\n */\n getContextHistory(sessionId: string, limit: number = 10): Array<{\n id: string;\n messageId?: string;\n pageUrl?: string;\n pageTitle?: string;\n platform?: string;\n extractedAt: string;\n }> {\n const stmt = this.db.prepare(`\n SELECT id, message_id, page_url, page_title, platform, extracted_at\n FROM session_contexts\n WHERE session_id = ?\n ORDER BY extracted_at DESC\n LIMIT ?\n `);\n\n const rows = stmt.all(sessionId, limit) as Array<{\n id: string;\n message_id: string | null;\n page_url: string | null;\n page_title: string | null;\n platform: string | null;\n extracted_at: string;\n }>;\n\n return rows.map(row => ({\n id: row.id,\n messageId: row.message_id || undefined,\n pageUrl: row.page_url || undefined,\n pageTitle: row.page_title || undefined,\n platform: row.platform || undefined,\n extractedAt: row.extracted_at,\n }));\n }\n\n /**\n * Get a specific context by ID\n */\n getContext(contextId: string): { id: string; sessionId: string; contextJson: string; extractedAt: string } | null {\n const stmt = this.db.prepare(`\n SELECT id, session_id, context_json, extracted_at\n FROM session_contexts\n WHERE id = ?\n `);\n\n const row = stmt.get(contextId) as { id: string; session_id: string; context_json: string; extracted_at: string } | undefined;\n\n if (!row) return null;\n\n return {\n id: row.id,\n sessionId: row.session_id,\n contextJson: row.context_json,\n extractedAt: row.extracted_at,\n };\n }\n\n /**\n * Clean up old contexts for a session (keep only last N)\n */\n cleanupOldContexts(sessionId: string, keepCount: number = 20): number {\n // Get IDs to keep\n const keepStmt = this.db.prepare(`\n SELECT id FROM session_contexts\n WHERE session_id = ?\n ORDER BY extracted_at DESC\n LIMIT ?\n `);\n const idsToKeep = (keepStmt.all(sessionId, keepCount) as Array<{ id: string }>).map(r => r.id);\n\n if (idsToKeep.length === 0) return 0;\n\n // Delete older contexts\n const deleteStmt = this.db.prepare(`\n DELETE FROM session_contexts\n WHERE session_id = ?\n AND id NOT IN (${idsToKeep.map(() => '?').join(',')})\n `);\n\n const result = deleteStmt.run(sessionId, ...idsToKeep);\n return result.changes;\n }\n\n /**\n * Get context count for a session\n */\n getContextCount(sessionId: string): number {\n const stmt = this.db.prepare('SELECT COUNT(*) as count FROM session_contexts WHERE session_id = ?');\n const result = stmt.get(sessionId) as { count: number };\n return result.count;\n }\n\n private mapDbSession(row: DbSession): Session {\n return {\n id: row.id,\n name: row.name,\n type: row.type,\n status: row.status,\n model: row.model,\n systemPrompt: row.system_prompt || undefined,\n customAgent: row.custom_agent || undefined,\n messageCount: row.message_count,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n private mapDbMessage(row: DbMessage): Message {\n let metadata = row.metadata ? JSON.parse(row.metadata) : undefined;\n \n // Fix legacy image URLs that have incorrect format\n if (metadata?.images) {\n metadata.images = metadata.images.map((img: Record<string, unknown>) => ({\n ...img,\n thumbnailUrl: this.fixImageUrl(img.thumbnailUrl as string | undefined),\n fullImageUrl: this.fixImageUrl(img.fullImageUrl as string | undefined),\n }));\n }\n \n return {\n id: row.id,\n sessionId: row.session_id,\n role: row.role,\n content: row.content,\n timestamp: row.timestamp,\n metadata,\n };\n }\n\n /**\n * Fix legacy image URLs that have incorrect format\n * - Adds missing port (localhost -> localhost:3847)\n * - Removes duplicate \"images/images/\" path\n */\n private fixImageUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n \n let fixed = url;\n \n // Fix missing port: http://localhost/api -> http://localhost:3847/api\n if (fixed.includes('http://localhost/api')) {\n fixed = fixed.replace('http://localhost/api', 'http://localhost:3847/api');\n }\n \n // Fix duplicate images path: /api/images/images/ -> /api/images/\n if (fixed.includes('/api/images/images/')) {\n fixed = fixed.replace('/api/images/images/', '/api/images/');\n }\n \n return fixed;\n }\n}\n","import Database from 'better-sqlite3';\nimport path from 'path';\nimport os from 'os';\nimport fs from 'fs';\n\nconst DB_DIR = path.join(os.homedir(), '.devmentorai');\nconst DB_PATH = path.join(DB_DIR, 'devmentorai.db');\n\nconsole.log(`Database path: ${DB_PATH}`);\n\nexport function initDatabase(): Database.Database {\n // Ensure directory exists\n if (!fs.existsSync(DB_DIR)) {\n fs.mkdirSync(DB_DIR, { recursive: true });\n }\n\n const db = new Database(DB_PATH);\n \n // Enable WAL mode for better performance\n db.pragma('journal_mode = WAL');\n \n // Create tables\n db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n type TEXT NOT NULL CHECK (type IN ('devops', 'writing', 'development', 'general')),\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'closed')),\n model TEXT NOT NULL DEFAULT 'gpt-4.1',\n system_prompt TEXT,\n custom_agent TEXT,\n message_count INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system')),\n content TEXT NOT NULL,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n metadata TEXT,\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n );\n\n -- New table for session context persistence (Phase 5)\n CREATE TABLE IF NOT EXISTS session_contexts (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n message_id TEXT,\n context_json TEXT NOT NULL,\n page_url TEXT,\n page_title TEXT,\n platform TEXT,\n extracted_at TEXT NOT NULL DEFAULT (datetime('now')),\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages(session_id);\n CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp);\n CREATE INDEX IF NOT EXISTS idx_session_contexts_session_id ON session_contexts(session_id);\n CREATE INDEX IF NOT EXISTS idx_session_contexts_extracted_at ON session_contexts(extracted_at);\n `);\n\n return db;\n}\n\nexport type { Database };\n"],"mappings":"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","names":["ErrorCodes","Message","Touch","Disposable","RAL","Event","CancellationToken","CancellationState","resolve","MessageReader","ResolvedMessageReaderOptions","MessageWriter","ResolvedMessageWriterOptions","result","CancelNotification","ProgressToken","ProgressNotification","StarRequestHandler","Trace","TraceValues","TraceFormat","SetTraceNotification","LogTraceNotification","ConnectionErrors","ConnectionStrategy","IdCancellationReceiverStrategy","RequestCancellationReceiverStrategy","CancellationReceiverStrategy","CancellationSenderStrategy","CancellationStrategy","MessageStrategy","ConnectionOptions","ConnectionState","createMessageConnection","startTime","resolve","resolve","RIL","exports","path","os","process","StreamMessageReader","StreamMessageWriter","resolve","createMessageConnection","z","z","userPrompt","resolve","z","fs","path","z","path","fs","resolve","resolve","fs","path","resolve","path","fs"]}