/**
 * ============================================================
 *  src/utils/debugLog.ts —— 文件调试日志（环境变量开关，默认全程 no-op）
 * ------------------------------------------------------------
 *  为什么需要：TUI（Ink）独占 stdout/stderr，console.log 在 TUI 里看不见、还会搅乱画面；
 *  而"卡死/不响应"这类问题恰恰无法靠正常退出来事后检查。把关键生命周期点**同步追加**到
 *  一个磁盘文件，进程即便随后挂死，日志也已落盘——文件的最后一行就指向卡住的位置。
 *
 *  用法：
 *    MINIMAL_AGENT_DEBUG_LOG=D:\tmp\ma-debug.log bun run start
 *    然后复现问题，把该文件最后几十行发来即可定位。
 *
 *  设计：
 *    - 未设环境变量 → dlog() 直接 return，零开销、零行为改变（不影响 npm/dev/绿色版任何路径）。
 *    - 用 appendFileSync（同步）：宁可慢一点也要保证"挂死前那一行确实写进了磁盘"。
 *    - 任何写日志的异常都吞掉，绝不让"记日志"反过来影响主流程。
 * ============================================================
 */
import { appendFileSync } from 'node:fs';
const LOG_PATH = process.env.MINIMAL_AGENT_DEBUG_LOG;
/** 调试日志是否开启（供调用方决定要不要算开销较大的 data）。 */
export function isDebugLogOn() {
    return !!LOG_PATH;
}
/**
 * 追加一行调试日志：`<ISO 时间> [tag] msg {data}`。
 * 未开启（无 MINIMAL_AGENT_DEBUG_LOG）时立即返回。
 */
export function dlog(tag, msg, data) {
    if (!LOG_PATH)
        return;
    try {
        const ts = new Date().toISOString();
        const line = data !== undefined
            ? `${ts} [${tag}] ${msg} ${safeJson(data)}\n`
            : `${ts} [${tag}] ${msg}\n`;
        appendFileSync(LOG_PATH, line);
    }
    catch {
        // 记日志失败绝不影响主流程
    }
}
/** 安全 JSON：循环引用 / 超长都不抛、不撑爆日志。 */
function safeJson(v) {
    try {
        const s = JSON.stringify(v);
        return s.length > 600 ? `${s.slice(0, 600)}…` : s;
    }
    catch {
        return String(v);
    }
}
