/**
 * ============================================================
 *  plugins/workflow-runner/src/stepExecutors/agent.ts —— agent 步骤执行器
 * ------------------------------------------------------------
 *  执行 workflow 中 type: agent 的步骤：启动一个 miniReAct 子循环，
 *  用工具随机应变地完成开放性任务。
 *
 *  与 llm 步骤的区别：
 *    - agent 有工具白名单（allowed_tools 过滤），可以 Read/Write/Grep/...
 *    - agent 跑多轮 miniReAct（maxTurns 上限），llm 只跑单轮 chat
 *    - agent 的产出经过验证闸门（interpretMiniReActResult），llm 直接透传
 * ============================================================
 */
import { runMiniReAct } from '../miniReAct.js';
import { AGENT_OPENING, buildWorkflowAgentSystem, describeCaptureContract, interpretMiniReActResult, } from '../agentCommon.js';
/**
 * 执行一个 agent 步骤。
 *
 * 关键变化（Phase 2 重构）：
 *   buildWorkflowAgentSystem 现在是 async（因为需要扫描 skill/plugin 目录），
 *   agent 步骤的 system prompt 现在包含完整的：
 *     - 工具列表 + 使用规范
 *     - Skill 列表（含触发词）
 *     - Plugin 列表（含命令和描述）
 *   这解决了之前 workflow 模式下模型不知道有 pptx/pdf 等 skill 的问题。
 */
export async function* execAgentStep(step, vars, ctx) {
    const tools = (ctx.tools ?? []).filter((t) => step.allowed_tools?.includes(t.name));
    // ✅ Phase 2: 异步构建完整 system prompt（含 skill/plugin 列表）
    const systemContent = await buildWorkflowAgentSystem(ctx.cwd, // 新增：传入 cwd 用于 skill/plugin 扫描
    AGENT_OPENING, tools);
    const userMsg = step.prompt +
        describeCaptureContract(step) +
        (step.input ? `\n\n上下文变量：${step.input}` : '');
    const messages = [
        { role: 'system', content: systemContent },
        { role: 'user', content: userMsg },
    ];
    const result = yield* runMiniReAct({
        messages,
        tools,
        maxTurns: step.maxTurns ?? 12,
        provider: ctx.provider,
        signal: ctx.signal,
    });
    const outcome = interpretMiniReActResult(result, !!step.output_schema);
    if (!outcome.ok)
        throw new Error(`agent 步骤放弃: ${outcome.reason}`);
    return outcome.value;
}
