@memberjunction/db-auto-doc 2.117.0 → 2.119.0

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 (263) hide show
  1. package/README.md +803 -165
  2. package/bin/run.js +7 -0
  3. package/dist/api/DBAutoDocAPI.d.ts +252 -0
  4. package/dist/api/DBAutoDocAPI.d.ts.map +1 -0
  5. package/dist/api/DBAutoDocAPI.js +530 -0
  6. package/dist/api/DBAutoDocAPI.js.map +1 -0
  7. package/dist/api/index.d.ts +7 -0
  8. package/dist/api/index.d.ts.map +1 -0
  9. package/dist/api/index.js +10 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/commands/analyze.d.ts +6 -4
  12. package/dist/commands/analyze.d.ts.map +1 -1
  13. package/dist/commands/analyze.js +58 -71
  14. package/dist/commands/analyze.js.map +1 -1
  15. package/dist/commands/export.d.ts +14 -4
  16. package/dist/commands/export.d.ts.map +1 -1
  17. package/dist/commands/export.js +156 -61
  18. package/dist/commands/export.js.map +1 -1
  19. package/dist/commands/generate-queries.d.ts +17 -0
  20. package/dist/commands/generate-queries.d.ts.map +1 -0
  21. package/dist/commands/generate-queries.js +182 -0
  22. package/dist/commands/generate-queries.js.map +1 -0
  23. package/dist/commands/init.d.ts +3 -4
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +206 -144
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/reset.d.ts +4 -1
  28. package/dist/commands/reset.d.ts.map +1 -1
  29. package/dist/commands/reset.js +33 -19
  30. package/dist/commands/reset.js.map +1 -1
  31. package/dist/commands/status.d.ts +10 -0
  32. package/dist/commands/status.d.ts.map +1 -0
  33. package/dist/commands/status.js +66 -0
  34. package/dist/commands/status.js.map +1 -0
  35. package/dist/core/AnalysisEngine.d.ts +108 -0
  36. package/dist/core/AnalysisEngine.d.ts.map +1 -0
  37. package/dist/core/AnalysisEngine.js +716 -0
  38. package/dist/core/AnalysisEngine.js.map +1 -0
  39. package/dist/core/AnalysisOrchestrator.d.ts +41 -0
  40. package/dist/core/AnalysisOrchestrator.d.ts.map +1 -0
  41. package/dist/core/AnalysisOrchestrator.js +377 -0
  42. package/dist/core/AnalysisOrchestrator.js.map +1 -0
  43. package/dist/core/BackpropagationEngine.d.ts +32 -0
  44. package/dist/core/BackpropagationEngine.d.ts.map +1 -0
  45. package/dist/core/BackpropagationEngine.js +121 -0
  46. package/dist/core/BackpropagationEngine.js.map +1 -0
  47. package/dist/core/ConvergenceDetector.d.ts +27 -0
  48. package/dist/core/ConvergenceDetector.d.ts.map +1 -0
  49. package/dist/core/ConvergenceDetector.js +92 -0
  50. package/dist/core/ConvergenceDetector.js.map +1 -0
  51. package/dist/core/GuardrailsManager.d.ts +78 -0
  52. package/dist/core/GuardrailsManager.d.ts.map +1 -0
  53. package/dist/core/GuardrailsManager.js +367 -0
  54. package/dist/core/GuardrailsManager.js.map +1 -0
  55. package/dist/core/index.d.ts +7 -0
  56. package/dist/core/index.d.ts.map +1 -0
  57. package/dist/core/index.js +13 -0
  58. package/dist/core/index.js.map +1 -0
  59. package/dist/database/Database.d.ts +56 -0
  60. package/dist/database/Database.d.ts.map +1 -0
  61. package/dist/database/Database.js +172 -0
  62. package/dist/database/Database.js.map +1 -0
  63. package/dist/database/TopologicalSorter.d.ts +25 -0
  64. package/dist/database/TopologicalSorter.d.ts.map +1 -0
  65. package/dist/database/TopologicalSorter.js +150 -0
  66. package/dist/database/TopologicalSorter.js.map +1 -0
  67. package/dist/database/index.d.ts +6 -0
  68. package/dist/database/index.d.ts.map +1 -0
  69. package/dist/database/index.js +14 -0
  70. package/dist/database/index.js.map +1 -0
  71. package/dist/discovery/ColumnStatsCache.d.ts +91 -0
  72. package/dist/discovery/ColumnStatsCache.d.ts.map +1 -0
  73. package/dist/discovery/ColumnStatsCache.js +231 -0
  74. package/dist/discovery/ColumnStatsCache.js.map +1 -0
  75. package/dist/discovery/DiscoveryEngine.d.ts +100 -0
  76. package/dist/discovery/DiscoveryEngine.d.ts.map +1 -0
  77. package/dist/discovery/DiscoveryEngine.js +726 -0
  78. package/dist/discovery/DiscoveryEngine.js.map +1 -0
  79. package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts +57 -0
  80. package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts.map +1 -0
  81. package/dist/discovery/DiscoveryTriggerAnalyzer.js +186 -0
  82. package/dist/discovery/DiscoveryTriggerAnalyzer.js.map +1 -0
  83. package/dist/discovery/FKDetector.d.ts +47 -0
  84. package/dist/discovery/FKDetector.d.ts.map +1 -0
  85. package/dist/discovery/FKDetector.js +317 -0
  86. package/dist/discovery/FKDetector.js.map +1 -0
  87. package/dist/discovery/LLMDiscoveryValidator.d.ts +64 -0
  88. package/dist/discovery/LLMDiscoveryValidator.d.ts.map +1 -0
  89. package/dist/discovery/LLMDiscoveryValidator.js +431 -0
  90. package/dist/discovery/LLMDiscoveryValidator.js.map +1 -0
  91. package/dist/discovery/LLMSanityChecker.d.ts +38 -0
  92. package/dist/discovery/LLMSanityChecker.d.ts.map +1 -0
  93. package/dist/discovery/LLMSanityChecker.js +156 -0
  94. package/dist/discovery/LLMSanityChecker.js.map +1 -0
  95. package/dist/discovery/PKDetector.d.ts +62 -0
  96. package/dist/discovery/PKDetector.d.ts.map +1 -0
  97. package/dist/discovery/PKDetector.js +436 -0
  98. package/dist/discovery/PKDetector.js.map +1 -0
  99. package/dist/discovery/index.d.ts +9 -0
  100. package/dist/discovery/index.d.ts.map +1 -0
  101. package/dist/discovery/index.js +25 -0
  102. package/dist/discovery/index.js.map +1 -0
  103. package/dist/drivers/BaseAutoDocDriver.d.ts +132 -0
  104. package/dist/drivers/BaseAutoDocDriver.d.ts.map +1 -0
  105. package/dist/drivers/BaseAutoDocDriver.js +121 -0
  106. package/dist/drivers/BaseAutoDocDriver.js.map +1 -0
  107. package/dist/drivers/MySQLDriver.d.ts +61 -0
  108. package/dist/drivers/MySQLDriver.d.ts.map +1 -0
  109. package/dist/drivers/MySQLDriver.js +668 -0
  110. package/dist/drivers/MySQLDriver.js.map +1 -0
  111. package/dist/drivers/PostgreSQLDriver.d.ts +65 -0
  112. package/dist/drivers/PostgreSQLDriver.d.ts.map +1 -0
  113. package/dist/drivers/PostgreSQLDriver.js +704 -0
  114. package/dist/drivers/PostgreSQLDriver.js.map +1 -0
  115. package/dist/drivers/SQLServerDriver.d.ts +61 -0
  116. package/dist/drivers/SQLServerDriver.d.ts.map +1 -0
  117. package/dist/drivers/SQLServerDriver.js +667 -0
  118. package/dist/drivers/SQLServerDriver.js.map +1 -0
  119. package/dist/generators/CSVGenerator.d.ts +35 -0
  120. package/dist/generators/CSVGenerator.d.ts.map +1 -0
  121. package/dist/generators/CSVGenerator.js +154 -0
  122. package/dist/generators/CSVGenerator.js.map +1 -0
  123. package/dist/generators/HTMLGenerator.d.ts +29 -0
  124. package/dist/generators/HTMLGenerator.d.ts.map +1 -0
  125. package/dist/generators/HTMLGenerator.js +710 -0
  126. package/dist/generators/HTMLGenerator.js.map +1 -0
  127. package/dist/generators/MarkdownGenerator.d.ts +27 -0
  128. package/dist/generators/MarkdownGenerator.d.ts.map +1 -0
  129. package/dist/generators/MarkdownGenerator.js +361 -0
  130. package/dist/generators/MarkdownGenerator.js.map +1 -0
  131. package/dist/generators/MermaidGenerator.d.ts +35 -0
  132. package/dist/generators/MermaidGenerator.d.ts.map +1 -0
  133. package/dist/generators/MermaidGenerator.js +321 -0
  134. package/dist/generators/MermaidGenerator.js.map +1 -0
  135. package/dist/generators/ReportGenerator.d.ts +22 -0
  136. package/dist/generators/ReportGenerator.d.ts.map +1 -0
  137. package/dist/generators/ReportGenerator.js +176 -0
  138. package/dist/generators/ReportGenerator.js.map +1 -0
  139. package/dist/generators/SQLGenerator.d.ts +31 -0
  140. package/dist/generators/SQLGenerator.d.ts.map +1 -0
  141. package/dist/generators/SQLGenerator.js +168 -0
  142. package/dist/generators/SQLGenerator.js.map +1 -0
  143. package/dist/generators/SampleQueryGenerator.d.ts +64 -0
  144. package/dist/generators/SampleQueryGenerator.d.ts.map +1 -0
  145. package/dist/generators/SampleQueryGenerator.js +500 -0
  146. package/dist/generators/SampleQueryGenerator.js.map +1 -0
  147. package/dist/generators/index.d.ts +10 -0
  148. package/dist/generators/index.d.ts.map +1 -0
  149. package/dist/generators/index.js +19 -0
  150. package/dist/generators/index.js.map +1 -0
  151. package/dist/index.d.ts +11 -20
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +19 -20
  154. package/dist/index.js.map +1 -1
  155. package/dist/prompts/PromptEngine.d.ts +65 -0
  156. package/dist/prompts/PromptEngine.d.ts.map +1 -0
  157. package/dist/prompts/PromptEngine.js +305 -0
  158. package/dist/prompts/PromptEngine.js.map +1 -0
  159. package/dist/prompts/PromptFileLoader.d.ts +21 -0
  160. package/dist/prompts/PromptFileLoader.d.ts.map +1 -0
  161. package/dist/prompts/PromptFileLoader.js +74 -0
  162. package/dist/prompts/PromptFileLoader.js.map +1 -0
  163. package/dist/prompts/index.d.ts +6 -0
  164. package/dist/prompts/index.d.ts.map +1 -0
  165. package/dist/prompts/index.js +11 -0
  166. package/dist/prompts/index.js.map +1 -0
  167. package/dist/state/IterationTracker.d.ts +64 -0
  168. package/dist/state/IterationTracker.d.ts.map +1 -0
  169. package/dist/state/IterationTracker.js +136 -0
  170. package/dist/state/IterationTracker.js.map +1 -0
  171. package/dist/state/StateManager.d.ts +79 -0
  172. package/dist/state/StateManager.d.ts.map +1 -0
  173. package/dist/state/StateManager.js +348 -0
  174. package/dist/state/StateManager.js.map +1 -0
  175. package/dist/state/StateValidator.d.ts +24 -0
  176. package/dist/state/StateValidator.d.ts.map +1 -0
  177. package/dist/state/StateValidator.js +147 -0
  178. package/dist/state/StateValidator.js.map +1 -0
  179. package/dist/state/index.d.ts +7 -0
  180. package/dist/state/index.d.ts.map +1 -0
  181. package/dist/state/index.js +13 -0
  182. package/dist/state/index.js.map +1 -0
  183. package/dist/types/analysis.d.ts +76 -0
  184. package/dist/types/analysis.d.ts.map +1 -0
  185. package/dist/types/analysis.js +6 -0
  186. package/dist/types/analysis.js.map +1 -0
  187. package/dist/types/config.d.ts +143 -0
  188. package/dist/types/config.d.ts.map +1 -0
  189. package/dist/types/config.js +7 -0
  190. package/dist/types/config.js.map +1 -0
  191. package/dist/types/discovery.d.ts +277 -0
  192. package/dist/types/discovery.d.ts.map +1 -0
  193. package/dist/types/discovery.js +7 -0
  194. package/dist/types/discovery.js.map +1 -0
  195. package/dist/types/driver.d.ts +148 -0
  196. package/dist/types/driver.d.ts.map +1 -0
  197. package/dist/types/driver.js +7 -0
  198. package/dist/types/driver.js.map +1 -0
  199. package/dist/types/index.d.ts +8 -0
  200. package/dist/types/index.d.ts.map +1 -0
  201. package/dist/types/index.js +24 -0
  202. package/dist/types/index.js.map +1 -0
  203. package/dist/types/prompts.d.ts +158 -0
  204. package/dist/types/prompts.d.ts.map +1 -0
  205. package/dist/types/prompts.js +6 -0
  206. package/dist/types/prompts.js.map +1 -0
  207. package/dist/types/sample-queries.d.ts +172 -0
  208. package/dist/types/sample-queries.d.ts.map +1 -0
  209. package/dist/types/sample-queries.js +7 -0
  210. package/dist/types/sample-queries.js.map +1 -0
  211. package/dist/types/state.d.ts +291 -0
  212. package/dist/types/state.d.ts.map +1 -0
  213. package/dist/types/state.js +7 -0
  214. package/dist/types/state.js.map +1 -0
  215. package/dist/utils/config-loader.d.ts +29 -0
  216. package/dist/utils/config-loader.d.ts.map +1 -0
  217. package/dist/utils/config-loader.js +163 -0
  218. package/dist/utils/config-loader.js.map +1 -0
  219. package/dist/utils/index.d.ts +5 -0
  220. package/dist/utils/index.d.ts.map +1 -0
  221. package/dist/utils/index.js +9 -0
  222. package/dist/utils/index.js.map +1 -0
  223. package/package.json +28 -3
  224. package/dist/ai/simple-ai-client.d.ts +0 -70
  225. package/dist/ai/simple-ai-client.d.ts.map +0 -1
  226. package/dist/ai/simple-ai-client.js +0 -181
  227. package/dist/ai/simple-ai-client.js.map +0 -1
  228. package/dist/analyzers/analyzer.d.ts +0 -23
  229. package/dist/analyzers/analyzer.d.ts.map +0 -1
  230. package/dist/analyzers/analyzer.js +0 -127
  231. package/dist/analyzers/analyzer.js.map +0 -1
  232. package/dist/cli-old/cli.d.ts +0 -3
  233. package/dist/cli-old/cli.d.ts.map +0 -1
  234. package/dist/cli-old/cli.js +0 -388
  235. package/dist/cli-old/cli.js.map +0 -1
  236. package/dist/commands/review.d.ts +0 -11
  237. package/dist/commands/review.d.ts.map +0 -1
  238. package/dist/commands/review.js +0 -82
  239. package/dist/commands/review.js.map +0 -1
  240. package/dist/database/connection.d.ts +0 -40
  241. package/dist/database/connection.d.ts.map +0 -1
  242. package/dist/database/connection.js +0 -136
  243. package/dist/database/connection.js.map +0 -1
  244. package/dist/database/introspection.d.ts +0 -59
  245. package/dist/database/introspection.d.ts.map +0 -1
  246. package/dist/database/introspection.js +0 -124
  247. package/dist/database/introspection.js.map +0 -1
  248. package/dist/generators/markdown-generator.d.ts +0 -8
  249. package/dist/generators/markdown-generator.d.ts.map +0 -1
  250. package/dist/generators/markdown-generator.js +0 -106
  251. package/dist/generators/markdown-generator.js.map +0 -1
  252. package/dist/generators/sql-generator.d.ts +0 -20
  253. package/dist/generators/sql-generator.d.ts.map +0 -1
  254. package/dist/generators/sql-generator.js +0 -83
  255. package/dist/generators/sql-generator.js.map +0 -1
  256. package/dist/state/state-manager.d.ts +0 -95
  257. package/dist/state/state-manager.d.ts.map +0 -1
  258. package/dist/state/state-manager.js +0 -236
  259. package/dist/state/state-manager.js.map +0 -1
  260. package/dist/types/state-file.d.ts +0 -124
  261. package/dist/types/state-file.d.ts.map +0 -1
  262. package/dist/types/state-file.js +0 -79
  263. package/dist/types/state-file.js.map +0 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Topological sorting of database tables based on foreign key dependencies
