"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.listFrameworks = listFrameworks;
exports.getFramework = getFramework;
exports.getFrameworkTemplate = getFrameworkTemplate;
/**
 * Project Caffeine v0.0.4
 * Copyright (c) 2025-2026 Gitconomy Research
 *
 * SPDX-License-Identifier: MIT
 *
 * Contributors:
 * - 郭晧 <guohao@gitconomy.org> (Initial Author)
 */
const promises_1 = __importDefault(require("fs/promises"));
const path_1 = __importDefault(require("path"));
/** 框架定义文件存放的目录路径 */
const FRAMEWORKS_DIR = path_1.default.join(__dirname, '../models/frameworks');
/** 角色矩阵文件路径 */
const PERSONAS_PATH = path_1.default.join(__dirname, '../models/personas/personas.json');
/** 框架缓存，避免重复读取文件系统 */
let frameworksCache = null;
/** 角色缓存 */
let personasCache = null;
/**
 * 加载角色矩阵（personas.json）。
 *
 * @returns {Promise<any[]>} 角色数组，若加载失败则返回空数组
 */
async function loadPersonas() {
    if (personasCache)
        return personasCache;
    try {
        const content = await promises_1.default.readFile(PERSONAS_PATH, 'utf-8');
        personasCache = JSON.parse(content);
        return personasCache;
    }
    catch (error) {
        console.error('[PromptService] 加载角色矩阵失败:', error);
        return [];
    }
}
/**
 * 从文件系统加载所有框架 JSON 文件。
 *
 * @returns {Promise<Framework[]>} 框架对象数组，若加载失败则返回空数组
 */
async function loadFrameworks() {
    if (frameworksCache)
        return frameworksCache;
    try {
        const files = await promises_1.default.readdir(FRAMEWORKS_DIR);
        const jsonFiles = files.filter(f => f.endsWith('.json'));
        const frameworks = await Promise.all(jsonFiles.map(async (file) => {
            const content = await promises_1.default.readFile(path_1.default.join(FRAMEWORKS_DIR, file), 'utf-8');
            return JSON.parse(content);
        }));
        frameworksCache = frameworks;
        return frameworks;
    }
    catch (error) {
        console.error('[PromptService] 加载框架失败:', error);
        return [];
    }
}
/**
 * 列出所有可用框架的元信息（不含模板、系统提示词和示例）。
 *
 * @returns {Promise<Array<Omit<Framework, 'template' | 'systemPrompt' | 'examples'>>>}
 *          框架元信息列表，每个框架包含名称、描述和参数列表
 */
async function listFrameworks() {
    const frameworks = await loadFrameworks();
    return frameworks.map(({ name, description, parameters }) => ({
        name,
        description,
        parameters
    }));
}
/**
 * 获取指定框架的完整提示词消息序列。
 *
 * @param {string} name - 框架名称
 * @param {Record<string, string>} args - 用户传入的参数键值对
 * @returns {Promise<PromptResult>} 符合 MCP 规范的消息序列对象
 * @throws {Error} 当指定名称的框架不存在时抛出错误
 */
async function getFramework(name, args) {
    const frameworks = await loadFrameworks();
    const framework = frameworks.find(f => f.name === name);
    if (!framework) {
        throw new Error(`框架 "${name}" 不存在`);
    }
    // 确定系统提示词（优先使用角色矩阵）
    let systemPrompt = framework.systemPrompt || '';
    if (framework.persona) {
        const personas = await loadPersonas();
        const persona = personas.find(p => p.id === framework.persona);
        if (persona) {
            systemPrompt = persona.systemPrompt;
        }
    }
    const messages = [];
    if (systemPrompt) {
        messages.push({
            role: 'system',
            content: { type: 'text', text: systemPrompt }
        });
    }
    if (framework.examples && Array.isArray(framework.examples)) {
        for (const example of framework.examples) {
            let exampleUserContent = framework.template;
            for (const [key, value] of Object.entries(example.input)) {
                exampleUserContent = exampleUserContent.replace(new RegExp(`{{${key}}}`, 'g'), value);
            }
            messages.push({
                role: 'user',
                content: { type: 'text', text: exampleUserContent }
            });
            messages.push({
                role: 'assistant',
                content: { type: 'text', text: example.output }
            });
        }
    }
    let currentUserContent = framework.template;
    for (const [key, value] of Object.entries(args)) {
        currentUserContent = currentUserContent.replace(new RegExp(`{{${key}}}`, 'g'), value);
    }
    messages.push({
        role: 'user',
        content: { type: 'text', text: currentUserContent }
    });
    return { messages };
}
/**
 * 获取指定框架的完整定义（包括模板、示例、系统提示等）。
 *
 * @param {string} name - 框架名称
 * @returns {Promise<Framework>} 完整的 Framework 对象
 * @throws {Error} 如果框架不存在则抛出错误
 */
async function getFrameworkTemplate(name) {
    const frameworks = await loadFrameworks();
    const framework = frameworks.find(f => f.name === name);
    if (!framework) {
        throw new Error(`框架 "${name}" 不存在`);
    }
    return framework;
}
//# sourceMappingURL=promptService.js.map