autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
212 lines (211 loc) • 8.78 kB
TypeScript
/**
* AgentFactory — 统一 Agent 创建工厂
*
* 在新架构中,Factory 的职责是:
* - 将 Preset 配置 + DI 依赖 → AgentRuntime 实例
* - 提供 Router (intent → preset → runtime)
* - 提供快捷方法 (createChat, createInsight, ...)
*
* 关键变化 (vs 旧 AgentFactory):
* - 不再创建独立 Agent 子类
* - 只创建 AgentRuntime,通过 Preset 配置差异化行为
* - 同一个工厂,同一种 Runtime,不同的配置
*
* @module AgentFactory
*/
import type { AiProvider } from '#external/ai/AiProvider.js';
import { AgentRouter } from './AgentRouter.js';
import { AgentRuntime } from './AgentRuntime.js';
import { ContextWindow } from './context/ContextWindow.js';
import { ExplorationTracker } from './context/ExplorationTracker.js';
import { MemoryCoordinator } from './memory/MemoryCoordinator.js';
import { type Policy } from './policies.js';
import type { ToolRegistry } from './tools/ToolRegistry.js';
/** Constructor options for AgentFactory */
interface AgentFactoryOptions {
container: Record<string, unknown>;
toolRegistry: ToolRegistry;
aiProvider: AiProvider;
memoryCoordinator?: MemoryCoordinator | null;
projectBriefing?: string | null;
projectRoot?: string;
}
/** Runtime creation overrides (passed to createRuntime and quick methods) */
interface RuntimeOverrides {
strategy?: Record<string, unknown>;
capabilities?: string[];
policies?: Array<Policy | ((overrides: RuntimeOverrides) => Policy)>;
persona?: Record<string, unknown>;
memory?: Record<string, unknown>;
onProgress?: ((event: Record<string, unknown>) => void) | null;
onToolCall?: ((name: string, args: Record<string, unknown>, result: unknown, iteration: number) => void) | null;
lang?: string | null;
additionalTools?: string[];
strategyOpts?: Record<string, unknown>;
strategyContext?: Record<string, unknown>;
[key: string]: unknown;
}
/** Options for buildSystemContext */
interface SystemContextOptions {
budget?: Record<string, unknown>;
trackerStrategy?: string;
label?: string;
lang?: string;
}
/** Options for scanKnowledge */
interface ScanKnowledgeOptions {
label?: string;
files?: Array<{
name: string;
content: string;
language?: string;
}>;
task?: 'extract' | 'summarize';
lang?: string;
comprehensive?: boolean;
}
export declare class AgentFactory {
#private;
/**
* @param opts.container ServiceContainer 实例
* @param [opts.memoryCoordinator] MemoryCoordinator 实例 (注入 Conversation)
* @param [opts.projectBriefing] 项目概况文本
* @param [opts.projectRoot] 项目根目录
*/
constructor({ container, toolRegistry, aiProvider, memoryCoordinator, projectBriefing, projectRoot, }: AgentFactoryOptions);
/** 创建带路由器的自动调度系统 */
createRouter(): AgentRouter;
/**
* 根据 Preset 名称创建 AgentRuntime
*
* 这是一切的根基 — 任何 "Agent 类型" 都通过这个方法创建。
*
* @param presetName Preset 名称 (chat/insight/remote-exec)
* @param [overrides] 覆盖 preset 配置
*/
createRuntime(presetName: string, overrides?: RuntimeOverrides): AgentRuntime;
/**
* 创建 ContextWindow (根据当前 AI Provider 自动解析 token 预算)
* @param [opts]
*/
createContextWindow(opts?: {
isSystem?: boolean;
}): ContextWindow;
/**
* 构建系统级多轮执行上下文 — 统一基础设施
*
* 抽取 bootstrap orchestrator 中创建 ExplorationTracker / ContextWindow / source 的
* 通用逻辑,供 scanKnowledge 等系统场景共用完整的多轮 Agent 框架。
*
* 与 bootstrap orchestrator 保持一致的 MemoryCoordinator 管理模式:
* - 创建轻量级 MemoryCoordinator (无 PersistentMemory/SessionStore)
* - 通过 MC.createDimensionScope 创建并注册 ActiveContext
* - trace 从 MC.getActiveContext 获取 (统一生命周期管理)
* - memoryCoordinator 传入 strategyContext,供 reactLoop 每轮 buildDynamicMemoryPrompt
*
* 与 bootstrap orchestrator 对齐的关键字段:
* - activeContext: 与 trace 同一实例 — insightGateEvaluator 通过此字段
* 决定走 buildAnalysisArtifact (完整: findings/evidenceMap/negativeSignals)
* 还是 buildAnalysisReport (降级: 仅文本)
* - outputType: 'candidate' — 设置 quality_gate 的评判标准
* - dimId: 维度 ID — buildAnalysisArtifact 的 dimensionId 参数
*
* bootstrap orchestrator 不使用此方法(它还需要领域特定的 SessionStore / dimContext 等),
* 但引擎层基础设施是一致的。
*
* @param [opts.budget] 预算覆盖 (透传给 ExplorationTracker)
* @param [opts.trackerStrategy='analyst'] tracker 策略名: 'analyst' | 'producer' | 'bootstrap'
* @param [opts.label='default'] 作用域标签 (用于 scopeId 命名 + dimId)
* @param [opts.lang] 项目语言 (透传给 sharedState._projectLanguage)
* @returns }
*/
buildSystemContext({ budget, trackerStrategy, label, lang, }?: SystemContextOptions): {
contextWindow: ContextWindow;
tracker: ExplorationTracker | null;
trace: import("./memory/ActiveContext.js").ActiveContext | null;
activeContext: import("./memory/ActiveContext.js").ActiveContext | null;
memoryCoordinator: MemoryCoordinator;
outputType: string;
dimId: string;
sharedState: {
submittedTitles: Set<unknown>;
submittedPatterns: Set<unknown>;
_projectLanguage: string | null;
_dimensionScopeId: string;
};
source: string;
scopeId: string;
};
/**
* 获取 AI Provider 信息 (供 orchestrator 等外部使用)
* @returns }
*/
getAiProviderInfo(): {
model: string;
name: string;
};
/** 创建对话 Runtime (Dashboard / 飞书聊天) */
createChat(opts?: RuntimeOverrides): AgentRuntime;
/**
* 创建洞察 Runtime (深度代码分析 + 知识提取)
* @param [opts.dimensions] 维度列表 (传给 FanOutStrategy 的 items)
* @param [opts.projectInfo] 项目信息
*/
createInsight(opts?: RuntimeOverrides): AgentRuntime;
/** 创建飞书对话 Runtime (知识管理,服务端处理) */
createLark(opts?: RuntimeOverrides): AgentRuntime;
/** 创建远程执行 Runtime (飞书终端 / 远程操作) */
createRemoteExec(opts?: RuntimeOverrides): AgentRuntime;
/**
* 统一知识扫描 — 走 insight 管线 (Analyze → QualityGate → Produce → RejectionGate)
*
* extract 和 summarize 共享工具驱动管线 (collect_scan_recipe),
* 仅 Produce 阶段的 systemPrompt 和预算不同:
* - extract: 多文件 target 扫描,24 iter analyze,24 iter produce
* - summarize: 单文件/代码片段,12 iter analyze,12 iter produce
*
* 关系发现请使用单独的 discoverRelations() 方法。
*
* @param opts.label 上下文标签(target 名 / 文件名)
* @param opts.files 源文件
* @param [opts.task='extract'] 任务类型
* @param [opts.lang] 语言提示
* @param [opts.comprehensive] 深度扫描标志
* @returns task-specific JSON
*/
scanKnowledge({ label, files, task, lang, comprehensive, }?: ScanKnowledgeOptions): Promise<any>;
/**
* 知识图谱关系发现 — 独立管线 (Explore → Synthesize)
*
* 与 scanKnowledge 不同,relations 不需要源文件输入,
* 而是通过查询知识库 + 读取源码发现知识条目间的语义关系。
*
* @param [opts.batchSize=20] 批次大小提示
* @returns >}
*/
discoverRelations({ batchSize }?: {
batchSize?: number | undefined;
}): Promise<any>;
/**
* AI 翻译 — chat 模式,单轮生成
*
* Agent(LLM) 直接翻译文本,无需工具。
*
* @param summary 中文摘要
* @param [usageGuide] 中文使用指南
* @returns >}
*/
translateToEnglish(summary: string, usageGuide?: string): Promise<any>;
/**
* 通用工具执行 — 直接调用工具 handler
*
* 纯数据工具直接执行,无需创建 Agent。
* AI 推理由各语义方法的 Agent 自主完成,此方法仅用于纯数据工具。
*
* @param toolName 工具名称
* @param params 工具参数
* @returns 工具原始返回值
*/
invokeAgent(toolName: string, params: Record<string, unknown>): Promise<unknown>;
}
export default AgentFactory;