autosnippet 3.3.5 → 3.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dashboard/dist/assets/icons-FHns2ypa.js +1 -0
  2. package/dashboard/dist/assets/index-BRJv5Y3r.js +135 -0
  3. package/dashboard/dist/assets/index-DzoB7kxK.css +1 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/api-server.js +1 -0
  6. package/dist/bin/cli.d.ts +1 -0
  7. package/dist/bin/cli.js +137 -9
  8. package/dist/lib/agent/AgentFactory.d.ts +0 -17
  9. package/dist/lib/agent/AgentFactory.js +1 -25
  10. package/dist/lib/agent/AgentRuntime.d.ts +2 -2
  11. package/dist/lib/agent/AgentRuntime.js +26 -18
  12. package/dist/lib/agent/capabilities.d.ts +11 -0
  13. package/dist/lib/agent/capabilities.js +29 -5
  14. package/dist/lib/agent/context/ExplorationTracker.js +10 -1
  15. package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
  16. package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
  17. package/dist/lib/agent/domain/ChatAgentTasks.js +4 -0
  18. package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
  19. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  20. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  21. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  22. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  23. package/dist/lib/agent/domain/insight-gate.js +41 -0
  24. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  25. package/dist/lib/agent/domain/insight-producer.js +60 -5
  26. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  27. package/dist/lib/agent/forced-summary.js +7 -2
  28. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  29. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  30. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  31. package/dist/lib/agent/memory/SessionStore.js +9 -15
  32. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  33. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  34. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  35. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  36. package/dist/lib/agent/presets.d.ts +89 -1
  37. package/dist/lib/agent/presets.js +53 -5
  38. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  39. package/dist/lib/agent/tools/_shared.js +20 -21
  40. package/dist/lib/agent/tools/composite.d.ts +25 -22
  41. package/dist/lib/agent/tools/composite.js +108 -109
  42. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  43. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  44. package/dist/lib/agent/tools/index.d.ts +163 -92
  45. package/dist/lib/agent/tools/index.js +9 -1
  46. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  47. package/dist/lib/agent/tools/lifecycle.js +59 -75
  48. package/dist/lib/cli/AiScanService.js +5 -5
  49. package/dist/lib/cli/KnowledgeSyncService.js +1 -1
  50. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  51. package/dist/lib/core/discovery/ConfigWatcher.d.ts +64 -0
  52. package/dist/lib/core/discovery/ConfigWatcher.js +336 -0
  53. package/dist/lib/core/discovery/CustomConfigDiscoverer.d.ts +30 -0
  54. package/dist/lib/core/discovery/CustomConfigDiscoverer.js +1305 -0
  55. package/dist/lib/core/discovery/DiscovererPreference.d.ts +44 -0
  56. package/dist/lib/core/discovery/DiscovererPreference.js +141 -0
  57. package/dist/lib/core/discovery/DiscovererRegistry.d.ts +10 -1
  58. package/dist/lib/core/discovery/DiscovererRegistry.js +42 -2
  59. package/dist/lib/core/discovery/ProjectDiscoverer.d.ts +19 -0
  60. package/dist/lib/core/discovery/index.d.ts +2 -0
  61. package/dist/lib/core/discovery/index.js +4 -0
  62. package/dist/lib/core/discovery/parsers/CMakeParser.d.ts +32 -0
  63. package/dist/lib/core/discovery/parsers/CMakeParser.js +148 -0
  64. package/dist/lib/core/discovery/parsers/GradleDslParser.d.ts +43 -0
  65. package/dist/lib/core/discovery/parsers/GradleDslParser.js +171 -0
  66. package/dist/lib/core/discovery/parsers/JsonConfigParser.d.ts +45 -0
  67. package/dist/lib/core/discovery/parsers/JsonConfigParser.js +122 -0
  68. package/dist/lib/core/discovery/parsers/RubyDslParser.d.ts +49 -0
  69. package/dist/lib/core/discovery/parsers/RubyDslParser.js +282 -0
  70. package/dist/lib/core/discovery/parsers/StarlarkParser.d.ts +33 -0
  71. package/dist/lib/core/discovery/parsers/StarlarkParser.js +229 -0
  72. package/dist/lib/core/discovery/parsers/YamlConfigParser.d.ts +37 -0
  73. package/dist/lib/core/discovery/parsers/YamlConfigParser.js +212 -0
  74. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  75. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  76. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  77. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  78. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  79. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  80. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  81. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  82. package/dist/lib/domain/dimension/index.d.ts +10 -0
  83. package/dist/lib/domain/dimension/index.js +9 -0
  84. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  85. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  86. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +40 -112
  87. package/dist/lib/domain/knowledge/KnowledgeEntry.js +44 -9
  88. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  89. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  90. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  91. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  92. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  93. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  94. package/dist/lib/external/ai/AiProvider.d.ts +12 -0
  95. package/dist/lib/external/ai/AiProvider.js +24 -0
  96. package/dist/lib/external/ai/AiProviderManager.d.ts +101 -0
  97. package/dist/lib/external/ai/AiProviderManager.js +193 -0
  98. package/dist/lib/external/ai/providers/ClaudeProvider.js +11 -0
  99. package/dist/lib/external/ai/providers/GoogleGeminiProvider.js +18 -0
  100. package/dist/lib/external/ai/providers/MockProvider.d.ts +21 -3
  101. package/dist/lib/external/ai/providers/MockProvider.js +290 -14
  102. package/dist/lib/external/ai/providers/OpenAiProvider.js +16 -0
  103. package/dist/lib/external/lark/LarkTransport.d.ts +5 -1
  104. package/dist/lib/external/lark/LarkTransport.js +10 -2
  105. package/dist/lib/external/mcp/McpServer.js +4 -0
  106. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  107. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  108. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  109. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  110. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  111. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  112. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  113. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  114. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  115. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  116. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  117. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  118. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.d.ts +20 -0
  119. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.js +432 -0
  120. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  121. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +188 -169
  122. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  123. package/dist/lib/external/mcp/handlers/bootstrap/refine.js +8 -0
  124. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  125. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  126. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  127. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  128. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  129. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  130. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  131. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  132. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  133. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  134. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  135. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  136. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  137. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  138. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  139. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  140. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +23 -10
  141. package/dist/lib/external/mcp/handlers/bootstrap-external.js +41 -51
  142. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  143. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +117 -82
  144. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  145. package/dist/lib/external/mcp/handlers/consolidated.js +108 -332
  146. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +71 -2
  147. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  148. package/dist/lib/external/mcp/handlers/evolve-external.js +229 -0
  149. package/dist/lib/external/mcp/handlers/knowledge.js +30 -5
  150. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  151. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  152. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  153. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  154. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  155. package/dist/lib/external/mcp/handlers/search.js +6 -5
  156. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  157. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  158. package/dist/lib/external/mcp/tools.d.ts +8 -18
  159. package/dist/lib/external/mcp/tools.js +58 -2
  160. package/dist/lib/http/routes/ai.js +111 -30
  161. package/dist/lib/http/routes/candidates.js +11 -4
  162. package/dist/lib/http/routes/commands.js +10 -1
  163. package/dist/lib/http/routes/health.js +11 -0
  164. package/dist/lib/http/routes/knowledge.js +122 -1
  165. package/dist/lib/http/routes/modules.js +52 -3
  166. package/dist/lib/http/routes/panorama.js +16 -4
  167. package/dist/lib/http/routes/recipes.js +7 -0
  168. package/dist/lib/http/utils/routeHelpers.js +2 -1
  169. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  170. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  171. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  172. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  173. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  174. package/dist/lib/injection/ServiceContainer.d.ts +6 -5
  175. package/dist/lib/injection/ServiceContainer.js +64 -25
  176. package/dist/lib/injection/ServiceMap.d.ts +10 -1
  177. package/dist/lib/injection/modules/AiModule.d.ts +6 -9
  178. package/dist/lib/injection/modules/AiModule.js +82 -39
  179. package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
  180. package/dist/lib/injection/modules/PanoramaModule.js +1 -1
  181. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  182. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  183. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  184. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  185. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  186. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  187. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
  188. package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
  189. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  190. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  191. package/dist/lib/service/cleanup/CleanupService.d.ts +132 -0
  192. package/dist/lib/service/cleanup/CleanupService.js +571 -0
  193. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  194. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  195. package/dist/lib/service/delivery/FileProtection.js +54 -0
  196. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  197. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  198. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  199. package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
  200. package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
  201. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  202. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  203. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  204. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  205. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  206. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  207. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  208. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  209. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  210. package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +6 -0
  211. package/dist/lib/service/knowledge/CodeEntityGraph.js +16 -0
  212. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  213. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  214. package/dist/lib/service/knowledge/KnowledgeService.js +67 -14
  215. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  216. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  217. package/dist/lib/service/module/ModuleService.js +10 -19
  218. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +10 -1
  219. package/dist/lib/service/panorama/CouplingAnalyzer.js +44 -2
  220. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +4 -3
  221. package/dist/lib/service/panorama/DimensionAnalyzer.js +40 -151
  222. package/dist/lib/service/panorama/LayerInferrer.d.ts +16 -1
  223. package/dist/lib/service/panorama/LayerInferrer.js +118 -1
  224. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +9 -0
  225. package/dist/lib/service/panorama/ModuleDiscoverer.js +58 -2
  226. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +6 -2
  227. package/dist/lib/service/panorama/PanoramaAggregator.js +84 -6
  228. package/dist/lib/service/panorama/PanoramaScanner.js +28 -0
  229. package/dist/lib/service/panorama/PanoramaService.js +10 -5
  230. package/dist/lib/service/panorama/PanoramaTypes.d.ts +38 -0
  231. package/dist/lib/service/panorama/RoleRefiner.d.ts +2 -0
  232. package/dist/lib/service/panorama/RoleRefiner.js +41 -0
  233. package/dist/lib/service/panorama/TechStackProfiler.d.ts +13 -0
  234. package/dist/lib/service/panorama/TechStackProfiler.js +191 -0
  235. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  236. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  237. package/dist/lib/service/search/SearchEngine.js +38 -36
  238. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  239. package/dist/lib/service/search/SearchTypes.js +1 -1
  240. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  241. package/dist/lib/service/search/tokenizer.js +2 -2
  242. package/dist/lib/service/skills/SignalCollector.d.ts +1 -0
  243. package/dist/lib/service/skills/SignalCollector.js +6 -5
  244. package/dist/lib/service/vector/ContextualEnricher.d.ts +1 -0
  245. package/dist/lib/service/vector/ContextualEnricher.js +4 -0
  246. package/dist/lib/shared/LanguageService.js +3 -0
  247. package/dist/lib/shared/developer-identity.d.ts +18 -0
  248. package/dist/lib/shared/developer-identity.js +62 -0
  249. package/dist/lib/shared/schemas/common.d.ts +4 -4
  250. package/dist/lib/shared/schemas/http-requests.d.ts +20 -18
  251. package/dist/lib/shared/schemas/http-requests.js +17 -6
  252. package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
  253. package/dist/lib/shared/schemas/mcp-tools.js +38 -0
  254. package/dist/lib/types/evolution.d.ts +135 -0
  255. package/dist/lib/types/evolution.js +6 -0
  256. package/dist/lib/types/graph-shared.d.ts +25 -0
  257. package/dist/lib/types/graph-shared.js +7 -0
  258. package/dist/lib/types/knowledge-wire.d.ts +132 -0
  259. package/dist/lib/types/knowledge-wire.js +7 -0
  260. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  261. package/dist/lib/types/project-snapshot-builder.js +189 -0
  262. package/dist/lib/types/project-snapshot.d.ts +399 -0
  263. package/dist/lib/types/project-snapshot.js +17 -0
  264. package/dist/lib/types/search-wire.d.ts +46 -0
  265. package/dist/lib/types/search-wire.js +7 -0
  266. package/dist/lib/types/snapshot-views.d.ts +58 -0
  267. package/dist/lib/types/snapshot-views.js +103 -0
  268. package/package.json +1 -1
  269. package/skills/autosnippet-recipes/SKILL.md +1 -1
  270. package/templates/instructions/agent-static.md +2 -0
  271. package/templates/instructions/conventions.md +3 -1
  272. package/templates/recipes-setup/README.md +2 -2
  273. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  274. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  275. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  276. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  277. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  278. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  279. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -64,14 +64,6 @@ interface ScanKnowledgeOptions {
64
64
  lang?: string;
65
65
  comprehensive?: boolean;
66
66
  }
