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

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 (121) hide show
  1. package/README.md +14 -8
  2. package/dist/ask.d.ts +101 -4
  3. package/dist/ask.d.ts.map +1 -1
  4. package/dist/ask.js +243 -25
  5. package/dist/ask.js.map +1 -1
  6. package/dist/enrichment/suggest.d.ts.map +1 -1
  7. package/dist/enrichment/suggest.js +3 -1
  8. package/dist/enrichment/suggest.js.map +1 -1
  9. package/dist/errors.d.ts +41 -5
  10. package/dist/errors.d.ts.map +1 -1
  11. package/dist/errors.js +9 -0
  12. package/dist/errors.js.map +1 -1
  13. package/dist/index.d.ts +8 -6
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +5 -3
  16. package/dist/index.js.map +1 -1
  17. package/dist/retrieval/synthesize-ddl.d.ts +4 -0
  18. package/dist/retrieval/synthesize-ddl.d.ts.map +1 -1
  19. package/dist/retrieval/synthesize-ddl.js +5 -3
  20. package/dist/retrieval/synthesize-ddl.js.map +1 -1
  21. package/dist/schema/normalize.d.ts +10 -0
  22. package/dist/schema/normalize.d.ts.map +1 -1
  23. package/dist/schema/normalize.js.map +1 -1
  24. package/dist/schema/v2/format.d.ts +7 -0
  25. package/dist/schema/v2/format.d.ts.map +1 -1
  26. package/dist/schema/v2/format.js +20 -7
  27. package/dist/schema/v2/format.js.map +1 -1
  28. package/dist/schema/v2/index.d.ts +3 -1
  29. package/dist/schema/v2/index.d.ts.map +1 -1
  30. package/dist/schema/v2/index.js +1 -0
  31. package/dist/schema/v2/index.js.map +1 -1
  32. package/dist/schema/v2/loader.d.ts +32 -1
  33. package/dist/schema/v2/loader.d.ts.map +1 -1
  34. package/dist/schema/v2/loader.js +173 -49
  35. package/dist/schema/v2/loader.js.map +1 -1
  36. package/dist/schema/v2/mentions.d.ts +31 -0
  37. package/dist/schema/v2/mentions.d.ts.map +1 -0
  38. package/dist/schema/v2/mentions.js +47 -0
  39. package/dist/schema/v2/mentions.js.map +1 -0
  40. package/dist/schema/v2/normalized.d.ts +38 -0
  41. package/dist/schema/v2/normalized.d.ts.map +1 -1
  42. package/dist/schema/v2/parser.d.ts +9 -0
  43. package/dist/schema/v2/parser.d.ts.map +1 -1
  44. package/dist/schema/v2/parser.js +18 -2
  45. package/dist/schema/v2/parser.js.map +1 -1
  46. package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -1
  47. package/dist/schema/v2/tenant-policy-loader.js +7 -3
  48. package/dist/schema/v2/tenant-policy-loader.js.map +1 -1
  49. package/dist/schema/v2/tenant-policy.d.ts +28 -21
  50. package/dist/schema/v2/tenant-policy.d.ts.map +1 -1
  51. package/dist/schema/v2/tenant-policy.js +67 -11
  52. package/dist/schema/v2/tenant-policy.js.map +1 -1
  53. package/dist/sql/bind.d.ts +17 -15
  54. package/dist/sql/bind.d.ts.map +1 -1
  55. package/dist/sql/bind.js +38 -173
  56. package/dist/sql/bind.js.map +1 -1
  57. package/dist/sql/dialect-spec.d.ts +48 -3
  58. package/dist/sql/dialect-spec.d.ts.map +1 -1
  59. package/dist/sql/dialect-spec.js +89 -3
  60. package/dist/sql/dialect-spec.js.map +1 -1
  61. package/dist/sql/generate.d.ts +14 -0
  62. package/dist/sql/generate.d.ts.map +1 -1
  63. package/dist/sql/generate.js +31 -17
  64. package/dist/sql/generate.js.map +1 -1
  65. package/dist/sql/index.d.ts +2 -1
  66. package/dist/sql/index.d.ts.map +1 -1
  67. package/dist/sql/index.js +2 -1
  68. package/dist/sql/index.js.map +1 -1
  69. package/dist/sql/lexer.d.ts +114 -0
  70. package/dist/sql/lexer.d.ts.map +1 -0
  71. package/dist/sql/lexer.js +397 -0
  72. package/dist/sql/lexer.js.map +1 -0
  73. package/dist/sql/prompt-identifiers.d.ts +20 -0
  74. package/dist/sql/prompt-identifiers.d.ts.map +1 -0
  75. package/dist/sql/prompt-identifiers.js +64 -0
  76. package/dist/sql/prompt-identifiers.js.map +1 -0
  77. package/dist/sql/prompt.d.ts +7 -1
  78. package/dist/sql/prompt.d.ts.map +1 -1
  79. package/dist/sql/prompt.js +22 -2
  80. package/dist/sql/prompt.js.map +1 -1
  81. package/dist/sql/reserved-words.d.ts +15 -0
  82. package/dist/sql/reserved-words.d.ts.map +1 -0
  83. package/dist/sql/reserved-words.js +102 -0
  84. package/dist/sql/reserved-words.js.map +1 -0
  85. package/dist/sql/sensitive-guardrail.d.ts +18 -3
  86. package/dist/sql/sensitive-guardrail.d.ts.map +1 -1
  87. package/dist/sql/sensitive-guardrail.js +446 -157
  88. package/dist/sql/sensitive-guardrail.js.map +1 -1
  89. package/dist/sql/tenant-guardrail.d.ts +70 -8
  90. package/dist/sql/tenant-guardrail.d.ts.map +1 -1
  91. package/dist/sql/tenant-guardrail.js +799 -52
  92. package/dist/sql/tenant-guardrail.js.map +1 -1
  93. package/dist/sql/tenant-hierarchy.d.ts +19 -0
  94. package/dist/sql/tenant-hierarchy.d.ts.map +1 -0
  95. package/dist/sql/tenant-hierarchy.js +53 -0
  96. package/dist/sql/tenant-hierarchy.js.map +1 -0
  97. package/dist/sql/tenant-placeholders.d.ts +47 -19
  98. package/dist/sql/tenant-placeholders.d.ts.map +1 -1
  99. package/dist/sql/tenant-placeholders.js +229 -58
  100. package/dist/sql/tenant-placeholders.js.map +1 -1
  101. package/dist/sql/tenant-prompt.d.ts +4 -0
  102. package/dist/sql/tenant-prompt.d.ts.map +1 -1
  103. package/dist/sql/tenant-prompt.js +79 -11
  104. package/dist/sql/tenant-prompt.js.map +1 -1
  105. package/dist/sql/tenant-scope-validate.d.ts +3 -1
  106. package/dist/sql/tenant-scope-validate.d.ts.map +1 -1
  107. package/dist/sql/tenant-scope-validate.js +5 -2
  108. package/dist/sql/tenant-scope-validate.js.map +1 -1
  109. package/dist/sql/validate.d.ts +34 -4
  110. package/dist/sql/validate.d.ts.map +1 -1
  111. package/dist/sql/validate.js +138 -37
  112. package/dist/sql/validate.js.map +1 -1
  113. package/package.json +11 -7
  114. package/dist/exec/postgres.d.ts +0 -6
  115. package/dist/exec/postgres.d.ts.map +0 -1
  116. package/dist/exec/postgres.js +0 -30
  117. package/dist/exec/postgres.js.map +0 -1
  118. package/dist/modes/post-execute-log.d.ts +0 -9
  119. package/dist/modes/post-execute-log.d.ts.map +0 -1
  120. package/dist/modes/post-execute-log.js +0 -26
  121. package/dist/modes/post-execute-log.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/v2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAElF,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAgB1B,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/v2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAElF,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAgB1B,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAwB5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GAGnB,MAAM,eAAe,CAAC"}
