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,359 @@
1
+ /**
2
+ * rescan-internal.ts — 内部 Agent 增量扫描
3
+ *
4
+ * 与 rescan-external.ts(为外部 IDE Agent 生成 Mission Briefing)不同,
5
+ * 本文件由内置 AI pipeline(fillDimensionsV3)在服务端自动完成知识补齐。
6
+ *
7
+ * 流程:
8
+ * 1. snapshotRecipes — 快照保留知识
9
+ * 2. rescanClean — 清理衍生缓存
10
+ * 2.5 Recipe 文件 ↔ DB 一致性恢复
11
+ * 3. Phase 1-4 全量分析(文件收集→AST→依赖→Guard→维度)
12
+ * 4. RecipeRelevanceAuditor — 证据验证 + 快速衰退
13
+ * 5. 计算 gap 维度(需要补齐的维度)
14
+ * 5.5 BootstrapSessionManager — 缓存 Phase 结果供复用
15
+ * 6. 快速返回骨架 → 异步 fillDimensionsV3 填充 gap 维度
16
+ * 7. 前端通过 Socket.io 接收维度完成进度
17
+ *
18
+ * @module handlers/rescan-internal
19
+ */
20
+ import path from 'node:path';
21
+ import { CleanupService } from '#service/cleanup/CleanupService.js';
22
+ import { RecipeRelevanceAuditor } from '#service/evolution/RecipeRelevanceAuditor.js';
23
+ import { resolveProjectRoot } from '#shared/resolveProjectRoot.js';
24
+ import { buildProjectSnapshot } from '#types/project-snapshot-builder.js';
25
+ import { toSessionCache } from '#types/snapshot-views.js';
26
+ import { envelope } from '../envelope.js';
27
+ import { fillDimensionsV3 } from './bootstrap/pipeline/orchestrator.js';
28
+ import { buildTaskDefs, dispatchPipelineFill, startTaskManagerSession, } from './bootstrap/shared/async-fill-helpers.js';
29
+ import { extractCodeEntities, extractDependencyEdges } from './bootstrap/shared/audit-helpers.js';
30
+ import { runAllPhases } from './bootstrap/shared/bootstrap-phases.js';
31
+ import { summarizePanorama } from './bootstrap/shared/panorama-utils.js';
32
+ import { getOrCreateSessionManager } from './bootstrap/shared/session-helpers.js';
33
+ import { buildTargetFileMap } from './bootstrap/shared/target-file-map.js';
34
+ // ── 主入口 ──────────────────────────────────────────────
35
+ const TARGET_PER_DIM = 5;
36
+ /**
37
+ * rescanInternal — 内部 Agent 增量扫描
38
+ *
39
+ * 同步返回骨架(含 audit 摘要 + 异步会话 ID),
40
+ * 后台通过 fillDimensionsV3 对 gap 维度执行 AI 补齐。
41
+ */
42
+ export async function rescanInternal(ctx, args) {
43
+ const t0 = Date.now();
44
+ const projectRoot = resolveProjectRoot(ctx.container);
45
+ const db = ctx.container.get('database');
46
+ // ═══════════════════════════════════════════════════════════
47
+ // Step 1: 快照现有知识
48
+ // ═══════════════════════════════════════════════════════════
49
+ const cleanupService = new CleanupService({
50
+ projectRoot,
51
+ db,
52
+ logger: ctx.logger,
53
+ });
54
+ const recipeSnapshot = await cleanupService.snapshotRecipes();
55
+ ctx.logger.info(`[Rescan-Internal] Preserved ${recipeSnapshot.count} recipes`, {
56
+ coverageByDimension: recipeSnapshot.coverageByDimension,
57
+ });
58
+ // ═══════════════════════════════════════════════════════════
59
+ // Step 2: 清理衍生缓存
60
+ // ═══════════════════════════════════════════════════════════
61
+ const cleanResult = await cleanupService.rescanClean();
62
+ // ═══════════════════════════════════════════════════════════
63
+ // Step 2.5: Recipe 文件 ↔ DB 一致性恢复
64
+ // ═══════════════════════════════════════════════════════════
65
+ try {
66
+ let syncService = null;
67
+ try {
68
+ syncService = ctx.container.get('knowledgeSyncService');
69
+ }
70
+ catch {
71
+ /* not registered */
72
+ }
73
+ if (syncService) {
74
+ const rawDb = typeof db?.getDb === 'function'
75
+ ? db.getDb()
76
+ : db;
77
+ const syncReport = syncService.sync(rawDb, {
78
+ force: true,
79
+ });
80
+ ctx.logger.info('[Rescan-Internal] KnowledgeSyncService sync complete', {
81
+ synced: syncReport.synced,
82
+ created: syncReport.created,
83
+ updated: syncReport.updated,
84
+ });
85
+ }
86
+ }
87
+ catch (e) {
88
+ ctx.logger.warn(`[Rescan-Internal] KnowledgeSyncService sync failed (non-blocking): ${e instanceof Error ? e.message : String(e)}`);
89
+ }
90
+ // ═══════════════════════════════════════════════════════════
91
+ // Step 3: Phase 1-4 全量分析
92
+ // ═══════════════════════════════════════════════════════════
93
+ const contentMaxLines = 120;
94
+ const phaseResults = await runAllPhases(projectRoot, ctx, {
95
+ maxFiles: 500,
96
+ contentMaxLines,
97
+ sourceTag: 'rescan-internal',
98
+ summaryPrefix: 'Rescan-Internal scan',
99
+ clearOldData: false, // 已由 rescanClean 清理
100
+ generateReport: true,
101
+ generateAstContext: true,
102
+ incremental: false,
103
+ });
104
+ if (phaseResults.isEmpty) {
105
+ return envelope({
106
+ success: true,
107
+ data: { message: 'No source files found. Nothing to rescan.' },
108
+ meta: { tool: 'autosnippet_rescan', responseTimeMs: Date.now() - t0 },
109
+ });
110
+ }
111
+ const { allFiles, allTargets, primaryLang, depGraphData, astProjectSummary, guardAudit, activeDimensions: allDimensions, incrementalPlan: _incrementalPlan, } = phaseResults;
112
+ // ── Build immutable ProjectSnapshot ──
113
+ const snapshot = buildProjectSnapshot({
114
+ projectRoot,
115
+ sourceTag: 'rescan-internal',
116
+ ...phaseResults,
117
+ report: phaseResults.report,
118
+ });
119
+ // ═══════════════════════════════════════════════════════════
120
+ // Step 4: Recipe 证据验证 + 快速衰退
121
+ // ═══════════════════════════════════════════════════════════
122
+ const auditor = new RecipeRelevanceAuditor({ db, logger: ctx.logger });
123
+ const codeEntities = extractCodeEntities(astProjectSummary);
124
+ const dependencyEdges = extractDependencyEdges(depGraphData);
125
+ const auditSummary = await auditor.audit(recipeSnapshot.entries, {
126
+ fileList: allFiles.map((f) => f.relativePath || f.name),
127
+ codeEntities,
128
+ dependencyGraph: dependencyEdges,
129
+ });
130
+ ctx.logger.info('[Rescan-Internal] Relevance audit complete', {
131
+ total: auditSummary.totalAudited,
132
+ healthy: auditSummary.healthy,
133
+ watch: auditSummary.watch,
134
+ decay: auditSummary.decay,
135
+ severe: auditSummary.severe,
136
+ dead: auditSummary.dead,
137
+ });
138
+ // ═══════════════════════════════════════════════════════════
139
+ // Step 4.5: ★ Evolution Pass 候选收集
140
+ // 收集 decay + severe 的 Recipe(dead 已直接 deprecated,不进入 Evolution)
141
+ // ═══════════════════════════════════════════════════════════
142
+ const evolutionCandidates = auditSummary.results.filter((r) => r.verdict === 'decay' || r.verdict === 'severe');
143
+ if (evolutionCandidates.length > 0) {
144
+ ctx.logger.info('[Rescan-Internal] Evolution candidates collected', {
145
+ count: evolutionCandidates.length,
146
+ byVerdict: {
147
+ decay: evolutionCandidates.filter((c) => c.verdict === 'decay').length,
148
+ severe: evolutionCandidates.filter((c) => c.verdict === 'severe')
149
+ .length,
150
+ },
151
+ });
152
+ }
153
+ // ═══════════════════════════════════════════════════════════
154
+ // Step 5: 计算 gap 维度 + 过滤出需要补齐的维度
155
+ // ═══════════════════════════════════════════════════════════
156
+ // 按维度统计已有 recipe 覆盖(加权策略):
157
+ // - active/evolving: 确认知识,始终计入
158
+ // - staging + audit healthy/watch: 有效候选,计入
159
+ // - staging + audit decay/severe/dead: 过时候选,不计入覆盖
160
+ const auditVerdictMap = new Map(auditSummary.results.map((r) => [r.recipeId, r.verdict]));
161
+ const coverageByDim = {};
162
+ for (const entry of recipeSnapshot.entries) {
163
+ const dim = entry.knowledgeType || 'unknown';
164
+ const isConfirmed = entry.lifecycle === 'active' || entry.lifecycle === 'evolving';
165
+ const verdict = auditVerdictMap.get(entry.id);
166
+ const isHealthyStaging = entry.lifecycle === 'staging' && (!verdict || verdict === 'healthy' || verdict === 'watch');
167
+ if (isConfirmed || isHealthyStaging) {
168
+ coverageByDim[dim] = (coverageByDim[dim] || 0) + 1;
169
+ }
170
+ }
171
+ // 过滤需要补齐的维度
172
+ const requestedDimensions = args.dimensions?.length
173
+ ? allDimensions.filter((d) => args.dimensions?.includes(d.id))
174
+ : allDimensions;
175
+ const gapDimensions = requestedDimensions.filter((d) => {
176
+ const existing = coverageByDim[d.id] || 0;
177
+ return existing < TARGET_PER_DIM;
178
+ });
179
+ const skippedDimensions = requestedDimensions.filter((d) => {
180
+ const existing = coverageByDim[d.id] || 0;
181
+ return existing >= TARGET_PER_DIM;
182
+ });
183
+ ctx.logger.info('[Rescan-Internal] Gap analysis', {
184
+ totalDimensions: requestedDimensions.length,
185
+ gapDimensions: gapDimensions.length,
186
+ skippedDimensions: skippedDimensions.length,
187
+ gapDetails: gapDimensions.map((d) => ({
188
+ id: d.id,
189
+ existing: coverageByDim[d.id] || 0,
190
+ gap: TARGET_PER_DIM - (coverageByDim[d.id] || 0),
191
+ })),
192
+ });
193
+ // ═══════════════════════════════════════════════════════════
194
+ // Step 5.5: BootstrapSessionManager — 缓存 Phase 结果供复用
195
+ // (与 bootstrap-internal Phase 4.6 对齐)
196
+ // ═══════════════════════════════════════════════════════════
197
+ let sessionId = null;
198
+ try {
199
+ const sessionManager = getOrCreateSessionManager(ctx.container);
200
+ const bsSession = sessionManager.createSession({
201
+ projectRoot,
202
+ dimensions: gapDimensions.map((d) => ({
203
+ ...d,
204
+ skillMeta: d.skillMeta ?? undefined,
205
+ })),
206
+ projectContext: {
207
+ projectName: path.basename(projectRoot),
208
+ primaryLang,
209
+ fileCount: allFiles.length,
210
+ modules: depGraphData?.nodes?.length || 0,
211
+ },
212
+ });
213
+ bsSession.setSnapshotCache(toSessionCache(snapshot));
214
+ sessionId = bsSession.id;
215
+ }
216
+ catch (e) {
217
+ ctx.logger.warn(`[Rescan-Internal] BootstrapSessionManager setup failed (non-blocking): ${e instanceof Error ? e.message : String(e)}`);
218
+ }
219
+ // ═══════════════════════════════════════════════════════════
220
+ // Step 6: 构建 targetFileMap + 任务清单 → 快速返回骨架
221
+ // ═══════════════════════════════════════════════════════════
222
+ const targetFileMap = buildTargetFileMap(allFiles, contentMaxLines);
223
+ // 任务定义仅包含 gap 维度
224
+ const taskDefs = buildTaskDefs(gapDimensions);
225
+ // 启动 BootstrapTaskManager 会话
226
+ const bootstrapSession = startTaskManagerSession(ctx.container, taskDefs, ctx.logger, 'Rescan-Internal');
227
+ // 构建骨架响应
228
+ const responseData = {
229
+ rescan: {
230
+ preservedRecipes: recipeSnapshot.count,
231
+ cleanedTables: cleanResult.clearedTables.length,
232
+ cleanedFiles: cleanResult.deletedFiles,
233
+ reason: args.reason || null,
234
+ },
235
+ relevanceAudit: {
236
+ totalAudited: auditSummary.totalAudited,
237
+ healthy: auditSummary.healthy,
238
+ watch: auditSummary.watch,
239
+ decay: auditSummary.decay,
240
+ severe: auditSummary.severe,
241
+ dead: auditSummary.dead,
242
+ proposalsCreated: auditSummary.proposalsCreated,
243
+ immediateDeprecated: auditSummary.immediateDeprecated,
244
+ },
245
+ gapAnalysis: {
246
+ totalDimensions: requestedDimensions.length,
247
+ gapDimensions: gapDimensions.length,
248
+ skippedDimensions: skippedDimensions.map((d) => d.id),
249
+ gaps: gapDimensions.map((d) => ({
250
+ dimensionId: d.id,
251
+ label: d.label,
252
+ existing: coverageByDim[d.id] || 0,
253
+ gap: TARGET_PER_DIM - (coverageByDim[d.id] || 0),
254
+ })),
255
+ },
256
+ // Phase 1-4 分析摘要 (与 bootstrap-internal 对齐)
257
+ languageStats: phaseResults.langStats || null,
258
+ primaryLanguage: primaryLang,
259
+ guardSummary: guardAudit
260
+ ? {
261
+ totalViolations: guardAudit.summary?.totalViolations || 0,
262
+ errors: guardAudit.summary?.errors || 0,
263
+ warnings: guardAudit.summary?.warnings || 0,
264
+ }
265
+ : null,
266
+ astSummary: astProjectSummary
267
+ ? {
268
+ classes: astProjectSummary.classes?.length || 0,
269
+ protocols: astProjectSummary.protocols?.length || 0,
270
+ categories: astProjectSummary.categories?.length || 0,
271
+ }
272
+ : null,
273
+ codeEntityGraph: phaseResults.codeEntityResult
274
+ ? {
275
+ totalEntities: phaseResults.codeEntityResult.entityCount || 0,
276
+ totalEdges: phaseResults.codeEntityResult.edgeCount || 0,
277
+ }
278
+ : null,
279
+ callGraph: phaseResults.callGraphResult
280
+ ? {
281
+ entitiesUpserted: phaseResults.callGraphResult.entitiesUpserted || 0,
282
+ edgesCreated: phaseResults.callGraphResult.edgesCreated || 0,
283
+ }
284
+ : null,
285
+ panorama: snapshot.panorama ? summarizePanorama(snapshot.panorama) : null,
286
+ bootstrapSession: bootstrapSession ? bootstrapSession.toJSON() : null,
287
+ sessionId,
288
+ asyncFill: gapDimensions.length > 0,
289
+ status: gapDimensions.length > 0 ? 'filling' : 'complete',
290
+ files: allFiles.length,
291
+ targets: allTargets.length,
292
+ };
293
+ // ═══════════════════════════════════════════════════════════
294
+ // Step 7: 异步后台填充 gap 维度
295
+ // ═══════════════════════════════════════════════════════════
296
+ if (gapDimensions.length > 0 && !args.skipAsyncFill) {
297
+ const fillView = {
298
+ snapshot,
299
+ ctx: ctx,
300
+ bootstrapSession,
301
+ targetFileMap,
302
+ projectRoot,
303
+ };
304
+ // 构建 existingRecipes(含审计状态 + 完整内容),供管线内 Evolution Stage 使用
305
+ const allExistingRecipes = recipeSnapshot.entries.map((e) => {
306
+ const auditResult = auditSummary.results.find((r) => r.recipeId === e.id);
307
+ const verdict = auditVerdictMap.get(e.id);
308
+ const isDecaying = e.lifecycle === 'decaying' || verdict === 'decay' || verdict === 'severe';
309
+ return {
310
+ id: e.id,
311
+ title: e.title,
312
+ trigger: e.trigger,
313
+ knowledgeType: e.knowledgeType,
314
+ status: isDecaying ? 'decaying' : 'healthy',
315
+ decayReason: isDecaying && auditResult?.decayReasons
316
+ ? auditResult.decayReasons.join('; ')
317
+ : undefined,
318
+ auditScore: auditResult?.relevanceScore,
319
+ // Evolution Agent 需要完整内容来验证 Recipe 真实性
320
+ content: e.content,
321
+ sourceRefs: e.sourceRefs,
322
+ auditEvidence: auditResult
323
+ ?.evidence,
324
+ };
325
+ });
326
+ dispatchPipelineFill({ ...fillView, existingRecipes: allExistingRecipes }, gapDimensions, fillDimensionsV3, 'Rescan-Internal');
327
+ }
328
+ else if (gapDimensions.length === 0) {
329
+ ctx.logger.info('[Rescan-Internal] All dimensions fully covered — no async fill needed');
330
+ }
331
+ // ── SkillHooks: onRescanComplete (fire-and-forget) ──
332
+ try {
333
+ const skillHooks = ctx.container.get('skillHooks');
334
+ skillHooks
335
+ .run('onRescanComplete', {
336
+ filesScanned: allFiles.length,
337
+ targetsFound: allTargets.length,
338
+ gapDimensions: gapDimensions.length,
339
+ preservedRecipes: recipeSnapshot.count,
340
+ auditSummary: {
341
+ healthy: auditSummary.healthy,
342
+ decay: auditSummary.decay,
343
+ dead: auditSummary.dead,
344
+ },
345
+ }, { projectRoot: ctx.container.get('database')?.filename || '' })
346
+ .catch(() => { }); // fire-and-forget
347
+ }
348
+ catch {
349
+ /* skillHooks not available */
350
+ }
351
+ return envelope({
352
+ success: true,
353
+ data: responseData,
354
+ message: gapDimensions.length > 0
355
+ ? `增量扫描骨架已创建:保留 ${recipeSnapshot.count} 个 Recipe,${gapDimensions.length} 个维度需要补齐,正在后台填充...`
356
+ : `增量扫描完成:保留 ${recipeSnapshot.count} 个 Recipe,所有维度已充分覆盖。`,
357
+ meta: { tool: 'autosnippet_rescan', responseTimeMs: Date.now() - t0 },
358
+ });
359
+ }
@@ -13,15 +13,16 @@
13
13
  import { type SlimSearchResult } from '#service/search/SearchTypes.js';
