@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/sql/prompt.js
CHANGED
|
@@ -18,7 +18,13 @@ export function buildNlToSqlUserPrompt(dialect, question, schema, ambiguityNotes
|
|
|
18
18
|
* still fires using the consumer-supplied `nlToSqlSchemaOptions` to keep
|
|
19
19
|
* observability consistent.
|
|
20
20
|
*/
|
|
21
|
-
prebuiltDdl, tenantPolicy, tenantScope
|
|
21
|
+
prebuiltDdl, tenantPolicy, tenantScope,
|
|
22
|
+
/**
|
|
23
|
+
* When true, append the unbound-SQL + parameter-manifest output-format
|
|
24
|
+
* instructions. When false/undefined, the prompt is unchanged from the
|
|
25
|
+
* pre-parameterize path (byte-identical).
|
|
26
|
+
*/
|
|
27
|
+
parameterize) {
|
|
22
28
|
const formatted = isV2(schema)
|
|
23
29
|
? formatSchemaV2ForNlToSql(schema, nlToSqlSchemaOptions)
|
|
24
30
|
: formatSchemaForNlToSql(schema, nlToSqlSchemaOptions);
|
|
@@ -66,6 +72,23 @@ prebuiltDdl, tenantPolicy, tenantScope) {
|
|
|
66
72
|
lines.push("");
|
|
67
73
|
}
|
|
68
74
|
lines.push(`Question: ${question}`);
|
|
75
|
+
if (parameterize === true) {
|
|
76
|
+
const listBinding = dialect.listBinding ?? "expand";
|
|
77
|
+
const listForm = listBinding === "array"
|
|
78
|
+
? "For multi-value parameters use `= ANY(:name)` (array dialects)."
|
|
79
|
+
: "For multi-value parameters use `IN (:name)`.";
|
|
80
|
+
lines.push("");
|
|
81
|
+
lines.push("Parameterized output format (required):");
|
|
82
|
+
lines.push("1. Emit the complete bound SQL (values inlined as literals) in a ```sql fence — exactly as you would without this instruction.");
|
|
83
|
+
lines.push("2. Emit the same statement in a ```sql-unbound fence, replacing values taken from the user's question with `:name` placeholders.");
|
|
84
|
+
lines.push("3. Emit a ```json fence with `{\"parameters\":[{\"name\",\"type\",\"cardinality\",\"description\",\"value\"}, ...]}` describing each placeholder.");
|
|
85
|
+
lines.push("- Placeholder names match `^[a-z][a-z0-9_]*$`. Never quote placeholders (`state = :state_name`, never `state = ':state_name'`).");
|
|
86
|
+
lines.push("- Never write `$1`, `?`, or `@p0` markers — only `:name` placeholders. AskDB derives driver markers.");
|
|
87
|
+
lines.push(`- ${listForm}`);
|
|
88
|
+
lines.push("- Types are `string` | `number` | `boolean` | `date` | `datetime`. Use `cardinality` `one` or `many`. Dates/datetimes are ISO strings.");
|
|
89
|
+
lines.push("- Keep `:tenant_*` placeholders exactly as the tenant policy block instructs; do not put them in the manifest.");
|
|
90
|
+
lines.push("- Only parameterize values that came from the user's question — not structural constants you chose (e.g. status enums you invented).");
|
|
91
|
+
}
|
|
69
92
|
return lines.join("\n");
|
|
70
93
|
}
|
|
71
94
|
/** Dialect-parameterized system prompt for the NL→SQL generator. */
|
package/dist/sql/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/sql/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,wBAAwB,GAEzB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,SAAS,IAAI,CAAC,MAA2B;IACvC,OAAO,UAAU,IAAI,MAAM,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAoB,EACpB,QAAgB,EAChB,MAA2B,EAC3B,iBAAoC,EAAE,EACtC,MAAoB,EACpB,oBAA2C;AAC3C;;;;;;GAMG;AACH,WAAoB,EACpB,YAAqC,EACrC,WAAyB;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/sql/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type SensitiveReference, type SensitiveScopeReport } from "../errors.js";
|
|
2
|
+
import type { AnyNormalizedSchema } from "../schema/types.js";
|
|
3
|
+
import type { DialectSpec } from "./dialect-spec.js";
|
|
4
|
+
export type SensitiveGuardrailMode = "warn" | "strict";
|
|
5
|
+
export type ValidateSensitiveReferencesOptions = {
|
|
6
|
+
/**
|
|
7
|
+
* `"warn"` (default) returns the references without throwing — today's CLI behaviour.
|
|
8
|
+
* `"strict"` throws {@link SensitiveReferenceError} whenever the statement cannot be
|
|
9
|
+
* proven clean (references found, or scope could not be resolved).
|
|
10
|
+
*/
|
|
11
|
+
mode?: SensitiveGuardrailMode;
|
|
12
|
+
/**
|
|
13
|
+
* The engine the SQL targets, so strings, quoted identifiers, and comments are lexed
|
|
14
|
+
* the way that engine reads them (e.g. MySQL backslash escapes, Postgres `E'…'`).
|
|
15
|
+
* When omitted, references are collected under every built-in engine's reading, which
|
|
16
|
+
* is conservative and can over-report in rare cases.
|
|
17
|
+
*/
|
|
18
|
+
dialect?: Pick<DialectSpec, "id" | "backslashEscapes">;
|
|
19
|
+
};
|
|
20
|
+
export type SensitiveGuardrailResult = {
|
|
21
|
+
/** True only when nothing sensitive was referenced **and** table scope was fully resolved. */
|
|
22
|
+
passed: boolean;
|
|
23
|
+
references: SensitiveReference[];
|
|
24
|
+
/** Present when the statement's `FROM`/`JOIN` scope could not be resolved with confidence. */
|
|
25
|
+
unresolvedScope?: SensitiveScopeReport;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Check whether a SQL statement references tables/columns marked `sensitive`
|
|
29
|
+
* in the schema artifact.
|
|
30
|
+
*
|
|
31
|
+
* `sensitive: true` is otherwise a **prompt-level** marker: `formatSchemaForNlToSql`
|
|
32
|
+
* either tags identifiers `(sensitive)` or withholds them entirely. Both act on what
|
|
33
|
+
* the model *sees*. This function is the **enforcement** path — it inspects SQL that
|
|
34
|
+
* is about to execute, so hosts that cache, store, or replay statements should call it
|
|
35
|
+
* on every execution path, not only at generation time.
|
|
36
|
+
*
|
|
37
|
+
* Unlike a bare substring scan, an unqualified column name only counts when the owning
|
|
38
|
+
* table is actually in the statement's scope: `FROM`/`JOIN` targets and their aliases
|
|
39
|
+
* are resolved first. When scope cannot be resolved (no resolvable table source, or a
|
|
40
|
+
* qualifier that binds to nothing known), the check fails conservatively — it widens
|
|
41
|
+
* matching and reports why in {@link SensitiveGuardrailResult.unresolvedScope} — rather
|
|
42
|
+
* than passing silently. A string, quoted identifier, or comment that never closes is
|
|
43
|
+
* reported the same way (`UNTERMINATED_TOKEN`).
|
|
44
|
+
*
|
|
45
|
+
* `SELECT *`, `alias.*`, and whole-row references such as `row_to_json(alias)` count as
|
|
46
|
+
* referencing every sensitive column of the table they reach. They expand per query
|
|
47
|
+
* block: a bare `*` covers its own `SELECT`'s FROM/JOIN tables, and an alias resolves in
|
|
48
|
+
* its own block first, then in enclosing blocks. When the block structure cannot be
|
|
49
|
+
* read with confidence, they expand against every table in the statement.
|
|
50
|
+
*
|
|
51
|
+
* Heuristic, not a SQL parser, and not a security boundary. It is defense in depth for
|
|
52
|
+
* review and enforcement; database-side column privileges are the real control.
|
|
53
|
+
*/
|
|
54
|
+
export declare function validateSensitiveReferences(sql: string, schema: AnyNormalizedSchema, options?: ValidateSensitiveReferencesOptions): SensitiveGuardrailResult;
|
|
55
|
+
/**
|
|
56
|
+
* True when the schema marks at least one table or column `sensitive`. Cheap pre-check
|
|
57
|
+
* for hosts (and `ask()`) that skip the guardrail entirely on schemas with no markers.
|
|
58
|
+
*/
|
|
59
|
+
export declare function schemaHasSensitiveIdentifiers(schema: AnyNormalizedSchema): boolean;
|
|
60
|
+
/** Render a reference as `schema.table.column` (or `table.column` when the schema has no namespace). */
|
|
61
|
+
export declare function formatSensitiveReference(ref: SensitiveReference): string;
|
|
62
|
+
//# sourceMappingURL=sensitive-guardrail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensitive-guardrail.d.ts","sourceRoot":"","sources":["../../src/sql/sensitive-guardrail.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EAGvB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUrD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvD,MAAM,MAAM,kCAAkC,GAAG;IAC/C;;;;OAIG;IACH,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,kBAAkB,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,8FAA8F;IAC9F,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,8FAA8F;IAC9F,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE,kCAAkC,GAC3C,wBAAwB,CAiB1B;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAElF;AAED,wGAAwG;AACxG,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAGxE"}
|