@askdb/core 0.5.0-beta.4 → 1.0.0-beta.20
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 +7 -3
- package/dist/ai/provider.d.ts +2 -8
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +42 -11
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/types.d.ts +2 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/ask.d.ts +23 -3
- package/dist/ask.d.ts.map +1 -1
- package/dist/ask.js +32 -2
- package/dist/ask.js.map +1 -1
- package/dist/errors.d.ts +15 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -3
- 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 +8 -0
- package/dist/logging/log-events.d.ts.map +1 -1
- package/dist/logging/log-events.js +8 -0
- package/dist/logging/log-events.js.map +1 -1
- package/dist/retrieval/synthesize-ddl.d.ts.map +1 -1
- package/dist/retrieval/synthesize-ddl.js +12 -0
- package/dist/retrieval/synthesize-ddl.js.map +1 -1
- package/dist/retrieval/types.d.ts +1 -1
- package/dist/retrieval/types.d.ts.map +1 -1
- package/dist/schema/normalize.d.ts +2 -0
- package/dist/schema/normalize.d.ts.map +1 -1
- package/dist/schema/normalize.js +1 -0
- package/dist/schema/normalize.js.map +1 -1
- package/dist/schema/v2/describable.d.ts +4 -0
- package/dist/schema/v2/describable.d.ts.map +1 -1
- package/dist/schema/v2/describable.js +2 -0
- package/dist/schema/v2/describable.js.map +1 -1
- package/dist/schema/v2/format.d.ts.map +1 -1
- package/dist/schema/v2/format.js +6 -0
- package/dist/schema/v2/format.js.map +1 -1
- package/dist/schema/v2/index.d.ts +4 -1
- package/dist/schema/v2/index.d.ts.map +1 -1
- package/dist/schema/v2/index.js +3 -1
- package/dist/schema/v2/index.js.map +1 -1
- package/dist/schema/v2/loader.d.ts.map +1 -1
- package/dist/schema/v2/loader.js +32 -5
- package/dist/schema/v2/loader.js.map +1 -1
- package/dist/schema/v2/normalized.d.ts +4 -0
- package/dist/schema/v2/normalized.d.ts.map +1 -1
- package/dist/schema/v2/tenant-policy-loader.d.ts +13 -0
- package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -0
- package/dist/schema/v2/tenant-policy-loader.js +282 -0
- package/dist/schema/v2/tenant-policy-loader.js.map +1 -0
- package/dist/schema/v2/tenant-policy.d.ts +715 -0
- package/dist/schema/v2/tenant-policy.d.ts.map +1 -0
- package/dist/schema/v2/tenant-policy.js +135 -0
- package/dist/schema/v2/tenant-policy.js.map +1 -0
- package/dist/schema/v2/writer.d.ts +5 -0
- package/dist/schema/v2/writer.d.ts.map +1 -1
- package/dist/schema/v2/writer.js +32 -0
- package/dist/schema/v2/writer.js.map +1 -1
- package/dist/sql/generate.d.ts +9 -2
- package/dist/sql/generate.d.ts.map +1 -1
- package/dist/sql/generate.js +23 -2
- package/dist/sql/generate.js.map +1 -1
- package/dist/sql/prompt.d.ts +2 -1
- package/dist/sql/prompt.d.ts.map +1 -1
- package/dist/sql/prompt.js +8 -1
- package/dist/sql/prompt.js.map +1 -1
- package/dist/sql/tenant-guardrail.d.ts +18 -0
- package/dist/sql/tenant-guardrail.d.ts.map +1 -0
- package/dist/sql/tenant-guardrail.js +132 -0
- package/dist/sql/tenant-guardrail.js.map +1 -0
- package/dist/sql/tenant-placeholders.d.ts +37 -0
- package/dist/sql/tenant-placeholders.d.ts.map +1 -0
- package/dist/sql/tenant-placeholders.js +156 -0
- package/dist/sql/tenant-placeholders.js.map +1 -0
- package/dist/sql/tenant-prompt.d.ts +8 -0
- package/dist/sql/tenant-prompt.d.ts.map +1 -0
- package/dist/sql/tenant-prompt.js +127 -0
- package/dist/sql/tenant-prompt.js.map +1 -0
- package/dist/sql/tenant-scope-validate.d.ts +8 -0
- package/dist/sql/tenant-scope-validate.d.ts.map +1 -0
- package/dist/sql/tenant-scope-validate.js +46 -0
- package/dist/sql/tenant-scope-validate.js.map +1 -0
- package/package.json +1 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-policy.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOlB,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAMrB,CAAC;AAuBZ,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAA8D,CAAC;AAEvF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKnB,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAOxB,CAAC;AAEZ,eAAO,MAAM,qBAAqB,+BAA6B,CAAC;AAEhE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU/B,CAAC;AAMZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAMpF,eAAO,MAAM,yBAAyB,iEAI5B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM/E,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,uBAAuB,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1D,CAAC;AAMF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,KAAK,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kBAAkB,EAAE,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,EAAE,CAAC;KACf,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,mBAAmB,GACnB,qBAAqB,GACrB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B,CAAC;AAoCF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAK7B,CAAC;AAuBH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI5B,CAAC;AAMH,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,WAAW,GACX,aAAa,GACb,QAAQ,GACR,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,yBAAyB,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,0BAA0B,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,+BAA+B,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,0BAA0B,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1D,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Front-matter zod schemas (validated when parsing tenant-policy.md)
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const tenantRootParentSchema = z
|
|
6
|
+
.object({
|
|
7
|
+
root: z.string().min(1),
|
|
8
|
+
foreignKey: z.string().min(1),
|
|
9
|
+
})
|
|
10
|
+
.strict();
|
|
11
|
+
export const tenantRootSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
id: z.string().min(1),
|
|
14
|
+
tenantIdColumn: z.string().min(1),
|
|
15
|
+
label: z.string().min(1),
|
|
16
|
+
parent: tenantRootParentSchema.optional(),
|
|
17
|
+
})
|
|
18
|
+
.strict();
|
|
19
|
+
export const hierarchyEdgeSchema = z
|
|
20
|
+
.object({
|
|
21
|
+
parent: z.string().min(1),
|
|
22
|
+
child: z.string().min(1),
|
|
23
|
+
foreignKey: z.string().min(1),
|
|
24
|
+
})
|
|
25
|
+
.strict();
|
|
26
|
+
const scopeThroughColumnSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
root: z.string().min(1),
|
|
29
|
+
column: z.string().min(1),
|
|
30
|
+
})
|
|
31
|
+
.strict();
|
|
32
|
+
const joinStepSchema = z
|
|
33
|
+
.object({
|
|
34
|
+
from: z.string().min(1),
|
|
35
|
+
to: z.string().min(1),
|
|
36
|
+
})
|
|
37
|
+
.strict();
|
|
38
|
+
const scopeThroughJoinSchema = z
|
|
39
|
+
.object({
|
|
40
|
+
root: z.string().min(1),
|
|
41
|
+
join: z.array(joinStepSchema).min(1),
|
|
42
|
+
})
|
|
43
|
+
.strict();
|
|
44
|
+
const scopeThroughSchema = z.union([scopeThroughColumnSchema, scopeThroughJoinSchema]);
|
|
45
|
+
export const scopedTableSchema = z
|
|
46
|
+
.object({
|
|
47
|
+
id: z.string().min(1),
|
|
48
|
+
scopeThrough: z.array(scopeThroughSchema).min(1),
|
|
49
|
+
})
|
|
50
|
+
.strict();
|
|
51
|
+
export const polymorphicTableSchema = z
|
|
52
|
+
.object({
|
|
53
|
+
id: z.string().min(1),
|
|
54
|
+
typeColumn: z.string().min(1),
|
|
55
|
+
idColumn: z.string().min(1),
|
|
56
|
+
mapping: z.record(z.string(), z.string().min(1)),
|
|
57
|
+
})
|
|
58
|
+
.strict();
|
|
59
|
+
export const enforcementModeSchema = z.enum(["strict", "warn"]);
|
|
60
|
+
export const tenantPolicyFrontmatterSchema = z
|
|
61
|
+
.object({
|
|
62
|
+
schemaId: z.string().min(1),
|
|
63
|
+
enforcement: enforcementModeSchema,
|
|
64
|
+
roots: z.array(tenantRootSchema).min(1),
|
|
65
|
+
hierarchy: z.array(hierarchyEdgeSchema).optional(),
|
|
66
|
+
scopedTables: z.array(scopedTableSchema).optional(),
|
|
67
|
+
polymorphicTables: z.array(polymorphicTableSchema).optional(),
|
|
68
|
+
globalTables: z.array(z.string().min(1)).optional(),
|
|
69
|
+
})
|
|
70
|
+
.strict();
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Recognized H2 sections in tenant-policy.md body
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
export const TENANT_POLICY_H2_SECTIONS = [
|
|
75
|
+
"Hierarchy",
|
|
76
|
+
"Scope rules",
|
|
77
|
+
"Sensitive interactions",
|
|
78
|
+
];
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Zod schemas for runtime scope validation
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
const tenantAccessIdsSchema = z.object({
|
|
83
|
+
kind: z.literal("ids"),
|
|
84
|
+
tenantRoot: z.string().min(1),
|
|
85
|
+
ids: z.array(z.string()).min(1),
|
|
86
|
+
});
|
|
87
|
+
const tenantAccessSubtreeSchema = z.object({
|
|
88
|
+
kind: z.literal("subtree"),
|
|
89
|
+
tenantRoot: z.string().min(1),
|
|
90
|
+
rootIds: z.array(z.string()).min(1),
|
|
91
|
+
includeDescendants: z.literal(true),
|
|
92
|
+
});
|
|
93
|
+
const tenantAccessMultiRootSchema = z.object({
|
|
94
|
+
kind: z.literal("multi_root"),
|
|
95
|
+
scopes: z
|
|
96
|
+
.array(z.object({
|
|
97
|
+
tenantRoot: z.string().min(1),
|
|
98
|
+
ids: z.array(z.string()).min(1),
|
|
99
|
+
}))
|
|
100
|
+
.min(1),
|
|
101
|
+
});
|
|
102
|
+
const tenantAccessGlobalSchema = z.object({
|
|
103
|
+
kind: z.literal("global"),
|
|
104
|
+
reason: z.string().min(1),
|
|
105
|
+
});
|
|
106
|
+
export const tenantAccessSchema = z.discriminatedUnion("kind", [
|
|
107
|
+
tenantAccessIdsSchema,
|
|
108
|
+
tenantAccessSubtreeSchema,
|
|
109
|
+
tenantAccessMultiRootSchema,
|
|
110
|
+
tenantAccessGlobalSchema,
|
|
111
|
+
]);
|
|
112
|
+
const tenantFilterConditionSchema = z.object({
|
|
113
|
+
column: z.string().min(1),
|
|
114
|
+
operator: z.enum(["=", "IN", "!=", "NOT IN"]),
|
|
115
|
+
value: z.union([z.string(), z.array(z.string())]),
|
|
116
|
+
});
|
|
117
|
+
const tenantFilterSchema = z.object({
|
|
118
|
+
conditions: z.array(tenantFilterConditionSchema).min(1),
|
|
119
|
+
});
|
|
120
|
+
const tenantScopeContextSchema = z
|
|
121
|
+
.object({
|
|
122
|
+
role: z.string().optional(),
|
|
123
|
+
label: z.string().optional(),
|
|
124
|
+
department: z.string().optional(),
|
|
125
|
+
region: z.string().optional(),
|
|
126
|
+
attributes: z.record(z.string(), z.string()).optional(),
|
|
127
|
+
description: z.string().optional(),
|
|
128
|
+
})
|
|
129
|
+
.strict();
|
|
130
|
+
export const tenantScopeSchema = z.object({
|
|
131
|
+
access: tenantAccessSchema,
|
|
132
|
+
tenantFilters: z.record(z.string(), tenantFilterSchema).optional(),
|
|
133
|
+
context: tenantScopeContextSchema.optional(),
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=tenant-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-policy.js","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { V2TableFrontmatter, V2ConceptsFrontmatter } from "./describable.js";
|
|
2
|
+
import type { TenantPolicyFrontmatter } from "./tenant-policy.js";
|
|
2
3
|
/**
|
|
3
4
|
* Serialize a table front-matter model back to markdown.
|
|
4
5
|
*
|
|
@@ -11,4 +12,8 @@ export declare function writeTableMarkdown(frontmatter: V2TableFrontmatter, body
|
|
|
11
12
|
* Serialize `concepts.md` front-matter + body back to markdown.
|
|
12
13
|
*/
|
|
13
14
|
export declare function writeConceptsMarkdown(frontmatter: V2ConceptsFrontmatter, body: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Serialize `tenant-policy.md` front-matter + body back to markdown.
|
|
17
|
+
*/
|
|
18
|
+
export declare function writeTenantPolicyMarkdown(frontmatter: TenantPolicyFrontmatter, body: string): string;
|
|
14
19
|
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpG"}
|
package/dist/schema/v2/writer.js
CHANGED
|
@@ -16,6 +16,38 @@ export function writeTableMarkdown(frontmatter, body) {
|
|
|
16
16
|
export function writeConceptsMarkdown(frontmatter, body) {
|
|
17
17
|
return matter.stringify(body, { concepts: frontmatter.concepts });
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Serialize `tenant-policy.md` front-matter + body back to markdown.
|
|
21
|
+
*/
|
|
22
|
+
export function writeTenantPolicyMarkdown(frontmatter, body) {
|
|
23
|
+
const data = orderedTenantPolicyFrontmatter(frontmatter);
|
|
24
|
+
return matter.stringify(body, data);
|
|
25
|
+
}
|
|
26
|
+
/** Emit tenant policy front-matter keys in a stable order. */
|
|
27
|
+
function orderedTenantPolicyFrontmatter(fm) {
|
|
28
|
+
const ordered = {};
|
|
29
|
+
ordered["schemaId"] = fm.schemaId;
|
|
30
|
+
ordered["enforcement"] = fm.enforcement;
|
|
31
|
+
ordered["roots"] = fm.roots.map((r) => {
|
|
32
|
+
const root = {
|
|
33
|
+
id: r.id,
|
|
34
|
+
tenantIdColumn: r.tenantIdColumn,
|
|
35
|
+
label: r.label,
|
|
36
|
+
};
|
|
37
|
+
if (r.parent)
|
|
38
|
+
root["parent"] = r.parent;
|
|
39
|
+
return root;
|
|
40
|
+
});
|
|
41
|
+
if (fm.hierarchy && fm.hierarchy.length > 0)
|
|
42
|
+
ordered["hierarchy"] = fm.hierarchy;
|
|
43
|
+
if (fm.scopedTables && fm.scopedTables.length > 0)
|
|
44
|
+
ordered["scopedTables"] = fm.scopedTables;
|
|
45
|
+
if (fm.polymorphicTables && fm.polymorphicTables.length > 0)
|
|
46
|
+
ordered["polymorphicTables"] = fm.polymorphicTables;
|
|
47
|
+
if (fm.globalTables && fm.globalTables.length > 0)
|
|
48
|
+
ordered["globalTables"] = fm.globalTables;
|
|
49
|
+
return ordered;
|
|
50
|
+
}
|
|
19
51
|
/** Emit front-matter keys in a stable, spec-defined order. */
|
|
20
52
|
function orderedTableFrontmatter(fm) {
|
|
21
53
|
const ordered = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/schema/v2/writer.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/schema/v2/writer.ts"],"names":[],"mappings":"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"}
|
package/dist/sql/generate.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { LanguageModel } from "ai";
|
|
2
1
|
import { generateText as defaultGenerateText } from "ai";
|
|
2
|
+
import type { AskDbLanguageModel } from "../ai/types.js";
|
|
3
3
|
import type { AskDbLogger } from "../logging/askdb-logger.js";
|
|
4
4
|
import type { AnyNormalizedSchema } from "../schema/types.js";
|
|
5
|
+
import type { NormalizedTenantPolicy, TenantScope } from "../schema/v2/tenant-policy.js";
|
|
5
6
|
import type { DialectSpec } from "./dialect-spec.js";
|
|
7
|
+
import { type TenantGuardrailResult } from "./tenant-guardrail.js";
|
|
6
8
|
import { type SelectGuardrailExplain } from "./validate.js";
|
|
7
9
|
export type GenerateSqlDeps = {
|
|
8
10
|
generateText?: typeof defaultGenerateText;
|
|
@@ -21,16 +23,21 @@ export type GenerateSqlDeps = {
|
|
|
21
23
|
* directly.
|
|
22
24
|
*/
|
|
23
25
|
prebuiltDdl?: string;
|
|
26
|
+
/** Normalized tenant policy from the schema artifact. Forwarded from ask(). */
|
|
27
|
+
tenantPolicy?: NormalizedTenantPolicy;
|
|
28
|
+
/** Validated tenant scope from the host. Forwarded from ask(). */
|
|
29
|
+
tenantScope?: TenantScope;
|
|
24
30
|
};
|
|
25
31
|
/** Result of NL→SQL generation (always includes `sql`; `explain` when {@link GenerateSqlDeps.explain}). */
|
|
26
32
|
export type GenerateSelectSqlResult = {
|
|
27
33
|
sql: string;
|
|
28
34
|
explain?: SelectGuardrailExplain;
|
|
35
|
+
tenantGuardrail?: TenantGuardrailResult;
|
|
29
36
|
};
|
|
30
37
|
/**
|
|
31
38
|
* Dialect-parameterized NL→SQL generator. Validates inputs, builds the user/system
|
|
32
39
|
* prompt with the dialect's syntax brief, calls the model, extracts the fenced SQL,
|
|
33
40
|
* and runs the shared read-only validator (plus any dialect-specific `extraValidate`).
|
|
34
41
|
*/
|
|
35
|
-
export declare function generateSelectSql(dialect: DialectSpec, question: string, schema: AnyNormalizedSchema, model:
|
|
42
|
+
export declare function generateSelectSql(dialect: DialectSpec, question: string, schema: AnyNormalizedSchema, model: AskDbLanguageModel, deps?: GenerateSqlDeps): Promise<GenerateSelectSqlResult>;
|
|
36
43
|
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qGAAqG;IACrG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,yCAAyC,CAAC,EAAE,OAAO,CAAC;IACpD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,kEAAkE;IAClE,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,2GAA2G;AAC3G,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,eAAe,CAAC,EAAE,qBAAqB,CAAC;CACzC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,kBAAkB,EACzB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,uBAAuB,CAAC,CA2FlC"}
|
package/dist/sql/generate.js
CHANGED
|
@@ -4,6 +4,7 @@ import { AskDbLogEvent } from "../logging/log-events.js";
|
|
|
4
4
|
import { extractSqlFromModelText } from "./extract-sql.js";
|
|
5
5
|
import { buildNlToSqlSystemPrompt, buildNlToSqlUserPrompt } from "./prompt.js";
|
|
6
6
|
import { assertNlToSqlInputs, nlToSqlAmbiguityNotes } from "./schema-question-precheck.js";
|
|
7
|
+
import { validateTenantGuardrails } from "./tenant-guardrail.js";
|
|
7
8
|
import { buildSelectGuardrailExplanation, validateSelectSql, } from "./validate.js";
|
|
8
9
|
/**
|
|
9
10
|
* Dialect-parameterized NL→SQL generator. Validates inputs, builds the user/system
|
|
@@ -29,7 +30,7 @@ export async function generateSelectSql(dialect, question, schema, model, deps =
|
|
|
29
30
|
const result = await generateText({
|
|
30
31
|
model,
|
|
31
32
|
system: buildNlToSqlSystemPrompt(dialect),
|
|
32
|
-
prompt: buildNlToSqlUserPrompt(dialect, question, schema, ambiguityNotes, logger, nlToSqlSchemaOptions, deps.prebuiltDdl),
|
|
33
|
+
prompt: buildNlToSqlUserPrompt(dialect, question, schema, ambiguityNotes, logger, nlToSqlSchemaOptions, deps.prebuiltDdl, deps.tenantPolicy, deps.tenantScope),
|
|
33
34
|
temperature: 0,
|
|
34
35
|
});
|
|
35
36
|
text = result.text;
|
|
@@ -40,12 +41,32 @@ export async function generateSelectSql(dialect, question, schema, model, deps =
|
|
|
40
41
|
}
|
|
41
42
|
const extracted = extractSqlFromModelText(text);
|
|
42
43
|
const sql = validateSelectSql(dialect, extracted);
|
|
44
|
+
// Tenant guardrail validation (after base validation, before returning)
|
|
45
|
+
let tenantGuardrail;
|
|
46
|
+
if (deps.tenantPolicy && deps.tenantScope) {
|
|
47
|
+
tenantGuardrail = validateTenantGuardrails(sql, deps.tenantPolicy, deps.tenantScope);
|
|
48
|
+
if (tenantGuardrail.passed) {
|
|
49
|
+
logger?.info({ event: AskDbLogEvent.TenantGuardrailPassed }, "tenant guardrail validation passed");
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
logger?.info({
|
|
53
|
+
event: AskDbLogEvent.TenantGuardrailFailed,
|
|
54
|
+
warningCount: tenantGuardrail.warnings.length,
|
|
55
|
+
enforcement: deps.tenantPolicy.enforcement,
|
|
56
|
+
}, "tenant guardrail validation found issues");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
43
59
|
const explain = deps.explain ? buildSelectGuardrailExplanation(sql) : undefined;
|
|
44
60
|
logger?.info({
|
|
45
61
|
event: AskDbLogEvent.PipelineGenerateComplete,
|
|
46
62
|
sqlCharCount: sql.length,
|
|
47
63
|
}, "nl-to-sql generate complete");
|
|
48
|
-
|
|
64
|
+
const result = { sql };
|
|
65
|
+
if (explain !== undefined)
|
|
66
|
+
result.explain = explain;
|
|
67
|
+
if (tenantGuardrail !== undefined)
|
|
68
|
+
result.tenantGuardrail = tenantGuardrail;
|
|
69
|
+
return result;
|
|
49
70
|
}
|
|
50
71
|
catch (e) {
|
|
51
72
|
const msg = e instanceof Error ? e.message : String(e);
|
package/dist/sql/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/sql/prompt.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AskDbLogger } from "../logging/askdb-logger.js";
|
|
2
2
|
import { type FormatNlToSqlOptions } from "../schema/normalize.js";
|
|
3
3
|
import type { AnyNormalizedSchema } from "../schema/types.js";
|
|
4
|
+
import type { NormalizedTenantPolicy, TenantScope } from "../schema/v2/tenant-policy.js";
|
|
4
5
|
import type { DialectSpec } from "./dialect-spec.js";
|
|
5
6
|
/**
|
|
6
7
|
* Build the dialect-parameterized NL→SQL user prompt. The same scaffolding is used
|
|
@@ -15,7 +16,7 @@ export declare function buildNlToSqlUserPrompt(dialect: DialectSpec, question: s
|
|
|
15
16
|
* still fires using the consumer-supplied `nlToSqlSchemaOptions` to keep
|
|
16
17
|
* observability consistent.
|
|
17
18
|
*/
|
|
18
|
-
prebuiltDdl?: string): string;
|
|
19
|
+
prebuiltDdl?: string, tenantPolicy?: NormalizedTenantPolicy, tenantScope?: TenantScope): string;
|
|
19
20
|
/** Dialect-parameterized system prompt for the NL→SQL generator. */
|
|
20
21
|
export declare function buildNlToSqlSystemPrompt(dialect: DialectSpec): string;
|
|
21
22
|
//# sourceMappingURL=prompt.d.ts.map
|
package/dist/sql/prompt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/sql/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/sql/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,cAAc,GAAE,SAAS,MAAM,EAAO,EACtC,MAAM,CAAC,EAAE,WAAW,EACpB,oBAAoB,CAAC,EAAE,oBAAoB;AAC3C;;;;;;GAMG;AACH,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,sBAAsB,EACrC,WAAW,CAAC,EAAE,WAAW,GACxB,MAAM,CA8DR;AAED,oEAAoE;AACpE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAErE"}
|
package/dist/sql/prompt.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AskDbLogEvent } from "../logging/log-events.js";
|
|
2
2
|
import { formatSchemaForNlToSql, } from "../schema/normalize.js";
|
|
3
3
|
import { formatSchemaV2ForNlToSql, } from "../schema/v2/index.js";
|
|
4
|
+
import { buildTenantPromptBlock } from "./tenant-prompt.js";
|
|
4
5
|
function isV2(schema) {
|
|
5
6
|
return "schemaId" in schema;
|
|
6
7
|
}
|
|
@@ -17,7 +18,7 @@ export function buildNlToSqlUserPrompt(dialect, question, schema, ambiguityNotes
|
|
|
17
18
|
* still fires using the consumer-supplied `nlToSqlSchemaOptions` to keep
|
|
18
19
|
* observability consistent.
|
|
19
20
|
*/
|
|
20
|
-
prebuiltDdl) {
|
|
21
|
+
prebuiltDdl, tenantPolicy, tenantScope) {
|
|
21
22
|
const formatted = isV2(schema)
|
|
22
23
|
? formatSchemaV2ForNlToSql(schema, nlToSqlSchemaOptions)
|
|
23
24
|
: formatSchemaForNlToSql(schema, nlToSqlSchemaOptions);
|
|
@@ -51,6 +52,12 @@ prebuiltDdl) {
|
|
|
51
52
|
ddl,
|
|
52
53
|
"",
|
|
53
54
|
];
|
|
55
|
+
// Tenant policy block (always injected when present — security boundary)
|
|
56
|
+
if (tenantPolicy && tenantScope) {
|
|
57
|
+
lines.push("");
|
|
58
|
+
lines.push(buildTenantPromptBlock(tenantPolicy, tenantScope));
|
|
59
|
+
lines.push("");
|
|
60
|
+
}
|
|
54
61
|
if (ambiguityNotes.length > 0) {
|
|
55
62
|
lines.push("Context (deterministic checks from AskDB—these hints may be irrelevant; weigh them against the question):");
|
|
56
63
|
for (const note of ambiguityNotes) {
|
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,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;
|
|
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;IAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5B,CAAC,CAAC,wBAAwB,CAAC,MAAM,EAAE,oBAAoB,CAAC;QACxD,CAAC,CAAC,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;IACzC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IAC9B,IACE,KAAK,CAAC,kCAAkC;QACxC,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,CAAC,EACpE,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,CACb;YACE,KAAK,EAAE,aAAa,CAAC,uBAAuB;YAC5C,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;YAC9C,uBAAuB,EAAE,KAAK,CAAC,uBAAuB;SACvD,EACD,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,IACE,CAAC,KAAK,CAAC,kCAAkC;QACzC,KAAK,CAAC,0BAA0B,GAAG,CAAC,EACpC,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,CACb;YACE,KAAK,EAAE,aAAa,CAAC,gCAAgC;YACrD,0BAA0B,EAAE,KAAK,CAAC,0BAA0B;SAC7D,EACD,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,0DAA0D,OAAO,CAAC,WAAW,+BAA+B;QAC5G,QAAQ;QACR,wBAAwB,OAAO,CAAC,WAAW,8DAA8D;QACzG,uGAAuG;QACvG,0FAA0F;QAC1F,mFAAmF;QACnF,oBAAoB,OAAO,CAAC,WAAW,EAAE;QACzC,EAAE;QACF,kBAAkB;QAClB,GAAG;QACH,EAAE;KACH,CAAC;IAEF,yEAAyE;IACzE,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,2GAA2G,CAC5G,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC3D,OAAO,sDAAsD,OAAO,CAAC,WAAW,oDAAoD,CAAC;AACvI,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type TenantGuardrailWarning } from "../errors.js";
|
|
2
|
+
import type { NormalizedTenantPolicy, TenantScope } from "../schema/v2/tenant-policy.js";
|
|
3
|
+
export type TenantGuardrailResult = {
|
|
4
|
+
passed: boolean;
|
|
5
|
+
warnings: TenantGuardrailWarning[];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Validate generated SQL against the tenant policy and runtime scope.
|
|
9
|
+
*
|
|
10
|
+
* Uses heuristic pattern matching to verify that tenant-scoped tables
|
|
11
|
+
* have the required predicates. Falls back to conservative rejection
|
|
12
|
+
* when the SQL cannot be proven safe.
|
|
13
|
+
*
|
|
14
|
+
* In `strict` mode, throws `TenantGuardrailError` on failure.
|
|
15
|
+
* In `warn` mode, returns warnings without throwing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateTenantGuardrails(sql: string, policy: NormalizedTenantPolicy, scope: TenantScope): TenantGuardrailResult;
|
|
18
|
+
//# sourceMappingURL=tenant-guardrail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-guardrail.d.ts","sourceRoot":"","sources":["../../src/sql/tenant-guardrail.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,sBAAsB,EACtB,WAAW,EAGZ,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CACpC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,WAAW,GACjB,qBAAqB,CA6CvB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { TenantGuardrailError, } from "../errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validate generated SQL against the tenant policy and runtime scope.
|
|
4
|
+
*
|
|
5
|
+
* Uses heuristic pattern matching to verify that tenant-scoped tables
|
|
6
|
+
* have the required predicates. Falls back to conservative rejection
|
|
7
|
+
* when the SQL cannot be proven safe.
|
|
8
|
+
*
|
|
9
|
+
* In `strict` mode, throws `TenantGuardrailError` on failure.
|
|
10
|
+
* In `warn` mode, returns warnings without throwing.
|
|
11
|
+
*/
|
|
12
|
+
export function validateTenantGuardrails(sql, policy, scope) {
|
|
13
|
+
// Global scope bypasses tenant guardrails
|
|
14
|
+
if (scope.access.kind === "global") {
|
|
15
|
+
return { passed: true, warnings: [] };
|
|
16
|
+
}
|
|
17
|
+
const warnings = [];
|
|
18
|
+
const normalizedSql = normalizeSql(sql);
|
|
19
|
+
// Check scoped tables
|
|
20
|
+
for (const st of policy.scopedTables) {
|
|
21
|
+
const tableName = extractTableName(st.id);
|
|
22
|
+
if (!mentionsTable(normalizedSql, tableName))
|
|
23
|
+
continue;
|
|
24
|
+
checkScopedTable(normalizedSql, st, policy, warnings);
|
|
25
|
+
}
|
|
26
|
+
// Check polymorphic tables
|
|
27
|
+
for (const pt of policy.polymorphicTables) {
|
|
28
|
+
const tableName = extractTableName(pt.id);
|
|
29
|
+
if (!mentionsTable(normalizedSql, tableName))
|
|
30
|
+
continue;
|
|
31
|
+
checkPolymorphicTable(normalizedSql, pt, policy, warnings);
|
|
32
|
+
}
|
|
33
|
+
// Check unknown tables
|
|
34
|
+
for (const entry of policy.coverage) {
|
|
35
|
+
if (entry.classification !== "unknown")
|
|
36
|
+
continue;
|
|
37
|
+
const tableName = extractTableName(entry.tableId);
|
|
38
|
+
if (mentionsTable(normalizedSql, tableName)) {
|
|
39
|
+
warnings.push(warn("UNKNOWN_TABLE_REFERENCED", entry.tableId, `Query references unclassified table '${tableName}'. Classify it in tenant-policy.md.`));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const passed = warnings.length === 0;
|
|
43
|
+
if (!passed && policy.enforcement === "strict") {
|
|
44
|
+
throw new TenantGuardrailError(`Tenant guardrail validation failed (strict mode): ${warnings.map((w) => w.message).join("; ")}`, warnings);
|
|
45
|
+
}
|
|
46
|
+
return { passed, warnings };
|
|
47
|
+
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Per-table checks
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
function checkScopedTable(sql, st, policy, warnings) {
|
|
52
|
+
for (const path of st.scopeThrough) {
|
|
53
|
+
if ("column" in path) {
|
|
54
|
+
const colName = extractColumnName(path.column);
|
|
55
|
+
const rootLabel = policy.roots.find((r) => r.id === path.root)?.label ?? path.root;
|
|
56
|
+
const placeholder = `:tenant_${rootLabel.toLowerCase().replace(/[^a-z0-9]+/g, "_")}_ids`;
|
|
57
|
+
// Check if the tenant column or placeholder appears in the SQL
|
|
58
|
+
if (mentionsIdentifier(sql, colName) || mentionsIdentifier(sql, placeholder)) {
|
|
59
|
+
return; // At least one scope path is satisfied
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Inherited via JOINs — check if the join path columns appear
|
|
64
|
+
const allStepsPresent = path.join.every((step) => {
|
|
65
|
+
const fromCol = extractColumnName(step.from);
|
|
66
|
+
const toCol = extractColumnName(step.to);
|
|
67
|
+
return mentionsIdentifier(sql, fromCol) && mentionsIdentifier(sql, toCol);
|
|
68
|
+
});
|
|
69
|
+
if (allStepsPresent) {
|
|
70
|
+
// Also verify the root table's tenant column appears somewhere
|
|
71
|
+
const rootTenantCol = policy.roots.find((r) => r.id === path.root);
|
|
72
|
+
if (rootTenantCol) {
|
|
73
|
+
const rootColName = extractColumnName(rootTenantCol.tenantIdColumn);
|
|
74
|
+
const rootLabel = rootTenantCol.label;
|
|
75
|
+
const placeholder = `:tenant_${rootLabel.toLowerCase().replace(/[^a-z0-9]+/g, "_")}_ids`;
|
|
76
|
+
if (mentionsIdentifier(sql, rootColName) || mentionsIdentifier(sql, placeholder)) {
|
|
77
|
+
return; // Join path + root filter present
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// None of the scope paths were satisfied
|
|
84
|
+
const pathDescriptions = st.scopeThrough.map((p) => {
|
|
85
|
+
if ("column" in p)
|
|
86
|
+
return extractColumnName(p.column);
|
|
87
|
+
return p.join.map((j) => `${extractColumnName(j.from)}→${extractColumnName(j.to)}`).join(", ");
|
|
88
|
+
});
|
|
89
|
+
warnings.push(warn("MISSING_TENANT_PREDICATE", st.id, `Tenant-scoped table '${extractTableName(st.id)}' is missing required tenant predicate. ` +
|
|
90
|
+
`Expected one of: ${pathDescriptions.join(" OR ")}`));
|
|
91
|
+
}
|
|
92
|
+
function checkPolymorphicTable(sql, pt, _policy, warnings) {
|
|
93
|
+
const typeColName = extractColumnName(pt.typeColumn);
|
|
94
|
+
const idColName = extractColumnName(pt.idColumn);
|
|
95
|
+
if (!mentionsIdentifier(sql, typeColName)) {
|
|
96
|
+
warnings.push(warn("MISSING_TYPE_DISCRIMINATOR", pt.id, `Polymorphic table '${extractTableName(pt.id)}' is missing type discriminator column '${typeColName}' in WHERE clause.`));
|
|
97
|
+
}
|
|
98
|
+
if (!mentionsIdentifier(sql, idColName)) {
|
|
99
|
+
warnings.push(warn("MISSING_TENANT_PREDICATE", pt.id, `Polymorphic table '${extractTableName(pt.id)}' is missing id column '${idColName}' in WHERE/JOIN clause.`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Helpers
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
function warn(rule, tableId, message) {
|
|
106
|
+
return { rule, tableId, message };
|
|
107
|
+
}
|
|
108
|
+
function extractTableName(tableId) {
|
|
109
|
+
// "table:public.orders" → "orders"
|
|
110
|
+
const dot = tableId.lastIndexOf(".");
|
|
111
|
+
return dot !== -1 ? tableId.slice(dot + 1) : tableId;
|
|
112
|
+
}
|
|
113
|
+
function extractColumnName(columnId) {
|
|
114
|
+
// "table:public.orders#agency_id" → "agency_id"
|
|
115
|
+
const hash = columnId.lastIndexOf("#");
|
|
116
|
+
return hash !== -1 ? columnId.slice(hash + 1) : columnId;
|
|
117
|
+
}
|
|
118
|
+
function normalizeSql(sql) {
|
|
119
|
+
return sql.toLowerCase();
|
|
120
|
+
}
|
|
121
|
+
function mentionsTable(normalizedSql, tableName) {
|
|
122
|
+
const pattern = new RegExp(`\\b${escapeRegex(tableName.toLowerCase())}\\b`);
|
|
123
|
+
return pattern.test(normalizedSql);
|
|
124
|
+
}
|
|
125
|
+
function mentionsIdentifier(normalizedSql, identifier) {
|
|
126
|
+
const pattern = new RegExp(`\\b${escapeRegex(identifier.toLowerCase())}\\b`);
|
|
127
|
+
return pattern.test(normalizedSql);
|
|
128
|
+
}
|
|
129
|
+
function escapeRegex(str) {
|
|
130
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=tenant-guardrail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-guardrail.js","sourceRoot":"","sources":["../../src/sql/tenant-guardrail.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAGrB,MAAM,cAAc,CAAC;AAatB;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,GAAW,EACX,MAA8B,EAC9B,KAAkB;IAElB,0CAA0C;IAC1C,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAExC,sBAAsB;IACtB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;YAAE,SAAS;QACvD,gBAAgB,CAAC,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;YAAE,SAAS;QACvD,qBAAqB,CAAC,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS;YAAE,SAAS;QACjD,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,OAAO,EAC5C,wCAAwC,SAAS,qCAAqC,CAAC,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IAErC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC/C,MAAM,IAAI,oBAAoB,CAC5B,qDAAqD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChG,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,gBAAgB,CACvB,GAAW,EACX,EAAe,EACf,MAA8B,EAC9B,QAAkC;IAElC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;YACnF,MAAM,WAAW,GAAG,WAAW,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC;YAEzF,+DAA+D;YAC/D,IAAI,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;gBAC7E,OAAO,CAAC,uCAAuC;YACjD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC/C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzC,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YACH,IAAI,eAAe,EAAE,CAAC;gBACpB,+DAA+D;gBAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;oBACpE,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC;oBACtC,MAAM,WAAW,GAAG,WAAW,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC;oBACzF,IAAI,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;wBACjF,OAAO,CAAC,kCAAkC;oBAC5C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjD,IAAI,QAAQ,IAAI,CAAC;YAAE,OAAO,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,EAAE,EACpC,wBAAwB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,0CAA0C;QACzF,oBAAoB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,GAAW,EACX,EAAoB,EACpB,OAA+B,EAC/B,QAAkC;IAElC,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEjD,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,4BAA4B,EAAE,EAAE,CAAC,EAAE,EACtC,sBAAsB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,2CAA2C,WAAW,oBAAoB,CAAC,CAC3H,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,EAAE,EACpC,sBAAsB,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,2BAA2B,SAAS,yBAAyB,CAAC,CAC9G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,IAAI,CACX,IAA6B,EAC7B,OAAe,EACf,OAAe;IAEf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,mCAAmC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,gDAAgD;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,aAAqB,EAAE,SAAiB;IAC7D,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,aAAqB,EAAE,UAAkB;IACnE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { NormalizedTenantPolicy, TenantScope } from "../schema/v2/tenant-policy.js";
|
|
2
|
+
export type TenantSqlOutputMode = "sql-only" | "sql-params";
|
|
3
|
+
export type TenantBinding = {
|
|
4
|
+
placeholder: string;
|
|
5
|
+
rootLabel: string;
|
|
6
|
+
rootId: string;
|
|
7
|
+
ids: string[];
|
|
8
|
+
};
|
|
9
|
+
export type TenantPlaceholderResult = {
|
|
10
|
+
mode: "sql-only";
|
|
11
|
+
sql: string;
|
|
12
|
+
bindings: TenantBinding[];
|
|
13
|
+
} | {
|
|
14
|
+
mode: "sql-params";
|
|
15
|
+
sql: string;
|
|
16
|
+
params: unknown[];
|
|
17
|
+
bindings: TenantBinding[];
|
|
18
|
+
paramStartIndex: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function placeholderForRoot(label: string): string;
|
|
21
|
+
export declare function extractTenantPlaceholders(sql: string): string[];
|
|
22
|
+
type ResolvedPlaceholder = {
|
|
23
|
+
placeholder: string;
|
|
24
|
+
rootLabel: string;
|
|
25
|
+
rootId: string;
|
|
26
|
+
ids: string[];
|
|
27
|
+
};
|
|
28
|
+
export declare function resolvePlaceholders(sql: string, policy: NormalizedTenantPolicy, scope: TenantScope): ResolvedPlaceholder[];
|
|
29
|
+
export declare function replacePlaceholdersWithLiterals(sql: string, resolved: ResolvedPlaceholder[]): string;
|
|
30
|
+
export declare function replacePlaceholdersWithParams(sql: string, resolved: ResolvedPlaceholder[], startIndex?: number): {
|
|
31
|
+
sql: string;
|
|
32
|
+
params: unknown[];
|
|
33
|
+
nextIndex: number;
|
|
34
|
+
};
|
|
35
|
+
export declare function resolveTenantSql(sql: string, policy: NormalizedTenantPolicy, scope: TenantScope, mode?: TenantSqlOutputMode, paramStartIndex?: number): TenantPlaceholderResult;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=tenant-placeholders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-placeholders.d.ts","sourceRoot":"","sources":["../../src/sql/tenant-placeholders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,WAAW,EAEZ,MAAM,+BAA+B,CAAC;AAMvC,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,YAAY,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,GAC5D;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAQN,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAMD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/D;AAMD,KAAK,mBAAmB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErG,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,WAAW,GACjB,mBAAmB,EAAE,CA2BvB;AA+BD,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,mBAAmB,EAAE,GAC9B,MAAM,CAYR;AAMD,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,UAAU,GAAE,MAAU,GACrB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAqBvD;AAsCD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,mBAAgC,EACtC,eAAe,GAAE,MAAU,GAC1B,uBAAuB,CA+BzB"}
|