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