67
- /** Options for bootstrapKnowledge */
68
- interface BootstrapKnowledgeOptions {
69
- maxFiles?: number;
70
- skipGuard?: boolean;
71
- contentMaxLines?: number;
72
- loadSkills?: boolean;
73
- skipAsyncFill?: boolean;
74
- }
75
67
  export declare class AgentFactory {
76
68
  #private;
77
69
  /**
@@ -204,15 +196,6 @@ export declare class AgentFactory {
204
196
  * @returns >}
205
197
  */
206
198
  translateToEnglish(summary: string, usageGuide?: string): Promise<any>;
207
- /**
208
- * 冷启动知识库 — 直接调用 handler(纯启发式,不需要 LLM)
209
- *
210
- * bootstrap_knowledge 是纯启发式工具:SPM Target 扫描 → 依赖图谱 → Guard 审计 →
211
- * Candidate 创建,全程无 AI 推理。直接调用 handler 即可,无需创建 Agent。
212
- *
213
- * @param [opts]
214
- */
215
- bootstrapKnowledge(opts?: BootstrapKnowledgeOptions): Promise<any>;
216
199
  /**
217
200
  * 通用工具执行 — 直接调用工具 handler
218
201
  *
@@ -247,7 +247,7 @@ export class AgentFactory {
247
247
  maxIterations: 30, // 24 stage budget + 6 tracker grace
248
248
  maxTokens: 8192,
249
249
  temperature: 0.3,
250
- timeoutMs: 600_000,
250
+ timeoutMs: 3_600_000,
251
251
  }),
252
252
  ],
253
253
  memory: { enabled: false },
@@ -370,30 +370,6 @@ export class AgentFactory {
370
370
  usageGuideEn: usageGuide || '',
371
371
  });
372
372
  }
373
- /**
374
- * 冷启动知识库 — 直接调用 handler(纯启发式,不需要 LLM)
375
- *
376
- * bootstrap_knowledge 是纯启发式工具:SPM Target 扫描 → 依赖图谱 → Guard 审计 →
377
- * Candidate 创建,全程无 AI 推理。直接调用 handler 即可,无需创建 Agent。
378
- *
379
- * @param [opts]
380
- */
381
- async bootstrapKnowledge(opts = {}) {
382
- const { bootstrapKnowledge } = await import('#external/mcp/handlers/bootstrap-internal.js');
383
- const result = await bootstrapKnowledge({
384
- container: this
385
- .#container,
386
- logger: this.#logger,
387
- }, {
388
- maxFiles: opts.maxFiles || 500,
389
- skipGuard: opts.skipGuard || false,
390
- contentMaxLines: opts.contentMaxLines || 120,
391
- loadSkills: opts.loadSkills ?? true,
392
- skipAsyncFill: opts.skipAsyncFill || false,
393
- });
394
- const parsed = typeof result === 'string' ? JSON.parse(result) : result;
395
- return parsed?.data || parsed;
396
- }
397
373
  /**
398
374
  * 通用工具执行 — 直接调用工具 handler
399
375
  *
@@ -29,7 +29,7 @@
29
29
  */
30
30
  import { AgentEventBus } from './AgentEventBus.js';
31
31
  import type { AgentMessage } from './AgentMessage.js';
32
- import { type AgentResult, type FileCacheEntry, type ProgressEvent, type ReactLoopOpts, type RuntimeConfig, type ToolCallEntry, type ToolCallHook } from './AgentRuntimeTypes.js';
32
+ import { type AgentResult, type FileCacheEntry, type ReactLoopOpts, type RuntimeConfig, type ToolCallEntry, type ToolCallHook } from './AgentRuntimeTypes.js';
33
33
  import { AgentState } from './AgentState.js';
34
34
  import { Capability } from './capabilities.js';
35
35
  import { PolicyEngine } from './policies.js';
@@ -50,7 +50,7 @@ export declare class AgentRuntime {
50
50
  policies: PolicyEngine;
51
51
  persona: Record<string, unknown>;
52
52
  memoryConfig: Record<string, unknown>;
53
- onProgress: ((event: ProgressEvent) => void) | null;
53
+ onProgress: ((event: import("./AgentRuntimeTypes.js").ProgressEvent) => void) | null;
54
54
  lang: string | null;
55
55
  logger: import("winston").Logger;
56
56
  iterationCount: number;
@@ -739,25 +739,33 @@ export class AgentRuntime {
739
739
  const recipeCount = ctx.toolCalls.filter((tc) => (tc.tool || tc.name) === 'collect_scan_recipe').length;
740
740
  ctx.lastReply = `[scan complete: ${recipeCount} recipes collected]`;
741
741
  }
742
- // 强制摘要 (系统场景或 tracker 场景)
743
- if (!ctx.lastReply && (ctx.tracker || ctx.isSystem)) {
744
- const forcedResult = await produceForcedSummary({
745
- aiProvider: this.aiProvider,
746
- source: ctx.source,
747
- toolCalls: ctx.toolCalls,
748
- tracker: ctx.tracker ?? undefined,
749
- contextWindow: ctx.contextWindow,
750
- prompt: ctx.prompt,
751
- tokenUsage: this.tokenUsage,
752
- });
753
- ctx.lastReply = forcedResult.reply;
754
- if (forcedResult.tokenUsage) {
755
- this.tokenUsage.input += forcedResult.tokenUsage.input || 0;
756
- this.tokenUsage.output += forcedResult.tokenUsage.output || 0;
757
- ctx.addTokenUsage({
758
- inputTokens: forcedResult.tokenUsage.input || 0,
759
- outputTokens: forcedResult.tokenUsage.output || 0,
742
+ // 强制摘要 循环结束后无文本回复时,生成摘要
743
+ // 覆盖所有场景: 系统管线、tracker 管线、用户对话(有/无工具调用)
744
+ if (!ctx.lastReply) {
745
+ if (ctx.toolCalls.length > 0 || ctx.tracker || ctx.isSystem) {
746
+ const forcedResult = await produceForcedSummary({
747
+ aiProvider: this.aiProvider,
748
+ source: ctx.source,
749
+ toolCalls: ctx.toolCalls,
750
+ tracker: ctx.tracker ?? undefined,
751
+ contextWindow: ctx.contextWindow,
752
+ prompt: ctx.prompt,
753
+ tokenUsage: this.tokenUsage,
760
754
  });
755
+ ctx.lastReply = forcedResult.reply;
756
+ if (forcedResult.tokenUsage) {
757
+ this.tokenUsage.input += forcedResult.tokenUsage.input || 0;
758
+ this.tokenUsage.output += forcedResult.tokenUsage.output || 0;
759
+ ctx.addTokenUsage({
760
+ inputTokens: forcedResult.tokenUsage.input || 0,
761
+ outputTokens: forcedResult.tokenUsage.output || 0,
762
+ });
763
+ }
764
+ }
765
+ else {
766
+ // 兜底: 既无工具调用也无文本回复
767
+ ctx.lastReply = '抱歉,AI 未能生成有效回复。请重试或换个问题。';
768
+ this.logger.warn(`[AgentRuntime] ⚠ finalize: no reply, no tool calls (iter=${ctx.iteration}) — fallback message`);
761
769
  }
762
770
  }
763
771
  return ctx.buildResult();
@@ -142,6 +142,16 @@ export declare class ScanProduction extends Capability {
142
142
  get promptFragment(): string;
143
143
  get tools(): string[];
144
144
  }
145
+ /**
146
+ * Evolution Analysis — 现有 Recipe 进化决策能力
147
+ *
148
+ * 用于: evolution preset 的 evolve 阶段
149
+ */
150
+ export declare class EvolutionAnalysis extends Capability {
151
+ get name(): string;
152
+ get promptFragment(): string;
153
+ get tools(): string[];
154
+ }
145
155
  /**
146
156
  * 所有内置 Capability 的注册表
147
157
  *
@@ -163,6 +173,7 @@ declare const _default: {
163
173
  CodeAnalysis: typeof CodeAnalysis;
164
174
  KnowledgeProduction: typeof KnowledgeProduction;
165
175
  SystemInteraction: typeof SystemInteraction;
176
+ EvolutionAnalysis: typeof EvolutionAnalysis;
166
177
  CapabilityRegistry: {
167
178
  _registry: Map<string, typeof Capability>;
168
179
  /** 按名称创建 Capability 实例 */
@@ -214,7 +214,7 @@ export class KnowledgeProduction extends Capability {
214
214
  你是知识管理专家,将代码分析转化为结构化知识候选。
215
215
 
216
216
  每个候选必须有:
217
- 1. 清晰的标题 (使用项目真实类名/模块名)
217
+ 1. 清晰的标题 (使用项目真实类名/模块名,不以项目名开头)
218
218
  2. 项目特写风格的正文 (content.markdown)
219
219
  3. 相关文件路径
220
220
  4. 正确的 kind (rule / pattern / fact)
@@ -222,14 +222,13 @@ export class KnowledgeProduction extends Capability {
222
222
 
223
223
  工作流:
224
224
  1. 识别分析中的知识点
225
- 2. read_project_file 获取代码片段 (如需)
225
+ 2. read_project_file 批量获取代码片段 (如需)
226
226
  3. submit_knowledge 或 submit_with_check 提交
227
227
  4. 提交优先于完美 — 文件读取失败时用已有信息直接提交`;
228
228
  }
229
229
  get tools() {
230
- // 与旧版 PRODUCER_TOOLS 保持一致: 3 个核心工具
230
+ // PRODUCER_TOOLS 保持一致: 提交 + 文件读取
231
231
  // guard_check_code / validate_candidate 不需要:提交时 UnifiedValidator 已自动校验
232
- // 额外工具会分散 LLM 注意力,浪费 produce 轮次在验证而非提交上
233
232
  return [
234
233
  'submit_knowledge',
235
234
  'submit_with_check',
@@ -321,7 +320,7 @@ export class ScanProduction extends Capability {
321
320
  你是知识管理专家,将代码分析转化为结构化知识候选。
322
321
 
323
322
  每个候选必须有:
324
- 1. 清晰的标题 (使用项目真实类名/模块名)
323
+ 1. 清晰的标题 (使用项目真实类名/模块名,不以项目名开头)
325
324
  2. 项目特写风格的正文 (content.markdown ≥200字)
326
325
  3. 设计原理说明 (content.rationale)
327
326
  4. 相关文件路径 (reasoning.sources)
@@ -341,6 +340,29 @@ export class ScanProduction extends Capability {
341
340
  ];
342
341
  }
343
342
  }
343
+ // ─── Evolution Analysis ─────────────────────────
344
+ /**
345
+ * Evolution Analysis — 现有 Recipe 进化决策能力
346
+ *
347
+ * 用于: evolution preset 的 evolve 阶段
348
+ */
349
+ export class EvolutionAnalysis extends Capability {
350
+ get name() {
351
+ return 'evolution_analysis';
352
+ }
353
+ get promptFragment() {
354
+ return '你是知识进化专家,负责验证现有 Recipe 真实性并通过提案推动知识演化。';
355
+ }
356
+ get tools() {
357
+ return [
358
+ 'read_project_file',
359
+ 'search_project_code',
360
+ 'propose_evolution',
361
+ 'confirm_deprecation',
362
+ 'skip_evolution',
363
+ ];
364
+ }
365
+ }
344
366
  // ─── Capability 注册表 ─────────────────────────
345
367
  /**
346
368
  * 所有内置 Capability 的注册表
@@ -355,6 +377,7 @@ export const CapabilityRegistry = {
355
377
  ['knowledge_production', KnowledgeProduction],
356
378
  ['scan_production', ScanProduction],
357
379
  ['system_interaction', SystemInteraction],
380
+ ['evolution_analysis', EvolutionAnalysis],
358
381
  ]),
359
382
  /** 按名称创建 Capability 实例 */
360
383
  create(name, opts = {}) {
@@ -379,5 +402,6 @@ export default {
379
402
  CodeAnalysis,
380
403
  KnowledgeProduction,
381
404
  SystemInteraction,
405
+ EvolutionAnalysis,
382
406
  CapabilityRegistry,
383
407
  };
@@ -54,6 +54,7 @@ export class ExplorationTracker {
54
54
  iteration: 0,
55
55
  searchRoundsInPhase: 0,
56
56
  phaseRounds: 0,
57
+ consecutiveIdleRounds: 0,
57
58
  };
58
59
  // ── 阶段控制 ──
59
60
  /** 是否刚完成阶段转换(用于 pending nudge) */
@@ -273,6 +274,13 @@ export class ExplorationTracker {
273
274
  if (hasSearchTool) {
274
275
  this.#metrics.searchRoundsInPhase++;
275
276
  }
277
+ // 2.5 连续空闲轮次追踪(无任何工具调用 = 真正空转,有工具调用 = 活跃工作)
278
+ if (toolNames.length === 0) {
279
+ this.#metrics.consecutiveIdleRounds++;
280
+ }
281
+ else {
282
+ this.#metrics.consecutiveIdleRounds = 0;
283
+ }
276
284
  // 3. 检查 metrics 驱动的阶段转换
277
285
  this.#checkMetricsTransition();
278
286
  // 4. 如果发生了转换,生成 nudge
@@ -446,8 +454,9 @@ export class ExplorationTracker {
446
454
  // (SCAN 阶段的 roundsSinceNewInfo 不应影响 EXPLORE→VERIFY 的判定)
447
455
  this.#metrics.roundsSinceNewInfo = 0;
448
456
  this.#metrics.roundsSinceSubmit = 0;
457
+ this.#metrics.consecutiveIdleRounds = 0;
449
458
  this.#justTransitioned = true;
450
- this.#logger.info(`[ExplorationTracker] ${oldPhase} → ${newPhase} (iter=${this.#metrics.iteration}, submits=${this.#metrics.submitCount})`);
459
+ this.#logger.info(`[ExplorationTracker] ${oldPhase} → ${newPhase} (iter=${this.#metrics.iteration}, submits=${this.#metrics.submitCount}, phaseRounds=${this.#metrics.phaseRounds}, idleRounds=${this.#metrics.consecutiveIdleRounds})`);
451
460
  // Phase 3: 发射阶段转换信号
452
461
  if (this.#signalBus) {
453
462
  const terminalPhase = this.#getTerminalPhase();
@@ -30,6 +30,8 @@ export interface ExplorationMetrics {
30
30
  phaseRounds: number;
31
31
  roundsSinceSubmit: number;
32
32
  roundsSinceNewInfo: number;
33
+ /** 连续无任何工具调用的轮次数(用于 grace exit 判定) */
34
+ consecutiveIdleRounds: number;
33
35
  }
34
36
  /** 探索预算配置 */
35
37
  export interface ExplorationBudget {
@@ -37,7 +37,7 @@ export function createBootstrapStrategy(isSkillOnly = false) {
37
37
  'PRODUCE→SUMMARIZE': {
38
38
  onMetrics: (m, b) => m.submitCount >= b.maxSubmits ||
39
39
  (m.submitCount > 0 && m.roundsSinceSubmit >= b.idleRoundsToExit) ||
40
- (m.phaseRounds >= b.searchBudgetGrace && m.submitCount === 0),
40
+ (m.consecutiveIdleRounds >= b.searchBudgetGrace && m.submitCount === 0),
41
41
  onTextResponse: (m, b) => m.submitCount >= b.softSubmitLimit,
42
42
  },
43
43
  }),
@@ -106,7 +106,7 @@ export const STRATEGY_PRODUCER = {
106
106
  'PRODUCE→SUMMARIZE': {
107
107
  onMetrics: (m, b) => m.submitCount >= b.maxSubmits ||
108
108
  (m.submitCount > 0 && m.roundsSinceSubmit >= b.idleRoundsToExit) ||
109
- (m.phaseRounds >= b.searchBudgetGrace && m.submitCount === 0),
109
+ (m.consecutiveIdleRounds >= b.searchBudgetGrace && m.submitCount === 0),
110
110
  onTextResponse: (m, b) => m.submitCount >= b.softSubmitLimit,
111
111
  },
112
112
  },
@@ -61,6 +61,10 @@ ${highSim.map((s) => `- ${s.title} (相似度: ${s.similarity})`).join('\n')}
61
61
  export async function taskDiscoverAllRelations(context, { batchSize = 20 } = {}) {
62
62
  const { container } = context;
63
63
  const agentFactory = container.get('agentFactory');
64
+ // Mock 模式下跳过 AI 关系发现
65
+ if (agentFactory.getAiProviderInfo?.()?.name === 'mock') {
66
+ return { discovered: 0, message: 'AI Provider 未配置(Mock 模式),跳过关系发现。' };
67
+ }
64
68
  return agentFactory.discoverRelations({ batchSize });
65
69
  }
66
70
  /** 任务: 批量 AI 补全候选语义字段 */
@@ -59,7 +59,7 @@ interface CodeEntityGraphLike {
59
59
  maxEdges: number;
60
60
  }): string | null;
61
61
  }
62
- 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\u8DEF\u5F84\u548C\u4EE3\u7801\u4F4D\u7F6E\u3002\n\u7528\u81EA\u7136\u8BED\u8A00\u63CF\u8FF0\u4F60\u7684\u7406\u89E3\uFF0C\u4E0D\u9700\u8981\u7279\u5B9A\u683C\u5F0F\u3002";
62
+ 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";
63
63
  export declare const ANALYST_TOOLS: string[];
64
64
  export declare const ANALYST_BUDGET: {
65
65
  maxIterations: number;
@@ -69,10 +69,42 @@ export declare const ANALYST_BUDGET: {
69
69
  softSubmitLimit: number;
70
70
  idleRoundsToExit: number;
71
71
  };
72
+ /** Panorama context — module role, layer, coupling, gaps */
73
+ interface PanoramaContextLike {
74
+ moduleRole: string | null;
75
+ moduleLayer: number | null;
76
+ moduleCoupling: {
77
+ fanIn: number;
78
+ fanOut: number;
79
+ } | null;
80
+ knownGaps: string[];
81
+ layerContext: string | null;
82
+ }
83
+ /** Evidence starters — per-dimension evidence hints from Phase 1-4 */
84
+ interface EvidenceStarterEntry {
85
+ hint: string;
86
+ data: unknown;
87
+ strength?: number;
88
+ }
89
+ /** Rescan context — existing recipes in this dimension */
90
+ interface RescanContextLike {
91
+ existingRecipes: Array<{
92
+ title: string;
93
+ trigger: string;
94
+ }>;
95
+ decayingRecipes?: Array<{
96
+ title: string;
97
+ trigger: string;
98
+ id?: string;
99
+ decayReason?: string;
100
+ }>;
101
+ gap: number;
102
+ existing: number;
103
+ }
72
104
  /**
73
105
  * 构建 Analyst Prompt
74
106
  *
75
- * 9 段结构:
107
+ * 12 段结构:
76
108
  * §1 任务描述
77
109
  * §2 维度指引
78
110
  * §3 SOP (分析步骤 + 常见错误)
@@ -82,6 +114,9 @@ export declare const ANALYST_BUDGET: {
82
114
  * §7 Tier Reflection 洞察
83
115
  * §8 历史语义记忆 (Tier 3)
84
116
  * §9 代码实体图谱 (Phase E)
117
+ * §ES 分析起点证据 (Phase 1-4 Evidence Starters)
118
+ * §M1 全景上下文 (Panorama Phase 1.8)
119
+ * §10 Rescan 已有知识上下文
85
120
  *
86
121
  * @param dimConfig 维度配置 { id, label, guide, focusKeywords, outputType }
87
122
  * @param projectInfo { name, lang, fileCount }
@@ -89,6 +124,15 @@ export declare const ANALYST_BUDGET: {
89
124
  * @param [episodicMemory] SessionStore 实例 (v4.0 增强上下文)
90
125
  * @param [semanticMemory] PersistentMemory 实例 (v4.1 历史记忆)
91
126
  * @param [codeEntityGraph] CodeEntityGraph 实例 (Phase E 代码实体图谱)
127
+ * @param [rescanContext] Rescan 已有知识上下文 (增量扫描时注入)
128
+ * @param [panorama] 全景上下文 — 模块角色/层级/耦合/空白区 (Phase 1.8)
129
+ * @param [evidenceStarters] Phase 1-4 证据启发 — 维度级分析起点
130
+ * @param [evolutionResult] Evolution Stage 产出 — 避免重复分析已处理的 Recipe
92
131
  */
93
- export declare function buildAnalystPrompt(dimConfig: AnalystDimConfig, projectInfo: AnalystProjectInfo, dimensionContext: DimensionContextLike | null | undefined, episodicMemory: EpisodicMemoryLike | null | undefined, semanticMemory: SemanticMemoryLike | null | undefined, codeEntityGraph: CodeEntityGraphLike | null | undefined): Promise<string>;
132
+ 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?: {
133
+ evolved?: number;
134
+ deprecated?: number;
135
+ skipped?: number;
136
+ totalRecipes?: number;
137
+ } | null): Promise<string>;
94
138
  export {};
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * @module insight-analyst
14
14
  */
15
- import { getDimensionSOP } from '#external/mcp/handlers/bootstrap/shared/dimension-sop.js';
15
+ import { getDimensionSOP } from '#domain/dimension/DimensionSop.js';
16
16
  // ──────────────────────────────────────────────────────────────────
17
17
  // System Prompt — Analyst 专用 (~100 tokens)
18
18
  // ──────────────────────────────────────────────────────────────────
@@ -39,7 +39,10 @@ export const ANALYST_SYSTEM_PROMPT = `你是一位高级软件架构师,正在
39
39
  - **结构化查询优先**: get_class_hierarchy / get_class_info 比文本搜索更精确高效
40
40
 
41
41
  ## 输出要求
42
- 输出你的分析发现,包括具体的文件路径和代码位置。
42
+ 输出你的分析发现,包括具体的文件完整相对路径(从项目根目录开始)和行号。
43
+ 每个文件引用格式: (来源: Full/Relative/Path/FileName.ext:行号)
44
+ 禁止只写文件名,必须写从项目根开始的完整路径。
45
+ 标注每个发现所属的模块/包名。
43
46
  用自然语言描述你的理解,不需要特定格式。`;
44
47
  // ──────────────────────────────────────────────────────────────────
45
48
  // Analyst 可用工具白名单 — 只做探索,不做提交
@@ -77,13 +80,10 @@ export const ANALYST_BUDGET = {
77
80
  softSubmitLimit: 0,
78
81
  idleRoundsToExit: 2,
79
82
  };
80
- // ──────────────────────────────────────────────────────────────────
81
- // 维度 Prompt 模板 (9 段式)
82
- // ──────────────────────────────────────────────────────────────────
83
83
  /**
84
84
  * 构建 Analyst Prompt
85
85
  *
86
- * 9 段结构:
86
+ * 12 段结构:
87
87
  * §1 任务描述
88
88
  * §2 维度指引
89
89
  * §3 SOP (分析步骤 + 常见错误)
@@ -93,6 +93,9 @@ export const ANALYST_BUDGET = {
93
93
  * §7 Tier Reflection 洞察
94
94
  * §8 历史语义记忆 (Tier 3)
95
95
  * §9 代码实体图谱 (Phase E)
96
+ * §ES 分析起点证据 (Phase 1-4 Evidence Starters)
97
+ * §M1 全景上下文 (Panorama Phase 1.8)
98
+ * §10 Rescan 已有知识上下文
96
99
  *
97
100
  * @param dimConfig 维度配置 { id, label, guide, focusKeywords, outputType }
98
101
  * @param projectInfo { name, lang, fileCount }
@@ -100,8 +103,12 @@ export const ANALYST_BUDGET = {
100
103
  * @param [episodicMemory] SessionStore 实例 (v4.0 增强上下文)
101
104
  * @param [semanticMemory] PersistentMemory 实例 (v4.1 历史记忆)
102
105
  * @param [codeEntityGraph] CodeEntityGraph 实例 (Phase E 代码实体图谱)
106
+ * @param [rescanContext] Rescan 已有知识上下文 (增量扫描时注入)
107
+ * @param [panorama] 全景上下文 — 模块角色/层级/耦合/空白区 (Phase 1.8)
108
+ * @param [evidenceStarters] Phase 1-4 证据启发 — 维度级分析起点
109
+ * @param [evolutionResult] Evolution Stage 产出 — 避免重复分析已处理的 Recipe
103
110
  */
104
- export async function buildAnalystPrompt(dimConfig, projectInfo, dimensionContext, episodicMemory, semanticMemory, codeEntityGraph) {
111
+ export async function buildAnalystPrompt(dimConfig, projectInfo, dimensionContext, episodicMemory, semanticMemory, codeEntityGraph, rescanContext, panorama, evidenceStarters, evolutionResult) {
105
112
  const parts = [];
106
113
  // §1 任务描述
107
114
  parts.push(`分析项目 ${projectInfo.name} (${projectInfo.lang}, ${projectInfo.fileCount} 个文件) 的 ${dimConfig.label}。`);
@@ -144,17 +151,21 @@ export async function buildAnalystPrompt(dimConfig, projectInfo, dimensionContex
144
151
  const outputType = dimConfig.outputType || 'analysis';
145
152
  const needsCandidates = outputType === 'dual' || outputType === 'candidate';
146
153
  const depthHint = needsCandidates
147
- ? '你的分析将被转化为知识候选,请确保每个发现都有足够的代码证据和文件引用。目标: 发现 3-5 个独立的知识点。'
154
+ ? '你的分析将被转化为知识候选,请确保每个发现都有足够的代码证据和文件引用。按实际发现总结,有几个独立知识点就写几个。'
148
155
  : '';
149
156
  parts.push(`请将分析组织成结构化段落,包含:
150
- 1. 在哪些文件/类中发现 (写出具体文件路径)
157
+ 1. 在哪些文件/类中发现 (写出从项目根目录开始的完整相对路径+行号,如 Packages/ModuleName/Sources/.../FileName.swift:42)
151
158
  2. 具体的实现方式和代码特征
152
159
  3. 为什么选择这种方式(设计意图)
153
160
  4. 统计数据 (如数量、占比)
161
+ 5. 所属模块/包名(特别是来自本地子包的发现)
154
162
 
155
- 每个关键发现用编号列表呈现,引用 3 个以上具体文件。
163
+ 每个关键发现用编号列表呈现,引用 3 个以上具体文件(完整相对路径)。
164
+ 禁止只写文件名(如 NetworkClient.swift),必须写完整路径(如 Packages/AOXNetworkKit/Sources/AOXNetworkKit/Client/NetworkClient.swift:42)。
156
165
  ${depthHint}
157
- 重要: 务必使用 read_project_file 阅读代码确认,不要假设文件存在。引用的每个文件路径都必须是你亲眼看到的。`);
166
+ 重要: 务必使用 read_project_file 阅读代码确认,不要假设文件存在。引用的每个文件路径都必须是你亲眼看到的。
167
+ 【跨维度去重】只分析属于当前维度视角的内容。不要将其他维度的知识点混入本维度来充数。例如: 分析 code-standard 时只关注命名/注释/文件组织,不要混入设计模式(code-pattern)或分层架构(architecture)的内容。如果某个发现与多个维度相关,则只从当前维度的核心视角分析,避免与其他维度产生重叠。
168
+ 【本地子包覆盖】如果项目有本地子包/模块(如 Packages/ 目录下的包),必须同时分析其内部实现,不得仅看主项目对其的调用。`);
158
169
  // §5 前序上下文提示
159
170
  parts.push('可以调用 get_previous_analysis 获取前序维度的分析结果,避免重复分析。');
160
171
  parts.push('使用 note_finding 工具记录关键发现到工作记忆,确保重要信息不会在后期被遗忘。');
@@ -218,5 +229,94 @@ ${depthHint}
218
229
  /* CodeEntityGraph context failed, non-critical */
219
230
  }
220
231
  }
232
+ // §ES: 分析起点证据 (Phase 1-4 Evidence Starters)
233
+ if (evidenceStarters && Object.keys(evidenceStarters).length > 0) {
234
+ const esLines = ['## 📊 分析起点 (Phase 1-4 自动检测)'];
235
+ esLines.push('以下是自动化分析阶段检测到的与本维度相关的信号,可作为分析起点:');
236
+ // 按 strength 降序排列,取前 6 个最强信号
237
+ const sorted = Object.entries(evidenceStarters)
238
+ .sort(([, a], [, b]) => (b.strength ?? 50) - (a.strength ?? 50))
239
+ .slice(0, 6);
240
+ for (const [key, entry] of sorted) {
241
+ const strengthBadge = (entry.strength ?? 50) >= 75 ? '⚠️' : '📝';
242
+ esLines.push(`${strengthBadge} **${key}**: ${entry.hint}`);
243
+ if (entry.data) {
244
+ const dataStr = Array.isArray(entry.data)
245
+ ? entry.data
246
+ .slice(0, 5)
247
+ .map((d) => ` - ${typeof d === 'string' ? d : JSON.stringify(d)}`)
248
+ .join('\n')
249
+ : typeof entry.data === 'string'
250
+ ? ` ${entry.data}`
251
+ : ` ${JSON.stringify(entry.data, null, 0).slice(0, 300)}`;
252
+ esLines.push(dataStr);
253
+ }
254
+ }
255
+ esLines.push('');
256
+ esLines.push('利用上述信号作为分析切入点,用 read_project_file 验证并深入探索。');
257
+ parts.push(esLines.join('\n'));
258
+ }
259
+ // §M1: 全景上下文 (Panorama Phase 1.8) — 模块角色/层级/耦合/空白区
260
+ if (panorama) {
261
+ const pLines = ['## 🏗️ 项目全景 (Panorama)'];
262
+ if (panorama.layerContext) {
263
+ pLines.push(`架构层级: ${panorama.layerContext}`);
264
+ }
265
+ if (panorama.moduleRole) {
266
+ pLines.push(`当前模块角色: ${panorama.moduleRole}${panorama.moduleLayer !== null ? ` (L${panorama.moduleLayer})` : ''}`);
267
+ }
268
+ if (panorama.moduleCoupling) {
269
+ pLines.push(`耦合度: fanIn=${panorama.moduleCoupling.fanIn}, fanOut=${panorama.moduleCoupling.fanOut}`);
270
+ }
271
+ if (panorama.knownGaps.length > 0) {
272
+ pLines.push(`已知空白区: ${panorama.knownGaps.join(', ')}`);
273
+ pLines.push('分析时请特别关注上述空白区,它们是最可能产出新知识的方向。');
274
+ }
275
+ parts.push(pLines.join('\n'));
276
+ }
277
+ // §EVO: Evolution 结果 — 避免重复覆盖已被 Evolution Agent 处理的模式
278
+ if (evolutionResult && evolutionResult.totalRecipes && evolutionResult.totalRecipes > 0) {
279
+ const evoLines = [
280
+ '## 🔄 Evolution 结果',
281
+ `Evolution Agent 已审查本维度 ${evolutionResult.totalRecipes} 个现有 Recipe:`,
282
+ `- 进化: ${evolutionResult.evolved ?? 0} 个(已提交新版本替代旧 Recipe)`,
283
+ `- 废弃: ${evolutionResult.deprecated ?? 0} 个(已确认过时)`,
284
+ `- 跳过: ${evolutionResult.skipped ?? 0} 个(仍然有效或信息不足)`,
285
+ '',
286
+ '**你的分析应关注发现新知识点**,不要重复覆盖已处理的模式。',
287
+ ];
288
+ parts.push(evoLines.join('\n'));
289
+ }
290
+ // §10a: Rescan 有效知识上下文 — 避免重复分析已覆盖的模式
291
+ if (rescanContext && rescanContext.existingRecipes.length > 0) {
292
+ const lines = [
293
+ '## ⚠️ 增量扫描模式 — 已有知识 (勿重复)',
294
+ `本维度已有 ${rescanContext.existing} 个有效 Recipe,需补齐 ${rescanContext.gap} 个。`,
295
+ '已有 Recipe 标题:',
296
+ ];
297
+ for (const r of rescanContext.existingRecipes.slice(0, 10)) {
298
+ const triggerTag = r.trigger ? ` (trigger: ${r.trigger})` : '';
299
+ lines.push(`- "${r.title}"${triggerTag}`);
300
+ }
301
+ if (rescanContext.existingRecipes.length > 10) {
302
+ lines.push(`- ... 共 ${rescanContext.existingRecipes.length} 个`);
303
+ }
304
+ lines.push('');
305
+ lines.push('**你的任务**: 专注发现上述 Recipe **尚未覆盖**的新模式。不要重复分析相同的代码特征。');
306
+ parts.push(lines.join('\n'));
307
+ }
308
+ // §10b: Rescan 衰退知识 — 可以替换
309
+ if (rescanContext?.decayingRecipes && rescanContext.decayingRecipes.length > 0) {
310
+ const dLines = [
311
+ '## 🔄 衰退中的知识 (可替换)',
312
+ '以下 Recipe 正在衰退,其描述的模式可能已过时或迁移:',
313
+ ];
314
+ for (const r of rescanContext.decayingRecipes.slice(0, 5)) {
315
+ dLines.push(`- "${r.title}" — 衰退原因: ${r.decayReason || '未知'}`);
316
+ }
317
+ dLines.push('如果你在分析中发现了这些模式的**更新版本**(例如类改名、迁移到新模块),');
318
+ dLines.push('请记录下来,后续 Producer 可以用 supersedes 参数提交替代版本。');
319
+ parts.push(dLines.join('\n'));
320
+ }
221
321
  return parts.join('\n\n');
222
322
  }