autosnippet 3.3.4 → 3.3.6

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 (221) hide show
  1. package/README.md +174 -83
  2. package/config/constitution.yaml +2 -0
  3. package/dashboard/dist/assets/icons-D1aVZYFW.js +1 -0
  4. package/dashboard/dist/assets/index-CxHOu8Hd.css +1 -0
  5. package/dashboard/dist/assets/index-DDdAOpYT.js +128 -0
  6. package/dashboard/dist/index.html +3 -3
  7. package/dist/bin/api-server.js +1 -0
  8. package/dist/bin/cli.d.ts +1 -0
  9. package/dist/bin/cli.js +136 -9
  10. package/dist/lib/agent/AgentFactory.d.ts +0 -17
  11. package/dist/lib/agent/AgentFactory.js +1 -25
  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/insight-analyst.d.ts +47 -3
  18. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  19. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  20. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  21. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  22. package/dist/lib/agent/domain/insight-gate.js +41 -0
  23. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  24. package/dist/lib/agent/domain/insight-producer.js +60 -5
  25. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  26. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  27. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  28. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  29. package/dist/lib/agent/memory/SessionStore.js +9 -15
  30. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  31. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  32. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  33. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  34. package/dist/lib/agent/presets.d.ts +89 -1
  35. package/dist/lib/agent/presets.js +53 -5
  36. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  37. package/dist/lib/agent/tools/_shared.js +20 -21
  38. package/dist/lib/agent/tools/composite.d.ts +25 -22
  39. package/dist/lib/agent/tools/composite.js +108 -109
  40. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  41. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  42. package/dist/lib/agent/tools/index.d.ts +163 -92
  43. package/dist/lib/agent/tools/index.js +9 -1
  44. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  45. package/dist/lib/agent/tools/lifecycle.js +59 -75
  46. package/dist/lib/cli/AiScanService.js +1 -1
  47. package/dist/lib/cli/KnowledgeSyncService.d.ts +5 -1
  48. package/dist/lib/cli/KnowledgeSyncService.js +6 -3
  49. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  50. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  51. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  52. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  53. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  54. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  55. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  56. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  57. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  58. package/dist/lib/domain/dimension/index.d.ts +10 -0
  59. package/dist/lib/domain/dimension/index.js +9 -0
  60. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  61. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  62. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +33 -111
  63. package/dist/lib/domain/knowledge/KnowledgeEntry.js +27 -6
  64. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  65. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  66. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  67. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  68. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  69. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  70. package/dist/lib/domain/knowledge/values/Stats.d.ts +1 -1
  71. package/dist/lib/domain/knowledge/values/Stats.js +2 -2
  72. package/dist/lib/external/mcp/McpServer.js +4 -0
  73. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  74. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  75. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  76. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  77. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  78. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  79. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  80. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  81. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  82. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  83. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  84. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  85. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  86. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +172 -161
  87. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  88. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  89. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  90. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  91. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  92. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  93. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  94. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  95. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  96. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  97. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  98. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  99. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  100. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  101. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  102. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  103. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  104. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +14 -10
  105. package/dist/lib/external/mcp/handlers/bootstrap-external.js +39 -51
  106. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  107. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +115 -82
  108. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  109. package/dist/lib/external/mcp/handlers/consolidated.js +115 -162
  110. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +69 -1
  111. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  112. package/dist/lib/external/mcp/handlers/evolve-external.js +226 -0
  113. package/dist/lib/external/mcp/handlers/knowledge.js +26 -2
  114. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  115. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  116. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  117. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  118. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  119. package/dist/lib/external/mcp/handlers/search.js +6 -5
  120. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  121. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  122. package/dist/lib/external/mcp/tools.d.ts +8 -18
  123. package/dist/lib/external/mcp/tools.js +60 -3
  124. package/dist/lib/http/routes/knowledge.js +122 -1
  125. package/dist/lib/http/routes/modules.js +25 -3
  126. package/dist/lib/http/routes/panorama.js +16 -4
  127. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  128. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  129. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  130. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  131. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  132. package/dist/lib/injection/ServiceContainer.js +55 -0
  133. package/dist/lib/injection/ServiceMap.d.ts +8 -1
  134. package/dist/lib/injection/modules/InfraModule.js +4 -1
  135. package/dist/lib/injection/modules/KnowledgeModule.js +38 -1
  136. package/dist/lib/repository/evolution/ProposalRepository.d.ts +99 -0
  137. package/dist/lib/repository/evolution/ProposalRepository.js +255 -0
  138. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  139. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  140. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  141. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  142. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  143. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  144. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +22 -4
  145. package/dist/lib/service/bootstrap/UiStartupTasks.js +73 -5
  146. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  147. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  148. package/dist/lib/service/cleanup/CleanupService.d.ts +85 -0
  149. package/dist/lib/service/cleanup/CleanupService.js +324 -0
  150. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  151. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  152. package/dist/lib/service/delivery/FileProtection.js +54 -0
  153. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  154. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  155. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  156. package/dist/lib/service/evolution/DecayDetector.d.ts +4 -3
  157. package/dist/lib/service/evolution/DecayDetector.js +97 -22
  158. package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +4 -2
  159. package/dist/lib/service/evolution/KnowledgeMetabolism.js +29 -2
  160. package/dist/lib/service/evolution/ProposalExecutor.d.ts +66 -0
  161. package/dist/lib/service/evolution/ProposalExecutor.js +424 -0
  162. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  163. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  164. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  165. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  166. package/dist/lib/service/evolution/StagingManager.js +5 -3
  167. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  168. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  169. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  170. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  171. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  172. package/dist/lib/service/guard/GuardCrossFileChecks.js +2 -0
  173. package/dist/lib/service/guard/ReverseGuard.d.ts +1 -1
  174. package/dist/lib/service/guard/ReverseGuard.js +32 -2
  175. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  176. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  177. package/dist/lib/service/knowledge/KnowledgeService.js +44 -4
  178. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  179. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  180. package/dist/lib/service/knowledge/SourceRefReconciler.d.ts +2 -0
  181. package/dist/lib/service/knowledge/SourceRefReconciler.js +48 -0
  182. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +3 -2
  183. package/dist/lib/service/panorama/DimensionAnalyzer.js +15 -140
  184. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  185. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  186. package/dist/lib/service/search/SearchEngine.js +38 -36
  187. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  188. package/dist/lib/service/search/SearchTypes.js +1 -1
  189. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  190. package/dist/lib/service/search/tokenizer.js +2 -2
  191. package/dist/lib/shared/schemas/common.d.ts +4 -4
  192. package/dist/lib/shared/schemas/http-requests.d.ts +12 -1
  193. package/dist/lib/shared/schemas/http-requests.js +8 -0
  194. package/dist/lib/shared/schemas/mcp-tools.d.ts +33 -2
  195. package/dist/lib/shared/schemas/mcp-tools.js +42 -0
  196. package/dist/lib/types/evolution.d.ts +135 -0
  197. package/dist/lib/types/evolution.js +6 -0
  198. package/dist/lib/types/graph-shared.d.ts +25 -0
  199. package/dist/lib/types/graph-shared.js +7 -0
  200. package/dist/lib/types/knowledge-wire.d.ts +131 -0
  201. package/dist/lib/types/knowledge-wire.js +7 -0
  202. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  203. package/dist/lib/types/project-snapshot-builder.js +189 -0
  204. package/dist/lib/types/project-snapshot.d.ts +399 -0
  205. package/dist/lib/types/project-snapshot.js +17 -0
  206. package/dist/lib/types/search-wire.d.ts +46 -0
  207. package/dist/lib/types/search-wire.js +7 -0
  208. package/dist/lib/types/snapshot-views.d.ts +58 -0
  209. package/dist/lib/types/snapshot-views.js +103 -0
  210. package/package.json +1 -1
  211. package/skills/autosnippet-recipes/SKILL.md +1 -1
  212. package/templates/instructions/agent-static.md +2 -0
  213. package/templates/instructions/conventions.md +3 -1
  214. package/templates/recipes-setup/README.md +2 -2
  215. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  216. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  217. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  218. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  219. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  220. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  221. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module BM25Scorer
