@askdb/core 0.5.0-beta.12 → 0.5.0-beta.16

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 (67) hide show
  1. package/dist/ask.d.ts +19 -0
  2. package/dist/ask.d.ts.map +1 -1
  3. package/dist/ask.js +32 -2
  4. package/dist/ask.js.map +1 -1
  5. package/dist/errors.d.ts +15 -0
  6. package/dist/errors.d.ts.map +1 -1
  7. package/dist/errors.js +16 -0
  8. package/dist/errors.js.map +1 -1
  9. package/dist/index.d.ts +6 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +5 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/logging/log-events.d.ts +8 -0
  14. package/dist/logging/log-events.d.ts.map +1 -1
  15. package/dist/logging/log-events.js +8 -0
  16. package/dist/logging/log-events.js.map +1 -1
  17. package/dist/retrieval/synthesize-ddl.d.ts.map +1 -1
  18. package/dist/retrieval/synthesize-ddl.js +12 -0
  19. package/dist/retrieval/synthesize-ddl.js.map +1 -1
  20. package/dist/retrieval/types.d.ts +1 -1
  21. package/dist/retrieval/types.d.ts.map +1 -1
  22. package/dist/schema/v2/index.d.ts +4 -1
  23. package/dist/schema/v2/index.d.ts.map +1 -1
  24. package/dist/schema/v2/index.js +3 -1
  25. package/dist/schema/v2/index.js.map +1 -1
  26. package/dist/schema/v2/loader.d.ts.map +1 -1
  27. package/dist/schema/v2/loader.js +29 -5
  28. package/dist/schema/v2/loader.js.map +1 -1
  29. package/dist/schema/v2/normalized.d.ts +2 -0
  30. package/dist/schema/v2/normalized.d.ts.map +1 -1
  31. package/dist/schema/v2/tenant-policy-loader.d.ts +13 -0
  32. package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -0
  33. package/dist/schema/v2/tenant-policy-loader.js +282 -0
  34. package/dist/schema/v2/tenant-policy-loader.js.map +1 -0
  35. package/dist/schema/v2/tenant-policy.d.ts +715 -0
  36. package/dist/schema/v2/tenant-policy.d.ts.map +1 -0
  37. package/dist/schema/v2/tenant-policy.js +135 -0
  38. package/dist/schema/v2/tenant-policy.js.map +1 -0
  39. package/dist/schema/v2/writer.d.ts +5 -0
  40. package/dist/schema/v2/writer.d.ts.map +1 -1
  41. package/dist/schema/v2/writer.js +32 -0
  42. package/dist/schema/v2/writer.js.map +1 -1
  43. package/dist/sql/generate.d.ts +7 -0
  44. package/dist/sql/generate.d.ts.map +1 -1
  45. package/dist/sql/generate.js +23 -2
  46. package/dist/sql/generate.js.map +1 -1
  47. package/dist/sql/prompt.d.ts +2 -1
  48. package/dist/sql/prompt.d.ts.map +1 -1
  49. package/dist/sql/prompt.js +8 -1
  50. package/dist/sql/prompt.js.map +1 -1
  51. package/dist/sql/tenant-guardrail.d.ts +18 -0
  52. package/dist/sql/tenant-guardrail.d.ts.map +1 -0
  53. package/dist/sql/tenant-guardrail.js +132 -0
  54. package/dist/sql/tenant-guardrail.js.map +1 -0
  55. package/dist/sql/tenant-placeholders.d.ts +37 -0
  56. package/dist/sql/tenant-placeholders.d.ts.map +1 -0
  57. package/dist/sql/tenant-placeholders.js +156 -0
  58. package/dist/sql/tenant-placeholders.js.map +1 -0
  59. package/dist/sql/tenant-prompt.d.ts +8 -0
  60. package/dist/sql/tenant-prompt.d.ts.map +1 -0
  61. package/dist/sql/tenant-prompt.js +127 -0
  62. package/dist/sql/tenant-prompt.js.map +1 -0
  63. package/dist/sql/tenant-scope-validate.d.ts +8 -0
  64. package/dist/sql/tenant-scope-validate.d.ts.map +1 -0
  65. package/dist/sql/tenant-scope-validate.js +46 -0
  66. package/dist/sql/tenant-scope-validate.js.map +1 -0
  67. package/package.json +1 -1
