@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,121 @@
1
+ "use strict";
2
+ /**
3
+ * Handles backpropagation of insights from child tables to parent tables
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BackpropagationEngine = void 0;
7
+ class BackpropagationEngine {
8
+ constructor(promptEngine, stateManager, iterationTracker, maxDepth) {
9
+ this.promptEngine = promptEngine;
10
+ this.stateManager = stateManager;
11
+ this.iterationTracker = iterationTracker;
12
+ this.maxDepth = maxDepth;
13
+ }
14
+ /**
15
+ * Execute backpropagation for a set of triggers
16
+ */
17
+ async execute(state, run, triggers) {
18
+ let tablesUpdated = 0;
19
+ let totalTokensUsed = 0;
20
+ // Group triggers by target table
21
+ const triggersByTable = this.groupTriggersByTable(triggers);
22
+ for (const [tableKey, tableTriggers] of triggersByTable) {
23
+ const [schemaName, tableName] = tableKey.split('.');
24
+ const table = this.stateManager.findTable(state, schemaName, tableName);
25
+ if (!table) {
26
+ this.iterationTracker.addWarning(run, `Backpropagation target table not found: ${tableKey}`);
27
+ continue;
28
+ }
29
+ // Skip if no current description
30
+ if (!table.description) {
31
+ continue;
32
+ }
33
+ // Get current description details
34
+ const latestIteration = table.descriptionIterations[table.descriptionIterations.length - 1];
35
+ // Combine insights from all triggers for this table
36
+ const insights = tableTriggers.map(t => t.insight).join('\n\n');
37
+ // Execute backpropagation prompt
38
+ const result = await this.promptEngine.executePrompt('backpropagation', {
39
+ schemaName,
40
+ tableName,
41
+ currentDescription: table.description,
42
+ currentReasoning: latestIteration?.reasoning || '',
43
+ currentConfidence: latestIteration?.confidence || 0,
44
+ insights
45
+ }, {
46
+ responseFormat: 'JSON'
47
+ });
48
+ if (!result.success || !result.result) {
49
+ this.iterationTracker.addError(run, `Backpropagation failed for ${tableKey}: ${result.errorMessage}`);
50
+ continue;
51
+ }
52
+ totalTokensUsed += result.tokensUsed;
53
+ this.iterationTracker.addTokenUsage(run, result.tokensUsed, result.cost);
54
+ // Check if revision is needed
55
+ if (result.result.needsRevision) {
56
+ // Update table description
57
+ this.stateManager.updateTableDescription(table, result.result.revisedDescription || result.result.reasoning, result.result.reasoning, result.result.confidence, run.modelUsed, 'backpropagation');
58
+ tablesUpdated++;
59
+ this.iterationTracker.addLogEntry(run, {
60
+ level: table.dependencyLevel || 0,
61
+ schema: schemaName,
62
+ table: tableName,
63
+ action: 'backpropagate',
64
+ result: 'changed',
65
+ message: 'Description revised based on child table insights',
66
+ tokensUsed: result.tokensUsed
67
+ });
68
+ }
69
+ else {
70
+ this.iterationTracker.addLogEntry(run, {
71
+ level: table.dependencyLevel || 0,
72
+ schema: schemaName,
73
+ table: tableName,
74
+ action: 'backpropagate',
75
+ result: 'unchanged',
76
+ message: 'No revision needed',
77
+ tokensUsed: result.tokensUsed
78
+ });
79
+ }
80
+ }
81
+ if (tablesUpdated > 0) {
82
+ this.iterationTracker.incrementBackpropagation(run);
83
+ }
84
+ return { tablesUpdated, tokensUsed: totalTokensUsed };
85
+ }
86
+ /**
87
+ * Detect insights about parent tables from analysis result
88
+ * Uses LLM-provided insights instead of NLP pattern matching
89
+ */
90
+ detectParentInsights(table, analysisResult, schema, tableName) {
91
+ const triggers = [];
92
+ // Current table full name for source
93
+ const sourceTable = schema && tableName ? `${schema}.${tableName}` : 'unknown';
94
+ // Use LLM-provided parent table insights (much more accurate than NLP)
95
+ const parentInsights = analysisResult.parentTableInsights || [];
96
+ for (const insight of parentInsights) {
97
+ triggers.push({
98
+ sourceTable,
99
+ targetTable: insight.parentTable,
100
+ insight: insight.insight,
101
+ confidence: insight.confidence
102
+ });
103
+ }
104
+ return triggers;
105
+ }
106
+ /**
107
+ * Group triggers by target table
108
+ */
109
+ groupTriggersByTable(triggers) {
110
+ const grouped = new Map();
111
+ for (const trigger of triggers) {
112
+ if (!grouped.has(trigger.targetTable)) {
113
+ grouped.set(trigger.targetTable, []);
114
+ }
115
+ grouped.get(trigger.targetTable).push(trigger);
116
+ }
117
+ return grouped;
118
+ }
119
+ }
120
+ exports.BackpropagationEngine = BackpropagationEngine;
121
+ //# sourceMappingURL=BackpropagationEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackpropagationEngine.js","sourceRoot":"","sources":["../../src/core/BackpropagationEngine.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AASH,MAAa,qBAAqB;IAChC,YACU,YAA0B,EAC1B,YAA0B,EAC1B,gBAAkC,EAClC,QAAgB;QAHhB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,aAAQ,GAAR,QAAQ,CAAQ;IACvB,CAAC;IAEJ;;OAEG;IACI,KAAK,CAAC,OAAO,CAClB,KAA4B,EAC5B,GAAgB,EAChB,QAAkC;QAElC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,iCAAiC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAE5D,KAAK,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,eAAe,EAAE,CAAC;YACxD,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAExE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAC9B,GAAG,EACH,2CAA2C,QAAQ,EAAE,CACtD,CAAC;gBACF,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,kCAAkC;YAClC,MAAM,eAAe,GAAG,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE5F,oDAAoD;YACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhE,iCAAiC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAClD,iBAAiB,EACjB;gBACE,UAAU;gBACV,SAAS;gBACT,kBAAkB,EAAE,KAAK,CAAC,WAAW;gBACrC,gBAAgB,EAAE,eAAe,EAAE,SAAS,IAAI,EAAE;gBAClD,iBAAiB,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC;gBACnD,QAAQ;aACT,EACD;gBACE,cAAc,EAAE,MAAM;aACvB,CACF,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,EAAE,8BAA8B,QAAQ,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBACtG,SAAS;YACX,CAAC;YAED,eAAe,IAAI,MAAM,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAEzE,8BAA8B;YAC9B,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAChC,2BAA2B;gBAC3B,IAAI,CAAC,YAAY,CAAC,sBAAsB,CACtC,KAAK,EACL,MAAM,CAAC,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAC3D,MAAM,CAAC,MAAM,CAAC,SAAS,EACvB,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,GAAG,CAAC,SAAS,EACb,iBAAiB,CAClB,CAAC;gBAEF,aAAa,EAAE,CAAC;gBAEhB,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE;oBACrC,KAAK,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC;oBACjC,MAAM,EAAE,UAAU;oBAClB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,eAAe;oBACvB,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,mDAAmD;oBAC5D,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE;oBACrC,KAAK,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC;oBACjC,MAAM,EAAE,UAAU;oBAClB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,eAAe;oBACvB,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,oBAAoB;oBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,oBAAoB,CACzB,KAAsB,EACtB,cAAmB,EACnB,MAAe,EACf,SAAkB;QAElB,MAAM,QAAQ,GAA6B,EAAE,CAAC;QAE9C,qCAAqC;QACrC,MAAM,WAAW,GAAG,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/E,uEAAuE;QACvE,MAAM,cAAc,GAAG,cAAc,CAAC,mBAAmB,IAAI,EAAE,CAAC;QAEhE,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC;gBACZ,WAAW;gBACX,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,QAAkC;QAElC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoC,CAAC;QAE5D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA/JD,sDA+JC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Determines when analysis has converged
3
+ */
4
+ import { DatabaseDocumentation, AnalysisRun } from '../types/state.js';
5
+ import { ConvergenceConfig } from '../types/config.js';
6
+ import { ConvergenceResult } from '../types/analysis.js';
7
+ import { IterationTracker } from '../state/IterationTracker.js';
8
+ import { StateManager } from '../state/StateManager.js';
9
+ export declare class ConvergenceDetector {
10
+ private config;
11
+ private stateManager;
12
+ private iterationTracker;
13
+ constructor(config: ConvergenceConfig, stateManager: StateManager, iterationTracker: IterationTracker);
14
+ /**
15
+ * Check if analysis has converged
16
+ */
17
+ hasConverged(state: DatabaseDocumentation, run: AnalysisRun): ConvergenceResult;
18
+ /**
19
+ * Check if there were changes in recent iterations
20
+ */
21
+ private hasRecentChanges;
22
+ /**
23
+ * Calculate average confidence across all tables
24
+ */
25
+ calculateAverageConfidence(state: DatabaseDocumentation): number;
26
+ }
27
+ //# sourceMappingURL=ConvergenceDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConvergenceDetector.d.ts","sourceRoot":"","sources":["../../src/core/ConvergenceDetector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,gBAAgB;gBAFhB,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB;IAG5C;;OAEG;IACI,YAAY,CACjB,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,WAAW,GACf,iBAAiB;IAiEpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACI,0BAA0B,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM;CAkBxE"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * Determines when analysis has converged
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConvergenceDetector = void 0;
7
+ class ConvergenceDetector {
8
+ constructor(config, stateManager, iterationTracker) {
9
+ this.config = config;
10
+ this.stateManager = stateManager;
11
+ this.iterationTracker = iterationTracker;
12
+ }
13
+ /**
14
+ * Check if analysis has converged
15
+ */
16
+ hasConverged(state, run) {
17
+ const reasons = [];
18
+ // 1. Check max iterations
19
+ if (run.iterationsPerformed >= this.config.maxIterations) {
20
+ return {
21
+ converged: true,
22
+ reason: `Reached maximum iteration limit (${this.config.maxIterations})`,
23
+ iterationsPerformed: run.iterationsPerformed,
24
+ suggestions: ['Consider increasing maxIterations if results are unsatisfactory']
25
+ };
26
+ }
27
+ // 2. Check stability window (no changes in last N iterations)
28
+ if (run.iterationsPerformed >= 2) {
29
+ const hasChanges = this.hasRecentChanges(run, this.config.stabilityWindow);
30
+ if (!hasChanges) {
31
+ reasons.push(`No changes in last ${this.config.stabilityWindow} iterations (stability achieved)`);
32
+ }
33
+ }
34
+ // 3. Check confidence threshold
35
+ const lowConfidenceTables = this.stateManager.getLowConfidenceTables(state, this.config.confidenceThreshold);
36
+ if (lowConfidenceTables.length === 0 && run.iterationsPerformed >= 1) {
37
+ reasons.push(`All tables meet confidence threshold (${this.config.confidenceThreshold})`);
38
+ }
39
+ // Converged if we have at least 2 reasons and minimum iterations
40
+ if (reasons.length >= 2 && run.iterationsPerformed >= 2) {
41
+ return {
42
+ converged: true,
43
+ reason: reasons.join('; '),
44
+ iterationsPerformed: run.iterationsPerformed
45
+ };
46
+ }
47
+ // Not yet converged
48
+ const suggestions = [];
49
+ if (lowConfidenceTables.length > 0) {
50
+ suggestions.push(`${lowConfidenceTables.length} tables below confidence threshold - needs more iteration`);
51
+ }
52
+ if (run.iterationsPerformed < 2) {
53
+ suggestions.push('Minimum 2 iterations required before convergence check');
54
+ }
55
+ return {
56
+ converged: false,
57
+ reason: 'Analysis still evolving',
58
+ iterationsPerformed: run.iterationsPerformed,
59
+ suggestions
60
+ };
61
+ }
62
+ /**
63
+ * Check if there were changes in recent iterations
64
+ */
65
+ hasRecentChanges(run, windowSize) {
66
+ // Get log entries from last window
67
+ const logsPerIteration = Math.ceil(run.processingLog.length / run.iterationsPerformed);
68
+ const windowLogs = run.processingLog.slice(-(windowSize * logsPerIteration));
69
+ return windowLogs.some(entry => entry.result === 'changed');
70
+ }
71
+ /**
72
+ * Calculate average confidence across all tables
73
+ */
74
+ calculateAverageConfidence(state) {
75
+ let totalConfidence = 0;
76
+ let count = 0;
77
+ for (const schema of state.schemas) {
78
+ for (const table of schema.tables) {
79
+ if (table.descriptionIterations.length > 0) {
80
+ const latest = table.descriptionIterations[table.descriptionIterations.length - 1];
81
+ if (latest.confidence !== undefined) {
82
+ totalConfidence += latest.confidence;
83
+ count++;
84
+ }
85
+ }
86
+ }
87
+ }
88
+ return count > 0 ? totalConfidence / count : 0;
89
+ }
90
+ }
91
+ exports.ConvergenceDetector = ConvergenceDetector;
92
+ //# sourceMappingURL=ConvergenceDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConvergenceDetector.js","sourceRoot":"","sources":["../../src/core/ConvergenceDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Manages granular guardrails enforcement for DBAutoDoc analysis
3
+ *
4
+ * Supports:
5
+ * - Per-phase token limits (discovery, analysis, sanity checks)
6
+ * - Per-iteration token and duration limits
7
+ * - Cost-based limits with configurable thresholds
8
+ * - Configurable warning thresholds at percentages of limits
9
+ * - Detailed tracking of exceedances and warnings
10
+ */
11
+ import { GuardrailsConfig } from '../types/config.js';
12
+ import { AnalysisRun, GuardrailExceeded, GuardrailWarning } from '../types/state.js';
13
+ export type PhaseType = 'discovery' | 'analysis' | 'sanityChecks';
14
+ export interface GuardrailCheckResult {
15
+ canContinue: boolean;
16
+ warning?: string;
17
+ reason?: string;
18
+ warnings?: GuardrailWarning[];
19
+ exceedances?: GuardrailExceeded[];
20
+ }
21
+ export declare class GuardrailsManager {
22
+ private config;
23
+ private startTime;
24
+ private phaseStartTimes;
25
+ private currentPhase?;
26
+ private currentIteration;
27
+ private iterationStartTime?;
28
+ constructor(config?: GuardrailsConfig);
29
+ /**
30
+ * Begin tracking a new phase
31
+ */
32
+ startPhase(phase: PhaseType): void;
33
+ /**
34
+ * End tracking current phase and record metrics
35
+ */
36
+ endPhase(run: AnalysisRun, phase: PhaseType): void;
37
+ /**
38
+ * Start tracking a new iteration
39
+ */
40
+ startIteration(iteration: number): void;
41
+ /**
42
+ * End tracking current iteration and record metrics
43
+ */
44
+ endIteration(run: AnalysisRun, iteration: number): void;
45
+ /**
46
+ * Check all guardrails and return enforcement status
47
+ */
48
+ checkGuardrails(run: AnalysisRun): GuardrailCheckResult;
49
+ /**
50
+ * Record guardrail enforcement in the run
51
+ */
52
+ recordEnforcement(run: AnalysisRun, result: GuardrailCheckResult): void;
53
+ /**
54
+ * Get tokens used in a specific phase
55
+ */
56
+ private getPhaseTokens;
57
+ /**
58
+ * Get estimated cost for a specific phase
59
+ */
60
+ private getPhaseCost;
61
+ /**
62
+ * Get tokens used in current iteration
63
+ */
64
+ private getCurrentIterationTokens;
65
+ /**
66
+ * Create a stop result with warnings and exceedances
67
+ */
68
+ private createStopResult;
69
+ /**
70
+ * Get current elapsed time in seconds
71
+ */
72
+ getElapsedSeconds(): number;
73
+ /**
74
+ * Get current phase token budget (remaining tokens)
75
+ */
76
+ getPhaseTokenBudgetRemaining(phase: PhaseType): number | undefined;
77
+ }
78
+ //# sourceMappingURL=GuardrailsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GuardrailsManager.d.ts","sourceRoot":"","sources":["../../src/core/GuardrailsManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAqE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExJ,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,YAAY,CAAC,CAAY;IACjC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,kBAAkB,CAAC,CAAS;gBAExB,MAAM,CAAC,EAAE,gBAAgB;IAKrC;;OAEG;IACI,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKzC;;OAEG;IACI,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IA0BzD;;OAEG;IACI,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK9C;;OAEG;IACI,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAqB9D;;OAEG;IACI,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,oBAAoB;IA+N9D;;OAEG;IACI,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAuB9E;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAUjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACI,iBAAiB,IAAI,MAAM;IAIlC;;OAEG;IACI,4BAA4B,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS;CAU1E"}