3
+ * Implements Kahn's algorithm
4
+ */
5
+ import { SchemaDefinition } from '../types/state.js';
6
+ import { DependencyGraph, TableNode } from '../types/analysis.js';
7
+ export declare class TopologicalSorter {
8
+ /**
9
+ * Build dependency graph and sort topologically
10
+ */
11
+ buildAndSort(schemas: SchemaDefinition[]): DependencyGraph;
12
+ /**
13
+ * Build dependency graph from schemas
14
+ */
15
+ private buildGraph;
16
+ /**
17
+ * Perform topological sort using Kahn's algorithm
18
+ */
19
+ private sort;
20
+ /**
21
+ * Detect cycles in the dependency graph
22
+ */
23
+ detectCycles(nodes: Map<string, TableNode>): string[][];
24
+ }
25
+ //# sourceMappingURL=TopologicalSorter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopologicalSorter.d.ts","sourceRoot":"","sources":["../../src/database/TopologicalSorter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAElE,qBAAa,iBAAiB;IAC5B;;OAEG;IACI,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,eAAe;IAUjE;;OAEG;IACH,OAAO,CAAC,UAAU;IAyClB;;OAEG;IACH,OAAO,CAAC,IAAI;IAsEZ;;OAEG;IACI,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,EAAE;CAiC/D"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ /**
3
+ * Topological sorting of database tables based on foreign key dependencies
4
+ * Implements Kahn's algorithm
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TopologicalSorter = void 0;
8
+ class TopologicalSorter {
9
+ /**
10
+ * Build dependency graph and sort topologically
11
+ */
12
+ buildAndSort(schemas) {
13
+ // Build graph from schemas
14
+ const nodes = this.buildGraph(schemas);
15
+ // Perform topological sort
16
+ const levels = this.sort(nodes);
17
+ return { nodes, levels };
18
+ }
19
+ /**
20
+ * Build dependency graph from schemas
21
+ */
22
+ buildGraph(schemas) {
23
+ const nodes = new Map();
24
+ // Create all nodes first
25
+ for (const schema of schemas) {
26
+ for (const table of schema.tables) {
27
+ const fullName = `${schema.name}.${table.name}`;
28
+ nodes.set(fullName, {
29
+ schema: schema.name,
30
+ table: table.name,
31
+ fullName,
32
+ dependsOn: [],
33
+ dependents: [],
34
+ level: -1,
35
+ tableDefinition: table
36
+ });
37
+ }
38
+ }
39
+ // Wire up dependencies
40
+ for (const schema of schemas) {
41
+ for (const table of schema.tables) {
42
+ const fullName = `${schema.name}.${table.name}`;
43
+ const node = nodes.get(fullName);
44
+ // Add dependencies
45
+ for (const dep of table.dependsOn) {
46
+ const depFullName = `${dep.schema}.${dep.table}`;
47
+ const depNode = nodes.get(depFullName);
48
+ if (depNode) {
49
+ node.dependsOn.push(depNode);
50
+ depNode.dependents.push(node);
51
+ }
52
+ }
53
+ }
54
+ }
55
+ return nodes;
56
+ }
57
+ /**
58
+ * Perform topological sort using Kahn's algorithm
59
+ */
60
+ sort(nodes) {
61
+ const levels = [];
62
+ const inDegree = new Map();
63
+ const processed = new Set();
64
+ // Calculate in-degrees
65
+ for (const [fullName, node] of nodes) {
66
+ inDegree.set(fullName, node.dependsOn.length);
67
+ }
68
+ let currentLevel = 0;
69
+ while (processed.size < nodes.size) {
70
+ // Find all nodes with in-degree 0 (no unprocessed dependencies)
71
+ const currentLevelNodes = [];
72
+ for (const [fullName, node] of nodes) {
73
+ if (!processed.has(fullName) && inDegree.get(fullName) === 0) {
74
+ currentLevelNodes.push(node);
75
+ node.level = currentLevel;
76
+ }
77
+ }
78
+ // Check for cycles
79
+ if (currentLevelNodes.length === 0 && processed.size < nodes.size) {
80
+ // We have a cycle - find remaining nodes and assign them to current level
81
+ const remaining = [];
82
+ for (const [fullName, node] of nodes) {
83
+ if (!processed.has(fullName)) {
84
+ node.level = currentLevel;
85
+ remaining.push(node);
86
+ }
87
+ }
88
+ if (remaining.length > 0) {
89
+ levels.push(remaining);
90
+ }
91
+ break;
92
+ }
93
+ // Add current level to results
94
+ if (currentLevelNodes.length > 0) {
95
+ levels.push(currentLevelNodes);
96
+ // Mark nodes as processed
97
+ for (const node of currentLevelNodes) {
98
+ processed.add(node.fullName);
99
+ // Decrement in-degree for dependents
100
+ for (const dependent of node.dependents) {
101
+ const currentInDegree = inDegree.get(dependent.fullName);
102
+ inDegree.set(dependent.fullName, currentInDegree - 1);
103
+ }
104
+ }
105
+ }
106
+ currentLevel++;
107
+ }
108
+ // Update table definitions with dependency level
109
+ for (const [fullName, node] of nodes) {
110
+ if (node.tableDefinition) {
111
+ node.tableDefinition.dependencyLevel = node.level;
112
+ }
113
+ }
114
+ return levels;
115
+ }
116
+ /**
117
+ * Detect cycles in the dependency graph
118
+ */
119
+ detectCycles(nodes) {
120
+ const cycles = [];
121
+ const visited = new Set();
122
+ const recursionStack = new Set();
123
+ const dfs = (node, path) => {
124
+ visited.add(node.fullName);
125
+ recursionStack.add(node.fullName);
126
+ path.push(node.fullName);
127
+ for (const dep of node.dependsOn) {
128
+ if (!visited.has(dep.fullName)) {
129
+ dfs(dep, [...path]);
130
+ }
131
+ else if (recursionStack.has(dep.fullName)) {
132
+ // Found a cycle
133
+ const cycleStart = path.indexOf(dep.fullName);
134
+ const cycle = path.slice(cycleStart);
135
+ cycle.push(dep.fullName);
136
+ cycles.push(cycle);
137
+ }
138
+ }
139
+ recursionStack.delete(node.fullName);
140
+ };
141
+ for (const [fullName, node] of nodes) {
142
+ if (!visited.has(fullName)) {
143
+ dfs(node, []);
144
+ }
145
+ }
146
+ return cycles;
147
+ }
148
+ }
149
+ exports.TopologicalSorter = TopologicalSorter;
150
+ //# sourceMappingURL=TopologicalSorter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopologicalSorter.js","sourceRoot":"","sources":["../../src/database/TopologicalSorter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Exports for database module
3
+ */
4
+ export { DatabaseConnection, Introspector, DataSampler, createDriver } from './Database.js';
5
+ export { TopologicalSorter } from './TopologicalSorter.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Exports for database module
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TopologicalSorter = exports.createDriver = exports.DataSampler = exports.Introspector = exports.DatabaseConnection = void 0;
7
+ var Database_js_1 = require("./Database.js");
8
+ Object.defineProperty(exports, "DatabaseConnection", { enumerable: true, get: function () { return Database_js_1.DatabaseConnection; } });
9
+ Object.defineProperty(exports, "Introspector", { enumerable: true, get: function () { return Database_js_1.Introspector; } });
10
+ Object.defineProperty(exports, "DataSampler", { enumerable: true, get: function () { return Database_js_1.DataSampler; } });
11
+ Object.defineProperty(exports, "createDriver", { enumerable: true, get: function () { return Database_js_1.createDriver; } });
12
+ var TopologicalSorter_js_1 = require("./TopologicalSorter.js");
13
+ Object.defineProperty(exports, "TopologicalSorter", { enumerable: true, get: function () { return TopologicalSorter_js_1.TopologicalSorter; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6CAA4F;AAAnF,iHAAA,kBAAkB,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,0GAAA,WAAW,OAAA;AAAE,2GAAA,YAAY,OAAA;AACpE,+DAA2D;AAAlD,yHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Column Statistics Cache
3
+ * Stores pre-computed column statistics to avoid redundant database queries
4
+ * Used across discovery and analysis phases
5
+ */
6
+ import { CachedColumnStats, TableStatsCache } from '../types/discovery.js';
7
+ export declare class ColumnStatsCache {
8
+ private tableCache;
9
+ /**
10
+ * Get table key for cache lookup
11
+ */
12
+ private getTableKey;
13
+ /**
14
+ * Get column key for cache lookup
15
+ */
16
+ private getColumnKey;
17
+ /**
18
+ * Store column statistics
19
+ */
20
+ setColumnStats(stats: CachedColumnStats): void;
21
+ /**
22
+ * Get column statistics
23
+ */
24
+ getColumnStats(schemaName: string, tableName: string, columnName: string): CachedColumnStats | undefined;
25
+ /**
26
+ * Get all column statistics for a table
27
+ */
28
+ getTableStats(schemaName: string, tableName: string): TableStatsCache | undefined;
29
+ /**
30
+ * Get all columns in a table
31
+ */
32
+ getTableColumns(schemaName: string, tableName: string): CachedColumnStats[];
33
+ /**
34
+ * Check if column stats exist
35
+ */
36
+ hasColumnStats(schemaName: string, tableName: string, columnName: string): boolean;
37
+ /**
38
+ * Check if table stats exist
39
+ */
40
+ hasTableStats(schemaName: string, tableName: string): boolean;
41
+ /**
42
+ * Get all tables with cached stats
43
+ */
44
+ getAllTables(): TableStatsCache[];
45
+ /**
46
+ * Find columns matching a pattern across all tables
47
+ * Useful for finding potential FK relationships
48
+ */
49
+ findColumnsMatching(predicate: (stats: CachedColumnStats) => boolean): CachedColumnStats[];
50
+ /**
51
+ * Find columns with similar names across tables
52
+ * Example: Find all columns named "*_id" or "*ID"
53
+ */
54
+ findColumnsByNamePattern(pattern: RegExp): CachedColumnStats[];
55
+ /**
56
+ * Find highly unique columns (potential PKs)
57
+ */
58
+ findUniqueColumns(minUniqueness?: number): CachedColumnStats[];
59
+ /**
60
+ * Find columns with same name across multiple tables
61
+ * Returns Map of columnName -> array of CachedColumnStats
62
+ */
63
+ findDuplicateColumnNames(): Map<string, CachedColumnStats[]>;
64
+ /**
65
+ * Get cache statistics
66
+ */
67
+ getCacheStats(): {
68
+ totalTables: number;
69
+ totalColumns: number;
70
+ totalStatsBytes: number;
71
+ avgColumnsPerTable: number;
72
+ };
73
+ /**
74
+ * Clear all cached stats
75
+ */
76
+ clear(): void;
77
+ /**
78
+ * Export cache to JSON for persistence in state file
79
+ */
80
+ toStateJSON(): import('../types/state.js').ColumnStatisticsCache;
81
+ /**
82
+ * Import cache from state JSON
83
+ */
84
+ fromStateJSON(data: import('../types/state.js').ColumnStatisticsCache): void;
85
+ /**
86
+ * Merge cached stats into schema column definitions
87
+ * Replaces separate columnStatistics cache with embedded stats
88
+ */
89
+ mergeIntoSchemas(schemas: import('../types/state.js').SchemaDefinition[]): void;
90
+ }
91
+ //# sourceMappingURL=ColumnStatsCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnStatsCache.d.ts","sourceRoot":"","sources":["../../src/discovery/ColumnStatsCache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE3E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAA2C;IAE7D;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAkBrD;;OAEG;IACI,cAAc,CACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,iBAAiB,GAAG,SAAS;IAMhC;;OAEG;IACI,aAAa,CAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,SAAS;IAK9B;;OAEG;IACI,eAAe,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,iBAAiB,EAAE;IAKtB;;OAEG;IACI,cAAc,CACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO;IAIV;;OAEG;IACI,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpE;;OAEG;IACI,YAAY,IAAI,eAAe,EAAE;IAIxC;;;OAGG;IACI,mBAAmB,CACxB,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,GAC/C,iBAAiB,EAAE;IActB;;;OAGG;IACI,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAIrE;;OAEG;IACI,iBAAiB,CAAC,aAAa,GAAE,MAAa,GAAG,iBAAiB,EAAE;IAM3E;;;OAGG;IACI,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAiBnE;;OAEG;IACI,aAAa,IAAI;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;KAC5B;IAmBD;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,WAAW,IAAI,OAAO,mBAAmB,EAAE,qBAAqB;IA2BvE;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,OAAO,mBAAmB,EAAE,qBAAqB,GAAG,IAAI;IAmBnF;;;OAGG;IACI,gBAAgB,CAAC,OAAO,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,EAAE,GAAG,IAAI;CAgCvF"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ /**
3
+ * Column Statistics Cache
4
+ * Stores pre-computed column statistics to avoid redundant database queries
5
+ * Used across discovery and analysis phases
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ColumnStatsCache = void 0;
9
+ class ColumnStatsCache {
10
+ constructor() {
11
+ this.tableCache = new Map();
12
+ }
13
+ /**
14
+ * Get table key for cache lookup
15
+ */
16
+ getTableKey(schemaName, tableName) {
17
+ return `${schemaName}.${tableName}`;
18
+ }
19
+ /**
20
+ * Get column key for cache lookup
21
+ */
22
+ getColumnKey(schemaName, tableName, columnName) {
23
+ return `${schemaName}.${tableName}.${columnName}`;
24
+ }
25
+ /**
26
+ * Store column statistics
27
+ */
28
+ setColumnStats(stats) {
29
+ const tableKey = this.getTableKey(stats.schemaName, stats.tableName);
30
+ let tableStats = this.tableCache.get(tableKey);
31
+ if (!tableStats) {
32
+ tableStats = {
33
+ schemaName: stats.schemaName,
34
+ tableName: stats.tableName,
35
+ totalRows: stats.totalRows,
36
+ columns: new Map(),
37
+ computedAt: stats.computedAt
38
+ };
39
+ this.tableCache.set(tableKey, tableStats);
40
+ }
41
+ tableStats.columns.set(stats.columnName, stats);
42
+ }
43
+ /**
44
+ * Get column statistics
45
+ */
46
+ getColumnStats(schemaName, tableName, columnName) {
47
+ const tableKey = this.getTableKey(schemaName, tableName);
48
+ const tableStats = this.tableCache.get(tableKey);
49
+ return tableStats?.columns.get(columnName);
50
+ }
51
+ /**
52
+ * Get all column statistics for a table
53
+ */
54
+ getTableStats(schemaName, tableName) {
55
+ const tableKey = this.getTableKey(schemaName, tableName);
56
+ return this.tableCache.get(tableKey);
57
+ }
58
+ /**
59
+ * Get all columns in a table
60
+ */
61
+ getTableColumns(schemaName, tableName) {
62
+ const tableStats = this.getTableStats(schemaName, tableName);
63
+ return tableStats ? Array.from(tableStats.columns.values()) : [];
64
+ }
65
+ /**
66
+ * Check if column stats exist
67
+ */
68
+ hasColumnStats(schemaName, tableName, columnName) {
69
+ return this.getColumnStats(schemaName, tableName, columnName) !== undefined;
70
+ }
71
+ /**
72
+ * Check if table stats exist
73
+ */
74
+ hasTableStats(schemaName, tableName) {
75
+ return this.getTableStats(schemaName, tableName) !== undefined;
76
+ }
77
+ /**
78
+ * Get all tables with cached stats
79
+ */
80
+ getAllTables() {
81
+ return Array.from(this.tableCache.values());
82
+ }
83
+ /**
84
+ * Find columns matching a pattern across all tables
85
+ * Useful for finding potential FK relationships
86
+ */
87
+ findColumnsMatching(predicate) {
88
+ const results = [];
89
+ for (const tableStats of this.tableCache.values()) {
90
+ for (const columnStats of tableStats.columns.values()) {
91
+ if (predicate(columnStats)) {
92
+ results.push(columnStats);
93
+ }
94
+ }
95
+ }
96
+ return results;
97
+ }
98
+ /**
99
+ * Find columns with similar names across tables
100
+ * Example: Find all columns named "*_id" or "*ID"
101
+ */
102
+ findColumnsByNamePattern(pattern) {
103
+ return this.findColumnsMatching(stats => pattern.test(stats.columnName));
104
+ }
105
+ /**
106
+ * Find highly unique columns (potential PKs)
107
+ */
108
+ findUniqueColumns(minUniqueness = 0.95) {
109
+ return this.findColumnsMatching(stats => stats.uniqueness >= minUniqueness && stats.nullCount === 0);
110
+ }
111
+ /**
112
+ * Find columns with same name across multiple tables
113
+ * Returns Map of columnName -> array of CachedColumnStats
114
+ */
115
+ findDuplicateColumnNames() {
116
+ const columnMap = new Map();
117
+ for (const tableStats of this.tableCache.values()) {
118
+ for (const columnStats of tableStats.columns.values()) {
119
+ const existing = columnMap.get(columnStats.columnName) || [];
120
+ existing.push(columnStats);
121
+ columnMap.set(columnStats.columnName, existing);
122
+ }
123
+ }
124
+ // Filter to only columns that appear in multiple tables
125
+ return new Map(Array.from(columnMap.entries()).filter(([_, stats]) => stats.length > 1));
126
+ }
127
+ /**
128
+ * Get cache statistics
129
+ */
130
+ getCacheStats() {
131
+ let totalColumns = 0;
132
+ let totalStatsBytes = 0;
133
+ for (const tableStats of this.tableCache.values()) {
134
+ totalColumns += tableStats.columns.size;
135
+ // Rough estimate of memory usage
136
+ totalStatsBytes += JSON.stringify(Array.from(tableStats.columns.values())).length;
137
+ }
138
+ return {
139
+ totalTables: this.tableCache.size,
140
+ totalColumns,
141
+ totalStatsBytes,
142
+ avgColumnsPerTable: this.tableCache.size > 0 ? totalColumns / this.tableCache.size : 0
143
+ };
144
+ }
145
+ /**
146
+ * Clear all cached stats
147
+ */
148
+ clear() {
149
+ this.tableCache.clear();
150
+ }
151
+ /**
152
+ * Export cache to JSON for persistence in state file
153
+ */
154
+ toStateJSON() {
155
+ let totalColumns = 0;
156
+ const tables = {};
157
+ for (const [key, tableStats] of this.tableCache.entries()) {
158
+ const columns = Array.from(tableStats.columns.values());
159
+ totalColumns += columns.length;
160
+ tables[key] = {
161
+ schemaName: tableStats.schemaName,
162
+ tableName: tableStats.tableName,
163
+ totalRows: tableStats.totalRows,
164
+ columns
165
+ };
166
+ }
167
+ return {
168
+ computedAt: new Date().toISOString(),
169
+ totalSchemas: new Set(Array.from(this.tableCache.values()).map(t => t.schemaName)).size,
170
+ totalTables: this.tableCache.size,
171
+ totalColumns,
172
+ tables
173
+ };
174
+ }
175
+ /**
176
+ * Import cache from state JSON
177
+ */
178
+ fromStateJSON(data) {
179
+ this.clear();
180
+ for (const [key, tableEntry] of Object.entries(data.tables)) {
181
+ const columnMap = new Map();
182
+ for (const col of tableEntry.columns) {
183
+ columnMap.set(col.columnName, col);
184
+ }
185
+ this.tableCache.set(key, {
186
+ schemaName: tableEntry.schemaName,
187
+ tableName: tableEntry.tableName,
188
+ totalRows: tableEntry.totalRows,
189
+ columns: columnMap,
190
+ computedAt: data.computedAt
191
+ });
192
+ }
193
+ }
194
+ /**
195
+ * Merge cached stats into schema column definitions
196
+ * Replaces separate columnStatistics cache with embedded stats
197
+ */
198
+ mergeIntoSchemas(schemas) {
199
+ for (const schema of schemas) {
200
+ for (const table of schema.tables) {
201
+ const cacheKey = `${schema.name}.${table.name}`;
202
+ const tableStats = this.tableCache.get(cacheKey);
203
+ if (!tableStats)
204
+ continue;
205
+ for (const column of table.columns) {
206
+ const cachedStats = tableStats.columns.get(column.name);
207
+ if (!cachedStats)
208
+ continue;
209
+ // Merge cached stats into column.statistics
210
+ column.statistics = {
211
+ totalRows: cachedStats.totalRows,
212
+ distinctCount: cachedStats.distinctCount,
213
+ uniquenessRatio: cachedStats.uniqueness,
214
+ nullCount: cachedStats.nullCount,
215
+ nullPercentage: cachedStats.nullPercentage,
216
+ dataPattern: cachedStats.dataPattern,
217
+ sampleValues: cachedStats.sampleValues,
218
+ valueDistribution: cachedStats.valueDistribution,
219
+ minValue: cachedStats.minValue,
220
+ maxValue: cachedStats.maxValue,
221
+ avgLength: cachedStats.avgLength,
222
+ computedAt: cachedStats.computedAt,
223
+ queryTimeMs: cachedStats.queryTimeMs
224
+ };
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
230
+ exports.ColumnStatsCache = ColumnStatsCache;
231
+ //# sourceMappingURL=ColumnStatsCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnStatsCache.js","sourceRoot":"","sources":["../../src/discovery/ColumnStatsCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Discovery Engine
3
+ * Orchestrates relationship discovery with iterative refinement and backpropagation
4
+ */
5
+ import { BaseAutoDocDriver } from '../drivers/BaseAutoDocDriver.js';
6
+ import { ColumnStatsCache } from './ColumnStatsCache.js';
7
+ import { SchemaDefinition, DatabaseDocumentation } from '../types/state.js';
8
+ import { RelationshipDiscoveryPhase, DiscoveryTriggerAnalysis } from '../types/discovery.js';
9
+ import { RelationshipDiscoveryConfig, AIConfig } from '../types/config.js';
10
+ export interface DiscoveryEngineOptions {
11
+ driver: BaseAutoDocDriver;
12
+ config: RelationshipDiscoveryConfig;
13
+ aiConfig: AIConfig;
14
+ schemas: SchemaDefinition[];
15
+ onProgress?: (message: string, data?: any) => void;
16
+ }
17
+ export interface DiscoveryResult {
18
+ phase: RelationshipDiscoveryPhase;
19
+ guardrailsReached: boolean;
20
+ guardrailReason?: string;
21
+ statsCache: ColumnStatsCache;
22
+ }
23
+ export declare class DiscoveryEngine {
24
+ private driver;
25
+ private config;
26
+ private aiConfig;
27
+ private schemas;
28
+ private onProgress;
29
+ private statsCache;
30
+ private pkDetector;
31
+ private fkDetector;
32
+ private llmValidator?;
33
+ private sanityChecker?;
34
+ constructor(options: DiscoveryEngineOptions);
35
+ /**
36
+ * Get the column statistics cache
37
+ */
38
+ getStatsCache(): ColumnStatsCache;
39
+ /**
40
+ * Analyze if discovery should be triggered based on schema state
41
+ */
42
+ analyzeTrigger(): DiscoveryTriggerAnalysis;
43
+ /**
44
+ * Execute the discovery process
45
+ */
46
+ discover(maxTokens: number, triggerAnalysis: DiscoveryTriggerAnalysis): Promise<DiscoveryResult>;
47
+ /**
48
+ * Initialize discovery phase
49
+ */
50
+ private initializePhase;
51
+ /**
52
+ * Determine trigger reason from analysis
53
+ */
54
+ private determineTriggerReason;
55
+ /**
56
+ * Execute a single discovery iteration
57
+ */
58
+ private executeIteration;
59
+ /**
60
+ * Detect primary keys in all tables without PKs
61
+ */
62
+ private detectPrimaryKeys;
63
+ /**
64
+ * Detect foreign keys across all schemas
65
+ */
66
+ private detectForeignKeys;
67
+ /**
68
+ * Perform LLM validation on PK/FK candidates
69
+ */
70
+ private performLLMValidation;
71
+ /**
72
+ * Check if backpropagation should be triggered
73
+ */
74
+ private shouldTriggerBackprop;
75
+ /**
76
+ * Perform backpropagation to update confidence scores
77
+ */
78
+ private performBackpropagation;
79
+ /**
80
+ * Merge iteration discoveries into phase
81
+ */
82
+ private mergeDiscoveries;
83
+ /**
84
+ * Check if discovery should continue
85
+ */
86
+ private shouldContinueDiscovery;
87
+ /**
88
+ * Check guardrails
89
+ */
90
+ private checkGuardrails;
91
+ /**
92
+ * Calculate final summary statistics
93
+ */
94
+ private calculateSummary;
95
+ /**
96
+ * Apply discovered relationships to state
97
+ */
98
+ applyDiscoveriesToState(state: DatabaseDocumentation, phase: RelationshipDiscoveryPhase): void;
99
+ }
100
+ //# sourceMappingURL=DiscoveryEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscoveryEngine.d.ts","sourceRoot":"","sources":["../../src/discovery/DiscoveryEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAKpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,0BAA0B,EAI1B,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,2BAA2B,CAAC;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,0BAA0B,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAmB;gBAE7B,OAAO,EAAE,sBAAsB;IA2B3C;;OAEG;IACI,aAAa,IAAI,gBAAgB;IAIxC;;OAEG;IACI,cAAc,IAAI,wBAAwB;IA6DjD;;OAEG;IACU,QAAQ,CACnB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,wBAAwB,GACxC,OAAO,CAAC,eAAe,CAAC;IA2E3B;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;YACW,gBAAgB;IAwK9B;;OAEG;YACW,iBAAiB;IAoC/B;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;YACW,oBAAoB;IAuJlC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;OAEG;YACW,sBAAsB;IA4DpC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiCvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;OAEG;IACI,uBAAuB,CAC5B,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,0BAA0B,GAChC,IAAI;CA4CR"}