@askdb/core 1.0.0-beta.40 → 1.0.0-beta.42

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.
Files changed (73) hide show
  1. package/README.md +39 -1
  2. package/dist/ask.d.ts +48 -0
  3. package/dist/ask.d.ts.map +1 -1
  4. package/dist/ask.js +176 -10
  5. package/dist/ask.js.map +1 -1
  6. package/dist/enrichment/suggest.d.ts +7 -0
  7. package/dist/enrichment/suggest.d.ts.map +1 -1
  8. package/dist/enrichment/suggest.js +7 -1
  9. package/dist/enrichment/suggest.js.map +1 -1
  10. package/dist/errors.d.ts +49 -0
  11. package/dist/errors.d.ts.map +1 -1
  12. package/dist/errors.js +20 -0
  13. package/dist/errors.js.map +1 -1
  14. package/dist/exec/postgres.d.ts +6 -0
  15. package/dist/exec/postgres.d.ts.map +1 -0
  16. package/dist/exec/postgres.js +30 -0
  17. package/dist/exec/postgres.js.map +1 -0
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/logging/log-events.d.ts +13 -0
  23. package/dist/logging/log-events.d.ts.map +1 -1
  24. package/dist/logging/log-events.js +13 -0
  25. package/dist/logging/log-events.js.map +1 -1
  26. package/dist/modes/post-execute-log.d.ts +9 -0
  27. package/dist/modes/post-execute-log.d.ts.map +1 -0
  28. package/dist/modes/post-execute-log.js +26 -0
  29. package/dist/modes/post-execute-log.js.map +1 -0
  30. package/dist/sql/bind.d.ts +100 -0
  31. package/dist/sql/bind.d.ts.map +1 -0
  32. package/dist/sql/bind.js +560 -0
  33. package/dist/sql/bind.js.map +1 -0
  34. package/dist/sql/dialect-spec.d.ts +4 -0
  35. package/dist/sql/dialect-spec.d.ts.map +1 -1
  36. package/dist/sql/dialect-spec.js +8 -0
  37. package/dist/sql/dialect-spec.js.map +1 -1
  38. package/dist/sql/extract-sql.d.ts +8 -1
  39. package/dist/sql/extract-sql.d.ts.map +1 -1
  40. package/dist/sql/extract-sql.js +27 -4
  41. package/dist/sql/extract-sql.js.map +1 -1
  42. package/dist/sql/generate.d.ts +19 -0
  43. package/dist/sql/generate.d.ts.map +1 -1
  44. package/dist/sql/generate.js +79 -5
  45. package/dist/sql/generate.js.map +1 -1
  46. package/dist/sql/index.d.ts +4 -2
  47. package/dist/sql/index.d.ts.map +1 -1
  48. package/dist/sql/index.js +4 -2
  49. package/dist/sql/index.js.map +1 -1
  50. package/dist/sql/parameter-manifest.d.ts +34 -0
  51. package/dist/sql/parameter-manifest.d.ts.map +1 -0
  52. package/dist/sql/parameter-manifest.js +150 -0
  53. package/dist/sql/parameter-manifest.js.map +1 -0
  54. package/dist/sql/prompt.d.ts +7 -1
  55. package/dist/sql/prompt.d.ts.map +1 -1
  56. package/dist/sql/prompt.js +24 -1
  57. package/dist/sql/prompt.js.map +1 -1
  58. package/dist/sql/sensitive-guardrail.d.ts +47 -0
  59. package/dist/sql/sensitive-guardrail.d.ts.map +1 -0
  60. package/dist/sql/sensitive-guardrail.js +589 -0
  61. package/dist/sql/sensitive-guardrail.js.map +1 -0
  62. package/dist/sql/tenant-placeholders.d.ts +3 -2
  63. package/dist/sql/tenant-placeholders.d.ts.map +1 -1
  64. package/dist/sql/tenant-placeholders.js +14 -11
  65. package/dist/sql/tenant-placeholders.js.map +1 -1
  66. package/dist/sql/validate.d.ts.map +1 -1
  67. package/dist/sql/validate.js +1 -47
  68. package/dist/sql/validate.js.map +1 -1
  69. package/package.json +6 -5
  70. package/dist/ai/provider.d.ts +0 -116
  71. package/dist/ai/provider.d.ts.map +0 -1
  72. package/dist/ai/provider.js +0 -255
  73. package/dist/ai/provider.js.map +0 -1
package/README.md CHANGED
@@ -61,9 +61,47 @@ const { sql } = await ask({
61
61
  });
