@askdb/core 0.5.0-beta.4 → 1.0.0-beta.21

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 (87) hide show
  1. package/README.md +7 -3
  2. package/dist/ai/provider.d.ts +2 -8
  3. package/dist/ai/provider.d.ts.map +1 -1
  4. package/dist/ai/provider.js +42 -11
  5. package/dist/ai/provider.js.map +1 -1
  6. package/dist/ai/types.d.ts +2 -0
  7. package/dist/ai/types.d.ts.map +1 -0
  8. package/dist/ai/types.js +2 -0
  9. package/dist/ai/types.js.map +1 -0
  10. package/dist/ask.d.ts +23 -3
  11. package/dist/ask.d.ts.map +1 -1
  12. package/dist/ask.js +32 -2
  13. package/dist/ask.js.map +1 -1
  14. package/dist/errors.d.ts +15 -0
  15. package/dist/errors.d.ts.map +1 -1
  16. package/dist/errors.js +16 -0
  17. package/dist/errors.js.map +1 -1
  18. package/dist/index.d.ts +7 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +5 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/logging/log-events.d.ts +8 -0
  23. package/dist/logging/log-events.d.ts.map +1 -1
  24. package/dist/logging/log-events.js +8 -0
  25. package/dist/logging/log-events.js.map +1 -1
  26. package/dist/retrieval/synthesize-ddl.d.ts.map +1 -1
  27. package/dist/retrieval/synthesize-ddl.js +12 -0
  28. package/dist/retrieval/synthesize-ddl.js.map +1 -1
  29. package/dist/retrieval/types.d.ts +1 -1
  30. package/dist/retrieval/types.d.ts.map +1 -1
  31. package/dist/schema/normalize.d.ts +2 -0
  32. package/dist/schema/normalize.d.ts.map +1 -1
  33. package/dist/schema/normalize.js +1 -0
  34. package/dist/schema/normalize.js.map +1 -1
  35. package/dist/schema/v2/describable.d.ts +83 -1
  36. package/dist/schema/v2/describable.d.ts.map +1 -1
  37. package/dist/schema/v2/describable.js +25 -1
  38. package/dist/schema/v2/describable.js.map +1 -1
  39. package/dist/schema/v2/format.d.ts.map +1 -1
  40. package/dist/schema/v2/format.js +6 -0
  41. package/dist/schema/v2/format.js.map +1 -1
  42. package/dist/schema/v2/index.d.ts +4 -1
  43. package/dist/schema/v2/index.d.ts.map +1 -1
  44. package/dist/schema/v2/index.js +3 -1
  45. package/dist/schema/v2/index.js.map +1 -1
  46. package/dist/schema/v2/loader.d.ts.map +1 -1
  47. package/dist/schema/v2/loader.js +32 -5
  48. package/dist/schema/v2/loader.js.map +1 -1
  49. package/dist/schema/v2/normalized.d.ts +4 -0
  50. package/dist/schema/v2/normalized.d.ts.map +1 -1
  51. package/dist/schema/v2/tenant-policy-loader.d.ts +13 -0
  52. package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -0
  53. package/dist/schema/v2/tenant-policy-loader.js +282 -0
  54. package/dist/schema/v2/tenant-policy-loader.js.map +1 -0
  55. package/dist/schema/v2/tenant-policy.d.ts +715 -0
  56. package/dist/schema/v2/tenant-policy.d.ts.map +1 -0
  57. package/dist/schema/v2/tenant-policy.js +135 -0
  58. package/dist/schema/v2/tenant-policy.js.map +1 -0
  59. package/dist/schema/v2/writer.d.ts +5 -0
  60. package/dist/schema/v2/writer.d.ts.map +1 -1
  61. package/dist/schema/v2/writer.js +34 -0
  62. package/dist/schema/v2/writer.js.map +1 -1
  63. package/dist/sql/generate.d.ts +9 -2
  64. package/dist/sql/generate.d.ts.map +1 -1
  65. package/dist/sql/generate.js +23 -2
  66. package/dist/sql/generate.js.map +1 -1
  67. package/dist/sql/prompt.d.ts +2 -1
  68. package/dist/sql/prompt.d.ts.map +1 -1
  69. package/dist/sql/prompt.js +8 -1
  70. package/dist/sql/prompt.js.map +1 -1
  71. package/dist/sql/tenant-guardrail.d.ts +18 -0
  72. package/dist/sql/tenant-guardrail.d.ts.map +1 -0
  73. package/dist/sql/tenant-guardrail.js +132 -0
  74. package/dist/sql/tenant-guardrail.js.map +1 -0
  75. package/dist/sql/tenant-placeholders.d.ts +37 -0
  76. package/dist/sql/tenant-placeholders.d.ts.map +1 -0
  77. package/dist/sql/tenant-placeholders.js +156 -0
  78. package/dist/sql/tenant-placeholders.js.map +1 -0
  79. package/dist/sql/tenant-prompt.d.ts +8 -0
  80. package/dist/sql/tenant-prompt.d.ts.map +1 -0
  81. package/dist/sql/tenant-prompt.js +127 -0
  82. package/dist/sql/tenant-prompt.js.map +1 -0
  83. package/dist/sql/tenant-scope-validate.d.ts +8 -0
  84. package/dist/sql/tenant-scope-validate.d.ts.map +1 -0
  85. package/dist/sql/tenant-scope-validate.js +46 -0
  86. package/dist/sql/tenant-scope-validate.js.map +1 -0
  87. 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":"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"}
@@ -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;AAElF;;;;;;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"}
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"}
@@ -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 = {};
@@ -30,6 +62,8 @@ function orderedTableFrontmatter(fm) {
30
62
  ordered["tags"] = fm.tags;
31
63
  if (fm.sensitive !== undefined)
32
64
  ordered["sensitive"] = fm.sensitive;
65
+ if (fm.tracked !== undefined)
66
+ ordered["tracked"] = fm.tracked;
33
67
  if (fm.columns !== undefined) {
34
68
  ordered["columns"] = fm.columns.map((c) => {
35
69
  const col = { id: c.id };
@@ -1 +1 @@
1
- {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/schema/v2/writer.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAA+B,EAAE,IAAY;IAC9E,MAAM,IAAI,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAkC,EAAE,IAAY;IACpF,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,8DAA8D;AAC9D,SAAS,uBAAuB,CAAC,EAAsB;IACrD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;IAC1B,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;IAClC,IAAI,EAAE,CAAC,aAAa,KAAK,SAAS;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC;IAChF,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;IAC9D,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;IACrD,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;IACpE,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACxC,MAAM,GAAG,GAA4B,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;gBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YACxD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;gBAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC/C,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS;gBAAE,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;YACpE,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;gBAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;YAC9D,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/schema/v2/writer.ts"],"names":[],"mappings":"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"}
@@ -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: LanguageModel, deps?: GenerateSqlDeps): Promise<GenerateSelectSqlResult>;
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,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,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;CACtB,CAAC;AAEF,2GAA2G;AAC3G,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,uBAAuB,CAAC,CAgElC"}
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"}
@@ -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
- return explain !== undefined ? { sql, explain } : { sql };
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);
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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;AAMrD;;;;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,GACnB,MAAM,CAuDR;AAED,oEAAoE;AACpE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAErE"}
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"}
@@ -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) {
@@ -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;IAEpB,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;IACF,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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/sql/prompt.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
@@ -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"}