@memberjunction/db-auto-doc 6.2.0-edge.5 → 6.2.0-edge.6
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.
- package/README.md +10 -0
- package/dist/api/DBAutoDocAPI.d.ts +2 -0
- package/dist/api/DBAutoDocAPI.d.ts.map +1 -1
- package/dist/api/DBAutoDocAPI.js +2 -1
- package/dist/api/DBAutoDocAPI.js.map +1 -1
- package/dist/core/AnalysisEngine.d.ts +24 -0
- package/dist/core/AnalysisEngine.d.ts.map +1 -1
- package/dist/core/AnalysisEngine.js +104 -11
- package/dist/core/AnalysisEngine.js.map +1 -1
- package/dist/core/AnalysisOrchestrator.d.ts.map +1 -1
- package/dist/core/AnalysisOrchestrator.js +17 -5
- package/dist/core/AnalysisOrchestrator.js.map +1 -1
- package/dist/discovery/ColumnNormalizer.d.ts +31 -0
- package/dist/discovery/ColumnNormalizer.d.ts.map +1 -1
- package/dist/discovery/ColumnNormalizer.js +68 -2
- package/dist/discovery/ColumnNormalizer.js.map +1 -1
- package/dist/discovery/Composer.d.ts +33 -2
- package/dist/discovery/Composer.d.ts.map +1 -1
- package/dist/discovery/Composer.js +126 -5
- package/dist/discovery/Composer.js.map +1 -1
- package/dist/discovery/DiscoveryEngine.d.ts +3 -0
- package/dist/discovery/DiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/DiscoveryEngine.js +1 -1
- package/dist/discovery/DiscoveryEngine.js.map +1 -1
- package/dist/discovery/EmbeddingProvider.d.ts +6 -1
- package/dist/discovery/EmbeddingProvider.d.ts.map +1 -1
- package/dist/discovery/EmbeddingProvider.js +11 -1
- package/dist/discovery/EmbeddingProvider.js.map +1 -1
- package/dist/discovery/IndexKeyEvidence.d.ts +36 -0
- package/dist/discovery/IndexKeyEvidence.d.ts.map +1 -0
- package/dist/discovery/IndexKeyEvidence.js +42 -0
- package/dist/discovery/IndexKeyEvidence.js.map +1 -0
- package/dist/discovery/JoinProbe.d.ts +148 -0
- package/dist/discovery/JoinProbe.d.ts.map +1 -0
- package/dist/discovery/JoinProbe.js +233 -0
- package/dist/discovery/JoinProbe.js.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts +8 -1
- package/dist/discovery/LLMDiscoveryValidator.d.ts.map +1 -1
- package/dist/discovery/LLMDiscoveryValidator.js +24 -3
- package/dist/discovery/LLMDiscoveryValidator.js.map +1 -1
- package/dist/discovery/LLMSanityChecker.d.ts.map +1 -1
- package/dist/discovery/LLMSanityChecker.js +10 -1
- package/dist/discovery/LLMSanityChecker.js.map +1 -1
- package/dist/discovery/OrganicKeyDetector.d.ts +29 -1
- package/dist/discovery/OrganicKeyDetector.d.ts.map +1 -1
- package/dist/discovery/OrganicKeyDetector.js +26 -3
- package/dist/discovery/OrganicKeyDetector.js.map +1 -1
- package/dist/discovery/OrganicKeyTranslator.d.ts +24 -5
- package/dist/discovery/OrganicKeyTranslator.d.ts.map +1 -1
- package/dist/discovery/OrganicKeyTranslator.js +32 -14
- package/dist/discovery/OrganicKeyTranslator.js.map +1 -1
- package/dist/discovery/PKDetector.d.ts +9 -0
- package/dist/discovery/PKDetector.d.ts.map +1 -1
- package/dist/discovery/PKDetector.js +86 -8
- package/dist/discovery/PKDetector.js.map +1 -1
- package/dist/discovery/SemanticPhase.d.ts +25 -0
- package/dist/discovery/SemanticPhase.d.ts.map +1 -1
- package/dist/discovery/SemanticPhase.js +55 -11
- package/dist/discovery/SemanticPhase.js.map +1 -1
- package/dist/discovery/embedding-provider-default.d.ts +25 -0
- package/dist/discovery/embedding-provider-default.d.ts.map +1 -0
- package/dist/discovery/embedding-provider-default.js +47 -0
- package/dist/discovery/embedding-provider-default.js.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts +63 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts.map +1 -1
- package/dist/drivers/BaseAutoDocDriver.js.map +1 -1
- package/dist/drivers/MySQLDriver.d.ts +21 -1
- package/dist/drivers/MySQLDriver.d.ts.map +1 -1
- package/dist/drivers/MySQLDriver.js +64 -0
- package/dist/drivers/MySQLDriver.js.map +1 -1
- package/dist/drivers/PostgreSQLDriver.d.ts +34 -1
- package/dist/drivers/PostgreSQLDriver.d.ts.map +1 -1
- package/dist/drivers/PostgreSQLDriver.js +91 -0
- package/dist/drivers/PostgreSQLDriver.js.map +1 -1
- package/dist/drivers/SQLServerDriver.d.ts +28 -1
- package/dist/drivers/SQLServerDriver.d.ts.map +1 -1
- package/dist/drivers/SQLServerDriver.js +106 -0
- package/dist/drivers/SQLServerDriver.js.map +1 -1
- package/dist/drivers/probeErrors.d.ts +30 -0
- package/dist/drivers/probeErrors.d.ts.map +1 -0
- package/dist/drivers/probeErrors.js +94 -0
- package/dist/drivers/probeErrors.js.map +1 -0
- package/dist/generators/AdditionalSchemaInfoGenerator.d.ts +0 -18
- package/dist/generators/AdditionalSchemaInfoGenerator.d.ts.map +1 -1
- package/dist/generators/AdditionalSchemaInfoGenerator.js +45 -4
- package/dist/generators/AdditionalSchemaInfoGenerator.js.map +1 -1
- package/dist/prompts/PromptEngine.d.ts.map +1 -1
- package/dist/prompts/PromptEngine.js +10 -1
- package/dist/prompts/PromptEngine.js.map +1 -1
- package/dist/types/config.d.ts +82 -4
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/discovery.d.ts +39 -0
- package/dist/types/discovery.d.ts.map +1 -1
- package/dist/types/state.d.ts +2 -0
- package/dist/types/state.d.ts.map +1 -1
- package/dist/utils/call-deadline.d.ts +43 -0
- package/dist/utils/call-deadline.d.ts.map +1 -0
- package/dist/utils/call-deadline.js +81 -0
- package/dist/utils/call-deadline.js.map +1 -0
- package/dist/utils/index-hints.d.ts +8 -1
- package/dist/utils/index-hints.d.ts.map +1 -1
- package/dist/utils/index-hints.js +15 -0
- package/dist/utils/index-hints.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/seed-context.d.ts +23 -0
- package/dist/utils/seed-context.d.ts.map +1 -0
- package/dist/utils/seed-context.js +38 -0
- package/dist/utils/seed-context.js.map +1 -0
- package/package.json +5 -5
- package/prompts/fk-pruning-holistic.md +7 -0
- package/prompts/fk-pruning-table.md +7 -0
- package/prompts/pk-pruning-holistic.md +7 -0
- package/prompts/pk-pruning-table.md +7 -0
package/README.md
CHANGED
|
@@ -196,6 +196,11 @@ Long-form context (a data dictionary, an engineering assessment) can live in fil
|
|
|
196
196
|
Paths are relative to `config.json`. The text is sent with every table prompt, so keep it to what the
|
|
197
197
|
model needs for descriptions rather than a full specification.
|
|
198
198
|
|
|
199
|
+
The primary- and foreign-key passes (discovery validation and PK/FK pruning) also get it, trimmed. A per-table
|
|
200
|
+
pass gets only the paragraphs that name its table, and the whole-schema passes get the full text. Both are capped at
|
|
201
|
+
`seedContext.keyPassMaxChars` characters (default 6000; `0` sends none). Name tables in your paragraphs so they
|
|
202
|
+
reach the right pass.
|
|
203
|
+
|
|
199
204
|
### 3. Generate Sample Queries (Optional)
|
|
200
205
|
|
|
201
206
|
Generate reference SQL queries for AI agent training:
|
|
@@ -523,6 +528,11 @@ Databases often have indexes where no key is declared: developers index the colu
|
|
|
523
528
|
|
|
524
529
|
They are hints, not proof, and are weighed with names, statistics and value overlap. Turn this off with `"analysis": { "useExistingIndexes": false }`. A resumed run reads indexes for any table whose state has none yet. If a schema's catalog can't be read, the run continues without its indexes.
|
|
525
530
|
|
|
531
|
+
Unique indexes also feed deterministic PK detection (`relationshipDiscovery.indexBackedCandidates`, default true). This matters for tables with no declared primary key; tables that have one skip PK discovery entirely.
|
|
532
|
+
- a unique index on NOT NULL columns becomes a candidate even when the statistics can't show uniqueness (an empty table, for example), scored with an index boost, so naming, type, the name blacklist and column position still decide between several unique columns;
|
|
533
|
+
- a unique index on a nullable column only boosts a column that already passes the statistical checks;
|
|
534
|
+
- multi-column unique indexes are considered as composite keys when no single column qualifies (junction tables, for example); next to a qualifying single-column key they are alternate keys and are not added.
|
|
535
|
+
|
|
526
536
|
### Organic Key Detection (Optional)
|
|
527
537
|
|
|
528
538
|
Foreign keys require **shared exact values**. Organic keys (MemberJunction [PR #2193](https://github.com/MemberJunction/MJ/pull/2193)) capture the weaker-but-broader condition of **shared identity**: two columns refer to the same real-world thing once each is canonicalized through its own transformation. That joins far more cross-system data than exact-match FKs -- e.g. the same phone number stored as `+1 (555) 123-4567`, `5551234567`, and `555.123.4567` across HubSpot, Zendesk, and QuickBooks.
|
|
@@ -57,6 +57,8 @@ export interface DBAutoDocAPIConfig {
|
|
|
57
57
|
businessDomains?: string[];
|
|
58
58
|
industryContext?: string;
|
|
59
59
|
customInstructions?: string;
|
|
60
|
+
/** Cap on the customInstructions text sent to each PK/FK inference prompt. Default 6000; 0 sends none. */
|
|
61
|
+
keyPassMaxChars?: number;
|
|
60
62
|
};
|
|
61
63
|
/** Optional output directory (default: ./output) */
|
|
62
64
|
outputDir?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DBAutoDocAPI.d.ts","sourceRoot":"","sources":["../../src/api/DBAutoDocAPI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AASH,OAAO,EAAmB,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAyB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAErF;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,QAAQ,EAAE,cAAc,CAAC;IAEzB,gCAAgC;IAChC,EAAE,EAAE,QAAQ,CAAC;IAEb,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnC,wDAAwD;IACxD,WAAW,CAAC,EAAE;QACZ,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"DBAutoDocAPI.d.ts","sourceRoot":"","sources":["../../src/api/DBAutoDocAPI.ts"],"names":[],"mappings":"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"}
|
package/dist/api/DBAutoDocAPI.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DBAutoDocAPI.js","sourceRoot":"","sources":["../../src/api/DBAutoDocAPI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"DBAutoDocAPI.js","sourceRoot":"","sources":["../../src/api/DBAutoDocAPI.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AA2HvE;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACvB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,KAAK,CAAC,OAAO,CAClB,MAA8D;QAE9D,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEnD,oBAAoB;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAEhD,sBAAsB;YACtB,MAAM,YAAY,GAAG,IAAI,oBAAoB,CAAC;gBAC5C,MAAM,EAAE,UAAU;gBAClB,UAAU;aACX,CAAC,CAAC;YAEH,mBAAmB;YACnB,UAAU,CAAC,mBAAmB,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;YAE5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC;oBACvD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;iBACH,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC;oBACvD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;iBACG,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,EAAE;gBAChB,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE;oBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACtC,eAAe,EAAE,CAAC;oBAClB,eAAe,EAAE,CAAC;oBAClB,gBAAgB,EAAE,CAAC;oBACnB,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;oBAChB,YAAY,EAAE,CAAC;oBACf,WAAW,EAAE,CAAC;oBACd,YAAY,EAAE,CAAC;iBAChB;gBACD,OAAO,EAAG,KAAe,CAAC,OAAO;aACP,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,uCAAuC;IAChC,KAAK,CAAC,OAAO,CAClB,MAA8D;QAE9D,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACI,KAAK,CAAC,MAAM,CACjB,SAAiB,EACjB,MAA+D;QAE/D,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEpD,gCAAgC;YAChC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAExC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;oBACrC,SAAS;oBACT,OAAO,EAAE;wBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACnC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACtC,eAAe,EAAE,CAAC;wBAClB,eAAe,EAAE,CAAC;wBAClB,gBAAgB,EAAE,CAAC;wBACnB,iBAAiB,EAAE,CAAC;wBACpB,WAAW,EAAE,CAAC;wBACd,aAAa,EAAE,CAAC;wBAChB,YAAY,EAAE,CAAC;wBACf,WAAW,EAAE,CAAC;wBACd,YAAY,EAAE,CAAC;qBAChB;oBACD,OAAO,EAAE,yBAAyB,SAAS,EAAE;iBACnB,CAAC;YAC/B,CAAC;YAED,0EAA0E;YAC1E,MAAM,UAAU,GAAG,MAAM;gBACvB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAExE,uCAAuC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,UAAU,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YAExC,MAAM,YAAY,GAAG,IAAI,oBAAoB,CAAC;gBAC5C,MAAM,EAAE,UAAU;gBAClB,eAAe,EAAE,SAAS;gBAC1B,UAAU;aACX,CAAC,CAAC;YAEH,mBAAmB;YACnB,UAAU,CAAC,mCAAmC,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;YAE5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC;oBACvD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;iBACH,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC;oBACvD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;iBACG,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;gBACrC,SAAS;gBACT,OAAO,EAAE;oBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACtC,eAAe,EAAE,CAAC;oBAClB,eAAe,EAAE,CAAC;oBAClB,gBAAgB,EAAE,CAAC;oBACnB,iBAAiB,EAAE,CAAC;oBACpB,WAAW,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;oBAChB,YAAY,EAAE,CAAC;oBACf,WAAW,EAAE,CAAC;oBACd,YAAY,EAAE,CAAC;iBAChB;gBACD,OAAO,EAAG,KAAe,CAAC,OAAO;aACP,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,sCAAsC;IAC/B,KAAK,CAAC,MAAM,CACjB,SAAiB,EACjB,MAA+D;QAE/D,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACI,KAAK,CAAC,MAAM,CACjB,SAAiB,EACjB,OAeC;QAED,IAAI,CAAC;YACH,aAAa;YACb,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAExC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,yBAAyB,SAAS,EAAE;iBAC9C,CAAC;YACJ,CAAC;YAED,6BAA6B;YAC7B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChE,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/C,2DAA2D;YAC3D,MAAM,WAAW,GAAG,OAAO,EAAE,GAAG,KAAK,KAAK,CAAC;YAC3C,MAAM,gBAAgB,GAAG,OAAO,EAAE,QAAQ,KAAK,KAAK,CAAC;YAErD,MAAM,MAAM,GAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAE/C,eAAe;YACf,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;oBACjC,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,KAAK;oBAC5C,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,IAAI,CAAC;iBACvD,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;gBAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC1C,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAC3B,CAAC;YAED,oBAAoB;YACpB,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAEvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBAClD,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC9C,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;YAC/B,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAG,KAAe,CAAC,OAAO;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sCAAsC;IAC/B,KAAK,CAAC,MAAM,CACjB,SAAiB,EACjB,OAeC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,KAAK,CAAC,SAAS,CAAC,SAAiB;QACtC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAExC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;gBAClC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY;gBACxC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,eAAe;gBAC9C,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;gBACtC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;gBAC1C,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY;gBACxC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;gBACtC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY;aACzC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,yCAAyC;IAClC,KAAK,CAAC,SAAS,CAAC,SAAiB;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,MAA0B;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,UAAU,CAAC;QAEjD,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,QAAQ,EAAE;gBACR,oBAAoB,EAAE,GAAG;gBACzB,UAAU,EAAE,IAAI;gBAChB,iBAAiB,EAAE,IAAI;gBACvB,sBAAsB,EAAE,IAAI;gBAC5B,WAAW,EAAE;oBACX,aAAa,EAAE,CAAC;oBAChB,eAAe,EAAE,CAAC;oBAClB,mBAAmB,EAAE,IAAI;iBAC1B;gBACD,eAAe,EAAE;oBACf,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,CAAC;iBACZ;gBACD,YAAY,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,WAAW,EAAE,IAAI;oBACjB,WAAW,EAAE,IAAI;iBAClB;gBACD,qBAAqB,EAAE;oBACrB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE;wBACR,eAAe,EAAE,IAAI;wBACrB,oBAAoB,EAAE,IAAI;wBAC1B,kBAAkB,EAAE,GAAG;qBACxB;oBACD,WAAW,EAAE;wBACX,YAAY,EAAE,IAAI;qBACnB;oBACD,UAAU,EAAE;wBACV,iBAAiB,EAAE,GAAG;wBACtB,iBAAiB,EAAE,GAAG;wBACtB,sBAAsB,EAAE,GAAG;qBAC5B;oBACD,QAAQ,EAAE;wBACR,eAAe,EAAE,IAAI;wBACrB,uBAAuB,EAAE,GAAG;wBAC5B,sBAAsB,EAAE,GAAG;qBAC5B;oBACD,QAAQ,EAAE;wBACR,eAAe,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM,CAAC;wBACxD,eAAe,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;wBAChD,sBAAsB,EAAE,EAAE;qBAC3B;oBACD,aAAa,EAAE;wBACb,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,CAAC;qBACb;oBACD,eAAe,EAAE;wBACf,OAAO,EAAE,IAAI;wBACb,aAAa,EAAE,EAAE;qBAClB;iBACF;gBACD,GAAG,MAAM,CAAC,QAAQ;aACnB;YACD,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;gBAC7C,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC;gBACnD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;aACjD;YACD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAc,EAAE,MAAc;QACvD,MAAM,SAAS,GAAG,UAAU,CAAC;QAE7B,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE;gBACR,QAAQ,EAAE,WAAW;gBACrB,MAAM;gBACN,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,EAAE;gBACZ,iBAAiB,EAAE,KAAK;aACzB;YACD,EAAE,EAAE;gBACF,QAAQ,EAAE,WAAW;gBACrB,KAAK,EAAE,wBAAwB;gBAC/B,MAAM,EAAE,EAAE;gBACV,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,IAAI;aAChB;YACD,QAAQ,EAAE;gBACR,oBAAoB,EAAE,GAAG;gBACzB,UAAU,EAAE,IAAI;gBAChB,iBAAiB,EAAE,IAAI;gBACvB,sBAAsB,EAAE,IAAI;gBAC5B,WAAW,EAAE;oBACX,aAAa,EAAE,CAAC;oBAChB,eAAe,EAAE,CAAC;oBAClB,mBAAmB,EAAE,IAAI;iBAC1B;gBACD,eAAe,EAAE;oBACf,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,CAAC;iBACZ;gBACD,YAAY,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,WAAW,EAAE,IAAI;oBACjB,WAAW,EAAE,IAAI;iBAClB;gBACD,qBAAqB,EAAE;oBACrB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE;wBACR,eAAe,EAAE,IAAI;wBACrB,oBAAoB,EAAE,IAAI;wBAC1B,kBAAkB,EAAE,GAAG;qBACxB;oBACD,WAAW,EAAE;wBACX,YAAY,EAAE,IAAI;qBACnB;oBACD,UAAU,EAAE;wBACV,iBAAiB,EAAE,GAAG;wBACtB,iBAAiB,EAAE,GAAG;wBACtB,sBAAsB,EAAE,GAAG;qBAC5B;oBACD,QAAQ,EAAE;wBACR,eAAe,EAAE,IAAI;wBACrB,uBAAuB,EAAE,GAAG;wBAC5B,sBAAsB,EAAE,GAAG;qBAC5B;oBACD,QAAQ,EAAE;wBACR,eAAe,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM,CAAC;wBACxD,eAAe,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;wBAChD,sBAAsB,EAAE,EAAE;qBAC3B;oBACD,aAAa,EAAE;wBACb,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,CAAC;qBACb;oBACD,eAAe,EAAE;wBACf,OAAO,EAAE,IAAI;wBACb,aAAa,EAAE,EAAE;qBAClB;iBACF;aACF;YACD,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;gBAC7C,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC;gBACnD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;aACjD;YACD,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { DatabaseDocumentation, AnalysisRun, SchemaDefinition, TableDefinition } from '../types/state.js';
|
|
6
6
|
import type { BaseAutoDocDriver } from "../drivers/BaseAutoDocDriver.js";
|
|
7
7
|
import { TableNode, BackpropagationTrigger } from '../types/analysis.js';
|
|
8
|
+
import { KeyVerifier } from '../discovery/JoinProbe.js';
|
|
8
9
|
import { ColumnDescriptionPromptResult } from '../types/prompts.js';
|
|
9
10
|
import { DBAutoDocConfig } from '../types/config.js';
|
|
10
11
|
import { PromptEngine } from '../prompts/PromptEngine.js';
|
|
@@ -24,6 +25,19 @@ export declare class AnalysisEngine {
|
|
|
24
25
|
private startTime;
|
|
25
26
|
private currentRun?;
|
|
26
27
|
private onProgress;
|
|
28
|
+
/**
|
|
29
|
+
* Verifies a proposed key against the data before it is confirmed. Optional: when
|
|
30
|
+
* absent, LLM-proposed FKs are still emitted but stamped `Unprobed` rather than
|
|
31
|
+
* silently presented as though someone had checked them.
|
|
32
|
+
*/
|
|
33
|
+
private keyVerifier;
|
|
34
|
+
/**
|
|
35
|
+
* Supply the probe used to verify LLM-proposed foreign keys. Injected rather than
|
|
36
|
+
* constructed here because the engine has no driver of its own; the orchestrator owns
|
|
37
|
+
* the connection and passes ONE verifier so the per-run probe budget is shared with
|
|
38
|
+
* the organic-key path instead of each path getting its own allowance.
|
|
39
|
+
*/
|
|
40
|
+
SetKeyVerifier(verifier: KeyVerifier | null): void;
|
|
27
41
|
constructor(config: DBAutoDocConfig, promptEngine: PromptEngine, stateManager: StateManager, iterationTracker: IterationTracker, onProgress?: (message: string, data?: Record<string, unknown>) => void,
|
|
28
42
|
/** Database access for checks the LLM's proposals must pass (composite PK uniqueness). Optional: without it, composite PK proposals are rejected. */
|
|
29
43
|
driver?: BaseAutoDocDriver);
|
|
@@ -197,6 +211,16 @@ export declare class AnalysisEngine {
|
|
|
197
211
|
* Uses the foreignKeys array from table-analysis prompt response instead of brittle regex parsing.
|
|
198
212
|
* Per architectural decision: use LLM for language understanding, deterministic code for processing.
|
|
199
213
|
*/
|
|
214
|
+
/**
|
|
215
|
+
* Probe an LLM-proposed foreign key.
|
|
216
|
+
*
|
|
217
|
+
* Returns `Unprobed` rather than throwing for every reason a probe can fail to run —
|
|
218
|
+
* no verifier injected, no such table or column in the analysed state, or the driver
|
|
219
|
+
* reporting that it could not evaluate the join. `Refuted` is reserved for a probe
|
|
220
|
+
* that RAN and measured containment below the floor, because only that is evidence
|
|
221
|
+
* the key is wrong.
|
|
222
|
+
*/
|
|
223
|
+
private verifyProposedFK;
|
|
200
224
|
private processFKInsightsFromLLM;
|
|
201
225
|
/**
|
|
202
226
|
* Find a column in the state schemas
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalysisEngine.d.ts","sourceRoot":"","sources":["../../src/core/AnalysisEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAsC,MAAM,mBAAmB,CAAC;AAE9I,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"AnalysisEngine.d.ts","sourceRoot":"","sources":["../../src/core/AnalysisEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,22 @@
|
|
|
5
5
|
import { EnsureArray } from "../utils/ensureArray.js";
|
|
6
6
|
import { CheckPKProposal } from "./PKProposalGate.js";
|
|
7
7
|
import { BuildIndexHints, FormatIndexHint, IsUniquelyIndexed } from "../utils/index-hints.js";
|
|
8
|
+
import { SeedContextExcerpt } from "../utils/seed-context.js";
|
|
8
9
|
import { EnumCandidateGate } from '../discovery/EnumCandidateGate.js';
|
|
10
|
+
import { StampFor } from '../discovery/JoinProbe.js';
|
|
9
11
|
import { BackpropagationEngine } from './BackpropagationEngine.js';
|
|
10
12
|
import { ConvergenceDetector } from './ConvergenceDetector.js';
|
|
11
13
|
import { GuardrailsManager } from './GuardrailsManager.js';
|
|
12
14
|
export class AnalysisEngine {
|
|
15
|
+
/**
|
|
16
|
+
* Supply the probe used to verify LLM-proposed foreign keys. Injected rather than
|
|
17
|
+
* constructed here because the engine has no driver of its own; the orchestrator owns
|
|
18
|
+
* the connection and passes ONE verifier so the per-run probe budget is shared with
|
|
19
|
+
* the organic-key path instead of each path getting its own allowance.
|
|
20
|
+
*/
|
|
21
|
+
SetKeyVerifier(verifier) {
|
|
22
|
+
this.keyVerifier = verifier;
|
|
23
|
+
}
|
|
13
24
|
constructor(config, promptEngine, stateManager, iterationTracker, onProgress,
|
|
14
25
|
/** Database access for checks the LLM's proposals must pass (composite PK uniqueness). Optional: without it, composite PK proposals are rejected. */
|
|
15
26
|
driver) {
|
|
@@ -19,6 +30,12 @@ export class AnalysisEngine {
|
|
|
19
30
|
this.iterationTracker = iterationTracker;
|
|
20
31
|
this.driver = driver;
|
|
21
32
|
this.startTime = 0;
|
|
33
|
+
/**
|
|
34
|
+
* Verifies a proposed key against the data before it is confirmed. Optional: when
|
|
35
|
+
* absent, LLM-proposed FKs are still emitted but stamped `Unprobed` rather than
|
|
36
|
+
* silently presented as though someone had checked them.
|
|
37
|
+
*/
|
|
38
|
+
this.keyVerifier = null;
|
|
22
39
|
this.onProgress = onProgress || (() => { });
|
|
23
40
|
this.backpropagationEngine = new BackpropagationEngine(promptEngine, stateManager, iterationTracker, config.analysis.backpropagation.maxDepth, config);
|
|
24
41
|
this.convergenceDetector = new ConvergenceDetector(config.analysis.convergence, stateManager, iterationTracker);
|
|
@@ -133,7 +150,7 @@ export class AnalysisEngine {
|
|
|
133
150
|
const [schemaName, tableName] = tableKey.split('.');
|
|
134
151
|
const table = this.stateManager.findTable(state, schemaName, tableName);
|
|
135
152
|
const candidates = tablePKs.map(pk => ({ columns: pk.columnNames, confidence: pk.confidence, locked: pk.status === 'confirmed' }));
|
|
136
|
-
const context = { sourceSchema: schemaName, sourceTable: tableName, tableDescription: table?.description || '', allTables, candidates, existingIndexes: this.indexHintLines(table), seedContext: state.seedContext ?? this.config.seedContext };
|
|
153
|
+
const context = { sourceSchema: schemaName, sourceTable: tableName, tableDescription: table?.description || '', allTables, candidates, existingIndexes: this.indexHintLines(table), seedContext: state.seedContext ?? this.config.seedContext, seedExcerpt: SeedContextExcerpt(state.seedContext ?? this.config.seedContext, [tableName]) };
|
|
137
154
|
const result = await this.promptEngine.executePrompt('pk-pruning-table', context, { responseFormat: 'JSON', temperature: override?.temperature ?? 0.05, maxTokens: override?.maxTokens ?? this.config.ai.maxTokens, modelOverride: override?.model, effortLevelOverride: override?.effortLevel });
|
|
138
155
|
if (!result.success || !result.result) {
|
|
139
156
|
console.log(`[AnalysisEngine] PK pruning failed for ${tableKey}: ${result.errorMessage}`);
|
|
@@ -159,7 +176,7 @@ export class AnalysisEngine {
|
|
|
159
176
|
if (allProposals.length === 0)
|
|
160
177
|
return { removed: 0, kept: allPKs.length };
|
|
161
178
|
this.onProgress('PK pruning pass 2: holistic review', { proposals: allProposals.length, model: effectiveModel });
|
|
162
|
-
const holisticContext = { allTables, proposals: allProposals.map(p => ({ sourceSchema: p.sourceSchema, sourceTable: p.sourceTable, columns: p.columns, confidence: p.confidence, reasoning: p.reasoning })), seedContext: state.seedContext ?? this.config.seedContext };
|
|
179
|
+
const holisticContext = { allTables, proposals: allProposals.map(p => ({ sourceSchema: p.sourceSchema, sourceTable: p.sourceTable, columns: p.columns, confidence: p.confidence, reasoning: p.reasoning })), seedContext: state.seedContext ?? this.config.seedContext, seedExcerpt: SeedContextExcerpt(state.seedContext ?? this.config.seedContext, []) };
|
|
163
180
|
const holisticResult = await this.promptEngine.executePrompt('pk-pruning-holistic', holisticContext, { responseFormat: 'JSON', temperature: override?.temperature ?? 0.05, maxTokens: override?.maxTokens ?? this.config.ai.maxTokens, modelOverride: override?.model, effortLevelOverride: override?.effortLevel });
|
|
164
181
|
let removed = 0;
|
|
165
182
|
if (holisticResult.success && holisticResult.result) {
|
|
@@ -252,7 +269,8 @@ export class AnalysisEngine {
|
|
|
252
269
|
allTables,
|
|
253
270
|
candidates,
|
|
254
271
|
existingIndexes: this.indexHintLines(table),
|
|
255
|
-
seedContext: state.seedContext ?? this.config.seedContext
|
|
272
|
+
seedContext: state.seedContext ?? this.config.seedContext,
|
|
273
|
+
seedExcerpt: SeedContextExcerpt(state.seedContext ?? this.config.seedContext, [tableName])
|
|
256
274
|
};
|
|
257
275
|
const result = await this.promptEngine.executePrompt('fk-pruning-table', context, {
|
|
258
276
|
responseFormat: 'JSON',
|
|
@@ -311,7 +329,8 @@ export class AnalysisEngine {
|
|
|
311
329
|
confidence: p.confidence,
|
|
312
330
|
reasoning: p.reasoning
|
|
313
331
|
})),
|
|
314
|
-
seedContext: state.seedContext ?? this.config.seedContext
|
|
332
|
+
seedContext: state.seedContext ?? this.config.seedContext,
|
|
333
|
+
seedExcerpt: SeedContextExcerpt(state.seedContext ?? this.config.seedContext, [])
|
|
315
334
|
};
|
|
316
335
|
const holisticResult = await this.promptEngine.executePrompt('fk-pruning-holistic', holisticContext, {
|
|
317
336
|
responseFormat: 'JSON',
|
|
@@ -445,7 +464,7 @@ export class AnalysisEngine {
|
|
|
445
464
|
this.persistEnumVerdicts(table, result.result.columnDescriptions, run.modelUsed);
|
|
446
465
|
// Process structured FK insights from LLM and feed back to discovery phase
|
|
447
466
|
if (state.phases.keyDetection && result.result.foreignKeys) {
|
|
448
|
-
this.processFKInsightsFromLLM(state, tableNode.schema, tableNode.table, result.result.foreignKeys);
|
|
467
|
+
await this.processFKInsightsFromLLM(state, tableNode.schema, tableNode.table, result.result.foreignKeys);
|
|
449
468
|
}
|
|
450
469
|
// Process PK proposal from LLM — verify eligibility deterministically
|
|
451
470
|
if (state.phases.keyDetection && result.result.primaryKey) {
|
|
@@ -1081,7 +1100,39 @@ export class AnalysisEngine {
|
|
|
1081
1100
|
* Uses the foreignKeys array from table-analysis prompt response instead of brittle regex parsing.
|
|
1082
1101
|
* Per architectural decision: use LLM for language understanding, deterministic code for processing.
|
|
1083
1102
|
*/
|
|
1084
|
-
|
|
1103
|
+
/**
|
|
1104
|
+
* Probe an LLM-proposed foreign key.
|
|
1105
|
+
*
|
|
1106
|
+
* Returns `Unprobed` rather than throwing for every reason a probe can fail to run —
|
|
1107
|
+
* no verifier injected, no such table or column in the analysed state, or the driver
|
|
1108
|
+
* reporting that it could not evaluate the join. `Refuted` is reserved for a probe
|
|
1109
|
+
* that RAN and measured containment below the floor, because only that is evidence
|
|
1110
|
+
* the key is wrong.
|
|
1111
|
+
*/
|
|
1112
|
+
async verifyProposedFK(childSchema, childTable, childColumn, parentSchema, parentTable, parentColumn) {
|
|
1113
|
+
const now = new Date().toISOString();
|
|
1114
|
+
if (!this.keyVerifier) {
|
|
1115
|
+
return {
|
|
1116
|
+
Status: 'Unprobed',
|
|
1117
|
+
Containment: null,
|
|
1118
|
+
Reason: 'no key verifier configured for this run',
|
|
1119
|
+
ProbedAt: now
|
|
1120
|
+
};
|
|
1121
|
+
}
|
|
1122
|
+
if (!parentColumn || !parentTable || !parentSchema) {
|
|
1123
|
+
return {
|
|
1124
|
+
Status: 'Unprobed',
|
|
1125
|
+
Containment: null,
|
|
1126
|
+
Reason: 'LLM did not name a complete target column',
|
|
1127
|
+
ProbedAt: now
|
|
1128
|
+
};
|
|
1129
|
+
}
|
|
1130
|
+
return this.keyVerifier.Verify({
|
|
1131
|
+
Child: { Schema: childSchema, Table: childTable, Column: childColumn },
|
|
1132
|
+
Parent: { Schema: parentSchema, Table: parentTable, Column: parentColumn }
|
|
1133
|
+
});
|
|
1134
|
+
}
|
|
1135
|
+
async processFKInsightsFromLLM(state, schemaName, tableName, foreignKeys) {
|
|
1085
1136
|
const discoveryPhase = state.phases.keyDetection;
|
|
1086
1137
|
if (!discoveryPhase || !foreignKeys || foreignKeys.length === 0)
|
|
1087
1138
|
return;
|
|
@@ -1123,6 +1174,38 @@ export class AnalysisEngine {
|
|
|
1123
1174
|
console.log(`[AnalysisEngine] Rejecting LLM FK suggestion for confirmed PK: ${schemaName}.${tableName}.${columnName} -> ${referencesSchema}.${referencesTable}.${referencesColumn}`);
|
|
1124
1175
|
continue;
|
|
1125
1176
|
}
|
|
1177
|
+
// ── Verify the proposed join before anything is confirmed ────────────────
|
|
1178
|
+
//
|
|
1179
|
+
// This is the gate that was missing. The statistical path (FKDetector) probes
|
|
1180
|
+
// and rejects below 75% containment at its GATE 6; this path never probed at
|
|
1181
|
+
// all — it wrote a literal `valueOverlap: 0` placeholder, set
|
|
1182
|
+
// `status: 'confirmed'`, and stamped `column.isForeignKey = true`. The
|
|
1183
|
+
// additionalSchemaInfo generator then emits from BOTH
|
|
1184
|
+
// `discovered.foreignKeys` (gated on confidence + status, never on overlap)
|
|
1185
|
+
// and `column.foreignKeyReferences` (gated on nothing at all), so an
|
|
1186
|
+
// LLM-proposed key reached the output through two independent unchecked doors.
|
|
1187
|
+
//
|
|
1188
|
+
// The shape this catches: a connector schema whose parent key is namespaced
|
|
1189
|
+
// `<product>:<id>` while children store the bare id. "A foreign key points at
|
|
1190
|
+
// the parent's primary key" is correct almost everywhere and unfalsifiable
|
|
1191
|
+
// from schema shape, so the LLM proposes it for every child table and every
|
|
1192
|
+
// one of them matches zero rows.
|
|
1193
|
+
const probe = await this.verifyProposedFK(schemaName, tableName, columnName, referencesSchema, referencesTable, referencesColumn);
|
|
1194
|
+
if (probe.Status === 'Refuted') {
|
|
1195
|
+
// Measured, not assumed: the probe ran and the join matches (near) nothing.
|
|
1196
|
+
// Dropping it here is the only place it can be dropped — once the column is
|
|
1197
|
+
// stamped, the introspected-FK path emits it with no gate to fail. It runs
|
|
1198
|
+
// before the PK block below, so a refuted proposal is not evidence against a
|
|
1199
|
+
// PK candidate either.
|
|
1200
|
+
console.log(`[AnalysisEngine] Rejecting LLM FK — probe refuted: ${schemaName}.${tableName}.${columnName} -> ${referencesSchema}.${referencesTable}.${referencesColumn} (${probe.Reason})`);
|
|
1201
|
+
this.onProgress(`Rejected LLM-proposed FK ${schemaName}.${tableName}.${columnName} → ${referencesTable}.${referencesColumn}: ${probe.Reason}`, { refutedKey: `${schemaName}.${tableName}.${columnName}` });
|
|
1202
|
+
continue;
|
|
1203
|
+
}
|
|
1204
|
+
// Verified or Unprobed both proceed. Unprobed proceeds deliberately: refusing
|
|
1205
|
+
// whenever the probe cannot run turns a permissions or timeout problem into
|
|
1206
|
+
// total key loss with no signal. It proceeds STAMPED, so a consumer can tell a
|
|
1207
|
+
// checked key from an unchecked one.
|
|
1208
|
+
const verificationStamp = StampFor('LLM', probe);
|
|
1126
1209
|
if (existingPK && existingPK.status !== 'confirmed') {
|
|
1127
1210
|
// PK exists but isn't confirmed — LLM suggesting it's an FK is evidence
|
|
1128
1211
|
// that the PK detection was wrong. Reject the PK.
|
|
@@ -1141,6 +1224,7 @@ export class AnalysisEngine {
|
|
|
1141
1224
|
existingFK.validatedByLLM = true;
|
|
1142
1225
|
existingFK.status = 'confirmed';
|
|
1143
1226
|
existingFK.confidence = Math.min(existingFK.confidence + 20, 100);
|
|
1227
|
+
existingFK.verification = verificationStamp;
|
|
1144
1228
|
feedback.type = 'confidence_change';
|
|
1145
1229
|
feedback.newConfidence = existingFK.confidence;
|
|
1146
1230
|
feedback.affectedCandidates.push(`FK:${schemaName}.${tableName}.${columnName}`);
|
|
@@ -1170,17 +1254,26 @@ export class AnalysisEngine {
|
|
|
1170
1254
|
confidence: Math.round(confidence * 100),
|
|
1171
1255
|
evidence: {
|
|
1172
1256
|
namingMatch: 0.9,
|
|
1173
|
-
|
|
1257
|
+
// Real measurements where the probe ran. These were hardcoded 0 / 0 / 0,
|
|
1258
|
+
// which is indistinguishable from a probe that ran and found nothing —
|
|
1259
|
+
// the exact conflation that let a schema of zero-match keys be emitted
|
|
1260
|
+
// with the same apparent confidence as a correct one.
|
|
1261
|
+
valueOverlap: probe.Containment ? probe.Containment.Containment : 0,
|
|
1174
1262
|
cardinalityRatio: 0,
|
|
1175
1263
|
dataTypeMatch: true,
|
|
1176
1264
|
nullPercentage: 0,
|
|
1177
|
-
sampleSize: 0,
|
|
1178
|
-
orphanCount:
|
|
1179
|
-
|
|
1265
|
+
sampleSize: probe.Containment ? probe.Containment.SampledValues : 0,
|
|
1266
|
+
orphanCount: probe.Containment
|
|
1267
|
+
? probe.Containment.SampledValues - probe.Containment.MatchedValues
|
|
1268
|
+
: 0,
|
|
1269
|
+
warnings: probe.Status === 'Unprobed'
|
|
1270
|
+
? ['Created from structured LLM output', `Join NOT verified: ${probe.Reason}`]
|
|
1271
|
+
: ['Created from structured LLM output', `Join verified: ${probe.Reason}`]
|
|
1180
1272
|
},
|
|
1181
1273
|
discoveredInIteration: 1,
|
|
1182
1274
|
validatedByLLM: true,
|
|
1183
|
-
status: 'confirmed'
|
|
1275
|
+
status: 'confirmed',
|
|
1276
|
+
verification: verificationStamp
|
|
1184
1277
|
};
|
|
1185
1278
|
discoveryPhase.discovered.foreignKeys.push(newFK);
|
|
1186
1279
|
feedback.newConfidence = newFK.confidence;
|