#!/usr/bin/env node
/**
 * SoloForge 应用入口模块。
 * @description SoloForge 的启动入口，按顺序初始化四个核心组件：
 *              1. 加载项目配置（config.yaml 可选，缺失时自动推断）
 *              2. 初始化任务上下文管理器
 *              3. 启动 MCP Server（注册工具、建立 stdio 传输、设置关闭处理）
 *              4. 后台异步构建知识索引（启动文件监听）
 *              知识索引构建不再阻塞 MCP server 启动，避免客户端连接超时。
 *              每个初始化步骤包含 try/catch 降级策略，确保 MCP server 始终能启动。
 */
import { startServer } from "./server/index.js";
import { TaskContextManager } from "./engine/pipeline/task_context.js";
import { KnowledgeIndexManager } from "./knowledge/index_manager.js";
import { resolveProjectConfig } from "./knowledge/loader.js";
import path from "node:path";
import { debug, internalWarn } from "./engine/core/logger.js";
import { ENV } from "./engine/core/env.js";
import { createFallbackConfig, createNoOpKnowledgeIndex } from "./server/lifecycle.js";
/**
 * SoloForge 主函数。
 * @description 从环境变量 SOLOFORGE_PROJECT 或当前工作目录获取项目路径，
 *              先启动 MCP server 再后台构建知识索引，避免客户端连接超时。
 *              每步初始化都有降级策略，确保 MCP server 始终可用。
 */
async function main() {
    const projectPath = process.env[ENV.PROJECT] || process.cwd();
    debug("入口", `启动，项目路径: ${projectPath}`);
    // 1. 加载项目配置（降级：使用最小 fallback 配置）
    let config;
    let source;
    try {
        const resolved = await resolveProjectConfig(projectPath);
        config = resolved.config;
        source = resolved.source;
        if (source === "inferred") {
            debug("入口", "使用自动推断的配置。");
        }
        else {
            debug("入口", "配置加载完成。");
        }
    }
    catch (err) {
        internalWarn("入口", "配置加载失败，使用 fallback 配置:", err);
        config = createFallbackConfig(projectPath);
        source = "fallback";
    }
    // 2. 初始化任务上下文（降级：使用 tmpdir fallback）
    let taskContext;
    try {
        const stateDir = path.join(projectPath, ".soloforge", "state");
        taskContext = new TaskContextManager(stateDir);
    }
    catch (err) {
        internalWarn("入口", "TaskContextManager 初始化失败，使用 tmpdir fallback:", err);
        const tmpStateDir = path.join(process.cwd(), ".soloforge-state-fallback");
        taskContext = new TaskContextManager(tmpStateDir);
    }
    // 3. 创建知识索引管理器（降级：使用 no-op 索引）
    let knowledgeIndex;
    try {
        knowledgeIndex = new KnowledgeIndexManager(config);
    }
    catch (err) {
        internalWarn("入口", "KnowledgeIndexManager 创建失败，使用 no-op 降级:", err);
        knowledgeIndex = await createNoOpKnowledgeIndex();
    }
    // [ENG-9] 知识索引降级标记 — 在 config 上附加状态，供工具 handler 检查
    config._knowledgeDegraded = false;
    // 4. 启动 MCP Server — 唯一 fatal 步骤
    debug("入口", "启动 MCP Server...");
    await startServer({ config, knowledgeIndex, taskContext });
    debug("入口", "MCP Server 已启动。");
    // 5. 后台异步构建知识索引，不阻塞 server 响应
    debug("入口", "后台构建知识索引...");
    knowledgeIndex.build().then(() => {
        debug("入口", "知识索引后台构建完成。");
    }).catch((err) => {
        internalWarn("入口", "知识索引构建失败 —", err);
        config._knowledgeDegraded = true;
    });
}
main().catch((err) => {
    internalWarn("入口", "启动失败 —", err);
    process.exit(1);
});
//# sourceMappingURL=index.js.map