/**
 * Agent discovery and configuration for the subagent delegation extension.
 *
 * Agent definitions are markdown files with YAML frontmatter:
 *
 *   ---
 *   name: my-agent
 *   description: What this agent does
 *   tools: read, grep, find, ls
 *   model: claude-haiku-4-5
 *   ---
 *   System prompt for the agent goes here.
 *
 * Locations:
 *   ~/.spectral/agent/agents/*.md     — User-level (always loaded)
 *   .spectral/agents/*.md             — Project-level (opt-in via agentScope)
 */
import * as fs from "node:fs";
import * as path from "node:path";
import { getAgentDir, parseFrontmatter } from "../sdk/coding-agent/index.js";
function loadAgentsFromDir(dir, source) {
    const agents = [];
    if (!fs.existsSync(dir)) {
        return agents;
    }
    let entries;
    try {
        entries = fs.readdirSync(dir, { withFileTypes: true });
    }
    catch {
        return agents;
    }
    for (const entry of entries) {
        if (!entry.name.endsWith(".md"))
            continue;
        if (!entry.isFile() && !entry.isSymbolicLink())
            continue;
        const filePath = path.join(dir, entry.name);
        let content;
        try {
            content = fs.readFileSync(filePath, "utf-8");
        }
        catch {
            continue;
        }
        const { frontmatter, body } = parseFrontmatter(content);
        if (!frontmatter.name || !frontmatter.description) {
            continue;
        }
        const tools = frontmatter.tools
            ?.split(",")
            .map((t) => t.trim())
            .filter(Boolean);
        agents.push({
            name: frontmatter.name,
            description: frontmatter.description,
            tools: tools && tools.length > 0 ? tools : undefined,
            model: frontmatter.model,
            systemPrompt: body,
            source,
            filePath,
        });
    }
    return agents;
}
function isDirectory(p) {
    try {
        return fs.statSync(p).isDirectory();
    }
    catch {
        return false;
    }
}
function findNearestProjectAgentsDir(cwd) {
    let currentDir = cwd;
    while (true) {
        const candidate = path.join(currentDir, ".spectral", "agents");
        if (isDirectory(candidate))
            return candidate;
        const parentDir = path.dirname(currentDir);
        if (parentDir === currentDir)
            return null;
        currentDir = parentDir;
    }
}
export function discoverAgents(cwd, scope) {
    const userDir = path.join(getAgentDir(), "agents");
    const projectAgentsDir = findNearestProjectAgentsDir(cwd);
    const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
    const projectAgents = scope === "user" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, "project");
    const agentMap = new Map();
    if (scope === "both") {
        for (const agent of userAgents)
            agentMap.set(agent.name, agent);
        for (const agent of projectAgents)
            agentMap.set(agent.name, agent);
    }
    else if (scope === "user") {
        for (const agent of userAgents)
            agentMap.set(agent.name, agent);
    }
    else {
        for (const agent of projectAgents)
            agentMap.set(agent.name, agent);
    }
    return { agents: Array.from(agentMap.values()), projectAgentsDir };
}
export function formatAgentList(agents, maxItems) {
    if (agents.length === 0)
        return { text: "none", remaining: 0 };
    const listed = agents.slice(0, maxItems);
    const remaining = agents.length - listed.length;
    return {
        text: listed.map((a) => `${a.name} (${a.source}): ${a.description}`).join("; "),
        remaining,
    };
}
