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
@@ -6,6 +6,7 @@
6
6
  import { enrichCandidate, refineBootstrapCandidates } from './ai-analysis.js';
7
7
  import { getCategoryMap, getClassHierarchy, getClassInfo, getMethodOverrides, getPreviousAnalysis, getPreviousEvidence, getProjectOverview, getProtocolInfo, noteFinding, queryCallGraph, queryCodeGraph } from './ast-graph.js';
8
8
  import { analyzeCode, getToolDetails, knowledgeOverview, planTask, reviewMyOutput, submitWithCheck } from './composite.js';
9
+ import { confirmDeprecation, proposeEvolution, skipEvolution } from './evolution-tools.js';
9
10
  import { getRecommendations, guardCheckCode, listGuardRules, queryViolations } from './guard.js';
10
11
  import { bootstrapKnowledgeTool, createSkillTool, graphImpactAnalysis, loadSkill, queryAuditLog, rebuildIndex, suggestSkills } from './infrastructure.js';
11
12
  import { addGraphEdge, checkDuplicate } from './knowledge-graph.js';
@@ -14,76 +15,8 @@ import { getFileSummary, listProjectStructure, readProjectFile, searchProjectCod
14
15
  import { getProjectStats, getRecipeDetail, getRelatedRecipes, searchCandidates, searchKnowledge, searchRecipes } from './query.js';
15
16
  import { collectScanRecipe } from './scan-recipe.js';
16
17
  import { getEnvironmentInfo, runSafeCommand, writeProjectFile } from './system-interaction.js';
17
- export { searchProjectCode, readProjectFile, listProjectStructure, getFileSummary, semanticSearchCode, searchRecipes, searchCandidates, getRecipeDetail, getProjectStats, searchKnowledge, getRelatedRecipes, enrichCandidate, refineBootstrapCandidates, listGuardRules, getRecommendations, guardCheckCode, queryViolations, checkDuplicate, addGraphEdge, submitCandidate, approveCandidate, rejectCandidate, publishRecipe, deprecateRecipe, updateRecipe, recordUsage, qualityScore, validateCandidate, getFeedbackStats, graphImpactAnalysis, rebuildIndex, queryAuditLog, loadSkill, createSkillTool, suggestSkills, bootstrapKnowledgeTool, analyzeCode, knowledgeOverview, submitWithCheck, getToolDetails, planTask, reviewMyOutput, getProjectOverview, getClassHierarchy, getClassInfo, getProtocolInfo, getMethodOverrides, getCategoryMap, getPreviousAnalysis, noteFinding, getPreviousEvidence, queryCodeGraph, queryCallGraph, collectScanRecipe, runSafeCommand, writeProjectFile, getEnvironmentInfo, };
18
+ export { searchProjectCode, readProjectFile, listProjectStructure, getFileSummary, semanticSearchCode, searchRecipes, searchCandidates, getRecipeDetail, getProjectStats, searchKnowledge, getRelatedRecipes, enrichCandidate, refineBootstrapCandidates, listGuardRules, getRecommendations, guardCheckCode, queryViolations, checkDuplicate, addGraphEdge, submitCandidate, approveCandidate, rejectCandidate, publishRecipe, deprecateRecipe, updateRecipe, recordUsage, qualityScore, validateCandidate, getFeedbackStats, graphImpactAnalysis, rebuildIndex, queryAuditLog, loadSkill, createSkillTool, suggestSkills, bootstrapKnowledgeTool, analyzeCode, knowledgeOverview, submitWithCheck, getToolDetails, planTask, reviewMyOutput, getProjectOverview, getClassHierarchy, getClassInfo, getProtocolInfo, getMethodOverrides, getCategoryMap, getPreviousAnalysis, noteFinding, getPreviousEvidence, queryCodeGraph, queryCallGraph, collectScanRecipe, runSafeCommand, writeProjectFile, getEnvironmentInfo, proposeEvolution, confirmDeprecation, skipEvolution, };
18
19
  export declare const ALL_TOOLS: ({
19
- name: string;
20
- description: string;
21
- parameters: {
22
- type: string;
23
- properties: {
24
- candidateIds: {
25
- type: string;
26
- items: {
27
- type: string;
28
- };
29
- description: string;
30
- };
31
- };
32
- required: string[];
33
- };
34
- handler: (params: Record<string, unknown>, ctx: import("./_shared.js").ToolHandlerContext) => Promise<{
35
- total: number;
36
- needsEnrichment: number;
37
- needsRecipeFields: number;
38
- fullyComplete: number;
39
- entries: import("../../external/mcp/handlers/types.js").EnrichResultEntry[];
40
- hint: string;
41
- } | {
42
- success: boolean;
43
- errorCode: string | null;
44
- message: string;
45
- data: {
46
- total: number;
47
- needsEnrichment: number;
48
- needsRecipeFields: number;
49
- fullyComplete: number;
50
- entries: import("../../external/mcp/handlers/types.js").EnrichResultEntry[];
51
- hint: string;
52
- } | null;
53
- meta: {
54
- source?: string | undefined;
55
- responseTimeMs?: number | undefined;
56
- version: string;
57
- tool?: string | undefined;
58
- };
59
- } | {
60
- error: string;
61
- }>;
62
- } | {
63
- name: string;
64
- description: string;
65
- parameters: {
66
- type: string;
67
- properties: {
68
- candidateIds: {
69
- type: string;
70
- items: {
71
- type: string;
72
- };
73
- description: string;
74
- };
75
- userPrompt: {
76
- type: string;
77
- description: string;
78
- };
79
- dryRun: {
80
- type: string;
81
- description: string;
82
- };
83
- };
84
- };
85
- handler: (params: Record<string, unknown>, ctx: import("./_shared.js").ToolHandlerContext) => Promise<{}>;
86
- } | {
87
20
  name: string;
88
21
  description: string;
89
22
  parameters: {
@@ -397,13 +330,14 @@ export declare const ALL_TOOLS: ({
397
330
  type: string;
398
331
  description: string;
399
332
  };
333
+ supersedes: {
334
+ type: string;
335
+ description: string;
336
+ };
400
337
  };
401
338
  required: string[];
402
339
  };
403
340
  handler: (params: import("./composite.js").SubmitWithCheckParams, ctx: import("./_shared.js").ToolHandlerContext) => Promise<{
404
- status: string;
405
- reason: string;
406
- } | {
407
341
  submitted: boolean;
408
342
  status: string;
409
343
  reason: string;
@@ -413,10 +347,19 @@ export declare const ALL_TOOLS: ({
413
347
  confidence: string;
414
348
  hint: string;
415
349
  };
350
+ error?: undefined;
351
+ similar?: undefined;
352
+ highestSimilarity?: undefined;
353
+ } | {
354
+ submitted: boolean;
355
+ reason: string;
356
+ error: string;
357
+ status?: undefined;
358
+ errors?: undefined;
359
+ warnings?: undefined;
360
+ _meta?: undefined;
416
361
  similar?: undefined;
417
362
  highestSimilarity?: undefined;
418
- entry?: undefined;
419
- error?: undefined;
420
363
  } | {
421
364
  submitted: boolean;
422
365
  reason: string;
@@ -433,37 +376,28 @@ export declare const ALL_TOOLS: ({
433
376
  status?: undefined;
434
377
  errors?: undefined;
435
378
  warnings?: undefined;
436
- entry?: undefined;
437
379
  error?: undefined;
438
380
  } | {
381
+ _meta: {
382
+ confidence: string;
383
+ hint: string;
384
+ };
385
+ _supersedeProposal?: {
386
+ proposalId: string;
387
+ } | undefined;
439
388
  submitted: boolean;
440
- entry: any;
389
+ entry: unknown;
441
390
  similar: {
442
391
  file: string;
443
392
  title: string;
444
393
  similarity: number;
445
394
  }[];
446
- _meta: {
447
- confidence: string;
448
- hint: string;
449
- };
450
395
  status?: undefined;
451
396
  reason?: undefined;
452
397
  errors?: undefined;
453
398
  warnings?: undefined;
454
- highestSimilarity?: undefined;
455
399
  error?: undefined;
456
- } | {
457
- submitted: boolean;
458
- reason: string;
459
- error: string;
460
- status?: undefined;
461
- errors?: undefined;
462
- warnings?: undefined;
463
- _meta?: undefined;
464
- similar?: undefined;
465
400
  highestSimilarity?: undefined;
466
- entry?: undefined;
467
401
  }>;
468
402
  } | {
469
403
  name: string;
@@ -592,6 +526,71 @@ export declare const ALL_TOOLS: ({
592
526
  }[];
593
527
  message: string;
594
528
  }>;
529
+ } | {
530
+ name: string;
531
+ description: string;
532
+ parameters: {
533
+ type: string;
534
+ properties: {
535
+ recipeId: {
536
+ type: string;
537
+ description: string;
538
+ };
539
+ type: {
540
+ type: string;
541
+ enum: string[];
542
+ description: string;
543
+ };
544
+ description: {
545
+ type: string;
546
+ description: string;
547
+ };
548
+ evidence: {
549
+ type: string;
550
+ description: string;
551
+ properties: {
552
+ sourceStatus: {
553
+ type: string;
554
+ enum: string[];
555
+ description: string;
556
+ };
557
+ currentCode: {
558
+ type: string;
559
+ description: string;
560
+ };
561
+ newLocation: {
562
+ type: string;
563
+ description: string;
564
+ };
565
+ suggestedChanges: {
566
+ type: string;
567
+ description: string;
568
+ };
569
+ };
570
+ required: string[];
571
+ };
572
+ confidence: {
573
+ type: string;
574
+ description: string;
575
+ };
576
+ };
577
+ required: string[];
578
+ };
579
+ handler: (params: import("./evolution-tools.js").ProposeEvolutionParams, ctx: import("./_shared.js").ToolHandlerContext) => Promise<{
580
+ status: "error";
581
+ message: string;
582
+ recipeId: string;
583
+ proposalId?: undefined;
584
+ type?: undefined;
585
+ expiresAt?: undefined;
586
+ } | {
587
+ status: "proposed";
588
+ proposalId: string;
589
+ recipeId: string;
590
+ type: "enhance" | "correction";
591
+ expiresAt: number;
592
+ message?: undefined;
593
+ }>;
595
594
  } | {
596
595
  name: string;
597
596
  description: string;
@@ -1024,10 +1023,14 @@ export declare const ALL_TOOLS: ({
1024
1023
  type: string;
1025
1024
  description: string;
1026
1025
  };
1026
+ supersedes: {
1027
+ type: string;
1028
+ description: string;
1029
+ };
1027
1030
  };
1028
1031
  required: string[];
1029
1032
  };
1030
- handler: (params: import("./lifecycle.js").SubmitKnowledgeParams, ctx: import("./_shared.js").ToolHandlerContext) => Promise<any>;
1033
+ handler: (params: import("./lifecycle.js").SubmitKnowledgeParams, ctx: import("./_shared.js").ToolHandlerContext) => Promise<Record<string, unknown>>;
1031
1034
  } | {
1032
1035
  name: string;
1033
1036
  description: string;
@@ -1850,5 +1853,73 @@ export declare const ALL_TOOLS: ({
1850
1853
  required: never[];
1851
1854
  };
1852
1855
  handler: (params: import("./system-interaction.js").GetEnvironmentInfoParams, ctx: import("./_shared.js").ToolHandlerContext) => Promise<import("./system-interaction.js").EnvironmentInfo>;
1856
+ } | {
1857
+ name: string;
1858
+ description: string;
1859
+ parameters: {
1860
+ type: string;
1861
+ properties: {
1862
+ candidateIds: {
1863
+ type: string;
1864
+ items: {
1865
+ type: string;
1866
+ };
1867
+ description: string;
1868
+ };
1869
+ };
1870
+ required: string[];
1871
+ };
1872
+ handler: (params: Record<string, unknown>, ctx: import("./_shared.js").ToolHandlerContext) => Promise<{
1873
+ total: number;
1874
+ needsEnrichment: number;
1875
+ needsRecipeFields: number;
1876
+ fullyComplete: number;
1877
+ entries: import("../../external/mcp/handlers/types.js").EnrichResultEntry[];
1878
+ hint: string;
1879
+ } | {
1880
+ success: boolean;
1881
+ errorCode: string | null;
1882
+ message: string;
1883
+ data: {
1884
+ total: number;
1885
+ needsEnrichment: number;
1886
+ needsRecipeFields: number;
1887
+ fullyComplete: number;
1888
+ entries: import("../../external/mcp/handlers/types.js").EnrichResultEntry[];
1889
+ hint: string;
1890
+ } | null;
1891
+ meta: {
1892
+ source?: string | undefined;
1893
+ responseTimeMs?: number | undefined;
1894
+ version: string;
1895
+ tool?: string | undefined;
1896
+ };
1897
+ } | {
1898
+ error: string;
1899
+ }>;
1900
+ } | {
1901
+ name: string;
1902
+ description: string;
1903
+ parameters: {
1904
+ type: string;
1905
+ properties: {
1906
+ candidateIds: {
1907
+ type: string;
1908
+ items: {
1909
+ type: string;
1910
+ };
1911
+ description: string;
1912
+ };
1913
+ userPrompt: {
1914
+ type: string;
1915
+ description: string;
1916
+ };
1917
+ dryRun: {
1918
+ type: string;
1919
+ description: string;
1920
+ };
1921
+ };
1922
+ };
1923
+ handler: (params: Record<string, unknown>, ctx: import("./_shared.js").ToolHandlerContext) => Promise<{}>;
1853
1924
  })[];
1854
1925
  export default ALL_TOOLS;
@@ -9,6 +9,8 @@ import { enrichCandidate, refineBootstrapCandidates } from './ai-analysis.js';
9
9
  import { getCategoryMap, getClassHierarchy, getClassInfo, getMethodOverrides, getPreviousAnalysis, getPreviousEvidence, getProjectOverview, getProtocolInfo, noteFinding, queryCallGraph, queryCodeGraph, } from './ast-graph.js';
10
10
  // ── 组合工具 + 元工具 (6) ──
11
11
  import { analyzeCode, getToolDetails, knowledgeOverview, planTask, reviewMyOutput, submitWithCheck, } from './composite.js';
12
+ // ── Evolution Agent 工具 (3) ──
13
+ import { confirmDeprecation, proposeEvolution, skipEvolution } from './evolution-tools.js';
12
14
  // ── Guard 安全类 (4) ──
13
15
  import { getRecommendations, guardCheckCode, listGuardRules, queryViolations } from './guard.js';
14
16
  // ── 基础设施类 (7) ──
@@ -54,7 +56,9 @@ queryCallGraph,
54
56
  // 扫描 Recipe 收集
55
57
  collectScanRecipe,
56
58
  // 系统交互类
57
- runSafeCommand, writeProjectFile, getEnvironmentInfo, };
59
+ runSafeCommand, writeProjectFile, getEnvironmentInfo,
60
+ // Evolution Agent 工具
61
+ proposeEvolution, confirmDeprecation, skipEvolution, };
58
62
  // ── ALL_TOOLS 数组(与原始 tools.js 顺序一致)──
59
63
  export const ALL_TOOLS = [
60
64
  // 项目数据访问 (5) — 含 v10 Agent-Pull 工具
@@ -131,5 +135,9 @@ export const ALL_TOOLS = [
131
135
  getEnvironmentInfo,
132
136
  // 扫描 Recipe 收集 (1) — scanKnowledge produce 阶段专用
133
137
  collectScanRecipe,
138
+ // Evolution Agent 工具 (3) — 提案驱动的 Recipe 进化决策
139
+ proposeEvolution,
140
+ confirmDeprecation,
141
+ skipEvolution,
134
142
  ];
135
143
  export default ALL_TOOLS;
@@ -42,6 +42,8 @@ export interface SubmitKnowledgeParams {
42
42
  usageGuide?: string;
43
43
  sourceFile?: string;
44
44
  _category?: string;
45
+ /** 被替代的旧 Recipe ID(进化架构入口) */
46
+ supersedes?: string;
45
47
  [key: string]: unknown;
46
48
  }
47
49
  export declare const submitCandidate: {
@@ -132,10 +134,14 @@ export declare const submitCandidate: {
132
134
  type: string;
133
135
  description: string;
134
136
  };
137
+ supersedes: {
138
+ type: string;
139
+ description: string;
140
+ };
135
141
  };
136
142
  required: string[];
137
143
  };
138
- handler: (params: SubmitKnowledgeParams, ctx: ToolHandlerContext) => Promise<any>;
144
+ handler: (params: SubmitKnowledgeParams, ctx: ToolHandlerContext) => Promise<Record<string, unknown>>;
139
145
  };
140
146
  export declare const approveCandidate: {
141
147
  name: string;
@@ -13,8 +13,7 @@
13
13
  * 25. get_feedback_stats 反馈统计
14
14
  */
15
15
  import { getInternalAgentRequiredFields, getSystemInjectedFields, } from '#domain/knowledge/FieldSpec.js';
16
- import { UnifiedValidator } from '#domain/knowledge/UnifiedValidator.js';
17
- import { checkDimensionType, DIMENSION_DISPLAY_GROUP } from './_shared.js';
16
+ import { checkDimensionType, DIMENSION_DISPLAY_GROUP, stripProjectNamePrefix, } from './_shared.js';
18
17
  // ────────────────────────────────────────────────────────────
19
18
  // 16. submit_knowledge
20
19
  // ────────────────────────────────────────────────────────────
@@ -71,14 +70,24 @@ export const submitCandidate = {
71
70
  description: '知识维度:code-pattern / architecture / best-practice 等',
72
71
  },
73
72
  usageGuide: { type: 'string', description: '使用指南 Markdown(### 章节格式)' },
74
- sourceFile: { type: 'string', description: '来源文件相对路径' },
73
+ sourceFile: {
74
+ type: 'string',
75
+ description: 'Recipe md 文件相对路径(由系统自动设置,无需手动填写)',
76
+ },
77
+ supersedes: {
78
+ type: 'string',
79
+ description: '被替代的旧 Recipe ID。传入后将创建 supersede 提案,72h 观察窗口后自动替代。',
80
+ },
75
81
  },
76
82
  // FieldSpec 驱动: 内部 Agent 路径排除系统注入字段
77
83
  required: getInternalAgentRequiredFields(),
78
84
  },