14
14
  import type { McpContext, SearchArgs, SearchResultItem } from './types.js';
15
15
  /**
16
- * 统一搜索入口 — 支持 auto / keyword / bm25 / semantic / context 五种模式
16
+ * 统一搜索入口 — 支持 auto / keyword / weighted / semantic / context 五种模式
17
17
  *
18
18
  * 合并了原 search / contextSearch / keywordSearch / semanticSearch 4 个函数。
19
19
  * mode 路由:
20
- * - auto (默认): BM25 + semantic 融合 + Ranking Pipeline
20
+ * - auto (默认): FieldWeighted + semantic 融合 + Ranking Pipeline
21
21
  * - keyword: SQL LIKE 精确匹配,适合已知函数名/类名
22
- * - bm25: BM25 (TF-IDF) 排序搜索
23
- * - semantic: 向量语义搜索(不可用时降级 BM25)
24
- * - context: BM25 + Ranking Pipeline + 会话上下文加成
22
+ * - weighted: 加权字段评分搜索(原 bm25 模式,已替换为 FieldWeightedScorer)
23
+ * - bm25: weighted 的向后兼容别名
24
+ * - semantic: 向量语义搜索(不可用时降级 weighted)
25
+ * - context: weighted + Ranking Pipeline + 会话上下文加成
25
26
  *
26
27
  * 所有模式共享: kind 过滤 → slimSearchResult 投影 → byKind 分组
27
28
  */