8
8
  */
9
- import type { BM25Document, BM25SearchResult, Scorer } from './SearchTypes.js';
9
+ import type { BM25Document, Scorer } from './SearchTypes.js';
10
10
  /** BM25 评分器 */
11
11
  export declare class BM25Scorer implements Scorer {
12
12
  _idIndex: Map<string, number>;
@@ -31,7 +31,7 @@ export declare class BM25Scorer implements Scorer {
31
31
  /** 压缩 documents 数组,清除 tombstone 空洞 */
32
32
  _compact(): void;
33
33
  /** 查询文档,返回按 BM25 分数排序的结果 */
34
- search(query: string, limit?: number): BM25SearchResult[];
34
+ search(query: string, limit?: number): import("./SearchTypes.js").ScorerResult[];
35
35
  /** 清空索引 */
36
36
  clear(): void;
37
37
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * SearchEngine - 统一搜索引擎
3
3
  *
4
- * 三级搜索策略: keyword → BM25 ranking → semantic(可选)
4
+ * 三级搜索策略: keyword → FieldWeighted ranking → semantic(可选)
5
5
  * 从 V1 SearchServiceV2 迁移,适配 V2 架构
6
6
  */
7
7
  import Logger from '../../infrastructure/logging/Logger.js';
@@ -10,7 +10,7 @@ import { MultiSignalRanker } from './MultiSignalRanker.js';
10
10
  import type { DbRow, RankingContext, Scorer, SearchAiProvider, SearchCrossEncoder, SearchDb, SearchEngineOptions, SearchHybridRetriever, SearchOptions, SearchResponse, SearchResultItem, SearchVectorService, SearchVectorStore } from './SearchTypes.js';
11
11
  export { BM25Scorer } from './BM25Scorer.js';
12
12
  export { FieldWeightedScorer } from './FieldWeightedScorer.js';
13
- export type { BM25DocMeta, BM25SearchResult, DbRow, RankingContext, RrfHit, Scorer, SearchAiProvider, SearchCrossEncoder, SearchDb, SearchEngineOptions, SearchHybridRetriever, SearchOptions, SearchResponse, SearchResultItem, SearchVectorService, SearchVectorStore, SlimSearchResult, VectorHit, } from './SearchTypes.js';
13
+ export type { BM25DocMeta, DbRow, DocMeta, RankingContext, RrfHit, Scorer, ScorerResult, SearchAiProvider, SearchCrossEncoder, SearchDb, SearchEngineOptions, SearchHybridRetriever, SearchOptions, SearchResponse, SearchResultItem, SearchVectorService, SearchVectorStore, SlimSearchResult, VectorHit, } from './SearchTypes.js';
14
14
  export { groupByKind, slimSearchResult } from './SearchTypes.js';
15
15
  export { tokenize } from './tokenizer.js';
16
16
  /**
@@ -97,18 +97,18 @@ export declare class SearchEngine {
97
97
  /**
98
98
  * 关键词搜索 - 直接 SQL LIKE
99
99
  * 返回包含 kind 字段的完整结果,使用 ESCAPE 防止通配符注入
100
- * 当 SQL LIKE 无结果时,降级到 BM25 搜索以提升自然语言查询的召回率
100
+ * 当 SQL LIKE 无结果时,降级到 FieldWeighted 搜索以提升自然语言查询的召回率
101
101
  */
102
102
  _keywordSearch(query: string, type: string, limit: number): SearchResultItem[];
103
103
  /**
104
- * BM25 排序搜索
104
+ * 加权字段搜索(FieldWeightedScorer)
105
105
  * 增加 Title/Trigger 精确匹配 bonus — 当 query 出现在标题/触发词中时
106
- * 给予额外 BM25 分数加成,确保精确匹配的条目排名靠前
106
+ * 给予额外分数加成,确保精确匹配的条目排名靠前
107
107
  */
108
- _bm25Search(query: string, type: string, limit: number): SearchResultItem[];
108
+ _scorerSearch(query: string, type: string, limit: number): SearchResultItem[];
109
109
  /**
110
110
  * 语义搜索 - 需要 AI Provider 的 embed 功能
111
- * 降级到 BM25 如果 AI 不可用
111
+ * 不可用时降级到 FieldWeighted 搜索
112
112
  * @returns >}
113
113
  */
114
114
  _semanticSearch(query: string, type: string, limit: number): Promise<{
@@ -117,7 +117,7 @@ export declare class SearchEngine {
117
117
  }>;
118
118
  /**
119
119
  * 补充详细字段(content / description / trigger / delivery 字段)— 批量 IN 查询
120
- * 用于向量搜索结果与 BM25 结果的一致性
120
+ * 用于向量搜索结果与 FieldWeighted 结果的一致性
121
121
  */
122
122
  _supplementDetails(items: SearchResultItem[]): void;
123
123
  /**
@@ -138,9 +138,10 @@ export declare class SearchEngine {
138
138
  /**
139
139
  * 从 DB 行构建索引文本
140
140
  *
141
- * 使用 BM25F 思想:高价值字段(title, trigger)重复出现以提升 TF 权重
141
+ * 高价值字段(title, trigger)通过重复出现提升 TF 权重
142
142
  * — title ×3, trigger ×2, description ×1.5(通过重复 token 实现)
143
- * 这确保标题匹配的文档获得显著更高的 BM25 分数
143
+ * 这确保标题匹配的文档获得显著更高的分数
144
+ * 注:此逻辑主要服务于 BM25Scorer,FieldWeightedScorer 内部已有字段权重机制
144
145
  */
145
146
  _buildDocText(r: DbRow): string;
146
147
  /**
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * SearchEngine - 统一搜索引擎
3
3
  *
4
- * 三级搜索策略: keyword → BM25 ranking → semantic(可选)
4
+ * 三级搜索策略: keyword → FieldWeighted ranking → semantic(可选)
5
5
  * 从 V1 SearchServiceV2 迁移,适配 V2 架构
6
6
  */
7
7
  import Logger from '../../infrastructure/logging/Logger.js';
@@ -129,22 +129,22 @@ export class SearchEngine {
129
129
  let actualMode = mode;
130
130
  switch (mode) {
131
131
  case 'auto': {
132
- // 缓存 BM25 结果, 避免 RRF 降级时重复计算
133
- let cachedBm25Items = null;
134
- const getBm25 = () => {
135
- if (!cachedBm25Items) {
136
- cachedBm25Items = this._bm25Search(query, type, recallLimit);
132
+ // 缓存 FieldWeighted 结果, 避免 RRF 降级时重复计算
133
+ let cachedScorerItems = null;
134
+ const getScorerResults = () => {
135
+ if (!cachedScorerItems) {
136
+ cachedScorerItems = this._scorerSearch(query, type, recallLimit);
137
137
  }
138
- return cachedBm25Items;
138
+ return cachedScorerItems;
139
139
  };
140
140
  // 优先使用 VectorService 的 hybridSearch (统一 RRF 融合)
141
141
  if (this.vectorService) {
142
142
  try {
143
- const bm25Items = getBm25();
143
+ const sparseItems = getScorerResults();
144
144
  const rrfResults = await this.vectorService.hybridSearch(query, {
145
145
  topK: recallLimit,
146
146
  alpha: this._fusionSemanticWeight,
147
- sparseSearchFn: () => bm25Items,
147
+ sparseSearchFn: () => sparseItems,
148
148
  });
149
149
  if (rrfResults.length > 0) {
150
150
  results = rrfResults.map((r) => {
@@ -178,15 +178,16 @@ export class SearchEngine {
178
178
  // VectorService RRF 失败, 降级到 min-max 融合
179
179
  }
180
180
  }
181
- // 降级: VectorService 不可用或 RRF 零结果 → 纯 BM25
181
+ // 降级: VectorService 不可用或 RRF 零结果 → 纯 FieldWeighted
182
182
  // 旧版在此做 BM25+semantic min-max 融合,但当 VectorService 不可用时
183
- // semantic 通常也会失败,最终退化为纯 BM25。简化为直接走 BM25
184
- results = getBm25();
185
- actualMode = 'auto(bm25-only)';
183
+ // semantic 通常也会失败,最终退化为纯 FieldWeighted。简化为直接走 scorer
184
+ results = getScorerResults();
185
+ actualMode = 'auto(weighted-only)';
186
186
  break;
187
187
  }
188
+ case 'weighted':
188
189
  case 'bm25':
189
- results = this._bm25Search(query, type, recallLimit);
190
+ results = this._scorerSearch(query, type, recallLimit);
190
191
  break;
191
192
  case 'semantic': {
192
193
  const semResult = await this._semanticSearch(query, type, recallLimit);
@@ -300,7 +301,7 @@ export class SearchEngine {
300
301
  /**
301
302
  * 关键词搜索 - 直接 SQL LIKE
302
303
  * 返回包含 kind 字段的完整结果,使用 ESCAPE 防止通配符注入
303
- * 当 SQL LIKE 无结果时,降级到 BM25 搜索以提升自然语言查询的召回率
304
+ * 当 SQL LIKE 无结果时,降级到 FieldWeighted 搜索以提升自然语言查询的召回率
304
305
  */
305
306
  _keywordSearch(query, type, limit) {
306
307
  const results = [];
@@ -351,23 +352,23 @@ export class SearchEngine {
351
352
  /* table may not exist */
352
353
  }
353
354
  }
354
- // 补充排序信号字段(whenClause/doClause/tags 等),与 BM25/semantic 路径一致
355
+ // 补充排序信号字段(whenClause/doClause/tags 等),与 scorer/semantic 路径一致
355
356
  this._supplementDetails(results);
356
- // 当 SQL LIKE 无结果时,降级到 BM25 搜索
357
+ // 当 SQL LIKE 无结果时,降级到 FieldWeighted 搜索
357
358
  // 这让自然语言查询(如 "如何处理网络错误")在 keyword 模式下也能返回结果
358
359
  if (results.length === 0) {
359
360
  this.ensureIndex();
360
- const bm25Results = this._bm25Search(query, type, limit);
361
- return bm25Results;
361
+ const scorerResults = this._scorerSearch(query, type, limit);
362
+ return scorerResults;
362
363
  }
363
364
  return results.slice(0, limit);
364
365
  }
365
366
  /**
366
- * BM25 排序搜索
367
+ * 加权字段搜索(FieldWeightedScorer)
367
368
  * 增加 Title/Trigger 精确匹配 bonus — 当 query 出现在标题/触发词中时
368
- * 给予额外 BM25 分数加成,确保精确匹配的条目排名靠前
369
+ * 给予额外分数加成,确保精确匹配的条目排名靠前
369
370
  */
370
- _bm25Search(query, type, limit) {
371
+ _scorerSearch(query, type, limit) {
371
372
  let results = this.scorer.search(query, limit * 2);
372
373
  if (type !== 'all') {
373
374
  // All types now map to 'recipe' since everything is unified
@@ -379,7 +380,7 @@ export class SearchEngine {
379
380
  });
380
381
  }
381
382
  // ── Title/Trigger exact-match bonus ──
382
- // 当 query 精确出现在标题或触发词中时,增加 BM25 分数
383
+ // 当 query 精确出现在标题或触发词中时,增加分数
383
384
  // 这解决了 "BaseRequest" 被 "BD前缀类名命名规范" 排在 "BDBaseRequest 继承请求模式" 前面的问题
384
385
  const lowerQuery = query.toLowerCase();
385
386
  const maxScore = results.length > 0 ? results[0].score : 1;
@@ -432,7 +433,7 @@ export class SearchEngine {
432
433
  }
433
434
  /**
434
435
  * 语义搜索 - 需要 AI Provider 的 embed 功能
435
- * 降级到 BM25 如果 AI 不可用
436
+ * 不可用时降级到 FieldWeighted 搜索
436
437
  * @returns >}
437
438
  */
438
439
  async _semanticSearch(query, type, limit) {
@@ -474,13 +475,13 @@ export class SearchEngine {
474
475
  }
475
476
  // Legacy fallback: 直接使用 aiProvider embed + vectorStore
476
477
  if (!this.aiProvider) {
477
- this.logger.debug('AI provider not available, falling back to BM25');
478
- return { items: this._bm25Search(query, type, limit), actualMode: 'bm25' };
478
+ this.logger.debug('AI provider not available, falling back to FieldWeighted search');
479
+ return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
479
480
  }
480
481
  try {
481
482
  const queryEmbedding = await this.aiProvider.embed(query);
482
483
  if (!queryEmbedding || queryEmbedding.length === 0) {
483
- return { items: this._bm25Search(query, type, limit), actualMode: 'bm25' };
484
+ return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
484
485
  }
485
486
  if (this.vectorStore) {
486
487
  try {
@@ -523,24 +524,24 @@ export class SearchEngine {
523
524
  }
524
525
  }
525
526
  catch (vecErr) {
526
- this.logger.warn('Vector store query failed, falling back to BM25', {
527
+ this.logger.warn('Vector store query failed, falling back to FieldWeighted', {
527
528
  error: vecErr.message,
528
529
  });
529
530
  }
530
531
  }
531
- this.logger.debug('Vector search fallback to BM25');
532
- return { items: this._bm25Search(query, type, limit), actualMode: 'bm25' };
532
+ this.logger.debug('Vector search fallback to FieldWeighted');
533
+ return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
533
534
  }
534
535
  catch (err) {
535
- this.logger.warn('Semantic search failed, falling back to BM25', {
536
+ this.logger.warn('Semantic search failed, falling back to FieldWeighted', {
536
537
  error: err.message,
537
538
  });
538
- return { items: this._bm25Search(query, type, limit), actualMode: 'bm25' };
539
+ return { items: this._scorerSearch(query, type, limit), actualMode: 'weighted' };
539
540
  }
540
541
  }
541
542
  /**
542
543
  * 补充详细字段(content / description / trigger / delivery 字段)— 批量 IN 查询
543
- * 用于向量搜索结果与 BM25 结果的一致性
544
+ * 用于向量搜索结果与 FieldWeighted 结果的一致性
544
545
  */
545
546
  _supplementDetails(items) {
546
547
  if (!items || items.length === 0) {
@@ -730,9 +731,10 @@ export class SearchEngine {
730
731
  /**
731
732
  * 从 DB 行构建索引文本
732
733
  *
733
- * 使用 BM25F 思想:高价值字段(title, trigger)重复出现以提升 TF 权重
734
+ * 高价值字段(title, trigger)通过重复出现提升 TF 权重
734
735
  * — title ×3, trigger ×2, description ×1.5(通过重复 token 实现)
735
- * 这确保标题匹配的文档获得显著更高的 BM25 分数
736
+ * 这确保标题匹配的文档获得显著更高的分数
737
+ * 注:此逻辑主要服务于 BM25Scorer,FieldWeightedScorer 内部已有字段权重机制
736
738
  */
737
739
  _buildDocText(r) {
738
740
  let contentText = '';
@@ -752,7 +754,7 @@ export class SearchEngine {
752
754
  catch {
753
755
  /* ignore */
754
756
  }
755
- // BM25F field boosting via token repetition:
757
+ // Field boosting via token repetition:
756
758
  // title ×2, trigger ×2, description ×1, others ×1
757
759
  // 使用较温和的 boost 避免长文档 avgLength 膨胀导致 content 匹配被过度稀释
758
760
  const title = r.title || '';
@@ -2,26 +2,30 @@
2
2
  * SearchTypes — SearchEngine 共享类型定义
3
3
  *
4
4
  * 从 SearchEngine.ts 提取的所有接口和类型,
5
- * 供 SearchEngine、BM25Scorer 及测试文件独立消费。
5
+ * 供 SearchEngine、FieldWeightedScorer、BM25Scorer 及测试文件独立消费。
6
6
  *
7
7
  * @module SearchTypes
8
8
  */
9
- /** Internal BM25 document representation */
10
- export interface BM25Document {
9
+ /** Internal scorer document representation */
10
+ export interface ScorerDocument {
11
11
  id: string;
12
12
  tokens: string[];
13
13
  tokenFreq: Record<string, number>;
14
14
  length: number;
15
15
  meta: Record<string, unknown>;
16
16
  }
17
- /** BM25 search result */
18
- export interface BM25SearchResult {
17
+ /** Scorer search result */
18
+ export interface ScorerResult {
19
19
  id: string;
20
20
  score: number;
21
21
  meta: Record<string, unknown>;
22
22
  }
23
+ /** @deprecated Use ScorerDocument */
24
+ export type BM25Document = ScorerDocument;
25
+ /** @deprecated Use ScorerResult */
26
+ export type BM25SearchResult = ScorerResult;
23
27
  /**
24
- * Scorer 通用接口 — BM25Scorer 与 FieldWeightedScorer 共同实现
28
+ * Scorer 通用接口 — FieldWeightedScorer(默认)与 BM25Scorer 共同实现
25
29
  *
26
30
  * SearchEngine 通过此接口与具体评分器解耦,可在运行时切换。
27
31
  */
@@ -36,11 +40,11 @@ export interface Scorer {
36
40
  removeDocument(id: string): boolean;
37
41
  updateDocument(id: string, text: string, meta: Record<string, unknown>): void;
38
42
  hasDocument(id: string): boolean;
39
- search(query: string, limit?: number): BM25SearchResult[];
43
+ search(query: string, limit?: number): ScorerResult[];
40
44
  clear(): void;
41
45
  }
42
46
  /** Meta structure produced by _buildDocMeta */
43
- export interface BM25DocMeta {
47
+ export interface DocMeta {
44
48
  type: string;
45
49
  title: string;
46
50
  trigger: string;
@@ -58,6 +62,8 @@ export interface BM25DocMeta {
58
62
  qualityScore: number;
59
63
  [key: string]: unknown;
60
64
  }
65
+ /** @deprecated Use DocMeta */
66
+ export type BM25DocMeta = DocMeta;
61
67
  /** Unified search result item flowing through the ranking pipeline */
62
68
  export interface SearchResultItem {
63
69
  id: string;
@@ -2,7 +2,7 @@
2
2
  * SearchTypes — SearchEngine 共享类型定义
3
3
  *
4
4
  * 从 SearchEngine.ts 提取的所有接口和类型,
5
- * 供 SearchEngine、BM25Scorer 及测试文件独立消费。
5
+ * 供 SearchEngine、FieldWeightedScorer、BM25Scorer 及测试文件独立消费。
6
6
  *
7
7
  * @module SearchTypes
8
8
  */
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module tokenizer
8
8
  */
9
- /** BM25 调参常量 */
9
+ /** 评分调参常量(原 BM25 k1/b 参数,BM25Scorer 仍在使用) */
10
10
  export declare const BM25_K1 = 1.2;
11
11
  export declare const BM25_B = 0.75;
12
12
  /**
@@ -6,11 +6,11 @@
6
6
  *
7
7
  * @module tokenizer
8
8
  */
9
- /** BM25 调参常量 */
9
+ /** 评分调参常量(原 BM25 k1/b 参数,BM25Scorer 仍在使用) */
10
10
  export const BM25_K1 = 1.2;
11
11
  export const BM25_B = 0.75;
12
12
  /**
13
- * 中文停用词表 — 过滤常见虚词/助词/代词/连词,减少 BM25 噪声
13
+ * 中文停用词表 — 过滤常见虚词/助词/代词/连词,减少搜索噪声
14
14
  * 参考 jieba / Elasticsearch smartcn_stop / 百度停用词表
15
15
  */
16
16
  const CJK_STOPWORDS = new Set([
@@ -25,20 +25,20 @@ export declare const KnowledgeTypeEnum: z.ZodEnum<{
25
25
  "code-pattern": "code-pattern";
26
26
  architecture: "architecture";
27
27
  "best-practice": "best-practice";
28
- "event-and-data-flow": "event-and-data-flow";
28
+ "module-dependency": "module-dependency";
29
+ "boundary-constraint": "boundary-constraint";
29
30
  "code-standard": "code-standard";
30
31
  "code-style": "code-style";
31
32
  "code-relation": "code-relation";
32
- "module-dependency": "module-dependency";
33
- "boundary-constraint": "boundary-constraint";
34
33
  "data-flow": "data-flow";
34
+ "event-and-data-flow": "event-and-data-flow";
35
35
  solution: "solution";
36
36
  "anti-pattern": "anti-pattern";
37
37
  }>;
38
38
  export declare const ComplexityEnum: z.ZodEnum<{
39
39
  intermediate: "intermediate";
40
- beginner: "beginner";
41
40
  advanced: "advanced";
41
+ beginner: "beginner";
42
42
  }>;
43
43
  export declare const ScopeEnum: z.ZodEnum<{
44
44
  universal: "universal";
@@ -63,11 +63,18 @@ export declare const DeprecateKnowledgeBody: z.ZodObject<{
63
63
  export declare const BatchPublishBody: z.ZodObject<{
64
64
  ids: z.ZodArray<z.ZodString>;
65
65
  }, z.core.$strip>;
66
+ export declare const BatchDeleteBody: z.ZodObject<{
67
+ ids: z.ZodArray<z.ZodString>;
68
+ }, z.core.$strip>;
69
+ export declare const BatchDeprecateBody: z.ZodObject<{
70
+ ids: z.ZodArray<z.ZodString>;
71
+ reason: z.ZodOptional<z.ZodString>;
72
+ }, z.core.$strip>;
66
73
  export declare const KnowledgeUsageBody: z.ZodObject<{
67
74
  type: z.ZodDefault<z.ZodEnum<{
75
+ view: "view";
68
76
  feedback: "feedback";
69
77
  adoption: "adoption";
70
- view: "view";
71
78
  }>>;
72
79
  feedback: z.ZodOptional<z.ZodUnknown>;
73
80
  }, z.core.$strip>;
@@ -240,6 +247,10 @@ export declare const ModuleBootstrapBody: z.ZodObject<{
240
247
  skipGuard: z.ZodDefault<z.ZodBoolean>;
241
248
  contentMaxLines: z.ZodDefault<z.ZodNumber>;
242
249
  }, z.core.$strip>;
250
+ export declare const ModuleRescanBody: z.ZodObject<{
251
+ reason: z.ZodOptional<z.ZodString>;
252
+ dimensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
253
+ }, z.core.$strip>;
243
254
  export declare const GraphQuery: z.ZodObject<{
244
255
  nodeId: z.ZodString;
245
256
  nodeType: z.ZodString;
@@ -59,6 +59,10 @@ export const DeprecateKnowledgeBody = z.object({
59
59
  reason: z.string().min(1, 'reason is required'),
60
60
  });
61
61
  export const BatchPublishBody = BatchIds;
62
+ export const BatchDeleteBody = BatchIds;
63
+ export const BatchDeprecateBody = BatchIds.extend({
64
+ reason: z.string().optional(),
65
+ });
62
66
  export const KnowledgeUsageBody = z.object({
63
67
  type: z.enum(['adoption', 'view', 'feedback']).default('adoption'),
64
68
  feedback: z.unknown().optional(),
@@ -236,6 +240,10 @@ export const ModuleBootstrapBody = z.object({
236
240
  skipGuard: z.boolean().default(false),
237
241
  contentMaxLines: z.number().int().min(1).max(10000).default(120),
238
242
  });
243
+ export const ModuleRescanBody = z.object({
244
+ reason: z.string().optional(),
245
+ dimensions: z.array(z.string()).optional(),
246
+ });
239
247
  // ═══ Graph Search ════════════════════════════════
240
248
  export const GraphQuery = z.object({
241
249
  nodeId: z.string().min(1, 'nodeId is required'),
@@ -158,8 +158,8 @@ export declare const SubmitKnowledgeItemSchema: z.ZodObject<{
158
158
  topicHint: z.ZodOptional<z.ZodString>;
159
159
  complexity: z.ZodOptional<z.ZodEnum<{
160
160
  intermediate: "intermediate";
161
- beginner: "beginner";
162
161
  advanced: "advanced";
162
+ beginner: "beginner";
163
163
  }>>;
164
164
  scope: z.ZodOptional<z.ZodEnum<{
165
165
  universal: "universal";
@@ -183,6 +183,7 @@ export declare const SubmitKnowledgeInput: z.ZodObject<{
183
183
  skipDuplicateCheck: z.ZodDefault<z.ZodBoolean>;
184
184
  client_id: z.ZodOptional<z.ZodString>;
185
185
  dimensionId: z.ZodOptional<z.ZodString>;
186
+ supersedes: z.ZodOptional<z.ZodString>;
186
187
  }, z.core.$strip>;
187
188
  export type SubmitKnowledgeInput = z.infer<typeof SubmitKnowledgeInput>;
188
189
  export declare const SkillInput: z.ZodObject<{
@@ -190,8 +191,8 @@ export declare const SkillInput: z.ZodObject<{
190
191
  delete: "delete";
191
192
  create: "create";
192
193
  update: "update";
193
- list: "list";
194
194
  load: "load";
195
+ list: "list";
195
196
  suggest: "suggest";
196
197
  }>;
197
198
  name: z.ZodOptional<z.ZodString>;
@@ -210,6 +211,11 @@ export declare const SkillInput: z.ZodObject<{
210
211
  export type SkillInput = z.infer<typeof SkillInput>;
211
212
  export declare const BootstrapInput: z.ZodObject<{}, z.core.$strip>;
212
213
  export type BootstrapInput = z.infer<typeof BootstrapInput>;
214
+ export declare const RescanInput: z.ZodObject<{
215
+ dimensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
216
+ reason: z.ZodOptional<z.ZodString>;
217
+ }, z.core.$strip>;
218
+ export type RescanInput = z.infer<typeof RescanInput>;
213
219
  export declare const DimensionCompleteInput: z.ZodObject<{
214
220
  sessionId: z.ZodOptional<z.ZodString>;
215
221
  dimensionId: z.ZodString;
@@ -289,4 +295,29 @@ export declare const PanoramaInput: z.ZodObject<{
289
295
  module: z.ZodOptional<z.ZodString>;
290
296
  }, z.core.$strip>;
291
297
  export type PanoramaInput = z.infer<typeof PanoramaInput>;
298
+ export declare const EvolveInput: z.ZodObject<{
299
+ decisions: z.ZodArray<z.ZodObject<{
300
+ recipeId: z.ZodString;
301
+ action: z.ZodEnum<{
302
+ propose_evolution: "propose_evolution";
303
+ confirm_deprecation: "confirm_deprecation";
304
+ skip: "skip";
305
+ }>;
306
+ evidence: z.ZodOptional<z.ZodObject<{
307
+ codeSnippet: z.ZodString;
308
+ filePath: z.ZodString;
309
+ type: z.ZodEnum<{
310
+ enhance: "enhance";
311
+ correction: "correction";
312
+ }>;
313
+ suggestedChanges: z.ZodString;
314
+ }, z.core.$strip>>;
315
+ reason: z.ZodOptional<z.ZodString>;
316
+ skipReason: z.ZodOptional<z.ZodEnum<{
317
+ still_valid: "still_valid";
318
+ insufficient_info: "insufficient_info";
319
+ }>>;
320
+ }, z.core.$strip>>;
321
+ }, z.core.$strip>;
322
+ export type EvolveInput = z.infer<typeof EvolveInput>;
292
323
  export declare const TOOL_SCHEMAS: Record<string, z.ZodType>;
@@ -173,6 +173,10 @@ export const SubmitKnowledgeInput = z.object({
173
173
  skipDuplicateCheck: z.boolean().default(false),
174
174
  client_id: z.string().optional(),
175
175
  dimensionId: z.string().optional().describe('冷启动关联维度 ID'),
176
+ supersedes: z
177
+ .string()
178
+ .optional()
179
+ .describe('声明新 Recipe 替代旧 Recipe 的 ID。提交后系统将创建 supersede 提案,观察窗口内对比新旧表现后自动执行。'),
176
180
  });
177
181
  // ══════════════════════════════════════════════════════
178
182
  // 10. autosnippet_skill
@@ -194,6 +198,13 @@ export const SkillInput = z.object({
194
198
  // ══════════════════════════════════════════════════════
195
199
  export const BootstrapInput = z.object({});
196
200
  // ══════════════════════════════════════════════════════
201
+ // 11a. autosnippet_rescan — 增量知识更新
202
+ // ══════════════════════════════════════════════════════
203
+ export const RescanInput = z.object({
204
+ dimensions: z.array(z.string()).optional().describe('指定维度列表,空 = 全部活跃维度'),
205
+ reason: z.string().optional().describe('触发原因(记录到报告)'),
206
+ });
207
+ // ══════════════════════════════════════════════════════
197
208
  // 11b. autosnippet_dimension_complete
198
209
  // ══════════════════════════════════════════════════════
199
210
  export const DimensionCompleteInput = z.object({
@@ -294,6 +305,35 @@ export const PanoramaInput = z.object({
294
305
  .describe('overview=项目骨架+层级+模块角色 | module=单模块详情+邻居关系 | gaps=知识空白区 | health=全景健康度 | governance_cycle=新陈代谢完整周期 | decay_report=衰退报告 | staging_check=staging检查+自动发布 | enhancement_suggestions=增强建议'),
295
306
  module: z.string().optional().describe('模块名称(operation=module 时必填)'),
296
307
  });
308
+ // 19. autosnippet_evolve
309
+ const EvolveDecisionSchema = z.object({
310
+ recipeId: z.string().describe('目标 Recipe ID'),
311
+ action: z
312
+ .enum(['propose_evolution', 'confirm_deprecation', 'skip'])
313
+ .describe('propose_evolution=提案进化 | confirm_deprecation=确认废弃 | skip=跳过'),
314
+ evidence: z
315
+ .object({
316
+ codeSnippet: z.string().describe('读到的真实代码片段'),
317
+ filePath: z.string().describe('代码所在文件路径'),
318
+ type: z
319
+ .enum(['enhance', 'correction'])
320
+ .describe('enhance=模式迁移/功能扩展 | correction=描述错误/接口变更'),
321
+ suggestedChanges: z.string().describe('建议的内容变更'),
322
+ })
323
+ .optional()
324
+ .describe('propose_evolution 时必填'),
325
+ reason: z.string().optional().describe('confirm_deprecation 时必填,废弃原因'),
326
+ skipReason: z
327
+ .enum(['still_valid', 'insufficient_info'])
328
+ .optional()
329
+ .describe('skip 时必填: still_valid=仍然有效(刷新验证时间) | insufficient_info=信息不足'),
330
+ });
331
+ export const EvolveInput = z.object({
332
+ decisions: z
333
+ .array(EvolveDecisionSchema)
334
+ .min(1)
335
+ .describe('进化决策数组,每个元素对应一个 Recipe 的决策'),
336
+ });
297
337
  // ══════════════════════════════════════════════════════
298
338
  // 工具名 → Schema 映射表(用于 wrapHandler 自动注入校验)
299
339
  // ══════════════════════════════════════════════════════
@@ -308,10 +348,12 @@ export const TOOL_SCHEMAS = {
308
348
  autosnippet_submit_knowledge: SubmitKnowledgeInput,
309
349
  autosnippet_skill: SkillInput,
310
350
  autosnippet_bootstrap: BootstrapInput,
351
+ autosnippet_rescan: RescanInput,
311
352
  autosnippet_dimension_complete: DimensionCompleteInput,
312
353
  autosnippet_wiki: WikiInput,
313
354
  autosnippet_task: TaskInput,
314
355
  autosnippet_enrich_candidates: EnrichCandidatesInput,
315
356
  autosnippet_knowledge_lifecycle: KnowledgeLifecycleInput,
316
357
  autosnippet_panorama: PanoramaInput,
358
+ autosnippet_evolve: EvolveInput,
317
359
  };