UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

159 lines (158 loc) 5.15 kB
/** * ExplorationTracker — 统一的 AI 探索生命周期控制器 * * 合并了三个原本各自为政的系统: * 1. PhaseRouter (ContextWindow.js) — 阶段状态机 * 2. 探索进度追踪 (原内联逻辑) — 信息增量检测 * 3. ReasoningLayer 行为控制部分 — 反思/规划/停滞 nudge * * 职责(拆分后的编排层): * - 阶段状态机: phase 持有 + 转换规则 * - 信号收集: 委托 SignalDetector * - Nudge 生成: 委托 NudgeGenerator * - 计划跟踪: 委托 PlanTracker * - Graceful exit: 管理轮次耗尽后的优雅退出流程 * * 不拥有的职责: * - 推理链数据收集 → ReasoningTrace (纯数据,不影响行为) * - 上下文压缩 → ContextWindow * - 工具注册与执行 → ToolRegistry * - 跨对话记忆 → Memory / WorkingMemory * * @module ExplorationTracker */ import type { SignalBus } from '#infra/signal/SignalBus.js'; import type { ExplorationBudget, ExplorationStrategy, ExplorationTrace, PipelineType } from './exploration/ExplorationStrategies.js'; /** resolve() 选项 */ interface ResolveOptions { source?: unknown; strategy?: unknown; dimensionMeta?: { outputType?: string; }; } /** 预算输入(带默认值) */ interface BudgetInput extends Partial<ExplorationBudget> { submitToolName?: string; pipelineType?: PipelineType; signalBus?: SignalBus | null; } export declare class ExplorationTracker { #private; /** * @param strategy 策略配置对象 * @param budget 预算配置 { maxIterations, searchBudget, ... } */ constructor(strategy: ExplorationStrategy, budget: BudgetInput); /** * 根据调用参数解析应使用的策略 * @param opts AgentRuntime execute 的选项 * @param budget 预算配置 * @returns User 模式返回 null */ static resolve(opts: ResolveOptions, budget: BudgetInput): ExplorationTracker | null; /** 每轮迭代开始时调用 — 递增计数 */ tick(): void; /** 撤销 tick(AI 调用失败或空响应时,不计入迭代) */ rollbackTick(): void; /** 提交工具名 */ get submitToolName(): string; /** 管线类型标识 */ get pipelineType(): PipelineType; /** 是否应退出主循环 */ shouldExit(): boolean; /** * 获取本轮的 Nudge(每轮最多一条) * @param trace 推理链 * @returns |null} */ getNudge(trace: ExplorationTrace | null): { type: string; text: string; } | null; /** 获取当前阶段的上下文状态行(注入 systemPrompt 尾部) */ getPhaseContext(): string; /** 获取当前阶段的 toolChoice */ getToolChoice(): "none" | "auto" | "required"; /** * 记录一次工具调用结果,更新内部指标 * * @returns } */ recordToolCall(toolName: string, args: Record<string, unknown>, result: unknown): { isNew: boolean; }; /** * 结束本轮迭代 — 更新轮次级指标 + 检查阶段转换 * * @returns |null} 阶段转换 nudge */ endRound({ hasNewInfo, submitCount, toolNames, skipped, }?: { hasNewInfo?: boolean | undefined; submitCount?: number | undefined; toolNames?: string[] | undefined; skipped?: boolean | undefined; }): { type: string; text: string; } | null; /** * 处理 AI 返回纯文本响应(无工具调用) * @returns } */ onTextResponse(): { isFinalAnswer: boolean; needsDigestNudge: boolean; shouldContinue: boolean; nudge: string | null; }; /** 记录被截断的工具调用数量 */ recordTruncatedCalls(count: number): void; get isGracefulExit(): boolean; get isHardExit(): boolean; get phase(): string; get iteration(): number; get totalSubmits(): number; get strategyName(): string; getMetrics(): { iteration: number; phase: string; phaseRounds: number; submitCount: number; uniqueFiles: number; uniquePatterns: number; uniqueQueries: number; totalToolCalls: number; roundsSinceNewInfo: number; }; get metrics(): { iteration: number; phase: string; phaseRounds: number; submitCount: number; uniqueFiles: number; uniquePatterns: number; uniqueQueries: number; totalToolCalls: number; roundsSinceNewInfo: number; }; getPlanProgress(): { coveredSteps: number; totalSteps: number; deviationScore: number; unplannedActions: number; lastReplanIteration: number | null; consecutiveOffPlan: number; }; /** 更新计划进度 — 委托 PlanTracker */ updatePlanProgress(trace: ExplorationTrace | null): void; /** * 推理质量评分 — 委托 PlanTracker * @returns } */ getQualityMetrics(trace: ExplorationTrace | null): { score: number; breakdown: Record<string, number>; }; } export default ExplorationTracker;