/**
 * ============================================================
 *  src/utils/resourcePaths.ts —— 资源目录双源解析
 * ------------------------------------------------------------
 *  问题：skills/ 和 plugins/ 这类"资源目录"需要在两种场景下都能找到：
 *    - 用户在 minimal-agent 源码仓库里跑（dev）：cwd === packageRoot
 *    - 用户全局 npm install 后在自己项目里跑：cwd ≠ packageRoot
 *      此时既要看 npm 包自带的资源，也要看用户在自己项目里新加的资源。
 *
 *  方案：返回 [cwd/<name>, packageRoot/<name>]，cwd 优先。
 *    - 用 existsSync 过滤不存在的目录（保留静默降级）
 *    - cwd 与 packageRoot 重合时去重（dev 场景）
 *
 *  消费者（commandRouter / skillList / 各插件 loader）按顺序扫描，先扫到的
 *  同名条目胜出 —— 让用户能在自己项目里覆盖或扩展全局自带资源。
 *
 *  ResourceName 故意是开放 string：插件可以自由声明自己的资源名（如
 *  workflow-runner 的 'workflows'），框架不预设资源名清单。
 * ============================================================
 */
import { existsSync } from 'node:fs';
import { join, resolve } from 'node:path';
import { getWorkingDir } from '../bootstrap/workingDir.js';
import { execSiblingDir } from './greenRoot.js';
import { findPackageRoot } from './packageRoot.js';
/**
 * 返回资源目录的搜索顺序数组（cwd 优先 + packageRoot fallback）。
 *
 * @param name     资源类别名（也作为子目录名）
 * @param metaUrl  调用方 import.meta.url（用于定位 packageRoot）
 * @returns        存在的搜索路径数组；都不存在则返回空数组
 */
export function getResourceSearchPaths(name, metaUrl) {
    const paths = [];
    const cwdPath = resolve(join(getWorkingDir(), name));
    if (existsSync(cwdPath)) {
        paths.push(cwdPath);
    }
    // 绿色版（bun --compile 单文件）：exe 同级 <name>/ —— compile 后 findPackageRoot
    // 失效，资源目录摆在可执行文件旁边从这里命中。dev/npm 下 exe 同级（node/bun
    // 二进制所在目录）没有资源目录 → existsSync 过滤 → 数组与现状一致。
    const sibPath = resolve(join(execSiblingDir(), name));
    if (!paths.includes(sibPath) && existsSync(sibPath)) {
        paths.push(sibPath);
    }
    let pkgPath;
    try {
        pkgPath = resolve(join(findPackageRoot(metaUrl), name));
    }
    catch {
        return paths;
    }
    if (!paths.includes(pkgPath) && existsSync(pkgPath)) {
        paths.push(pkgPath);
    }
    return paths;
}
