UNPKG

@vfarcic/dot-ai

Version:

Universal Kubernetes application deployment agent with CLI and MCP interfaces

201 lines (200 loc) 7.47 kB
"use strict"; /** * MCP Prompts Handler - Manages shared prompt library */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.loadPromptFile = loadPromptFile; exports.loadAllPrompts = loadAllPrompts; exports.handlePromptsListRequest = handlePromptsListRequest; exports.handlePromptsGetRequest = handlePromptsGetRequest; const fs = __importStar(require("fs")); const path = __importStar(require("path")); const error_handling_1 = require("../core/error-handling"); /** * Loads and parses a prompt file with YAML frontmatter */ function loadPromptFile(filePath) { try { const content = fs.readFileSync(filePath, 'utf8'); // Parse YAML frontmatter const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/); if (!frontmatterMatch) { throw new Error(`Invalid prompt file format: missing YAML frontmatter in ${filePath}`); } const [, frontmatterYaml, promptContent] = frontmatterMatch; // Simple YAML parsing for our specific format const metadata = {}; const lines = frontmatterYaml.split('\n'); for (const line of lines) { const match = line.match(/^([^:]+):\s*(.+)$/); if (match) { const [, key, value] = match; // Remove quotes if present const cleanValue = value.trim().replace(/^["']|["']$/g, ''); metadata[key.trim()] = cleanValue; } } if (!metadata.name || !metadata.description || !metadata.category) { throw new Error(`Missing required metadata in ${filePath}: name, description, category`); } return { name: metadata.name, description: metadata.description, content: promptContent.trim() }; } catch (error) { throw new Error(`Failed to load prompt file ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`); } } /** * Loads all prompts from the shared-prompts directory */ function loadAllPrompts(logger) { try { const promptsDir = path.join(process.cwd(), 'shared-prompts'); if (!fs.existsSync(promptsDir)) { logger.warn('Shared prompts directory not found', { path: promptsDir }); return []; } const files = fs.readdirSync(promptsDir); const promptFiles = files.filter(file => file.endsWith('.md')); const prompts = []; for (const file of promptFiles) { try { const filePath = path.join(promptsDir, file); const prompt = loadPromptFile(filePath); prompts.push(prompt); logger.debug('Loaded prompt', { name: prompt.name, file }); } catch (error) { logger.error(`Failed to load prompt file ${file}`, error); } } logger.info('Loaded prompts from shared library', { total: prompts.length, promptsDir }); return prompts; } catch (error) { logger.error('Failed to load prompts directory', error); return []; } } /** * Handle prompts/list MCP request */ async function handlePromptsListRequest(args, logger, requestId) { try { logger.info('Processing prompts/list request', { requestId }); const prompts = loadAllPrompts(logger); // Convert to MCP prompts/list response format const promptList = prompts.map(prompt => ({ name: prompt.name, description: prompt.description })); logger.info('Prompts list generated', { requestId, promptCount: promptList.length }); return { prompts: promptList }; } catch (error) { logger.error('Prompts list request failed', error); throw error_handling_1.ErrorHandler.createError(error_handling_1.ErrorCategory.OPERATION, error_handling_1.ErrorSeverity.HIGH, error instanceof Error ? error.message : 'Unknown error in prompts list', { operation: 'prompts_list', component: 'PromptsHandler', requestId, input: args }); } } /** * Handle prompts/get MCP request */ async function handlePromptsGetRequest(args, logger, requestId) { try { logger.info('Processing prompts/get request', { requestId, promptName: args.name }); if (!args.name) { throw new Error('Missing required parameter: name'); } const prompts = loadAllPrompts(logger); const prompt = prompts.find(p => p.name === args.name); if (!prompt) { throw error_handling_1.ErrorHandler.createError(error_handling_1.ErrorCategory.VALIDATION, error_handling_1.ErrorSeverity.MEDIUM, `Prompt not found: ${args.name}`, { operation: 'prompts_get', component: 'PromptsHandler', requestId }); } logger.info('Prompt found and returned', { requestId, promptName: prompt.name }); // Convert to MCP prompts/get response format return { description: prompt.description, messages: [ { role: "user", content: { type: "text", text: prompt.content } } ] }; } catch (error) { logger.error('Prompts get request failed', error); // Re-throw if already an AppError if (error instanceof Error && 'category' in error) { throw error; } throw error_handling_1.ErrorHandler.createError(error_handling_1.ErrorCategory.OPERATION, error_handling_1.ErrorSeverity.HIGH, error instanceof Error ? error.message : 'Unknown error in prompts get', { operation: 'prompts_get', component: 'PromptsHandler', requestId, input: args }); } }