import { jsx as _jsx } from "react/jsx-runtime";
/**
 * ============================================================
 *  src/ui/Root.tsx —— TUI 顶层 phase 切换器
 * ------------------------------------------------------------
 *  作为 Ink 渲染树的根节点，根据"有没有 Provider 配置"决定渲染：
 *    - 没有 → <ConfigWizard>：用户填完 + 测试通过后切到 App
 *    - 有 → <App>：常规对话界面
 *
 *  为什么需要这一层而不是直接在 main.tsx 二选一渲染？
 *    向导成功后必须直接进 App，不能让用户手动重跑命令。在 React 树里用 state
 *    切换是最自然的方式，无需 ink unmount/remount 的额外开销。
 *
 *  initialHistory 的构造（buildFullSystemPrompt + 历史持久化加载）在向导后才跑，
 *  因为：
 *    - 系统提示词本身不依赖 provider，但流程上推迟到"确定要进 App"那一刻
 *      最干净。
 *    - 第一次启动时常常没历史可加载，buildInitialHistory 行为是只返 system
 *      prompt，开销可忽略。
 * ============================================================
 */
import { useEffect, useState } from 'react';
import { Box, Text } from 'ink';
import { getWorkingDir } from '../bootstrap/workingDir.js';
import { ConfigWizard } from '../cli/configWizard.js';
import { loadContext } from '../context/persistContext.js';
import { buildFullSystemPrompt } from '../prompts/system.js';
import { ALL_TOOLS } from '../tools/index.js';
import { App } from './App.js';
export function Root({ initialProvider }) {
    const [phase, setPhase] = useState(initialProvider
        ? { kind: 'loading-history', provider: initialProvider }
        : { kind: 'wizard' });
    useEffect(() => {
        if (phase.kind !== 'loading-history')
            return;
        let cancelled = false;
        void (async () => {
            const history = await buildInitialHistory();
            if (cancelled)
                return;
            setPhase({ kind: 'app', provider: phase.provider, initialHistory: history });
        })();
        return () => {
            cancelled = true;
        };
    }, [phase]);
    if (phase.kind === 'wizard') {
        return (_jsx(ConfigWizard, { onSuccess: (provider) => {
                setPhase({ kind: 'loading-history', provider });
            } }));
    }
    if (phase.kind === 'loading-history') {
        return (_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "gray", children: "\u6B63\u5728\u52A0\u8F7D\u5386\u53F2\u4E0A\u4E0B\u6587..." }) }));
    }
    return _jsx(App, { provider: phase.provider, initialHistory: phase.initialHistory });
}
/**
 * 复用 main.tsx 的逻辑：fresh system prompt + 上次未关闭的对话。
 * 这里独立一份是为了让 Root 内部能在向导成功后即时构造，不必返工 main.tsx。
 */
async function buildInitialHistory() {
    const content = await buildFullSystemPrompt(getWorkingDir(), ALL_TOOLS);
    const fresh = { role: 'system', content };
    const persisted = await loadContext();
    if (!persisted || persisted.length === 0)
        return [fresh];
    const rest = persisted[0]?.role === 'system' ? persisted.slice(1) : persisted;
    return [fresh, ...rest];
}