@@ -1,4 +1,27 @@
1
+ import { type V2SchemaJson } from "./physical.js";
1
2
  import type { NormalizedSchemaV2 } from "./normalized.js";
3
+ /**
4
+ * Single-file form of a Schema v2 directory: what `askdb bundle` writes and what
5
+ * `loadSchema()` / `loadSchemaFromJson()` read back. It carries every file the
6
+ * directory loader reads, so loading a bundle gives the same result as loading the
7
+ * directory. This loader defines the format; writers such as `@askdb/enrich`'s
8
+ * `bundleSchemaDirectory()` produce this type so they can't drop a file it reads.
9
+ */
10
+ export type BundledSchemaV2 = {
11
+ bundled: true;
12
+ /** `schema.json`. */
13
+ physical: V2SchemaJson;
14
+ /** `tables/` filename → raw markdown content, for every `tables/*.md`. */
15
+ tables: Record<string, string>;
16
+ /** Raw `concepts.md` content; present when the file exists. */
17
+ concepts?: string;
18
+ /**
19
+ * Raw `tenant-policy.md` content; present when the file exists. Without it a
20
+ * multi-tenant schema loads with no tenant policy, and `ask()` neither requires a
21
+ * `tenantScope` nor injects tenant predicates.
22
+ */
23
+ tenantPolicy?: string;
24
+ };
2
25
  /**
3
26
  * Load a Schema v2 artifact from a raw JSON string.
4
27
  *
@@ -12,7 +35,15 @@ export declare function loadSchemaFromJson(raw: string): NormalizedSchemaV2;
12
35
  * Autodetects between:
13
36
  * - A v2 directory (`<schemaId>.schema/`) containing `schema.json`
14
37
  * - A bundled JSON file (`*.bundle.json` or any JSON with `bundled: true`)
15
- * - A direct path to a `schema.json` inside a directory
38
+ * - A direct path to a `schema.json` inside a directory — loaded exactly like the
39
+ * enclosing directory, including sibling `tables/*.md`, `concepts.md`, and
40
+ * `tenant-policy.md`
41
+ *
42
+ * Any other JSON file is treated as a standalone physical layer.
43
+ *
44
+ * Optional sibling files may be absent, but a present file that cannot be read
45
+ * or parsed (e.g. malformed YAML front-matter in `tenant-policy.md`) throws
46
+ * `SchemaParseError` — a broken tenant policy never silently disables tenancy.
16
47
  */
