autosnippet 3.3.7 → 3.3.8

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 (211) hide show
  1. package/README.md +1 -0
  2. package/dashboard/dist/assets/icons-BMNb0V6L.js +1 -0
  3. package/dashboard/dist/assets/index-DHJ1Dj7u.css +1 -0
  4. package/dashboard/dist/assets/index-DV8biUkH.js +112 -0
  5. package/dashboard/dist/index.html +3 -3
  6. package/dist/bin/cli.js +7 -4
  7. package/dist/lib/agent/core/ChatAgentPrompts.js +57 -21
  8. package/dist/lib/agent/core/LoopContext.d.ts +1 -0
  9. package/dist/lib/agent/core/ToolExecutionPipeline.js +13 -0
  10. package/dist/lib/agent/memory/ActiveContext.d.ts +0 -2
  11. package/dist/lib/agent/memory/ActiveContext.js +0 -2
  12. package/dist/lib/agent/memory/MemoryEmbeddingStore.d.ts +49 -0
  13. package/dist/lib/agent/memory/MemoryEmbeddingStore.js +159 -0
  14. package/dist/lib/agent/memory/MemoryRetriever.d.ts +2 -0
  15. package/dist/lib/agent/memory/MemoryRetriever.js +25 -11
  16. package/dist/lib/agent/memory/MemoryStore.d.ts +8 -41
  17. package/dist/lib/agent/memory/MemoryStore.js +196 -261
  18. package/dist/lib/agent/memory/PersistentMemory.d.ts +2 -0
  19. package/dist/lib/agent/memory/PersistentMemory.js +4 -5
  20. package/dist/lib/agent/memory/SessionStore.d.ts +0 -2
  21. package/dist/lib/agent/memory/SessionStore.js +0 -2
  22. package/dist/lib/agent/tools/ast-graph.js +21 -19
  23. package/dist/lib/agent/tools/infrastructure.js +3 -2
  24. package/dist/lib/agent/tools/project-access.d.ts +2 -2
  25. package/dist/lib/agent/tools/project-access.js +5 -4
  26. package/dist/lib/bootstrap.js +2 -1
  27. package/dist/lib/cli/AiScanService.js +4 -17
  28. package/dist/lib/cli/KnowledgeSyncService.d.ts +7 -37
  29. package/dist/lib/cli/KnowledgeSyncService.js +23 -51
  30. package/dist/lib/core/ast/ProjectGraph.js +5 -27
  31. package/dist/lib/core/discovery/CustomConfigDiscoverer.d.ts +0 -2
  32. package/dist/lib/core/discovery/CustomConfigDiscoverer.js +0 -2
  33. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +0 -2
  34. package/dist/lib/domain/dimension/DimensionRegistry.js +0 -2
  35. package/dist/lib/domain/dimension/DimensionSop.js +44 -33
  36. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +0 -2
  37. package/dist/lib/domain/dimension/UnifiedDimension.js +0 -2
  38. package/dist/lib/domain/knowledge/Lifecycle.d.ts +26 -0
  39. package/dist/lib/domain/knowledge/Lifecycle.js +42 -0
  40. package/dist/lib/domain/knowledge/index.d.ts +2 -1
  41. package/dist/lib/domain/knowledge/index.js +1 -1
  42. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.d.ts +2 -1
  43. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.js +102 -153
  44. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +33 -16
  45. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +1 -1
  46. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +41 -37
  47. package/dist/lib/external/mcp/handlers/bootstrap-external.js +1 -1
  48. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +7 -3
  49. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +1 -0
  50. package/dist/lib/external/mcp/handlers/evolve-external.js +13 -16
  51. package/dist/lib/external/mcp/handlers/guard.js +15 -24
  52. package/dist/lib/external/mcp/handlers/panorama.js +9 -9
  53. package/dist/lib/external/mcp/handlers/rescan-external.js +7 -6
  54. package/dist/lib/external/mcp/handlers/rescan-internal.js +9 -5
  55. package/dist/lib/external/mcp/handlers/search.js +3 -1
  56. package/dist/lib/external/mcp/handlers/skill.js +4 -4
  57. package/dist/lib/external/mcp/handlers/structure.js +8 -12
  58. package/dist/lib/external/mcp/handlers/system.js +10 -34
  59. package/dist/lib/http/routes/ai.js +11 -13
  60. package/dist/lib/http/routes/guardReport.js +3 -5
  61. package/dist/lib/http/routes/panorama.js +12 -12
  62. package/dist/lib/http/routes/recipes.js +59 -8
  63. package/dist/lib/http/routes/remote.js +3 -13
  64. package/dist/lib/http/routes/search.js +11 -8
  65. package/dist/lib/infrastructure/audit/AuditLogger.d.ts +20 -3
  66. package/dist/lib/infrastructure/audit/AuditStore.d.ts +28 -29
  67. package/dist/lib/infrastructure/audit/AuditStore.js +81 -88
  68. package/dist/lib/infrastructure/database/drizzle/schema.d.ts +180 -2
  69. package/dist/lib/infrastructure/database/drizzle/schema.js +23 -3
  70. package/dist/lib/injection/ServiceContainer.js +7 -4
  71. package/dist/lib/injection/ServiceMap.d.ts +20 -0
  72. package/dist/lib/injection/modules/AppModule.js +2 -1
  73. package/dist/lib/injection/modules/GuardModule.js +5 -5
  74. package/dist/lib/injection/modules/InfraModule.js +60 -0
  75. package/dist/lib/injection/modules/KnowledgeModule.js +86 -51
  76. package/dist/lib/injection/modules/PanoramaModule.js +16 -10
  77. package/dist/lib/injection/modules/VectorModule.js +3 -0
  78. package/dist/lib/repository/audit/AuditRepository.d.ts +107 -0
  79. package/dist/lib/repository/audit/AuditRepository.js +272 -0
  80. package/dist/lib/repository/base/RepositoryBase.d.ts +46 -0
  81. package/dist/lib/repository/base/RepositoryBase.js +32 -0
  82. package/dist/lib/repository/bootstrap/BootstrapRepository.d.ts +94 -0
  83. package/dist/lib/repository/bootstrap/BootstrapRepository.js +246 -0
  84. package/dist/lib/repository/code/CodeEntityRepository.d.ts +91 -0
  85. package/dist/lib/repository/code/CodeEntityRepository.js +361 -0
  86. package/dist/lib/repository/delivery/DeliveryRepoAdapter.d.ts +39 -0
  87. package/dist/lib/repository/delivery/DeliveryRepoAdapter.js +23 -0
  88. package/dist/lib/repository/evolution/LifecycleEventRepository.d.ts +51 -0
  89. package/dist/lib/repository/evolution/LifecycleEventRepository.js +119 -0
  90. package/dist/lib/repository/evolution/ProposalRepository.d.ts +9 -12
  91. package/dist/lib/repository/evolution/ProposalRepository.js +114 -57
  92. package/dist/lib/repository/guard/GuardViolationRepository.d.ts +104 -0
  93. package/dist/lib/repository/guard/GuardViolationRepository.js +217 -0
  94. package/dist/lib/repository/knowledge/KnowledgeEdgeRepository.d.ts +129 -0
  95. package/dist/lib/repository/knowledge/KnowledgeEdgeRepository.js +475 -0
  96. package/dist/lib/repository/knowledge/KnowledgeFileStore.d.ts +39 -0
  97. package/dist/lib/repository/knowledge/KnowledgeFileStore.js +12 -0
  98. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +295 -11
  99. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +608 -13
  100. package/dist/lib/repository/knowledge/KnowledgeUnitOfWork.d.ts +61 -0
  101. package/dist/lib/repository/knowledge/KnowledgeUnitOfWork.js +156 -0
  102. package/dist/lib/repository/memory/MemoryRepository.d.ts +90 -0
  103. package/dist/lib/repository/memory/MemoryRepository.js +260 -0
  104. package/dist/lib/repository/search/SearchRepoAdapter.d.ts +92 -0
  105. package/dist/lib/repository/search/SearchRepoAdapter.js +124 -0
  106. package/dist/lib/repository/session/SessionRepository.d.ts +46 -0
  107. package/dist/lib/repository/session/SessionRepository.js +110 -0
  108. package/dist/lib/repository/sourceref/RecipeSourceRefRepository.d.ts +66 -0
  109. package/dist/lib/repository/sourceref/RecipeSourceRefRepository.js +182 -0
  110. package/dist/lib/repository/sync/SyncRepoAdapter.d.ts +58 -0
  111. package/dist/lib/repository/sync/SyncRepoAdapter.js +58 -0
  112. package/dist/lib/service/bootstrap/UiStartupTasks.js +5 -6
  113. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +0 -1
  114. package/dist/lib/service/bootstrap/bootstrap-event-types.js +0 -1
  115. package/dist/lib/service/cleanup/CleanupService.js +8 -4
  116. package/dist/lib/service/delivery/CursorDeliveryPipeline.js +6 -8
  117. package/dist/lib/service/evolution/ConsolidationAdvisor.d.ts +4 -9
  118. package/dist/lib/service/evolution/ConsolidationAdvisor.js +34 -70
  119. package/dist/lib/service/evolution/ContentPatcher.d.ts +4 -12
  120. package/dist/lib/service/evolution/ContentPatcher.js +48 -19
  121. package/dist/lib/service/evolution/ContradictionDetector.d.ts +3 -7
  122. package/dist/lib/service/evolution/ContradictionDetector.js +17 -24
  123. package/dist/lib/service/evolution/DecayDetector.d.ts +10 -9
  124. package/dist/lib/service/evolution/DecayDetector.js +63 -57
  125. package/dist/lib/service/evolution/EnhancementSuggester.d.ts +3 -9
  126. package/dist/lib/service/evolution/EnhancementSuggester.js +42 -86
  127. package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +4 -4
  128. package/dist/lib/service/evolution/KnowledgeMetabolism.js +102 -71
  129. package/dist/lib/service/evolution/ProposalExecutor.d.ts +5 -12
  130. package/dist/lib/service/evolution/ProposalExecutor.js +64 -69
  131. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +9 -14
  132. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +94 -155
  133. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +4 -1
  134. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +50 -49
  135. package/dist/lib/service/evolution/RedundancyAnalyzer.d.ts +3 -7
  136. package/dist/lib/service/evolution/RedundancyAnalyzer.js +15 -22
  137. package/dist/lib/service/evolution/StagingManager.d.ts +6 -15
  138. package/dist/lib/service/evolution/StagingManager.js +37 -95
  139. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +1 -1
  140. package/dist/lib/service/evolution/createSupersedeProposal.js +7 -8
  141. package/dist/lib/service/guard/CoverageAnalyzer.d.ts +3 -7
  142. package/dist/lib/service/guard/CoverageAnalyzer.js +9 -11
  143. package/dist/lib/service/guard/GuardCheckEngine.d.ts +3 -0
  144. package/dist/lib/service/guard/GuardCheckEngine.js +14 -22
  145. package/dist/lib/service/guard/ReverseGuard.d.ts +4 -7
  146. package/dist/lib/service/guard/ReverseGuard.js +21 -31
  147. package/dist/lib/service/guard/ViolationsStore.d.ts +15 -21
  148. package/dist/lib/service/guard/ViolationsStore.js +75 -69
  149. package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +39 -63
  150. package/dist/lib/service/knowledge/CodeEntityGraph.js +418 -512
  151. package/dist/lib/service/knowledge/ConfidenceRouter.js +18 -9
  152. package/dist/lib/service/knowledge/KnowledgeFileWriter.d.ts +2 -1
  153. package/dist/lib/service/knowledge/KnowledgeGraphService.d.ts +18 -60
  154. package/dist/lib/service/knowledge/KnowledgeGraphService.js +58 -109
  155. package/dist/lib/service/knowledge/KnowledgeService.d.ts +15 -1
  156. package/dist/lib/service/knowledge/KnowledgeService.js +76 -38
  157. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +0 -2
  158. package/dist/lib/service/knowledge/RecipeProductionGateway.js +0 -2
  159. package/dist/lib/service/knowledge/SourceRefReconciler.d.ts +5 -13
  160. package/dist/lib/service/knowledge/SourceRefReconciler.js +58 -78
  161. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +5 -3
  162. package/dist/lib/service/panorama/CouplingAnalyzer.js +102 -39
  163. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +7 -4
  164. package/dist/lib/service/panorama/DimensionAnalyzer.js +72 -25
  165. package/dist/lib/service/panorama/LayerInferrer.js +1 -1
  166. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +7 -6
  167. package/dist/lib/service/panorama/ModuleDiscoverer.js +174 -82
  168. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +10 -3
  169. package/dist/lib/service/panorama/PanoramaAggregator.js +67 -79
  170. package/dist/lib/service/panorama/PanoramaScanner.d.ts +5 -1
  171. package/dist/lib/service/panorama/PanoramaScanner.js +32 -31
  172. package/dist/lib/service/panorama/PanoramaService.d.ts +11 -8
  173. package/dist/lib/service/panorama/PanoramaService.js +41 -66
  174. package/dist/lib/service/panorama/PanoramaTypes.d.ts +3 -0
  175. package/dist/lib/service/panorama/RoleRefiner.d.ts +8 -5
  176. package/dist/lib/service/panorama/RoleRefiner.js +52 -283
  177. package/dist/lib/service/panorama/TechStackProfiler.js +7 -119
  178. package/dist/lib/service/quality/QualityScorer.d.ts +45 -26
  179. package/dist/lib/service/quality/QualityScorer.js +157 -83
  180. package/dist/lib/service/search/SearchEngine.d.ts +1 -0
  181. package/dist/lib/service/search/SearchEngine.js +32 -37
  182. package/dist/lib/service/signal/HitRecorder.js +5 -5
  183. package/dist/lib/service/skills/RuleRecallStrategy.js +7 -3
  184. package/dist/lib/service/skills/SignalCollector.d.ts +5 -8
  185. package/dist/lib/service/skills/SignalCollector.js +28 -55
  186. package/dist/lib/service/skills/SkillAdvisor.d.ts +7 -13
  187. package/dist/lib/service/skills/SkillAdvisor.js +30 -79
  188. package/dist/lib/service/vector/SyncCoordinator.d.ts +3 -1
  189. package/dist/lib/service/vector/SyncCoordinator.js +25 -3
  190. package/dist/lib/service/vector/VectorService.d.ts +2 -0
  191. package/dist/lib/service/vector/VectorService.js +3 -0
  192. package/dist/lib/service/wiki/WikiGenerator.js +1 -1
  193. package/dist/lib/shared/LanguageProfiles.d.ts +109 -0
  194. package/dist/lib/shared/LanguageProfiles.js +939 -0
  195. package/dist/lib/shared/LanguageService.d.ts +6 -0
  196. package/dist/lib/shared/LanguageService.js +16 -0
  197. package/dist/lib/shared/constants.d.ts +19 -19
  198. package/dist/lib/shared/constants.js +10 -10
  199. package/dist/lib/shared/schemas/mcp-tools.d.ts +1 -1
  200. package/dist/lib/types/project-snapshot-builder.d.ts +0 -1
  201. package/dist/lib/types/project-snapshot-builder.js +0 -1
  202. package/dist/lib/types/project-snapshot.d.ts +0 -1
  203. package/dist/lib/types/project-snapshot.js +0 -1
  204. package/dist/lib/types/snapshot-views.d.ts +0 -2
  205. package/dist/lib/types/snapshot-views.js +0 -1
  206. package/package.json +2 -1
  207. package/dashboard/dist/assets/icons-FHns2ypa.js +0 -1
  208. package/dashboard/dist/assets/index-BRJv5Y3r.js +0 -135
  209. package/dashboard/dist/assets/index-DzoB7kxK.css +0 -1
  210. package/dist/lib/repository/base/BaseRepository.d.ts +0 -53
  211. package/dist/lib/repository/base/BaseRepository.js +0 -226
