driftdetect-core 0.4.1 → 0.4.2

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 (237) hide show
  1. package/dist/boundaries/boundary-scanner.d.ts +76 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-scanner.js +801 -0
  4. package/dist/boundaries/boundary-scanner.js.map +1 -0
  5. package/dist/boundaries/data-access-learner.d.ts +126 -0
  6. package/dist/boundaries/data-access-learner.d.ts.map +1 -0
  7. package/dist/boundaries/data-access-learner.js +486 -0
  8. package/dist/boundaries/data-access-learner.js.map +1 -0
  9. package/dist/boundaries/index.d.ts +6 -0
  10. package/dist/boundaries/index.d.ts.map +1 -1
  11. package/dist/boundaries/index.js +6 -0
  12. package/dist/boundaries/index.js.map +1 -1
  13. package/dist/boundaries/security-prioritizer.d.ts +118 -0
  14. package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
  15. package/dist/boundaries/security-prioritizer.js +316 -0
  16. package/dist/boundaries/security-prioritizer.js.map +1 -0
  17. package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
  18. package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
  19. package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
  20. package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
  21. package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
  22. package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
  23. package/dist/call-graph/analysis/dead-code-detector.js +391 -0
  24. package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
  25. package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
  26. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
  27. package/dist/call-graph/analysis/graph-builder.js +624 -0
  28. package/dist/call-graph/analysis/graph-builder.js.map +1 -0
  29. package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
  30. package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
  31. package/dist/call-graph/analysis/impact-analyzer.js +329 -0
  32. package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
  33. package/dist/call-graph/analysis/index.d.ts +11 -0
  34. package/dist/call-graph/analysis/index.d.ts.map +1 -0
  35. package/dist/call-graph/analysis/index.js +9 -0
  36. package/dist/call-graph/analysis/index.js.map +1 -0
  37. package/dist/call-graph/analysis/path-finder.d.ts +117 -0
  38. package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
  39. package/dist/call-graph/analysis/path-finder.js +360 -0
  40. package/dist/call-graph/analysis/path-finder.js.map +1 -0
  41. package/dist/call-graph/analysis/reachability.d.ts +56 -0
  42. package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
  43. package/dist/call-graph/analysis/reachability.js +357 -0
  44. package/dist/call-graph/analysis/reachability.js.map +1 -0
  45. package/dist/call-graph/demo.d.ts +11 -0
  46. package/dist/call-graph/demo.d.ts.map +1 -0
  47. package/dist/call-graph/demo.js +339 -0
  48. package/dist/call-graph/demo.js.map +1 -0
  49. package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
  50. package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
  51. package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
  52. package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
  53. package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
  54. package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
  55. package/dist/call-graph/enrichment/impact-scorer.js +328 -0
  56. package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
  57. package/dist/call-graph/enrichment/index.d.ts +12 -0
  58. package/dist/call-graph/enrichment/index.d.ts.map +1 -0
  59. package/dist/call-graph/enrichment/index.js +15 -0
  60. package/dist/call-graph/enrichment/index.js.map +1 -0
  61. package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
  62. package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
  63. package/dist/call-graph/enrichment/remediation-generator.js +609 -0
  64. package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
  65. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
  66. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
  67. package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
  68. package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
  69. package/dist/call-graph/enrichment/types.d.ts +402 -0
  70. package/dist/call-graph/enrichment/types.d.ts.map +1 -0
  71. package/dist/call-graph/enrichment/types.js +9 -0
  72. package/dist/call-graph/enrichment/types.js.map +1 -0
  73. package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
  74. package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
  75. package/dist/call-graph/extractors/base-extractor.js +140 -0
  76. package/dist/call-graph/extractors/base-extractor.js.map +1 -0
  77. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
  78. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
  79. package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
  80. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
  81. package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
  82. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
  83. package/dist/call-graph/extractors/csharp-extractor.js +470 -0
  84. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
  85. package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
  86. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
  87. package/dist/call-graph/extractors/data-access-extractor.js +234 -0
  88. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
  89. package/dist/call-graph/extractors/index.d.ts +26 -0
  90. package/dist/call-graph/extractors/index.d.ts.map +1 -0
  91. package/dist/call-graph/extractors/index.js +36 -0
  92. package/dist/call-graph/extractors/index.js.map +1 -0
  93. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
  94. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
  95. package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
  96. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
  97. package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
  98. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
  99. package/dist/call-graph/extractors/java-extractor.js +510 -0
  100. package/dist/call-graph/extractors/java-extractor.js.map +1 -0
  101. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
  102. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
  103. package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
  104. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
  105. package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
  106. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
  107. package/dist/call-graph/extractors/php-extractor.js +619 -0
  108. package/dist/call-graph/extractors/php-extractor.js.map +1 -0
  109. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
  110. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
  111. package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
  112. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
  113. package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
  114. package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
  115. package/dist/call-graph/extractors/python-extractor.js +681 -0
  116. package/dist/call-graph/extractors/python-extractor.js.map +1 -0
  117. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
  118. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
  119. package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
  120. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
  121. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
  122. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
  123. package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
  124. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
  125. package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
  126. package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
  127. package/dist/call-graph/extractors/typescript-extractor.js +904 -0
  128. package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
  129. package/dist/call-graph/index.d.ts +127 -0
  130. package/dist/call-graph/index.d.ts.map +1 -0
  131. package/dist/call-graph/index.js +247 -0
  132. package/dist/call-graph/index.js.map +1 -0
  133. package/dist/call-graph/store/call-graph-store.d.ts +70 -0
  134. package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
  135. package/dist/call-graph/store/call-graph-store.js +210 -0
  136. package/dist/call-graph/store/call-graph-store.js.map +1 -0
  137. package/dist/call-graph/store/index.d.ts +7 -0
  138. package/dist/call-graph/store/index.d.ts.map +1 -0
  139. package/dist/call-graph/store/index.js +7 -0
  140. package/dist/call-graph/store/index.js.map +1 -0
  141. package/dist/call-graph/types.d.ts +376 -0
  142. package/dist/call-graph/types.d.ts.map +1 -0
  143. package/dist/call-graph/types.js +8 -0
  144. package/dist/call-graph/types.js.map +1 -0
  145. package/dist/index.d.ts +8 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/lake/callgraph-shard-store.d.ts +168 -0
  150. package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
  151. package/dist/lake/callgraph-shard-store.js +466 -0
  152. package/dist/lake/callgraph-shard-store.js.map +1 -0
  153. package/dist/lake/examples-store.d.ts +127 -0
  154. package/dist/lake/examples-store.d.ts.map +1 -0
  155. package/dist/lake/examples-store.js +389 -0
  156. package/dist/lake/examples-store.js.map +1 -0
  157. package/dist/lake/index-store.d.ts +82 -0
  158. package/dist/lake/index-store.d.ts.map +1 -0
  159. package/dist/lake/index-store.js +359 -0
  160. package/dist/lake/index-store.js.map +1 -0
  161. package/dist/lake/index.d.ts +93 -0
  162. package/dist/lake/index.d.ts.map +1 -0
  163. package/dist/lake/index.js +138 -0
  164. package/dist/lake/index.js.map +1 -0
  165. package/dist/lake/lake.bak/index-store.d.ts +82 -0
  166. package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
  167. package/dist/lake/lake.bak/index-store.js +357 -0
  168. package/dist/lake/lake.bak/index-store.js.map +1 -0
  169. package/dist/lake/lake.bak/index.d.ts +81 -0
  170. package/dist/lake/lake.bak/index.d.ts.map +1 -0
  171. package/dist/lake/lake.bak/index.js +114 -0
  172. package/dist/lake/lake.bak/index.js.map +1 -0
  173. package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
  174. package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
  175. package/dist/lake/lake.bak/manifest-store.js +347 -0
  176. package/dist/lake/lake.bak/manifest-store.js.map +1 -0
  177. package/dist/lake/lake.bak/query-engine.d.ts +112 -0
  178. package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
  179. package/dist/lake/lake.bak/query-engine.js +370 -0
  180. package/dist/lake/lake.bak/query-engine.js.map +1 -0
  181. package/dist/lake/lake.bak/types.d.ts +428 -0
  182. package/dist/lake/lake.bak/types.d.ts.map +1 -0
  183. package/dist/lake/lake.bak/types.js +46 -0
  184. package/dist/lake/lake.bak/types.js.map +1 -0
  185. package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
  186. package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
  187. package/dist/lake/lake.bak/view-materializer.js +314 -0
  188. package/dist/lake/lake.bak/view-materializer.js.map +1 -0
  189. package/dist/lake/lake.bak/view-store.d.ts +57 -0
  190. package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
  191. package/dist/lake/lake.bak/view-store.js +348 -0
  192. package/dist/lake/lake.bak/view-store.js.map +1 -0
  193. package/dist/lake/manifest-store.d.ts +51 -0
  194. package/dist/lake/manifest-store.d.ts.map +1 -0
  195. package/dist/lake/manifest-store.js +348 -0
  196. package/dist/lake/manifest-store.js.map +1 -0
  197. package/dist/lake/pattern-shard-store.d.ts +87 -0
  198. package/dist/lake/pattern-shard-store.d.ts.map +1 -0
  199. package/dist/lake/pattern-shard-store.js +347 -0
  200. package/dist/lake/pattern-shard-store.js.map +1 -0
  201. package/dist/lake/query-engine.d.ts +124 -0
  202. package/dist/lake/query-engine.d.ts.map +1 -0
  203. package/dist/lake/query-engine.js +453 -0
  204. package/dist/lake/query-engine.js.map +1 -0
  205. package/dist/lake/security-shard-store.d.ts +156 -0
  206. package/dist/lake/security-shard-store.d.ts.map +1 -0
  207. package/dist/lake/security-shard-store.js +498 -0
  208. package/dist/lake/security-shard-store.js.map +1 -0
  209. package/dist/lake/types.d.ts +428 -0
  210. package/dist/lake/types.d.ts.map +1 -0
  211. package/dist/lake/types.js +46 -0
  212. package/dist/lake/types.js.map +1 -0
  213. package/dist/lake/view-materializer.d.ts +70 -0
  214. package/dist/lake/view-materializer.d.ts.map +1 -0
  215. package/dist/lake/view-materializer.js +314 -0
  216. package/dist/lake/view-materializer.js.map +1 -0
  217. package/dist/lake/view-store.d.ts +57 -0
  218. package/dist/lake/view-store.d.ts.map +1 -0
  219. package/dist/lake/view-store.js +348 -0
  220. package/dist/lake/view-store.js.map +1 -0
  221. package/dist/parsers/tree-sitter/index.d.ts +1 -0
  222. package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
  223. package/dist/parsers/tree-sitter/index.js +4 -0
  224. package/dist/parsers/tree-sitter/index.js.map +1 -1
  225. package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
  226. package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
  227. package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
  228. package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
  229. package/dist/store/project-config.d.ts +154 -0
  230. package/dist/store/project-config.d.ts.map +1 -0
  231. package/dist/store/project-config.js +235 -0
  232. package/dist/store/project-config.js.map +1 -0
  233. package/dist/store/project-registry.d.ts +241 -0
  234. package/dist/store/project-registry.d.ts.map +1 -0
  235. package/dist/store/project-registry.js +557 -0
  236. package/dist/store/project-registry.js.map +1 -0
  237. package/package.json +4 -2