17
48
  export declare function loadSchema(path: string): NormalizedSchemaV2;
18
49
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,iBAAiB,CAAC;AAczB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAYlE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAwB3D"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,iBAAiB,CAAC;AAezB;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,IAAI,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,YAAY,CAAC;IACvB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAYlE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CA+B3D"}
@@ -1,5 +1,5 @@
1
1
  import { readFileSync, readdirSync, statSync } from "node:fs";
2
- import { join, resolve } from "node:path";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
3
  import { SchemaParseError } from "../../errors.js";
4
4
  import { parseConceptsMarkdown, parseTableMarkdown } from "./parser.js";
5
5
  import { v2SchemaJsonSchema } from "./physical.js";
@@ -30,7 +30,15 @@ export function loadSchemaFromJson(raw) {
30
30
  * Autodetects between:
31
31
  * - A v2 directory (`<schemaId>.schema/`) containing `schema.json`
32
32
  * - A bundled JSON file (`*.bundle.json` or any JSON with `bundled: true`)
33
- * - A direct path to a `schema.json` inside a directory
33
+ * - A direct path to a `schema.json` inside a directory — loaded exactly like the
34
+ * enclosing directory, including sibling `tables/*.md`, `concepts.md`, and
35
+ * `tenant-policy.md`
36
+ *
37
+ * Any other JSON file is treated as a standalone physical layer.
38
+ *
39
+ * Optional sibling files may be absent, but a present file that cannot be read
40
+ * or parsed (e.g. malformed YAML front-matter in `tenant-policy.md`) throws
41
+ * `SchemaParseError` — a broken tenant policy never silently disables tenancy.
34
42
  */
35
43
  export function loadSchema(path) {
36
44
  const resolved = resolve(path);
@@ -50,7 +58,13 @@ export function loadSchema(path) {
50
58
  if (typeof parsed === "object" && parsed !== null && "bundled" in parsed) {
51
59
  return loadFromBundle(parsed, resolved);
52
60
  }
53
- // Bare schema.json — treat enclosing directory as the schema directory
61
+ // A file named `schema.json` is the physical layer of a schema directory: load
62
+ // the enclosing directory so sibling tables/*.md, concepts.md, and — critically —
63
+ // tenant-policy.md apply exactly as they would for the directory path.
64
+ if (basename(resolved) === "schema.json") {
65
+ return loadFromDirectory(dirname(resolved));
66
+ }
67
+ // Any other bare JSON file is a standalone physical layer with no sibling files.
54
68
  const physical = parsePhysicalLayer(parsed, resolved);
55
69
  return buildNormalized(physical, {}, undefined, [], undefined);
56
70
  }
@@ -71,72 +85,143 @@ function loadFromDirectory(dir) {
71
85
  throw new SchemaParseError(`Failed to parse schema.json in ${dir}`);
72
86
  }
73
87
  const physical = parsePhysicalLayer(parsed, schemaJsonPath);
74
- // Load tables/*.md
88
+ // The describable files below are optional, but only *absence* (ENOENT) is
89
+ // tolerated. Any other read or parse failure is fatal: silently skipping a
90
+ // broken tenant-policy.md would load the schema with tenant enforcement off.
91
+ // Load optional tables/*.md
75
92
  const tableDir = join(dir, "tables");
76
93
  const tableMarkdowns = {};
94
+ // Sorted so warning order is deterministic (readdir order is filesystem-dependent)
95
+ // and matches the bundle loader, which sorts its `tables` keys the same way.
96
+ const entries = (readOptionalDir(tableDir) ?? []).sort();
97
+ for (const entry of entries) {
98
+ if (!entry.endsWith(".md"))
99
+ continue;
100
+ const filePath = join(tableDir, entry);
101
+ const content = readRequiredFile(filePath);
102
+ const parsed = parseOrWrap(filePath, () => parseTableMarkdown(content, filePath));
103
+ addTableMarkdown(tableMarkdowns, { tableFile: `tables/${entry}`, parsed }, dir);
104
+ }
105
+ // Load optional concepts.md
106
+ let concepts;
107
+ const conceptsPath = join(dir, "concepts.md");
108
+ const conceptsContent = readOptionalFile(conceptsPath);
109
+ if (conceptsContent !== undefined) {
110
+ concepts = parseOrWrap(conceptsPath, () => parseConceptsMarkdown(conceptsContent, conceptsPath)).frontmatter;
111
+ }
112
+ // Load optional tenant-policy.md
113
+ let tenantPolicy;
114
+ const policyPath = join(dir, "tenant-policy.md");
115
+ const policyContent = readOptionalFile(policyPath);
116
+ if (policyContent !== undefined) {
117
+ tenantPolicy = parseOrWrap(policyPath, () => {
118
+ const parsed = parseTenantPolicyMarkdown(policyContent, policyPath);
119
+ const physicalTableIds = new Set(physical.tables.map((t) => t.id));
120
+ const physicalColumnIds = new Set(physical.tables.flatMap((t) => t.columns.map((c) => c.id)));
121
+ return normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnIds);
122
+ });
123
+ }
124
+ return buildNormalized(physical, tableMarkdowns, concepts, [], tenantPolicy);
125
+ }
126
+ function isMissingPathError(e) {
127
+ return (typeof e === "object" && e !== null && e.code === "ENOENT");
128
+ }
129
+ function errorMessage(e) {
130
+ return e instanceof Error ? e.message : String(e);
131
+ }
132
+ /** Read an optional file: `undefined` when it does not exist, `SchemaParseError` on any other failure. */
133
+ function readOptionalFile(path) {
77
134
  try {
78
- const entries = readdirSync(tableDir);
79
- for (const entry of entries) {
80
- if (!entry.endsWith(".md"))
81
- continue;
82
- const filePath = join(tableDir, entry);
83
- const content = readFileSync(filePath, "utf8");
84
- const parsed = parseTableMarkdown(content, filePath);
85
- tableMarkdowns[parsed.frontmatter.id] = parsed;
86
- }
135
+ return readFileSync(path, "utf8");
87
136
  }
88
137
  catch (e) {
89
- // tables/ directory is optional; only rethrow SchemaParseError
90
- if (e instanceof SchemaParseError)
91
- throw e;
138
+ if (isMissingPathError(e))
139
+ return undefined;
140
+ throw new SchemaParseError(`Failed to read ${path}: ${errorMessage(e)}`, e);
92
141
  }
93
- // Load optional concepts.md
94
- let concepts;
142
+ }
143
+ /** List an optional directory: `undefined` when it does not exist, `SchemaParseError` on any other failure. */
144
+ function readOptionalDir(path) {
95
145
  try {
96
- const conceptsPath = join(dir, "concepts.md");
97
- const content = readFileSync(conceptsPath, "utf8");
98
- concepts = parseConceptsMarkdown(content, conceptsPath).frontmatter;
146
+ return readdirSync(path);
99
147
  }
100
- catch {
101
- // optional
148
+ catch (e) {
149
+ if (isMissingPathError(e))
150
+ return undefined;
151
+ throw new SchemaParseError(`Failed to read directory ${path}: ${errorMessage(e)}`, e);
102
152
  }
103
- // Load optional tenant-policy.md
104
- let tenantPolicy;
153
+ }
154
+ function readRequiredFile(path) {
105
155
  try {
106
- const policyPath = join(dir, "tenant-policy.md");
107
- const content = readFileSync(policyPath, "utf8");
108
- const parsed = parseTenantPolicyMarkdown(content, policyPath);
109
- const physicalTableIds = new Set(physical.tables.map((t) => t.id));
110
- const physicalColumnIds = new Set(physical.tables.flatMap((t) => t.columns.map((c) => c.id)));
111
- tenantPolicy = normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnIds);
156
+ return readFileSync(path, "utf8");
157
+ }
158
+ catch (e) {
159
+ throw new SchemaParseError(`Failed to read ${path}: ${errorMessage(e)}`, e);
160
+ }
161
+ }
162
+ /** Run a parse step; rethrow `SchemaParseError` as-is and wrap anything else with the file path. */
163
+ function parseOrWrap(path, fn) {
164
+ try {
165
+ return fn();
112
166
  }
113
167
  catch (e) {
114
168
  if (e instanceof SchemaParseError)
115
169
  throw e;
116
- // optional — file not found is fine
170
+ throw new SchemaParseError(`Failed to parse ${path}: ${errorMessage(e)}`, e);
117
171
  }
118
- return buildNormalized(physical, tableMarkdowns, concepts, [], tenantPolicy);
119
172
  }