@@ -41,15 +41,16 @@ function filterByKind(items, kind) {
41
41
  }
42
42
  // ─── 统一搜索入口 ────────────────────────────────────────────
43
43
  /**
44
- * 统一搜索入口 — 支持 auto / keyword / bm25 / semantic / context 五种模式
44
+ * 统一搜索入口 — 支持 auto / keyword / weighted / semantic / context 五种模式
45
45
  *
46
46
  * 合并了原 search / contextSearch / keywordSearch / semanticSearch 4 个函数。
47
47
  * mode 路由:
48
- * - auto (默认): BM25 + semantic 融合 + Ranking Pipeline
48
+ * - auto (默认): FieldWeighted + semantic 融合 + Ranking Pipeline
49
49
  * - keyword: SQL LIKE 精确匹配,适合已知函数名/类名
50
- * - bm25: BM25 (TF-IDF) 排序搜索
51
- * - semantic: 向量语义搜索(不可用时降级 BM25)
52
- * - context: BM25 + Ranking Pipeline + 会话上下文加成
50
+ * - weighted: 加权字段评分搜索(原 bm25 模式,已替换为 FieldWeightedScorer)
51
+ * - bm25: weighted 的向后兼容别名
52
+ * - semantic: 向量语义搜索(不可用时降级 weighted)
53
+ * - context: weighted + Ranking Pipeline + 会话上下文加成
53
54
  *
54
55
  * 所有模式共享: kind 过滤 → slimSearchResult 投影 → byKind 分组
55
56
  */
