@duckcodeailabs/dql-agent 1.6.6 → 1.6.8

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.
@@ -0,0 +1,340 @@
1
+ import { analyzeSqlReferences } from '@duckcodeailabs/dql-core';
2
+ export function validateSqlAgainstLocalContext(sql, contextPack, options = {}) {
3
+ const analysis = analyzeSqlReferences(sql);
4
+ const referencedRelations = analysis.tables;
5
+ const referencedColumns = analysis.columns.map((column) => ({
6
+ relation: column.relation,
7
+ column: column.column,
8
+ }));
9
+ const outputAliases = extractSelectAliases(sql);
10
+ const base = {
11
+ warnings: [],
12
+ referencedRelations,
13
+ referencedColumns,
14
+ };
15
+ if (!analysis.parsed) {
16
+ return {
17
+ ok: false,
18
+ code: 'insufficient_context',
19
+ error: `SQL could not be parsed for context validation: ${analysis.error ?? 'unknown parse error'}`,
20
+ ...base,
21
+ };
22
+ }
23
+ const unsafeType = analysis.statementTypes.find((type) => type !== 'select');
24
+ if (unsafeType) {
25
+ return {
26
+ ok: false,
27
+ code: 'unsafe_sql',
28
+ error: `Tier-2 metadata SQL only supports read-only SELECT or WITH queries; parser found ${unsafeType.toUpperCase()}.`,
29
+ ...base,
30
+ };
31
+ }
32
+ if (!contextPack)
33
+ return { ok: true, ...base };
34
+ if (contextPack.routeDecision?.route === 'clarify') {
35
+ const missing = contextPack.missingContext.map((item) => item.message).join(' ');
36
+ return {
37
+ ok: false,
38
+ code: 'insufficient_context',
39
+ error: `Metadata context is insufficient for SQL generation. ${missing || contextPack.routeDecision.reason}`,
40
+ ...base,
41
+ };
42
+ }
43
+ if (!contextPack.allowedSqlContext) {
44
+ return {
45
+ ok: true,
46
+ ...base,
47
+ warnings: ['No allowed SQL context was available in the context pack, so relation and column validation were advisory only.'],
48
+ };
49
+ }
50
+ const allowed = buildAllowedRelationLookup(contextPack);
51
+ if (allowed.size === 0) {
52
+ return {
53
+ ok: true,
54
+ ...base,
55
+ warnings: ['No allowed SQL relations were available in the context pack, so relation and column validation were advisory only.'],
56
+ };
57
+ }
58
+ const unknownRelations = referencedRelations.filter((relation) => !relationLookupKeys(relation).some((key) => allowed.has(key)));
59
+ if (unknownRelations.length > 0) {
60
+ return {
61
+ ok: false,
62
+ code: 'unknown_relation',
63
+ error: `SQL references relation(s) outside the inspected metadata context: ${unknownRelations.join(', ')}. Use inspect_metadata_context and only query allowed relations.`,
64
+ ...base,
65
+ };
66
+ }
67
+ const warnings = [];
68
+ for (const relation of referencedRelations) {
69
+ const allowedRelation = findAllowedRelation(allowed, relation);
70
+ if (allowedRelation && allowedRelation.columns.length === 0) {
71
+ warnings.push(`Column validation was advisory for ${relation} because the context pack did not include column metadata.`);
72
+ }
73
+ }
74
+ const unknownColumn = findUnknownColumn(analysis.columns, allowed, analysis.ctes.length > 0, outputAliases);
75
+ if (unknownColumn) {
76
+ return {
77
+ ok: false,
78
+ code: 'unknown_column',
79
+ error: unknownColumn.relation
80
+ ? `SQL references column "${unknownColumn.column}" outside the inspected columns for ${unknownColumn.relation}.`
81
+ : `SQL references column "${unknownColumn.column}" outside the inspected metadata context.`,
82
+ warnings,
83
+ referencedRelations,
84
+ referencedColumns,
85
+ };
86
+ }
87
+ if (options.intent === 'diagnose_change' && !contextHasTimeLikeColumn(contextPack)) {
88
+ return {
89
+ ok: false,
90
+ code: 'missing_baseline',
91
+ error: 'Change-diagnosis SQL needs a comparable time or baseline column in the inspected context.',
92
+ warnings,
93
+ referencedRelations,
94
+ referencedColumns,
95
+ };
96
+ }
97
+ const ambiguousEntityFilter = options.intent === 'entity_drilldown'
98
+ ? findAmbiguousEntityFilter(sql, analysis.aliasToRelation, contextPack, options)
99
+ : undefined;
100
+ if (ambiguousEntityFilter) {
101
+ return {
102
+ ok: false,
103
+ code: 'ambiguous_filter',
104
+ error: ambiguousEntityFilter,
105
+ warnings,
106
+ referencedRelations,
107
+ referencedColumns,
108
+ };
109
+ }
110
+ return {
111
+ ok: true,
112
+ warnings,
113
+ referencedRelations,
114
+ referencedColumns,
115
+ };
116
+ }
117
+ function buildAllowedRelationLookup(contextPack) {
118
+ const allowed = new Map();
119
+ for (const relation of contextPack.allowedSqlContext.relations) {
120
+ for (const key of relationLookupKeys(relation.relation))
121
+ allowed.set(key, relation);
122
+ for (const key of relationLookupKeys(relation.name))
123
+ allowed.set(key, relation);
124
+ }
125
+ for (const source of contextPack.allowedSqlContext.sourceBlockSql) {
126
+ const analysis = analyzeSqlReferences(source.sql);
127
+ for (const relation of analysis.tables) {
128
+ const entry = {
129
+ relation,
130
+ name: relation.split('.').at(-1) ?? relation,
131
+ objectKey: source.objectKey,
132
+ source: 'certified source block SQL',
133
+ columns: [],
134
+ };
135
+ for (const key of relationLookupKeys(relation))
136
+ allowed.set(key, entry);
137
+ }
138
+ }
139
+ return allowed;
140
+ }
141
+ function findAllowedRelation(allowed, relation) {
142
+ for (const key of relationLookupKeys(relation)) {
143
+ const match = allowed.get(key);
144
+ if (match)
145
+ return match;
146
+ }
147
+ return undefined;
148
+ }
149
+ function findUnknownColumn(columns, allowed, hasCtes, outputAliases) {
150
+ for (const column of columns) {
151
+ if (column.column === '*')
152
+ continue;
153
+ if (column.unqualified && outputAliases.has(normalizeColumnName(column.column)))
154
+ continue;
155
+ if (column.relation) {
156
+ const relation = findAllowedRelation(allowed, column.relation);
157
+ if (!relation || relation.columns.length === 0)
158
+ continue;
159
+ if (!relation.columns.some((allowedColumn) => namesEqual(allowedColumn.name, column.column))) {
160
+ return { column: column.column, relation: relation.relation };
161
+ }
162
+ continue;
163
+ }
164
+ if (hasCtes)
165
+ continue;
166
+ const relationsWithColumns = Array.from(new Set(Array.from(allowed.values())))
167
+ .filter((relation) => relation.columns.length > 0);
168
+ if (relationsWithColumns.length === 0)
169
+ continue;
170
+ if (!relationsWithColumns.some((relation) => relation.columns.some((allowedColumn) => namesEqual(allowedColumn.name, column.column)))) {
171
+ return { column: column.column };
172
+ }
173
+ }
174
+ return undefined;
175
+ }
176
+ function extractSelectAliases(sql) {
177
+ const aliases = new Set();
178
+ for (const section of sql.matchAll(/\bSELECT\b([\s\S]*?)\bFROM\b/gi)) {
179
+ for (const alias of (section[1] ?? '').matchAll(/\bAS\s+(["`]?\w+["`]?)/gi)) {
180
+ const name = cleanIdentifier(alias[1] ?? '');
181
+ if (name)
182
+ aliases.add(normalizeColumnName(name));
183
+ }
184
+ }
185
+ return aliases;
186
+ }
187
+ function relationLookupKeys(relation) {
188
+ const normalized = normalizeRelation(relation).toLowerCase();
189
+ const parts = normalized.split('.').filter(Boolean);
190
+ const keys = new Set();
191
+ if (normalized)
192
+ keys.add(normalized);
193
+ if (parts.length >= 2)
194
+ keys.add(parts.slice(-2).join('.'));
195
+ if (parts.length >= 1)
196
+ keys.add(parts[parts.length - 1]);
197
+ return Array.from(keys);
198
+ }
199
+ function normalizeRelation(value) {
200
+ return value
201
+ .replace(/["`]/g, '')
202
+ .replace(/\s*\.\s*/g, '.')
203
+ .replace(/\s+/g, ' ')
204
+ .trim();
205
+ }
206
+ function namesEqual(a, b) {
207
+ return a.replace(/["`]/g, '').toLowerCase() === b.replace(/["`]/g, '').toLowerCase();
208
+ }
209
+ function normalizeColumnName(value) {
210
+ return value.replace(/["`]/g, '').toLowerCase();
211
+ }
212
+ function contextHasTimeLikeColumn(contextPack) {
213
+ return contextPack.allowedSqlContext.relations.some((relation) => relation.columns.some((column) => isTimeLikeColumn(column.name)));
214
+ }
215
+ function isTimeLikeColumn(name) {
216
+ return /\b(date|time|day|week|month|quarter|year|season|period|created_at|updated_at)\b/i.test(name);
217
+ }
218
+ function findAmbiguousEntityFilter(sql, aliasToRelation, contextPack, options) {
219
+ const question = options.question ?? '';
220
+ const explicitValues = uniqueStrings([
221
+ ...(options.filterValues ?? []),
222
+ ...Array.from(question.matchAll(/"([^"]+)"|'([^']+)'/g))
223
+ .map((match) => match[1] ?? match[2])
224
+ .filter((value) => typeof value === 'string' && value.length > 0),
225
+ ...Array.from(question.matchAll(/\b[\w.%+-]+@[\w.-]+\.[A-Za-z]{2,}\b/g)).map((match) => match[0]),
226
+ ]
227
+ .map((value) => value.trim())
228
+ .filter((value) => value.length > 0 && !isTemporalEntityFilter(value)));
229
+ if (explicitValues.length === 0)
230
+ return undefined;
231
+ const sampleMatches = sampleValueColumnMatches(contextPack);
232
+ if (sampleMatches.size === 0)
233
+ return undefined;
234
+ const predicates = extractEntityValuePredicates(sql, aliasToRelation);
235
+ for (const value of explicitValues) {
236
+ const valueKey = normalizeSampleValue(value);
237
+ const matchedColumns = sampleMatches.get(valueKey) ?? [];
238
+ if (matchedColumns.length === 0) {
239
+ return `Entity drilldown SQL needs an inspected value match for "${value}" before it can apply that filter.`;
240
+ }
241
+ const valuePredicates = predicates.filter((predicate) => normalizeSampleValue(predicate.value) === valueKey);
242
+ if (valuePredicates.length === 0) {
243
+ return `Entity drilldown SQL does not apply the requested inspected entity filter "${value}".`;
244
+ }
245
+ if (!valuePredicates.some((predicate) => predicateMatchesSampleColumn(predicate, matchedColumns))) {
246
+ const expected = matchedColumns
247
+ .map((match) => `${match.relation}.${match.column}`)
248
+ .sort()
249
+ .join(', ');
250
+ const actual = valuePredicates
251
+ .map((predicate) => `${predicate.relation ? `${predicate.relation}.` : ''}${predicate.column}`)
252
+ .sort()
253
+ .join(', ');
254
+ return `Entity drilldown SQL filters "${value}" on ${actual}, but inspected metadata matched that value on ${expected}.`;
255
+ }
256
+ }
257
+ return undefined;
258
+ }
259
+ function sampleValueColumnMatches(contextPack) {
260
+ const matches = new Map();
261
+ for (const relation of contextPack.allowedSqlContext.relations) {
262
+ for (const column of relation.columns) {
263
+ for (const sampleValue of column.sampleValues ?? []) {
264
+ const key = normalizeSampleValue(sampleValue);
265
+ if (!key)
266
+ continue;
267
+ const existing = matches.get(key) ?? [];
268
+ existing.push({ relation: relation.relation, column: column.name });
269
+ matches.set(key, existing);
270
+ }
271
+ }
272
+ }
273
+ return matches;
274
+ }
275
+ function extractEntityValuePredicates(sql, aliasToRelation) {
276
+ const predicates = [];
277
+ const equalityPattern = /(?:(["`]?[\w]+["`]?)\s*\.\s*)?(["`]?[\w]+["`]?)\s*=\s*('(?:''|[^'])*'|"(?:\\"|[^"])*")/gi;
278
+ for (const match of sql.matchAll(equalityPattern)) {
279
+ predicates.push({
280
+ relation: resolvePredicateRelation(match[1], aliasToRelation),
281
+ column: cleanIdentifier(match[2] ?? ''),
282
+ value: unquoteSqlLiteral(match[3] ?? ''),
283
+ });
284
+ }
285
+ const inPattern = /(?:(["`]?[\w]+["`]?)\s*\.\s*)?(["`]?[\w]+["`]?)\s+IN\s*\(([^)]*)\)/gi;
286
+ for (const match of sql.matchAll(inPattern)) {
287
+ const relation = resolvePredicateRelation(match[1], aliasToRelation);
288
+ const column = cleanIdentifier(match[2] ?? '');
289
+ for (const value of stringLiteralsInList(match[3] ?? '')) {
290
+ predicates.push({ relation, column, value });
291
+ }
292
+ }
293
+ return predicates.filter((predicate) => predicate.column.length > 0 && predicate.value.length > 0);
294
+ }
295
+ function predicateMatchesSampleColumn(predicate, matches) {
296
+ return matches.some((match) => {
297
+ if (!namesEqual(predicate.column, match.column))
298
+ return false;
299
+ if (!predicate.relation)
300
+ return true;
301
+ return relationLookupKeys(predicate.relation).some((key) => relationLookupKeys(match.relation).includes(key));
302
+ });
303
+ }
304
+ function resolvePredicateRelation(qualifier, aliasToRelation) {
305
+ if (!qualifier)
306
+ return undefined;
307
+ const cleaned = cleanIdentifier(qualifier);
308
+ if (!cleaned)
309
+ return undefined;
310
+ const direct = aliasToRelation[cleaned] ?? aliasToRelation[cleaned.toLowerCase()];
311
+ if (direct)
312
+ return direct;
313
+ return cleaned;
314
+ }
315
+ function stringLiteralsInList(raw) {
316
+ return Array.from(raw.matchAll(/'(?:''|[^'])*'|"(?:\\"|[^"])*"/g)).map((match) => unquoteSqlLiteral(match[0]));
317
+ }
318
+ function unquoteSqlLiteral(raw) {
319
+ const trimmed = raw.trim();
320
+ if ((trimmed.startsWith("'") && trimmed.endsWith("'")) ||
321
+ (trimmed.startsWith('"') && trimmed.endsWith('"'))) {
322
+ return trimmed.slice(1, -1).replace(/''/g, "'").replace(/\\"/g, '"');
323
+ }
324
+ return trimmed;
325
+ }
326
+ function cleanIdentifier(value) {
327
+ return value.replace(/^["`]|["`]$/g, '').trim();
328
+ }
329
+ function normalizeSampleValue(value) {
330
+ return value.trim().toLowerCase();
331
+ }
332
+ function uniqueStrings(values) {
333
+ return Array.from(new Set(values));
334
+ }
335
+ function isTemporalEntityFilter(value) {
336
+ return /\b(last|this|next|previous|prior|current)\s+(day|week|month|quarter|year)\b/i.test(value)
337
+ || /\b(today|yesterday|tomorrow|ytd|mtd|qtd|wtd)\b/i.test(value)
338
+ || /^\d{4}-\d{2}-\d{2}/.test(value);
339
+ }
340
+ //# sourceMappingURL=sql-context-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-context-validation.js","sourceRoot":"","sources":["../../src/metadata/sql-context-validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckcodeailabs/dql-agent",
3
- "version": "1.6.6",
3
+ "version": "1.6.8",
4
4
  "description": "DQL agent: knowledge graph, Skills, block-first answer loop, and pluggable LLM providers (Claude / OpenAI / Gemini / Ollama)",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -24,9 +24,9 @@
24
24
  "access": "public"
25
25
  },
26
26
  "dependencies": {
27
- "@duckcodeailabs/dql-core": "^1.6.6",
28
- "@duckcodeailabs/dql-governance": "^1.6.6",
29
- "@duckcodeailabs/dql-project": "^1.6.6",
27
+ "@duckcodeailabs/dql-core": "^1.6.8",
28
+ "@duckcodeailabs/dql-governance": "^1.6.8",
29
+ "@duckcodeailabs/dql-project": "^1.6.8",
30
30
  "better-sqlite3": "^11.7.0"
31
31
  },
32
32
  "devDependencies": {