62
62
  ```
63
63
 
64
+ ## Parameterized output (default on)
65
+
66
+ By default `ask()` also asks the model for an unbound form of the same SQL plus a small JSON parameter manifest. Every call is still **exactly one model call** — `parameterize` does not add or remove one, and nothing here lets a caller skip the model. The question is sent unchanged (values included); this is not a redaction feature.
67
+
68
+ ```ts
69
+ import { ask, bindPreparedQuery, loadSchema } from "@askdb/core";
70
+
71
+ const result = await ask({
72
+ question: "How many cities does Colorado have?",
73
+ schema,
74
+ model: openai("gpt-4o"),
75
+ dialect: "postgres",
76
+ tenantScope,
77
+ });
78
+
79
+ // Execute either form.
80
+ await pool.query(result.sql); // ready to run
81
+ await pool.query(result.unboundSql!, result.params); // driver binding
82
+
83
+ // Render a form from result.parameters, then rebind locally — no model call.
84
+ const rebound = bindPreparedQuery(result.preparedQuery!, {
85
+ state_name: "Utah",
86
+ ":tenant_agency_ids": authorizedAgencyIds,
87
+ });
88
+ await pool.query(rebound.sql);
89
+ ```
90
+
91
+ Key rules:
92
+
93
+ - `parameterize` defaults to **true**. Set `parameterize: false` when the extra output tokens are not worth it.
94
+ - If the model's extra blocks are missing or inconsistent, the extras are omitted and `result.sql` is unaffected. No new error reaches a caller who does not call `bindPreparedQuery()`.
95
+ - The model decides what to parameterize, so a mistake changes the *form*, not the query. Constrain form inputs using returned `type` and `description`.
96
+ - `bindPreparedQuery()` is mechanical: it checks names, types, and cardinality, and **does not authorize tenant IDs**. Authorization is the host's, exactly as when building `tenantScope`.
97
+ - Callers using the new fields must execute with `params`, not `tenantParams`.
98
+ - List parameters are arity-stable in `unboundSql` only on PostgreSQL/CockroachDB (`= ANY($n)`); elsewhere a changed list length changes the marker count — rebind through `bindPreparedQuery()` rather than swapping the array.
99
+ - Markers: `$N` (Postgres/CockroachDB), `?` (MySQL/MariaDB/SQLite), `@pN` (SQL Server, 0-based). Map values via `parameters[].markers` for SQL Server.
100
+
64
101
  ## What you get
65
102
 
66
- - `ask({ question, schema, model, dialect })` — generate validated SQL.
103
+ - `ask({ question, schema, model, dialect })` — generate validated SQL (plus optional `unboundSql` / `params` / `parameters` / `preparedQuery`).
104
+ - `bindPreparedQuery(prepared, values)` — pure local rebind of a `PreparedQuery` (no model call).
67
105
  - `AskDbLanguageModel` — AskDB's public name for the AI SDK language model contract.
68
106
  - `AskDialect` — the dialect adapter contract. `@askdb/postgres` exports a ready-made one.
69
107
  - `loadSchema(path)` — load a Schema v2 directory, bundled JSON, or `schema.json` path.
package/dist/ask.d.ts CHANGED
@@ -7,15 +7,23 @@ import type { Retriever } from "./retrieval/types.js";
7
7
  import type { TenantScope } from "./schema/v2/tenant-policy.js";
8
8
  import { type BuiltInDialectId, type DialectSpec } from "./sql/dialect-spec.js";
9
9
  import { type TenantSqlOutputMode, type TenantBinding } from "./sql/tenant-placeholders.js";
10
+ import { type SensitiveGuardrailMode, type SensitiveGuardrailResult } from "./sql/sensitive-guardrail.js";
11
+ import { type PreparedQuery, type QueryParameterBinding, type QueryParamSlot } from "./sql/bind.js";
10
12
  /** Options forwarded to a dialect's generator. Stable across dialects. */
11
13
  export type AskDialectGenerateOptions = {
12
14
  logger?: AskDbLogger;
13
15
  explain?: boolean;
14
16
  omitSensitiveIdentifiersFromNlToSqlPrompt?: boolean;
15
17
  generateText?: typeof defaultGenerateText;
18
+ providerOptions?: Record<string, unknown>;
16
19
  prebuiltDdl?: string;
17
20
  tenantPolicy?: import("./schema/v2/tenant-policy.js").NormalizedTenantPolicy;
18
21
  tenantScope?: TenantScope;
22
+ /**
23
+ * When true, ask the model for unbound SQL + a parameter manifest.
24
+ * Inert for custom {@link AskDialect} implementations.
25
+ */
26
+ parameterize?: boolean;
19
27
  };
20
28
  /** Token usage for a single `ask()` call (LLM generation only; excludes RAG embedding tokens). */
21
29
  export type AskUsage = {
@@ -29,6 +37,8 @@ export type AskDialectGenerateResult = {
29
37
  explain?: unknown;
30
38
  tenantGuardrail?: import("./sql/tenant-guardrail.js").TenantGuardrailResult;
31
39
  usage?: AskUsage;
40
+ unboundNamedSql?: string;
41
+ parameterManifest?: import("./sql/parameter-manifest.js").ParameterManifest;
32
42
  };
33
43
  /**
34
44
  * Escape-hatch interface for fully custom NL→SQL generators (agentic flows,
@@ -52,6 +62,14 @@ export type AskDialectInput = BuiltInDialectId | DialectSpec | AskDialect;
52
62
  /** Generic deps the pipeline forwards into the dialect (test-time mock for `generateText`, etc.). */
53
63
  export type AskGenerateDeps = {
54
64
  generateText?: typeof defaultGenerateText;
65
+ /**
66
+ * Forwarded verbatim to the underlying `generateText` call's `providerOptions`.
67
+ * Resolve provider-portable reasoning/latency effort (e.g. via `@askdb/ai`'s
68
+ * `resolveProviderOptions`) and pass the result here — core stays BYO-model
69
+ * and does not interpret or validate this bag. Unset preserves current
70
+ * `generateText` call shapes exactly.
71
+ */
72
+ providerOptions?: Record<string, unknown>;
55
73
  };
56
74
  export type AskPipelineOptions = {
57
75
  question: string;
@@ -115,10 +133,40 @@ export type AskPipelineOptions = {
115
133
  * literal values; `"sql-params"` converts to positional `$N` parameters.
116
134
  */
117
135
  tenantSqlMode?: TenantSqlOutputMode;
136
+ /**
137
+ * Ask the model to also return the SQL in unbound form plus a JSON manifest
138
+ * of the values it parameterized, populating `unboundSql`, `params`,
139
+ * `parameters`, and `preparedQuery`. Default true. Set false to save the
140
+ * extra output tokens when the host does not use those fields.
141
+ */
142
+ parameterize?: boolean;
143
+ /**
144
+ * How to treat SQL that references schema identifiers marked `sensitive`.
145
+ * Default `"warn"` — {@link AskPipelineResult.sensitiveGuardrail} is populated and
146
+ * `askdb.pipeline.sensitive_sql_warning` is logged, but `ask()` still resolves.
147
+ * `"strict"` throws {@link SensitiveReferenceError} instead. `"off"` skips the check.
148
+ *
149
+ * This only covers SQL produced by *this* call. Hosts that cache or replay SQL
150
+ * should call `validateSensitiveReferences` on every execution path.
151
+ */
152
+ sensitiveGuardrailMode?: SensitiveGuardrailMode | "off";
118
153
  };
119
154
  export type AskPipelineResult = {
120
155
  sql: string;
156
+ /** Driver markers; executable with `params`. */
157
+ unboundSql?: string;
158
+ /** Positional values for drivers (array slots on Postgres/CockroachDB listBinding). */
159
+ params?: QueryParamSlot[];
160
+ /** Named bindings for form UIs (includes runtime values). */
161
+ parameters?: QueryParameterBinding[];
162
+ /** Definitions + template only — no runtime values. */
163
+ preparedQuery?: PreparedQuery;
121
164
  explain?: unknown;
165
+ /**
166
+ * Sensitive-identifier guardrail result for `sql`. Present when the schema declares
167
+ * at least one `sensitive` table/column and `sensitiveGuardrailMode` is not `"off"`.
168
+ */
169
+ sensitiveGuardrail?: SensitiveGuardrailResult;
122
170
  tenantGuardrail?: import("./sql/tenant-guardrail.js").TenantGuardrailResult;
123
171
  tenantParams?: unknown[];
124
172
  tenantBindings?: TenantBinding[];
package/dist/ask.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
package/dist/ask.js CHANGED
@@ -5,6 +5,9 @@ import { getDialectSpec, isBuiltInDialectId, } from "./sql/dialect-spec.js";
5
5
  import { generateSelectSql } from "./sql/generate.js";
6
6
  import { resolveTenantSql, } from "./sql/tenant-placeholders.js";
7
7
  import { validateTenantScope } from "./sql/tenant-scope-validate.js";
8
+ import { formatSensitiveReference, schemaHasSensitiveIdentifiers, validateSensitiveReferences, } from "./sql/sensitive-guardrail.js";
9
+ import { SensitiveReferenceError } from "./errors.js";
10
+ import { bindPreparedQuery, sqlStructurallyEqual, } from "./sql/bind.js";
8
11
  export async function ask(options) {
9
12
  const logger = options.logger;
10
13
  const mode = options.mode ?? DEFAULT_ASKDB_MODE;
@@ -21,46 +24,209 @@ export async function ask(options) {
21
24
  }
22
25
  const explainRequested = options.explain ?? false;
23
26
  const omitSensitive = options.omitSensitiveIdentifiersFromNlToSqlPrompt ?? false;
27
+ const parameterize = options.parameterize !== false; // default true
24
28
  const prebuiltDdl = await maybeRetrieveDdl({
25
29
  options,
26
30
  logger,
27
31
  omitSensitive,
28
32
  });
33
+ const dialectSpec = resolveDialectSpec(options.dialect);
29
34
  const dialect = resolveDialect(options.dialect);
30
35
  const generated = await dialect.generate(options.question, options.schema, options.model, {
31
36
  logger,
32
37
  explain: explainRequested,
33
38
  omitSensitiveIdentifiersFromNlToSqlPrompt: omitSensitive || undefined,
34
39
  generateText: options.deps?.generateText,
40
+ providerOptions: options.deps?.providerOptions,
35
41
  prebuiltDdl,
36
42
  tenantPolicy,
37
43
  tenantScope: options.tenantScope,
44
+ // Custom AskDialect implementations ignore this; built-in path uses it.
45
+ parameterize: dialectSpec ? parameterize : undefined,
38
46
  });
39
- let sql = generated.sql;
40
- const explain = generated.explain;
41
- const tenantGuardrail = generated.tenantGuardrail;
42
- const result = { sql };
43
- if (explain !== undefined)
44
- result.explain = explain;
45
- if (tenantGuardrail !== undefined)
46
- result.tenantGuardrail = tenantGuardrail;
47
+ // result.sql is always the model's bound SQL (possibly with tenant literals/
48
+ // markers applied below). Never overwrite it with a re-bound version.
49
+ const result = { sql: generated.sql };
50
+ if (generated.explain !== undefined)
51
+ result.explain = generated.explain;
52
+ if (generated.tenantGuardrail !== undefined)
53
+ result.tenantGuardrail = generated.tenantGuardrail;
47
54
  if (generated.usage !== undefined)
48
55
  result.usage = generated.usage;
56
+ // Parameterize extras: build PreparedQuery, consistency-check via bindPreparedQuery,
57
+ // then populate result fields. Any failure drops extras only.
58
+ let businessParamCount = 0;
59
+ if (parameterize &&
60
+ dialectSpec &&
61
+ generated.unboundNamedSql &&
62
+ generated.parameterManifest &&
63
+ generated.parameterManifest.parameters.length > 0) {
64
+ const dialectId = dialectSpec.id;
65
+ const businessParams = generated.parameterManifest.parameters.map((p) => ({
66
+ name: p.name,
67
+ placeholder: `:${p.name}`,
68
+ type: p.type,
69
+ cardinality: p.cardinality,
70
+ description: p.description,
71
+ source: "question",
72
+ }));
73
+ // Tenant placeholders stay in namedSql for the host-facing PreparedQuery, but
74
+ // bindPreparedQuery requires every placeholder to be declared. For the
75
+ // consistency check we mask :tenant_* so only business values are substituted.
76
+ const maskedNamed = maskTenantPlaceholders(generated.unboundNamedSql);
77
+ const maskedBound = maskTenantPlaceholders(generated.sql);
78
+ const preparedForBind = {
79
+ version: 1,
80
+ dialect: dialectId,
81
+ namedSql: maskedNamed,
82
+ parameters: businessParams,
83
+ };
84
+ const values = {};
85
+ for (const p of generated.parameterManifest.parameters) {
86
+ values[p.name] = p.value;
87
+ }
88
+ try {
89
+ const bound = bindPreparedQuery(preparedForBind, values);
90
+ if (!sqlStructurallyEqual(bound.sql, maskedBound)) {
91
+ logger?.debug?.({
92
+ event: AskDbLogEvent.PipelineParameterized,
93
+ parameterCount: 0,
94
+ listParameterCount: 0,
95
+ reason: "consistency_mismatch",
96
+ }, "parameterize extras dropped");
97
+ }
98
+ else {
99
+ const tenantDecls = scanTenantDecls(generated.unboundNamedSql);
100
+ const prepared = {
101
+ version: 1,
102
+ dialect: dialectId,
103
+ namedSql: generated.unboundNamedSql,
104
+ parameters: [...businessParams, ...tenantDecls],
105
+ };
106
+ result.preparedQuery = prepared;
107
+ result.parameters = bound.bindings.map((b) => ({
108
+ ...b,
109
+ // Restore real placeholder text (masking only affected namedSql).
110
+ }));
111
+ result.unboundSql = unmaskTenantPlaceholders(bound.unboundSql);
112
+ result.params = bound.params;
113
+ businessParamCount = bound.params.length;
114
+ logger?.info({
115
+ event: AskDbLogEvent.PipelineParameterized,
116
+ parameterCount: bound.bindings.length,
117
+ listParameterCount: bound.bindings.filter((b) => b.cardinality === "many").length,
118
+ }, "parameterize extras attached");
119
+ }
120
+ }
121
+ catch {
122
+ logger?.debug?.({
123
+ event: AskDbLogEvent.PipelineParameterized,
124
+ parameterCount: 0,
125
+ listParameterCount: 0,
126
+ reason: "bind_failed",
127
+ }, "parameterize extras dropped");
128
+ }
129
+ }
49
130
  if (tenantPolicy && options.tenantScope) {
50
- const mode = options.tenantSqlMode ?? "sql-only";
51
- const resolved = resolveTenantSql(sql, tenantPolicy, options.tenantScope, mode);
131
+ const tenantMode = options.tenantSqlMode ?? "sql-only";
132
+ const paramStartIndex = tenantMode === "sql-params" && result.params ? businessParamCount + 1 : 1;
133
+ const resolved = resolveTenantSql(result.sql, tenantPolicy, options.tenantScope, tenantMode, paramStartIndex, dialectSpec);
52
134
  result.sql = resolved.sql;
53
135
  if (resolved.bindings.length > 0)
54
136
  result.tenantBindings = resolved.bindings;
55
137
  if (resolved.mode === "sql-params" && resolved.params.length > 0) {
56
138
  result.tenantParams = resolved.params;
57
139
  }
140
+ if (result.preparedQuery && result.unboundSql) {
141
+ if (tenantMode === "sql-only") {
142
+ const unboundWithTenant = resolveTenantSql(result.unboundSql, tenantPolicy, options.tenantScope, "sql-only", 1, dialectSpec);
143
+ result.unboundSql = unboundWithTenant.sql;
144
+ }
145
+ else {
146
+ const unboundWithTenant = resolveTenantSql(result.unboundSql, tenantPolicy, options.tenantScope, "sql-params", paramStartIndex, dialectSpec);
147
+ if (unboundWithTenant.mode === "sql-params") {
148
+ result.unboundSql = unboundWithTenant.sql;
149
+ result.params = [
150
+ ...(result.params ?? []),
151
+ ...unboundWithTenant.params,
152
+ ];
153
+ }
154
+ }
155
+ }
58
156
  }
157
+ applySensitiveGuardrail(result, options, logger);
59
158
  return result;
60
159
  }
160
+ /**
161
+ * Run the sensitive-identifier guardrail over the SQL the host is about to receive.
162
+ * Runs after tenant resolution so it sees exactly the statement in `result.sql`.
163
+ */
164
+ function applySensitiveGuardrail(result, options, logger) {
165
+ const mode = options.sensitiveGuardrailMode ?? "warn";
166
+ if (mode === "off")
167
+ return;
168
+ if (!schemaHasSensitiveIdentifiers(options.schema))
169
+ return;
170
+ try {
171
+ const guardrail = validateSensitiveReferences(result.sql, options.schema, { mode });
172
+ result.sensitiveGuardrail = guardrail;
173
+ logSensitiveReferences(logger, guardrail.references);
174
+ }
175
+ catch (error) {
176
+ if (error instanceof SensitiveReferenceError) {
177
+ logSensitiveReferences(logger, error.references);
178
+ }
179
+ throw error;
180
+ }
181
+ }
182
+ function logSensitiveReferences(logger, references) {
183
+ if (references.length === 0)
184
+ return;
185
+ const sensitiveColumns = references.map(formatSensitiveReference);
186
+ logger?.info({
187
+ event: AskDbLogEvent.PipelineSensitiveSqlWarning,
188
+ sensitiveColumnCount: sensitiveColumns.length,
189
+ sensitiveColumns,
190
+ }, "generated SQL references sensitive identifiers");
191
+ }
192
+ const TENANT_MASK_RE = /:tenant_([a-z0-9_]+)_ids/g;
193
+ const TENANT_UNMASK_RE = /__askdb_tenant_([a-z0-9_]+)_ids__/g;
194
+ function maskTenantPlaceholders(sql) {
195
+ return sql.replace(TENANT_MASK_RE, "__askdb_tenant_$1_ids__");
196
+ }
197
+ function unmaskTenantPlaceholders(sql) {
198
+ return sql.replace(TENANT_UNMASK_RE, ":tenant_$1_ids");
199
+ }
200
+ function scanTenantDecls(namedSql) {
201
+ const seen = new Set();
202
+ const out = [];
203
+ for (const m of namedSql.matchAll(/:tenant_([a-z0-9_]+)_ids/g)) {
204
+ const name = `tenant_${m[1]}_ids`;
205
+ if (seen.has(name))
206
+ continue;
207
+ seen.add(name);
208
+ out.push({
209
+ name,
210
+ placeholder: `:${name}`,
211
+ type: "string",
212
+ cardinality: "many",
213
+ source: "tenant",
214
+ });
215
+ }
216
+ return out;
217
+ }
61
218
  function isAskDialect(value) {
62
219
  return typeof value.generate === "function";
63
220
  }
221
+ /** Return the DialectSpec when the input is a built-in id or spec; undefined for custom AskDialect. */
222
+ function resolveDialectSpec(input) {
223
+ if (typeof input === "string") {
224
+ return isBuiltInDialectId(input) ? getDialectSpec(input) : undefined;
225
+ }
226
+ if (isAskDialect(input))
227
+ return undefined;
228
+ return input;
229
+ }
64
230
  /**
65
231
  * Normalize an {@link AskDialectInput} to an {@link AskDialect}. Built-in ids
66
232
  * and {@link DialectSpec}s are wrapped around the centralized
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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"}
@@ -7,6 +7,13 @@ export type SuggestEnrichmentDeps = {
7
7
  maxCandidates?: number;
8
8
  /** Sampling temperature. Default 0.4 — small variety, mostly grounded. */
9
9
  temperature?: number;
10
+ /**
11
+ * Forwarded verbatim to the underlying `generateText` call's `providerOptions`.
12
+ * Enrichment suggestions are non-critical, so hosts may resolve a lower
13
+ * reasoning/latency effort here than for NL→SQL generation (e.g. via
14
+ * `@askdb/ai`'s `resolveProviderOptions`). Omitted when unset.
15
+ */
16
+ providerOptions?: Record<string, unknown>;
10
17
  };
11
18
  /**
12
19
  * Ask the model for 1–3 enrichment candidates for the given target. The model
@@ -1 +1 @@
1
- {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/enrichment/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AAKzD,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC1C,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAYhC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAU/E"}
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/enrichment/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AAKzD,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC1C,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAkBhC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAU/E"}
@@ -11,9 +11,15 @@ export async function suggestEnrichment(target, context, model, deps = {}) {
11
11
  const maxCandidates = deps.maxCandidates ?? 3;
12
12
  const result = await generateText({
13
13
  model,
14
- system: ENRICHMENT_SYSTEM_PROMPT,
14
+ instructions: ENRICHMENT_SYSTEM_PROMPT,
15
15
  prompt: buildEnrichmentUserPrompt(target, context),
16
16
  temperature: deps.temperature ?? 0.4,
17
+ // Cast: AskDB's public `providerOptions` type is a plain opaque bag
18
+ // (`Record<string, unknown>`) so callers don't need AI SDK JSON types.
19
+ // We don't interpret or validate it — the AI SDK does that.
20
+ ...(deps.providerOptions
21
+ ? { providerOptions: deps.providerOptions }
22
+ : {}),
17
23
  });
18
24
  const text = result.text;
19
25
  return parseCandidates(text, maxCandidates);
@@ -1 +1 @@
1
- {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/enrichment/suggest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAerB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAwB,EACxB,OAA0B,EAC1B,KAAoB,EACpB,OAA8B,EAAE;IAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,CAAC;IAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK;QACL,MAAM,EAAE,wBAAwB;QAChC,MAAM,EAAE,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC;QAClD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,GAAG;KACrC,CAAC,CAAC;IACH,MAAM,IAAI,GAAI,MAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,UAAU,GAA0B,EAAE,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,IAAI,UAAU,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM;IACtC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/enrichment/suggest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAsBrB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAwB,EACxB,OAA0B,EAC1B,KAAoB,EACpB,OAA8B,EAAE;IAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,CAAC;IAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK;QACL,YAAY,EAAE,wBAAwB;QACtC,MAAM,EAAE,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC;QAClD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,GAAG;QACpC,oEAAoE;QACpE,uEAAuE;QACvE,4DAA4D;QAC5D,GAAG,CAAC,IAAI,CAAC,eAAe;YACtB,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAwE,EAAE;YACpG,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,MAAM,IAAI,GAAI,MAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,UAAU,GAA0B,EAAE,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,IAAI,UAAU,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM;IACtC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
package/dist/errors.d.ts CHANGED
@@ -23,6 +23,11 @@ export declare class TenantScopeError extends AskDbError {
23
23
  readonly reason: TenantScopeRejectionReason;
24
24
  constructor(message: string, reason: TenantScopeRejectionReason);
25
25
  }
26
+ export type QueryParameterRejectionReason = "INVALID_NAME" | "RESERVED_NAME" | "INVALID_VALUE" | "MISSING_VALUE" | "UNRESOLVED_PLACEHOLDER" | "INVALID_LIST_CONTEXT" | "DIALECT_UNSUPPORTED";
27
+ export declare class QueryParameterError extends AskDbError {
28
+ readonly reason: QueryParameterRejectionReason;
29
+ constructor(message: string, reason: QueryParameterRejectionReason);
30
+ }
26
31
  export type TenantGuardrailRuleCode = "MISSING_TENANT_PREDICATE" | "MISSING_TYPE_DISCRIMINATOR" | "INCOMPATIBLE_JOIN_SCOPES" | "UNKNOWN_TABLE_REFERENCED" | "CROSS_TENANT_WITHOUT_GLOBAL" | "UNPROVABLE_SCOPE";
27
32
  export type TenantGuardrailWarning = {
28
33
  rule: TenantGuardrailRuleCode;
@@ -33,4 +38,48 @@ export declare class TenantGuardrailError extends AskDbError {
33
38
  readonly warnings: TenantGuardrailWarning[];
34
39
  constructor(message: string, warnings: TenantGuardrailWarning[]);
35
40
  }
41
+ /** How a sensitive identifier was matched inside a statement. */
42
+ export type SensitiveMatchKind =
43
+ /** `table.column` or `alias.column` where the alias binds to the owning table. */
44
+ "qualified"
45
+ /** Bare `column`, counted only because the owning table is in the statement's scope. */
46
+ | "unqualified"
47
+ /** The sensitive table itself appears as a `FROM`/`JOIN` target (`column` is `"*"`). */
48
+ | "table";
49
+ /** A sensitive table/column the statement was found to reference. */
50
+ export type SensitiveReference = {
51
+ /** Table name exactly as spelled in the schema artifact (never schema-qualified). */
52
+ table: string;
53
+ /** Database schema (namespace) the table belongs to, when the artifact records one. */
54
+ schema?: string;
55
+ /** Column name, or `"*"` when `matchKind` is `"table"`. */
56
+ column: string;
57
+ matchKind: SensitiveMatchKind;
58
+ };
59
+ /** Why the statement's table scope could not be resolved with confidence. */
60
+ export type SensitiveScopeIssue =
61
+ /** No `FROM`/`JOIN` target resolved, so unqualified names cannot be bound to a table. */
62
+ "NO_TABLE_SOURCE"
63
+ /** A `qualifier.column` reference whose qualifier is neither a known table, alias, nor CTE. */
64
+ | "UNKNOWN_QUALIFIER"
65
+ /** A table source that is not a relation name (table function, `VALUES`, …). */
66
+ | "OPAQUE_TABLE_SOURCE";
67
+ /** Conservative-failure report attached when scope resolution was incomplete. */
68
+ export type SensitiveScopeReport = {
69
+ issues: SensitiveScopeIssue[];
70
+ /**
71
+ * True when at least one unqualified name was matched against *every* sensitive
72
+ * column in the schema rather than only the columns of in-scope tables.
73
+ */
74
+ widened: boolean;
75
+ message: string;
76
+ };
77
+ /** Machine-readable ids for the sensitive-identifier guardrail (mirrors {@link TenantGuardrailRuleCode}). */
78
+ export type SensitiveReferenceRuleCode = "SENSITIVE_TABLE_REFERENCED" | "SENSITIVE_COLUMN_REFERENCED" | "UNRESOLVED_TABLE_SCOPE";
79
+ export declare class SensitiveReferenceError extends AskDbError {
80
+ readonly rule: SensitiveReferenceRuleCode;
81
+ readonly references: SensitiveReference[];
82
+ readonly unresolvedScope?: SensitiveScopeReport | undefined;
83
+ constructor(message: string, rule: SensitiveReferenceRuleCode, references: SensitiveReference[], unresolvedScope?: SensitiveScopeReport | undefined);
84
+ }
36
85
  //# sourceMappingURL=errors.d.ts.map
@@ -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;AAE5B,qBAAa,kBAAmB,SAAQ,UAAU;aAG9B,IAAI,EAAE,qBAAqB;IAC3C,8DAA8D;aAC9C,IAAI,CAAC,EAAE,MAAM;gBAH7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,qBAAqB;IAC3C,8DAA8D;IAC9C,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,MAAM,MAAM,0BAA0B,GAClC,eAAe,GACf,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,CAAC;AAE1B,qBAAa,gBAAiB,SAAQ,UAAU;aAG5B,MAAM,EAAE,0BAA0B;gBADlD,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,0BAA0B;CAKrD;AAED,MAAM,MAAM,uBAAuB,GAC/B,0BAA0B,GAC1B,4BAA4B,GAC5B,0BAA0B,GAC1B,0BAA0B,GAC1B,6BAA6B,GAC7B,kBAAkB,CAAC;AAEvB,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,UAAU;aAGhC,QAAQ,EAAE,sBAAsB,EAAE;gBADlD,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,sBAAsB,EAAE;CAKrD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/errors.js CHANGED
@@ -38,6 +38,14 @@ export class TenantScopeError extends AskDbError {
38
38
  this.name = "TenantScopeError";
39
39
  }
40
40
  }
41
+ export class QueryParameterError extends AskDbError {
42
+ reason;
43
+ constructor(message, reason) {
44
+ super(message);
45
+ this.reason = reason;
46
+ this.name = "QueryParameterError";
47
+ }
48
+ }
41
49
  export class TenantGuardrailError extends AskDbError {
42
50
  warnings;
43
51
  constructor(message, warnings) {
@@ -46,4 +54,16 @@ export class TenantGuardrailError extends AskDbError {
46
54
  this.name = "TenantGuardrailError";
47
55
  }
48
56
  }
57
+ export class SensitiveReferenceError extends AskDbError {
58
+ rule;
59
+ references;
60
+ unresolvedScope;
61
+ constructor(message, rule, references, unresolvedScope) {
62
+ super(message);
63
+ this.rule = rule;
64
+ this.references = references;
65
+ this.unresolvedScope = unresolvedScope;
66
+ this.name = "SensitiveReferenceError";
67
+ }
68
+ }
49
69
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGjB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAUD,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAG9B;IAEA;IAJlB,YACE,OAAe,EACC,IAA2B;IAC3C,8DAA8D;IAC9C,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAuB;QAE3B,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAQD,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAG5B;IAFlB,YACE,OAAe,EACC,MAAkC;QAElD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAA4B;QAGlD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAgBD,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAGhC;IAFlB,YACE,OAAe,EACC,QAAkC;QAElD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,aAAQ,GAAR,QAAQ,CAA0B;QAGlD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGjB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAUD,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAG9B;IAEA;IAJlB,YACE,OAAe,EACC,IAA2B;IAC3C,8DAA8D;IAC9C,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAuB;QAE3B,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAQD,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAG5B;IAFlB,YACE,OAAe,EACC,MAAkC;QAElD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAA4B;QAGlD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAWD,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IAG/B;IAFlB,YACE,OAAe,EACC,MAAqC;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAA+B;QAGrD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAgBD,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAGhC;IAFlB,YACE,OAAe,EACC,QAAkC;QAElD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,aAAQ,GAAR,QAAQ,CAA0B;QAGlD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAgDD,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IAGnC;IACA;IACA;IAJlB,YACE,OAAe,EACC,IAAgC,EAChC,UAAgC,EAChC,eAAsC;QAEtD,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAA4B;QAChC,eAAU,GAAV,UAAU,CAAsB;QAChC,oBAAe,GAAf,eAAe,CAAuB;QAGtD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export type TabularResult = {
2
+ columns: string[];
3
+ rows: unknown[][];
4
+ };
5
+ export declare function executeReadOnlySelect(connectionString: string, sql: string): Promise<TabularResult>;
6
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/exec/postgres.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAuBzG"}
@@ -0,0 +1,30 @@
1
+ import pg from "pg";
2
+ import { SqlExecutionError } from "../errors.js";
3
+ export async function executeReadOnlySelect(connectionString, sql) {
4
+ const pool = new pg.Pool({ connectionString });
5
+ const client = await pool.connect();
6
+ try {
7
+ await client.query("BEGIN READ ONLY");
8
+ const res = await client.query(sql);
9
+ await client.query("COMMIT");
10
+ const fields = res.fields ?? [];
11
+ const columns = fields.map((f) => f.name);
12
+ const rows = res.rows.map((row) => fields.map((f) => row[f.name]));
13
+ return { columns, rows };
14
+ }
15
+ catch (e) {
16
+ try {
17
+ await client.query("ROLLBACK");
18
+ }
19
+ catch {
20
+ /* ignore */
21
+ }
22
+ const message = e instanceof Error ? e.message : String(e);
23
+ throw new SqlExecutionError(`PostgreSQL execution failed: ${message}`, e);
24
+ }
25
+ finally {
26
+ client.release();
27
+ await pool.end();
28
+ }
29
+ }
30
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/exec/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOjD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,gBAAwB,EAAE,GAAW;IAC/E,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAA2B,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,iBAAiB,CAAC,gCAAgC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}