@@ -14,6 +14,7 @@ import { getEnhancementRegistry } from '../../core/enhancement/index.js';
14
14
  import { HnswVectorAdapter } from '../../infrastructure/vector/HnswVectorAdapter.js';
15
15
  import { IndexingPipeline } from '../../infrastructure/vector/IndexingPipeline.js';
16
16
  import { JsonVectorAdapter } from '../../infrastructure/vector/JsonVectorAdapter.js';
17
+ import { LifecycleEventRepository } from '../../repository/evolution/LifecycleEventRepository.js';
17
18
  import { ProposalRepository } from '../../repository/evolution/ProposalRepository.js';
18
19
  import { ConsolidationAdvisor } from '../../service/evolution/ConsolidationAdvisor.js';
19
20
  import { ContentPatcher } from '../../service/evolution/ContentPatcher.js';
@@ -42,11 +43,13 @@ export function register(c) {
42
43
  confidenceRouter: ct.get('confidenceRouter'),
43
44
  qualityScorer: ct.get('qualityScorer'),
44
45
  eventBus: ct.services.eventBus ? ct.get('eventBus') : null,
46
+ edgeRepo: ct.get('knowledgeEdgeRepository'),
47
+ proposalRepo: ct.get('proposalRepository'),
45
48
  }));
