@adminiumjs/llm 0.1.0-rc.1
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/LICENSE +661 -0
- package/dist/apply/diff.d.ts +79 -0
- package/dist/apply/diff.d.ts.map +1 -0
- package/dist/apply/diff.js +459 -0
- package/dist/apply/diff.js.map +1 -0
- package/dist/apply/index.d.ts +6 -0
- package/dist/apply/index.d.ts.map +1 -0
- package/dist/apply/index.js +6 -0
- package/dist/apply/index.js.map +1 -0
- package/dist/apply/normalize.d.ts +55 -0
- package/dist/apply/normalize.d.ts.map +1 -0
- package/dist/apply/normalize.js +232 -0
- package/dist/apply/normalize.js.map +1 -0
- package/dist/apply/plan.d.ts +206 -0
- package/dist/apply/plan.d.ts.map +1 -0
- package/dist/apply/plan.js +422 -0
- package/dist/apply/plan.js.map +1 -0
- package/dist/apply/suggestion-id.d.ts +103 -0
- package/dist/apply/suggestion-id.d.ts.map +1 -0
- package/dist/apply/suggestion-id.js +121 -0
- package/dist/apply/suggestion-id.js.map +1 -0
- package/dist/crypto.d.ts +48 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +35 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt/builder.d.ts +27 -0
- package/dist/prompt/builder.d.ts.map +1 -0
- package/dist/prompt/builder.js +263 -0
- package/dist/prompt/builder.js.map +1 -0
- package/dist/prompt/chunker.d.ts +89 -0
- package/dist/prompt/chunker.d.ts.map +1 -0
- package/dist/prompt/chunker.js +383 -0
- package/dist/prompt/chunker.js.map +1 -0
- package/dist/prompt/index.d.ts +14 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +14 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/serializer.d.ts +138 -0
- package/dist/prompt/serializer.d.ts.map +1 -0
- package/dist/prompt/serializer.js +178 -0
- package/dist/prompt/serializer.js.map +1 -0
- package/dist/prompt/templates/v1.d.ts +41 -0
- package/dist/prompt/templates/v1.d.ts.map +1 -0
- package/dist/prompt/templates/v1.js +312 -0
- package/dist/prompt/templates/v1.js.map +1 -0
- package/dist/prompt/token-estimate.d.ts +16 -0
- package/dist/prompt/token-estimate.d.ts.map +1 -0
- package/dist/prompt/token-estimate.js +20 -0
- package/dist/prompt/token-estimate.js.map +1 -0
- package/dist/prompt/types.d.ts +134 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +44 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +65 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/factory.d.ts +3 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +37 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/http.d.ts +56 -0
- package/dist/providers/http.d.ts.map +1 -0
- package/dist/providers/http.js +148 -0
- package/dist/providers/http.js.map +1 -0
- package/dist/providers/index.d.ts +15 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +15 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/model-catalog.d.ts +21 -0
- package/dist/providers/model-catalog.d.ts.map +1 -0
- package/dist/providers/model-catalog.js +121 -0
- package/dist/providers/model-catalog.js.map +1 -0
- package/dist/providers/ollama.d.ts +3 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +55 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +3 -0
- package/dist/providers/openai-compatible.d.ts.map +1 -0
- package/dist/providers/openai-compatible.js +50 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +68 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +112 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +55 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/response/errors.d.ts +60 -0
- package/dist/response/errors.d.ts.map +1 -0
- package/dist/response/errors.js +101 -0
- package/dist/response/errors.js.map +1 -0
- package/dist/response/extract.d.ts +38 -0
- package/dist/response/extract.d.ts.map +1 -0
- package/dist/response/extract.js +77 -0
- package/dist/response/extract.js.map +1 -0
- package/dist/response/index.d.ts +8 -0
- package/dist/response/index.d.ts.map +1 -0
- package/dist/response/index.js +8 -0
- package/dist/response/index.js.map +1 -0
- package/dist/response/merge.d.ts +53 -0
- package/dist/response/merge.d.ts.map +1 -0
- package/dist/response/merge.js +348 -0
- package/dist/response/merge.js.map +1 -0
- package/dist/response/referential.d.ts +113 -0
- package/dist/response/referential.d.ts.map +1 -0
- package/dist/response/referential.js +556 -0
- package/dist/response/referential.js.map +1 -0
- package/dist/response/schema.d.ts +506 -0
- package/dist/response/schema.d.ts.map +1 -0
- package/dist/response/schema.js +191 -0
- package/dist/response/schema.js.map +1 -0
- package/dist/response/validate.d.ts +29 -0
- package/dist/response/validate.d.ts.map +1 -0
- package/dist/response/validate.js +167 -0
- package/dist/response/validate.js.map +1 -0
- package/dist/types.d.ts +95 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +49 -0
- package/dist/types.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { columnLabelId, enumId as enumSuggestionId, groupId as groupSuggestionId, keyId, relationId, tableLabelId, templateId as templateSuggestionId, widgetId as widgetSuggestionId, } from '../apply/suggestion-id.js';
|
|
2
|
+
import { PSEUDO_ENUM_MAX_DISTINCT, qualifyTableRef } from '../prompt/serializer.js';
|
|
3
|
+
import { makeError } from './errors.js';
|
|
4
|
+
/* ---------------------------------------------------------------- constants */
|
|
5
|
+
/** The fallback icon a rejected/unknown icon downgrades to (§7.3 icon row). */
|
|
6
|
+
export const FALLBACK_ICON = 'table';
|
|
7
|
+
const NUMERIC_TYPES = new Set([
|
|
8
|
+
'integer',
|
|
9
|
+
'bigint',
|
|
10
|
+
'decimal',
|
|
11
|
+
'float',
|
|
12
|
+
]);
|
|
13
|
+
const TEMPORAL_TYPES = new Set([
|
|
14
|
+
'date',
|
|
15
|
+
'time',
|
|
16
|
+
'timestamp',
|
|
17
|
+
'timestamptz',
|
|
18
|
+
]);
|
|
19
|
+
/** A single-column PK of one of these types reads as a surrogate id (§7.3). */
|
|
20
|
+
const SURROGATE_PK_TYPES = new Set([
|
|
21
|
+
'uuid',
|
|
22
|
+
'integer',
|
|
23
|
+
'bigint',
|
|
24
|
+
]);
|
|
25
|
+
/** Aggregations that require a numeric metric column (§7.3 widget row). */
|
|
26
|
+
const NUMERIC_AGGS = new Set(['sum', 'avg', 'min', 'max']);
|
|
27
|
+
export function createPrunes() {
|
|
28
|
+
return {
|
|
29
|
+
tables: new Set(),
|
|
30
|
+
columns: new Map(),
|
|
31
|
+
nullDisplayColumn: new Set(),
|
|
32
|
+
nullNaturalKey: new Set(),
|
|
33
|
+
dropMicrocopy: new Set(),
|
|
34
|
+
pageTemplates: new Map(),
|
|
35
|
+
fallbackTableIcon: new Set(),
|
|
36
|
+
enums: new Set(),
|
|
37
|
+
confirmedRelations: new Set(),
|
|
38
|
+
inferredRelations: new Set(),
|
|
39
|
+
navGroups: new Set(),
|
|
40
|
+
fallbackNavIcon: new Set(),
|
|
41
|
+
dashboards: new Set(),
|
|
42
|
+
widgets: new Map(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function addNested(map, outer, inner) {
|
|
46
|
+
const set = map.get(outer);
|
|
47
|
+
if (set)
|
|
48
|
+
set.add(inner);
|
|
49
|
+
else
|
|
50
|
+
map.set(outer, new Set([inner]));
|
|
51
|
+
}
|
|
52
|
+
function mergeNested(into, from) {
|
|
53
|
+
for (const [outer, inners] of from) {
|
|
54
|
+
for (const inner of inners)
|
|
55
|
+
addNested(into, outer, inner);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Union two prune sets (locale stage + referential stage) into a new one. */
|
|
59
|
+
export function mergePrunes(a, b) {
|
|
60
|
+
const out = createPrunes();
|
|
61
|
+
for (const key of [
|
|
62
|
+
'tables',
|
|
63
|
+
'nullDisplayColumn',
|
|
64
|
+
'nullNaturalKey',
|
|
65
|
+
'dropMicrocopy',
|
|
66
|
+
'fallbackTableIcon',
|
|
67
|
+
'enums',
|
|
68
|
+
'confirmedRelations',
|
|
69
|
+
'inferredRelations',
|
|
70
|
+
'navGroups',
|
|
71
|
+
'fallbackNavIcon',
|
|
72
|
+
'dashboards',
|
|
73
|
+
]) {
|
|
74
|
+
for (const i of a[key])
|
|
75
|
+
out[key].add(i);
|
|
76
|
+
for (const i of b[key])
|
|
77
|
+
out[key].add(i);
|
|
78
|
+
}
|
|
79
|
+
for (const map of [a.columns, b.columns])
|
|
80
|
+
mergeNested(out.columns, map);
|
|
81
|
+
for (const map of [a.pageTemplates, b.pageTemplates])
|
|
82
|
+
mergeNested(out.pageTemplates, map);
|
|
83
|
+
for (const map of [a.widgets, b.widgets])
|
|
84
|
+
mergeNested(out.widgets, map);
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
function relationSignature(fromTable, fromColumns, toTable, toColumns) {
|
|
88
|
+
const from = [...fromColumns].sort().join(',');
|
|
89
|
+
const to = [...toColumns].sort().join(',');
|
|
90
|
+
return `${fromTable}|${from}=>${toTable}|${to}`;
|
|
91
|
+
}
|
|
92
|
+
function buildSchemaIndex(model, stubTables, stats) {
|
|
93
|
+
const enumValuesById = new Map(model.enums.map((e) => [e.id, e.values]));
|
|
94
|
+
const distinctCount = distinctCountByColumn(stats, model.defaultSchema);
|
|
95
|
+
const tables = new Map();
|
|
96
|
+
for (const table of model.tables) {
|
|
97
|
+
const columns = new Map();
|
|
98
|
+
const enumValuesByColumn = new Map();
|
|
99
|
+
const pseudoEnumColumns = new Set();
|
|
100
|
+
for (const column of table.columns) {
|
|
101
|
+
columns.set(column.name, column);
|
|
102
|
+
if (column.enumRef !== null) {
|
|
103
|
+
const values = enumValuesById.get(column.enumRef);
|
|
104
|
+
if (values)
|
|
105
|
+
enumValuesByColumn.set(column.name, values);
|
|
106
|
+
}
|
|
107
|
+
if (isPseudoEnumCandidate(column, distinctCount(table.id, column.name))) {
|
|
108
|
+
pseudoEnumColumns.add(column.name);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
tables.set(table.id, {
|
|
112
|
+
id: table.id,
|
|
113
|
+
columns,
|
|
114
|
+
columnNames: new Set(columns.keys()),
|
|
115
|
+
primaryKey: table.primaryKey,
|
|
116
|
+
enumValuesByColumn,
|
|
117
|
+
pseudoEnumColumns,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const declaredRelations = new Set();
|
|
121
|
+
for (const relation of model.relations) {
|
|
122
|
+
if (relation.kind === 'inferred-name' || relation.kind === 'inferred-join-table')
|
|
123
|
+
continue;
|
|
124
|
+
declaredRelations.add(relationSignature(relation.from.tableId, relation.from.columns, relation.to.tableId, relation.to.columns));
|
|
125
|
+
}
|
|
126
|
+
// Column-level FK mirrors count as declared relations too (belt-and-braces:
|
|
127
|
+
// some imports carry references without a materialized Relation row).
|
|
128
|
+
for (const table of model.tables) {
|
|
129
|
+
for (const column of table.columns) {
|
|
130
|
+
if (column.references !== null) {
|
|
131
|
+
declaredRelations.add(relationSignature(table.id, [column.name], column.references.tableId, [column.references.column]));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { tables, declaredRelations, stubTables: new Set(stubTables) };
|
|
136
|
+
}
|
|
137
|
+
function isEnumLikeColumn(column, table) {
|
|
138
|
+
if (column.logicalType === 'enum' || column.enumRef !== null)
|
|
139
|
+
return true;
|
|
140
|
+
if (table.enumValuesByColumn.has(column.name))
|
|
141
|
+
return true;
|
|
142
|
+
// §7.3 row 4: a low-cardinality text column the prompt flagged
|
|
143
|
+
// `pseudoEnumCandidate` is a legitimate enum target even without a declared
|
|
144
|
+
// DB enum/CHECK — the prompt explicitly asks the model to classify it.
|
|
145
|
+
if (table.pseudoEnumColumns.has(column.name))
|
|
146
|
+
return true;
|
|
147
|
+
const semantics = column.semantics;
|
|
148
|
+
return (semantics !== null &&
|
|
149
|
+
(semantics.primary === 'status-workflow' || semantics.primary === 'category-enum'));
|
|
150
|
+
}
|
|
151
|
+
/** `(tableId, column) → distinctCount | null`, built from the run's stats (§4.2). */
|
|
152
|
+
function distinctCountByColumn(stats, defaultSchema) {
|
|
153
|
+
const map = new Map();
|
|
154
|
+
for (const result of stats) {
|
|
155
|
+
const tableId = qualifyTableRef(result.table, defaultSchema);
|
|
156
|
+
for (const column of result.columns)
|
|
157
|
+
map.set(`${tableId} ${column.column}`, column.distinctCount);
|
|
158
|
+
}
|
|
159
|
+
return (tableId, column) => map.get(`${tableId} ${column}`) ?? null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Mirror of the serializer's `pseudoEnumCandidate` rule (§4.2): a non-PII,
|
|
163
|
+
* non-secret text/varchar column with no declared enum whose distinctCount is at
|
|
164
|
+
* or below {@link PSEUDO_ENUM_MAX_DISTINCT}. Kept in lockstep with the prompt via
|
|
165
|
+
* the shared threshold so what the prompt flags is exactly what validation accepts.
|
|
166
|
+
*/
|
|
167
|
+
function isPseudoEnumCandidate(column, distinctCount) {
|
|
168
|
+
const isText = column.logicalType === 'text' || column.logicalType === 'varchar';
|
|
169
|
+
const pii = (column.semantics?.flags.pii ?? null) !== null;
|
|
170
|
+
const secret = column.semantics?.flags.secret ?? false;
|
|
171
|
+
return (isText &&
|
|
172
|
+
!pii &&
|
|
173
|
+
!secret &&
|
|
174
|
+
column.enumRef === null &&
|
|
175
|
+
distinctCount !== null &&
|
|
176
|
+
distinctCount <= PSEUDO_ENUM_MAX_DISTINCT);
|
|
177
|
+
}
|
|
178
|
+
function isSurrogatePk(table, columnName) {
|
|
179
|
+
if (table.primaryKey.length !== 1 || table.primaryKey[0] !== columnName)
|
|
180
|
+
return false;
|
|
181
|
+
const column = table.columns.get(columnName);
|
|
182
|
+
if (!column)
|
|
183
|
+
return false;
|
|
184
|
+
if (column.logicalType === 'uuid')
|
|
185
|
+
return true;
|
|
186
|
+
if (column.default?.kind === 'autoincrement')
|
|
187
|
+
return true;
|
|
188
|
+
return SURROGATE_PK_TYPES.has(column.logicalType);
|
|
189
|
+
}
|
|
190
|
+
function typesCompatible(a, b) {
|
|
191
|
+
if (a === b)
|
|
192
|
+
return true;
|
|
193
|
+
if (NUMERIC_TYPES.has(a) && NUMERIC_TYPES.has(b))
|
|
194
|
+
return true;
|
|
195
|
+
if (TEMPORAL_TYPES.has(a) && TEMPORAL_TYPES.has(b))
|
|
196
|
+
return true;
|
|
197
|
+
const textish = new Set(['text', 'varchar', 'uuid']);
|
|
198
|
+
return textish.has(a) && textish.has(b);
|
|
199
|
+
}
|
|
200
|
+
function toIconSet(icons) {
|
|
201
|
+
if (icons === undefined)
|
|
202
|
+
return null;
|
|
203
|
+
return icons instanceof Set ? icons : new Set(icons);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Run the exhaustive §7.3 cross-checks. Produces per-item errors + warnings and
|
|
207
|
+
* the {@link ResponsePrunes} the caller applies with {@link applyPrunes}. Never
|
|
208
|
+
* throws and never mutates `response`.
|
|
209
|
+
*/
|
|
210
|
+
export function runReferentialChecks(response, ctx) {
|
|
211
|
+
const index = buildSchemaIndex(ctx.snapshot, ctx.stubTables ?? [], ctx.stats ?? []);
|
|
212
|
+
const iconSet = toIconSet(ctx.allowedIcons);
|
|
213
|
+
const errors = [];
|
|
214
|
+
const warnings = [];
|
|
215
|
+
const prunes = createPrunes();
|
|
216
|
+
checkTables(response, ctx, index, iconSet, errors, warnings, prunes);
|
|
217
|
+
checkEnums(response, index, errors, prunes);
|
|
218
|
+
checkRelations(response, index, errors, prunes);
|
|
219
|
+
checkNavGroups(response, index, iconSet, errors, warnings, prunes);
|
|
220
|
+
checkDashboards(response, index, ctx, errors, prunes);
|
|
221
|
+
return { errors, warnings, prunes };
|
|
222
|
+
}
|
|
223
|
+
function checkTables(response, ctx, index, iconSet, errors, warnings, prunes) {
|
|
224
|
+
response.tables.forEach((table, i) => {
|
|
225
|
+
const known = index.tables.get(table.table);
|
|
226
|
+
if (!known || index.stubTables.has(table.table)) {
|
|
227
|
+
const dependents = countDependentWidgets(response, table.table);
|
|
228
|
+
const suffix = dependents > 0
|
|
229
|
+
? ` ${dependents} dependent widget suggestion${dependents === 1 ? '' : 's'} bound to it ${dependents === 1 ? 'was' : 'were'} also dropped.`
|
|
230
|
+
: '';
|
|
231
|
+
const reason = index.stubTables.has(table.table)
|
|
232
|
+
? `"${table.table}" is a stub (context-only) table; emit no suggestions for it.`
|
|
233
|
+
: `"${table.table}" does not exist in this schema snapshot.`;
|
|
234
|
+
errors.push(makeError('LLM_UNKNOWN_TABLE', `tables[${i}].table`, `${reason} The suggestion was discarded.${suffix}`, {
|
|
235
|
+
suggestionId: tableLabelId(table.table),
|
|
236
|
+
}));
|
|
237
|
+
prunes.tables.add(i);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
// Columns
|
|
241
|
+
table.columns.forEach((column, j) => {
|
|
242
|
+
if (!known.columnNames.has(column.column)) {
|
|
243
|
+
errors.push(makeError('LLM_UNKNOWN_COLUMN', `tables[${i}].columns[${j}].column`, `Column "${column.column}" does not exist on "${table.table}". The suggestion was discarded.`, { suggestionId: columnLabelId(table.table, column.column) }));
|
|
244
|
+
addNested(prunes.columns, i, j);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
// Display column
|
|
248
|
+
if (table.displayColumn !== null) {
|
|
249
|
+
if (!known.columnNames.has(table.displayColumn)) {
|
|
250
|
+
errors.push(makeError('LLM_UNKNOWN_COLUMN', `tables[${i}].displayColumn`, `Display column "${table.displayColumn}" does not exist on "${table.table}".`, { suggestionId: keyId(table.table) }));
|
|
251
|
+
prunes.nullDisplayColumn.add(i);
|
|
252
|
+
}
|
|
253
|
+
else if (isSurrogatePk(known, table.displayColumn)) {
|
|
254
|
+
errors.push(makeError('LLM_BAD_DISPLAY_COLUMN', `tables[${i}].displayColumn`, `Display column "${table.displayColumn}" is the surrogate primary key of "${table.table}" — a human cannot read it. The suggestion was discarded.`, { suggestionId: keyId(table.table) }));
|
|
255
|
+
prunes.nullDisplayColumn.add(i);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Natural key
|
|
259
|
+
if (table.naturalKey !== null) {
|
|
260
|
+
const missing = table.naturalKey.find((col) => !known.columnNames.has(col));
|
|
261
|
+
if (missing !== undefined) {
|
|
262
|
+
errors.push(makeError('LLM_UNKNOWN_COLUMN', `tables[${i}].naturalKey`, `Natural-key column "${missing}" does not exist on "${table.table}".`, { suggestionId: keyId(table.table) }));
|
|
263
|
+
prunes.nullNaturalKey.add(i);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Page templates
|
|
267
|
+
table.pageTemplates.forEach((template, k) => {
|
|
268
|
+
if (template.template === 'page-crud') {
|
|
269
|
+
errors.push(makeError('LLM_UNKNOWN_TEMPLATE', `tables[${i}].pageTemplates[${k}].template`, '"page-crud" is always generated and must never be recommended. The suggestion was discarded.', { suggestionId: templateSuggestionId(table.table, template.template) }));
|
|
270
|
+
addNested(prunes.pageTemplates, i, k);
|
|
271
|
+
}
|
|
272
|
+
else if (!ctx.allowedTemplates.includes(template.template)) {
|
|
273
|
+
errors.push(makeError('LLM_UNKNOWN_TEMPLATE', `tables[${i}].pageTemplates[${k}].template`, `"${template.template}" is not an allowed page template. The suggestion was discarded.`, { suggestionId: templateSuggestionId(table.table, template.template) }));
|
|
274
|
+
addNested(prunes.pageTemplates, i, k);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
// Icon (warning + fallback; Zod already enforced kebab-case)
|
|
278
|
+
if (iconSet && !iconSet.has(table.icon)) {
|
|
279
|
+
warnings.push(makeError('LLM_UNKNOWN_ICON', `tables[${i}].icon`, `Icon "${table.icon}" is not in the bundled lucide manifest; falling back to "${FALLBACK_ICON}".`, { suggestionId: tableLabelId(table.table) }));
|
|
280
|
+
prunes.fallbackTableIcon.add(i);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
function checkEnums(response, index, errors, prunes) {
|
|
285
|
+
response.enums.forEach((enumeration, i) => {
|
|
286
|
+
const sid = enumSuggestionId(enumeration.table, enumeration.column);
|
|
287
|
+
const known = index.tables.get(enumeration.table);
|
|
288
|
+
if (!known || index.stubTables.has(enumeration.table)) {
|
|
289
|
+
const reason = index.stubTables.has(enumeration.table)
|
|
290
|
+
? `"${enumeration.table}" is a stub (context-only) table; emit no suggestions for it.`
|
|
291
|
+
: `"${enumeration.table}" does not exist in this schema snapshot, so it has no enum column.`;
|
|
292
|
+
errors.push(makeError('LLM_NOT_AN_ENUM', `enums[${i}].table`, `${reason} The suggestion was discarded.`, {
|
|
293
|
+
suggestionId: sid,
|
|
294
|
+
}));
|
|
295
|
+
prunes.enums.add(i);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const column = known.columns.get(enumeration.column);
|
|
299
|
+
if (!column) {
|
|
300
|
+
errors.push(makeError('LLM_NOT_AN_ENUM', `enums[${i}].column`, `Column "${enumeration.column}" does not exist on "${enumeration.table}". The suggestion was discarded.`, { suggestionId: sid }));
|
|
301
|
+
prunes.enums.add(i);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (!isEnumLikeColumn(column, known)) {
|
|
305
|
+
errors.push(makeError('LLM_NOT_AN_ENUM', `enums[${i}].column`, `Column "${enumeration.table}.${enumeration.column}" is not enum-like in the snapshot (no enum type, CHECK constraint or low-cardinality flag). The suggestion was discarded.`, { suggestionId: sid }));
|
|
306
|
+
prunes.enums.add(i);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
// Value-set checks — only possible when the catalog knows the values.
|
|
310
|
+
const values = known.enumValuesByColumn.get(enumeration.column);
|
|
311
|
+
if (!values)
|
|
312
|
+
return;
|
|
313
|
+
const valueSet = new Set(values);
|
|
314
|
+
if (enumeration.order !== null && !isPermutation(enumeration.order, values)) {
|
|
315
|
+
errors.push(makeError('LLM_ENUM_VALUES', `enums[${i}].order`, `"order" must be a permutation of the declared values [${values.join(', ')}]. The suggestion was discarded.`, { suggestionId: sid }));
|
|
316
|
+
prunes.enums.add(i);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const toneKeys = Object.keys(enumeration.tones);
|
|
320
|
+
if (toneKeys.length !== valueSet.size || toneKeys.some((k) => !valueSet.has(k))) {
|
|
321
|
+
errors.push(makeError('LLM_ENUM_VALUES', `enums[${i}].tones`, `"tones" must map exactly the declared values [${values.join(', ')}], no more, no fewer. The suggestion was discarded.`, { suggestionId: sid }));
|
|
322
|
+
prunes.enums.add(i);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
if (enumeration.terminal) {
|
|
326
|
+
const stray = enumeration.terminal.find((v) => !valueSet.has(v));
|
|
327
|
+
if (stray !== undefined) {
|
|
328
|
+
errors.push(makeError('LLM_ENUM_VALUES', `enums[${i}].terminal`, `Terminal value "${stray}" is not among the declared values [${values.join(', ')}]. The suggestion was discarded.`, { suggestionId: sid }));
|
|
329
|
+
prunes.enums.add(i);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
function checkRelations(response, index, errors, prunes) {
|
|
335
|
+
response.relations.confirmed.forEach((relation, i) => {
|
|
336
|
+
const signature = relationSignature(relation.fromTable, relation.fromColumns, relation.toTable, relation.toColumns);
|
|
337
|
+
if (!index.declaredRelations.has(signature)) {
|
|
338
|
+
errors.push(makeError('LLM_UNKNOWN_RELATION', `relations.confirmed[${i}]`, `No declared relation "${relation.fromTable}.${relation.fromColumns.join(',')}" → "${relation.toTable}.${relation.toColumns.join(',')}" exists in the snapshot; a confirmation must reference a declared foreign key. The suggestion was discarded.`, {
|
|
339
|
+
suggestionId: relationId(relation.fromTable, relation.fromColumns, relation.toTable, relation.toColumns),
|
|
340
|
+
}));
|
|
341
|
+
prunes.confirmedRelations.add(i);
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
response.relations.inferred.forEach((relation, i) => {
|
|
345
|
+
const sid = relationId(relation.fromTable, relation.fromColumns, relation.toTable, relation.toColumns);
|
|
346
|
+
const from = index.tables.get(relation.fromTable);
|
|
347
|
+
const to = index.tables.get(relation.toTable);
|
|
348
|
+
const missingEndpoint = !from ||
|
|
349
|
+
!to ||
|
|
350
|
+
relation.fromColumns.some((c) => !from.columnNames.has(c)) ||
|
|
351
|
+
relation.toColumns.some((c) => !to.columnNames.has(c));
|
|
352
|
+
if (missingEndpoint) {
|
|
353
|
+
errors.push(makeError('LLM_RELATION_INVALID', `relations.inferred[${i}]`, `Inferred relation endpoints do not all exist: "${relation.fromTable}.${relation.fromColumns.join(',')}" → "${relation.toTable}.${relation.toColumns.join(',')}". The suggestion was discarded.`, { suggestionId: sid }));
|
|
354
|
+
prunes.inferredRelations.add(i);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
const signature = relationSignature(relation.fromTable, relation.fromColumns, relation.toTable, relation.toColumns);
|
|
358
|
+
if (index.declaredRelations.has(signature)) {
|
|
359
|
+
errors.push(makeError('LLM_RELATION_INVALID', `relations.inferred[${i}]`, `Inferred relation duplicates a relation already declared as a foreign key; it must be listed as confirmed, not inferred. The suggestion was discarded.`, { suggestionId: sid }));
|
|
360
|
+
prunes.inferredRelations.add(i);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const incompatible = relation.fromColumns.some((fromCol, k) => {
|
|
364
|
+
const toCol = relation.toColumns[k];
|
|
365
|
+
if (toCol === undefined)
|
|
366
|
+
return false;
|
|
367
|
+
const fromType = from.columns.get(fromCol)?.logicalType;
|
|
368
|
+
const toType = to.columns.get(toCol)?.logicalType;
|
|
369
|
+
return fromType !== undefined && toType !== undefined && !typesCompatible(fromType, toType);
|
|
370
|
+
});
|
|
371
|
+
if (incompatible) {
|
|
372
|
+
errors.push(makeError('LLM_RELATION_INVALID', `relations.inferred[${i}]`, `Inferred relation joins columns of incompatible types. The suggestion was discarded.`, { suggestionId: sid }));
|
|
373
|
+
prunes.inferredRelations.add(i);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
function checkNavGroups(response, index, iconSet, errors, warnings, prunes) {
|
|
378
|
+
const seenIds = new Set();
|
|
379
|
+
const tableToGroup = new Map();
|
|
380
|
+
response.navGroups.forEach((group, i) => {
|
|
381
|
+
if (seenIds.has(group.id)) {
|
|
382
|
+
errors.push(makeError('LLM_GROUP_INVALID', `navGroups[${i}].id`, `Duplicate nav-group id "${group.id}"; ids must be unique. The group was discarded.`, { suggestionId: groupSuggestionId(group.id) }));
|
|
383
|
+
prunes.navGroups.add(i);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const unknown = group.tables.find((t) => !index.tables.get(t) || index.stubTables.has(t));
|
|
387
|
+
if (unknown !== undefined) {
|
|
388
|
+
errors.push(makeError('LLM_GROUP_INVALID', `navGroups[${i}].tables`, `Nav group "${group.id}" references "${unknown}", which is not a table in this schema snapshot. The group was discarded.`, { suggestionId: groupSuggestionId(group.id) }));
|
|
389
|
+
prunes.navGroups.add(i);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
const claimed = group.tables.find((t) => tableToGroup.has(t));
|
|
393
|
+
if (claimed !== undefined) {
|
|
394
|
+
errors.push(makeError('LLM_GROUP_INVALID', `navGroups[${i}].tables`, `Table "${claimed}" already belongs to nav group "${response.navGroups[tableToGroup.get(claimed) ?? 0]?.id ?? ''}"; every table must appear in exactly one group. The group was discarded.`, { suggestionId: groupSuggestionId(group.id) }));
|
|
395
|
+
prunes.navGroups.add(i);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
// Survives: claim its id + tables.
|
|
399
|
+
seenIds.add(group.id);
|
|
400
|
+
for (const t of group.tables)
|
|
401
|
+
tableToGroup.set(t, i);
|
|
402
|
+
if (iconSet && !iconSet.has(group.icon)) {
|
|
403
|
+
warnings.push(makeError('LLM_UNKNOWN_ICON', `navGroups[${i}].icon`, `Icon "${group.icon}" is not in the bundled lucide manifest; falling back to "${FALLBACK_ICON}".`, { suggestionId: groupSuggestionId(group.id) }));
|
|
404
|
+
prunes.fallbackNavIcon.add(i);
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
function checkDashboards(response, index, ctx, errors, prunes) {
|
|
409
|
+
response.dashboards.forEach((dashboard, i) => {
|
|
410
|
+
dashboard.widgets.forEach((widget, k) => {
|
|
411
|
+
const sid = widgetSuggestionId(dashboard.id, widget.widget, widget.rank);
|
|
412
|
+
const path = `dashboards[${i}].widgets[${k}]`;
|
|
413
|
+
if (!ctx.allowedWidgets.includes(widget.widget)) {
|
|
414
|
+
errors.push(makeError('LLM_UNKNOWN_WIDGET', `${path}.widget`, `Widget "${widget.widget}" is not in the allowed dashboard-widget set. The suggestion was discarded.`, { suggestionId: sid }));
|
|
415
|
+
addNested(prunes.widgets, i, k);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
const table = index.tables.get(widget.table);
|
|
419
|
+
if (!table || index.stubTables.has(widget.table)) {
|
|
420
|
+
const reason = index.stubTables.has(widget.table)
|
|
421
|
+
? `Widget binds to "${widget.table}", a stub (context-only) table; emit no suggestions for it.`
|
|
422
|
+
: `Widget binds to "${widget.table}", which is not a table in this schema snapshot.`;
|
|
423
|
+
errors.push(makeError('LLM_WIDGET_BINDING', `${path}.table`, `${reason} The suggestion was discarded.`, {
|
|
424
|
+
suggestionId: sid,
|
|
425
|
+
}));
|
|
426
|
+
addNested(prunes.widgets, i, k);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const boundColumn = (field) => {
|
|
430
|
+
const value = widget[field];
|
|
431
|
+
if (value === undefined)
|
|
432
|
+
return true;
|
|
433
|
+
if (!table.columnNames.has(value)) {
|
|
434
|
+
errors.push(makeError('LLM_WIDGET_BINDING', `${path}.${field}`, `Column "${value}" does not exist on "${widget.table}". The suggestion was discarded.`, { suggestionId: sid }));
|
|
435
|
+
addNested(prunes.widgets, i, k);
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
return true;
|
|
439
|
+
};
|
|
440
|
+
if (!boundColumn('metricColumn'))
|
|
441
|
+
return;
|
|
442
|
+
if (!boundColumn('dimensionColumn'))
|
|
443
|
+
return;
|
|
444
|
+
if (!boundColumn('timeColumn'))
|
|
445
|
+
return;
|
|
446
|
+
if (widget.agg !== undefined && NUMERIC_AGGS.has(widget.agg) && widget.metricColumn !== undefined) {
|
|
447
|
+
const type = table.columns.get(widget.metricColumn)?.logicalType;
|
|
448
|
+
if (type !== undefined && !NUMERIC_TYPES.has(type)) {
|
|
449
|
+
errors.push(makeError('LLM_WIDGET_BINDING', `${path}.metricColumn`, `Aggregation "${widget.agg}" needs a numeric metric column, but "${widget.metricColumn}" is ${type}. The suggestion was discarded.`, { suggestionId: sid }));
|
|
450
|
+
addNested(prunes.widgets, i, k);
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (widget.timeColumn !== undefined) {
|
|
455
|
+
const type = table.columns.get(widget.timeColumn)?.logicalType;
|
|
456
|
+
if (type !== undefined && !TEMPORAL_TYPES.has(type)) {
|
|
457
|
+
errors.push(makeError('LLM_WIDGET_BINDING', `${path}.timeColumn`, `Time column "${widget.timeColumn}" is ${type}, not a date/time type. The suggestion was discarded.`, { suggestionId: sid }));
|
|
458
|
+
addNested(prunes.widgets, i, k);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
/* ---------------------------------------------------------------- helpers */
|
|
465
|
+
function isPermutation(candidate, values) {
|
|
466
|
+
if (candidate.length !== values.length)
|
|
467
|
+
return false;
|
|
468
|
+
const remaining = new Map();
|
|
469
|
+
for (const v of values)
|
|
470
|
+
remaining.set(v, (remaining.get(v) ?? 0) + 1);
|
|
471
|
+
for (const c of candidate) {
|
|
472
|
+
const count = remaining.get(c);
|
|
473
|
+
if (count === undefined || count === 0)
|
|
474
|
+
return false;
|
|
475
|
+
remaining.set(c, count - 1);
|
|
476
|
+
}
|
|
477
|
+
return true;
|
|
478
|
+
}
|
|
479
|
+
function countDependentWidgets(response, tableName) {
|
|
480
|
+
let count = 0;
|
|
481
|
+
for (const dashboard of response.dashboards) {
|
|
482
|
+
for (const widget of dashboard.widgets) {
|
|
483
|
+
if (widget.table === tableName)
|
|
484
|
+
count += 1;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return count;
|
|
488
|
+
}
|
|
489
|
+
/* ----------------------------------------------------------- apply prunes */
|
|
490
|
+
/**
|
|
491
|
+
* Produce a cleaned response with every pruned suggestion removed. Table drops
|
|
492
|
+
* cascade: a dropped table also removes its enum suggestions and the dashboard
|
|
493
|
+
* widgets bound to it (acceptance criterion 4). Never mutates `response`.
|
|
494
|
+
*/
|
|
495
|
+
export function applyPrunes(response, prunes) {
|
|
496
|
+
const droppedTableNames = new Set();
|
|
497
|
+
for (const i of prunes.tables) {
|
|
498
|
+
const name = response.tables[i]?.table;
|
|
499
|
+
if (name !== undefined)
|
|
500
|
+
droppedTableNames.add(name);
|
|
501
|
+
}
|
|
502
|
+
const tables = response.tables
|
|
503
|
+
.map((table, i) => {
|
|
504
|
+
if (prunes.tables.has(i))
|
|
505
|
+
return null;
|
|
506
|
+
const droppedColumns = prunes.columns.get(i);
|
|
507
|
+
const droppedTemplates = prunes.pageTemplates.get(i);
|
|
508
|
+
const next = {
|
|
509
|
+
...table,
|
|
510
|
+
columns: table.columns.filter((_, j) => !droppedColumns?.has(j)),
|
|
511
|
+
pageTemplates: table.pageTemplates.filter((_, k) => !droppedTemplates?.has(k)),
|
|
512
|
+
};
|
|
513
|
+
if (prunes.nullDisplayColumn.has(i))
|
|
514
|
+
next.displayColumn = null;
|
|
515
|
+
if (prunes.nullNaturalKey.has(i))
|
|
516
|
+
next.naturalKey = null;
|
|
517
|
+
if (prunes.dropMicrocopy.has(i))
|
|
518
|
+
delete next.microcopy;
|
|
519
|
+
if (prunes.fallbackTableIcon.has(i))
|
|
520
|
+
next.icon = FALLBACK_ICON;
|
|
521
|
+
return next;
|
|
522
|
+
})
|
|
523
|
+
.filter((t) => t !== null);
|
|
524
|
+
const enums = response.enums.filter((enumeration, i) => !prunes.enums.has(i) && !droppedTableNames.has(enumeration.table));
|
|
525
|
+
const confirmed = response.relations.confirmed.filter((_, i) => !prunes.confirmedRelations.has(i));
|
|
526
|
+
const inferred = response.relations.inferred.filter((_, i) => !prunes.inferredRelations.has(i));
|
|
527
|
+
const navGroups = response.navGroups
|
|
528
|
+
.map((group, i) => {
|
|
529
|
+
if (prunes.navGroups.has(i))
|
|
530
|
+
return null;
|
|
531
|
+
if (prunes.fallbackNavIcon.has(i))
|
|
532
|
+
return { ...group, icon: FALLBACK_ICON };
|
|
533
|
+
return group;
|
|
534
|
+
})
|
|
535
|
+
.filter((g) => g !== null);
|
|
536
|
+
const dashboards = response.dashboards
|
|
537
|
+
.map((dashboard, i) => {
|
|
538
|
+
if (prunes.dashboards.has(i))
|
|
539
|
+
return null;
|
|
540
|
+
const droppedWidgets = prunes.widgets.get(i);
|
|
541
|
+
return {
|
|
542
|
+
...dashboard,
|
|
543
|
+
widgets: dashboard.widgets.filter((widget, k) => !droppedWidgets?.has(k) && !droppedTableNames.has(widget.table)),
|
|
544
|
+
};
|
|
545
|
+
})
|
|
546
|
+
.filter((d) => d !== null);
|
|
547
|
+
return {
|
|
548
|
+
...response,
|
|
549
|
+
tables,
|
|
550
|
+
enums,
|
|
551
|
+
relations: { confirmed, inferred },
|
|
552
|
+
navGroups,
|
|
553
|
+
dashboards,
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
//# sourceMappingURL=referential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referential.js","sourceRoot":"","sources":["../../src/response/referential.ts"],"names":[],"mappings":"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"}
|