@@ -2,6 +2,7 @@
2
2
  * Shared type definitions for MCP handler modules.
3
3
  * Runtime-free — only interfaces and type aliases.
4
4
  */
5
+ import type { SessionStore } from '#agent/memory/SessionStore.js';
5
6
  /**
6
7
  * Minimal DI container shape used by MCP handlers.
7
8
  * Compatible with both the full ServiceContainer class and the
@@ -366,7 +367,7 @@ export interface IncrementalPlan {
366
367
  changeRatio: number;
367
368
  } | null;
368
369
  reason: string;
369
- restoredEpisodic: unknown;
370
+ restoredEpisodic: SessionStore | null;
370
371
  }
371
372
  export interface SaveSnapshotParams {
372
373
  sessionId: string;
@@ -69,10 +69,10 @@ export async function wikiPlan(ctx, args) {
69
69
  let cacheHit = false;
70
70
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- McpServiceContainer is compatible at runtime
71
71
  const session = getActiveSession(container, args.sessionId);
72
- const cachedData = session?.phaseCache;
72
+ const cachedData = session?.snapshotCache;
73
73
  if (cachedData?.astProjectSummary) {
74
74
  // Bootstrap phase cache → WikiGenerator-compatible format 转换
75
- const allFiles = (cachedData.allFiles || []);
75
+ const allFiles = cachedData.allFiles;
76
76
  const ast = cachedData.astProjectSummary;
77
77
  // projectInfo: 从 bootstrap 文件列表和语言统计构建
78
78
  const filesByModule = {};
@@ -1,26 +1,12 @@
1
- /**
2
- * MCP Tool Definitions — V3 Consolidated (14 agent + 2 admin = 16 tools)
3
- *
4
- * Each tool declaration contains name, tier (agent/admin), description, and inputSchema.
5
- * description is the key for Agent tool selection — use bullet list to enumerate all operations and their purposes.
6
- * inputSchema is auto-generated from Zod Schema (zodToMcpSchema); parameter .describe() translates to JSON Schema description.
7
- *
8
- * Agent tools (14):
9
- * 1-7: Query tools (health/search/knowledge/structure/graph/call_context/guard)
10
- * 8: Write tool (submit_knowledge — unified pipeline, single/batch)
11
- * 9: Skill management (skill)
12
- * 10-12: Cold-start (bootstrap/dimension_complete/wiki)
13
- * 13: Project panorama (panorama)
14
- * 14: Task management (task — 5 ops: prime/create/close/fail/record_decision)
15
- *
16
- * Admin tools (2):
17
- * 15-16: enrich_candidates/knowledge_lifecycle
18
- */
19
1
  export declare const TIER_ORDER: {
20
2
  agent: number;
21
3
  admin: number;
22
4
  };