@@ -0,0 +1,13 @@
1
+ import { type ParsedTenantPolicyMarkdown, type NormalizedTenantPolicy, type ScopeThrough } from "./tenant-policy.js";
2
+ export declare function parseTenantPolicyMarkdown(content: string, filePath?: string): ParsedTenantPolicyMarkdown;
3
+ export declare function normalizeTenantPolicy(parsed: ParsedTenantPolicyMarkdown, physicalTableIds: Set<string>, physicalColumnIds: Set<string>): NormalizedTenantPolicy;
4
+ export declare function isScopeThroughColumn(s: ScopeThrough): s is ScopeThrough & {
5
+ column: string;
6
+ };
7
+ export declare function isScopeThroughJoin(s: ScopeThrough): s is ScopeThrough & {
8
+ join: Array<{
9
+ from: string;
10
+ to: string;
11
+ }>;
12
+ };
13
+ //# sourceMappingURL=tenant-policy-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-policy-loader.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,0BAA0B,EAG/B,KAAK,sBAAsB,EAI3B,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAM5B,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,0BAA0B,CAe5B;AAyBD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,0BAA0B,EAClC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,sBAAsB,CAkKxB;AAyDD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAE5F;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAErH"}
@@ -0,0 +1,282 @@
1
+ import matter from "gray-matter";
2
+ import { SchemaParseError } from "../../errors.js";
3
+ import { tenantPolicyFrontmatterSchema, TENANT_POLICY_H2_SECTIONS, } from "./tenant-policy.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Parsing
6
+ // ---------------------------------------------------------------------------
7
+ export function parseTenantPolicyMarkdown(content, filePath) {
8
+ const file = matter(content);
9
+ const result = tenantPolicyFrontmatterSchema.safeParse(file.data);
10
+ if (!result.success) {
11
+ const loc = filePath ? ` in ${filePath}` : "";
12
+ throw new SchemaParseError(`Invalid tenant-policy front-matter${loc}: ${result.error.message}`, result.error);
13
+ }
14
+ const body = file.content;
15
+ const sections = extractTenantPolicySections(body);
16
+ return { frontmatter: result.data, body, sections };
17
+ }
18
+ function extractTenantPolicySections(body) {
19
+ const sections = {};
20
+ const parts = body.split(/^## /m);
21
+ for (const part of parts.slice(1)) {
22
+ const newline = part.indexOf("\n");
23
+ const heading = (newline === -1 ? part : part.slice(0, newline)).trim();
24
+ const sectionBody = newline === -1 ? "" : part.slice(newline + 1);
25
+ const matched = TENANT_POLICY_H2_SECTIONS.find((s) => s.toLowerCase() === heading.toLowerCase());
26
+ if (matched) {
27
+ sections[matched] = sectionBody;
28
+ }
29
+ }
30
+ return sections;
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Cross-reference validation & normalization
34
+ // ---------------------------------------------------------------------------
35
+ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnIds) {
36
+ const fm = parsed.frontmatter;
37
+ const warnings = [];
38
+ const rootIds = new Set(fm.roots.map((r) => r.id));
39
+ // Validate root table IDs exist in physical schema
40
+ for (const root of fm.roots) {
41
+ if (!physicalTableIds.has(root.id)) {
42
+ warnings.push({ kind: "orphaned_root_id", id: root.id });
43
+ }
44
+ if (!physicalColumnIds.has(root.tenantIdColumn)) {
45
+ warnings.push({
46
+ kind: "orphaned_column_id",
47
+ id: root.tenantIdColumn,
48
+ context: `root ${root.id}`,
49
+ });
50
+ }
51
+ if (root.parent) {
52
+ if (!rootIds.has(root.parent.root)) {
53
+ warnings.push({
54
+ kind: "unknown_root_in_hierarchy",
55
+ id: root.parent.root,
56
+ context: `parent of root ${root.id}`,
57
+ });
58
+ }
59
+ if (!physicalColumnIds.has(root.parent.foreignKey)) {
60
+ warnings.push({
61
+ kind: "orphaned_fk_id",
62
+ id: root.parent.foreignKey,
63
+ context: `parent FK on root ${root.id}`,
64
+ });
65
+ }
66
+ }
67
+ }
68
+ // Validate hierarchy edges
69
+ for (const edge of fm.hierarchy ?? []) {
70
+ if (!rootIds.has(edge.parent)) {
71
+ warnings.push({
72
+ kind: "unknown_root_in_hierarchy",
73
+ id: edge.parent,
74
+ context: `hierarchy parent`,
75
+ });
76
+ }
77
+ if (!rootIds.has(edge.child)) {
78
+ warnings.push({
79
+ kind: "unknown_root_in_hierarchy",
80
+ id: edge.child,
81
+ context: `hierarchy child`,
82
+ });
83
+ }
84
+ if (!physicalColumnIds.has(edge.foreignKey)) {
85
+ warnings.push({
86
+ kind: "orphaned_fk_id",
87
+ id: edge.foreignKey,
88
+ context: `hierarchy edge ${edge.parent} -> ${edge.child}`,
89
+ });
90
+ }
91
+ }
92
+ // Detect hierarchy cycles
93
+ const cycleIds = detectHierarchyCycles(fm);
94
+ if (cycleIds.length > 0) {
95
+ warnings.push({ kind: "hierarchy_cycle", ids: cycleIds });
96
+ }
97
+ // Validate scoped tables
98
+ for (const st of fm.scopedTables ?? []) {
99
+ if (!physicalTableIds.has(st.id)) {
100
+ warnings.push({ kind: "orphaned_scoped_table_id", id: st.id });
101
+ }
102
+ for (const path of st.scopeThrough) {
103
+ if (!rootIds.has(path.root)) {
104
+ warnings.push({
105
+ kind: "unknown_root_in_scope",
106
+ id: path.root,
107
+ context: `scopeThrough on ${st.id}`,
108
+ });
109
+ }
110
+ if ("column" in path) {
111
+ if (!physicalColumnIds.has(path.column)) {
112
+ warnings.push({
113
+ kind: "orphaned_column_id",
114
+ id: path.column,
115
+ context: `scopeThrough column on ${st.id}`,
116
+ });
117
+ }
118
+ }
119
+ else {
120
+ for (const step of path.join) {
121
+ if (!physicalColumnIds.has(step.from)) {
122
+ warnings.push({
123
+ kind: "orphaned_fk_id",
124
+ id: step.from,
125
+ context: `scopeThrough join on ${st.id}`,
126
+ });
127
+ }
128
+ if (!physicalColumnIds.has(step.to)) {
129
+ warnings.push({
130
+ kind: "orphaned_fk_id",
131
+ id: step.to,
132
+ context: `scopeThrough join on ${st.id}`,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ // Validate polymorphic tables
140
+ for (const pt of fm.polymorphicTables ?? []) {
141
+ if (!physicalTableIds.has(pt.id)) {
142
+ warnings.push({ kind: "orphaned_polymorphic_table_id", id: pt.id });
143
+ }
144
+ if (!physicalColumnIds.has(pt.typeColumn)) {
145
+ warnings.push({
146
+ kind: "orphaned_column_id",
147
+ id: pt.typeColumn,
148
+ context: `polymorphic typeColumn on ${pt.id}`,
149
+ });
150
+ }
151
+ if (!physicalColumnIds.has(pt.idColumn)) {
152
+ warnings.push({
153
+ kind: "orphaned_column_id",
154
+ id: pt.idColumn,
155
+ context: `polymorphic idColumn on ${pt.id}`,
156
+ });
157
+ }
158
+ for (const [typeVal, targetRoot] of Object.entries(pt.mapping)) {
159
+ if (!rootIds.has(targetRoot)) {
160
+ warnings.push({
161
+ kind: "unknown_root_in_mapping",
162
+ id: targetRoot,
163
+ context: `polymorphic mapping '${typeVal}' on ${pt.id}`,
164
+ });
165
+ }
166
+ }
167
+ }
168
+ // Validate global tables
169
+ for (const gt of fm.globalTables ?? []) {
170
+ if (!physicalTableIds.has(gt)) {
171
+ warnings.push({ kind: "orphaned_global_table_id", id: gt });
172
+ }
173
+ }
174
+ // Build coverage report
175
+ const coverage = buildCoverage(fm, physicalTableIds);
176
+ return {
177
+ schemaId: fm.schemaId,
178
+ enforcement: fm.enforcement,
179
+ roots: fm.roots,
180
+ hierarchy: fm.hierarchy ?? [],
181
+ scopedTables: fm.scopedTables ?? [],
182
+ polymorphicTables: fm.polymorphicTables ?? [],
183
+ globalTables: fm.globalTables ?? [],
184
+ coverage,
185
+ warnings,
186
+ body: parsed.body,
187
+ sections: parsed.sections,
188
+ };
189
+ }
190
+ // ---------------------------------------------------------------------------
191
+ // Coverage report
192
+ // ---------------------------------------------------------------------------
193
+ function buildCoverage(fm, physicalTableIds) {
194
+ const classified = new Map();
195
+ // Root tables
196
+ for (const root of fm.roots) {
197
+ classified.set(root.id, { classification: "root" });
198
+ }
199
+ // Scoped tables
200
+ for (const st of fm.scopedTables ?? []) {
201
+ const scopeRoots = st.scopeThrough.map((s) => s.root);
202
+ const hasJoin = st.scopeThrough.some((s) => "join" in s);
203
+ const classification = hasJoin ? "inherited" : "scoped";
204
+ classified.set(st.id, { classification, scopeRoots });
205
+ }
206
+ // Polymorphic tables
207
+ for (const pt of fm.polymorphicTables ?? []) {
208
+ const scopeRoots = Object.values(pt.mapping);
209
+ classified.set(pt.id, { classification: "polymorphic", scopeRoots });
210
+ }
211
+ // Global tables
212
+ for (const gt of fm.globalTables ?? []) {
213
+ classified.set(gt, { classification: "global" });
214
+ }
215
+ // Build entries for all physical tables
216
+ const entries = [];
217
+ for (const tableId of physicalTableIds) {
218
+ const info = classified.get(tableId);
219
+ if (info) {
220
+ entries.push({ tableId, classification: info.classification, scopeRoots: info.scopeRoots });
221
+ }
222
+ else {
223
+ entries.push({ tableId, classification: "unknown" });
224
+ }
225
+ }
226
+ // Sort for determinism
227
+ entries.sort((a, b) => a.tableId.localeCompare(b.tableId));
228
+ return entries;
229
+ }
230
+ // ---------------------------------------------------------------------------
231
+ // Helpers — scope-through classification for mixed tables
232
+ // ---------------------------------------------------------------------------
233
+ export function isScopeThroughColumn(s) {
234
+ return "column" in s;
235
+ }
236
+ export function isScopeThroughJoin(s) {
237
+ return "join" in s;
238
+ }
239
+ // ---------------------------------------------------------------------------
240
+ // Cycle detection in hierarchy
241
+ // ---------------------------------------------------------------------------
242
+ function detectHierarchyCycles(fm) {
243
+ const parentMap = new Map();
244
+ for (const root of fm.roots) {
245
+ if (root.parent) {
246
+ parentMap.set(root.id, root.parent.root);
247
+ }
248
+ }
249
+ // Also use hierarchy edges
250
+ for (const edge of fm.hierarchy ?? []) {
251
+ parentMap.set(edge.child, edge.parent);
252
+ }
253
+ // Walk each node up — if we revisit a node, there's a cycle
254
+ const visited = new Set();
255
+ const inStack = new Set();
256
+ const cycleNodes = [];
257
+ for (const node of parentMap.keys()) {
258
+ if (visited.has(node))
259
+ continue;
260
+ const path = [];
261
+ let current = node;
262
+ while (current && !visited.has(current)) {
263
+ if (inStack.has(current)) {
264
+ // Found a cycle — collect the cycle nodes
265
+ const cycleStart = path.indexOf(current);
266
+ if (cycleStart !== -1) {
267
+ cycleNodes.push(...path.slice(cycleStart));
268
+ }
269
+ break;
270
+ }
271
+ inStack.add(current);
272
+ path.push(current);
273
+ current = parentMap.get(current);
274
+ }
275
+ for (const n of path) {
276
+ visited.add(n);
277
+ inStack.delete(n);
278
+ }
279
+ }
280
+ return [...new Set(cycleNodes)];
281
+ }
282
+ //# sourceMappingURL=tenant-policy-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-policy-loader.js","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"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"}