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,370 @@
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
+ // ============================================================================
19
+ // Query Engine Class
20
+ // ============================================================================
21
+ export class QueryEngine extends EventEmitter {
22
+ config;
23
+ manifestStore;
24
+ viewStore;
25
+ indexStore;
26
+ // Stats tracking
27
+ stats = {
28
+ viewHits: 0,
29
+ indexHits: 0,
30
+ rawHits: 0,
31
+ avgResponseTime: 0,
32
+ };
33
+ queryCount = 0;
34
+ // Raw data loader (injected)
35
+ rawPatternLoader;
36
+ constructor(config = {}, manifestStore, viewStore, indexStore) {
37
+ super();
38
+ this.config = { ...DEFAULT_DATA_LAKE_CONFIG, ...config };
39
+ this.manifestStore = manifestStore ?? new ManifestStore(this.config);
40
+ this.viewStore = viewStore ?? new ViewStore(this.config);
41
+ this.indexStore = indexStore ?? new IndexStore(this.config);
42
+ }
43
+ // ==========================================================================
44
+ // Initialization
45
+ // ==========================================================================
46
+ async initialize() {
47
+ await Promise.all([
48
+ this.manifestStore.initialize(),
49
+ this.viewStore.initialize(),
50
+ this.indexStore.initialize(),
51
+ ]);
52
+ }
53
+ /**
54
+ * Set the raw pattern loader for fallback queries
55
+ */
56
+ setRawPatternLoader(loader) {
57
+ this.rawPatternLoader = loader;
58
+ }
59
+ // ==========================================================================
60
+ // Status Query
61
+ // ==========================================================================
62
+ /**
63
+ * Get status - uses pre-computed view if available
64
+ */
65
+ async getStatus() {
66
+ const startTime = Date.now();
67
+ // Try view first
68
+ if (!this.manifestStore.isViewStale('status')) {
69
+ const view = await this.viewStore.getStatusView();
70
+ if (view) {
71
+ this.recordQuery('view', startTime);
72
+ return view;
73
+ }
74
+ }
75
+ // Fallback: build from raw data
76
+ if (this.rawPatternLoader) {
77
+ const patterns = await this.rawPatternLoader();
78
+ const view = this.viewStore.buildStatusView(patterns);
79
+ // Cache for next time
80
+ if (this.config.enableViews) {
81
+ await this.viewStore.saveStatusView(view);
82
+ this.manifestStore.markViewFresh('status');
83
+ }
84
+ this.recordQuery('raw', startTime);
85
+ return view;
86
+ }
87
+ return null;
88
+ }
89
+ // ==========================================================================
90
+ // Pattern Queries
91
+ // ==========================================================================
92
+ /**
93
+ * Get pattern list with pagination
94
+ */
95
+ async getPatterns(options = {}) {
96
+ const startTime = Date.now();
97
+ const limit = options.limit ?? 20;
98
+ const offset = options.offset ?? 0;
99
+ // Try pattern index view first
100
+ if (!this.manifestStore.isViewStale('patternIndex')) {
101
+ const indexView = await this.viewStore.getPatternIndexView();
102
+ if (indexView) {
103
+ let patterns = indexView.patterns;
104
+ // Apply filters
105
+ patterns = this.filterPatternSummaries(patterns, options);
106
+ // Paginate
107
+ const total = patterns.length;
108
+ const paged = patterns.slice(offset, offset + limit);
109
+ const hasMore = offset + limit < total;
110
+ this.recordQuery('view', startTime);
111
+ return {
112
+ items: paged,
113
+ total,
114
+ hasMore,
115
+ nextCursor: hasMore ? this.encodeCursor({ offset: offset + limit }) : undefined,
116
+ executionTime: Date.now() - startTime,
117
+ source: 'view',
118
+ };
119
+ }
120
+ }
121
+ // Try category index for category-specific queries
122
+ if (options.categories?.length === 1 && !options.search && !options.file) {
123
+ const categoryIndex = await this.indexStore.getCategoryIndex();
124
+ if (categoryIndex && options.categories[0]) {
125
+ const _patternIds = categoryIndex.patterns[options.categories[0]] ?? [];
126
+ // Would need to load pattern summaries by ID here
127
+ // For now, fall through to raw
128
+ void _patternIds; // Suppress unused warning - future implementation
129
+ }
130
+ }
131
+ // Fallback: build from raw data
132
+ if (this.rawPatternLoader) {
133
+ const patterns = await this.rawPatternLoader();
134
+ const indexView = this.viewStore.buildPatternIndexView(patterns);
135
+ // Cache for next time
136
+ if (this.config.enableViews) {
137
+ await this.viewStore.savePatternIndexView(indexView);
138
+ this.manifestStore.markViewFresh('patternIndex');
139
+ }
140
+ let summaries = indexView.patterns;
141
+ summaries = this.filterPatternSummaries(summaries, options);
142
+ const total = summaries.length;
143
+ const paged = summaries.slice(offset, offset + limit);
144
+ const hasMore = offset + limit < total;
145
+ this.recordQuery('raw', startTime);
146
+ return {
147
+ items: paged,
148
+ total,
149
+ hasMore,
150
+ nextCursor: hasMore ? this.encodeCursor({ offset: offset + limit }) : undefined,
151
+ executionTime: Date.now() - startTime,
152
+ source: 'raw',
153
+ };
154
+ }
155
+ return {
156
+ items: [],
157
+ total: 0,
158
+ hasMore: false,
159
+ executionTime: Date.now() - startTime,
160
+ source: 'raw',
161
+ };
162
+ }
163
+ /**
164
+ * Get patterns for a specific file
165
+ */
166
+ async getFilePatterns(file) {
167
+ const startTime = Date.now();
168
+ // Try file index first
169
+ const fileIndex = await this.indexStore.getFileIndex();
170
+ if (fileIndex) {
171
+ const patternIds = fileIndex.patterns[file] ?? [];
172
+ if (patternIds.length > 0) {
173
+ // Get pattern summaries from index view
174
+ const indexView = await this.viewStore.getPatternIndexView();
175
+ if (indexView) {
176
+ const patterns = indexView.patterns.filter(p => patternIds.includes(p.id));
177
+ this.recordQuery('index', startTime);
178
+ return patterns;
179
+ }
180
+ }
181
+ }
182
+ // Fallback: filter from full list
183
+ const result = await this.getPatterns({ file });
184
+ return result.items;
185
+ }
186
+ /**
187
+ * Get patterns by category
188
+ */
189
+ async getCategoryPatterns(category) {
190
+ const startTime = Date.now();
191
+ // Try category index first
192
+ const categoryIndex = await this.indexStore.getCategoryIndex();
193
+ if (categoryIndex) {
194
+ const patternIds = categoryIndex.patterns[category] ?? [];
195
+ if (patternIds.length > 0) {
196
+ // Get pattern summaries from index view
197
+ const indexView = await this.viewStore.getPatternIndexView();
198
+ if (indexView) {
199
+ const patterns = indexView.patterns.filter(p => patternIds.includes(p.id));
200
+ this.recordQuery('index', startTime);
201
+ return patterns;
202
+ }
203
+ }
204
+ }
205
+ // Fallback: filter from full list
206
+ const result = await this.getPatterns({ categories: [category] });
207
+ return result.items;
208
+ }
209
+ // ==========================================================================
210
+ // Security Queries
211
+ // ==========================================================================
212
+ /**
213
+ * Get security summary - uses pre-computed view if available
214
+ */
215
+ async getSecuritySummary() {
216
+ const startTime = Date.now();
217
+ // Try view first
218
+ if (!this.manifestStore.isViewStale('securitySummary')) {
219
+ const view = await this.viewStore.getSecuritySummaryView();
220
+ if (view) {
221
+ this.recordQuery('view', startTime);
222
+ return view;
223
+ }
224
+ }
225
+ // No fallback for security summary - needs boundary data
226
+ return null;
227
+ }
228
+ // ==========================================================================
229
+ // Trend Queries
230
+ // ==========================================================================
231
+ /**
232
+ * Get trends - uses pre-computed view if available
233
+ */
234
+ async getTrends() {
235
+ const startTime = Date.now();
236
+ // Try view first
237
+ if (!this.manifestStore.isViewStale('trends')) {
238
+ const view = await this.viewStore.getTrendsView();
239
+ if (view) {
240
+ this.recordQuery('view', startTime);
241
+ return view;
242
+ }
243
+ }
244
+ // No fallback for trends - needs history data
245
+ return null;
246
+ }
247
+ // ==========================================================================
248
+ // Quick Stats
249
+ // ==========================================================================
250
+ /**
251
+ * Get quick stats from manifest (instant)
252
+ */
253
+ getQuickStats() {
254
+ return this.manifestStore.getStats();
255
+ }
256
+ /**
257
+ * Get pattern stats from manifest (instant)
258
+ */
259
+ getPatternStats() {
260
+ return this.manifestStore.getPatternStats();
261
+ }
262
+ /**
263
+ * Get security stats from manifest (instant)
264
+ */
265
+ getSecurityStats() {
266
+ return this.manifestStore.getSecurityStats();
267
+ }
268
+ // ==========================================================================
269
+ // View Management
270
+ // ==========================================================================
271
+ /**
272
+ * Check if a view is stale
273
+ */
274
+ isViewStale(view) {
275
+ return this.manifestStore.isViewStale(view);
276
+ }
277
+ /**
278
+ * Invalidate views (triggers rebuild on next query)
279
+ */
280
+ invalidateViews(views) {
281
+ if (!views) {
282
+ this.manifestStore.markAllViewsStale('manual invalidation');
283
+ this.viewStore.invalidateCache();
284
+ }
285
+ else {
286
+ for (const view of views) {
287
+ this.manifestStore.markViewStale(view, 'manual invalidation');
288
+ this.viewStore.invalidateCache(view);
289
+ }
290
+ }
291
+ }
292
+ // ==========================================================================
293
+ // Stats
294
+ // ==========================================================================
295
+ getQueryStats() {
296
+ return { ...this.stats };
297
+ }
298
+ resetStats() {
299
+ this.stats = {
300
+ viewHits: 0,
301
+ indexHits: 0,
302
+ rawHits: 0,
303
+ avgResponseTime: 0,
304
+ };
305
+ this.queryCount = 0;
306
+ }
307
+ // ==========================================================================
308
+ // Private Helpers
309
+ // ==========================================================================
310
+ filterPatternSummaries(patterns, options) {
311
+ let result = patterns;
312
+ if (options.categories?.length) {
313
+ result = result.filter(p => options.categories.includes(p.category));
314
+ }
315
+ if (options.status) {
316
+ result = result.filter(p => p.status === options.status);
317
+ }
318
+ if (options.minConfidence !== undefined) {
319
+ result = result.filter(p => p.confidence >= options.minConfidence);
320
+ }
321
+ if (options.search) {
322
+ const searchLower = options.search.toLowerCase();
323
+ result = result.filter(p => p.name.toLowerCase().includes(searchLower) ||
324
+ p.subcategory.toLowerCase().includes(searchLower));
325
+ }
326
+ // Note: file filtering requires the full pattern data or file index
327
+ // For now, we skip it in the summary filter
328
+ return result;
329
+ }
330
+ encodeCursor(data) {
331
+ return Buffer.from(JSON.stringify(data)).toString('base64url');
332
+ }
333
+ /** Decode cursor - kept for future pagination implementation */
334
+ // @ts-expect-error - Will be used when pagination is fully implemented
335
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
336
+ decodeCursor(cursor) {
337
+ try {
338
+ return JSON.parse(Buffer.from(cursor, 'base64url').toString());
339
+ }
340
+ catch {
341
+ return null;
342
+ }
343
+ }
344
+ recordQuery(source, startTime) {
345
+ const duration = Date.now() - startTime;
346
+ this.queryCount++;
347
+ switch (source) {
348
+ case 'view':
349
+ this.stats.viewHits++;
350
+ break;
351
+ case 'index':
352
+ this.stats.indexHits++;
353
+ break;
354
+ case 'raw':
355
+ this.stats.rawHits++;
356
+ break;
357
+ }
358
+ // Update rolling average
359
+ this.stats.avgResponseTime =
360
+ (this.stats.avgResponseTime * (this.queryCount - 1) + duration) / this.queryCount;
361
+ this.emit('query', { source, duration });
362
+ }
363
+ }
364
+ // ============================================================================
365
+ // Factory Function
366
+ // ============================================================================
367
+ export function createQueryEngine(config = {}, manifestStore, viewStore, indexStore) {
368
+ return new QueryEngine(config, manifestStore, viewStore, indexStore);
369
+ }
370
+ //# sourceMappingURL=query-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-engine.js","sourceRoot":"","sources":["../../../src/lake/lake.bak/query-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAsC9C,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC1B,MAAM,CAAiB;IACvB,aAAa,CAAgB;IAC7B,SAAS,CAAY;IACrB,UAAU,CAAa;IAExC,iBAAiB;IACT,KAAK,GAAe;QAC1B,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,eAAe,EAAE,CAAC;KACnB,CAAC;IACM,UAAU,GAAW,CAAC,CAAC;IAE/B,6BAA6B;IACrB,gBAAgB,CAA4B;IAEpD,YACE,SAAkC,EAAE,EACpC,aAA6B,EAC7B,SAAqB,EACrB,UAAuB;QAEvB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,wBAAwB,EAAE,GAAG,MAAM,EAAE,CAAC;QACzD,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,6EAA6E;IAC7E,iBAAiB;IACjB,6EAA6E;IAE7E,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;YAC/B,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;YAC3B,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,MAAgC;QAClD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,6EAA6E;IAC7E,eAAe;IACf,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YAClD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAEtD,sBAAsB;YACtB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,UAA+B,EAAE;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAEnC,+BAA+B;QAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;YAC7D,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;gBAElC,gBAAgB;gBAChB,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAE1D,WAAW;gBACX,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;gBAEvC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACpC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK;oBACL,OAAO;oBACP,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC/E,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACrC,MAAM,EAAE,MAAM;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACzE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAC/D,IAAI,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxE,kDAAkD;gBAClD,+BAA+B;gBAC/B,KAAK,WAAW,CAAC,CAAC,kDAAkD;YACtE,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAEjE,sBAAsB;YACtB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACrD,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;YACnC,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAE5D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;YAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;YAEvC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACnC,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK;gBACL,OAAO;gBACP,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC/E,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACrC,MAAM,EAAE,KAAK;aACd,CAAC;QACJ,CAAC;QAED,OAAO;YACL,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YACrC,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,uBAAuB;QACvB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QACvD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,wCAAwC;gBACxC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;gBAC7D,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC3E,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBACrC,OAAO,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAyB;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,2BAA2B;QAC3B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC/D,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,wCAAwC;gBACxC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;gBAC7D,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC3E,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBACrC,OAAO,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC;YAC3D,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,gBAAgB;IAChB,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YAClD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,cAAc;IACd,6EAA6E;IAE7E;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E;;OAEG;IACH,WAAW,CAAC,IAAc;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAoE,CAAC,CAAC;IAC9G,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAAkB;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;YAC5D,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAoE,EAAE,qBAAqB,CAAC,CAAC;gBAC9H,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,QAAQ;IACR,6EAA6E;IAE7E,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,GAAG;YACX,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,eAAe,EAAE,CAAC;SACnB,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAErE,sBAAsB,CAC5B,QAA0B,EAC1B,OAA4B;QAE5B,IAAI,MAAM,GAAG,QAAQ,CAAC;QAEtB,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAC/B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,aAAc,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACzB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC1C,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAClD,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,4CAA4C;QAE5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,YAAY,CAAC,IAAwB;QAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC;IAED,gEAAgE;IAChE,uEAAuE;IACvE,6DAA6D;IACrD,YAAY,CAAC,MAAc;QACjC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,MAAgC,EAAE,SAAiB;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,KAAK;gBACR,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM;QACV,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,KAAK,CAAC,eAAe;YACxB,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QAEpF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAC/B,SAAkC,EAAE,EACpC,aAA6B,EAC7B,SAAqB,EACrB,UAAuB;IAEvB,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACvE,CAAC"}