46
- c.singleton('knowledgeGraphService', (ct) => new KnowledgeGraphService(ct.get('database')));
49
+ c.singleton('knowledgeGraphService', (ct) => new KnowledgeGraphService(ct.get('knowledgeEdgeRepository')));
47
50
  c.singleton('codeEntityGraph', (ct) => {
48
51
  const projectRoot = resolveProjectRoot(ct);
49
- return new CodeEntityGraph(ct.get('database'), { projectRoot });
52
+ return new CodeEntityGraph(ct.get('codeEntityRepository'), ct.get('knowledgeEdgeRepository'), { projectRoot });
50
53
  });
51
54
  // ═══ Search + Vector ═══
52
55
  c.singleton('searchEngine', (ct) => {
@@ -58,11 +61,10 @@ export function register(c) {
58
61
  vectorStore: ct.get('vectorStore'),
59
62
  vectorService,
60
63
  hybridRetriever: ct.get('hybridRetriever'),
61
- // CrossEncoderReranker disabled — BM25+vector dual-recall + CoarseRanker + MultiSignalRanker
62
- // is sufficient for knowledge-base scale (hundreds~thousands of entries).
63
- // Re-enable when document scale grows to 10k+ or external noisy sources are integrated.
64
64
  crossEncoderReranker: null,
65
65
  signalBus: ct.singletons.signalBus || null,
66
+ knowledgeRepo: ct.get('knowledgeRepository'),
67
+ sourceRefRepo: ct.get('recipeSourceRefRepository'),
66
68
  });
67
69
  }, { aiDependent: true });
