import type { Agent } from "../agent.js"; import type { AgentRunStopReason, AgentQueryMessage, AgentMemoryHook } from "../types/agent.js"; import type { ChatCompletionFunctionTool } from "../types/tool.js"; import type { ToolContext } from "../types/tool.js"; import type { ToolCallContext, ToolCallResult, ToolResultContext } from "../stream-adapter/native-stream.js"; import { ConcurrencyLimiter } from "./concurrency-limiter.js"; import { BudgetTracker } from "./budget-tracker.js"; import { ProgressReporter } from "./progress-reporter.js"; import { Journal } from "./journal.js"; import type { WorkflowProgressEvent } from "./types.js"; /** * WorkflowApis:workflow 脚本运行时 API(对标 wave-agent workflowApis)。 * agent() / parallel() / pipeline() / phase() / log()——让 workflow 脚本 * 动态 fan-out 子 agent。 * * 适配 sirius:用 sirius Agent.run(不依赖 wave-agent SubagentManager/Container)。 */ export interface WorkflowApiContext { /** Agent 工厂:每次调 agent() 时创建新 Agent 实例 */ createAgent: (opts?: AgentOpts) => Agent; /** * Host 注入的角色解析回调:据 opts.agentType 查 host agent 表取 prompt/tools/permission, * 返回 per-run persona(systemPrompt/tools)。缺省或不传时 agent() 跳过(向后兼容)。 * 对齐 MiMoCode SystemPrompt.agent + runtimePermission(路线 A:host 侧解析注入)。 */ resolvePersona?: (opts: AgentOpts) => Promise | (AgentPersona | undefined); /** Agent 消息构造:把 prompt 转成 AgentQueryMessage[] */ buildMessages: (prompt: string) => AgentQueryMessage[]; concurrencyLimiter: ConcurrencyLimiter; budgetTracker: BudgetTracker; progressReporter: ProgressReporter; journal: Journal; abortSignal: AbortSignal; args?: unknown; onLog?: (message: string) => void; onProgress?: (event: WorkflowProgressEvent) => void; initialAgentCount?: number; /** * 工具调用前拦截钩子(可干预),转发给内部每个 agent.run()。 * 语义同 AgentRunInput.onToolCall。 */ onToolCall?: (ctx: ToolCallContext) => ToolCallResult | Promise; /** * 工具调用后观察钩子(只读),转发给内部每个 agent.run()。 * 语义同 AgentRunInput.onToolResult。 */ onToolResult?: (ctx: ToolResultContext) => void | Promise; /** * Memory 记忆钩子(每轮 query 前自动召回注入 systemPrompt),转发给内部每个 agent.run()。 * 语义同 AgentRunInput.memory。不传则子 agent 无自动召回(向后兼容)。 */ memory?: AgentMemoryHook; /** * 工具上下文(含 permissionManager/workdir/sessionId),转发给内部每个 agent.run()。 * 使 workflow script 内的 agent() 调用能过 PermissionManager 沙箱。 * 不传则 agent.run 回退到 { workdir, sessionId }(向后兼容)。 */ toolContext?: ToolContext; } export interface AgentOpts { label?: string; phase?: string; schema?: object; model?: string; /** * 子 agent 角色名(host agent 表 / sirius.json agents overlay 注册),缺省走 "general"。 * 工厂体据 agentType 查 Agent.Info 取 prompt/permission/toolAllowlist 注入(M3 消费)。 * 对齐 MiMoCode workflow runtime.ts:224 AgentOpts.agentType(五上游一致走"预定义角色 + agentType 选择")。 */ agentType?: string; /** * 工具白名单(收窄 agent.toolAllowlist 子集)。M3 工厂体消费,收窄 toolManager 可见工具。 * 注意:只能是 toolAllowlist 子集,含未注册工具名会执行失败。 */ tools?: string[]; /** * 隔离模式 "worktree"(复用 actor.spawn 已有的 cwd 隔离支持,10.2.8)。M3 工厂体消费。 */ isolation?: string; } /** * Host 解析的子 agent persona(M3):agentType 角色的 systemPrompt/tools, * per-run 覆盖注入 agent.run。host 据 Agent.Service.get(agentType) + * SystemPrompt.agent + runtimePermission 解析(对齐 MiMoCode 路线 A:host 侧解析注入)。 */ export interface AgentPersona { /** 子 agent 专用 system prompt(host 据 agentType 角色 prompt 解析) */ systemPrompt?: string; /** 工具 schema 列表(host 据 agentType.toolAllowlist + per-call opts.tools 收窄解析) */ tools?: ChatCompletionFunctionTool[]; } /** * Agent 执行诊断(Batch B #12 透传到 workflow 层)。 * 编排层据此判断 Agent 是否真正干活,不再靠日志猜根因。 */ export interface WorkflowAgentDiagnostics { /** 全程工具调用次数。0 = 模型没调工具(可能模型配置错误或网关空响应) */ toolCallCount: number; /** 全程调用的工具名(按序,不去重)。诊断"调了 step_done 没调 Write"等部分异常 */ toolNames: string[]; /** run 级终止原因(与 tool 用量正交) */ stopReason: AgentRunStopReason; /** 总轮数 = turns.length。判断是否接近 maxTurns 上限 */ turnCount: number; /** token 消耗审计 */ usage?: { inputTokens: number; outputTokens: number; totalTokens: number; }; } /** * workflow agent() 返回值(0.5.0 破坏性变更)。 * - `result`: 主要输出,与旧 agent() 返回值同语义——无 schema → result.text(string); * schema 命中 → 结构化对象;schema 未命中 → string。 * - `diagnostics`: Agent 执行诊断,编排层据 stopReason + toolCallCount 判断 Agent 是否真干活。 * * 旧代码迁移:`const r = await agent(prompt)` → 原本 `r` 是 string/对象,现在用 `r.result`。 */ export interface WorkflowAgentResult { result: unknown; diagnostics: WorkflowAgentDiagnostics; } export interface WorkflowApis { agent: (prompt: string, opts?: AgentOpts) => Promise; parallel: (thunks: Array<() => Promise>) => Promise; pipeline: (items: unknown[], ...stages: Array<(prev: unknown, item: unknown, index: number) => Promise>) => Promise; phase: (title: string) => void; log: (message: string) => void; } export declare function createWorkflowApis(ctx: WorkflowApiContext): WorkflowApis;