import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { registerTools } from "./tools/index.js";
import { readFileSync, existsSync } from "node:fs";
import { debug, internalWarn } from "../engine/core/logger.js";
import { safeJsonParse } from "../engine/core/helpers.js";
import { createShutdownHandler } from "./lifecycle.js";
const pkgVersion = safeJsonParse(readFileSync(new URL("../../package.json", import.meta.url), "utf-8"))?.version ?? "";
/**
 * 启动 SoloForge MCP 服务器。
 * @description 创建 McpServer 实例，注册工具，通过 stdio 传输连接 Claude Code，
 *              并设置信号处理和异常处理以确保优雅关闭。
 * @param deps - 服务器依赖项（配置、知识索引、任务上下文）
 */
export async function startServer(deps) {
    debug("server", "startServer() 开始执行");
    const { config, knowledgeIndex, taskContext } = deps;
    // 非 Git 仓库启动警告 — 功能降级提示
    if (!existsSync(".git")) {
        internalWarn("server", `当前目录 "${process.cwd()}" 不是 Git 仓库。部分功能（变更追踪、差异对比、提交历史）将不可用。建议初始化 Git 仓库: git init`);
    }
    const server = new McpServer({
        name: "soloforge",
        version: pkgVersion,
    });
    await registerTools(server, { config, knowledgeIndex, taskContext });
    const transport = new StdioServerTransport();
    await server.connect(transport);
    // [ENG-5] 使用 lifecycle.ts 的 createShutdownHandler，获得超时强退能力
    const shutdown = createShutdownHandler(async () => {
        if (knowledgeIndex)
            await knowledgeIndex.close();
        await transport.close?.();
    });
    process.on("SIGTERM", shutdown);
    process.on("SIGINT", shutdown);
    // 客户端（Claude Code）断开连接，触发优雅退出
    process.on("SIGPIPE", () => {
        shutdown();
    });
    // 捕获未处理的同步异常，同步清理后退出（避免异步清理未完成就 exit）
    process.on("uncaughtException", (err) => {
        internalWarn("server", "未捕获异常:", err);
        // 同步清理：不等待 async 操作，直接退出
        process.exitCode = 1;
        process.exit(1);
    });
    // 捕获未处理的 Promise 拒绝，同步清理后退出
    process.on("unhandledRejection", (reason) => {
        internalWarn("server", "未处理的 Promise 拒绝:", reason);
        process.exitCode = 1;
        process.exit(1);
    });
}
//# sourceMappingURL=index.js.map