68
70
  c.singleton('vectorStore', (ct) => {
@@ -135,39 +137,47 @@ export function register(c) {
135
137
  c.register('projectGraph', () => c.singletons.projectGraph || null);
136
138
  // ═══ Governance / Evolution ═══
137
139
  c.singleton('sourceRefReconciler', (ct) => {
138
- const db = ct.get('database');
139
140
  const projectRoot = resolveProjectRoot();
140
- return new SourceRefReconciler(projectRoot, db.getDb(), {
141
+ const sourceRefRepo = ct.get('recipeSourceRefRepository');
142
+ const knowledgeRepo = ct.get('knowledgeRepository');
143
+ return new SourceRefReconciler(projectRoot, sourceRefRepo, knowledgeRepo, {
141
144
  signalBus: ct.singletons.signalBus || undefined,
142
145
  });
143
146
  });
144
147
  c.singleton('stagingManager', (ct) => {
145
- const db = ct.get('database');
146
- return new StagingManager(db.getDb(), {
148
+ const knowledgeRepo = ct.get('knowledgeRepository');
149
+ return new StagingManager(knowledgeRepo, {
147
150
  signalBus: ct.singletons.signalBus || undefined,
148
151
  });
149
152
  });
150
153
  c.singleton('decayDetector', (ct) => {
151
- const db = ct.get('database');
152
- return new DecayDetector(db.getDb(), {
154
+ const knowledgeRepo = ct.get('knowledgeRepository');
155
+ return new DecayDetector(knowledgeRepo, {
153
156
  signalBus: ct.singletons.signalBus || undefined,
157
+ knowledgeEdgeRepo: ct.services.knowledgeEdgeRepository
158
+ ? ct.get('knowledgeEdgeRepository')
159
+ : undefined,
160
+ sourceRefRepo: ct.services.recipeSourceRefRepository
161
+ ? ct.get('recipeSourceRefRepository')
162
+ : undefined,
163
+ drizzle: ct.get('database').getDrizzle(),
154
164
  });
155
165
  });
156
166
  c.singleton('contradictionDetector', (ct) => {
157
- const db = ct.get('database');
158
- return new ContradictionDetector(db.getDb(), {
167
+ const knowledgeRepo = ct.get('knowledgeRepository');
168
+ return new ContradictionDetector(knowledgeRepo, {
159
169
  signalBus: ct.singletons.signalBus || undefined,
160
170
  });
161
171
  });
162
172
  c.singleton('redundancyAnalyzer', (ct) => {
163
- const db = ct.get('database');
164
- return new RedundancyAnalyzer(db.getDb(), {
173
+ const knowledgeRepo = ct.get('knowledgeRepository');
174
+ return new RedundancyAnalyzer(knowledgeRepo, {
165
175
  signalBus: ct.singletons.signalBus || undefined,
166
176
  });
167
177
  });
168
178
  c.singleton('enhancementSuggester', (ct) => {
169
- const db = ct.get('database');
170
- return new EnhancementSuggester(db.getDb(), {
179
+ const knowledgeRepo = ct.get('knowledgeRepository');
180
+ return new EnhancementSuggester(knowledgeRepo, {
171
181
  signalBus: ct.singletons.signalBus || undefined,
172
182
  });
173
183
  });
@@ -184,29 +194,45 @@ export function register(c) {
184
194
  });
185
195
  c.singleton('proposalRepository', (ct) => {
186
196
  const db = ct.get('database');
187
- return new ProposalRepository(db.getDb());
197
+ const drizzle = db.getDrizzle();
198
+ return new ProposalRepository(drizzle);
188
199
  });
189
200
  c.singleton('contentPatcher', (ct) => {
201
+ const knowledgeRepo = ct.get('knowledgeRepository');
202
+ const sourceRefRepo = ct.get('recipeSourceRefRepository');
203
+ return new ContentPatcher(knowledgeRepo, sourceRefRepo);
204
+ });
205
+ c.singleton('lifecycleEventRepository', (ct) => {
190
206
  const db = ct.get('database');
191
- return new ContentPatcher(db.getDb());
207
+ const drizzle = db.getDrizzle();
208
+ return new LifecycleEventRepository(drizzle);
192
209
  });
193
210
  c.singleton('lifecycleSupervisor', (ct) => {
194
- const db = ct.get('database');
195
- return new RecipeLifecycleSupervisor(db.getDb(), {
211
+ const knowledgeRepo = ct.get('knowledgeRepository');
212
+ return new RecipeLifecycleSupervisor(knowledgeRepo, {
196
213
  signalBus: ct.singletons.signalBus || undefined,
214
+ lifecycleEventRepo: ct.services.lifecycleEventRepository
215
+ ? ct.get('lifecycleEventRepository')
216
+ : undefined,
217
+ proposalRepo: ct.services.proposalRepository
218
+ ? ct.get('proposalRepository')
219
+ : undefined,
197
220
  });
198
221
  });
199
222
  c.singleton('proposalExecutor', (ct) => {
200
- const db = ct.get('database');
201
- return new ProposalExecutor(db.getDb(), ct.get('proposalRepository'), {
223
+ const knowledgeRepo = ct.get('knowledgeRepository');
224
+ return new ProposalExecutor(knowledgeRepo, ct.get('proposalRepository'), {
202
225
  signalBus: ct.singletons.signalBus || undefined,
203
226
  contentPatcher: ct.get('contentPatcher'),
204
227
  supervisor: ct.get('lifecycleSupervisor'),
228
+ knowledgeEdgeRepo: ct.services.knowledgeEdgeRepository
229
+ ? ct.get('knowledgeEdgeRepository')
230
+ : undefined,
205
231
  });
206
232
  });
207
233
  c.singleton('consolidationAdvisor', (ct) => {
208
- const db = ct.get('database');
209
- return new ConsolidationAdvisor(db.getDb());
234
+ const knowledgeRepo = ct.get('knowledgeRepository');
235
+ return new ConsolidationAdvisor(knowledgeRepo);
210
236
  });
211
237
  }
212
238
  /**
@@ -235,7 +261,7 @@ export function initializeKnowledgeServices(c) {
235
261
  try {
236
262
  const d = data;
237
263
  if (d.action === 'create' && d.entryId) {
238
- _populateSourceRefsForEntry(c, d.entryId);
264
+ void _populateSourceRefsForEntry(c, d.entryId);
239
265
  }
240
266
  }
241
267
  catch {
@@ -256,36 +282,45 @@ function await_import_EventBus() {
256
282
  }
257
283
  /**
258
284
  * 从 knowledge_entries.reasoning 中提取 sources 并填充 recipe_source_refs 桥接表
285
+ * 使用 KnowledgeRepository + RecipeSourceRefRepository 类型安全 API
259
286
  */
260
- function _populateSourceRefsForEntry(c, entryId) {
261
- const db = c.get('database');
262
- const rawDb = db.getDb();
263
- const row = rawDb.prepare(`SELECT reasoning FROM knowledge_entries WHERE id = ?`).get(entryId);
264
- if (!row?.reasoning) {
265
- return;
266
- }
267
- let sources = [];
287
+ async function _populateSourceRefsForEntry(c, entryId) {
268
288
  try {
269
- const reasoning = JSON.parse(row.reasoning);
270
- sources = Array.isArray(reasoning.sources)
271
- ? reasoning.sources.filter((s) => typeof s === 'string' && s.length > 0)
272
- : [];
273
- }
274
- catch {
275
- return;
276
- }
277
- if (sources.length === 0) {
278
- return;
279
- }
280
- const now = Date.now();
281
- const upsert = rawDb.prepare(`INSERT OR REPLACE INTO recipe_source_refs (recipe_id, source_path, status, verified_at)
282
- VALUES (?, ?, 'active', ?)`);
283
- for (const sourcePath of sources) {
289
+ const knowledgeRepo = c.get('knowledgeRepository');
290
+ const sourceRefRepo = c.get('recipeSourceRefRepository');
291
+ const row = await knowledgeRepo.findSourceFileAndReasoning(entryId);
292
+ if (!row?.reasoning) {
293
+ return;
294
+ }
295
+ let sources = [];
284
296
  try {
285
- upsert.run(entryId, sourcePath, now);
297
+ const reasoning = JSON.parse(row.reasoning);
298
+ sources = Array.isArray(reasoning.sources)
299
+ ? reasoning.sources.filter((s) => typeof s === 'string' && s.length > 0)
300
+ : [];
286
301
  }
287
302
  catch {
288
- /* table may not exist yet */
303
+ return;
304
+ }
305
+ if (sources.length === 0) {
306
+ return;
289
307
  }
308
+ const now = Date.now();
309
+ for (const sourcePath of sources) {
310
+ try {
311
+ sourceRefRepo.upsert({
312
+ recipeId: entryId,
313
+ sourcePath,
314
+ status: 'active',
315
+ verifiedAt: now,
316
+ });
317
+ }
318
+ catch {
319
+ /* table may not exist yet */
320
+ }
321
+ }
322
+ }
323
+ catch {
324
+ /* repos may not be registered yet */
290
325
  }
291
326
  }
@@ -23,16 +23,16 @@ import { RoleRefiner } from '../../service/panorama/RoleRefiner.js';
23
23
  export const PanoramaModule = {
24
24
  register(container) {
25
25
  const ct = container;
26
- const getDb = () => {
27
- const db = ct.singletons.database;
28
- return (db?.getDb ? db.getDb() : db);
29
- };
30
26
  const getProjectRoot = () => ct.config?.projectRoot ?? process.cwd();
31
- ct.singleton('moduleDiscoverer', () => new ModuleDiscoverer(getDb(), getProjectRoot()));
32
- ct.singleton('roleRefiner', () => new RoleRefiner(getDb(), getProjectRoot()));
33
- ct.singleton('couplingAnalyzer', () => new CouplingAnalyzer(getDb(), getProjectRoot()));
27
+ const getBootstrapRepo = () => container.get('bootstrapRepository');
28
+ const getEntityRepo = () => container.get('codeEntityRepository');
29
+ const getEdgeRepo = () => container.get('knowledgeEdgeRepository');
30
+ const getKnowledgeRepo = () => container.get('knowledgeRepository');
31
+ ct.singleton('moduleDiscoverer', () => new ModuleDiscoverer(getEntityRepo(), getEdgeRepo(), getProjectRoot()));
32
+ ct.singleton('roleRefiner', () => new RoleRefiner(getBootstrapRepo(), getEntityRepo(), getEdgeRepo(), getProjectRoot()));
33
+ ct.singleton('couplingAnalyzer', () => new CouplingAnalyzer(getEdgeRepo(), getEntityRepo(), getProjectRoot()));
34
34
  ct.singleton('layerInferrer', () => new LayerInferrer());
35
- ct.singleton('dimensionAnalyzer', () => new DimensionAnalyzer(getDb(), getProjectRoot()));
35
+ ct.singleton('dimensionAnalyzer', () => new DimensionAnalyzer(getBootstrapRepo(), getEntityRepo(), getKnowledgeRepo(), getProjectRoot()));
36
36
  ct.singleton('panoramaAggregator', (c) => {
37
37
  const sc = c;
38
38
  const roleRefiner = sc.get('roleRefiner');
@@ -43,7 +43,10 @@ export const PanoramaModule = {
43
43
  roleRefiner,
44
44
  couplingAnalyzer,
45
45
  layerInferrer,
46
- db: getDb(),
46
+ bootstrapRepo: getBootstrapRepo(),
47
+ entityRepo: getEntityRepo(),
48
+ edgeRepo: getEdgeRepo(),
49
+ knowledgeRepo: getKnowledgeRepo(),
47
50
  projectRoot: getProjectRoot(),
48
51
  dimensionAnalyzer,
49
52
  });
@@ -56,6 +59,8 @@ export const PanoramaModule = {
56
59
  return new PanoramaScanner({
57
60
  projectRoot: getProjectRoot(),
58
61
  container: container,
62
+ entityRepo: getEntityRepo(),
63
+ edgeRepo: getEdgeRepo(),
59
64
  logger,
60
65
  });
61
66
  });
@@ -66,7 +71,8 @@ export const PanoramaModule = {
66
71
  const moduleDiscoverer = sc.get('moduleDiscoverer');
67
72
  return new PanoramaService({
68
73
  aggregator,
69
- db: getDb(),
74
+ edgeRepo: getEdgeRepo(),
75
+ knowledgeRepo: getKnowledgeRepo(),
70
76
  projectRoot: getProjectRoot(),
71
77
  scanner,
72
78
  moduleDiscoverer,
@@ -39,6 +39,9 @@ export function register(c) {
39
39
  : null,
40
40
  autoSyncOnCrud: config.autoSyncOnCrud !== false,
41
41
  syncDebounceMs: config.syncDebounceMs || 2000,
42
+ drizzle: ct.services.database
43
+ ? ct.get('database').getDrizzle?.()
44
+ : undefined,
42
45
  });
43
46
  }, { aiDependent: true });
44
47
  }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * AuditRepository — 审计日志的仓储实现
3
+ *
4
+ * 从 AuditStore 提取的数据操作,
5
+ * 使用 Drizzle 类型安全 API 操作 audit_logs 表。
6
+ */
7
+ import { auditLogs } from '../../infrastructure/database/drizzle/schema.js';
8
+ import { RepositoryBase } from '../base/RepositoryBase.js';
9
+ export interface AuditLogEntity {
10
+ id: string;
11
+ timestamp: number;
12
+ actor: string;
13
+ actorContext: Record<string, unknown>;
14
+ action: string;
15
+ resource: string | null;
16
+ operationData: Record<string, unknown>;
17
+ result: string;
18
+ errorMessage: string | null;
19
+ duration: number | null;
20
+ }
21
+ export interface AuditLogInsert {
22
+ id: string;
23
+ timestamp: number;
24
+ actor: string;
25
+ actorContext?: string;
26
+ action: string;
27
+ resource?: string;
28
+ operationData?: string;
29
+ result: string;
30
+ errorMessage?: string | null;
31
+ duration?: number | null;
32
+ }
33
+ export interface AuditQueryFilters {
34
+ actor?: string;
35
+ action?: string;
36
+ result?: string;
37
+ startDate?: number;
38
+ endDate?: number;
39
+ limit?: number;
40
+ }
41
+ export interface AuditStats {
42
+ timeRange: string;
43
+ total: number;
44
+ success: number;
45
+ failure: number;
46
+ successRate: string;
47
+ avgDuration: string;
48
+ byActor: Array<{
49
+ actor: string;
50
+ count: number;
51
+ }>;
52
+ byAction: Array<{
53
+ action: string;
54
+ count: number;
55
+ }>;
56
+ }
57
+ export declare class AuditRepositoryImpl extends RepositoryBase<typeof auditLogs, AuditLogEntity> {
58
+ #private;
59
+ constructor(drizzle: ConstructorParameters<typeof RepositoryBase<typeof auditLogs, AuditLogEntity>>[0]);
60
+ findById(id: string): Promise<AuditLogEntity | null>;
61
+ create(data: AuditLogInsert): Promise<AuditLogEntity>;
62
+ delete(id: string): Promise<boolean>;
63
+ /** 动态多条件查询 */
64
+ query(filters?: AuditQueryFilters): Promise<AuditLogEntity[]>;
65
+ /** 根据请求 ID 查询 */
66
+ findByRequestId(requestId: string): Promise<AuditLogEntity | null>;
67
+ /** 根据角色查询 */
68
+ findByActor(actor: string, limit?: number): Promise<AuditLogEntity[]>;
69
+ /** 根据操作查询 */
70
+ findByAction(action: string, limit?: number): Promise<AuditLogEntity[]>;
71
+ /** 根据结果查询 */
72
+ findByResult(result: string, limit?: number): Promise<AuditLogEntity[]>;
73
+ /** 获取统计数据 */
74
+ getStats(timeRange?: string): Promise<AuditStats>;
75
+ /**
76
+ * 清理过期审计日志
77
+ * @param maxAgeDays 保留天数
78
+ */
79
+ cleanup(maxAgeDays?: number): Promise<{
80
+ deleted: number;
81
+ }>;
82
+ /**
83
+ * Guard 违规规则名 TOP-N (SkillAdvisor.#getGuardPatterns)
84
+ */
85
+ findTopGuardViolationRules(minCount: number, limit: number): Promise<Array<{
86
+ ruleName: string;
87
+ cnt: number;
88
+ }>>;
89
+ /**
90
+ * Guard 违规信号 (SignalCollector.#collectGuardSignals)
91
+ */
92
+ findGuardViolationSignals(limit: number): Promise<Array<{
93
+ ruleName: string;
94
+ cnt: number;
95
+ lastAt: number;
96
+ }>>;
97
+ /**
98
+ * 最近动作日志 (SignalCollector.#collectActionSignals)
99
+ */
100
+ findRecentActions(sinceTs: number, limit: number): Promise<Array<{
101
+ actor: string;
102
+ action: string;
103
+ resource: string | null;
104
+ result: string;
105
+ timestamp: number;
106
+ }>>;
107
+ }
@@ -0,0 +1,272 @@
1
+ /**
2
+ * AuditRepository — 审计日志的仓储实现
3
+ *
4
+ * 从 AuditStore 提取的数据操作,
5
+ * 使用 Drizzle 类型安全 API 操作 audit_logs 表。
6
+ */
7
+ import { and, avg, count, desc, eq, gt, gte, like, lte, sql } from 'drizzle-orm';
8
+ import { auditLogs } from '../../infrastructure/database/drizzle/schema.js';
9
+ import { RepositoryBase } from '../base/RepositoryBase.js';
10
+ /* ═══ Repository 实现 ═══ */
11
+ export class AuditRepositoryImpl extends RepositoryBase {
12
+ constructor(drizzle) {
13
+ super(drizzle, auditLogs);
14
+ }
15
+ /* ─── CRUD ─── */
16
+ async findById(id) {
17
+ const row = this.drizzle.select().from(this.table).where(eq(this.table.id, id)).limit(1).get();
18
+ return row ? this.#mapRow(row) : null;
19
+ }
20
+ async create(data) {
21
+ this.drizzle
22
+ .insert(this.table)
23
+ .values({
24
+ id: data.id,
25
+ timestamp: data.timestamp,
26
+ actor: data.actor,
27
+ actorContext: data.actorContext ?? '{}',
28
+ action: data.action,
29
+ resource: data.resource ?? null,
30
+ operationData: data.operationData ?? '{}',
31
+ result: data.result,
32
+ errorMessage: data.errorMessage ?? null,
33
+ duration: data.duration ?? null,
34
+ })
35
+ .run();
36
+ return (await this.findById(data.id));
37
+ }
38
+ async delete(id) {
39
+ const result = this.drizzle.delete(this.table).where(eq(this.table.id, id)).run();
40
+ return result.changes > 0;
41
+ }
42
+ /* ─── 查询 ─── */
43
+ /** 动态多条件查询 */
44
+ async query(filters = {}) {
45
+ const conditions = [];
46
+ if (filters.actor) {
47
+ conditions.push(eq(this.table.actor, filters.actor));
48
+ }
49
+ if (filters.action) {
50
+ conditions.push(eq(this.table.action, filters.action));
51
+ }
52
+ if (filters.result) {
53
+ conditions.push(eq(this.table.result, filters.result));
54
+ }
55
+ if (filters.startDate) {
56
+ conditions.push(gte(this.table.timestamp, filters.startDate));
57
+ }
58
+ if (filters.endDate) {
59
+ conditions.push(lte(this.table.timestamp, filters.endDate));
60
+ }
61
+ const condition = conditions.length > 0 ? and(...conditions) : undefined;
62
+ let query = this.drizzle
63
+ .select()
64
+ .from(this.table)
65
+ .where(condition)
66
+ .orderBy(desc(this.table.timestamp));
67
+ if (filters.limit) {
68
+ query = query.limit(filters.limit);
69
+ }
70
+ return query.all().map((r) => this.#mapRow(r));
71
+ }
72
+ /** 根据请求 ID 查询 */
73
+ async findByRequestId(requestId) {
74
+ return this.findById(requestId);
75
+ }
76
+ /** 根据角色查询 */
77
+ async findByActor(actor, limit = 100) {
78
+ const rows = this.drizzle
79
+ .select()
80
+ .from(this.table)
81
+ .where(eq(this.table.actor, actor))
82
+ .orderBy(desc(this.table.timestamp))
83
+ .limit(limit)
84
+ .all();
85
+ return rows.map((r) => this.#mapRow(r));
86
+ }
87
+ /** 根据操作查询 */
88
+ async findByAction(action, limit = 100) {
89
+ const rows = this.drizzle
90
+ .select()
91
+ .from(this.table)
92
+ .where(eq(this.table.action, action))
93
+ .orderBy(desc(this.table.timestamp))
94
+ .limit(limit)
95
+ .all();
96
+ return rows.map((r) => this.#mapRow(r));
97
+ }
98
+ /** 根据结果查询 */
99
+ async findByResult(result, limit = 100) {
100
+ const rows = this.drizzle
101
+ .select()
102
+ .from(this.table)
103
+ .where(eq(this.table.result, result))
104
+ .orderBy(desc(this.table.timestamp))
105
+ .limit(limit)
106
+ .all();
107
+ return rows.map((r) => this.#mapRow(r));
108
+ }
109
+ /* ─── 统计 ─── */
110
+ /** 获取统计数据 */
111
+ async getStats(timeRange = '24h') {
112
+ const hours = timeRange === '24h' ? 24 : timeRange === '7d' ? 168 : 720; // 30d
113
+ const startTime = Date.now() - hours * 60 * 60 * 1000;
114
+ const startCondition = gte(this.table.timestamp, startTime);
115
+ // 总数
116
+ const [totalRow] = this.drizzle
117
+ .select({ cnt: count() })
118
+ .from(this.table)
119
+ .where(startCondition)
120
+ .all();
121
+ const total = totalRow?.cnt ?? 0;
122
+ // 成功数
123
+ const [successRow] = this.drizzle
124
+ .select({ cnt: count() })
125
+ .from(this.table)
126
+ .where(and(startCondition, eq(this.table.result, 'success')))
127
+ .all();
128
+ const success = successRow?.cnt ?? 0;
129
+ // 失败数
130
+ const [failureRow] = this.drizzle
131
+ .select({ cnt: count() })
132
+ .from(this.table)
133
+ .where(and(startCondition, eq(this.table.result, 'failure')))
134
+ .all();
135
+ const failure = failureRow?.cnt ?? 0;
136
+ // 按角色统计
137
+ const byActor = this.drizzle
138
+ .select({
139
+ actor: this.table.actor,
140
+ count: count(),
141
+ })
142
+ .from(this.table)
143
+ .where(startCondition)
144
+ .groupBy(this.table.actor)
145
+ .orderBy(desc(count()))
146
+ .all();
147
+ // 按操作统计
148
+ const byAction = this.drizzle
149
+ .select({
150
+ action: this.table.action,
151
+ count: count(),
152
+ })
153
+ .from(this.table)
154
+ .where(startCondition)
155
+ .groupBy(this.table.action)
156
+ .orderBy(desc(count()))
157
+ .all();
158
+ // 平均响应时间
159
+ const [avgRow] = this.drizzle
160
+ .select({
161
+ avgDuration: avg(this.table.duration),
162
+ })
163
+ .from(this.table)
164
+ .where(and(startCondition, sql `${this.table.duration} IS NOT NULL`))
165
+ .all();
166
+ const avgDuration = avgRow?.avgDuration ? `${Math.round(Number(avgRow.avgDuration))}ms` : 'N/A';
167
+ return {
168
+ timeRange,
169
+ total,
170
+ success,
171
+ failure,
172
+ successRate: total > 0 ? `${((success / total) * 100).toFixed(2)}%` : '0%',
173
+ avgDuration,
174
+ byActor,
175
+ byAction,
176
+ };
177
+ }
178
+ /* ─── 清理 ─── */
179
+ /**
180
+ * 清理过期审计日志
181
+ * @param maxAgeDays 保留天数
182
+ */
183
+ async cleanup(maxAgeDays = 90) {
184
+ try {
185
+ const cutoff = Date.now() - maxAgeDays * 86400000;
186
+ const result = this.drizzle
187
+ .delete(this.table)
188
+ .where(sql `${this.table.timestamp} < ${cutoff}`)
189
+ .run();
190
+ return { deleted: result.changes ?? 0 };
191
+ }
192
+ catch {
193
+ return { deleted: 0 };
194
+ }
195
+ }
196
+ /**
197
+ * Guard 违规规则名 TOP-N (SkillAdvisor.#getGuardPatterns)
198
+ */
199
+ async findTopGuardViolationRules(minCount, limit) {
200
+ return this.drizzle
201
+ .select({
202
+ ruleName: sql `json_extract(${this.table.operationData}, '$.ruleName')`.as('ruleName'),
203
+ cnt: count(),
204
+ })
205
+ .from(this.table)
206
+ .where(and(like(this.table.action, 'guard%'), eq(this.table.result, 'violation')))
207
+ .groupBy(sql `json_extract(${this.table.operationData}, '$.ruleName')`)
208
+ .having(sql `count(*) >= ${minCount}`)
209
+ .orderBy(desc(count()))
210
+ .limit(limit)
211
+ .all();
212
+ }
213
+ /**
214
+ * Guard 违规信号 (SignalCollector.#collectGuardSignals)
215
+ */
216
+ async findGuardViolationSignals(limit) {
217
+ return this.drizzle
218
+ .select({
219
+ ruleName: sql `json_extract(${this.table.operationData}, '$.ruleName')`.as('ruleName'),
220
+ cnt: count(),
221
+ lastAt: sql `MAX(${this.table.timestamp})`.as('lastAt'),
222
+ })
223
+ .from(this.table)
224
+ .where(and(like(this.table.action, 'guard%'), eq(this.table.result, 'violation')))
225
+ .groupBy(sql `json_extract(${this.table.operationData}, '$.ruleName')`)
226
+ .having(sql `count(*) > 0`)
227
+ .orderBy(desc(count()))
228
+ .limit(limit)
229
+ .all();
230
+ }
231
+ /**
232
+ * 最近动作日志 (SignalCollector.#collectActionSignals)
233
+ */
234
+ async findRecentActions(sinceTs, limit) {
235
+ return this.drizzle
236
+ .select({
237
+ actor: this.table.actor,
238
+ action: this.table.action,
239
+ resource: this.table.resource,
240
+ result: this.table.result,
241
+ timestamp: this.table.timestamp,
242
+ })
243
+ .from(this.table)
244
+ .where(gt(this.table.timestamp, sinceTs))
245
+ .orderBy(desc(this.table.timestamp))
246
+ .limit(limit)
247
+ .all();
248
+ }
249
+ /* ─── 内部辅助 ─── */
250
+ #mapRow(row) {
251
+ return {
252
+ id: row.id,
253
+ timestamp: row.timestamp,
254
+ actor: row.actor,
255
+ actorContext: safeParseJSON(row.actorContext, {}),
256
+ action: row.action,
257
+ resource: row.resource ?? null,
258
+ operationData: safeParseJSON(row.operationData, {}),
259
+ result: row.result,
260
+ errorMessage: row.errorMessage ?? null,
261
+ duration: row.duration ?? null,
262
+ };
263
+ }
264
+ }
265
+ function safeParseJSON(str, fallback) {
266
+ try {
267
+ return str ? JSON.parse(str) : fallback;
268
+ }
269
+ catch {
270
+ return fallback;
271
+ }
272
+ }