23
5
  export declare const TOOL_GATEWAY_MAP: {
6
+ autosnippet_rescan: {
7
+ action: string;
8
+ resource: string;
9
+ };
24
10
  autosnippet_dimension_complete: {
25
11
  action: string;
26
12
  resource: string;
@@ -47,6 +33,10 @@ export declare const TOOL_GATEWAY_MAP: {
47
33
  action: string;
48
34
  resource: string;
49
35
  };
36
+ autosnippet_evolve: {
37
+ action: string;
38
+ resource: string;
39
+ };
50
40
  autosnippet_task: {
51
41
  resolver: (args: Record<string, unknown>) => {
52
42
  action: string;
@@ -16,14 +16,43 @@
16
16
  * Admin tools (2):
17
17
  * 15-16: enrich_candidates/knowledge_lifecycle
18
18
  */
19
- import { BootstrapInput, CallContextInput, DimensionCompleteInput, EnrichCandidatesInput, GraphInput, GuardInput, HealthInput, KnowledgeInput, KnowledgeLifecycleInput, PanoramaInput, SearchInput, SkillInput, StructureInput, SubmitKnowledgeInput, TaskInput, WikiInput, } from '#shared/schemas/mcp-tools.js';
19
+ import { z } from 'zod';
20
+ import { BootstrapInput, CallContextInput, DimensionCompleteInput, EnrichCandidatesInput, EvolveInput, GraphInput, GuardInput, HealthInput, KnowledgeInput, KnowledgeLifecycleInput, PanoramaInput, RescanInput, SearchInput, SkillInput, StructureInput, SubmitKnowledgeInput, TaskInput, WikiInput, } from '#shared/schemas/mcp-tools.js';
20
21
  import { zodToMcpSchema } from './zodToMcpSchema.js';
22
+ // RescanInput may be undefined under certain Vitest module transforms; provide defensive fallback
23
+ const _RescanSchema = RescanInput ??
24
+ z.object({
25
+ dimensions: z.array(z.string()).optional(),
26
+ reason: z.string().optional(),
27
+ });
28
+ // EvolveInput — same defensive fallback for Vitest module transform edge case
29
+ const _EvolveSchema = EvolveInput ??
30
+ z.object({
31
+ decisions: z
32
+ .array(z.object({
33
+ recipeId: z.string(),
34
+ action: z.enum(['propose_evolution', 'confirm_deprecation', 'skip']),
35
+ evidence: z
36
+ .object({
37
+ codeSnippet: z.string(),
38
+ filePath: z.string(),
39
+ type: z.enum(['enhance', 'correction']),
40
+ suggestedChanges: z.string(),
41
+ })
42
+ .optional(),
43
+ reason: z.string().optional(),
44
+ skipReason: z.enum(['still_valid', 'insufficient_info']).optional(),
45
+ }))
46
+ .min(1),
47
+ });
21
48
  // ─── Tier Definitions ────────────────────────────────────────
22
49
  export const TIER_ORDER = { agent: 0, admin: 1 };
23
50
  // ─── Gateway Mapping (only write operations require gating) ─
24
51
  export const TOOL_GATEWAY_MAP = {
25
52
  // bootstrap — parameterless Mission Briefing (read-only analysis, no gating needed)
26
53
  // autosnippet_bootstrap: null,
54
+ // rescan — incremental knowledge update (write: cleans derived data + creates decay proposals)
55
+ autosnippet_rescan: { action: 'knowledge:bootstrap', resource: 'knowledge' },
27
56
  // dimension_complete — write operation (recipe tagging + skill creation + checkpoint)
28
57
  autosnippet_dimension_complete: { action: 'knowledge:bootstrap', resource: 'knowledge' },
29
58
  // wiki — finalize is a write operation (meta.json)
@@ -46,6 +75,8 @@ export const TOOL_GATEWAY_MAP = {
46
75
  },
47
76
  // knowledge submission (unified pipeline)
48
77
  autosnippet_submit_knowledge: { action: 'knowledge:create', resource: 'knowledge' },
78
+ // evolve — Recipe evolution decisions (propose/deprecate/skip)
79
+ autosnippet_evolve: { action: 'knowledge:evolve', resource: 'knowledge' },
49
80
  // task write operations (create/close/fail + record_decision)
50
81
  autosnippet_task: {
51
82
  resolver: (args) => ({
@@ -178,7 +209,32 @@ export const TOOLS = [
178
209
  'After receiving the Briefing, complete all dimension analyses per the executionPlan.',
179
210
  inputSchema: zodToMcpSchema(BootstrapInput),
180
211
  },
181
- // 11. Dimension Complete Notification
212
+ // 11. Incremental Rescan
213
+ {
214
+ name: 'autosnippet_rescan',
215
+ tier: 'agent',
216
+ description: 'Incremental rescan — preserves existing Recipes and re-analyzes project.\n' +
217
+ '• Snapshots approved Recipes → cleans derived caches → full Phase 1-4 analysis\n' +
218
+ '• Runs RecipeRelevanceAuditor (5-dimension evidence check, auto-decay stale Recipes)\n' +
219
+ '\u2022 Returns Mission Briefing with allRecipes (full content + auditHint per recipe)\n' +
220
+ '\u2022 Per-dimension workflow: evolve (autosnippet_evolve) \u2192 gap-fill (submit_knowledge) \u2192 dimension_complete\n' +
221
+ '\u2022 Optional: dimensions (filter specific dimensions), reason (rescan justification)',
222
+ inputSchema: zodToMcpSchema(_RescanSchema),
223
+ },
224
+ // 11.5. Recipe Evolution
225
+ {
226
+ name: 'autosnippet_evolve',
227
+ tier: 'agent',
228
+ description: 'Batch Recipe evolution decisions. Dual-entry tool:\n' +
229
+ '\u2022 Rescan mode: called per-dimension before gap-fill (evolve \u2192 submit \u2192 complete)\n' +
230
+ '\u2022 Standalone mode: user triggers directly to verify Recipe validity\n' +
231
+ 'Three decision types per Recipe:\n' +
232
+ '\u2022 propose_evolution \u2014 code changed, suggest Recipe update (enters observation window)\n' +
233
+ '\u2022 confirm_deprecation \u2014 pattern disappeared, deprecate Recipe immediately\n' +
234
+ '\u2022 skip \u2014 still_valid (refreshes lastVerifiedAt) or insufficient_info',
235
+ inputSchema: zodToMcpSchema(_EvolveSchema),
236
+ },
237
+ // 12. Dimension Complete Notification
182
238
  {
183
239
  name: 'autosnippet_dimension_complete',
184
240
  tier: 'agent',