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,81 @@
1
+ /**
2
+ * createSupersedeProposal — 统一的 supersede 提案创建逻辑
3
+ *
4
+ * 内部 Agent 路径 (lifecycle.ts / composite.ts) 和外部 MCP 路径 (consolidated.ts)
5
+ * 共用此函数,确保知识替代的进化架构入口唯一。
6
+ *
7
+ * 流程:
8
+ * 1. 从 DI 容器获取 ProposalRepository
9
+ * 2. 验证旧 Recipe 存在
10
+ * 3. 去重检查(ProposalRepository 内部)
11
+ * 4. 创建 type='supersede' 提案,进入 72h 观察窗口
12
+ */
13
+ /* ────────────────────── Main ────────────────────── */
14
+ /**
15
+ * 在 DI 容器中查找 ProposalRepository,验证旧 Recipe 存在后创建 supersede 提案。
16
+ *
17
+ * @returns SupersedeResult(成功)| null(ProposalRepo 不可用 / 旧 Recipe 不存在 / 去重拒绝)
18
+ */
19
+ export function createSupersedeProposal(container, input) {
20
+ const { oldRecipeId, newRecipeIds, source = 'ide-agent', confidence = 0.8 } = input;
21
+ if (!oldRecipeId || newRecipeIds.length === 0) {
22
+ return null;
23
+ }
24
+ // 1. 获取 ProposalRepository
25
+ let proposalRepo = null;
26
+ try {
27
+ proposalRepo = container.get('proposalRepository') ?? null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ if (!proposalRepo) {
33
+ return null;
34
+ }
35
+ // 2. 验证旧 Recipe 存在
36
+ if (!verifyRecipeExists(container, oldRecipeId)) {
37
+ return null;
38
+ }
39
+ // 3. 创建 supersede 提案(ProposalRepository 内部做去重检查)
40
+ const proposal = proposalRepo.create({
41
+ type: 'supersede',
42
+ targetRecipeId: oldRecipeId,
43
+ relatedRecipeIds: newRecipeIds,
44
+ confidence,
45
+ source,
46
+ description: `Agent 声明新 Recipe [${newRecipeIds.join(', ')}] 替代旧 Recipe [${oldRecipeId}]。观察窗口内将对比新旧表现。`,
47
+ evidence: [
48
+ {
49
+ snapshotAt: Date.now(),
50
+ newRecipeIds,
51
+ declaredBy: source,
52
+ },
53
+ ],
54
+ });
55
+ if (!proposal) {
56
+ return null;
57
+ }
58
+ return {
59
+ proposalId: proposal.id,
60
+ type: 'supersede',
61
+ targetRecipe: { id: oldRecipeId },
62
+ status: proposal.status,
63
+ expiresAt: proposal.expiresAt,
64
+ message: `已创建替代提案:新 Recipe 将在观察窗口到期后自动替代旧 Recipe [${oldRecipeId}]。`,
65
+ };
66
+ }
67
+ /* ────────────────────── Helpers ────────────────────── */
68
+ function verifyRecipeExists(container, recipeId) {
69
+ try {
70
+ const db = container.get('database');
71
+ if (!db) {
72
+ return false;
73
+ }
74
+ const rawDb = db.getDb();
75
+ const row = rawDb.prepare('SELECT id FROM knowledge_entries WHERE id = ?').get(recipeId);
76
+ return row !== undefined;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
@@ -72,6 +72,10 @@ interface GuardCheckEngineLike {
72
72
  }[];
73
73
  };
74
74
  };
75
+ /** Enhancement Pack 注入(可选,引擎不一定暴露) */
76
+ isEpInjected?(): boolean;
77
+ injectExternalRules?(rules: unknown[]): void;
78
+ markEpInjected?(): void;
75
79
  }
76
80
  interface ViolationItem {
77
81
  ruleId: string;
@@ -82,6 +82,53 @@ export class ComplianceReporter {
82
82
  });
83
83
  }
84
84
  }
