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,89 @@
1
+ /**
2
+ * RecipeRelevanceAuditor — 基于代码证据验证 Recipe 当前相关性
3
+ *
4
+ * Rescan 时主动触发,检查每个保留 Recipe 的代码证据是否仍然存在:
5
+ * 1. 触发模式匹配 (trigger 引用的文件类型/路径模式是否有匹配)
6
+ * 2. 代码符号存活 (content.pattern 引用的类名/函数名是否在 AST 中)
7
+ * 3. 依赖关系完整 (涉及模块依赖是否在依赖图中)
8
+ * 4. 源代码文件存活 (reasoning.sources + content.codeChanges 的文件是否存在)
9
+ *
10
+ * 评分后驱动快速衰退:
11
+ * - healthy (80-100): 无操作
12
+ * - watch (60-79): 报告警告
13
+ * - decay (40-59): active → decaying (7d grace)
14
+ * - severe (20-39): active → decaying (3d grace)
15
+ * - dead (0-19): active → deprecated (immediate)
16
+ *
17
+ * 支持 Category 权重豁免:架构/规范类 Recipe 侧重触发模式而非具体符号。
18
+ *
19
+ * @module service/evolution/RecipeRelevanceAuditor
20
+ */
21
+ /** Logger 接口 */
22
+ interface AuditorLogger {
23
+ info(msg: string, meta?: Record<string, unknown>): void;
24
+ warn(msg: string, meta?: Record<string, unknown>): void;
25
+ }
26
+ /** 知识条目快照 (来自 CleanupService.snapshotRecipes) */
27
+ export interface RecipeSnapshotEntry {
28
+ id: string;
29
+ title: string;
30
+ trigger: string;
31
+ category: string;
32
+ dimensionId?: string;
33
+ sourceFile?: string;
34
+ lifecycle: string;
35
+ }
36
+ /** Phase 1-4 分析数据 */
37
+ export interface AnalysisData {
38
+ /** 项目所有文件的相对路径 */
39
+ fileList: string[];
40
+ /** AST 解析的代码实体 (类名/函数名/协议名等) */
41
+ codeEntities: Array<{
42
+ name: string;
43
+ kind?: string;
44
+ file?: string;
45
+ }>;
46
+ /** 依赖关系图 */
47
+ dependencyGraph: Array<{
48
+ from: string;
49
+ to: string;
50
+ }>;
51
+ }
52
+ /** 单个 Recipe 的审计结果 */
53
+ export interface RelevanceAuditResult {
54
+ recipeId: string;
55
+ title: string;
56
+ relevanceScore: number;
57
+ verdict: 'healthy' | 'watch' | 'decay' | 'severe' | 'dead';
58
+ evidence: {
59
+ triggerStillMatches: boolean;
60
+ symbolsAlive: number;
61
+ depsIntact: boolean;
62
+ codeFilesExist: number;
63
+ };
64
+ decayReasons: string[];
65
+ }
66
+ /** 审计汇总 */
67
+ export interface RelevanceAuditSummary {
68
+ totalAudited: number;
69
+ healthy: number;
70
+ watch: number;
71
+ decay: number;
72
+ severe: number;
73
+ dead: number;
74
+ results: RelevanceAuditResult[];
75
+ proposalsCreated: number;
76
+ immediateDeprecated: number;
77
+ }
78
+ export declare class RecipeRelevanceAuditor {
79
+ #private;
80
+ constructor(opts: {
81
+ db: unknown;
82
+ logger?: AuditorLogger;
83
+ });
84
+ /**
85
+ * 审计所有保留 Recipe 的代码证据
86
+ */
87
+ audit(recipes: RecipeSnapshotEntry[], analysisData: AnalysisData): Promise<RelevanceAuditSummary>;
88
+ }
89
+ export {};
@@ -0,0 +1,492 @@
1
+ /**
2
+ * RecipeRelevanceAuditor — 基于代码证据验证 Recipe 当前相关性
3
+ *
4
+ * Rescan 时主动触发,检查每个保留 Recipe 的代码证据是否仍然存在:
5
+ * 1. 触发模式匹配 (trigger 引用的文件类型/路径模式是否有匹配)
6
+ * 2. 代码符号存活 (content.pattern 引用的类名/函数名是否在 AST 中)
7
+ * 3. 依赖关系完整 (涉及模块依赖是否在依赖图中)
8
+ * 4. 源代码文件存活 (reasoning.sources + content.codeChanges 的文件是否存在)
9
+ *
10
+ * 评分后驱动快速衰退:
11
+ * - healthy (80-100): 无操作
12
+ * - watch (60-79): 报告警告
13
+ * - decay (40-59): active → decaying (7d grace)
14
+ * - severe (20-39): active → decaying (3d grace)
15
+ * - dead (0-19): active → deprecated (immediate)
16
+ *
17
+ * 支持 Category 权重豁免:架构/规范类 Recipe 侧重触发模式而非具体符号。
18
+ *
19
+ * @module service/evolution/RecipeRelevanceAuditor
20
+ */
21
+ // ── 常量 ────────────────────────────────────────────────────
22
+ /** 默认证据权重
23
+ *
24
+ * 注意:不包含 sourceFileExists。DB 中 sourceFile 存储的是 Recipe md 文件路径
25
+ * (如 AutoSnippet/candidates/xxx.md),不是源代码路径。
26
+ * 真正的源代码来源在 reasoning.sources 中,由 codeFilesExist 维度检查。
27
+ */
28
+ const DEFAULT_WEIGHTS = {
29
+ triggerStillMatches: 0.2,
30
+ symbolsAlive: 0.3,
31
+ depsIntact: 0.15,
32
+ codeFilesExist: 0.35,
33
+ };
34
+ /**
35
+ * 按 category 覆盖权重 — 架构/规范类侧重触发模式和来源文件
36
+ */
37
+ const CATEGORY_WEIGHT_OVERRIDES = {
38
+ architecture: {
39
+ symbolsAlive: 0.05,
40
+ depsIntact: 0.05,
41
+ triggerStillMatches: 0.45,
42
+ codeFilesExist: 0.45,
43
+ },
44
+ 'coding-standards': {
45
+ symbolsAlive: 0.05,
46
+ depsIntact: 0.05,
47
+ triggerStillMatches: 0.45,
48
+ codeFilesExist: 0.45,
49
+ },
50
+ 'agent-guidelines': {
51
+ symbolsAlive: 0.0,
52
+ depsIntact: 0.0,
53
+ triggerStillMatches: 0.5,
54
+ codeFilesExist: 0.5,
55
+ },
56
+ };
57
+ /** Grace Period 常量 */
58
+ const GRACE_PERIOD_DECAY = 7 * 24 * 60 * 60 * 1000; // 7d
59
+ const GRACE_PERIOD_SEVERE = 3 * 24 * 60 * 60 * 1000; // 3d
60
+ // ── RecipeRelevanceAuditor ──────────────────────────────────
61
+ export class RecipeRelevanceAuditor {
62
+ #db;
63
+ #logger;
64
+ constructor(opts) {
65
+ const dbRaw = opts.db;
66
+ this.#db = typeof dbRaw?.getDb === 'function' ? dbRaw.getDb() : opts.db;
67
+ this.#logger = opts.logger || { info() { }, warn() { } };
68
+ }
69
+ /**
70
+ * 审计所有保留 Recipe 的代码证据
71
+ */
72
+ async audit(recipes, analysisData) {
73
+ const summary = {
74
+ totalAudited: 0,
75
+ healthy: 0,
76
+ watch: 0,
77
+ decay: 0,
78
+ severe: 0,
79
+ dead: 0,
80
+ results: [],
81
+ proposalsCreated: 0,
82
+ immediateDeprecated: 0,
83
+ };
84
+ // 预处理:构建快速查找集合
85
+ const fileSet = new Set(analysisData.fileList.map((f) => f.toLowerCase()));
86
+ const entityNames = new Set(analysisData.codeEntities.map((e) => e.name.toLowerCase()));
87
+ const depModules = new Set();
88
+ for (const edge of analysisData.dependencyGraph) {
89
+ depModules.add(edge.from.toLowerCase());
90
+ depModules.add(edge.to.toLowerCase());
91
+ }
92
+ for (const recipe of recipes) {
93
+ const fullRecipe = this.#loadFullRecipe(recipe.id);
94
+ if (!fullRecipe) {
95
+ continue;
96
+ }
97
+ const result = this.#computeRelevanceScore(fullRecipe, {
98
+ fileSet,
99
+ entityNames,
100
+ depModules,
101
+ fileList: analysisData.fileList,
102
+ });
103
+ summary.totalAudited++;
104
+ summary[result.verdict]++;
105
+ summary.results.push(result);
106
+ // 执行衰退状态转换
107
+ if (result.verdict === 'dead' || result.verdict === 'severe' || result.verdict === 'decay') {
108
+ const executed = this.#executeDecay(result);
109
+ if (result.verdict === 'dead') {
110
+ summary.immediateDeprecated += executed ? 1 : 0;
111
+ }
112
+ if (executed) {
113
+ summary.proposalsCreated++;
114
+ }
115
+ }
116
+ }
117
+ this.#logger.info('[RecipeRelevanceAuditor] Audit complete', {
118
+ total: summary.totalAudited,
119
+ healthy: summary.healthy,
120
+ watch: summary.watch,
121
+ decay: summary.decay,
122
+ severe: summary.severe,
123
+ dead: summary.dead,
124
+ });
125
+ return summary;
126
+ }
127
+ // ─── 内部方法 ─────────────────────────────────────────
128
+ /** 从 DB 加载完整 Recipe 数据 */
129
+ #loadFullRecipe(id) {
130
+ try {
131
+ const row = this.#db
132
+ .prepare(`SELECT id, title, trigger, category,
133
+ content, doClause, coreCode
134
+ FROM knowledge_entries WHERE id = ?`)
135
+ .get(id);
136
+ return row || null;
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
142
+ /** 计算单个 Recipe 的 relevanceScore */
143
+ #computeRelevanceScore(recipe, ctx) {
144
+ const category = recipe.category || '';
145
+ const weights = {
146
+ ...DEFAULT_WEIGHTS,
147
+ ...(CATEGORY_WEIGHT_OVERRIDES[category] || {}),
148
+ };
149
+ const decayReasons = [];
150
+ // 1. trigger 模式匹配
151
+ const triggerStillMatches = this.#checkTriggerMatch(recipe.trigger, ctx.fileList);
152
+ if (!triggerStillMatches) {
153
+ decayReasons.push(`触发条件 "${recipe.trigger}" 无匹配文件`);
154
+ }
155
+ // 2. 代码符号存活率
156
+ const referencedSymbols = this.#extractReferencedSymbols(recipe);
157
+ let symbolsAlive = 1.0;
158
+ if (referencedSymbols.length > 0) {
159
+ const aliveCount = referencedSymbols.filter((s) => ctx.entityNames.has(s.toLowerCase())).length;
160
+ symbolsAlive = aliveCount / referencedSymbols.length;
161
+ if (symbolsAlive < 0.5) {
162
+ decayReasons.push(`引用符号存活 ${aliveCount}/${referencedSymbols.length} (${(symbolsAlive * 100).toFixed(0)}%)`);
163
+ }
164
+ }
165
+ // 3. 依赖关系完整性
166
+ const referencedModules = this.#extractModuleReferences(recipe);
167
+ let depsIntact = true;
168
+ if (referencedModules.length > 0) {
169
+ const intactCount = referencedModules.filter((m) => ctx.depModules.has(m.toLowerCase())).length;
170
+ depsIntact = intactCount >= referencedModules.length * 0.5;
171
+ if (!depsIntact) {
172
+ decayReasons.push(`模块依赖 ${intactCount}/${referencedModules.length} 存活`);
173
+ }
174
+ }
175
+ // 4. 源代码文件存活率(来自 reasoning.sources + content.codeChanges)
176
+ const codeFiles = this.#extractCodeFiles(recipe);
177
+ let codeFilesExist = 1.0;
178
+ if (codeFiles.length > 0) {
179
+ const existCount = codeFiles.filter((f) => ctx.fileSet.has(f.toLowerCase())).length;
180
+ codeFilesExist = existCount / codeFiles.length;
181
+ if (codeFilesExist < 0.5) {
182
+ decayReasons.push(`codeChanges 文件存活 ${existCount}/${codeFiles.length}`);
183
+ }
184
+ }
185
+ // 加权计算 relevanceScore
186
+ const relevanceScore = Math.round((triggerStillMatches ? 1 : 0) * weights.triggerStillMatches * 100 +
187
+ symbolsAlive * weights.symbolsAlive * 100 +
188
+ (depsIntact ? 1 : 0) * weights.depsIntact * 100 +
189
+ codeFilesExist * weights.codeFilesExist * 100);
190
+ // 分级判定
191
+ let verdict;
192
+ if (relevanceScore >= 80) {
193
+ verdict = 'healthy';
194
+ }
195
+ else if (relevanceScore >= 60) {
196
+ verdict = 'watch';
197
+ }
198
+ else if (relevanceScore >= 40) {
199
+ verdict = 'decay';
200
+ }
201
+ else if (relevanceScore >= 20) {
202
+ verdict = 'severe';
203
+ }
204
+ else {
205
+ verdict = 'dead';
206
+ }
207
+ return {
208
+ recipeId: recipe.id,
209
+ title: recipe.title,
210
+ relevanceScore,
211
+ verdict,
212
+ evidence: {
213
+ triggerStillMatches,
214
+ symbolsAlive,
215
+ depsIntact,
216
+ codeFilesExist,
217
+ },
218
+ decayReasons,
219
+ };
220
+ }
221
+ /** 检查 trigger 模式是否仍有匹配文件 */
222
+ #checkTriggerMatch(trigger, fileList) {
223
+ if (!trigger || trigger.trim() === '') {
224
+ return true; // 无 trigger 视为匹配
225
+ }
226
+ const triggerLower = trigger.toLowerCase();
227
+ // 检查 @trigger 格式 (如 @bilidili-api-response-model)
228
+ // 这些是自定义 trigger,不与文件路径匹配,视为始终有效
229
+ if (triggerLower.startsWith('@')) {
230
+ return true;
231
+ }
232
+ // 检查文件扩展名匹配 (如 "When creating .swift files")
233
+ const extMatch = triggerLower.match(/\.(swift|ts|tsx|js|jsx|py|java|kt|rb|go|rs|vue|svelte)\b/);
234
+ if (extMatch) {
235
+ const ext = extMatch[0];
236
+ return fileList.some((f) => f.toLowerCase().endsWith(ext));
237
+ }
238
+ // 检查路径模式匹配 (如 "When modifying Packages/")
239
+ const pathPatterns = trigger.match(/(?:[\w.-]+\/)+[\w.-]*/g) || [];
240
+ if (pathPatterns.length > 0) {
241
+ return pathPatterns.some((pattern) => {
242
+ const p = pattern.toLowerCase();
243
+ return fileList.some((f) => f.toLowerCase().includes(p));
244
+ });
245
+ }
246
+ // 无法判断时视为匹配
247
+ return true;
248
+ }
249
+ /** 从 Recipe content 中提取引用的符号 */
250
+ #extractReferencedSymbols(recipe) {
251
+ const symbols = [];
252
+ // 从 content JSON 中提取
253
+ try {
254
+ const content = JSON.parse(recipe.content || '{}');
255
+ const pattern = content.pattern || '';
256
+ const markdown = content.markdown || '';
257
+ const text = `${pattern} ${markdown} ${recipe.doClause || ''} ${recipe.coreCode || ''}`;
258
+ // 匹配 PascalCase 标识符 (类名/协议名)
259
+ const identifiers = text.match(/\b[A-Z][a-zA-Z0-9]{2,}\b/g) || [];
260
+ // 去掉常见英文单词
261
+ const COMMON_WORDS = new Set([
262
+ 'When',
263
+ 'Then',
264
+ 'The',
265
+ 'This',
266
+ 'That',
267
+ 'Use',
268
+ 'Not',
269
+ 'All',
270
+ 'For',
271
+ 'With',
272
+ 'From',
273
+ 'Each',
274
+ 'Must',
275
+ 'May',
276
+ 'Can',
277
+ 'Will',
278
+ 'Has',
279
+ 'Are',
280
+ 'New',
281
+ 'Set',
282
+ 'Get',
283
+ 'Add',
284
+ 'Run',
285
+ 'End',
286
+ 'Try',
287
+ 'Nil',
288
+ 'True',
289
+ 'False',
290
+ 'Void',
291
+ 'Self',
292
+ 'Type',
293
+ 'Error',
294
+ 'Result',
295
+ 'String',
296
+ 'Int',
297
+ 'Bool',
298
+ 'Array',
299
+ 'Dict',
300
+ 'Optional',
301
+ 'Protocol',
302
+ 'Class',
303
+ 'Struct',
304
+ 'Enum',
305
+ 'Import',
306
+ 'Return',
307
+ 'Override',
308
+ 'Private',
309
+ 'Public',
310
+ 'Internal',
311
+ 'Func',
312
+ 'Var',
313
+ 'Let',
314
+ 'Guard',
315
+ 'Async',
316
+ 'Await',
317
+ 'Throws',
318
+ 'Release',
319
+ 'Debug',
320
+ 'Swift',
321
+ 'Function',
322
+ 'Method',
323
+ 'Property',
324
+ 'Value',
325
+ 'Default',
326
+ 'Shared',
327
+ 'Static',
328
+ 'Final',
329
+ 'Weak',
330
+ 'Lazy',
331
+ ]);
332
+ for (const id of identifiers) {
333
+ if (!COMMON_WORDS.has(id) && id.length >= 3) {
334
+ symbols.push(id);
335
+ }
336
+ }
337
+ }
338
+ catch {
339
+ /* invalid JSON */
340
+ }
341
+ // 去重
342
+ return [...new Set(symbols)];
343
+ }
344
+ /** 从 Recipe 中提取模块/依赖引用 */
345
+ #extractModuleReferences(recipe) {
346
+ const modules = [];
347
+ try {
348
+ const content = JSON.parse(recipe.content || '{}');
349
+ const text = `${content.markdown || ''} ${content.pattern || ''} ${recipe.doClause || ''}`;
350
+ // 匹配 import 语句中的模块名
351
+ const importMatches = text.match(/import\s+(\w+)/g) || [];
352
+ for (const m of importMatches) {
353
+ const name = m.replace(/^import\s+/, '');
354
+ if (name.length >= 2) {
355
+ modules.push(name);
356
+ }
357
+ }
358
+ }
359
+ catch {
360
+ /* invalid JSON */
361
+ }
362
+ return [...new Set(modules)];
363
+ }
364
+ /** 从 Recipe 中提取 codeChanges 引用的文件路径 */
365
+ #extractCodeFiles(recipe) {
366
+ const files = [];
367
+ try {
368
+ const content = JSON.parse(recipe.content || '{}');
369
+ const codeChanges = content.codeChanges;
370
+ if (Array.isArray(codeChanges)) {
371
+ for (const change of codeChanges) {
372
+ if (change.file) {
373
+ files.push(change.file);
374
+ }
375
+ }
376
+ }
377
+ // reasoning.sources 在 content 外层,由下方独立查询处理
378
+ }
379
+ catch {
380
+ /* invalid JSON */
381
+ }
382
+ // 也从 recipe 的 sourceFile 来源引用
383
+ try {
384
+ const row = this.#db
385
+ .prepare(`SELECT reasoning FROM knowledge_entries WHERE id = ?`)
386
+ .get(recipe.id);
387
+ if (row?.reasoning) {
388
+ const reasoning = JSON.parse(row.reasoning);
389
+ if (Array.isArray(reasoning.sources)) {
390
+ for (const src of reasoning.sources) {
391
+ if (typeof src === 'string') {
392
+ files.push(src);
393
+ }
394
+ else if (src?.file) {
395
+ files.push(src.file);
396
+ }
397
+ else if (src?.path) {
398
+ files.push(src.path);
399
+ }
400
+ }
401
+ }
402
+ }
403
+ }
404
+ catch {
405
+ /* invalid JSON */
406
+ }
407
+ return [...new Set(files)];
408
+ }
409
+ /** 执行衰退状态转换 */
410
+ #executeDecay(result) {
411
+ try {
412
+ const now = Date.now();
413
+ switch (result.verdict) {
414
+ case 'dead': {
415
+ // 直接 deprecated,无需观察
416
+ this.#db
417
+ .prepare(`UPDATE knowledge_entries SET lifecycle = 'deprecated', updatedAt = ? WHERE id = ?`)
418
+ .run(now, result.recipeId);
419
+ // 记录已执行的 proposal(审计追溯)
420
+ this.#createProposal({
421
+ targetRecipeId: result.recipeId,
422
+ type: 'deprecate',
423
+ source: 'rescan-relevance-audit',
424
+ status: 'executed',
425
+ description: `[Rescan Relevance Audit] Score: ${result.relevanceScore}. ${result.decayReasons.join('; ')}`,
426
+ evidence: { relevanceScore: result.relevanceScore, evidence: result.evidence },
427
+ expiresAt: now,
428
+ });
429
+ this.#logger.info(`[RecipeRelevanceAuditor] DEAD: "${result.title}" → deprecated (score: ${result.relevanceScore})`);
430
+ return true;
431
+ }
432
+ case 'severe': {
433
+ // 加速衰退:3 天观察窗口
434
+ this.#db
435
+ .prepare(`UPDATE knowledge_entries SET lifecycle = 'decaying', updatedAt = ? WHERE id = ?`)
436
+ .run(now, result.recipeId);
437
+ this.#createProposal({
438
+ targetRecipeId: result.recipeId,
439
+ type: 'deprecate',
440
+ source: 'rescan-relevance-audit',
441
+ status: 'observing',
442
+ description: `[Rescan Relevance Audit] Score: ${result.relevanceScore}. ${result.decayReasons.join('; ')}`,
443
+ evidence: { relevanceScore: result.relevanceScore, evidence: result.evidence },
444
+ expiresAt: now + GRACE_PERIOD_SEVERE,
445
+ });
446
+ this.#logger.info(`[RecipeRelevanceAuditor] SEVERE: "${result.title}" → decaying (3d grace, score: ${result.relevanceScore})`);
447
+ return true;
448
+ }
449
+ case 'decay': {
450
+ // 加速衰退:7 天观察窗口
451
+ this.#db
452
+ .prepare(`UPDATE knowledge_entries SET lifecycle = 'decaying', updatedAt = ? WHERE id = ?`)
453
+ .run(now, result.recipeId);
454
+ this.#createProposal({
455
+ targetRecipeId: result.recipeId,
456
+ type: 'deprecate',
457
+ source: 'rescan-relevance-audit',
458
+ status: 'observing',
459
+ description: `[Rescan Relevance Audit] Score: ${result.relevanceScore}. ${result.decayReasons.join('; ')}`,
460
+ evidence: { relevanceScore: result.relevanceScore, evidence: result.evidence },
461
+ expiresAt: now + GRACE_PERIOD_DECAY,
462
+ });
463
+ this.#logger.info(`[RecipeRelevanceAuditor] DECAY: "${result.title}" → decaying (7d grace, score: ${result.relevanceScore})`);
464
+ return true;
465
+ }
466
+ default:
467
+ return false;
468
+ }
469
+ }
470
+ catch (err) {
471
+ const msg = err instanceof Error ? err.message : String(err);
472
+ this.#logger.warn(`[RecipeRelevanceAuditor] executeDecay failed for ${result.recipeId}: ${msg}`);
473
+ return false;
474
+ }
475
+ }
476
+ /** 创建 evolution proposal */
477
+ #createProposal(input) {
478
+ try {
479
+ const id = `ep-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
480
+ this.#db
481
+ .prepare(`INSERT INTO evolution_proposals
482
+ (id, type, target_recipe_id, related_recipe_ids, confidence, source,
483
+ description, evidence, status, proposed_at, expires_at)
484
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
485
+ .run(id, input.type, input.targetRecipeId, '[]', 0.95, input.source, input.description, JSON.stringify([input.evidence]), input.status, Date.now(), input.expiresAt);
486
+ }
487
+ catch (err) {
488
+ const msg = err instanceof Error ? err.message : String(err);
489
+ this.#logger.warn(`[RecipeRelevanceAuditor] createProposal failed: ${msg}`);
490
+ }
491
+ }
492
+ }
@@ -0,0 +1,44 @@
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
+ import type { ProposalSource } from '../../repository/evolution/ProposalRepository.js';
14
+ /** 最小 DI 容器接口 — 兼容 ServiceContainer / McpServiceContainer / ToolHandlerContext.container */
15
+ interface MinimalContainer {
16
+ get(name: string): unknown;
17
+ }
18
+ export interface SupersedeInput {
19
+ /** 被替代的旧 Recipe ID */
20
+ oldRecipeId: string;
21
+ /** 新提交的 Recipe ID 列表 */
22
+ newRecipeIds: string[];
23
+ /** 来源标识:'ide-agent' | 'metabolism' | 'decay-scan' */
24
+ source?: ProposalSource;
25
+ /** 置信度,默认 0.8 */
26
+ confidence?: number;
27
+ }
28
+ export interface SupersedeResult {
29
+ proposalId: string;
30
+ type: 'supersede';
31
+ targetRecipe: {
32
+ id: string;
33
+ };
34
+ status: string;
35
+ expiresAt: number;
36
+ message: string;
37
+ }
38
+ /**
39
+ * 在 DI 容器中查找 ProposalRepository,验证旧 Recipe 存在后创建 supersede 提案。
40
+ *
41
+ * @returns SupersedeResult(成功)| null(ProposalRepo 不可用 / 旧 Recipe 不存在 / 去重拒绝)
42
+ */
43
+ export declare function createSupersedeProposal(container: MinimalContainer, input: SupersedeInput): SupersedeResult | null;
44
+ export {};