UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

155 lines (154 loc) 8.29 kB
/** * insight-analyst.js — Insight Analyst 领域函数 * * 从旧 AnalystAgent.js 提取的纯领域逻辑: * - Analyst System Prompt * - 工具白名单 * - 预算常量 * - 9 段式 Prompt 构建器 * * 被 PipelineStrategy 的 bootstrap preset 直接引用。 * 不再包含任何 Agent 类 — Agent 由 AgentRuntime + PipelineStrategy 驱动。 * * @module insight-analyst */ /** 维度配置 (Analyst) */ interface AnalystDimConfig { id: string; label: string; guide?: string; focusKeywords?: string[]; outputType?: string; allowedKnowledgeTypes?: string[]; } /** 项目信息 (Analyst) */ interface AnalystProjectInfo { name: string; lang: string; fileCount: number; } /** DimensionContext 最小接口 */ interface DimensionContextLike { buildContextForDimension(dimId: string): { previousDimensions: Record<string, DimensionDigestLike>; }; } /** 维度摘要 */ interface DimensionDigestLike { summary?: string; keyFindings: string[]; crossRefs?: Record<string, string>; } /** EpisodicMemory (SessionStore) 最小接口 */ interface EpisodicMemoryLike { buildContextForDimension(dimId: string, focusKeywords: string[]): string | null; getRelevantReflections(dimId: string): string | null; } /** PersistentMemory 最小接口 */ interface SemanticMemoryLike { toPromptSection(opts: { source: string; query: string; limit: number; }): Promise<string | null> | string | null; } /** CodeEntityGraph 最小接口 */ interface CodeEntityGraphLike { generateContextForAgent(opts: { maxEntities: number; maxEdges: number; }): string | null; } export declare const ANALYST_SYSTEM_PROMPT = "\u4F60\u662F\u4E00\u4F4D\u9AD8\u7EA7\u8F6F\u4EF6\u67B6\u6784\u5E08\uFF0C\u6B63\u5728\u6DF1\u5EA6\u5206\u6790\u4E00\u4E2A\u771F\u5B9E\u9879\u76EE\u7684\u67D0\u4E2A\u7EF4\u5EA6\u3002\n\n## \u6267\u884C\u8BA1\u5212\n\u4F60\u6709 **N \u8F6E**\u5DE5\u5177\u8C03\u7528\u673A\u4F1A\uFF08\u7CFB\u7EDF\u4F1A\u544A\u77E5\u5177\u4F53\u6570\u5B57\uFF09\u3002\u8BF7\u4E25\u683C\u6309\u4EE5\u4E0B\u8282\u594F\u5206\u914D\uFF1A\n\n| \u9636\u6BB5 | \u8F6E\u6B21\u5360\u6BD4 | \u76EE\u6807 |\n|------|---------|------|\n| 1. \u5168\u5C40\u626B\u63CF | \u7B2C 1-3 \u8F6E | get_project_overview + list_project_structure \u4E86\u89E3\u9879\u76EE\u7ED3\u6784 |\n| 2. \u7ED3\u6784\u5316\u63A2\u7D22 | \u7B2C 4-N\u00D760% \u8F6E | get_class_hierarchy / get_class_info \u7406\u89E3\u6838\u5FC3\u7C7B\uFF1Bsearch_project_code \u6279\u91CF\u641C\u7D22\u5173\u952E\u6A21\u5F0F |\n| 3. \u6DF1\u5EA6\u9A8C\u8BC1 | \u7B2C N\u00D760%-N\u00D780% \u8F6E | read_project_file \u9605\u8BFB\u5173\u952E\u5B9E\u73B0\uFF0C\u786E\u8BA4\u7EC6\u8282 |\n| 4. \u8F93\u51FA\u603B\u7ED3 | \u6700\u540E 20% | **\u505C\u6B62\u8C03\u7528\u5DE5\u5177**\uFF0C\u76F4\u63A5\u8F93\u51FA\u4F60\u7684\u5206\u6790\u6587\u672C |\n\n## \u5173\u952E\u89C4\u5219\n- **\u5230\u8FBE 80% \u8F6E\u6B21\u65F6\u5FC5\u987B\u5F00\u59CB\u5199\u603B\u7ED3**\uFF0C\u4E0D\u8981\u7B49\u7CFB\u7EDF\u63D0\u9192\n- \u6BCF\u4E00\u8F6E\u90FD\u5FC5\u987B\u8C03\u7528\u5DE5\u5177\u83B7\u53D6\u65B0\u4FE1\u606F\uFF0C\u4E0D\u8981\u82B1\u8F6E\u6B21\u5728\u7EAF\u6587\u672C\u601D\u8003\u4E0A\n- \u4E0D\u8981\u91CD\u590D\u641C\u7D22\u76F8\u540C\u5173\u952E\u8BCD\u6216\u8BFB\u53D6\u76F8\u540C\u6587\u4EF6\uFF08\u7CFB\u7EDF\u4F1A\u8FD4\u56DE\u7F13\u5B58\u5E76\u6263\u8F6E\u6B21\uFF09\n\n## \u5DE5\u5177\u6548\u7387\n- **\u6279\u91CF\u641C\u7D22**: search_project_code({ patterns: [\"keywordA\", \"keywordB\", \"keywordC\"] }) \u2014 \u4E00\u6B21\u641C 3-5 \u4E2A\n- **\u6279\u91CF\u8BFB\u6587\u4EF6**: read_project_file({ filePaths: [\"a.m\", \"b.m\", \"c.m\"] }) \u2014 \u4E00\u6B21\u8BFB 3-5 \u4E2A\n- **\u7ED3\u6784\u5316\u67E5\u8BE2\u4F18\u5148**: get_class_hierarchy / get_class_info \u6BD4\u6587\u672C\u641C\u7D22\u66F4\u7CBE\u786E\u9AD8\u6548\n\n## \u8F93\u51FA\u8981\u6C42\n\u8F93\u51FA\u4F60\u7684\u5206\u6790\u53D1\u73B0\uFF0C\u5305\u62EC\u5177\u4F53\u7684\u6587\u4EF6\u5B8C\u6574\u76F8\u5BF9\u8DEF\u5F84\uFF08\u4ECE\u9879\u76EE\u6839\u76EE\u5F55\u5F00\u59CB\uFF09\u548C\u884C\u53F7\u3002\n\u6BCF\u4E2A\u6587\u4EF6\u5F15\u7528\u683C\u5F0F: (\u6765\u6E90: Full/Relative/Path/FileName.ext:\u884C\u53F7)\n\u7981\u6B62\u53EA\u5199\u6587\u4EF6\u540D\uFF0C\u5FC5\u987B\u5199\u4ECE\u9879\u76EE\u6839\u5F00\u59CB\u7684\u5B8C\u6574\u8DEF\u5F84\u3002\n\u6807\u6CE8\u6BCF\u4E2A\u53D1\u73B0\u6240\u5C5E\u7684\u6A21\u5757/\u5305\u540D\u3002\n\u7528\u81EA\u7136\u8BED\u8A00\u63CF\u8FF0\u4F60\u7684\u7406\u89E3\uFF0C\u4E0D\u9700\u8981\u7279\u5B9A\u683C\u5F0F\u3002"; export declare const ANALYST_TOOLS: string[]; /** 默认 Analyst 预算(24 轮基线) */ export declare const ANALYST_BUDGET: { maxIterations: number; searchBudget: number; searchBudgetGrace: number; maxSubmits: number; softSubmitLimit: number; idleRoundsToExit: number; }; /** * 根据项目规模自适应计算 Analyst 预算 * * 策略: 以文件数为主要缩放因子,保持 searchBudget/maxIterations 的比例关系。 * - ≤40 文件: 基线 24 轮(小型项目无需额外预算) * - 41~100 文件: 线性插值到 32 轮 * - 101~200 文件: 线性插值到 40 轮 * - >200 文件: 封顶 40 轮(避免单维度成本失控) * * searchBudget 按比例随 maxIterations 缩放(保持 75%)。 * timeoutMs 按比例随 maxIterations 缩放(基线 300s 对应 24 轮)。 */ export declare function computeAnalystBudget(fileCount: number): typeof ANALYST_BUDGET & { timeoutMs: number; }; /** Panorama context — module role, layer, coupling, gaps */ interface PanoramaContextLike { moduleRole: string | null; moduleLayer: number | null; moduleCoupling: { fanIn: number; fanOut: number; } | null; knownGaps: string[]; layerContext: string | null; } /** Evidence starters — per-dimension evidence hints from Phase 1-4 */ interface EvidenceStarterEntry { hint: string; data: unknown; strength?: number; } /** Rescan context — existing recipes in this dimension */ interface RescanContextLike { existingRecipes: Array<{ title: string; trigger: string; }>; decayingRecipes?: Array<{ title: string; trigger: string; id?: string; decayReason?: string; }>; gap: number; existing: number; } /** * 构建 Analyst Prompt * * 12 段结构: * §1 任务描述 * §2 维度指引 * §3 SOP (分析步骤 + 常见错误) * §4 输出要求 * §5 工具提示 * §6 前序维度上下文 (SessionStore / DimensionContext) * §7 Tier Reflection 洞察 * §8 历史语义记忆 (Tier 3) * §9 代码实体图谱 (Phase E) * §ES 分析起点证据 (Phase 1-4 Evidence Starters) * §M1 全景上下文 (Panorama Phase 1.8) * §10 Rescan 已有知识上下文 * * @param dimConfig 维度配置 { id, label, guide, focusKeywords, outputType } * @param projectInfo { name, lang, fileCount } * @param [dimensionContext] DimensionContext 实例 (跨维度上下文) * @param [episodicMemory] SessionStore 实例 (v4.0 增强上下文) * @param [semanticMemory] PersistentMemory 实例 (v4.1 历史记忆) * @param [codeEntityGraph] CodeEntityGraph 实例 (Phase E 代码实体图谱) * @param [rescanContext] Rescan 已有知识上下文 (增量扫描时注入) * @param [panorama] 全景上下文 — 模块角色/层级/耦合/空白区 (Phase 1.8) * @param [evidenceStarters] Phase 1-4 证据启发 — 维度级分析起点 * @param [evolutionResult] Evolution Stage 产出 — 避免重复分析已处理的 Recipe */ export declare function buildAnalystPrompt(dimConfig: AnalystDimConfig, projectInfo: AnalystProjectInfo, dimensionContext: DimensionContextLike | null | undefined, episodicMemory: EpisodicMemoryLike | null | undefined, semanticMemory: SemanticMemoryLike | null | undefined, codeEntityGraph: CodeEntityGraphLike | null | undefined, rescanContext?: RescanContextLike | null, panorama?: PanoramaContextLike | null, evidenceStarters?: Record<string, EvidenceStarterEntry> | null, evolutionResult?: { evolved?: number; deprecated?: number; skipped?: number; totalRecipes?: number; } | null): Promise<string>; export {};