120
173
  function loadFromBundle(bundle, filePath) {
121
174
  const physical = parsePhysicalLayer(bundle.physical, filePath);
122
175
  const tableMarkdowns = {};
123
- for (const [filename, content] of Object.entries(bundle.tables)) {
176
+ // Bundle keys are the `tables/` filenames (see `bundleSchemaDirectory` in
177
+ // @askdb/enrich), so warnings name the same path the directory loader would.
178
+ // Sorted like the directory loader's entries, so both report warnings in one order.
179
+ for (const [filename, content] of Object.entries(bundle.tables).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) {
124
180
  const parsed = parseTableMarkdown(content, filename);
125
- tableMarkdowns[parsed.frontmatter.id] = parsed;
181
+ addTableMarkdown(tableMarkdowns, { tableFile: `tables/${filename}`, parsed }, filePath);
126
182
  }
183
+ // Mirror the directory loader: only an *absent* key means "no file". A present
184
+ // value — including an empty string — is parsed and must be valid, so an empty
185
+ // or corrupt tenantPolicy can never silently disable tenant enforcement.
127
186
  let concepts;
128
- if (bundle.concepts) {
129
- concepts = parseConceptsMarkdown(bundle.concepts, "concepts.md").frontmatter;
187
+ const conceptsContent = bundledFileContent(bundle, "concepts", "concepts.md", filePath);
188
+ if (conceptsContent !== undefined) {
189
+ concepts = parseConceptsMarkdown(conceptsContent, "concepts.md").frontmatter;
130
190
  }
131
191
  let tenantPolicy;
132
- if (bundle.tenantPolicy) {
133
- const parsed = parseTenantPolicyMarkdown(bundle.tenantPolicy, "tenant-policy.md");
192
+ const policyContent = bundledFileContent(bundle, "tenantPolicy", "tenant-policy.md", filePath);
193
+ if (policyContent !== undefined) {
194
+ const parsed = parseTenantPolicyMarkdown(policyContent, "tenant-policy.md");
134
195
  const physicalTableIds = new Set(physical.tables.map((t) => t.id));
135
196
  const physicalColumnIds = new Set(physical.tables.flatMap((t) => t.columns.map((c) => c.id)));
136
197
  tenantPolicy = normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnIds);
137
198
  }
138
199
  return buildNormalized(physical, tableMarkdowns, concepts, [], tenantPolicy);
139
200
  }
201
+ /**
202
+ * Register a parsed table markdown under its front-matter `id`. Two files claiming the
203
+ * same table is a broken artifact, not something to resolve silently: keeping either
204
+ * one would drop the other's front-matter (including any `sensitive: true`), and
205
+ * authoring tools could pair the table with the file the loader ignores.
206
+ */
207
+ function addTableMarkdown(tableMarkdowns, loaded, schemaPath) {
208
+ const id = loaded.parsed.frontmatter.id;
209
+ const existing = tableMarkdowns[id];
210
+ if (existing) {
211
+ throw new SchemaParseError(`Invalid schema at ${schemaPath}: ${existing.tableFile} and ${loaded.tableFile} both have front-matter id \`${id}\`. Each table needs exactly one markdown file; merge them.`);
212
+ }
213
+ tableMarkdowns[id] = loaded;
214
+ }
215
+ /** Read an optional bundled markdown file: `undefined` only when the key is absent. */
216
+ function bundledFileContent(bundle, key, fileName, bundlePath) {
217
+ const value = bundle[key];
218
+ if (value === undefined)
219
+ return undefined;
220
+ if (typeof value !== "string") {
221
+ throw new SchemaParseError(`Invalid bundle at ${bundlePath}: \`${key}\` must be the raw ${fileName} content (a string).`);
222
+ }
223
+ return value;
224
+ }
140
225
  function parsePhysicalLayer(data, filePath) {
141
226
  // Detect and reject pre-v2 format
142
227
  if (typeof data === "object" &&
@@ -154,26 +239,64 @@ function parsePhysicalLayer(data, filePath) {
154
239
  }
155
240
  function buildNormalized(physical, tableMarkdowns, concepts, extraWarnings, tenantPolicy) {
156
241
  const warnings = [...extraWarnings];
157
- // Build a map of all physical table ids and column ids for ID validation
242
+ // Physical table ids, and each physical column id's owning table, for ID validation
158
243
  const physicalTableIds = new Set(physical.tables.map((t) => t.id));
159
- const physicalColumnIds = new Set(physical.tables.flatMap((t) => t.columns.map((c) => c.id)));
244
+ const columnOwner = new Map(physical.tables.flatMap((t) => t.columns.map((c) => [c.id, t.id])));
245
+ // Column ids that any front-matter entry marks `sensitive: true`: in the owning
246
+ // table's markdown or another's, first entry or a later duplicate. Sensitivity is the
247
+ // one field aggregated across every entry naming a column, because escalating can
248
+ // only add protection; no entry can cancel another's `sensitive: true`.
249
+ const escalatedColumnIds = new Set();
160
250
  // Validate all table markdown IDs against physical layer
161
- for (const [id, parsed] of Object.entries(tableMarkdowns)) {
251
+ for (const [id, { tableFile, parsed }] of Object.entries(tableMarkdowns)) {
162
252
  if (!physicalTableIds.has(id)) {
163
- warnings.push({ kind: "orphaned_table_id", tableFile: `tables/${parsed.frontmatter.name}.md`, id });
253
+ warnings.push({ kind: "orphaned_table_id", tableFile, id });
164
254
  }
255
+ const seenColumnIds = new Set();
165
256
  for (const col of parsed.frontmatter.columns ?? []) {
166
- if (!physicalColumnIds.has(col.id)) {
167
- warnings.push({ kind: "orphaned_column_id", tableFile: `tables/${parsed.frontmatter.name}.md`, id: col.id });
257
+ // A repeated entry's description/aliases/enum are ignored (the first entry's
258
+ // apply), but its `sensitive: true` still escalates.
259
+ if (seenColumnIds.has(col.id)) {
260
+ warnings.push({ kind: "duplicate_column_id", tableFile, id: col.id });
261
+ }
262
+ seenColumnIds.add(col.id);
263
+ if (col.sensitive === true)
264
+ escalatedColumnIds.add(col.id);
265
+ const owner = columnOwner.get(col.id);
266
+ if (owner === undefined) {
267
+ warnings.push({ kind: "orphaned_column_id", tableFile, id: col.id });
268
+ }
269
+ else if (owner !== id) {
270
+ // A column id names exactly one column, so a `sensitive: true` filed under the
271
+ // wrong table's markdown still escalates it: honoring it can only add
272
+ // protection, while dropping it would silently expose a column the author
273
+ // marked sensitive. Nothing else in the entry applies: `sensitive: false` never
274
+ // de-escalates, and description/aliases/enum belong in the owner's own file.
275
+ warnings.push({ kind: "misplaced_column_id", tableFile, id: col.id, tableId: owner });
168
276
  }
169
277
  }
170
278
  }
171
279
  const tables = physical.tables.map((physTable) => {
172
- const md = tableMarkdowns[physTable.id];
173
- const tableSensitive = physTable.sensitive === true;
280
+ const loaded = tableMarkdowns[physTable.id];
281
+ const md = loaded?.parsed;
282
+ const tableFile = loaded?.tableFile ?? "";
283
+ // Sensitivity is escalate-only: front-matter `sensitive: true` (written by
284
+ // Studio / @askdb/enrich) marks a table or column sensitive on top of
285
+ // schema.json, but front-matter can never make something *less* sensitive.
286
+ // A `sensitive: false` that contradicts an effective `true` is ignored and
287
+ // reported as a warning so the author sees the override had no effect.
288
+ const tableSensitive = physTable.sensitive === true || md?.frontmatter.sensitive === true;
289
+ if (md?.frontmatter.sensitive === false && tableSensitive) {
290
+ warnings.push({ kind: "sensitivity_downgrade_ignored", tableFile, id: physTable.id });
291
+ }
174
292
  const columns = physTable.columns.map((physCol) => {
175
- const colSensitive = physCol.sensitive === true || tableSensitive;
176
- const mdCol = md?.frontmatter.columns?.find((c) => c.id === physCol.id);
293
+ const mdCols = md?.frontmatter.columns?.filter((c) => c.id === physCol.id) ?? [];
294
+ const mdCol = mdCols[0];
295
+ const colMarked = physCol.sensitive === true || escalatedColumnIds.has(physCol.id);
296
+ const colSensitive = colMarked || tableSensitive;
297
+ if (colSensitive && mdCols.some((c) => c.sensitive === false)) {
298
+ warnings.push({ kind: "sensitivity_downgrade_ignored", tableFile, id: physCol.id });
299
+ }
177
300
  const normalized = {
178
301
  id: physCol.id,
179
302
  name: physCol.name,
@@ -181,6 +304,7 @@ function buildNormalized(physical, tableMarkdowns, concepts, extraWarnings, tena
181
304
  nullable: physCol.nullable,
182
305
  primaryKey: physCol.primaryKey ?? false,
183
306
  sensitive: colSensitive,
307
+ ...(tableSensitive && !colMarked ? { sensitiveFromTable: true } : {}),
184
308
  };
185
309
  // Describable-layer fields excluded when sensitive
186
310
  if (!colSensitive && mdCol) {
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/schema/v2/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/schema/v2/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * A name to look for in text: a bare name (matched literally, dots included),
3
+ * or a column qualified by its table.
4
+ */
5
+ export type MentionName = string | {
6
+ table: string;
7
+ column: string;
8
+ };
9
+ /** Matches one list of names against many texts, compiling the patterns once. */
10
+ export type MentionMatcher = {
11
+ /** Whether `text` mentions any of the names (a single regex test). */
12
+ mentionsAny(text: string): boolean;
13
+ /** The names `text` mentions, in the order given. */
14
+ find(text: string): MentionName[];
15
+ };
16
+ /**
17
+ * Compiles the "mentions a sensitive column by name" rule of the schema v2
18
+ * contract (`docs/contracts/schema-v2.md`, Sensitive propagation) for
19
+ * `names`. Build one per name list and reuse it: `@askdb/rag`'s chunker
20
+ * checks every describable text of a schema against the same list.
21
+ */
22
+ export declare function createMentionMatcher(names: readonly MentionName[]): MentionMatcher;
23
+ /**
24
+ * The names `text` mentions, in `names` order, by the schema v2 contract's
25
+ * mention rule (see {@link createMentionMatcher}). `@askdb/rag`'s chunker and
26
+ * `@askdb/enrich`'s authoring warning both use this rule, so they can't
27
+ * disagree on what a mention is. Compiles `names` on every call; to check
28
+ * many texts against one list, build a matcher once instead.
29
+ */
30
+ export declare function findMentionedNames<T extends MentionName>(text: string, names: readonly T[]): T[];
31
+ //# sourceMappingURL=mentions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/mentions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG;IAC3B,sEAAsE;IACtE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,qDAAqD;IACrD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;CACnC,CAAC;AAMF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,cAAc,CAalF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAEhG"}
@@ -0,0 +1,47 @@
1
+ // A match's ends may not touch a letter, digit, or `_` of any script.
2
+ const BEFORE = "(?<![\\p{L}\\p{N}_])";
3
+ const AFTER = "(?![\\p{L}\\p{N}_])";
4
+ /**
5
+ * Compiles the "mentions a sensitive column by name" rule of the schema v2
6
+ * contract (`docs/contracts/schema-v2.md`, Sensitive propagation) for
7
+ * `names`. Build one per name list and reuse it: `@askdb/rag`'s chunker
8
+ * checks every describable text of a schema against the same list.
9
+ */
10
+ export function createMentionMatcher(names) {
11
+ const entries = names
12
+ .filter((name) => (typeof name === "string" ? name !== "" : name.table !== "" && name.column !== ""))
13
+ .map((name) => ({ name, source: namePattern(name) }));
14
+ const each = entries.map(({ name, source }) => ({ name, pattern: new RegExp(`${BEFORE}${source}${AFTER}`, "iu") }));
15
+ const any = entries.length === 0
16
+ ? undefined
17
+ : new RegExp(`${BEFORE}(?:${entries.map((e) => e.source).join("|")})${AFTER}`, "iu");
18
+ return {
19
+ mentionsAny: (text) => Boolean(text) && any !== undefined && any.test(text),
20
+ find: (text) => (text ? each.filter(({ pattern }) => pattern.test(text)).map(({ name }) => name) : []),
21
+ };
22
+ }
23
+ /**
24
+ * The names `text` mentions, in `names` order, by the schema v2 contract's
25
+ * mention rule (see {@link createMentionMatcher}). `@askdb/rag`'s chunker and
26
+ * `@askdb/enrich`'s authoring warning both use this rule, so they can't
27
+ * disagree on what a mention is. Compiles `names` on every call; to check
28
+ * many texts against one list, build a matcher once instead.
29
+ */
30
+ export function findMentionedNames(text, names) {
31
+ return createMentionMatcher(names).find(text);
32
+ }
33
+ /** A bare name, or a qualified one's table and column parts: as written, or wrapped in one matching pair of quotes or brackets. */
34
+ function partPattern(part) {
35
+ const p = escapeRegex(part);
36
+ return `(?:"${p}"|\`${p}\`|\\[${p}\\]|${p})`;
37
+ }
38
+ function namePattern(name) {
39
+ if (typeof name === "string")
40
+ return partPattern(name);
41
+ // A tight dot, or spaces or tabs on both sides: "users. Org_id" ends a sentence.
42
+ return `${partPattern(name.table)}(?:\\.|[ \\t]+\\.[ \\t]+)${partPattern(name.column)}`;
43
+ }
44
+ function escapeRegex(s) {
45
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
46
+ }
47
+ //# sourceMappingURL=mentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/schema/v2/mentions.ts"],"names":[],"mappings":"AAcA,sEAAsE;AACtE,MAAM,MAAM,GAAG,sBAAsB,CAAC;AACtC,MAAM,KAAK,GAAG,qBAAqB,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA6B;IAChE,MAAM,OAAO,GAAG,KAAK;SAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;SACpG,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACpH,MAAM,GAAG,GACP,OAAO,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IACzF,OAAO;QACL,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3E,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACvG,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAwB,IAAY,EAAE,KAAmB;IACzF,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAQ,CAAC;AACvD,CAAC;AAED,mIAAmI;AACnI,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,IAAiB;IACpC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IACvD,iFAAiF;IACjF,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
@@ -8,6 +8,11 @@ export type NormalizedV2Column = {
8
8
  nullable: boolean;
9
9
  primaryKey: boolean;
10
10
  sensitive: boolean;
11
+ /**
12
+ * `true` when the column is sensitive only because its table is: neither
13
+ * `schema.json` nor table front-matter marks the column itself. Absent otherwise.
14
+ */
15
+ sensitiveFromTable?: true;
11
16
  /** Describable-layer fields. Absent when sensitive=true (excluded from prompts). */
12
17
  description?: string;
13
18
  aliases?: string[];
@@ -64,5 +69,38 @@ export type SchemaV2Warning = {
64
69
  kind: "missing_column_md";
65
70
  tableId: string;
66
71
  columnId: string;
72
+ }
73
+ /**
74
+ * Table markdown front-matter set `sensitive: false` on a table or column that is
75
+ * sensitive anyway (via `schema.json`; for a column, also via its sensitive table or
76
+ * another front-matter entry's `sensitive: true`). Front-matter sensitivity is
77
+ * escalate-only, so the override was ignored.
78
+ */
79
+ | {
80
+ kind: "sensitivity_downgrade_ignored";
81
+ tableFile: string;
82
+ id: string;
83
+ }
84
+ /**
85
+ * A `columns[]` entry in `tableFile` names a column (`id`) that belongs to another
86
+ * table (`tableId`). Only its `sensitive: true` is applied (escalate-only); every
87
+ * other field is ignored. Move the entry to `tableId`'s markdown.
88
+ */
89
+ | {
90
+ kind: "misplaced_column_id";
91
+ tableFile: string;
92
+ id: string;
93
+ tableId: string;
94
+ }
95
+ /**
96
+ * `tableFile`'s `columns[]` lists column `id` again (one warning per repeat). Only the
97
+ * first entry's description, aliases, and enum are applied. Sensitivity is aggregated
98
+ * across every entry: any `sensitive: true` escalates the column, and a duplicate's
99
+ * `sensitive: false` never de-escalates it. Merge the entries into one.
100
+ */
101
+ | {
102
+ kind: "duplicate_column_id";
103
+ tableFile: string;
104
+ id: string;
67
105
  };
68
106
  //# sourceMappingURL=normalized.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalized.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/normalized.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,qEAAqE;IACrE,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"normalized.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/normalized.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAC1B,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,qEAAqE;IACrE,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAClE;;;;;GAKG;GACD;IAAE,IAAI,EAAE,+BAA+B,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAC1E;;;;GAIG;GACD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACjF;;;;;GAKG;GACD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -1,4 +1,13 @@
1
1
  import { type ParsedConceptsMarkdown, type ParsedTableMarkdown } from "./describable.js";
2
+ /**
3
+ * Split YAML front-matter from a markdown body. gray-matter throws a raw
4
+ * `YAMLException` on malformed YAML; rethrow it as a `SchemaParseError` naming
5
+ * the file so callers can rely on one error type for every artifact problem.
6
+ */
7
+ export declare function readFrontMatter(content: string, kind: string, filePath?: string): {
8
+ data: Record<string, unknown>;
9
+ content: string;
10
+ };
2
11
  /**
3
12
  * Parse a `tables/<table>.md` file.
4
13
  * Front-matter is validated by zod (strict — unknown keys are errors).
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAe1F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAWhG"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAe1F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAWhG"}
@@ -1,13 +1,29 @@
1
1
  import matter from "gray-matter";
2
2
  import { SchemaParseError } from "../../errors.js";
3
3
  import { RECOGNIZED_H2_SECTIONS, v2ConceptsFrontmatterSchema, v2TableFrontmatterSchema, } from "./describable.js";
4
+ /**
5
+ * Split YAML front-matter from a markdown body. gray-matter throws a raw
6
+ * `YAMLException` on malformed YAML; rethrow it as a `SchemaParseError` naming
7
+ * the file so callers can rely on one error type for every artifact problem.
8
+ */
9
+ export function readFrontMatter(content, kind, filePath) {
10
+ try {
11
+ const file = matter(content);
12
+ return { data: file.data, content: file.content };
13
+ }
14
+ catch (e) {
15
+ const loc = filePath ? ` in ${filePath}` : "";
16
+ const reason = e instanceof Error ? e.message : String(e);
17
+ throw new SchemaParseError(`Malformed ${kind} front-matter YAML${loc}: ${reason}`, e);
18
+ }
19
+ }
4
20
  /**
5
21
  * Parse a `tables/<table>.md` file.
6
22
  * Front-matter is validated by zod (strict — unknown keys are errors).
7
23
  * Recognized H2 sections are extracted; the rest of the body is preserved verbatim.
8
24
  */
9
25
  export function parseTableMarkdown(content, filePath) {
10
- const file = matter(content);
26
+ const file = readFrontMatter(content, "table", filePath);
11
27
  const result = v2TableFrontmatterSchema.safeParse(file.data);
12
28
  if (!result.success) {
13
29
  const loc = filePath ? ` in ${filePath}` : "";
@@ -21,7 +37,7 @@ export function parseTableMarkdown(content, filePath) {
21
37
  * Parse `concepts.md`.
22
38
  */
23
39
  export function parseConceptsMarkdown(content, filePath) {
24
- const file = matter(content);
40
+ const file = readFrontMatter(content, "concepts", filePath);
25
41
  const result = v2ConceptsFrontmatterSchema.safeParse(file.data);
26
42
  if (!result.success) {
27
43
  const loc = filePath ? ` in ${filePath}` : "";