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
@@ -0,0 +1,229 @@
1
+ /**
2
+ * MCP Handler — autosnippet_evolve (批量 Recipe 进化决策)
3
+ *
4
+ * 双入口工具:
5
+ * - Rescan 模式: 每个维度内先 evolve 再 gap-fill,与内部 Agent Pipeline 一致
6
+ * - 独立模式: 用户通过提示词触发,验证已有 Recipe 的有效性
7
+ *
8
+ * 三种决策委托给 evolution-tools.ts 中已有的 handler 实现:
9
+ * - propose_evolution → ProposalRepository.create (观察窗口)
10
+ * - confirm_deprecation → RecipeLifecycleSupervisor.transition → deprecated (优先) / KnowledgeService.deprecate (回退)
11
+ * - skip → 不变更状态,skip(still_valid) 刷新 stats.lastVerifiedAt
12
+ *
13
+ * @module handlers/evolve-external
14
+ */
15
+ import { getDeveloperIdentity } from '#shared/developer-identity.js';
16
+ import { envelope } from '../envelope.js';
17
+ // ── 主入口 ─────────────────────────────────────────────────
18
+ export async function evolveExternal(ctx, args) {
19
+ const t0 = Date.now();
20
+ const { decisions } = args;
21
+ if (!decisions || decisions.length === 0) {
22
+ return envelope({
23
+ success: true,
24
+ data: {
25
+ processed: 0,
26
+ proposed: 0,
27
+ deprecated: 0,
28
+ skipped: 0,
29
+ refreshed: 0,
30
+ quotaChange: { freed: 0, occupied: 0 },
31
+ errors: [],
32
+ },
33
+ message: '⚠️ 没有提交任何 evolve 决策',
34
+ meta: { tool: 'autosnippet_evolve', responseTimeMs: Date.now() - t0 },
35
+ });
36
+ }
37
+ const result = {
38
+ processed: 0,
39
+ proposed: 0,
40
+ deprecated: 0,
41
+ skipped: 0,
42
+ refreshed: 0,
43
+ quotaChange: { freed: 0, occupied: 0 },
44
+ errors: [],
45
+ };
46
+ const proposalRepo = ctx.container.get('proposalRepository');
47
+ const knowledgeService = ctx.container.get('knowledgeService');
48
+ const supervisor = ctx.container.get('lifecycleSupervisor');
49
+ const dbConn = ctx.container.get('database');
50
+ const rawDb = dbConn?.db ?? null;
51
+ for (const decision of decisions) {
52
+ try {
53
+ // O4: Recipe 存在性前置检查
54
+ if (rawDb) {
55
+ const exists = rawDb
56
+ .prepare('SELECT 1 FROM knowledge_entries WHERE id = ?')
57
+ .get(decision.recipeId);
58
+ if (!exists) {
59
+ result.errors.push({ recipeId: decision.recipeId, error: 'Recipe not found' });
60
+ result.processed++;
61
+ continue;
62
+ }
63
+ }
64
+ switch (decision.action) {
65
+ case 'propose_evolution': {
66
+ if (!proposalRepo) {
67
+ result.errors.push({
68
+ recipeId: decision.recipeId,
69
+ error: 'ProposalRepository not available',
70
+ });
71
+ break;
72
+ }
73
+ if (!decision.evidence) {
74
+ result.errors.push({
75
+ recipeId: decision.recipeId,
76
+ error: 'evidence is required for propose_evolution',
77
+ });
78
+ break;
79
+ }
80
+ const proposal = proposalRepo.create({
81
+ type: decision.evidence.type,
82
+ targetRecipeId: decision.recipeId,
83
+ relatedRecipeIds: [],
84
+ confidence: 0.8,
85
+ source: 'ide-agent',
86
+ description: decision.evidence.suggestedChanges,
87
+ evidence: [
88
+ {
89
+ sourceStatus: 'modified',
90
+ currentCode: decision.evidence.codeSnippet,
91
+ filePath: decision.evidence.filePath,
92
+ suggestedChanges: decision.evidence.suggestedChanges,
93
+ verifiedBy: 'ide-agent',
94
+ verifiedAt: Date.now(),
95
+ },
96
+ ],
97
+ });
98
+ if (proposal) {
99
+ result.proposed++;
100
+ ctx.logger.info(`[Evolve] propose_evolution: ${decision.recipeId} → proposal ${proposal.id}`);
101
+ }
102
+ else {
103
+ result.errors.push({
104
+ recipeId: decision.recipeId,
105
+ error: 'Failed to create proposal (target recipe may not exist or duplicate proposal)',
106
+ });
107
+ }
108
+ break;
109
+ }
110
+ case 'confirm_deprecation': {
111
+ // O1: 优先通过 RecipeLifecycleSupervisor 执行,回退到 KnowledgeService
112
+ const reason = decision.reason || 'IDE Agent confirmed deprecation';
113
+ if (supervisor) {
114
+ const transResult = supervisor.transition({
115
+ recipeId: decision.recipeId,
116
+ targetState: 'deprecated',
117
+ trigger: 'manual-deprecation',
118
+ evidence: { reason },
119
+ operatorId: 'ide-agent',
120
+ });
121
+ if (!transResult.success) {
122
+ // Supervisor 拒绝(可能状态不允许直接转 deprecated),回退到 KnowledgeService
123
+ if (knowledgeService) {
124
+ await knowledgeService.deprecate(decision.recipeId, reason, {
125
+ userId: getDeveloperIdentity(),
126
+ });
127
+ }
128
+ else {
129
+ result.errors.push({
130
+ recipeId: decision.recipeId,
131
+ error: `Supervisor rejected: ${transResult.error}`,
132
+ });
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ else if (knowledgeService) {
138
+ // P3: 添加 await
139
+ await knowledgeService.deprecate(decision.recipeId, reason, {
140
+ userId: getDeveloperIdentity(),
141
+ });
142
+ }
143
+ else {
144
+ result.errors.push({
145
+ recipeId: decision.recipeId,
146
+ error: 'Neither Supervisor nor KnowledgeService available',
147
+ });
148
+ break;
149
+ }
150
+ // 解决关联的 deprecate proposal
151
+ if (proposalRepo) {
152
+ try {
153
+ const existing = proposalRepo.findByTarget(decision.recipeId);
154
+ for (const p of existing) {
155
+ if (p.type === 'deprecate') {
156
+ proposalRepo.markExecuted(p.id, `IDE Agent confirmed deprecation: ${reason}`, 'ide-agent');
157
+ }
158
+ }
159
+ }
160
+ catch {
161
+ // ProposalRepository 操作失败时静默
162
+ }
163
+ }
164
+ result.deprecated++;
165
+ result.quotaChange.freed++;
166
+ ctx.logger.info(`[Evolve] confirm_deprecation: ${decision.recipeId}`);
167
+ break;
168
+ }
169
+ case 'skip': {
170
+ if (decision.skipReason === 'still_valid' && rawDb) {
171
+ // P4: 更新 stats.lastVerifiedAt 而非 updated_at
172
+ try {
173
+ const row = rawDb
174
+ .prepare('SELECT stats FROM knowledge_entries WHERE id = ?')
175
+ .get(decision.recipeId);
176
+ const stats = JSON.parse(row?.stats || '{}');
177
+ stats.lastVerifiedAt = Date.now();
178
+ rawDb
179
+ .prepare('UPDATE knowledge_entries SET stats = ? WHERE id = ?')
180
+ .run(JSON.stringify(stats), decision.recipeId);
181
+ result.refreshed++;
182
+ }
183
+ catch {
184
+ // DB 更新失败时静默
185
+ }
186
+ }
187
+ result.skipped++;
188
+ ctx.logger.info(`[Evolve] skip: ${decision.recipeId} (${decision.skipReason || 'no reason'})`);
189
+ break;
190
+ }
191
+ default: {
192
+ result.errors.push({
193
+ recipeId: decision.recipeId,
194
+ error: `Unknown action: ${decision.action}`,
195
+ });
196
+ }
197
+ }
198
+ result.processed++;
199
+ }
200
+ catch (err) {
201
+ result.errors.push({
202
+ recipeId: decision.recipeId,
203
+ error: err instanceof Error ? err.message : String(err),
204
+ });
205
+ result.processed++;
206
+ }
207
+ }
208
+ const parts = [];
209
+ if (result.proposed > 0) {
210
+ parts.push(`${result.proposed} 个进化提案`);
211
+ }
212
+ if (result.deprecated > 0) {
213
+ parts.push(`${result.deprecated} 个废弃`);
214
+ }
215
+ if (result.refreshed > 0) {
216
+ parts.push(`${result.refreshed} 个仍然有效`);
217
+ }
218
+ if (result.skipped - result.refreshed > 0) {
219
+ parts.push(`${result.skipped - result.refreshed} 个跳过`);
220
+ }
221
+ const summary = parts.length > 0 ? parts.join(', ') : '无变更';
222
+ return envelope({
223
+ success: true,
224
+ data: result,
225
+ message: `✅ 处理了 ${result.processed} 个 Recipe: ${summary}` +
226
+ (result.errors.length > 0 ? ` (${result.errors.length} 个错误)` : ''),
227
+ meta: { tool: 'autosnippet_evolve', responseTimeMs: Date.now() - t0 },
228
+ });
229
+ }
@@ -3,6 +3,7 @@
3
3
  * submitKnowledge, submitKnowledgeBatch, knowledgeLifecycle
4
4
  */
5
5
  import { UnifiedValidator } from '#domain/knowledge/UnifiedValidator.js';
6
+ import { getDeveloperIdentity } from '#shared/developer-identity.js';
6
7
  import { resolveProjectRoot } from '#shared/resolveProjectRoot.js';
7
8
  import { envelope } from '../envelope.js';
8
9
  // ─── 限流 ──────────────────────────────────────────────────
@@ -69,7 +70,14 @@ export async function submitKnowledge(ctx, args) {
69
70
  const service = ctx.container.get('knowledgeService');
70
71
  // V3 字段增强
71
72
  const enrichedData = _enrichToV3(args, ctx.container);
72
- const entry = await service.create(enrichedData, { userId: 'mcp' });
73
+ const entry = await service.create(enrichedData, { userId: getDeveloperIdentity() });
74
+ // ── QualityScorer 自动评分(R9: create 后置执行)──
75
+ try {
76
+ await service.updateQuality(entry.id, { userId: 'mcp' });
77
+ }
78
+ catch {
79
+ /* best effort — 不阻塞创建流程 */
80
+ }
73
81
  const data = {
74
82
  id: entry.id,
75
83
  lifecycle: entry.lifecycle,
@@ -134,8 +142,6 @@ export async function submitKnowledgeBatch(ctx, args) {
134
142
  const itemErrors = [];
135
143
  const rejectedItems = [];
136
144
  const successIds = []; // 成功入库的 recipe ID 列表,供 dimension_complete 使用
137
- // UnifiedValidator — 统一前置校验
138
- const validator = new UnifiedValidator();
139
145
  let session = null;
140
146
  let currentDimId = null;
141
147
  try {
@@ -151,6 +157,18 @@ export async function submitKnowledgeBatch(ctx, args) {
151
157
  catch {
152
158
  /* best effort */
153
159
  }
160
+ // UnifiedValidator — 统一前置校验
161
+ // v3: 注入前序维度已提交的标题,实现跨维度硬去重
162
+ let existingTitles;
163
+ try {
164
+ if (session?.submissionTracker?.getAllSubmittedTitles) {
165
+ existingTitles = session.submissionTracker.getAllSubmittedTitles();
166
+ }
167
+ }
168
+ catch {
169
+ /* best effort */
170
+ }
171
+ const validator = new UnifiedValidator(existingTitles ? { existingTitles } : {});
154
172
  for (let i = 0; i < items.length; i++) {
155
173
  // ── 严格前置校验:缺少必要字段的条目直接拒绝,不入库 ──
156
174
  const validation = validator.validate(items[i], { skipUniqueness: false });
@@ -176,7 +194,14 @@ export async function submitKnowledgeBatch(ctx, args) {
176
194
  }
177
195
  try {
178
196
  const itemData = _enrichToV3({ ...items[i], source }, ctx.container);
179
- const entry = await service.create(itemData, { userId: 'mcp' });
197
+ const entry = await service.create(itemData, { userId: getDeveloperIdentity() });
198
+ // ── QualityScorer 自动评分(R9: create 后置执行)──
199
+ try {
200
+ await service.updateQuality(entry.id, { userId: getDeveloperIdentity() });
201
+ }
202
+ catch {
203
+ /* best effort — 不阻塞批量提交 */
204
+ }
180
205
  count++;
181
206
  successIds.push(entry.id);
182
207
  // 记录标题/指纹供后续去重检测
@@ -245,7 +270,7 @@ export async function knowledgeLifecycle(ctx, args) {
245
270
  throw new Error(`[PERMISSION_DENIED] 外部 Agent 不允许执行 "${action}" 操作,仅支持: reactivate。发布、废弃等操作请在 Dashboard 中完成。提交新知识请使用 autosnippet_submit_knowledge 工具。`);
246
271
  }
247
272
  const service = ctx.container.get('knowledgeService');
248
- const context = { userId: 'mcp' };
273
+ const context = { userId: getDeveloperIdentity() };
249
274
  const entry = await service.reactivate(id, context);
250
275
  return envelope({
251
276
  success: true,
@@ -0,0 +1,76 @@
1
+ /**
2
+ * MCP Handler — autosnippet_rescan (增量知识更新)
3
+ *
4
+ * 保留已审核 Recipe,清理衍生缓存,全量/指定维度重新扫描,
5
+ * 新知识通过批量提交走正常的进化架构。
6
+ *
7
+ * 流程:
8
+ * 1. snapshotRecipes — 快照保留知识
9
+ * 2. rescanClean — 清理衍生缓存
10
+ * 3. Phase 1-4 全量分析
11
+ * 4. RecipeRelevanceAuditor — 证据验证 + 快速衰退
12
+ * 5. 构建 Mission Briefing(含 allRecipes + evolutionGuide)
13
+ * 6. 返回给 Agent 按维度执行: evolve → gap-fill → dimension_complete
14
+ *
15
+ * @module handlers/rescan-external
16
+ */
17
+ import type { ServiceContainer } from '#inject/ServiceContainer.js';
18
+ import type { RescanInput } from '#shared/schemas/mcp-tools.js';
19
+ /** MCP handler context */
20
+ interface McpContext {
21
+ container: ServiceContainer;
22
+ logger: {
23
+ info(msg: string, meta?: Record<string, unknown>): void;
24
+ warn(msg: string, meta?: Record<string, unknown>): void;
25
+ };
26
+ startedAt?: number;
27
+ [key: string]: unknown;
28
+ }
29
+ export declare function rescanExternal(ctx: McpContext, args: RescanInput): Promise<{
30
+ success: boolean;
31
+ errorCode: string | null;
32
+ message: string;
33
+ data: {
34
+ message: string;
35
+ } | null;
36
+ meta: {
37
+ source?: string | undefined;
38
+ responseTimeMs?: number | undefined;
39
+ version: string;
40
+ tool?: string | undefined;
41
+ };
42
+ } | {
43
+ success: boolean;
44
+ errorCode: string | null;
45
+ message: string;
46
+ data: {
47
+ meta?: {
48
+ warnings?: string[];
49
+ responseSizeKB?: number;
50
+ [key: string]: unknown;
51
+ };
52
+ rescan: {
53
+ preservedRecipes: number;
54
+ cleanedTables: number;
55
+ cleanedFiles: number;
56
+ reason: string | null;
57
+ };
58
+ relevanceAudit: {
59
+ totalAudited: number;
60
+ healthy: number;
61
+ watch: number;
62
+ decay: number;
63
+ severe: number;
64
+ dead: number;
65
+ proposalsCreated: number;
66
+ immediateDeprecated: number;
67
+ };
68
+ } | null;
69
+ meta: {
70
+ source?: string | undefined;
71
+ responseTimeMs?: number | undefined;
72
+ version: string;
73
+ tool?: string | undefined;
74
+ };
75
+ }>;
76
+ export {};