@askdb/core 1.0.0-beta.41 → 1.0.0-beta.43
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 +44 -4
- package/dist/ask.d.ts +129 -2
- package/dist/ask.d.ts.map +1 -1
- package/dist/ask.js +391 -15
- package/dist/ask.js.map +1 -1
- package/dist/errors.d.ts +87 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +29 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/logging/log-events.d.ts +13 -0
- package/dist/logging/log-events.d.ts.map +1 -1
- package/dist/logging/log-events.js +13 -0
- package/dist/logging/log-events.js.map +1 -1
- package/dist/schema/v2/index.d.ts +1 -1
- package/dist/schema/v2/index.d.ts.map +1 -1
- package/dist/schema/v2/loader.d.ts +9 -1
- package/dist/schema/v2/loader.d.ts.map +1 -1
- package/dist/schema/v2/loader.js +171 -49
- package/dist/schema/v2/loader.js.map +1 -1
- package/dist/schema/v2/normalized.d.ts +33 -0
- package/dist/schema/v2/normalized.d.ts.map +1 -1
- package/dist/schema/v2/parser.d.ts +9 -0
- package/dist/schema/v2/parser.d.ts.map +1 -1
- package/dist/schema/v2/parser.js +18 -2
- package/dist/schema/v2/parser.js.map +1 -1
- package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -1
- package/dist/schema/v2/tenant-policy-loader.js +7 -3
- package/dist/schema/v2/tenant-policy-loader.js.map +1 -1
- package/dist/schema/v2/tenant-policy.d.ts +28 -21
- package/dist/schema/v2/tenant-policy.d.ts.map +1 -1
- package/dist/schema/v2/tenant-policy.js +67 -11
- package/dist/schema/v2/tenant-policy.js.map +1 -1
- package/dist/sql/bind.d.ts +102 -0
- package/dist/sql/bind.d.ts.map +1 -0
- package/dist/sql/bind.js +422 -0
- package/dist/sql/bind.js.map +1 -0
- package/dist/sql/dialect-spec.d.ts +24 -1
- package/dist/sql/dialect-spec.d.ts.map +1 -1
- package/dist/sql/dialect-spec.js +82 -3
- package/dist/sql/dialect-spec.js.map +1 -1
- package/dist/sql/extract-sql.d.ts +8 -1
- package/dist/sql/extract-sql.d.ts.map +1 -1
- package/dist/sql/extract-sql.js +27 -4
- package/dist/sql/extract-sql.js.map +1 -1
- package/dist/sql/generate.d.ts +22 -0
- package/dist/sql/generate.d.ts.map +1 -1
- package/dist/sql/generate.js +92 -16
- package/dist/sql/generate.js.map +1 -1
- package/dist/sql/index.d.ts +4 -2
- package/dist/sql/index.d.ts.map +1 -1
- package/dist/sql/index.js +4 -2
- package/dist/sql/index.js.map +1 -1
- package/dist/sql/lexer.d.ts +114 -0
- package/dist/sql/lexer.d.ts.map +1 -0
- package/dist/sql/lexer.js +397 -0
- package/dist/sql/lexer.js.map +1 -0
- package/dist/sql/parameter-manifest.d.ts +34 -0
- package/dist/sql/parameter-manifest.d.ts.map +1 -0
- package/dist/sql/parameter-manifest.js +150 -0
- package/dist/sql/parameter-manifest.js.map +1 -0
- package/dist/sql/prompt.d.ts +7 -1
- package/dist/sql/prompt.d.ts.map +1 -1
- package/dist/sql/prompt.js +24 -1
- package/dist/sql/prompt.js.map +1 -1
- package/dist/sql/sensitive-guardrail.d.ts +62 -0
- package/dist/sql/sensitive-guardrail.d.ts.map +1 -0
- package/dist/sql/sensitive-guardrail.js +876 -0
- package/dist/sql/sensitive-guardrail.js.map +1 -0
- package/dist/sql/tenant-guardrail.d.ts +70 -8
- package/dist/sql/tenant-guardrail.d.ts.map +1 -1
- package/dist/sql/tenant-guardrail.js +799 -52
- package/dist/sql/tenant-guardrail.js.map +1 -1
- package/dist/sql/tenant-hierarchy.d.ts +19 -0
- package/dist/sql/tenant-hierarchy.d.ts.map +1 -0
- package/dist/sql/tenant-hierarchy.js +53 -0
- package/dist/sql/tenant-hierarchy.js.map +1 -0
- package/dist/sql/tenant-placeholders.d.ts +60 -9
- package/dist/sql/tenant-placeholders.d.ts.map +1 -1
- package/dist/sql/tenant-placeholders.js +237 -63
- package/dist/sql/tenant-placeholders.js.map +1 -1
- package/dist/sql/tenant-prompt.d.ts +4 -0
- package/dist/sql/tenant-prompt.d.ts.map +1 -1
- package/dist/sql/tenant-prompt.js +79 -11
- package/dist/sql/tenant-prompt.js.map +1 -1
- package/dist/sql/tenant-scope-validate.d.ts +3 -1
- package/dist/sql/tenant-scope-validate.d.ts.map +1 -1
- package/dist/sql/tenant-scope-validate.js +5 -2
- package/dist/sql/tenant-scope-validate.js.map +1 -1
- package/dist/sql/validate.d.ts +24 -4
- package/dist/sql/validate.d.ts.map +1 -1
- package/dist/sql/validate.js +123 -83
- package/dist/sql/validate.js.map +1 -1
- package/package.json +9 -7
- package/dist/exec/postgres.d.ts +0 -6
- package/dist/exec/postgres.d.ts.map +0 -1
- package/dist/exec/postgres.js +0 -30
- package/dist/exec/postgres.js.map +0 -1
- package/dist/modes/post-execute-log.d.ts +0 -9
- package/dist/modes/post-execute-log.d.ts.map +0 -1
- package/dist/modes/post-execute-log.js +0 -26
- package/dist/modes/post-execute-log.js.map +0 -1
package/dist/ask.js
CHANGED
|
@@ -2,9 +2,14 @@ import { AskDbLogEvent } from "./logging/log-events.js";
|
|
|
2
2
|
import { DEFAULT_ASKDB_MODE } from "./modes/types.js";
|
|
3
3
|
import { synthesizeRetrievedDdl } from "./retrieval/synthesize-ddl.js";
|
|
4
4
|
import { getDialectSpec, isBuiltInDialectId, } from "./sql/dialect-spec.js";
|
|
5
|
-
import {
|
|
5
|
+
import { generateSelectSqlWithoutTenantGuardrail } from "./sql/generate.js";
|
|
6
|
+
import { enforceTenantGuardrails } from "./sql/tenant-guardrail.js";
|
|
6
7
|
import { resolveTenantSql, } from "./sql/tenant-placeholders.js";
|
|
8
|
+
import { subtreeRootIds } from "./sql/tenant-hierarchy.js";
|
|
7
9
|
import { validateTenantScope } from "./sql/tenant-scope-validate.js";
|
|
10
|
+
import { formatSensitiveReference, schemaHasSensitiveIdentifiers, validateSensitiveReferences, } from "./sql/sensitive-guardrail.js";
|
|
11
|
+
import { SensitiveReferenceError, TenantScopeError, UnknownDialectError, } from "./errors.js";
|
|
12
|
+
import { bindPreparedQuery, markerStyleForDialect, scanPlaceholders, sqlStructurallyEqual, } from "./sql/bind.js";
|
|
8
13
|
export async function ask(options) {
|
|
9
14
|
const logger = options.logger;
|
|
10
15
|
const mode = options.mode ?? DEFAULT_ASKDB_MODE;
|
|
@@ -19,13 +24,21 @@ export async function ask(options) {
|
|
|
19
24
|
enforcement: tenantPolicy.enforcement,
|
|
20
25
|
}, "tenant scope validated");
|
|
21
26
|
}
|
|
27
|
+
// A `subtree` scope is expanded to IDs per root here, before generation, so the
|
|
28
|
+
// prompt, guardrail, and placeholder substitution all see the same per-root
|
|
29
|
+
// access — and a missing or malformed resolver fails before any model call is spent.
|
|
30
|
+
const tenantScope = tenantPolicy && options.tenantScope
|
|
31
|
+
? await expandSubtreeScope(tenantPolicy, options.tenantScope, options.resolveTenantDescendants)
|
|
32
|
+
: options.tenantScope;
|
|
22
33
|
const explainRequested = options.explain ?? false;
|
|
23
34
|
const omitSensitive = options.omitSensitiveIdentifiersFromNlToSqlPrompt ?? false;
|
|
35
|
+
const parameterize = options.parameterize !== false; // default true
|
|
24
36
|
const prebuiltDdl = await maybeRetrieveDdl({
|
|
25
37
|
options,
|
|
26
38
|
logger,
|
|
27
39
|
omitSensitive,
|
|
28
40
|
});
|
|
41
|
+
const dialectSpec = resolveDialectSpec(options.dialect);
|
|
29
42
|
const dialect = resolveDialect(options.dialect);
|
|
30
43
|
const generated = await dialect.generate(options.question, options.schema, options.model, {
|
|
31
44
|
logger,
|
|
@@ -35,33 +48,394 @@ export async function ask(options) {
|
|
|
35
48
|
providerOptions: options.deps?.providerOptions,
|
|
36
49
|
prebuiltDdl,
|
|
37
50
|
tenantPolicy,
|
|
38
|
-
tenantScope
|
|
51
|
+
tenantScope,
|
|
52
|
+
// Custom AskDialect implementations ignore this; built-in path uses it.
|
|
53
|
+
parameterize: dialectSpec ? parameterize : undefined,
|
|
39
54
|
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
// result.sql is always the model's bound SQL (possibly with tenant literals/
|
|
56
|
+
// markers applied below). Never overwrite it with a re-bound version.
|
|
57
|
+
const result = { sql: generated.sql };
|
|
58
|
+
if (generated.explain !== undefined)
|
|
59
|
+
result.explain = generated.explain;
|
|
60
|
+
// With a tenant policy, `tenantGuardrail` is computed below, before tenant rendering;
|
|
61
|
+
// without one, pass through whatever a custom dialect reported.
|
|
62
|
+
if (!tenantPolicy && generated.tenantGuardrail !== undefined) {
|
|
63
|
+
result.tenantGuardrail = generated.tenantGuardrail;
|
|
64
|
+
}
|
|
48
65
|
if (generated.usage !== undefined)
|
|
49
66
|
result.usage = generated.usage;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
67
|
+
// Parameterize extras: build PreparedQuery, consistency-check via bindPreparedQuery,
|
|
68
|
+
// then populate result fields. Any failure drops extras only.
|
|
69
|
+
let businessParamCount = 0;
|
|
70
|
+
if (parameterize &&
|
|
71
|
+
dialectSpec &&
|
|
72
|
+
generated.unboundNamedSql &&
|
|
73
|
+
generated.parameterManifest &&
|
|
74
|
+
generated.parameterManifest.parameters.length > 0) {
|
|
75
|
+
const dialectId = dialectSpec.id;
|
|
76
|
+
const businessParams = generated.parameterManifest.parameters.map((p) => ({
|
|
77
|
+
name: p.name,
|
|
78
|
+
placeholder: `:${p.name}`,
|
|
79
|
+
type: p.type,
|
|
80
|
+
cardinality: p.cardinality,
|
|
81
|
+
description: p.description,
|
|
82
|
+
source: "question",
|
|
83
|
+
}));
|
|
84
|
+
// Tenant placeholders stay in namedSql for the host-facing PreparedQuery, but
|
|
85
|
+
// bindPreparedQuery requires every placeholder to be declared. For the
|
|
86
|
+
// consistency check we mask :tenant_* so only business values are substituted.
|
|
87
|
+
const maskedNamed = maskTenantPlaceholders(generated.unboundNamedSql);
|
|
88
|
+
const maskedBound = maskTenantPlaceholders(generated.sql);
|
|
89
|
+
const preparedForBind = {
|
|
90
|
+
version: 1,
|
|
91
|
+
dialect: dialectId,
|
|
92
|
+
namedSql: maskedNamed,
|
|
93
|
+
parameters: businessParams,
|
|
94
|
+
};
|
|
95
|
+
const values = {};
|
|
96
|
+
for (const p of generated.parameterManifest.parameters) {
|
|
97
|
+
values[p.name] = p.value;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const bound = bindPreparedQuery(preparedForBind, values);
|
|
101
|
+
if (!sqlStructurallyEqual(bound.sql, maskedBound)) {
|
|
102
|
+
logger?.debug?.({
|
|
103
|
+
event: AskDbLogEvent.PipelineParameterized,
|
|
104
|
+
parameterCount: 0,
|
|
105
|
+
listParameterCount: 0,
|
|
106
|
+
reason: "consistency_mismatch",
|
|
107
|
+
}, "parameterize extras dropped");
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const tenantDecls = scanTenantDecls(generated.unboundNamedSql);
|
|
111
|
+
const prepared = {
|
|
112
|
+
version: 1,
|
|
113
|
+
dialect: dialectId,
|
|
114
|
+
namedSql: generated.unboundNamedSql,
|
|
115
|
+
parameters: [...businessParams, ...tenantDecls],
|
|
116
|
+
};
|
|
117
|
+
result.preparedQuery = prepared;
|
|
118
|
+
result.parameters = bound.bindings.map((b) => ({
|
|
119
|
+
...b,
|
|
120
|
+
// Restore real placeholder text (masking only affected namedSql).
|
|
121
|
+
}));
|
|
122
|
+
result.unboundSql = unmaskTenantPlaceholders(bound.unboundSql);
|
|
123
|
+
result.params = bound.params;
|
|
124
|
+
businessParamCount = bound.params.length;
|
|
125
|
+
logger?.info({
|
|
126
|
+
event: AskDbLogEvent.PipelineParameterized,
|
|
127
|
+
parameterCount: bound.bindings.length,
|
|
128
|
+
listParameterCount: bound.bindings.filter((b) => b.cardinality === "many").length,
|
|
129
|
+
}, "parameterize extras attached");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
logger?.debug?.({
|
|
134
|
+
event: AskDbLogEvent.PipelineParameterized,
|
|
135
|
+
parameterCount: 0,
|
|
136
|
+
listParameterCount: 0,
|
|
137
|
+
reason: "bind_failed",
|
|
138
|
+
}, "parameterize extras dropped");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (tenantPolicy && tenantScope) {
|
|
142
|
+
// Tenant guardrail on the untrusted SQL, before rendering: the model's bound
|
|
143
|
+
// statement and its unbound block, with the `:tenant_<root>_ids` placeholders
|
|
144
|
+
// still in place. Rendering below only swaps each placeholder for literals or
|
|
145
|
+
// driver markers, so one check covers every tenantSqlMode, dialect and output
|
|
146
|
+
// form (#315). Runs for every dialect (built-in, DialectSpec, or custom
|
|
147
|
+
// AskDialect); the built-in generator skips its own check so this is the single
|
|
148
|
+
// report. `dialectSpec` is undefined for a custom AskDialect: the guardrail then
|
|
149
|
+
// requires the statement to pass under the standard-SQL, Postgres and MySQL readings.
|
|
150
|
+
result.tenantGuardrail = enforceTenantGuardrails([result.sql, generated.unboundNamedSql], tenantPolicy, tenantScope, logger, generated.tenantGuardrail, dialectSpec);
|
|
151
|
+
const tenantMode = options.tenantSqlMode ?? "sql-only";
|
|
152
|
+
// `sql` carries business values as inlined literals, so its only markers are
|
|
153
|
+
// tenant markers, numbered from the first slot: `sql` runs with `tenantParams`
|
|
154
|
+
// alone. `unboundSql` runs with the combined `params` (handled below).
|
|
155
|
+
const resolved = resolveTenantSql(result.sql, tenantPolicy, tenantScope, tenantMode, 1, dialectSpec);
|
|
53
156
|
result.sql = resolved.sql;
|
|
54
157
|
if (resolved.bindings.length > 0)
|
|
55
158
|
result.tenantBindings = resolved.bindings;
|
|
56
159
|
if (resolved.mode === "sql-params" && resolved.params.length > 0) {
|
|
57
160
|
result.tenantParams = resolved.params;
|
|
58
161
|
}
|
|
162
|
+
if (result.preparedQuery && result.unboundSql) {
|
|
163
|
+
if (tenantMode === "sql-only") {
|
|
164
|
+
const unboundWithTenant = resolveTenantSql(result.unboundSql, tenantPolicy, tenantScope, "sql-only", 1, dialectSpec);
|
|
165
|
+
result.unboundSql = unboundWithTenant.sql;
|
|
166
|
+
}
|
|
167
|
+
else if (!bindTenantIntoUnboundSql(result, {
|
|
168
|
+
namedSql: result.preparedQuery.namedSql,
|
|
169
|
+
businessParamCount,
|
|
170
|
+
tenantPolicy,
|
|
171
|
+
tenantScope,
|
|
172
|
+
dialectSpec,
|
|
173
|
+
})) {
|
|
174
|
+
dropParameterizeExtras(result);
|
|
175
|
+
logger?.debug?.({
|
|
176
|
+
event: AskDbLogEvent.PipelineParameterized,
|
|
177
|
+
parameterCount: 0,
|
|
178
|
+
listParameterCount: 0,
|
|
179
|
+
reason: "tenant_param_alignment",
|
|
180
|
+
}, "parameterize extras dropped");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
59
183
|
}
|
|
184
|
+
applySensitiveGuardrail(result, options, dialectSpec, logger);
|
|
60
185
|
return result;
|
|
61
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Replace a `subtree` access with the per-root access it expands to: `multi_root`
|
|
189
|
+
* with one entry per root the subtree covers (the scope's root first, then its
|
|
190
|
+
* descendant roots breadth-first), including a level with no IDs (`ids: []`), or `ids`
|
|
191
|
+
* when the subtree is the scope's root alone. Other access kinds pass through untouched.
|
|
192
|
+
*
|
|
193
|
+
* Each root's IDs stay under that root, so they bind only to its own placeholder:
|
|
194
|
+
* root tables have separate ID spaces, and folding a client ID into the agency
|
|
195
|
+
* placeholder would match another agency (#338). This relies on every root deriving a distinct
|
|
196
|
+
* placeholder, which `validateTenantScope()` and the policy loader enforce. The seeds are unioned into the
|
|
197
|
+
* `tenantRoot` entry here, not trusted to the resolver, so an ancestor never loses
|
|
198
|
+
* its own rows when a host returns strict descendants only.
|
|
199
|
+
*
|
|
200
|
+
* Fails closed with `SUBTREE_NOT_RESOLVABLE`: no resolver; a result that is an
|
|
201
|
+
* array (the old flat shape) or not a plain object; a key that isn't a root in
|
|
202
|
+
* this subtree; a value that isn't an array of non-empty strings; or no IDs at all.
|
|
203
|
+
*/
|
|
204
|
+
async function expandSubtreeScope(policy, scope, resolve) {
|
|
205
|
+
const access = scope.access;
|
|
206
|
+
if (access.kind !== "subtree")
|
|
207
|
+
return scope;
|
|
208
|
+
const { tenantRoot, rootIds } = access;
|
|
209
|
+
const levels = subtreeRootIds(policy, tenantRoot);
|
|
210
|
+
const shape = `{ ${levels.map((root) => `"${root}": [...]`).join(", ")} }`;
|
|
211
|
+
const fail = (message) => new TenantScopeError(message, "SUBTREE_NOT_RESOLVABLE");
|
|
212
|
+
if (!resolve) {
|
|
213
|
+
throw fail(`tenantScope.access is a 'subtree' of '${tenantRoot}', but no ` +
|
|
214
|
+
"resolveTenantDescendants was passed to ask(). AskDB does not query your database " +
|
|
215
|
+
"to find descendants: pass resolveTenantDescendants to expand the seed IDs, or pass " +
|
|
216
|
+
"an 'ids' or 'multi_root' access with each root's IDs already expanded.");
|
|
217
|
+
}
|
|
218
|
+
const result = await resolve(tenantRoot, rootIds);
|
|
219
|
+
if (Array.isArray(result)) {
|
|
220
|
+
throw fail(`resolveTenantDescendants for '${tenantRoot}' returned an array. It must return IDs per ` +
|
|
221
|
+
`tenant root, keyed by root table id: ${shape}. Root tables have separate ID spaces, so ` +
|
|
222
|
+
"a flat list can't say which root each ID belongs to, and binding them all to " +
|
|
223
|
+
`'${tenantRoot}' would match other tenants. Put the seeds and any same-table ` +
|
|
224
|
+
`descendants under '${tenantRoot}', and each descendant root's IDs under that root.`);
|
|
225
|
+
}
|
|
226
|
+
if (!isPlainObject(result)) {
|
|
227
|
+
throw fail(`resolveTenantDescendants for '${tenantRoot}' must return an object mapping each ` +
|
|
228
|
+
`tenant root in the subtree to its IDs: ${shape}.`);
|
|
229
|
+
}
|
|
230
|
+
// Read the result exactly once: validate and build from this snapshot, so a getter
|
|
231
|
+
// can't return one value to validation and another to the scope, and a property
|
|
232
|
+
// validation can't see (non-enumerable) is never read at all.
|
|
233
|
+
const idsByRoot = new Map();
|
|
234
|
+
const knownRoots = new Set(policy.roots.map((root) => root.id));
|
|
235
|
+
let returned = 0;
|
|
236
|
+
for (const [root, value] of Object.entries(result)) {
|
|
237
|
+
const ids = Array.isArray(value) ? [...value] : value;
|
|
238
|
+
if (!knownRoots.has(root)) {
|
|
239
|
+
throw fail(`resolveTenantDescendants returned IDs under a key the subtree can't have: '${root}' is ` +
|
|
240
|
+
`not a tenant root in the policy. Allowed keys for a subtree of '${tenantRoot}': ` +
|
|
241
|
+
`${levels.join(", ")}.`);
|
|
242
|
+
}
|
|
243
|
+
if (!levels.includes(root)) {
|
|
244
|
+
throw fail(`resolveTenantDescendants returned IDs under a key the subtree can't have: '${root}' is ` +
|
|
245
|
+
`not in the subtree of '${tenantRoot}' (the policy's hierarchy doesn't reach it from ` +
|
|
246
|
+
`there). Allowed keys: ${levels.join(", ")}.`);
|
|
247
|
+
}
|
|
248
|
+
if (!isTenantIdArray(ids)) {
|
|
249
|
+
throw fail(`resolveTenantDescendants: the IDs for '${root}' must be an array of non-empty strings.`);
|
|
250
|
+
}
|
|
251
|
+
idsByRoot.set(root, ids);
|
|
252
|
+
returned += ids.length;
|
|
253
|
+
}
|
|
254
|
+
if (returned === 0) {
|
|
255
|
+
throw fail(`resolveTenantDescendants returned no IDs for '${tenantRoot}' (seeds: ${rootIds.join(", ")}). ` +
|
|
256
|
+
`Return at least the seeds under '${tenantRoot}'; refusing to build an empty tenant scope.`);
|
|
257
|
+
}
|
|
258
|
+
// Every level the subtree covers stays in the scope, even one with no IDs. The
|
|
259
|
+
// guardrail then checks a read of that root on its own placeholder, and binding that
|
|
260
|
+
// placeholder fails closed (UNRESOLVED_TENANT_PLACEHOLDER). Dropping the level would
|
|
261
|
+
// leave its rows readable through a parent's foreign key or an ancestor, which is
|
|
262
|
+
// less restricted than a level the resolver narrowed to some IDs.
|
|
263
|
+
const scopes = levels.map((root) => {
|
|
264
|
+
const own = idsByRoot.get(root) ?? [];
|
|
265
|
+
return { tenantRoot: root, ids: [...new Set(root === tenantRoot ? [...rootIds, ...own] : own)] };
|
|
266
|
+
});
|
|
267
|
+
const expanded = scopes.length === 1 ? { kind: "ids", ...scopes[0] } : { kind: "multi_root", scopes };
|
|
268
|
+
return { ...scope, access: expanded };
|
|
269
|
+
}
|
|
270
|
+
function isTenantIdArray(value) {
|
|
271
|
+
return Array.isArray(value) && value.every((id) => typeof id === "string" && id.length > 0);
|
|
272
|
+
}
|
|
273
|
+
function isPlainObject(value) {
|
|
274
|
+
if (typeof value !== "object" || value === null)
|
|
275
|
+
return false;
|
|
276
|
+
const proto = Object.getPrototypeOf(value);
|
|
277
|
+
return proto === Object.prototype || proto === null;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Run the sensitive-identifier guardrail over the SQL the host is about to receive.
|
|
281
|
+
* Runs after tenant resolution so it sees exactly the statement in `result.sql`.
|
|
282
|
+
* With a built-in id or `DialectSpec`, the SQL is lexed the way that engine reads it;
|
|
283
|
+
* for a custom `AskDialect` (no spec) references are unioned across every built-in reading.
|
|
284
|
+
*/
|
|
285
|
+
function applySensitiveGuardrail(result, options, dialectSpec, logger) {
|
|
286
|
+
const mode = options.sensitiveGuardrailMode ?? "warn";
|
|
287
|
+
if (mode === "off")
|
|
288
|
+
return;
|
|
289
|
+
if (!schemaHasSensitiveIdentifiers(options.schema))
|
|
290
|
+
return;
|
|
291
|
+
try {
|
|
292
|
+
const guardrail = validateSensitiveReferences(result.sql, options.schema, {
|
|
293
|
+
mode,
|
|
294
|
+
dialect: dialectSpec,
|
|
295
|
+
});
|
|
296
|
+
result.sensitiveGuardrail = guardrail;
|
|
297
|
+
logSensitiveReferences(logger, guardrail.references);
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
if (error instanceof SensitiveReferenceError) {
|
|
301
|
+
logSensitiveReferences(logger, error.references);
|
|
302
|
+
}
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function logSensitiveReferences(logger, references) {
|
|
307
|
+
if (references.length === 0)
|
|
308
|
+
return;
|
|
309
|
+
const sensitiveColumns = references.map(formatSensitiveReference);
|
|
310
|
+
logger?.info({
|
|
311
|
+
event: AskDbLogEvent.PipelineSensitiveSqlWarning,
|
|
312
|
+
sensitiveColumnCount: sensitiveColumns.length,
|
|
313
|
+
sensitiveColumns,
|
|
314
|
+
}, "generated SQL references sensitive identifiers");
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Substitute tenant placeholders in `result.unboundSql` with driver markers and
|
|
318
|
+
* fold their values into `result.params`, so `unboundSql` + `params` is a single
|
|
319
|
+
* executable pair (`sql-params` mode).
|
|
320
|
+
*
|
|
321
|
+
* - `$N` / `@pN` dialects: markers are explicitly numbered, so tenant markers
|
|
322
|
+
* continue after the business slots and tenant values are appended.
|
|
323
|
+
* - `?` dialects: markers are positional, so `params` must follow source order.
|
|
324
|
+
* Business and tenant values are interleaved by walking the named template in
|
|
325
|
+
* order, and `parameters[].indices` are remapped to the new positions.
|
|
326
|
+
*
|
|
327
|
+
* Returns false when the business binding and the tenant substitution disagree
|
|
328
|
+
* about the statement's shape; the caller then drops the extras rather than ship
|
|
329
|
+
* misaligned params.
|
|
330
|
+
*/
|
|
331
|
+
function bindTenantIntoUnboundSql(result, ctx) {
|
|
332
|
+
if (result.unboundSql === undefined)
|
|
333
|
+
return false;
|
|
334
|
+
const unbound = resolveTenantSql(result.unboundSql, ctx.tenantPolicy, ctx.tenantScope, "sql-params", ctx.businessParamCount + 1, ctx.dialectSpec);
|
|
335
|
+
if (unbound.mode !== "sql-params")
|
|
336
|
+
return false;
|
|
337
|
+
const business = result.params ?? [];
|
|
338
|
+
const tenantValues = unbound.params;
|
|
339
|
+
const dialectId = ctx.dialectSpec?.id;
|
|
340
|
+
const style = dialectId !== undefined && isBuiltInDialectId(dialectId)
|
|
341
|
+
? markerStyleForDialect(dialectId)
|
|
342
|
+
: "dollar";
|
|
343
|
+
if (style !== "question") {
|
|
344
|
+
result.unboundSql = unbound.sql;
|
|
345
|
+
result.params = [...business, ...tenantValues];
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
const idsByPlaceholder = new Map(unbound.bindings.map((b) => [b.placeholder, b.ids]));
|
|
349
|
+
const bindingByName = new Map((result.parameters ?? []).map((b) => [b.name, b]));
|
|
350
|
+
// Same lexer reading as bindPreparedQuery and the tenant substitution above.
|
|
351
|
+
const occurrences = scanPlaceholders(ctx.namedSql, ctx.dialectSpec);
|
|
352
|
+
const occurrenceCount = new Map();
|
|
353
|
+
for (const occ of occurrences) {
|
|
354
|
+
occurrenceCount.set(occ.name, (occurrenceCount.get(occ.name) ?? 0) + 1);
|
|
355
|
+
}
|
|
356
|
+
const combined = [];
|
|
357
|
+
const indexMap = new Map();
|
|
358
|
+
const seen = new Map();
|
|
359
|
+
for (const occ of occurrences) {
|
|
360
|
+
const tenantIds = idsByPlaceholder.get(occ.placeholder);
|
|
361
|
+
if (tenantIds) {
|
|
362
|
+
combined.push(...tenantIds);
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
// bindPreparedQuery pushes each occurrence's values contiguously, in source
|
|
366
|
+
// order, so occurrence k of a name owns the k-th equal slice of its indices.
|
|
367
|
+
const binding = bindingByName.get(occ.name);
|
|
368
|
+
const total = occurrenceCount.get(occ.name);
|
|
369
|
+
if (!binding || binding.indices.length % total !== 0)
|
|
370
|
+
return false;
|
|
371
|
+
const per = binding.indices.length / total;
|
|
372
|
+
const k = seen.get(occ.name) ?? 0;
|
|
373
|
+
seen.set(occ.name, k + 1);
|
|
374
|
+
for (const idx of binding.indices.slice(k * per, (k + 1) * per)) {
|
|
375
|
+
if (idx >= business.length || indexMap.has(idx))
|
|
376
|
+
return false;
|
|
377
|
+
indexMap.set(idx, combined.length);
|
|
378
|
+
combined.push(business[idx]);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (indexMap.size !== business.length ||
|
|
382
|
+
combined.length !== business.length + tenantValues.length) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
result.unboundSql = unbound.sql;
|
|
386
|
+
result.params = combined;
|
|
387
|
+
if (result.parameters) {
|
|
388
|
+
result.parameters = result.parameters.map((b) => ({
|
|
389
|
+
...b,
|
|
390
|
+
indices: b.indices.map((i) => indexMap.get(i)),
|
|
391
|
+
}));
|
|
392
|
+
}
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
function dropParameterizeExtras(result) {
|
|
396
|
+
delete result.unboundSql;
|
|
397
|
+
delete result.params;
|
|
398
|
+
delete result.parameters;
|
|
399
|
+
delete result.preparedQuery;
|
|
400
|
+
}
|
|
401
|
+
const TENANT_MASK_RE = /:tenant_([a-z0-9_]+)_ids/g;
|
|
402
|
+
const TENANT_UNMASK_RE = /__askdb_tenant_([a-z0-9_]+)_ids__/g;
|
|
403
|
+
function maskTenantPlaceholders(sql) {
|
|
404
|
+
return sql.replace(TENANT_MASK_RE, "__askdb_tenant_$1_ids__");
|
|
405
|
+
}
|
|
406
|
+
function unmaskTenantPlaceholders(sql) {
|
|
407
|
+
return sql.replace(TENANT_UNMASK_RE, ":tenant_$1_ids");
|
|
408
|
+
}
|
|
409
|
+
function scanTenantDecls(namedSql) {
|
|
410
|
+
const seen = new Set();
|
|
411
|
+
const out = [];
|
|
412
|
+
for (const m of namedSql.matchAll(/:tenant_([a-z0-9_]+)_ids/g)) {
|
|
413
|
+
const name = `tenant_${m[1]}_ids`;
|
|
414
|
+
if (seen.has(name))
|
|
415
|
+
continue;
|
|
416
|
+
seen.add(name);
|
|
417
|
+
out.push({
|
|
418
|
+
name,
|
|
419
|
+
placeholder: `:${name}`,
|
|
420
|
+
type: "string",
|
|
421
|
+
cardinality: "many",
|
|
422
|
+
source: "tenant",
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
return out;
|
|
426
|
+
}
|
|
62
427
|
function isAskDialect(value) {
|
|
63
428
|
return typeof value.generate === "function";
|
|
64
429
|
}
|
|
430
|
+
/** Return the DialectSpec when the input is a built-in id or spec; undefined for custom AskDialect. */
|
|
431
|
+
function resolveDialectSpec(input) {
|
|
432
|
+
if (typeof input === "string") {
|
|
433
|
+
return isBuiltInDialectId(input) ? getDialectSpec(input) : undefined;
|
|
434
|
+
}
|
|
435
|
+
if (isAskDialect(input))
|
|
436
|
+
return undefined;
|
|
437
|
+
return input;
|
|
438
|
+
}
|
|
65
439
|
/**
|
|
66
440
|
* Normalize an {@link AskDialectInput} to an {@link AskDialect}. Built-in ids
|
|
67
441
|
* and {@link DialectSpec}s are wrapped around the centralized
|
|
@@ -70,7 +444,7 @@ function isAskDialect(value) {
|
|
|
70
444
|
function resolveDialect(input) {
|
|
71
445
|
if (typeof input === "string") {
|
|
72
446
|
if (!isBuiltInDialectId(input)) {
|
|
73
|
-
throw new
|
|
447
|
+
throw new UnknownDialectError(`Unknown dialect id '${input}'. Pass a built-in DialectId, a DialectSpec object, or a custom AskDialect.`, input);
|
|
74
448
|
}
|
|
75
449
|
return specToDialect(getDialectSpec(input));
|
|
76
450
|
}
|
|
@@ -80,7 +454,9 @@ function resolveDialect(input) {
|
|
|
80
454
|
}
|
|
81
455
|
function specToDialect(spec) {
|
|
82
456
|
return {
|
|
83
|
-
|
|
457
|
+
// ask() runs the tenant guardrail itself on the final SQL, so the built-in
|
|
458
|
+
// generator's copy is skipped to avoid a second (pre-substitution) report.
|
|
459
|
+
generate: (question, schema, model, options) => generateSelectSqlWithoutTenantGuardrail(spec, question, schema, model, options),
|
|
84
460
|
};
|
|
85
461
|
}
|
|
86
462
|
/** Default chunk-count threshold below which the full DDL is preferred. */
|
package/dist/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -6,7 +6,11 @@ export declare class SchemaParseError extends AskDbError {
|
|
|
6
6
|
constructor(message: string, cause?: unknown);
|
|
7
7
|
}
|
|
8
8
|
/** Machine-readable ids for CLI and logs (Phase 2 guardrails). */
|
|
9
|
-
export type SqlValidationRuleCode = "SQL_EMPTY" | "SQL_MULTI_STATEMENT" | "SQL_COMMENT" | "SQL_NOT_SELECT_OR_WITH" | "SQL_FORBIDDEN_KEYWORD"
|
|
9
|
+
export type SqlValidationRuleCode = "SQL_EMPTY" | "SQL_MULTI_STATEMENT" | "SQL_COMMENT" | "SQL_NOT_SELECT_OR_WITH" | "SQL_FORBIDDEN_KEYWORD"
|
|
10
|
+
/** A call to a function in the dialect's `blockedFunctions` (e.g. `pg_sleep(`, `LOAD_FILE(`). */
|
|
11
|
+
| "SQL_FORBIDDEN_FUNCTION"
|
|
12
|
+
/** A string, quoted identifier, dollar-quoted string, or block comment never closes. */
|
|
13
|
+
| "SQL_UNTERMINATED";
|
|
10
14
|
export declare class SqlValidationError extends AskDbError {
|
|
11
15
|
readonly rule: SqlValidationRuleCode;
|
|
12
16
|
/** Extra human context (why the rule exists, remediation). */
|
|
@@ -18,11 +22,39 @@ export declare class SqlValidationError extends AskDbError {
|
|
|
18
22
|
export declare class SqlGenerationError extends AskDbError {
|
|
19
23
|
constructor(message: string, cause?: unknown);
|
|
20
24
|
}
|
|
21
|
-
|
|
25
|
+
/** A string `dialect` passed to `ask()` that is not a built-in dialect id. */
|
|
26
|
+
export declare class UnknownDialectError extends AskDbError {
|
|
27
|
+
readonly dialectId: string;
|
|
28
|
+
constructor(message: string, dialectId: string);
|
|
29
|
+
}
|
|
30
|
+
export type TenantScopeRejectionReason = "MISSING_SCOPE" | "UNKNOWN_TENANT_ROOT" | "GLOBAL_WITHOUT_REASON" | "INVALID_SCOPE_SHAPE"
|
|
31
|
+
/**
|
|
32
|
+
* A `subtree` scope could not be expanded: no `resolveTenantDescendants`, or it
|
|
33
|
+
* returned something other than IDs per tenant root (a flat array, a key that
|
|
34
|
+
* isn't a root in the subtree, a value that isn't an array of non-empty strings,
|
|
35
|
+
* or no IDs at all). Also thrown when an unexpanded `subtree` reaches
|
|
36
|
+
* `resolveTenantSql()` or `buildTenantPromptBlock()` directly.
|
|
37
|
+
*/
|
|
38
|
+
| "SUBTREE_NOT_RESOLVABLE"
|
|
39
|
+
/** Generated SQL references a `:tenant_*` placeholder the scope has no IDs for. */
|
|
40
|
+
| "UNRESOLVED_TENANT_PLACEHOLDER"
|
|
41
|
+
/** A multi-ID scope met a tenant predicate with no list form (e.g. `<=`). */
|
|
42
|
+
| "UNSUPPORTED_TENANT_PREDICATE"
|
|
43
|
+
/**
|
|
44
|
+
* `resolveTenantSql()` in `sql-only` mode got a tenant ID containing a backslash
|
|
45
|
+
* and a dialect with an unknown `id` and no `backslashEscapes`, so it cannot
|
|
46
|
+
* escape the ID safely.
|
|
47
|
+
*/
|
|
48
|
+
| "UNESCAPABLE_TENANT_ID";
|
|
22
49
|
export declare class TenantScopeError extends AskDbError {
|
|
23
50
|
readonly reason: TenantScopeRejectionReason;
|
|
24
51
|
constructor(message: string, reason: TenantScopeRejectionReason);
|
|
25
52
|
}
|
|
53
|
+
export type QueryParameterRejectionReason = "INVALID_NAME" | "RESERVED_NAME" | "INVALID_VALUE" | "MISSING_VALUE" | "UNRESOLVED_PLACEHOLDER" | "INVALID_LIST_CONTEXT" | "DIALECT_UNSUPPORTED";
|
|
54
|
+
export declare class QueryParameterError extends AskDbError {
|
|
55
|
+
readonly reason: QueryParameterRejectionReason;
|
|
56
|
+
constructor(message: string, reason: QueryParameterRejectionReason);
|
|
57
|
+
}
|
|
26
58
|
export type TenantGuardrailRuleCode = "MISSING_TENANT_PREDICATE" | "MISSING_TYPE_DISCRIMINATOR" | "INCOMPATIBLE_JOIN_SCOPES" | "UNKNOWN_TABLE_REFERENCED" | "CROSS_TENANT_WITHOUT_GLOBAL" | "UNPROVABLE_SCOPE";
|
|
27
59
|
export type TenantGuardrailWarning = {
|
|
28
60
|
rule: TenantGuardrailRuleCode;
|
|
@@ -33,4 +65,57 @@ export declare class TenantGuardrailError extends AskDbError {
|
|
|
33
65
|
readonly warnings: TenantGuardrailWarning[];
|
|
34
66
|
constructor(message: string, warnings: TenantGuardrailWarning[]);
|
|
35
67
|
}
|
|
68
|
+
/** How a sensitive identifier was matched inside a statement. */
|
|
69
|
+
export type SensitiveMatchKind =
|
|
70
|
+
/**
|
|
71
|
+
* `table.column` or `alias.column` where the alias binds to the owning table. Also
|
|
72
|
+
* `alias.*` and whole-row references such as `row_to_json(alias)`, which reach every
|
|
73
|
+
* sensitive column of the table.
|
|
74
|
+
*/
|
|
75
|
+
"qualified"
|
|
76
|
+
/**
|
|
77
|
+
* Bare `column`, counted only because the owning table is in the statement's scope.
|
|
78
|
+
* Also a bare `SELECT *`, which reaches every sensitive column of the in-scope tables.
|
|
79
|
+
*/
|
|
80
|
+
| "unqualified"
|
|
81
|
+
/** The sensitive table itself appears as a `FROM`/`JOIN` target (`column` is `"*"`). */
|
|
82
|
+
| "table";
|
|
83
|
+
/** A sensitive table/column the statement was found to reference. */
|
|
84
|
+
export type SensitiveReference = {
|
|
85
|
+
/** Table name exactly as spelled in the schema artifact (never schema-qualified). */
|
|
86
|
+
table: string;
|
|
87
|
+
/** Database schema (namespace) the table belongs to, when the artifact records one. */
|
|
88
|
+
schema?: string;
|
|
89
|
+
/** Column name, or `"*"` when `matchKind` is `"table"`. */
|
|
90
|
+
column: string;
|
|
91
|
+
matchKind: SensitiveMatchKind;
|
|
92
|
+
};
|
|
93
|
+
/** Why the statement's table scope could not be resolved with confidence. */
|
|
94
|
+
export type SensitiveScopeIssue =
|
|
95
|
+
/** No `FROM`/`JOIN` target resolved, so unqualified names cannot be bound to a table. */
|
|
96
|
+
"NO_TABLE_SOURCE"
|
|
97
|
+
/** A `qualifier.column` reference whose qualifier is neither a known table, alias, nor CTE. */
|
|
98
|
+
| "UNKNOWN_QUALIFIER"
|
|
99
|
+
/** A table source that is not a relation name (table function, `VALUES`, …). */
|
|
100
|
+
| "OPAQUE_TABLE_SOURCE"
|
|
101
|
+
/** A string, quoted identifier, or comment never closes, so the rest of the statement could not be scanned. */
|
|
102
|
+
| "UNTERMINATED_TOKEN";
|
|
103
|
+
/** Conservative-failure report attached when scope resolution was incomplete. */
|
|
104
|
+
export type SensitiveScopeReport = {
|
|
105
|
+
issues: SensitiveScopeIssue[];
|
|
106
|
+
/**
|
|
107
|
+
* True when at least one unqualified name was matched against *every* sensitive
|
|
108
|
+
* column in the schema rather than only the columns of in-scope tables.
|
|
109
|
+
*/
|
|
110
|
+
widened: boolean;
|
|
111
|
+
message: string;
|
|
112
|
+
};
|
|
113
|
+
/** Machine-readable ids for the sensitive-identifier guardrail (mirrors {@link TenantGuardrailRuleCode}). */
|
|
114
|
+
export type SensitiveReferenceRuleCode = "SENSITIVE_TABLE_REFERENCED" | "SENSITIVE_COLUMN_REFERENCED" | "UNRESOLVED_TABLE_SCOPE";
|
|
115
|
+
export declare class SensitiveReferenceError extends AskDbError {
|
|
116
|
+
readonly rule: SensitiveReferenceRuleCode;
|
|
117
|
+
readonly references: SensitiveReference[];
|
|
118
|
+
readonly unresolvedScope?: SensitiveScopeReport | undefined;
|
|
119
|
+
constructor(message: string, rule: SensitiveReferenceRuleCode, references: SensitiveReference[], unresolvedScope?: SensitiveScopeReport | undefined);
|
|
120
|
+
}
|
|
36
121
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;aAGjB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED,qBAAa,gBAAiB,SAAQ,UAAU;gBAClC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,kEAAkE;AAClE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,qBAAqB,GACrB,aAAa,GACb,wBAAwB,GACxB,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|