79
85
  handler: async (params, ctx) => {
80
- const knowledgeService = ctx.container.get('knowledgeService');
81
- // ── Bootstrap 维度类型校验 ──
86
+ // ── 标题正规化:剥离冗余的项目名前缀 ──
87
+ if (params.title) {
88
+ params.title = stripProjectNamePrefix(params.title, ctx.projectRoot);
89
+ }
90
+ // ── Bootstrap 维度类型校验(source-specific: 仅 bootstrap 流程) ──
82
91
  const dimMeta = ctx._dimensionMeta;
83
92
  if (dimMeta && ctx.source === 'system') {
84
93
  const rejected = checkDimensionType(dimMeta, params, ctx.logger);
@@ -95,89 +104,64 @@ export const submitCandidate = {
95
104
  if (!params.tags.includes('bootstrap')) {
96
105
  params.tags.push('bootstrap');
97
106
  }
98
- // Bootstrap 模式: 将 category 覆盖为展示分组 ID
99
- params._category =
100
- DIMENSION_DISPLAY_GROUP[dimMeta.id] || dimMeta.id;
101
- // ── UnifiedValidator 统一质量验证(替代 CandidateGuardrail) ──
102
- const validator = ctx._validator ||
103
- new UnifiedValidator({
104
- existingTitles: ctx._submittedTitles || new Set(),
105
- existingFingerprints: ctx._submittedPatterns || new Set(),
106
- });
107
- const validResult = validator.validate(params, {
108
- systemInjectedFields: getSystemInjectedFields(),
109
- });
110
- if (!validResult.pass) {
111
- ctx.logger?.info(`[submit_knowledge] ✗ validator rejected: ${validResult.errors.join('; ')}`);
112
- return {
113
- status: 'rejected',
114
- error: validResult.errors.join('\n'),
115
- warnings: validResult.warnings,
116
- hint: '请根据错误信息调整内容后重新提交。',
117
- };
118
- }
119
- if (validResult.warnings.length > 0) {
120
- ctx.logger?.debug(`[submit_knowledge] ⚠ warnings: ${validResult.warnings.join('; ')}`);
121
- }
107
+ // Bootstrap 模式: 将 category 设为维度 ID(前端按此分组显示)
108
+ params._category = dimMeta.id;
122
109
  }
123
110
  // ── 系统自动设置 ──
124
- const systemFields = {
111
+ const item = {
112
+ ...params,
125
113
  language: ctx._projectLanguage || '',
126
- category: dimMeta
127
- ? DIMENSION_DISPLAY_GROUP[dimMeta.id] || dimMeta.id
128
- : 'general',
129
- knowledgeType: dimMeta?.allowedKnowledgeTypes?.[0] || 'code-pattern',
114
+ category: dimMeta ? dimMeta.id : params._category || 'general',
115
+ knowledgeType: dimMeta?.allowedKnowledgeTypes?.[0] || params.knowledgeType || 'code-pattern',
130
116
  source: ctx.source === 'system' ? 'bootstrap' : 'agent',
131
- };
132
- // ── 直传 → KnowledgeEntry ──
133
- const reasoning = params.reasoning || { whyStandard: '', sources: ['agent'], confidence: 0.7 };
134
- if (Array.isArray(reasoning.sources) && reasoning.sources.length === 0) {
135
- reasoning.sources = ['agent'];
136
- }
137
- // V3 content 直透
138
- const contentObj = params.content && typeof params.content === 'object'
139
- ? params.content
140
- : { markdown: '', pattern: '' };
141
- const data = {
142
- ...systemFields,
143
- title: params.title || '',
144
- description: params.description || '',
145
- tags: params.tags || [],
146
- trigger: params.trigger || '',
147
- kind: params.kind || 'pattern',
148
- topicHint: params.topicHint || '',
149
- whenClause: params.whenClause || '',
150
- doClause: params.doClause || '',
151
- dontClause: params.dontClause || '',
152
- coreCode: contentObj.pattern || '',
153
- content: contentObj,
154
- reasoning,
155
- // V3 扩展字段直透
156
- scope: params.scope || '',
157
- complexity: params.complexity || '',
158
- headers: params.headers || [],
159
- // 注意: sourceFile 由 KnowledgeFileWriter.persist() 自动设置,
160
- // 不应从 AI params/reasoning.sources 取值(那是项目源文件路径,不是知识文件路径)
161
- sourceFile: '',
162
- // 7.3.9 agentNotes/aiInsight 注入
163
117
  agentNotes: dimMeta
164
118
  ? { dimensionId: dimMeta.id, outputType: dimMeta.outputType || 'candidate' }
165
119
  : null,
166
- aiInsight: reasoning.whyStandard || params.description || null,
167
120
  };
168
121
  if (dimMeta && ctx.source === 'system') {
169
122
  const displayGroup = DIMENSION_DISPLAY_GROUP[dimMeta.id] || dimMeta.id;
170
- data.tags = [...new Set([...(data.tags || []), displayGroup])];
123
+ item.tags = [...new Set([...(item.tags || []), displayGroup])];
171
124
  }
172
- const saved = await knowledgeService.create(data, { userId: 'agent' });
173
- // ── QualityScorer 自动评分 ──
174
- try {
175
- await knowledgeService.updateQuality(saved.id, { userId: 'agent' });
125
+ // ── 委托 RecipeProductionGateway 统一管道 ──
126
+ const { RecipeProductionGateway } = await import('#service/knowledge/RecipeProductionGateway.js');
127
+ const gateway = new RecipeProductionGateway({
128
+ knowledgeService: ctx.container.get('knowledgeService'),
129
+ projectRoot: ctx.projectRoot,
130
+ logger: ctx.logger,
131
+ proposalRepository: ctx.container.get('proposalRepository') ?? null,
132
+ });
133
+ const gatewayResult = await gateway.create({
134
+ source: 'agent-tool',
135
+ items: [item],
136
+ options: {
137
+ skipSimilarityCheck: true,
138
+ skipConsolidation: true,
139
+ supersedes: params.supersedes,
140
+ existingTitles: ctx._submittedTitles,
141
+ existingFingerprints: ctx._submittedPatterns,
142
+ systemInjectedFields: dimMeta && ctx.source === 'system' ? getSystemInjectedFields() : undefined,
143
+ userId: 'agent',
144
+ },
145
+ });
146
+ // ── 映射 Gateway 结果 → 原有返回格式 ──
147
+ if (gatewayResult.rejected.length > 0) {
148
+ const rej = gatewayResult.rejected[0];
149
+ ctx.logger?.info(`[submit_knowledge] ✗ validator rejected: ${rej.errors.join('; ')}`);
150
+ return {
151
+ status: 'rejected',
152
+ error: rej.errors.join('\n'),
153
+ warnings: rej.warnings,
154
+ hint: '请根据错误信息调整内容后重新提交。',
155
+ };
176
156
  }
177
- catch {
178
- /* best effort — 不阻塞创建流程 */
157
+ if (gatewayResult.created.length > 0) {
158
+ const created = gatewayResult.created[0];
159
+ if (gatewayResult.supersedeProposal) {
160
+ return { ...created.raw, _supersedeProposal: gatewayResult.supersedeProposal };
161
+ }
162
+ return created.raw;
179
163
  }
180
- return saved;
164
+ return { status: 'error', error: 'No items created' };
181
165
  },
182
166
  };
183
167
  // ────────────────────────────────────────────────────────────
@@ -38,10 +38,10 @@ export class AiScanService {
38
38
  // 1. 初始化 AgentFactory (内置 AI Provider + ToolExecutionPipeline + 中间件)
39
39
  try {
40
40
  this.agentFactory = this.container.get('agentFactory');
41
- // 验证 AI Provider 可用性
42
- const aiProvider = this.container.singletons?.aiProvider;
43
- if (!aiProvider || aiProvider.name === 'mock') {
44
- throw new Error('AI Provider 未配置或为 mock');
41
+ // 通过 AiProviderManager 统一检查 AI 可用性
42
+ const manager = this.container.singletons?._aiProviderManager;
43
+ if (manager.isMock) {
44
+ throw new Error('AI Provider mock 模式');
45
45
  }
46
46
  }
47
47
  catch (err) {
@@ -97,7 +97,7 @@ export class AiScanService {
97
97
  recipe.source = 'ai-scan';
98
98
  recipe.tags = [...new Set([...(recipe.tags || []), 'ai-scan', file.targetName])];
99
99
  recipe.moduleName = file.targetName;
100
- recipe.sourceFile = file.relativePath || file.name;
100
+ // 注意:不设置 sourceFile,由 KnowledgeFileWriter 持久化时自动设置为 md 文件路径
101
101
  if (!recipe.aiInsight && recipe.description) {
102
102
  recipe.aiInsight = recipe.description;
103
103
  }
@@ -348,7 +348,7 @@ export class KnowledgeSyncService {
348
348
  SET lifecycle = 'deprecated',
349
349
  rejectionReason = ?,
350
350
  updatedAt = ?
351
- WHERE id = ?`).run('source file deleted (orphan)', now, row.id);
351
+ WHERE id = ?`).run('源文件已删除(孤儿条目)', now, row.id);
352
352
  }
353
353
  }
354
354
  }
@@ -262,3 +262,4 @@ declare function checkProtocolConformance(source: string, lang: string, classNam
262
262
  classDeclLine: number | undefined;
263
263
  };
264
264
  export { analyzeFile, analyzeProject, generateContextForAgent, isAvailable, supportedLanguages, findCallExpressions, findPatternInContext, checkProtocolConformance, parseToTree, };
265
+ export type { ProjectAnalysisResult };
@@ -0,0 +1,64 @@
1
+ /**
2
+ * ConfigWatcher — 构建配置文件热更新监听器
3
+ *
4
+ * 监听自研构建系统的配置文件变更,执行增量重解析并通知下游服务。
5
+ *
6
+ * 核心策略:
7
+ * - debounce 3s(配置文件常有连续保存)
8
+ * - MD5 hash 差量检测避免无效重解析
9
+ * - 60s 最大频率保护(防 git checkout 等批量变更风暴)
10
+ * - 增量解析:单文件变更只影响对应模块
11
+ * - 通过 SignalBus 触发 PanoramaService 缓存失效
12
+ * - 通过 RealtimeService 推送 Dashboard WebSocket 事件
13
+ *
14
+ * @module ConfigWatcher
15
+ */
16
+ import type { SignalBus } from '#infra/signal/SignalBus.js';
17
+ /** 变更类型:仅影响范围不同 */
18
+ type ChangeScope = 'full' | 'module' | 'overlay';
19
+ interface ConfigChangeEvent {
20
+ /** 变更的文件列表 */
21
+ changedFiles: Array<{
22
+ path: string;
23
+ scope: ChangeScope;
24
+ moduleName?: string;
25
+ }>;
26
+ /** 配置系统 ID */
27
+ systemId: string;
28
+ /** 事件触发时间 */
29
+ timestamp: number;
30
+ }
31
+ export interface ConfigWatcherOptions {
32
+ /** 项目根目录 */
33
+ projectRoot: string;
34
+ /** 配置系统 ID(easybox / tuist / xcodegen)或自定义 */
35
+ systemId: string;
36
+ /** 自定义 watch patterns(当 systemId 不在内置表中时) */
37
+ watchPatterns?: string[];
38
+ /** 信号总线(触发缓存失效) */
39
+ signalBus?: SignalBus | null;
40
+ /** 变更回调(用于外部通知,如 RealtimeService) */
41
+ onChange?: (event: ConfigChangeEvent) => void;
42
+ /** debounce 毫秒数(默认 3000) */
43
+ debounceMs?: number;
44
+ /** 全量重建最小间隔毫秒(默认 60000) */
45
+ fullRebuildIntervalMs?: number;
46
+ }
47
+ export declare class ConfigWatcher {
48
+ #private;
49
+ constructor(options: ConfigWatcherOptions);
50
+ /**
51
+ * 启动文件监听。异步解析初始文件 hash 并注册 fs.watch。
52
+ * 自动注册 shutdown hook 以清理资源。
53
+ */
54
+ start(): Promise<void>;
55
+ /**
56
+ * 停止监听,释放所有 fs.watch 资源
57
+ */
58
+ dispose(): void;
59
+ /** 是否正在监听 */
60
+ get active(): boolean;
61
+ /** 监听的文件数 */
62
+ get watchedFileCount(): number;
63
+ }
64
+ export {};