85
+ /**
86
+ * 确保 Enhancement Pack 规则已注入到 engine
87
+ * 与 MCP guard handler 的 _injectEnhancementGuardRules 逻辑一致
88
+ */
89
+ async #ensureEnhancementPackRules() {
90
+ if (!this.engine.isEpInjected || this.engine.isEpInjected()) {
91
+ return;
92
+ }
93
+ try {
94
+ const { initEnhancementRegistry } = await import('#core/enhancement/index.js');
95
+ const enhReg = await initEnhancementRegistry();
96
+ const allPacks = enhReg.all();
97
+ const allGuardRules = [];
98
+ for (const pack of allPacks) {
99
+ try {
100
+ const rules = pack.getGuardRules();
101
+ if (rules.length > 0) {
102
+ allGuardRules.push(...rules);
103
+ }
104
+ }
105
+ catch {
106
+ /* graceful degradation per pack */
107
+ }
108
+ }
109
+ if (allGuardRules.length > 0 && this.engine.injectExternalRules) {
110
+ this.engine.injectExternalRules(allGuardRules);
111
+ this.logger.info(`[ComplianceReporter] Injected ${allGuardRules.length} Enhancement Pack rules`);
112
+ }
113
+ this.engine.markEpInjected?.();
114
+ }
115
+ catch {
116
+ /* Enhancement registry not available — non-critical */
117
+ }
118
+ }
119
+ /**
120
+ * 确保 AST 语言插件已加载(Tree-sitter WASM)
121
+ * 未加载时 _runAstLayer2Checks 会静默跳过,导致 AST 类违规无法检测
122
+ */
123
+ async #ensureAstPlugins() {
124
+ try {
125
+ const { loadPlugins } = await import('../../core/ast/index.js');
126
+ await loadPlugins();
127
+ }
128
+ catch {
129
+ /* AST not available — graceful degradation */
130
+ }
131
+ }
85
132
  /**
86
133
  * 生成全项目合规报告
87
134
  * @param projectRoot 项目根目录
@@ -91,6 +138,10 @@ export class ComplianceReporter {
91
138
  async generate(projectRoot, options = {}) {
92
139
  const thresholds = { ...this.qualityGateConfig, ...(options.qualityGate || {}) };
93
140
  const maxFiles = options.maxFiles || 500;
141
+ // 0. 确保 Enhancement Pack 规则已注入(与 MCP guard handler 保持一致)
142
+ await this.#ensureEnhancementPackRules();
143
+ // 0b. 确保 AST 语言插件已加载(Tree-sitter WASM)
144
+ await this.#ensureAstPlugins();
94
145
  // 1. 收集源文件
95
146
  const files = await collectSourceFilesWithContent(projectRoot, { maxFiles });
96
147
  this.logger.info(`[ComplianceReporter] Collected ${files.length} source files`);
@@ -678,13 +678,14 @@ export class GuardCheckEngine {
678
678
  }
679
679
  // 如果有 scope,按层级过滤:project ⊇ target ⊇ file
680
680
  // project 范围包含所有维度的规则;target 包含 file+target;file 仅匹配 file
681
+ // 'universal' 维度在所有 scope 下都生效
681
682
  if (scope) {
682
683
  const SCOPE_HIERARCHY = {
683
- project: ['file', 'target', 'project'],
684
- target: ['file', 'target'],
685
- file: ['file'],
684
+ project: ['file', 'target', 'project', 'universal'],
685
+ target: ['file', 'target', 'universal'],
686
+ file: ['file', 'universal'],
686
687
  };
687
- const allowedDimensions = SCOPE_HIERARCHY[scope] || [scope];
688
+ const allowedDimensions = SCOPE_HIERARCHY[scope] || [scope, 'universal'];
688
689
  rules = rules.filter((r) => !r.dimension || allowedDimensions.includes(r.dimension));
689
690
  }
690
691
  const lines = (code || '').split(/\r?\n/);
@@ -85,6 +85,12 @@ interface DepGraphNode {
85
85
  id?: string;
86
86
  label?: string;
87
87
  type?: string;
88
+ layer?: string;
89
+ version?: string;
90
+ group?: string;
91
+ fullPath?: string;
92
+ indirect?: boolean;
93
+ [key: string]: unknown;
88
94
  }
89
95
  interface DepGraphData {
90
96
  nodes?: (DepGraphNode | string)[];
@@ -169,10 +169,26 @@ export class CodeEntityGraph {
169
169
  name: nodeObj.label || nodeObj.id || String(node),
170
170
  metadata: {
171
171
  nodeType: nodeObj.type || 'module',
172
+ ...(nodeObj.layer != null ? { layer: nodeObj.layer } : {}),
173
+ ...(nodeObj.version != null ? { version: nodeObj.version } : {}),
174
+ ...(nodeObj.group != null ? { group: nodeObj.group } : {}),
175
+ ...(nodeObj.fullPath != null ? { fullPath: nodeObj.fullPath } : {}),
176
+ ...(nodeObj.indirect != null ? { indirect: nodeObj.indirect } : {}),
172
177
  },
173
178
  });
174
179
  entities++;
175
180
  }
181
+ // 存储 layers 元数据(如果存在)到特殊实体
182
+ const layers = depGraphData.layers;
183
+ if (layers?.length) {
184
+ this.#upsertEntity({
185
+ entityId: '__config_layers__',
186
+ entityType: 'config',
187
+ name: 'Config Layers',
188
+ metadata: { layers },
189
+ });
190
+ entities++;
191
+ }
176
192
  });
177
193
  run();
178
194
  const result = { entitiesUpserted: entities, edgesCreated: 0, durationMs: Date.now() - t0 };
@@ -20,7 +20,7 @@ const DEFAULT_CONFIG = {
20
20
  /** 自动通过要求 reasoning.isValid() */