@@ -0,0 +1,453 @@
1
+ /**
2
+ * Query Engine
3
+ *
4
+ * Unified query API that knows the optimal path to answer any query.
5
+ * Routes queries to views, indexes, or raw data based on availability.
6
+ *
7
+ * Key features:
8
+ * - Automatic view/index selection
9
+ * - Fallback to raw data when views unavailable
10
+ * - Pagination with cursor support
11
+ * - Query result caching
12
+ */
13
+ import { EventEmitter } from 'node:events';
14
+ import { DEFAULT_DATA_LAKE_CONFIG } from './types.js';
15
+ import { ManifestStore } from './manifest-store.js';
16
+ import { ViewStore } from './view-store.js';
17
+ import { IndexStore } from './index-store.js';
18
+ import { PatternShardStore } from './pattern-shard-store.js';
19
+ // ============================================================================
20
+ // Query Engine Class
21
+ // ============================================================================
22
+ export class QueryEngine extends EventEmitter {
23
+ config;
24
+ manifestStore;
25
+ viewStore;
26
+ indexStore;
27
+ patternShardStore;
28
+ // Stats tracking
29
+ stats = {
30
+ viewHits: 0,
31
+ indexHits: 0,
32
+ rawHits: 0,
33
+ shardHits: 0,
34
+ avgResponseTime: 0,
35
+ };
36
+ queryCount = 0;
37
+ // Raw data loader (injected)
38
+ rawPatternLoader;
39
+ constructor(config = {}, manifestStore, viewStore, indexStore, patternShardStore) {
40
+ super();
41
+ this.config = { ...DEFAULT_DATA_LAKE_CONFIG, ...config };
42
+ this.manifestStore = manifestStore ?? new ManifestStore(this.config);
43
+ this.viewStore = viewStore ?? new ViewStore(this.config);
44
+ this.indexStore = indexStore ?? new IndexStore(this.config);
45
+ this.patternShardStore = patternShardStore ?? new PatternShardStore(this.config);
46
+ }
47
+ // ==========================================================================
48
+ // Initialization
49
+ // ==========================================================================
50
+ async initialize() {
51
+ await Promise.all([
52
+ this.manifestStore.initialize(),
53
+ this.viewStore.initialize(),
54
+ this.indexStore.initialize(),
55
+ this.patternShardStore.initialize(),
56
+ ]);
57
+ }
58
+ /**
59
+ * Set the raw pattern loader for fallback queries
60
+ */
61
+ setRawPatternLoader(loader) {
62
+ this.rawPatternLoader = loader;
63
+ }
64
+ // ==========================================================================
65
+ // Status Query
66
+ // ==========================================================================
67
+ /**
68
+ * Get status - uses pre-computed view if available
69
+ */
70
+ async getStatus() {
71
+ const startTime = Date.now();
72
+ // Try view first
73
+ if (!this.manifestStore.isViewStale('status')) {
74
+ const view = await this.viewStore.getStatusView();
75
+ if (view) {
76
+ this.recordQuery('view', startTime);
77
+ return view;
78
+ }
79
+ }
80
+ // Fallback: build from raw data
81
+ if (this.rawPatternLoader) {
82
+ const patterns = await this.rawPatternLoader();
83
+ const view = this.viewStore.buildStatusView(patterns);
84
+ // Cache for next time
85
+ if (this.config.enableViews) {
86
+ await this.viewStore.saveStatusView(view);
87
+ this.manifestStore.markViewFresh('status');
88
+ }
89
+ this.recordQuery('raw', startTime);
90
+ return view;
91
+ }
92
+ return null;
93
+ }
94
+ // ==========================================================================
95
+ // Pattern Queries
96
+ // ==========================================================================
97
+ /**
98
+ * Get pattern list with pagination
99
+ *
100
+ * Query strategy:
101
+ * 1. If pattern index view is fresh, use it (fastest for full list)
102
+ * 2. If querying specific categories, use pattern shards (loads only needed data)
103
+ * 3. Fall back to raw data loader
104
+ */
105
+ async getPatterns(options = {}) {
106
+ const startTime = Date.now();
107
+ const limit = options.limit ?? 20;
108
+ const offset = options.offset ?? 0;
109
+ // Try pattern index view first (best for unfiltered or search queries)
110
+ if (!this.manifestStore.isViewStale('patternIndex') && !options.categories?.length) {
111
+ const indexView = await this.viewStore.getPatternIndexView();
112
+ if (indexView) {
113
+ let patterns = indexView.patterns;
114
+ patterns = this.filterPatternSummaries(patterns, options);
115
+ const total = patterns.length;
116
+ const paged = patterns.slice(offset, offset + limit);
117
+ const hasMore = offset + limit < total;
118
+ this.recordQuery('view', startTime);
119
+ return {
120
+ items: paged,
121
+ total,
122
+ hasMore,
123
+ nextCursor: hasMore ? this.encodeCursor({ offset: offset + limit }) : undefined,
124
+ executionTime: Date.now() - startTime,
125
+ source: 'view',
126
+ };
127
+ }
128
+ }
129
+ // For category-specific queries, use pattern shards (loads only needed categories)
130
+ if (options.categories?.length) {
131
+ const shardPatterns = await this.patternShardStore.getByCategories(options.categories);
132
+ if (shardPatterns.length > 0) {
133
+ let summaries = shardPatterns.map(p => this.shardEntryToSummary(p));
134
+ // Apply additional filters
135
+ if (options.status) {
136
+ summaries = summaries.filter(p => p.status === options.status);
137
+ }
138
+ if (options.minConfidence !== undefined) {
139
+ summaries = summaries.filter(p => p.confidence >= options.minConfidence);
140
+ }
141
+ if (options.search) {
142
+ const searchLower = options.search.toLowerCase();
143
+ summaries = summaries.filter(p => p.name.toLowerCase().includes(searchLower) ||
144
+ p.subcategory.toLowerCase().includes(searchLower));
145
+ }
146
+ // Sort by confidence
147
+ summaries.sort((a, b) => b.confidence - a.confidence);
148
+ const total = summaries.length;
149
+ const paged = summaries.slice(offset, offset + limit);
150
+ const hasMore = offset + limit < total;
151
+ this.recordQuery('shard', startTime);
152
+ return {
153
+ items: paged,
154
+ total,
155
+ hasMore,
156
+ nextCursor: hasMore ? this.encodeCursor({ offset: offset + limit }) : undefined,
157
+ executionTime: Date.now() - startTime,
158
+ source: 'index', // Report as index since shards are a form of indexed storage
159
+ };
160
+ }
161
+ }
162
+ // Try the full pattern index view as fallback
163
+ if (!this.manifestStore.isViewStale('patternIndex')) {
164
+ const indexView = await this.viewStore.getPatternIndexView();
165
+ if (indexView) {
166
+ let patterns = indexView.patterns;
167
+ patterns = this.filterPatternSummaries(patterns, options);
168
+ const total = patterns.length;
169
+ const paged = patterns.slice(offset, offset + limit);
170
+ const hasMore = offset + limit < total;
171
+ this.recordQuery('view', startTime);
172
+ return {
173
+ items: paged,
174
+ total,
175
+ hasMore,
176
+ nextCursor: hasMore ? this.encodeCursor({ offset: offset + limit }) : undefined,
177
+ executionTime: Date.now() - startTime,
178
+ source: 'view',
179
+ };
180
+ }
181
+ }
182
+ // Fallback: build from raw data
183
+ if (this.rawPatternLoader) {
184
+ const patterns = await this.rawPatternLoader();
185
+ const indexView = this.viewStore.buildPatternIndexView(patterns);
186
+ // Cache for next time
187
+ if (this.config.enableViews) {
188
+ await this.viewStore.savePatternIndexView(indexView);
189
+ this.manifestStore.markViewFresh('patternIndex');
190
+ }
191
+ // Also save to shards for future category queries
192
+ if (this.config.enableSharding) {
193
+ await this.patternShardStore.saveAll(patterns);
194
+ }
195
+ let summaries = indexView.patterns;
196
+ summaries = this.filterPatternSummaries(summaries, options);
197
+ const total = summaries.length;
198
+ const paged = summaries.slice(offset, offset + limit);
199
+ const hasMore = offset + limit < total;
200
+ this.recordQuery('raw', startTime);
201
+ return {
202
+ items: paged,
203
+ total,
204
+ hasMore,
205
+ nextCursor: hasMore ? this.encodeCursor({ offset: offset + limit }) : undefined,
206
+ executionTime: Date.now() - startTime,
207
+ source: 'raw',
208
+ };
209
+ }
210
+ return {
211
+ items: [],
212
+ total: 0,
213
+ hasMore: false,
214
+ executionTime: Date.now() - startTime,
215
+ source: 'raw',
216
+ };
217
+ }
218
+ /**
219
+ * Get patterns for a specific file
220
+ */
221
+ async getFilePatterns(file) {
222
+ const startTime = Date.now();
223
+ // Try file index first
224
+ const fileIndex = await this.indexStore.getFileIndex();
225
+ if (fileIndex) {
226
+ const patternIds = fileIndex.patterns[file] ?? [];
227
+ if (patternIds.length > 0) {
228
+ // Get pattern summaries from index view
229
+ const indexView = await this.viewStore.getPatternIndexView();
230
+ if (indexView) {
231
+ const patterns = indexView.patterns.filter(p => patternIds.includes(p.id));
232
+ this.recordQuery('index', startTime);
233
+ return patterns;
234
+ }
235
+ }
236
+ }
237
+ // Fallback: filter from full list
238
+ const result = await this.getPatterns({ file });
239
+ return result.items;
240
+ }
241
+ /**
242
+ * Get patterns by category (uses shards for efficiency)
243
+ */
244
+ async getCategoryPatterns(category) {
245
+ const startTime = Date.now();
246
+ // Try pattern shards first (most efficient for single category)
247
+ const shardPatterns = await this.patternShardStore.getByCategory(category);
248
+ if (shardPatterns.length > 0) {
249
+ const summaries = shardPatterns.map(p => this.shardEntryToSummary(p));
250
+ this.recordQuery('shard', startTime);
251
+ return summaries;
252
+ }
253
+ // Try category index + view
254
+ const categoryIndex = await this.indexStore.getCategoryIndex();
255
+ if (categoryIndex) {
256
+ const patternIds = categoryIndex.patterns[category] ?? [];
257
+ if (patternIds.length > 0) {
258
+ const indexView = await this.viewStore.getPatternIndexView();
259
+ if (indexView) {
260
+ const patterns = indexView.patterns.filter(p => patternIds.includes(p.id));
261
+ this.recordQuery('index', startTime);
262
+ return patterns;
263
+ }
264
+ }
265
+ }
266
+ // Fallback: filter from full list
267
+ const result = await this.getPatterns({ categories: [category] });
268
+ return result.items;
269
+ }
270
+ // ==========================================================================
271
+ // Security Queries
272
+ // ==========================================================================
273
+ /**
274
+ * Get security summary - uses pre-computed view if available
275
+ */
276
+ async getSecuritySummary() {
277
+ const startTime = Date.now();
278
+ // Try view first
279
+ if (!this.manifestStore.isViewStale('securitySummary')) {
280
+ const view = await this.viewStore.getSecuritySummaryView();
281
+ if (view) {
282
+ this.recordQuery('view', startTime);
283
+ return view;
284
+ }
285
+ }
286
+ // No fallback for security summary - needs boundary data
287
+ return null;
288
+ }
289
+ // ==========================================================================
290
+ // Trend Queries
291
+ // ==========================================================================
292
+ /**
293
+ * Get trends - uses pre-computed view if available
294
+ */
295
+ async getTrends() {
296
+ const startTime = Date.now();
297
+ // Try view first
298
+ if (!this.manifestStore.isViewStale('trends')) {
299
+ const view = await this.viewStore.getTrendsView();
300
+ if (view) {
301
+ this.recordQuery('view', startTime);
302
+ return view;
303
+ }
304
+ }
305
+ // No fallback for trends - needs history data
306
+ return null;
307
+ }
308
+ // ==========================================================================
309
+ // Quick Stats
310
+ // ==========================================================================
311
+ /**
312
+ * Get quick stats from manifest (instant)
313
+ */
314
+ getQuickStats() {
315
+ return this.manifestStore.getStats();
316
+ }
317
+ /**
318
+ * Get pattern stats from manifest (instant)
319
+ */
320
+ getPatternStats() {
321
+ return this.manifestStore.getPatternStats();
322
+ }
323
+ /**
324
+ * Get security stats from manifest (instant)
325
+ */
326
+ getSecurityStats() {
327
+ return this.manifestStore.getSecurityStats();
328
+ }
329
+ // ==========================================================================
330
+ // View Management
331
+ // ==========================================================================
332
+ /**
333
+ * Check if a view is stale
334
+ */
335
+ isViewStale(view) {
336
+ return this.manifestStore.isViewStale(view);
337
+ }
338
+ /**
339
+ * Invalidate views (triggers rebuild on next query)
340
+ */
341
+ invalidateViews(views) {
342
+ if (!views) {
343
+ this.manifestStore.markAllViewsStale('manual invalidation');
344
+ this.viewStore.invalidateCache();
345
+ }
346
+ else {
347
+ for (const view of views) {
348
+ this.manifestStore.markViewStale(view, 'manual invalidation');
349
+ this.viewStore.invalidateCache(view);
350
+ }
351
+ }
352
+ }
353
+ // ==========================================================================
354
+ // Stats
355
+ // ==========================================================================
356
+ getQueryStats() {
357
+ return { ...this.stats };
358
+ }
359
+ resetStats() {
360
+ this.stats = {
361
+ viewHits: 0,
362
+ indexHits: 0,
363
+ rawHits: 0,
364
+ shardHits: 0,
365
+ avgResponseTime: 0,
366
+ };
367
+ this.queryCount = 0;
368
+ }
369
+ // ==========================================================================
370
+ // Private Helpers
371
+ // ==========================================================================
372
+ /**
373
+ * Convert a PatternShardEntry to PatternSummary
374
+ */
375
+ shardEntryToSummary(entry) {
376
+ return {
377
+ id: entry.id,
378
+ name: entry.name,
379
+ category: entry.subcategory ? entry.subcategory.split('/')[0] : 'structural',
380
+ subcategory: entry.subcategory,
381
+ status: entry.status,
382
+ confidence: entry.confidence.score,
383
+ confidenceLevel: entry.confidence.level,
384
+ locationCount: entry.locations.length,
385
+ outlierCount: entry.outliers.length,
386
+ severity: entry.severity,
387
+ locationsHash: '', // Not needed for queries
388
+ };
389
+ }
390
+ filterPatternSummaries(patterns, options) {
391
+ let result = patterns;
392
+ if (options.categories?.length) {
393
+ result = result.filter(p => options.categories.includes(p.category));
394
+ }
395
+ if (options.status) {
396
+ result = result.filter(p => p.status === options.status);
397
+ }
398
+ if (options.minConfidence !== undefined) {
399
+ result = result.filter(p => p.confidence >= options.minConfidence);
400
+ }
401
+ if (options.search) {
402
+ const searchLower = options.search.toLowerCase();
403
+ result = result.filter(p => p.name.toLowerCase().includes(searchLower) ||
404
+ p.subcategory.toLowerCase().includes(searchLower));
405
+ }
406
+ // Note: file filtering requires the full pattern data or file index
407
+ // For now, we skip it in the summary filter
408
+ return result;
409
+ }
410
+ encodeCursor(data) {
411
+ return Buffer.from(JSON.stringify(data)).toString('base64url');
412
+ }
413
+ /** Decode cursor - kept for future pagination implementation */
414
+ // @ts-expect-error - Will be used when pagination is fully implemented
415
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
416
+ decodeCursor(cursor) {
417
+ try {
418
+ return JSON.parse(Buffer.from(cursor, 'base64url').toString());
419
+ }
420
+ catch {
421
+ return null;
422
+ }
423
+ }
424
+ recordQuery(source, startTime) {
425
+ const duration = Date.now() - startTime;
426
+ this.queryCount++;
427
+ switch (source) {
428
+ case 'view':
429
+ this.stats.viewHits++;
430
+ break;
431
+ case 'index':
432
+ this.stats.indexHits++;
433
+ break;
434
+ case 'raw':
435
+ this.stats.rawHits++;
436
+ break;
437
+ case 'shard':
438
+ this.stats.shardHits++;
439
+ break;
440
+ }
441
+ // Update rolling average
442
+ this.stats.avgResponseTime =
443
+ (this.stats.avgResponseTime * (this.queryCount - 1) + duration) / this.queryCount;
444
+ this.emit('query', { source, duration });
445
+ }
446
+ }
447
+ // ============================================================================
448
+ // Factory Function
449
+ // ============================================================================
450
+ export function createQueryEngine(config = {}, manifestStore, viewStore, indexStore, patternShardStore) {
451
+ return new QueryEngine(config, manifestStore, viewStore, indexStore, patternShardStore);
452
+ }
453
+ //# sourceMappingURL=query-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-engine.js","sourceRoot":"","sources":["../../src/lake/query-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Security Shard Store
3
+ *
4
+ * Manages sharded security/access-map storage - one file per table.
5
+ * This allows loading only the access data you need instead of the entire map.
6
+ *
7
+ * Storage structure:
8
+ * .drift/lake/security/
9
+ * ├── index.json # Security summary index
10
+ * ├── tables/
11
+ * │ ├── users.json # Access points for users table
12
+ * │ ├── orders.json # Access points for orders table
13
+ * │ └── ...
14
+ * └── sensitive.json # Sensitive field registry
15
+ *
16
+ * Key features:
17
+ * - Load access data by table (not all at once)
18
+ * - Pre-computed security summary
19
+ * - Incremental updates per table
20
+ */
21
+ import { EventEmitter } from 'node:events';
22
+ import type { AccessMapShard, AccessPointEntry, SecuritySummaryView, DataLakeConfig } from './types.js';
23
+ export interface SecurityIndex {
24
+ version: string;
25
+ generatedAt: string;
26
+ summary: {
27
+ riskLevel: 'low' | 'medium' | 'high' | 'critical';
28
+ totalTables: number;
29
+ sensitiveTablesCount: number;
30
+ totalAccessPoints: number;
31
+ violationCount: number;
32
+ };
33
+ tables: TableIndexEntry[];
34
+ topSensitiveTables: SensitiveTableEntry[];
35
+ topViolations: ViolationEntry[];
36
+ }
37
+ export interface TableIndexEntry {
38
+ table: string;
39
+ model?: string;
40
+ fieldCount: number;
41
+ sensitiveFieldCount: number;
42
+ accessPointCount: number;
43
+ hasViolations: boolean;
44
+ }
45
+ export interface SensitiveTableEntry {
46
+ table: string;
47
+ sensitiveFields: number;
48
+ accessPoints: number;
49
+ riskScore: number;
50
+ }
51
+ export interface ViolationEntry {
52
+ id: string;
53
+ severity: 'critical' | 'warning' | 'info';
54
+ message: string;
55
+ file: string;
56
+ table: string;
57
+ line?: number;
58
+ }
59
+ export interface SensitiveFieldRegistry {
60
+ version: string;
61
+ generatedAt: string;
62
+ fields: SensitiveFieldRecord[];
63
+ }
64
+ export interface SensitiveFieldRecord {
65
+ table: string;
66
+ field: string;
67
+ sensitivity: 'pii' | 'financial' | 'auth' | 'health' | 'custom';
68
+ reason: string;
69
+ accessCount: number;
70
+ }
71
+ export declare class SecurityShardStore extends EventEmitter {
72
+ private readonly config;
73
+ private readonly securityDir;
74
+ private readonly tablesDir;
75
+ private indexCache;
76
+ private tableCache;
77
+ private sensitiveCache;
78
+ constructor(config?: Partial<DataLakeConfig>);
79
+ initialize(): Promise<void>;
80
+ /**
81
+ * Get the security index (summary of all security data)
82
+ */
83
+ getIndex(): Promise<SecurityIndex | null>;
84
+ /**
85
+ * Save the security index
86
+ */
87
+ saveIndex(index: SecurityIndex): Promise<void>;
88
+ /**
89
+ * Build security index from table shards
90
+ */
91
+ buildIndex(): Promise<SecurityIndex>;
92
+ /**
93
+ * Get access data for a specific table
94
+ */
95
+ getTableShard(table: string): Promise<AccessMapShard | null>;
96
+ /**
97
+ * Save access data for a table
98
+ */
99
+ saveTableShard(shard: AccessMapShard): Promise<void>;
100
+ /**
101
+ * Get access data for multiple tables
102
+ */
103
+ getTableShards(tables: string[]): Promise<AccessMapShard[]>;
104
+ /**
105
+ * List all available tables
106
+ */
107
+ listTables(): Promise<string[]>;
108
+ /**
109
+ * Delete a table shard
110
+ */
111
+ deleteTableShard(table: string): Promise<void>;
112
+ /**
113
+ * Get the sensitive field registry
114
+ */
115
+ getSensitiveFields(): Promise<SensitiveFieldRegistry | null>;
116
+ /**
117
+ * Save the sensitive field registry
118
+ */
119
+ saveSensitiveFields(registry: SensitiveFieldRegistry): Promise<void>;
120
+ /**
121
+ * Build sensitive field registry from table shards
122
+ */
123
+ buildSensitiveRegistry(): Promise<SensitiveFieldRegistry>;
124
+ /**
125
+ * Get access points for a specific file
126
+ */
127
+ getAccessPointsByFile(file: string): Promise<AccessPointEntry[]>;
128
+ /**
129
+ * Get all access points for sensitive fields
130
+ */
131
+ getSensitiveAccessPoints(): Promise<Array<AccessPointEntry & {
132
+ table: string;
133
+ sensitivity: string;
134
+ }>>;
135
+ /**
136
+ * Invalidate all caches
137
+ */
138
+ invalidateCache(table?: string): void;
139
+ /**
140
+ * Get cache stats
141
+ */
142
+ getCacheStats(): {
143
+ cachedTables: number;
144
+ hasIndex: boolean;
145
+ hasSensitive: boolean;
146
+ };
147
+ /**
148
+ * Convert security index to SecuritySummaryView
149
+ */
150
+ indexToSummaryView(index: SecurityIndex): SecuritySummaryView;
151
+ private detectViolations;
152
+ private calculateRiskScore;
153
+ private calculateOverallRisk;
154
+ }
155
+ export declare function createSecurityShardStore(config?: Partial<DataLakeConfig>): SecurityShardStore;
156
+ //# sourceMappingURL=security-shard-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-shard-store.d.ts","sourceRoot":"","sources":["../../src/lake/security-shard-store.ts"],"names":[],"mappings":"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"}