@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/validate.d.ts
CHANGED
|
@@ -1,8 +1,28 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type DialectSpec } from "./dialect-spec.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Read-only SELECT check for model-generated SQL. It is **defense in depth**, not a
|
|
4
|
+
* security boundary: it lexes SQL the way the target engine does and rejects shapes
|
|
5
|
+
* that are clearly not a single read-only query, but it is not a SQL parser and cannot
|
|
6
|
+
* prove a statement is harmless. Run generated SQL under a database role that can only
|
|
7
|
+
* read what the caller may see.
|
|
8
|
+
*
|
|
9
|
+
* Checks, in order (the first failure throws {@link SqlValidationError}):
|
|
10
|
+
*
|
|
11
|
+
* 1. `SQL_EMPTY` — nothing left after trimming.
|
|
12
|
+
* 2. `SQL_UNTERMINATED` — a string, quoted identifier, dollar-quoted string, or block
|
|
13
|
+
* comment never closes. Fails closed rather than guessing where it ends.
|
|
14
|
+
* 3. `SQL_MULTI_STATEMENT` — any `;` other than a single trailing one.
|
|
15
|
+
* 4. `SQL_COMMENT` — any comment (`--`, `/* *\/`, and MySQL `#`).
|
|
16
|
+
* 5. `SQL_NOT_SELECT_OR_WITH` — the first token (after any `(`) is not `SELECT`/`WITH`.
|
|
17
|
+
* 6. `SQL_FORBIDDEN_KEYWORD` — an unquoted keyword from the shared denylist or the
|
|
18
|
+
* dialect's `extraForbiddenKeywords`.
|
|
19
|
+
* 7. `SQL_FORBIDDEN_FUNCTION` — a call (`name(`) to a function in the dialect's
|
|
20
|
+
* `blockedFunctions` (side-effecting or file/network/sleep functions).
|
|
21
|
+
*
|
|
22
|
+
* Then the dialect's `extraValidate` runs on the normalized SQL (trailing `;` removed).
|
|
23
|
+
*
|
|
24
|
+
* The lexer follows `dialect.id`. When the id is not a built-in engine family, the SQL
|
|
25
|
+
* must pass under every built-in lexer with every built-in denylist.
|
|
6
26
|
*/
|
|
7
27
|
export declare function validateSelectSql(dialect: DialectSpec, sql: string): string;
|
|
8
28
|
/** Explanation of guardrails satisfied by a string already passing {@link validateSelectSql}. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/sql/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/sql/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAwCxE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CA0B3E;AAuHD,iGAAiG;AACjG,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,sBAAsB,CAiB5F"}
|
package/dist/sql/validate.js
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { SqlValidationError } from "../errors.js";
|
|
2
|
+
import { BUILT_IN_DIALECTS } from "./dialect-spec.js";
|
|
3
|
+
import { ENGINE_LEXER_PROFILES, GENERIC_LEXER, lexSql, lexerProfileFor, } from "./lexer.js";
|
|
4
|
+
/**
|
|
5
|
+
* Keywords rejected in every dialect. Matched against unquoted word tokens only, so
|
|
6
|
+
* `deleted_at`, `"delete"`, and `'delete me'` are unaffected.
|
|
7
|
+
*
|
|
8
|
+
* `into` covers `SELECT … INTO new_table` (creates a table), MySQL `INTO OUTFILE` /
|
|
9
|
+
* `INTO DUMPFILE` / `INTO @var`, and T-SQL `SELECT … INTO`. No read-only SELECT needs it.
|
|
10
|
+
* `merge` covers data-modifying `MERGE` inside a CTE (Postgres 17+) and T-SQL `MERGE`.
|
|
11
|
+
*/
|
|
2
12
|
const BASE_FORBIDDEN = [
|
|
3
13
|
"insert",
|
|
4
14
|
"update",
|
|
@@ -13,118 +23,148 @@ const BASE_FORBIDDEN = [
|
|
|
13
23
|
"analyze",
|
|
14
24
|
"copy",
|
|
15
25
|
"call",
|
|
26
|
+
"merge",
|
|
27
|
+
"into",
|
|
16
28
|
];
|
|
17
29
|
function validationError(rule, summary, hint) {
|
|
18
30
|
return new SqlValidationError(summary, rule, hint);
|
|
19
31
|
}
|
|
20
32
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
33
|
+
* Read-only SELECT check for model-generated SQL. It is **defense in depth**, not a
|
|
34
|
+
* security boundary: it lexes SQL the way the target engine does and rejects shapes
|
|
35
|
+
* that are clearly not a single read-only query, but it is not a SQL parser and cannot
|
|
36
|
+
* prove a statement is harmless. Run generated SQL under a database role that can only
|
|
37
|
+
* read what the caller may see.
|
|
38
|
+
*
|
|
39
|
+
* Checks, in order (the first failure throws {@link SqlValidationError}):
|
|
40
|
+
*
|
|
41
|
+
* 1. `SQL_EMPTY` — nothing left after trimming.
|
|
42
|
+
* 2. `SQL_UNTERMINATED` — a string, quoted identifier, dollar-quoted string, or block
|
|
43
|
+
* comment never closes. Fails closed rather than guessing where it ends.
|
|
44
|
+
* 3. `SQL_MULTI_STATEMENT` — any `;` other than a single trailing one.
|
|
45
|
+
* 4. `SQL_COMMENT` — any comment (`--`, `/* *\/`, and MySQL `#`).
|
|
46
|
+
* 5. `SQL_NOT_SELECT_OR_WITH` — the first token (after any `(`) is not `SELECT`/`WITH`.
|
|
47
|
+
* 6. `SQL_FORBIDDEN_KEYWORD` — an unquoted keyword from the shared denylist or the
|
|
48
|
+
* dialect's `extraForbiddenKeywords`.
|
|
49
|
+
* 7. `SQL_FORBIDDEN_FUNCTION` — a call (`name(`) to a function in the dialect's
|
|
50
|
+
* `blockedFunctions` (side-effecting or file/network/sleep functions).
|
|
51
|
+
*
|
|
52
|
+
* Then the dialect's `extraValidate` runs on the normalized SQL (trailing `;` removed).
|
|
53
|
+
*
|
|
54
|
+
* The lexer follows `dialect.id`. When the id is not a built-in engine family, the SQL
|
|
55
|
+
* must pass under every built-in lexer with every built-in denylist.
|
|
24
56
|
*/
|
|
25
57
|
export function validateSelectSql(dialect, sql) {
|
|
26
58
|
const trimmed = sql.trim();
|
|
27
59
|
if (!trimmed) {
|
|
28
60
|
throw validationError("SQL_EMPTY", "Generated SQL is empty after extraction.", "The model reply had no usable ```sql fenced block or the block was blank. Retry with a clearer question or inspect the raw model output with logging.");
|
|
29
61
|
}
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
62
|
+
const profile = lexerProfileFor(dialect);
|
|
63
|
+
let tokens;
|
|
64
|
+
if (profile) {
|
|
65
|
+
tokens = checkWithProfile(trimmed, profile, forbiddenKeywordsFor(dialect), blockedFunctionsFor(dialect));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Unknown engine: every plausible reading of the SQL must be safe.
|
|
69
|
+
const keywords = new Set([...forbiddenKeywordsFor(dialect), ...allBuiltInKeywords()]);
|
|
70
|
+
const functions = new Set([...blockedFunctionsFor(dialect), ...allBuiltInFunctions()]);
|
|
71
|
+
tokens = [];
|
|
72
|
+
for (const p of ENGINE_LEXER_PROFILES)
|
|
73
|
+
tokens = checkWithProfile(trimmed, p, keywords, functions);
|
|
74
|
+
}
|
|
75
|
+
const last = tokens[tokens.length - 1];
|
|
76
|
+
const normalized = isPunct(last, ";") ? trimmed.slice(0, last.start).trim() : trimmed;
|
|
77
|
+
dialect.extraValidate?.(normalized);
|
|
78
|
+
return normalized;
|
|
79
|
+
}
|
|
80
|
+
function checkWithProfile(sql, profile, keywords, functions) {
|
|
81
|
+
const tokens = lexSql(sql, profile);
|
|
82
|
+
const open = tokens.find((t) => t.unterminated);
|
|
83
|
+
if (open) {
|
|
84
|
+
throw validationError("SQL_UNTERMINATED", `Generated SQL has an unterminated ${describeToken(open)}.`, "A quote, dollar-quote, or block comment never closes, so where the statement ends is ambiguous. Regenerate the query; the validator fails closed rather than guessing.");
|
|
85
|
+
}
|
|
86
|
+
tokens.forEach((t, idx) => {
|
|
87
|
+
if (isPunct(t, ";") && idx !== tokens.length - 1) {
|
|
34
88
|
throw validationError("SQL_MULTI_STATEMENT", "Multiple SQL statements are not allowed (semicolon separates more than one statement).", "Ask for a single SELECT (WITH … SELECT allowed). Split analytical steps into separate questions or use a CTE instead of multiple statements.");
|
|
35
89
|
}
|
|
90
|
+
});
|
|
91
|
+
const commentLike = tokens.some((t, idx) => t.kind === "comment" ||
|
|
92
|
+
// `--` / `/*` that this dialect lexes as operators (MySQL `1--1`) are still rejected,
|
|
93
|
+
// matching the historical "no comment markers" policy.
|
|
94
|
+
(t.kind === "punct" &&
|
|
95
|
+
((t.text === "-" && isAdjacentPunct(t, tokens[idx + 1], "-")) ||
|
|
96
|
+
(t.text === "/" && isAdjacentPunct(t, tokens[idx + 1], "*")))));
|
|
97
|
+
if (commentLike) {
|
|
98
|
+
throw validationError("SQL_COMMENT", "SQL comments (-- or /* … */, and # in MySQL) are not allowed under current guardrails.", "Remove comments from generated SQL; rely on clear column aliases and CTE names instead.");
|
|
36
99
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (head !== "select" && head !== "with") {
|
|
42
|
-
throw validationError("SQL_NOT_SELECT_OR_WITH", `SQL must start with SELECT or WITH (got '${head || "none"}').`, "Regenerate as a read-only SELECT (optionally with WITH). INSERT/UPDATE/DELETE and procedural calls are blocked in dev guardrails.");
|
|
100
|
+
const head = headToken(tokens);
|
|
101
|
+
if (head?.kind !== "word" || (head.lower !== "select" && head.lower !== "with")) {
|
|
102
|
+
const got = head ? head.value.toLowerCase() : "";
|
|
103
|
+
throw validationError("SQL_NOT_SELECT_OR_WITH", `SQL must start with SELECT or WITH (got '${got || "none"}').`, "Regenerate as a read-only SELECT (optionally with WITH). INSERT/UPDATE/DELETE and procedural calls are blocked in dev guardrails.");
|
|
43
104
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const re = new RegExp(`\\b${word}\\b`, "i");
|
|
48
|
-
if (re.test(lower)) {
|
|
49
|
-
throw validationError("SQL_FORBIDDEN_KEYWORD", `Forbidden keyword in generated SQL: ${word.toUpperCase()}.`, `Matched whole-word guardrail keyword "${word}". This build allows read-only SELECT shape only; DDL/DML and similar verbs are rejected.`);
|
|
105
|
+
for (const t of tokens) {
|
|
106
|
+
if (t.kind === "word" && keywords.has(t.lower)) {
|
|
107
|
+
throw validationError("SQL_FORBIDDEN_KEYWORD", `Forbidden keyword in generated SQL: ${t.lower.toUpperCase()}.`, `Matched whole-word guardrail keyword "${t.lower}". This build allows read-only SELECT shape only; DDL/DML, SELECT … INTO, and similar verbs are rejected.`);
|
|
50
108
|
}
|
|
51
109
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
110
|
+
tokens.forEach((t, idx) => {
|
|
111
|
+
const nameLike = t.kind === "word" || t.kind === "quoted_identifier" || (t.kind === "string" && t.quote === '"');
|
|
112
|
+
if (!nameLike)
|
|
113
|
+
return;
|
|
114
|
+
const name = t.kind === "string" ? t.text.slice(1, -1).toLowerCase() : t.lower;
|
|
115
|
+
if (functions.has(name) && isPunct(tokens[idx + 1], "(")) {
|
|
116
|
+
throw validationError("SQL_FORBIDDEN_FUNCTION", `Forbidden function in generated SQL: ${name}().`, `"${name}" has side effects (writes, file or network access, sleeping, session changes) and is blocked for this dialect. Remove the call.`);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return tokens;
|
|
120
|
+
}
|
|
121
|
+
function forbiddenKeywordsFor(dialect) {
|
|
122
|
+
return new Set([...BASE_FORBIDDEN, ...(dialect.extraForbiddenKeywords ?? [])].map((w) => w.toLowerCase()));
|
|
123
|
+
}
|
|
124
|
+
function blockedFunctionsFor(dialect) {
|
|
125
|
+
return new Set((dialect.blockedFunctions ?? []).map((w) => w.toLowerCase()));
|
|
126
|
+
}
|
|
127
|
+
function allBuiltInKeywords() {
|
|
128
|
+
return Object.values(BUILT_IN_DIALECTS).flatMap((d) => [...(d.extraForbiddenKeywords ?? [])]);
|
|
129
|
+
}
|
|
130
|
+
function allBuiltInFunctions() {
|
|
131
|
+
return Object.values(BUILT_IN_DIALECTS).flatMap((d) => [...(d.blockedFunctions ?? [])]);
|
|
132
|
+
}
|
|
133
|
+
function isPunct(t, text) {
|
|
134
|
+
return t?.kind === "punct" && t.text === text;
|
|
135
|
+
}
|
|
136
|
+
function isAdjacentPunct(t, next, text) {
|
|
137
|
+
return isPunct(next, text) && next.start === t.end;
|
|
138
|
+
}
|
|
139
|
+
/** First significant token, skipping leading `(` so `(SELECT …) UNION (SELECT …)` passes. */
|
|
140
|
+
function headToken(tokens) {
|
|
141
|
+
return tokens.find((t) => !isPunct(t, "("));
|
|
142
|
+
}
|
|
143
|
+
function describeToken(t) {
|
|
144
|
+
if (t.kind === "comment")
|
|
145
|
+
return "block comment";
|
|
146
|
+
if (t.kind === "quoted_identifier")
|
|
147
|
+
return "quoted identifier";
|
|
148
|
+
if (t.quote?.startsWith("$"))
|
|
149
|
+
return "dollar-quoted string";
|
|
150
|
+
return "string literal";
|
|
55
151
|
}
|
|
56
152
|
/** Build a structured summary for hosts/CLI `--explain`; input must already be validated. */
|
|
57
153
|
export function buildSelectGuardrailExplanation(validatedSql) {
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const statementKind = head === "with" ? "with" : "select";
|
|
154
|
+
const head = headToken(lexSql(validatedSql.trim(), GENERIC_LEXER));
|
|
155
|
+
const statementKind = head?.lower === "with" ? "with" : "select";
|
|
61
156
|
return {
|
|
62
157
|
statementKind,
|
|
63
158
|
checksVerified: [
|
|
64
159
|
"non_empty_sql",
|
|
160
|
+
"no_unterminated_literals_or_comments",
|
|
65
161
|
"single_statement",
|
|
66
162
|
"no_line_or_block_comments",
|
|
67
163
|
"leading_select_or_with",
|
|
68
164
|
"no_blocked_write_or_ddl_keywords",
|
|
165
|
+
"no_blocked_side_effect_functions",
|
|
69
166
|
],
|
|
70
|
-
remediationNote: "Heuristic
|
|
167
|
+
remediationNote: "Heuristic, lexer-based defense-in-depth checks only—not a SQL parser and not a security boundary. Execute generated SQL under a read-only database role, and review it before trusted execution.",
|
|
71
168
|
};
|
|
72
169
|
}
|
|
73
|
-
function stripSqlStringLiterals(sql) {
|
|
74
|
-
let out = "";
|
|
75
|
-
let i = 0;
|
|
76
|
-
while (i < sql.length) {
|
|
77
|
-
const ch = sql[i];
|
|
78
|
-
if (ch === "'") {
|
|
79
|
-
i++;
|
|
80
|
-
while (i < sql.length) {
|
|
81
|
-
if (sql[i] === "'" && sql[i + 1] === "'") {
|
|
82
|
-
i += 2;
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
if (sql[i] === "'") {
|
|
86
|
-
i++;
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
i++;
|
|
90
|
-
}
|
|
91
|
-
out += "''";
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
if (ch === '"') {
|
|
95
|
-
i++;
|
|
96
|
-
while (i < sql.length && sql[i] !== '"') {
|
|
97
|
-
if (sql[i] === "\\")
|
|
98
|
-
i++;
|
|
99
|
-
i++;
|
|
100
|
-
}
|
|
101
|
-
if (i < sql.length)
|
|
102
|
-
i++;
|
|
103
|
-
out += '""';
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
if (ch === "$" && /^\$\w*\$/.test(sql.slice(i))) {
|
|
107
|
-
const end = sql.indexOf("$", i + 1);
|
|
108
|
-
const tagEnd = sql.indexOf("$", end + 1);
|
|
109
|
-
if (tagEnd === -1)
|
|
110
|
-
return out + sql.slice(i);
|
|
111
|
-
i = tagEnd + 1;
|
|
112
|
-
out += "$$";
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
out += ch;
|
|
116
|
-
i++;
|
|
117
|
-
}
|
|
118
|
-
return out;
|
|
119
|
-
}
|
|
120
|
-
function firstMeaningfulToken(withoutStrings) {
|
|
121
|
-
const token = /([a-zA-Z_][\w$]*|"[^"]*")/.exec(withoutStrings.trim());
|
|
122
|
-
if (!token)
|
|
123
|
-
return "";
|
|
124
|
-
let t = token[1];
|
|
125
|
-
if (t.startsWith('"') && t.endsWith('"')) {
|
|
126
|
-
t = t.slice(1, -1);
|
|
127
|
-
}
|
|
128
|
-
return t.toLowerCase();
|
|
129
|
-
}
|
|
130
170
|
//# sourceMappingURL=validate.js.map
|
package/dist/sql/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/sql/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA8B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/sql/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askdb/core",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.43",
|
|
4
4
|
"description": "AskDB core: dialect-agnostic NL→SQL pipeline. Provides ask() orchestration, schema/IR types, modes, logging, and retrieval input. Bring your own dialect (e.g. @askdb/postgres).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"askdb",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"ai-sdk",
|
|
12
12
|
"schema-v2"
|
|
13
13
|
],
|
|
14
|
-
"homepage": "https://
|
|
14
|
+
"homepage": "https://askdb.tools/reference/core-api/",
|
|
15
15
|
"bugs": {
|
|
16
16
|
"url": "https://github.com/Ygilany/AskDB/issues"
|
|
17
17
|
},
|
|
@@ -23,12 +23,14 @@
|
|
|
23
23
|
"license": "Apache-2.0",
|
|
24
24
|
"author": "Yahya Gilany",
|
|
25
25
|
"type": "module",
|
|
26
|
+
"sideEffects": false,
|
|
26
27
|
"main": "./dist/index.js",
|
|
27
28
|
"types": "./dist/index.d.ts",
|
|
28
29
|
"exports": {
|
|
29
30
|
".": {
|
|
30
31
|
"types": "./dist/index.d.ts",
|
|
31
|
-
"import": "./dist/index.js"
|
|
32
|
+
"import": "./dist/index.js",
|
|
33
|
+
"default": "./dist/index.js"
|
|
32
34
|
}
|
|
33
35
|
},
|
|
34
36
|
"files": [
|
|
@@ -38,17 +40,17 @@
|
|
|
38
40
|
"NOTICE"
|
|
39
41
|
],
|
|
40
42
|
"engines": {
|
|
41
|
-
"node": ">=22"
|
|
43
|
+
"node": ">=22.12"
|
|
42
44
|
},
|
|
43
45
|
"dependencies": {
|
|
44
|
-
"ai": "^7.0.
|
|
46
|
+
"ai": "^7.0.113",
|
|
45
47
|
"gray-matter": "^4.0.3",
|
|
46
48
|
"pino": "^10.3.1",
|
|
47
|
-
"zod": "^4.
|
|
49
|
+
"zod": "^4.6.5"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
52
|
"typescript": "^6.0.3",
|
|
51
|
-
"vitest": "^
|
|
53
|
+
"vitest": "^5.0.1"
|
|
52
54
|
},
|
|
53
55
|
"scripts": {
|
|
54
56
|
"build": "tsc -p tsconfig.build.json",
|
package/dist/exec/postgres.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/exec/postgres.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { AskDbLogger } from "../logging/askdb-logger.js";
|
|
2
|
-
import type { AskDbModeV1 } from "./types.js";
|
|
3
|
-
/**
|
|
4
|
-
* After a successful read-only execute, record how the mode treats optional
|
|
5
|
-
* second-pass model context (summaries). v1 does not call the model again;
|
|
6
|
-
* modes differ only in contract + structured logs (`branch`).
|
|
7
|
-
*/
|
|
8
|
-
export declare function logPostExecuteModeBranch(logger: AskDbLogger | undefined, mode: AskDbModeV1, rowCount: number): void;
|
|
9
|
-
//# sourceMappingURL=post-execute-log.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"post-execute-log.d.ts","sourceRoot":"","sources":["../../src/modes/post-execute-log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,MAAM,GACf,IAAI,CAwBN"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { AskDbLogEvent } from "../logging/log-events.js";
|
|
2
|
-
/**
|
|
3
|
-
* After a successful read-only execute, record how the mode treats optional
|
|
4
|
-
* second-pass model context (summaries). v1 does not call the model again;
|
|
5
|
-
* modes differ only in contract + structured logs (`branch`).
|
|
6
|
-
*/
|
|
7
|
-
export function logPostExecuteModeBranch(logger, mode, rowCount) {
|
|
8
|
-
if (mode === "schema_only") {
|
|
9
|
-
logger?.info({
|
|
10
|
-
event: AskDbLogEvent.PipelinePostExecute,
|
|
11
|
-
mode,
|
|
12
|
-
branch: "skipped",
|
|
13
|
-
reason: "schema_only_no_row_data_to_model",
|
|
14
|
-
rowCount,
|
|
15
|
-
}, "post-execute: summary path skipped (schema_only)");
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
logger?.info({
|
|
19
|
-
event: AskDbLogEvent.PipelinePostExecute,
|
|
20
|
-
mode,
|
|
21
|
-
branch: "stub",
|
|
22
|
-
rowCount,
|
|
23
|
-
note: "bounded_results_stub_no_second_llm_call",
|
|
24
|
-
}, "post-execute: bounded_results stub branch (no row payload to model in v1)");
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=post-execute-log.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"post-execute-log.js","sourceRoot":"","sources":["../../src/modes/post-execute-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA+B,EAC/B,IAAiB,EACjB,QAAgB;IAEhB,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,EAAE,IAAI,CACV;YACE,KAAK,EAAE,aAAa,CAAC,mBAAmB;YACxC,IAAI;YACJ,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,kCAAkC;YAC1C,QAAQ;SACT,EACD,kDAAkD,CACnD,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,EAAE,IAAI,CACV;QACE,KAAK,EAAE,aAAa,CAAC,mBAAmB;QACxC,IAAI;QACJ,MAAM,EAAE,MAAM;QACd,QAAQ;QACR,IAAI,EAAE,yCAAyC;KAChD,EACD,2EAA2E,CAC5E,CAAC;AACJ,CAAC"}
|