/**
 * ============================================================
 *  src/context/sessionRegistry.ts —— 同 cwd 多 session 注册表
 * ------------------------------------------------------------
 *  做的事：
 *    一个工作目录下可以有多个并行 session（id = 任意字符串），
 *    每次只激活一个。active 信息存 ~/.minimal-agent/active-sessions.json，
 *    键是 cwd 的 sha1[:12]，值是当前激活的 session id 字符串。
 *
 *  文件路径：
 *    <MINIMAL_AGENT_HOME ?? ~>/.minimal-agent/active-sessions.json
 *    <MINIMAL_AGENT_HOME ?? ~>/.minimal-agent/sessions/<cwd-hash>--<id>.json
 *      （新格式；旧格式 <cwd-hash>.json 视作 id='default' 兼容）
 *
 *  抉择：
 *    - active 文件 atomic write（写 .tmp + rename）—— 防止跨进程并发写时部分写入
 *    - sessionId 为字符串，'default' 是约定的默认值（无 active 时返回它）
 *    - listSessions 同时扫新旧格式，保证迁移期不丢
 * ============================================================
 */
import { createHash } from 'node:crypto';
import { mkdir, readFile, readdir, rename, writeFile } from 'node:fs/promises';
import { homedir } from 'node:os';
import { join } from 'node:path';
/** 解析根目录，支持 MINIMAL_AGENT_HOME 测试覆盖 */
function agentHome() {
    return process.env.MINIMAL_AGENT_HOME ?? homedir();
}
function agentDir() {
    return join(agentHome(), '.minimal-agent');
}
function activeFilePath() {
    return join(agentDir(), 'active-sessions.json');
}
function sessionsDirPath() {
    return join(agentDir(), 'sessions');
}
function cwdHash(cwd) {
    return createHash('sha1').update(cwd).digest('hex').slice(0, 12);
}
async function loadActiveMap() {
    try {
        const raw = await readFile(activeFilePath(), 'utf8');
        const data = JSON.parse(raw);
        if (data && typeof data === 'object' && !Array.isArray(data)) {
            return data;
        }
        return {};
    }
    catch {
        return {};
    }
}
/**
 * 获取当前 cwd 的激活 session id。
 * 无记录 → 返回 'default'。
 */
export async function getActiveSession(cwd) {
    const map = await loadActiveMap();
    return map[cwdHash(cwd)] ?? 'default';
}
/**
 * 设置当前 cwd 的激活 session id。
 *
 * 写入策略：先写 <target>.tmp，再原子 rename 到 target；
 * 即使被中断也只会留临时文件，不破坏 target。
 */
export async function setActiveSession(cwd, sessionId) {
    const map = await loadActiveMap();
    map[cwdHash(cwd)] = sessionId;
    await mkdir(agentDir(), { recursive: true });
    const target = activeFilePath();
    const tmp = `${target}.tmp`;
    await writeFile(tmp, JSON.stringify(map), 'utf8');
    await rename(tmp, target);
}
/**
 * 列出当前 cwd 下所有 session id（含 'default'）。
 *
 * 扫描规则：
 *  - 新格式 `<hash>--<id>.json` → 提取 id
 *  - 旧格式 `<hash>.json` → 视作 'default'
 *  - 都没有 → 返回 ['default']（让 UI 默认能 list 出至少一项）
 */
export async function listSessions(cwd) {
    const dir = sessionsDirPath();
    const hash = cwdHash(cwd);
    let names;
    try {
        names = await readdir(dir);
    }
    catch {
        return ['default'];
    }
    const prefix = `${hash}--`;
    const ids = names
        .filter((n) => n.startsWith(prefix) && n.endsWith('.json'))
        .map((n) => n.slice(prefix.length, -'.json'.length));
    const legacy = `${hash}.json`;
    if (names.includes(legacy) && !ids.includes('default')) {
        ids.unshift('default');
    }
    return ids.length > 0 ? ids : ['default'];
}