21
21
  requireReasoning: true,
22
22
  /** 来源白名单(这些来源可以适用更宽松的阈值) */
23
- trustedSources: ['bootstrap', 'cursor-scan'],
23
+ trustedSources: ['bootstrap', 'cursor-scan', 'mcp'],
24
24
  /** 可信来源的自动通过阈值 */
25
25
  trustedAutoApproveThreshold: 0.7,
26
26
  /** 极高置信度阈值 (≥0.90 → 24h Grace) */
@@ -105,8 +105,16 @@ export declare class KnowledgeService {
105
105
  _triggerCursorDeliveryAsync(): void;
106
106
  /** 弃用 (pending|active → deprecated) */
107
107
  deprecate(id: string, reason: string, context: ServiceContext): Promise<KnowledgeEntry>;
108
- /** 重新激活 (deprecated → pending) */
108
+ /** 重新激活 (deprecated|staging → pending) */
109
109
  reactivate(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
110
+ /** 进入暂存期 (pending → staging) */
111
+ stage(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
112
+ /** 进入进化态 (active → evolving) */
113
+ evolve(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
114
+ /** 进入衰退观察 (active|evolving → decaying) */
115
+ decay(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
116
+ /** 恢复为已发布 (decaying|evolving → active) */
117
+ restore(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
110
118
  /** @deprecated 简化后所有条目直接进 pending */
111
119
  submit(id: string, _context: ServiceContext): Promise<KnowledgeEntry>;
112
120
  /** @deprecated 简化后 approve = publish */
@@ -171,6 +179,8 @@ export declare class KnowledgeService {
171
179
  _syncRelationsToGraph(id: string, relations: unknown): void;
172
180
  /** 删除所有关联边 */
173
181
  _removeAllEdges(id: string): void;
182
+ /** 删除关联的 evolution_proposals(target_recipe_id 无 CASCADE) */
183
+ _removeRelatedProposals(id: string): void;
174
184
  /** 落盘到 .md 文件 + 回写 sourceFile */
175
185
  _persistToFile(entry: KnowledgeEntry): void;
176
186
  /** 删除 .md 文件 */
@@ -49,6 +49,13 @@ export class KnowledgeService {
49
49
  async create(data, context) {
50
50
  try {
51
51
  this._validateCreateInput(data);
52
+ // ── 标题去重:防止跨维度/跨调用创建同名条目 ──
53
+ if (data.title) {
54
+ const existing = await this.repository.findByTitle(data.title);
55
+ if (existing) {
56
+ throw new ConflictError(`Knowledge entry with title "${data.title}" already exists (id: ${existing.id})`, { existingId: existing.id, title: data.title });
57
+ }
58
+ }
52
59
  const entry = KnowledgeEntry.fromJSON({
53
60
  ...data,
54
61
  lifecycle: Lifecycle.PENDING,
@@ -280,6 +287,8 @@ export class KnowledgeService {
280
287
  this._removeFile(entry);
281
288
  // 清除 knowledge_edges
282
289
  this._removeAllEdges(id);
290
+ // 清除 evolution_proposals(无 ON DELETE CASCADE,需手动删除)
291
+ this._removeRelatedProposals(id);
283
292
  await this.repository.delete(id);
284
293
  await this._audit('delete_knowledge', id, context.userId, {
285
294
  title: entry.title,
@@ -340,10 +349,26 @@ export class KnowledgeService {
340
349
  entityArgs: [reason],
341
350
  });
342
351
  }
343
- /** 重新激活 (deprecated → pending) */
352
+ /** 重新激活 (deprecated|staging → pending) */
344
353
  async reactivate(id, context) {
345
354
  return this._lifecycleTransition(id, 'reactivate', context);
346
355
  }
356
+ /** 进入暂存期 (pending → staging) */
357
+ async stage(id, context) {
358
+ return this._lifecycleTransition(id, 'stage', context);
359
+ }
360
+ /** 进入进化态 (active → evolving) */
361
+ async evolve(id, context) {
362
+ return this._lifecycleTransition(id, 'evolve', context);
363
+ }
364
+ /** 进入衰退观察 (active|evolving → decaying) */
365
+ async decay(id, context) {
366
+ return this._lifecycleTransition(id, 'decay', context);
367
+ }
368
+ /** 恢复为已发布 (decaying|evolving → active) */
369
+ async restore(id, context) {
370
+ return this._lifecycleTransition(id, 'restore', context);
371
+ }
347
372
  // ── 向后兼容别名 ──
348
373
  /** @deprecated 简化后所有条目直接进 pending */
349
374
  async submit(id, _context) {
@@ -495,17 +520,28 @@ export class KnowledgeService {
495
520
  // 为 QualityScorer 适配输入字段
496
521
  const scorerInput = this._adaptForScorer(entry);
497
522
  const result = this._qualityScorer.score(scorerInput);
498
- // 更新 Quality 值对象
499
- await this.repository.update(id, {
500
- quality: JSON.stringify({
501
- completeness: result.dimensions.completeness,
502
- adaptation: result.dimensions.metadata,
503
- documentation: result.dimensions.format,
504
- overall: result.score,
505
- grade: result.grade,
506
- }),
523
+ // 更新 Quality 值对象;同步计算 authority(0‑5)
524
+ const qualityJson = {
525
+ completeness: result.dimensions.completeness,
526
+ adaptation: result.dimensions.metadata,
527
+ documentation: result.dimensions.format,
528
+ overall: result.score,
529
+ grade: result.grade,
530
+ };
531
+ // 当 authority 从未手动设置(仍为 0)时,从 quality.overall 自动推导
532
+ const currentAuthority = entry.stats?.authority ?? 0;
533
+ const updatePayload = {
534
+ quality: JSON.stringify(qualityJson),
507
535
  updatedAt: Math.floor(Date.now() / 1000),
508
- });
536
+ };
537
+ if (currentAuthority === 0 && result.score > 0) {
538
+ const statsObj = entry.stats?.toJSON?.() ?? (typeof entry.stats === 'object' ? { ...entry.stats } : {});
539
+ updatePayload.stats = JSON.stringify({
540
+ ...statsObj,
541
+ authority: Math.round(result.score * 5),
542
+ });
543
+ }
544
+ await this.repository.update(id, updatePayload);
509
545
  if (context.userId) {
510
546
  await this._audit('update_knowledge_quality', id, context.userId, {
511
547
  score: result.score,
@@ -540,6 +576,8 @@ export class KnowledgeService {
540
576
  detail: `Lifecycle ${method} failed for ${id}`,
541
577
  });
542
578
  }
579
+ // 标记操作人到最后一条 lifecycleHistory 条目
580
+ entry.stampLastTransition(context.userId);
543
581
  // 构建 DB 更新
544
582
  // 注意: 不在此处 JSON.stringify — repository.update() 内部
545
583
  // 通过 _entityToRow() 统一执行序列化, 传入原始值即可
@@ -555,9 +593,8 @@ export class KnowledgeService {
555
593
  if (entry.reviewedAt) {
556
594
  dbUpdates.reviewedAt = entry.reviewedAt;
557
595
  }
558
- if (entry.rejectionReason !== null) {
559
- dbUpdates.rejectionReason = entry.rejectionReason;
560
- }
596
+ // 驳回原因(含清除:reactivate 后 rejectionReason = null 需写入 DB)
597
+ dbUpdates.rejectionReason = entry.rejectionReason;
561
598
  // 发布字段
562
599
  if (entry.publishedAt) {
563
600
  dbUpdates.publishedAt = entry.publishedAt;
@@ -781,6 +818,22 @@ export class KnowledgeService {
781
818
  });
782
819
  }
783
820
  }
821
+ /** 删除关联的 evolution_proposals(target_recipe_id 无 CASCADE) */
822
+ _removeRelatedProposals(id) {
823
+ const gs = this._knowledgeGraphService;
824
+ if (!gs) {
825
+ return;
826
+ }
827
+ try {
828
+ gs.db.prepare(`DELETE FROM evolution_proposals WHERE target_recipe_id = ?`).run(id);
829
+ }
830
+ catch (err) {
831
+ this.logger.warn('Failed to remove related proposals', {
832
+ id,
833
+ error: err instanceof Error ? err.message : String(err),
834
+ });
835
+ }
836
+ }
784
837
  /* ═══ 文件落盘 ═════════════════════════════════ */
785
838
  /** 落盘到 .md 文件 + 回写 sourceFile */
786
839
  _persistToFile(entry) {
@@ -0,0 +1,225 @@
1
+ /**
2
+ * RecipeProductionGateway — 统一 Recipe 生产入口
3
+ *
4
+ * 所有 Recipe 创建(Agent Tool / MCP / IDE Agent / Batch Import)
5
+ * 通过此 Gateway 的统一管道,保证前置校验一致:
6
+ *
7
+ * 1. Schema Validation (UnifiedValidator)
8
+ * 2. Similarity Check — 去重检测(可选跳过)
9
+ * 3. Consolidation Scan — 融合/重组建议(可选)
10
+ * 4. KnowledgeService.create() — 包含 ConfidenceRouter → staging / pending
11
+ * 5. Quality Scoring — 质量评分
12
+ * 6. Supersede Proposal — 创建替代提案
13
+ * 7. Audit — 统一审计
14
+ *
15
+ * @see docs/copilot/recipe-lifecycle-management.md §6
16
+ */
17
+ /** Lightweight log interface — avoids importing static-only Logger class. */
18
+ interface GatewayLogger {
19
+ info(msg: string): void;
20
+ warn(msg: string): void;
21
+ }
22
+ export type GatewaySource = 'agent-tool' | 'mcp-external' | 'ide-agent' | 'batch-import';
23
+ export interface CreateRecipeItem {
24
+ title?: string;
25
+ description?: string;
26
+ content?: {
27
+ markdown?: string;
28
+ pattern?: string;
29
+ rationale?: string;
30
+ [key: string]: unknown;
31
+ };
32
+ trigger?: string;
33
+ kind?: string;
34
+ topicHint?: string;
35
+ whenClause?: string;
36
+ doClause?: string;
37
+ dontClause?: string;
38
+ coreCode?: string;
39
+ sourceRefs?: string[];
40
+ tags?: string[];
41
+ reasoning?: {
42
+ whyStandard?: string;
43
+ sources?: string[];
44
+ confidence?: number;
45
+ };
46
+ headers?: string[];
47
+ usageGuide?: string;
48
+ scope?: string;
49
+ complexity?: string;
50
+ sourceFile?: string;
51
+ knowledgeType?: string;
52
+ language?: string;
53
+ category?: string;
54
+ source?: string;
55
+ [key: string]: unknown;
56
+ }
57
+ export interface CreateRecipeRequest {
58
+ source: GatewaySource;
59
+ items: CreateRecipeItem[];
60
+ options?: {
61
+ /** 跳过相似度检测(仅 batch-import 可用) */
62
+ skipSimilarityCheck?: boolean;
63
+ /** 跳过 ConsolidationAdvisor 分析 */
64
+ skipConsolidation?: boolean;
65
+ /** 被替代的旧 Recipe ID */
66
+ supersedes?: string;
67
+ /** 相似度阈值,默认 0.7 */
68
+ similarityThreshold?: number;
69
+ /** 已提交标题集(批量去重用) */
70
+ existingTitles?: Set<string>;
71
+ /** 已提交指纹集(批量去重用) */
72
+ existingFingerprints?: Set<string>;
73
+ /** UnifiedValidator 跳过系统注入字段列表 */
74
+ systemInjectedFields?: string[];
75
+ /** 跳过唯一性校验 */
76
+ skipUniqueness?: boolean;
77
+ /** 操作用户 ID */
78
+ userId?: string;
79
+ };
80
+ }
81
+ export interface CreatedRecipeInfo {
82
+ id: string;
83
+ title: string;
84
+ lifecycle: string;
85
+ /** Raw saved entry from KnowledgeService.create() */
86
+ raw: Record<string, unknown>;
87
+ }
88
+ export interface RejectedRecipeInfo {
89
+ index: number;
90
+ title: string;
91
+ reason: string;
92
+ errors: string[];
93
+ warnings: string[];
94
+ }
95
+ export interface MergedRecipeInfo {
96
+ index: number;
97
+ proposalId: string;
98
+ type: string;
99
+ targetRecipeId: string;
100
+ targetTitle: string;
101
+ status: string;
102
+ expiresAt: number;
103
+ message: string;
104
+ }
105
+ export interface BlockedRecipeInfo {
106
+ index: number;
107
+ title: string;
108
+ consolidation: unknown;
109
+ }
110
+ export interface SimilarRecipeInfo {
111
+ index: number;
112
+ title: string;
113
+ similarTo: {
114
+ file: string;
115
+ title: string;
116
+ similarity: number;
117
+ }[];
118
+ }
119
+ export interface CreateRecipeResult {
120
+ created: CreatedRecipeInfo[];
121
+ rejected: RejectedRecipeInfo[];
122
+ merged: MergedRecipeInfo[];
123
+ blocked: BlockedRecipeInfo[];
124
+ duplicates: SimilarRecipeInfo[];
125
+ supersedeProposal: {
126
+ proposalId: string;
127
+ } | null;
128
+ }
129
+ interface GatewayKnowledgeService {
130
+ create(data: Record<string, unknown>, context: {
131
+ userId: string;
132
+ }): Promise<{
133
+ id: string;
134
+ title: string;
135
+ lifecycle: string;
136
+ kind?: string;
137
+ [key: string]: unknown;
138
+ }>;
139
+ updateQuality(id: string, context: {
140
+ userId: string;
141
+ }): Promise<unknown>;
142
+ }
143
+ interface GatewayConsolidationAdvisor {
144
+ analyzeBatch(candidates: Array<{
145
+ title: string;
146
+ category?: string;
147
+ [key: string]: unknown;
148
+ }>): {
149
+ items: Array<{
150
+ index: number;
151
+ advice: {
152
+ action: string;
153
+ confidence: number;
154
+ reason: string;
155
+ targetRecipe?: {
156
+ id: string;
157
+ title: string;
158
+ similarity: number;
159
+ };
160
+ reorganizeTargets?: {
161
+ id: string;
162
+ title: string;
163
+ similarity: number;
164
+ }[];
165
+ coveredBy?: {
166
+ id: string;
167
+ title: string;
168
+ similarity: number;
169
+ }[];
170
+ mergeDirection?: {
171
+ addedDimensions: string[];
172
+ summary: string;
173
+ };
174
+ };
175
+ }>;
176
+ };
177
+ }
178
+ interface GatewayProposalRepository {
179
+ create(data: Record<string, unknown>): {
180
+ id: string;
181
+ status: string;
182
+ expiresAt: number;
183
+ [key: string]: unknown;
184
+ } | null;
185
+ }
186
+ type GatewaySimilarityFn = (projectRoot: string, candidate: {
187
+ title: string;
188
+ summary: string;
189
+ code: string;
190
+ }, opts: {
191
+ threshold: number;
192
+ topK: number;
193
+ }) => {
194
+ file: string;
195
+ title: string;
196
+ similarity: number;
197
+ }[];
198
+ export interface GatewayDeps {
199
+ knowledgeService: GatewayKnowledgeService;
200
+ projectRoot: string;
201
+ logger?: GatewayLogger;
202
+ /** ConsolidationAdvisor(可选 — MCP 路径使用) */
203
+ consolidationAdvisor?: GatewayConsolidationAdvisor | null;
204
+ /** ProposalRepository(可选 — supersede 提案需要) */
205
+ proposalRepository?: GatewayProposalRepository | null;
206
+ /** 相似度检测函数(可选 — 默认导入 SimilarityService) */
207
+ findSimilarRecipes?: GatewaySimilarityFn | null;
208
+ }
209
+ export declare class RecipeProductionGateway {
210
+ #private;
211
+ constructor(deps: GatewayDeps);
212
+ /**
213
+ * 统一创建入口
214
+ *
215
+ * Pipeline:
216
+ * 1. Schema Validation (UnifiedValidator)
217
+ * 2. Similarity Check (除非 skipSimilarityCheck)
218
+ * 3. Consolidation Scan (除非 skipConsolidation)
219
+ * 4. KnowledgeService.create() — ConfidenceRouter → staging / pending
220
+ * 5. Quality Scoring
221
+ * 6. Supersede Proposal 创建 (if supersedes)
222
+ */
223
+ create(request: CreateRecipeRequest): Promise<CreateRecipeResult>;
224
+ }
225
+ export {};