/**
 * ============================================================
 *  src/context/recentDirs.ts —— 最近工作目录注册表（Web 侧栏用）
 * ------------------------------------------------------------
 *  做的事：
 *    维护 ~/.minimal-agent/recent-dirs.json —— 一个"用过哪些工作目录"的列表。
 *    每个工作目录 = 一个会话（项目"一 cwd 一 session"约束），Web 前端侧栏据此
 *    列出会话；每条记录顺带存该目录的会话文件路径，让前端不必复刻哈希命名规则
 *    即可定位历史。
 *
 *  谁写：stream-json 模式每轮开始时 recordRecentDir(cwd, 首条用户消息)。
 *  谁读：webchat 服务端直接 JSON.parse 本文件（不 import 后端业务模块）。
 *
 *  抉择：读失败返回 []；写失败静默 —— 注册表只是 UI 便利，绝不该影响对话本身。
 * ============================================================
 */
import { mkdir, readFile, writeFile } from 'node:fs/promises';
import { homedir } from 'node:os';
import { basename, dirname, join, resolve } from 'node:path';
import { sessionFileFor } from './sessionPath.js';
/** 注册表上限：只留最近 N 个，防文件无限增长。 */
const MAX_ENTRIES = 50;
function registryPath() {
    return join(homedir(), '.minimal-agent', 'recent-dirs.json');
}
/** 读注册表，按最近使用倒序；任何异常返回 []。 */
export async function listRecentDirs() {
    try {
        const raw = await readFile(registryPath(), 'utf8');
        const data = JSON.parse(raw);
        if (!Array.isArray(data))
            return [];
        return data
            .filter((e) => e && typeof e.path === 'string' && typeof e.sessionFile === 'string')
            .sort((a, b) => b.lastUsedAt - a.lastUsedAt);
    }
    catch {
        return [];
    }
}
/**
 * 记录/更新一个工作目录。upsert by path：已存在则更新 lastUsedAt（title 给了才覆盖，
 * 否则保留旧 title），不存在则插入。写失败静默。
 */
export async function recordRecentDir(cwd, title) {
    try {
        const abs = resolve(cwd);
        const list = await listRecentDirs();
        const prev = list.find((e) => e.path === abs);
        const rest = list.filter((e) => e.path !== abs);
        const entry = {
            path: abs,
            name: basename(abs) || abs,
            lastUsedAt: Date.now(),
            title: title ? title.slice(0, 80) : prev?.title,
            sessionFile: sessionFileFor(abs),
        };
        const next = [entry, ...rest].slice(0, MAX_ENTRIES);
        const file = registryPath();
        await mkdir(dirname(file), { recursive: true });
        await writeFile(file, JSON.stringify(next, null, 2), 'utf8');
    }
    catch {
        // 静默：注册失败不影响对话
    }
}
