/**
 * MCP Server 生命周期管理。
 * @description 封装 shutdown 逻辑、版本读取和降级启动策略。
 */
import { readFileSync } from "node:fs";
import { debug, internalWarn } from "../engine/core/logger.js";
import { safeJsonParse } from "../engine/core/helpers.js";
/**
 * 读取 package.json 版本号，失败时返回 "unknown"。
 */
export function readPackageVersion() {
    const pkg = safeJsonParse(readFileSync(new URL("../../package.json", import.meta.url), "utf-8"));
    return pkg?.version ?? "unknown";
}
/**
 * 创建带超时的 shutdown 函数。
 * @param cleanup - 异步清理函数
 * @param timeoutMs - 超时毫秒数（默认 5000ms）
 */
export function createShutdownHandler(cleanup, timeoutMs = 5000) {
    let shuttingDown = false;
    return () => {
        if (shuttingDown)
            return;
        shuttingDown = true;
        const timer = setTimeout(() => {
            internalWarn("server", `shutdown 超时 (${timeoutMs}ms)，强制退出`);
            process.exit(1);
        }, timeoutMs);
        cleanup().then(() => {
            clearTimeout(timer);
            process.exit(0);
        }).catch((e) => {
            clearTimeout(timer);
            debug("server", "关闭资源失败", e);
            process.exit(1);
        });
    };
}
/**
 * 创建最小 fallback 配置（当真实配置加载失败时使用）。
 */
export function createFallbackConfig(projectPath) {
    internalWarn("入口", "使用最小 fallback 配置启动 MCP Server");
    return {
        schema_version: 1,
        name: "fallback",
        tech_stack: { backend: { lang: "", framework: "", version: "" }, frontend: { lang: "", framework: "", version: "" } },
        product_profile: "default",
        repos: [],
        build_commands: { backend: { build: "", test: "", full: "" }, frontend: { build: "", test: "", full: "" } },
        scope: { backend: [], frontend: [] },
        _projectPath: projectPath,
    };
}
/**
 * 创建 no-op KnowledgeIndexManager（当索引构建失败时使用）。
 */
export async function createNoOpKnowledgeIndex() {
    internalWarn("入口", "使用 no-op 知识索引（降级模式）");
    // 动态 import 避免 ESM 循环依赖
    const { KnowledgeIndexManager } = await import("../knowledge/index_manager.js");
    const fallbackConfig = createFallbackConfig(process.cwd());
    return new KnowledgeIndexManager(fallbackConfig);
}
//# sourceMappingURL=lifecycle.js.map