@askdb/core 1.0.0-beta.42 → 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 +6 -4
- package/dist/ask.d.ts +92 -4
- package/dist/ask.d.ts.map +1 -1
- package/dist/ask.js +234 -23
- package/dist/ask.js.map +1 -1
- package/dist/errors.d.ts +41 -5
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.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 +17 -15
- package/dist/sql/bind.d.ts.map +1 -1
- package/dist/sql/bind.js +34 -172
- package/dist/sql/bind.js.map +1 -1
- package/dist/sql/dialect-spec.d.ts +21 -2
- package/dist/sql/dialect-spec.d.ts.map +1 -1
- package/dist/sql/dialect-spec.js +74 -3
- package/dist/sql/dialect-spec.js.map +1 -1
- package/dist/sql/generate.d.ts +12 -0
- package/dist/sql/generate.d.ts.map +1 -1
- package/dist/sql/generate.js +24 -16
- package/dist/sql/generate.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/sensitive-guardrail.d.ts +18 -3
- package/dist/sql/sensitive-guardrail.d.ts.map +1 -1
- package/dist/sql/sensitive-guardrail.js +440 -153
- package/dist/sql/sensitive-guardrail.js.map +1 -1
- 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 -10
- package/dist/sql/tenant-placeholders.d.ts.map +1 -1
- package/dist/sql/tenant-placeholders.js +229 -58
- 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 -37
- package/dist/sql/validate.js.map +1 -1
- package/package.json +6 -5
- 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/README.md
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Dialect-agnostic NL→SQL pipeline for AskDB. Provides `ask()` orchestration, schema/IR types, modes, logging, and retrieval input. Bring your own dialect adapter (e.g. `@askdb/postgres`) and your own model.
|
|
4
4
|
|
|
5
|
-
> **Status:** pre-1.0. `0.3.0` moved the Postgres dialect and `@askdb/core/postgres` to `@askdb/postgres`. Runtime AI provider construction lives in `@askdb/ai`; core remains BYO-model and does not read `process.env`. See [`docs/adrs/0002-integration-package-layout.md`](
|
|
5
|
+
> **Status:** pre-1.0. `0.3.0` moved the Postgres dialect and `@askdb/core/postgres` to `@askdb/postgres`. Runtime AI provider construction lives in `@askdb/ai`; core remains BYO-model and does not read `process.env`. See [`docs/adrs/0002-integration-package-layout.md`](https://github.com/Ygilany/AskDB/blob/main/docs/adrs/0002-integration-package-layout.md), [`docs/adrs/0005-askdb-config-and-env-bootstrap.md`](https://github.com/Ygilany/AskDB/blob/main/docs/adrs/0005-askdb-config-and-env-bootstrap.md), and [`docs/adrs/0006-ai-provider-integration-strategy.md`](https://github.com/Ygilany/AskDB/blob/main/docs/adrs/0006-ai-provider-integration-strategy.md).
|
|
6
|
+
|
|
7
|
+
> **Security model:** `ask()` returns SQL and never executes it. Its SQL checks (single `SELECT`/`WITH` statement (with a SQL Server caveat), no comments, no write/DDL keywords, no known side-effecting functions, and the tenant and sensitive-column checks) are heuristic defense in depth that catch common model mistakes. The read-only and sensitive-column checks use a dialect-aware lexer; the tenant check uses a simpler scanner of its own ([#342](https://github.com/Ygilany/AskDB/issues/342)). They are not a SQL parser and not a security boundary. Run generated SQL under a read-only, least-privilege database role and enforce tenant isolation in the database. See [Safety boundaries](https://askdb.tools/concepts/safety-boundaries/).
|
|
6
8
|
|
|
7
9
|
## Install
|
|
8
10
|
|
|
@@ -19,11 +21,11 @@ pnpm add @askdb/ai-openai
|
|
|
19
21
|
|
|
20
22
|
`@askdb/core` itself does not depend on `pg`. The optional `pg` peer lives on `@askdb/postgres` for live Postgres introspection.
|
|
21
23
|
|
|
22
|
-
Runtime AI configuration helpers live in `@askdb/ai` and provider adapters such as `@askdb/ai-openai`. If you use [`@askdb/config`](
|
|
24
|
+
Runtime AI configuration helpers live in `@askdb/ai` and provider adapters such as `@askdb/ai-openai`. If you use [`@askdb/config`](https://github.com/Ygilany/AskDB/blob/main/packages/config/README.md), call `bootstrapAskDbEnv()`, create an AI registry, then pass **`getAskDbRuntimeConfig().ai.aiEnv`** to `registry.createLanguageModelFromEnv(...)`.
|
|
23
25
|
|
|
24
26
|
## Schema format
|
|
25
27
|
|
|
26
|
-
`@askdb/core` uses **Schema v2** — a split artifact designed for business-context enrichment and RAG chunking. See [`docs/contracts/schema-v2.md`](
|
|
28
|
+
`@askdb/core` uses **Schema v2** — a split artifact designed for business-context enrichment and RAG chunking. See [`docs/contracts/schema-v2.md`](https://github.com/Ygilany/AskDB/blob/main/docs/contracts/schema-v2.md) for the full contract.
|
|
27
29
|
|
|
28
30
|
### Directory layout
|
|
29
31
|
|
|
@@ -100,7 +102,7 @@ Key rules:
|
|
|
100
102
|
|
|
101
103
|
## What you get
|
|
102
104
|
|
|
103
|
-
- `ask({ question, schema, model, dialect })` — generate
|
|
105
|
+
- `ask({ question, schema, model, dialect })` — generate checked SQL (plus optional `unboundSql` / `params` / `parameters` / `preparedQuery`).
|
|
104
106
|
- `bindPreparedQuery(prepared, values)` — pure local rebind of a `PreparedQuery` (no model call).
|
|
105
107
|
- `AskDbLanguageModel` — AskDB's public name for the AI SDK language model contract.
|
|
106
108
|
- `AskDialect` — the dialect adapter contract. `@askdb/postgres` exports a ready-made one.
|
package/dist/ask.d.ts
CHANGED
|
@@ -31,10 +31,16 @@ export type AskUsage = {
|
|
|
31
31
|
completionTokens: number | null;
|
|
32
32
|
totalTokens: number | null;
|
|
33
33
|
};
|
|
34
|
-
/** Output of a dialect's generator:
|
|
34
|
+
/** Output of a dialect's generator: the generated SQL plus optional dialect-specific explain metadata. */
|
|
35
35
|
export type AskDialectGenerateResult = {
|
|
36
36
|
sql: string;
|
|
37
37
|
explain?: unknown;
|
|
38
|
+
/**
|
|
39
|
+
* Optional tenant guardrail result from a custom generator. When the schema has a
|
|
40
|
+
* tenant policy, `ask()` merges its warnings into its own check of `sql` and
|
|
41
|
+
* `unboundNamedSql` (before tenant rendering); it can add failures but never replace
|
|
42
|
+
* or relax that check.
|
|
43
|
+
*/
|
|
38
44
|
tenantGuardrail?: import("./sql/tenant-guardrail.js").TenantGuardrailResult;
|
|
39
45
|
usage?: AskUsage;
|
|
40
46
|
unboundNamedSql?: string;
|
|
@@ -48,6 +54,19 @@ export type AskDialectGenerateResult = {
|
|
|
48
54
|
* a {@link DialectSpec} to `ask({ dialect })` and let the centralized pipeline
|
|
49
55
|
* handle prompt assembly + validation. Implement `AskDialect` only when those
|
|
50
56
|
* defaults won't fit.
|
|
57
|
+
*
|
|
58
|
+
* Safety responsibilities:
|
|
59
|
+
* - **Read-only validation is yours.** `ask()` does not run the SELECT-only
|
|
60
|
+
* validator on SQL returned by a custom dialect (custom dialects may target
|
|
61
|
+
* non-SELECT statements on purpose). If your generator should only emit
|
|
62
|
+
* read-only SQL, call the exported `validateSelectSql(spec, sql)` yourself
|
|
63
|
+
* before returning.
|
|
64
|
+
* - **Tenant enforcement is not yours to skip.** When the schema has a tenant
|
|
65
|
+
* policy, `ask()` runs the tenant guardrail on the returned `sql` (and
|
|
66
|
+
* `unboundNamedSql`), with its `:tenant_<root>_ids` placeholders still in place,
|
|
67
|
+
* then substitutes them, regardless of dialect; `strict` policies throw
|
|
68
|
+
* `TenantGuardrailError`. A `tenantGuardrail` your
|
|
69
|
+
* generator returns is merged into that result, never used in place of it.
|
|
51
70
|
*/
|
|
52
71
|
export type AskDialect = {
|
|
53
72
|
generate(question: string, schema: AnyNormalizedSchema, model: AskDbLanguageModel, options?: AskDialectGenerateOptions): Promise<AskDialectGenerateResult>;
|
|
@@ -71,6 +90,28 @@ export type AskGenerateDeps = {
|
|
|
71
90
|
*/
|
|
72
91
|
providerOptions?: Record<string, unknown>;
|
|
73
92
|
};
|
|
93
|
+
/**
|
|
94
|
+
* A subtree's IDs grouped by tenant root: each key is a root table id from the
|
|
95
|
+
* tenant policy (`"table:public.clients"`), and its value holds IDs of that root's
|
|
96
|
+
* own `tenantIdColumn`, never IDs of another root.
|
|
97
|
+
*
|
|
98
|
+
* Root tables have separate ID spaces, so client `5` and agency `5` are different
|
|
99
|
+
* tenants. Keying the IDs by root lets `ask()` bind each root's IDs to that root's
|
|
100
|
+
* own `:tenant_<label>_ids` placeholder.
|
|
101
|
+
*/
|
|
102
|
+
export type TenantIdsByRoot = Readonly<Record<string, readonly string[]>>;
|
|
103
|
+
/**
|
|
104
|
+
* Host callback that expands a `subtree` tenant scope. Given the tenant root id and
|
|
105
|
+
* the seed IDs, return the subtree's IDs grouped by root ({@link TenantIdsByRoot}):
|
|
106
|
+
*
|
|
107
|
+
* - under `tenantRoot`: the seeds and any same-table descendants (e.g. child
|
|
108
|
+
* agencies through `agencies.parent_agency_id`);
|
|
109
|
+
* - under each descendant root the policy declares (`roots[].parent` or
|
|
110
|
+
* `hierarchy[]`): that root's IDs in the subtree.
|
|
111
|
+
*
|
|
112
|
+
* Pass it to `ask()` as {@link AskPipelineOptions.resolveTenantDescendants}.
|
|
113
|
+
*/
|
|
114
|
+
export type ResolveTenantDescendants = (tenantRoot: string, seedIds: readonly string[]) => Promise<TenantIdsByRoot> | TenantIdsByRoot;
|
|
74
115
|
export type AskPipelineOptions = {
|
|
75
116
|
question: string;
|
|
76
117
|
schema: AnyNormalizedSchema;
|
|
@@ -130,9 +171,30 @@ export type AskPipelineOptions = {
|
|
|
130
171
|
tenantScope?: TenantScope;
|
|
131
172
|
/**
|
|
132
173
|
* SQL output mode for tenant placeholders. Default `"sql-only"` inlines
|
|
133
|
-
* literal values
|
|
174
|
+
* escaped literal values. `"sql-params"` replaces them with the dialect's
|
|
175
|
+
* driver markers (`$N` for Postgres/CockroachDB and custom `AskDialect`s, `?`
|
|
176
|
+
* for MySQL/MariaDB/SQLite, `@pN` for SQL Server): run `sql` with
|
|
177
|
+
* `tenantParams`, or `unboundSql` with `params`.
|
|
134
178
|
*/
|
|
135
179
|
tenantSqlMode?: TenantSqlOutputMode;
|
|
180
|
+
/**
|
|
181
|
+
* Expands a `subtree` tenant scope into IDs per tenant root.
|
|
182
|
+
*
|
|
183
|
+
* Called with the tenant root id and the seed IDs from
|
|
184
|
+
* `tenantScope.access.rootIds`; returns the subtree's IDs keyed by root table id
|
|
185
|
+
* ({@link TenantIdsByRoot}). `ask()` unions the seeds into the `tenantRoot` entry
|
|
186
|
+
* and turns the result into a `multi_root` scope (an `ids` scope when only
|
|
187
|
+
* `tenantRoot` has IDs), so each root's IDs bind only to that root's placeholder.
|
|
188
|
+
* The host is the right place for this: it already knows its own hierarchy, can
|
|
189
|
+
* cache the closure, and can apply its own authorization rules.
|
|
190
|
+
*
|
|
191
|
+
* Required when `tenantScope.access.kind === "subtree"` — AskDB never opens a
|
|
192
|
+
* database connection of its own. Without it, or when it returns a flat array,
|
|
193
|
+
* a key that isn't a root in the subtree, a value that isn't an array of
|
|
194
|
+
* non-empty strings, or no IDs at all, `ask()` throws `TenantScopeError`
|
|
195
|
+
* (`SUBTREE_NOT_RESOLVABLE`) before calling the model.
|
|
196
|
+
*/
|
|
197
|
+
resolveTenantDescendants?: ResolveTenantDescendants;
|
|
136
198
|
/**
|
|
137
199
|
* Ask the model to also return the SQL in unbound form plus a JSON manifest
|
|
138
200
|
* of the values it parameterized, populating `unboundSql`, `params`,
|
|
@@ -152,10 +214,23 @@ export type AskPipelineOptions = {
|
|
|
152
214
|
sensitiveGuardrailMode?: SensitiveGuardrailMode | "off";
|
|
153
215
|
};
|
|
154
216
|
export type AskPipelineResult = {
|
|
217
|
+
/**
|
|
218
|
+
* The model's bound SQL: business values inlined as literals. Tenant IDs are
|
|
219
|
+
* inlined literals (`tenantSqlMode: "sql-only"`) or driver markers numbered from
|
|
220
|
+
* the first slot (`"sql-params"`) — then execute it with `tenantParams`.
|
|
221
|
+
*/
|
|
155
222
|
sql: string;
|
|
156
|
-
/**
|
|
223
|
+
/**
|
|
224
|
+
* Driver markers for every value (business and, in `"sql-params"` mode, tenant).
|
|
225
|
+
* Execute with `params` — never with `tenantParams`.
|
|
226
|
+
*/
|
|
157
227
|
unboundSql?: string;
|
|
158
|
-
/**
|
|
228
|
+
/**
|
|
229
|
+
* Values for `unboundSql`, in driver-marker order (array slots on
|
|
230
|
+
* Postgres/CockroachDB listBinding). In `"sql-params"` mode this already
|
|
231
|
+
* includes the tenant values — for `?` dialects interleaved in source order,
|
|
232
|
+
* otherwise after the business values. Do not concatenate `tenantParams`.
|
|
233
|
+
*/
|
|
159
234
|
params?: QueryParamSlot[];
|
|
160
235
|
/** Named bindings for form UIs (includes runtime values). */
|
|
161
236
|
parameters?: QueryParameterBinding[];
|
|
@@ -167,7 +242,20 @@ export type AskPipelineResult = {
|
|
|
167
242
|
* at least one `sensitive` table/column and `sensitiveGuardrailMode` is not `"off"`.
|
|
168
243
|
*/
|
|
169
244
|
sensitiveGuardrail?: SensitiveGuardrailResult;
|
|
245
|
+
/**
|
|
246
|
+
* Tenant guardrail result for the model's SQL, checked before tenant rendering: the
|
|
247
|
+
* bound `sql` and its `sql-unbound` block, with the `:tenant_<root>_ids` placeholders
|
|
248
|
+
* still in place. `sql` and `unboundSql` differ from those only by the substituted
|
|
249
|
+
* tenant IDs or markers. Present whenever the schema has a tenant policy, for every
|
|
250
|
+
* dialect form. In `strict` mode a failure
|
|
251
|
+
* throws `TenantGuardrailError` instead, so a returned result is always `passed`
|
|
252
|
+
* under `strict`.
|
|
253
|
+
*/
|
|
170
254
|
tenantGuardrail?: import("./sql/tenant-guardrail.js").TenantGuardrailResult;
|
|
255
|
+
/**
|
|
256
|
+
* `"sql-params"` mode only: the tenant IDs for the markers in `sql`, in marker
|
|
257
|
+
* order. `sql` + `tenantParams` is an executable pair on its own.
|
|
258
|
+
*/
|
|
171
259
|
tenantParams?: unknown[];
|
|
172
260
|
tenantBindings?: TenantBinding[];
|
|
173
261
|
/** Token usage for the LLM generation call. Absent when the provider does not report usage. */
|
package/dist/ask.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
|
package/dist/ask.js
CHANGED
|
@@ -2,12 +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";
|
|
8
10
|
import { formatSensitiveReference, schemaHasSensitiveIdentifiers, validateSensitiveReferences, } from "./sql/sensitive-guardrail.js";
|
|
9
|
-
import { SensitiveReferenceError } from "./errors.js";
|
|
10
|
-
import { bindPreparedQuery, sqlStructurallyEqual, } from "./sql/bind.js";
|
|
11
|
+
import { SensitiveReferenceError, TenantScopeError, UnknownDialectError, } from "./errors.js";
|
|
12
|
+
import { bindPreparedQuery, markerStyleForDialect, scanPlaceholders, sqlStructurallyEqual, } from "./sql/bind.js";
|
|
11
13
|
export async function ask(options) {
|
|
12
14
|
const logger = options.logger;
|
|
13
15
|
const mode = options.mode ?? DEFAULT_ASKDB_MODE;
|
|
@@ -22,6 +24,12 @@ export async function ask(options) {
|
|
|
22
24
|
enforcement: tenantPolicy.enforcement,
|
|
23
25
|
}, "tenant scope validated");
|
|
24
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;
|
|
25
33
|
const explainRequested = options.explain ?? false;
|
|
26
34
|
const omitSensitive = options.omitSensitiveIdentifiersFromNlToSqlPrompt ?? false;
|
|
27
35
|
const parameterize = options.parameterize !== false; // default true
|
|
@@ -40,7 +48,7 @@ export async function ask(options) {
|
|
|
40
48
|
providerOptions: options.deps?.providerOptions,
|
|
41
49
|
prebuiltDdl,
|
|
42
50
|
tenantPolicy,
|
|
43
|
-
tenantScope
|
|
51
|
+
tenantScope,
|
|
44
52
|
// Custom AskDialect implementations ignore this; built-in path uses it.
|
|
45
53
|
parameterize: dialectSpec ? parameterize : undefined,
|
|
46
54
|
});
|
|
@@ -49,8 +57,11 @@ export async function ask(options) {
|
|
|
49
57
|
const result = { sql: generated.sql };
|
|
50
58
|
if (generated.explain !== undefined)
|
|
51
59
|
result.explain = generated.explain;
|
|
52
|
-
|
|
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) {
|
|
53
63
|
result.tenantGuardrail = generated.tenantGuardrail;
|
|
64
|
+
}
|
|
54
65
|
if (generated.usage !== undefined)
|
|
55
66
|
result.usage = generated.usage;
|
|
56
67
|
// Parameterize extras: build PreparedQuery, consistency-check via bindPreparedQuery,
|
|
@@ -127,10 +138,21 @@ export async function ask(options) {
|
|
|
127
138
|
}, "parameterize extras dropped");
|
|
128
139
|
}
|
|
129
140
|
}
|
|
130
|
-
if (tenantPolicy &&
|
|
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);
|
|
131
151
|
const tenantMode = options.tenantSqlMode ?? "sql-only";
|
|
132
|
-
|
|
133
|
-
|
|
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);
|
|
134
156
|
result.sql = resolved.sql;
|
|
135
157
|
if (resolved.bindings.length > 0)
|
|
136
158
|
result.tenantBindings = resolved.bindings;
|
|
@@ -139,36 +161,138 @@ export async function ask(options) {
|
|
|
139
161
|
}
|
|
140
162
|
if (result.preparedQuery && result.unboundSql) {
|
|
141
163
|
if (tenantMode === "sql-only") {
|
|
142
|
-
const unboundWithTenant = resolveTenantSql(result.unboundSql, tenantPolicy,
|
|
164
|
+
const unboundWithTenant = resolveTenantSql(result.unboundSql, tenantPolicy, tenantScope, "sql-only", 1, dialectSpec);
|
|
143
165
|
result.unboundSql = unboundWithTenant.sql;
|
|
144
166
|
}
|
|
145
|
-
else {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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");
|
|
154
181
|
}
|
|
155
182
|
}
|
|
156
183
|
}
|
|
157
|
-
applySensitiveGuardrail(result, options, logger);
|
|
184
|
+
applySensitiveGuardrail(result, options, dialectSpec, logger);
|
|
158
185
|
return result;
|
|
159
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
|
+
}
|
|
160
279
|
/**
|
|
161
280
|
* Run the sensitive-identifier guardrail over the SQL the host is about to receive.
|
|
162
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.
|
|
163
284
|
*/
|
|
164
|
-
function applySensitiveGuardrail(result, options, logger) {
|
|
285
|
+
function applySensitiveGuardrail(result, options, dialectSpec, logger) {
|
|
165
286
|
const mode = options.sensitiveGuardrailMode ?? "warn";
|
|
166
287
|
if (mode === "off")
|
|
167
288
|
return;
|
|
168
289
|
if (!schemaHasSensitiveIdentifiers(options.schema))
|
|
169
290
|
return;
|
|
170
291
|
try {
|
|
171
|
-
const guardrail = validateSensitiveReferences(result.sql, options.schema, {
|
|
292
|
+
const guardrail = validateSensitiveReferences(result.sql, options.schema, {
|
|
293
|
+
mode,
|
|
294
|
+
dialect: dialectSpec,
|
|
295
|
+
});
|
|
172
296
|
result.sensitiveGuardrail = guardrail;
|
|
173
297
|
logSensitiveReferences(logger, guardrail.references);
|
|
174
298
|
}
|
|
@@ -189,6 +313,91 @@ function logSensitiveReferences(logger, references) {
|
|
|
189
313
|
sensitiveColumns,
|
|
190
314
|
}, "generated SQL references sensitive identifiers");
|
|
191
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
|
+
}
|
|
192
401
|
const TENANT_MASK_RE = /:tenant_([a-z0-9_]+)_ids/g;
|
|
193
402
|
const TENANT_UNMASK_RE = /__askdb_tenant_([a-z0-9_]+)_ids__/g;
|
|
194
403
|
function maskTenantPlaceholders(sql) {
|
|
@@ -235,7 +444,7 @@ function resolveDialectSpec(input) {
|
|
|
235
444
|
function resolveDialect(input) {
|
|
236
445
|
if (typeof input === "string") {
|
|
237
446
|
if (!isBuiltInDialectId(input)) {
|
|
238
|
-
throw new
|
|
447
|
+
throw new UnknownDialectError(`Unknown dialect id '${input}'. Pass a built-in DialectId, a DialectSpec object, or a custom AskDialect.`, input);
|
|
239
448
|
}
|
|
240
449
|
return specToDialect(getDialectSpec(input));
|
|
241
450
|
}
|
|
@@ -245,7 +454,9 @@ function resolveDialect(input) {
|
|
|
245
454
|
}
|
|
246
455
|
function specToDialect(spec) {
|
|
247
456
|
return {
|
|
248
|
-
|
|
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),
|
|
249
460
|
};
|
|
250
461
|
}
|
|
251
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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"}
|