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

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 (138) hide show
  1. package/README.md +20 -19
  2. package/dist/ask.d.ts +45 -45
  3. package/dist/ask.d.ts.map +1 -1
  4. package/dist/ask.js +153 -310
  5. package/dist/ask.js.map +1 -1
  6. package/dist/enrichment/index.d.ts +1 -1
  7. package/dist/enrichment/index.d.ts.map +1 -1
  8. package/dist/enrichment/prompt.d.ts +3 -3
  9. package/dist/enrichment/prompt.d.ts.map +1 -1
  10. package/dist/enrichment/prompt.js +43 -17
  11. package/dist/enrichment/prompt.js.map +1 -1
  12. package/dist/enrichment/suggest.d.ts +2 -2
  13. package/dist/enrichment/suggest.d.ts.map +1 -1
  14. package/dist/enrichment/suggest.js +3 -1
  15. package/dist/enrichment/suggest.js.map +1 -1
  16. package/dist/enrichment/types.d.ts +29 -9
  17. package/dist/enrichment/types.d.ts.map +1 -1
  18. package/dist/errors.d.ts +97 -6
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +21 -0
  21. package/dist/errors.js.map +1 -1
  22. package/dist/index.d.ts +7 -5
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +6 -4
  25. package/dist/index.js.map +1 -1
  26. package/dist/logging/askdb-logger.d.ts +2 -0
  27. package/dist/logging/askdb-logger.d.ts.map +1 -1
  28. package/dist/logging/create-askdb-logger.d.ts.map +1 -1
  29. package/dist/logging/create-askdb-logger.js +3 -0
  30. package/dist/logging/create-askdb-logger.js.map +1 -1
  31. package/dist/logging/log-events.d.ts +8 -0
  32. package/dist/logging/log-events.d.ts.map +1 -1
  33. package/dist/logging/log-events.js +8 -0
  34. package/dist/logging/log-events.js.map +1 -1
  35. package/dist/retrieval/synthesize-ddl.d.ts +7 -1
  36. package/dist/retrieval/synthesize-ddl.d.ts.map +1 -1
  37. package/dist/retrieval/synthesize-ddl.js +36 -33
  38. package/dist/retrieval/synthesize-ddl.js.map +1 -1
  39. package/dist/schema/normalize.d.ts +6 -2
  40. package/dist/schema/normalize.d.ts.map +1 -1
  41. package/dist/schema/normalize.js +1 -4
  42. package/dist/schema/normalize.js.map +1 -1
  43. package/dist/schema/v2/format.d.ts +28 -1
  44. package/dist/schema/v2/format.d.ts.map +1 -1
  45. package/dist/schema/v2/format.js +53 -19
  46. package/dist/schema/v2/format.js.map +1 -1
  47. package/dist/schema/v2/index.d.ts +4 -3
  48. package/dist/schema/v2/index.d.ts.map +1 -1
  49. package/dist/schema/v2/index.js +4 -3
  50. package/dist/schema/v2/index.js.map +1 -1
  51. package/dist/schema/v2/loader.d.ts +28 -7
  52. package/dist/schema/v2/loader.d.ts.map +1 -1
  53. package/dist/schema/v2/loader.js +220 -96
  54. package/dist/schema/v2/loader.js.map +1 -1
  55. package/dist/schema/v2/mentions.d.ts +12 -0
  56. package/dist/schema/v2/mentions.d.ts.map +1 -1
  57. package/dist/schema/v2/mentions.js +65 -11
  58. package/dist/schema/v2/mentions.js.map +1 -1
  59. package/dist/schema/v2/save-file.d.ts +56 -0
  60. package/dist/schema/v2/save-file.d.ts.map +1 -0
  61. package/dist/schema/v2/save-file.js +138 -0
  62. package/dist/schema/v2/save-file.js.map +1 -0
  63. package/dist/schema/v2/tenant-policy-loader.d.ts +1 -10
  64. package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -1
  65. package/dist/schema/v2/tenant-policy-loader.js +65 -51
  66. package/dist/schema/v2/tenant-policy-loader.js.map +1 -1
  67. package/dist/schema/v2/tenant-policy.d.ts +7 -2
  68. package/dist/schema/v2/tenant-policy.d.ts.map +1 -1
  69. package/dist/schema/v2/tenant-policy.js +26 -0
  70. package/dist/schema/v2/tenant-policy.js.map +1 -1
  71. package/dist/sql/bind.d.ts +27 -7
  72. package/dist/sql/bind.d.ts.map +1 -1
  73. package/dist/sql/bind.js +33 -18
  74. package/dist/sql/bind.js.map +1 -1
  75. package/dist/sql/dialect-spec.d.ts +1 -0
  76. package/dist/sql/dialect-spec.d.ts.map +1 -1
  77. package/dist/sql/dialect-spec.js +7 -2
  78. package/dist/sql/dialect-spec.js.map +1 -1
  79. package/dist/sql/generate.d.ts +17 -11
  80. package/dist/sql/generate.d.ts.map +1 -1
  81. package/dist/sql/generate.js +65 -33
  82. package/dist/sql/generate.js.map +1 -1
  83. package/dist/sql/guardrail-decide.d.ts +58 -0
  84. package/dist/sql/guardrail-decide.d.ts.map +1 -0
  85. package/dist/sql/guardrail-decide.js +161 -0
  86. package/dist/sql/guardrail-decide.js.map +1 -0
  87. package/dist/sql/guardrails.d.ts +52 -0
  88. package/dist/sql/guardrails.d.ts.map +1 -0
  89. package/dist/sql/guardrails.js +100 -0
  90. package/dist/sql/guardrails.js.map +1 -0
  91. package/dist/sql/index.d.ts +2 -1
  92. package/dist/sql/index.d.ts.map +1 -1
  93. package/dist/sql/index.js +2 -1
  94. package/dist/sql/index.js.map +1 -1
  95. package/dist/sql/lexer.d.ts +13 -0
  96. package/dist/sql/lexer.d.ts.map +1 -1
  97. package/dist/sql/lexer.js +42 -7
  98. package/dist/sql/lexer.js.map +1 -1
  99. package/dist/sql/prompt-identifiers.d.ts +9 -0
  100. package/dist/sql/prompt-identifiers.d.ts.map +1 -1
  101. package/dist/sql/prompt-identifiers.js +22 -3
  102. package/dist/sql/prompt-identifiers.js.map +1 -1
  103. package/dist/sql/prompt.d.ts.map +1 -1
  104. package/dist/sql/prompt.js +5 -2
  105. package/dist/sql/prompt.js.map +1 -1
  106. package/dist/sql/rebind.d.ts +116 -0
  107. package/dist/sql/rebind.d.ts.map +1 -0
  108. package/dist/sql/rebind.js +215 -0
  109. package/dist/sql/rebind.js.map +1 -0
  110. package/dist/sql/sensitive-guardrail.d.ts +7 -2
  111. package/dist/sql/sensitive-guardrail.d.ts.map +1 -1
  112. package/dist/sql/sensitive-guardrail.js +14 -33
  113. package/dist/sql/sensitive-guardrail.js.map +1 -1
  114. package/dist/sql/tenant-guardrail.d.ts +3 -14
  115. package/dist/sql/tenant-guardrail.d.ts.map +1 -1
  116. package/dist/sql/tenant-guardrail.js +16 -65
  117. package/dist/sql/tenant-guardrail.js.map +1 -1
  118. package/dist/sql/tenant-placeholders.d.ts +40 -14
  119. package/dist/sql/tenant-placeholders.d.ts.map +1 -1
  120. package/dist/sql/tenant-placeholders.js +92 -48
  121. package/dist/sql/tenant-placeholders.js.map +1 -1
  122. package/dist/sql/tenant-policy-warnings.d.ts +8 -0
  123. package/dist/sql/tenant-policy-warnings.d.ts.map +1 -0
  124. package/dist/sql/tenant-policy-warnings.js +21 -0
  125. package/dist/sql/tenant-policy-warnings.js.map +1 -0
  126. package/dist/sql/tenant-scope-expand.d.ts +46 -0
  127. package/dist/sql/tenant-scope-expand.d.ts.map +1 -0
  128. package/dist/sql/tenant-scope-expand.js +101 -0
  129. package/dist/sql/tenant-scope-expand.js.map +1 -0
  130. package/dist/sql/tsql-batch.d.ts +56 -0
  131. package/dist/sql/tsql-batch.d.ts.map +1 -0
  132. package/dist/sql/tsql-batch.js +246 -0
  133. package/dist/sql/tsql-batch.js.map +1 -0
  134. package/dist/sql/validate.d.ts +18 -3
  135. package/dist/sql/validate.d.ts.map +1 -1
  136. package/dist/sql/validate.js +127 -8
  137. package/dist/sql/validate.js.map +1 -1
  138. package/package.json +2 -2
@@ -1,6 +1,9 @@
1
1
  // A match's ends may not touch a letter, digit, or `_` of any script.
2
2
  const BEFORE = "(?<![\\p{L}\\p{N}_])";
3
3
  const AFTER = "(?![\\p{L}\\p{N}_])";
4
+ // Between a qualified name's table and column: a tight dot, or spaces or tabs
5
+ // on both sides ("users. Org_id" ends a sentence).
6
+ const QUALIFIER = "(?:\\.|[ \\t]+\\.[ \\t]+)";
4
7
  /**
5
8
  * Compiles the "mentions a sensitive column by name" rule of the schema v2
6
9
  * contract (`docs/contracts/schema-v2.md`, Sensitive propagation) for
@@ -8,16 +11,40 @@ const AFTER = "(?![\\p{L}\\p{N}_])";
8
11
  * checks every describable text of a schema against the same list.
9
12
  */
10
13
  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");
14
+ const entries = names.filter((name) => typeof name === "string" ? name !== "" : name.table !== "" && name.column !== "");
15
+ // One alternative per bare name, and one per table for its qualified names
16
+ // (`table` + separator + any of its columns): the same matches as one
17
+ // alternative per name.
18
+ const bare = [];
19
+ const columnsByTable = new Map();
20
+ for (const name of entries) {
21
+ if (typeof name === "string")
22
+ bare.push(partPattern(name));
23
+ else {
24
+ const columns = columnsByTable.get(name.table) ?? [];
25
+ columns.push(partPattern(name.column));
26
+ columnsByTable.set(name.table, columns);
27
+ }
28
+ }
29
+ const tables = [...columnsByTable.keys()].map(partPattern);
30
+ const alternatives = [
31
+ ...bare,
32
+ ...[...columnsByTable.values()].map((columns, i) => `${tables[i]}${QUALIFIER}(?:${columns.join("|")})`),
33
+ ];
34
+ if (alternatives.length === 0)
35
+ return { mentionsAny: () => false, find: () => [] };
36
+ const any = new RegExp(`${BEFORE}(?:${alternatives.join("|")})${AFTER}`, "iu");
37
+ // A first pass whose size follows the number of tables, not of their columns: a
38
+ // qualified mention needs one of its tables followed by the separator. Every
39
+ // text passes through it, and only a hit runs the full pattern, whose size
40
+ // slows some engines (Node 22's) on every text otherwise.
41
+ const firstPass = new RegExp(`${BEFORE}(?:${[...bare.map((b) => `${b}${AFTER}`), ...tables.map((t) => `${t}${QUALIFIER}`)].join("|")})`, "iu");
42
+ // Compiled on the first `find`: the prompt builders only ask `mentionsAny`.
43
+ let each;
44
+ const patterns = () => (each ??= entries.map((name) => ({ name, pattern: new RegExp(`${BEFORE}${namePattern(name)}${AFTER}`, "iu") })));
18
45
  return {
19
- mentionsAny: (text) => Boolean(text) && any !== undefined && any.test(text),
20
- find: (text) => (text ? each.filter(({ pattern }) => pattern.test(text)).map(({ name }) => name) : []),
46
+ mentionsAny: (text) => Boolean(text) && firstPass.test(text) && any.test(text),
47
+ find: (text) => (text ? patterns().filter(({ pattern }) => pattern.test(text)).map(({ name }) => name) : []),
21
48
  };
22
49
  }
23
50
  /**
@@ -30,6 +57,34 @@ export function createMentionMatcher(names) {
30
57
  export function findMentionedNames(text, names) {
31
58
  return createMentionMatcher(names).find(text);
32
59
  }
60
+ /**
61
+ * The names whose mention marks text as naming a sensitive column, for the
62
+ * whole schema (ADR 0017; how they match is the schema v2 contract's mention
63
+ * rule). A column marked sensitive itself counts by its bare name; a column
64
+ * of a sensitive table that is sensitive only through it
65
+ * (`sensitiveFromTable`) counts only qualified, since its bare name is often
66
+ * generic (`id`, `org_id`, `name`). Untracked tables' columns count too.
67
+ * `@askdb/rag`'s chunker and both NL→SQL prompt builders check describable
68
+ * text against this list.
69
+ */
70
+ export function sensitiveMentionNames(schema) {
71
+ const names = [];
72
+ const bare = new Set();
73
+ for (const t of schema.tables) {
74
+ for (const c of t.columns) {
75
+ if (!c.sensitive && !t.sensitive)
76
+ continue;
77
+ if (t.sensitive && c.sensitiveFromTable === true) {
78
+ names.push({ table: t.name, column: c.name });
79
+ }
80
+ else if (!bare.has(c.name)) {
81
+ bare.add(c.name);
82
+ names.push(c.name);
83
+ }
84
+ }
85
+ }
86
+ return names;
87
+ }
33
88
  /** 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
89
  function partPattern(part) {
35
90
  const p = escapeRegex(part);
@@ -38,8 +93,7 @@ function partPattern(part) {
38
93
  function namePattern(name) {
39
94
  if (typeof name === "string")
40
95
  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)}`;
96
+ return `${partPattern(name.table)}${QUALIFIER}${partPattern(name.column)}`;
43
97
  }
44
98
  function escapeRegex(s) {
45
99
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -1 +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"}
1
+ {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/schema/v2/mentions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Write `content` (a string, written as UTF-8, or bytes written as given) to a file
3
+ * inside a schema directory so that no link can redirect the write out of it
4
+ * (ADR 0028). `relativePath` names the file from `schemaDir`
5
+ * with `/` between its parts (`schema.json`, `tables/orders.md`). Every AskDB writer
6
+ * into a schema directory goes through here: `@askdb/enrich`'s saves, Studio's
7
+ * Playground history and `.gitignore`, and `@askdb/introspect`'s `schema.json`. A
8
+ * schema directory can come from an untrusted checkout (git stores symbolic links,
9
+ * tar archives also store hard links), and Studio saves into it for as long as it
10
+ * runs.
11
+ *
12
+ * Errors read `Refusing to write <relativePath> outside the schema directory: <why>`.
13
+ *
14
+ * - `relativePath` must name a file below `schemaDir`: an empty part, `.`, `..`, a
15
+ * NUL byte, or (on Windows) `\` in a part is refused, and so is an absolute path.
16
+ * - No directory between the schema directory and the target (`tables/`), and not
17
+ * the target itself, may be a symbolic link; either one is refused. The schema
18
+ * directory itself may be one: it is the path the user chose. Directories are not
19
+ * created.
20
+ * - The content goes to a new temp file next to the target (`O_EXCL`, so it never
21
+ * opens an existing path), which is then renamed over the target. `rename`
22
+ * replaces the directory entry instead of writing into the existing file, so a
23
+ * hard link to a file elsewhere is detached, not written through, and a symbolic
24
+ * link planted at the target after the check is replaced, not followed. This
25
+ * holds on Windows too, which has no `O_NOFOLLOW`.
26
+ * - A target the caller can't write is refused with `EACCES`, as a plain write
27
+ * would be. `rename` needs only write access to the directory, so without this
28
+ * check a read-only file (how Perforce and ClearCase mark files not checked out)
29
+ * would be replaced on macOS and Linux. The temp file needs write access to the
30
+ * directory too, so a save into a directory the caller can't write fails with
31
+ * `EACCES` even when the file itself is writable.
32
+ * - The temp file gets the target's owner, group, and permission bits before any
33
+ * content is written, so a `0600` file's new content is never readable by others
34
+ * and a `0660` file stays shared with its own group, not the group a new file in
35
+ * the directory would get (`keepOwnerAndGroup`). It is `fsync`ed before the
36
+ * rename. Readers, and a crash or power loss, see either the old file or the new
37
+ * one, never a partial write.
38
+ *
39
+ * Not covered: a directory between the schema directory and the target (`tables/`)
40
+ * being swapped for a link after the check and before the rename, since the temp
41
+ * path and the rename still resolve through it. That needs a concurrent local
42
+ * writer racing a save. And only root can give a file to another user, so on macOS
43
+ * and Linux a save by someone other than the file's owner (a member of a group that
44
+ * may write it) makes the saver its owner. On Windows, the rename fails with `EPERM`
45
+ * while another process holds the target open without delete sharing.
46
+ */
47
+ export declare function saveSchemaFile(schemaDir: string, relativePath: string, content: string | Uint8Array): void;
48
+ /**
49
+ * `mode` for a file whose group could not be kept: the group and others both get
50
+ * only what both had before, so neither the group the file lands in nor the old
51
+ * group's non-members gain access (`0660` becomes `0600`, `0604` becomes `0600`).
52
+ *
53
+ * @internal Exported for its tests; `index.ts` doesn't re-export it.
54
+ */
55
+ export declare function modeWhenGroupLost(mode: number): number;
56
+ //# sourceMappingURL=save-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-file.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/save-file.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,IAAI,CAwDN;AAsBD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD"}
@@ -0,0 +1,138 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { accessSync, closeSync, constants as fsConstants, fchmodSync, fchownSync, fstatSync, fsyncSync, lstatSync, openSync, renameSync, rmSync, writeFileSync, } from "node:fs";
3
+ import { join } from "node:path";
4
+ /**
5
+ * Write `content` (a string, written as UTF-8, or bytes written as given) to a file
6
+ * inside a schema directory so that no link can redirect the write out of it
7
+ * (ADR 0028). `relativePath` names the file from `schemaDir`
8
+ * with `/` between its parts (`schema.json`, `tables/orders.md`). Every AskDB writer
9
+ * into a schema directory goes through here: `@askdb/enrich`'s saves, Studio's
10
+ * Playground history and `.gitignore`, and `@askdb/introspect`'s `schema.json`. A
11
+ * schema directory can come from an untrusted checkout (git stores symbolic links,
12
+ * tar archives also store hard links), and Studio saves into it for as long as it
13
+ * runs.
14
+ *
15
+ * Errors read `Refusing to write <relativePath> outside the schema directory: <why>`.
16
+ *
17
+ * - `relativePath` must name a file below `schemaDir`: an empty part, `.`, `..`, a
18
+ * NUL byte, or (on Windows) `\` in a part is refused, and so is an absolute path.
19
+ * - No directory between the schema directory and the target (`tables/`), and not
20
+ * the target itself, may be a symbolic link; either one is refused. The schema
21
+ * directory itself may be one: it is the path the user chose. Directories are not
22
+ * created.
23
+ * - The content goes to a new temp file next to the target (`O_EXCL`, so it never
24
+ * opens an existing path), which is then renamed over the target. `rename`
25
+ * replaces the directory entry instead of writing into the existing file, so a
26
+ * hard link to a file elsewhere is detached, not written through, and a symbolic
27
+ * link planted at the target after the check is replaced, not followed. This
28
+ * holds on Windows too, which has no `O_NOFOLLOW`.
29
+ * - A target the caller can't write is refused with `EACCES`, as a plain write
30
+ * would be. `rename` needs only write access to the directory, so without this
31
+ * check a read-only file (how Perforce and ClearCase mark files not checked out)
32
+ * would be replaced on macOS and Linux. The temp file needs write access to the
33
+ * directory too, so a save into a directory the caller can't write fails with
34
+ * `EACCES` even when the file itself is writable.
35
+ * - The temp file gets the target's owner, group, and permission bits before any
36
+ * content is written, so a `0600` file's new content is never readable by others
37
+ * and a `0660` file stays shared with its own group, not the group a new file in
38
+ * the directory would get (`keepOwnerAndGroup`). It is `fsync`ed before the
39
+ * rename. Readers, and a crash or power loss, see either the old file or the new
40
+ * one, never a partial write.
41
+ *
42
+ * Not covered: a directory between the schema directory and the target (`tables/`)
43
+ * being swapped for a link after the check and before the rename, since the temp
44
+ * path and the rename still resolve through it. That needs a concurrent local
45
+ * writer racing a save. And only root can give a file to another user, so on macOS
46
+ * and Linux a save by someone other than the file's owner (a member of a group that
47
+ * may write it) makes the saver its owner. On Windows, the rename fails with `EPERM`
48
+ * while another process holds the target open without delete sharing.
49
+ */
50
+ export function saveSchemaFile(schemaDir, relativePath, content) {
51
+ const refuse = (why) => new Error(`Refusing to write ${relativePath} outside the schema directory: ${why}`);
52
+ const dirs = relativePath.split("/");
53
+ for (const part of dirs) {
54
+ if (part === "" ||
55
+ part === "." ||
56
+ part === ".." ||
57
+ part.includes("\0") ||
58
+ (process.platform === "win32" && part.includes("\\"))) {
59
+ throw refuse(`${JSON.stringify(part)} is not a file or directory name`);
60
+ }
61
+ }
62
+ const filename = dirs.pop();
63
+ let dir = schemaDir;
64
+ for (const [i, part] of dirs.entries()) {
65
+ dir = join(dir, part);
66
+ if (lstatSync(dir).isSymbolicLink()) {
67
+ throw refuse(`${dirs.slice(0, i + 1).join("/")}/ is a symbolic link`);
68
+ }
69
+ }
70
+ const filePath = join(dir, filename);
71
+ const existing = lstatSync(filePath, { throwIfNoEntry: false });
72
+ if (existing?.isSymbolicLink())
73
+ throw refuse(`${JSON.stringify(filename)} is a symbolic link`);
74
+ if (existing)
75
+ accessSync(filePath, fsConstants.W_OK);
76
+ const tempPath = join(dir, `.askdb-save-${randomBytes(8).toString("hex")}.tmp`);
77
+ const fd = openSync(tempPath, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL, 0o666);
78
+ try {
79
+ try {
80
+ // Keep the replaced file's owner, group, and permission bits, before the content lands.
81
+ if (existing) {
82
+ const mode = existing.mode & 0o777;
83
+ const groupKept = keepOwnerAndGroup(fd, existing);
84
+ fchmodSync(fd, groupKept ? mode : modeWhenGroupLost(mode));
85
+ }
86
+ writeFileSync(fd, content);
87
+ fsyncSync(fd);
88
+ }
89
+ finally {
90
+ closeSync(fd);
91
+ }
92
+ renameSync(tempPath, filePath);
93
+ }
94
+ catch (e) {
95
+ try {
96
+ rmSync(tempPath, { force: true });
97
+ }
98
+ catch {
99
+ // Report the save's own error, not a failed cleanup (e.g. Windows EPERM).
100
+ }
101
+ throw e;
102
+ }
103
+ }
104
+ /**
105
+ * Give the file open at `fd` the owner and group of `existing`, as far as the
106
+ * process may: only root can change a file's owner, and anyone else can set only
107
+ * a group they belong to. Returns whether the group now matches; Windows has no
108
+ * POSIX owner or group, so there it is always true.
109
+ */
110
+ function keepOwnerAndGroup(fd, existing) {
111
+ if (process.platform === "win32")
112
+ return true;
113
+ const tryChown = (uid, gid) => {
114
+ try {
115
+ fchownSync(fd, uid, gid);
116
+ }
117
+ catch {
118
+ // Not permitted (or not supported by this file system); checked below.
119
+ }
120
+ };
121
+ if (fstatSync(fd).uid !== existing.uid)
122
+ tryChown(existing.uid, existing.gid);
123
+ if (fstatSync(fd).gid !== existing.gid)
124
+ tryChown(-1, existing.gid);
125
+ return fstatSync(fd).gid === existing.gid;
126
+ }
127
+ /**
128
+ * `mode` for a file whose group could not be kept: the group and others both get
129
+ * only what both had before, so neither the group the file lands in nor the old
130
+ * group's non-members gain access (`0660` becomes `0600`, `0604` becomes `0600`).
131
+ *
132
+ * @internal Exported for its tests; `index.ts` doesn't re-export it.
133
+ */
134
+ export function modeWhenGroupLost(mode) {
135
+ const shared = (mode >> 3) & mode & 0o007;
136
+ return (mode & 0o700) | (shared << 3) | shared;
137
+ }
138
+ //# sourceMappingURL=save-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-file.js","sourceRoot":"","sources":["../../../src/schema/v2/save-file.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,4 @@
1
- import { type ParsedTenantPolicyMarkdown, type NormalizedTenantPolicy, type ScopeThrough } from "./tenant-policy.js";
1
+ import { type ParsedTenantPolicyMarkdown, type NormalizedTenantPolicy } from "./tenant-policy.js";
2
2
  export declare function parseTenantPolicyMarkdown(content: string, filePath?: string): ParsedTenantPolicyMarkdown;
3
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
4
  //# sourceMappingURL=tenant-policy-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-policy-loader.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,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,CAiB5B;AAyBD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,0BAA0B,EAClC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,sBAAsB,CAqKxB;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"}
1
+ {"version":3,"file":"tenant-policy-loader.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,0BAA0B,EAG/B,KAAK,sBAAsB,EAI5B,MAAM,oBAAoB,CAAC;AAM5B,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,0BAA0B,CAiB5B;AAiCD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,0BAA0B,EAClC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,sBAAsB,CAwLxB"}
@@ -1,6 +1,6 @@
1
1
  import { SchemaParseError } from "../../errors.js";
2
2
  import { readFrontMatter } from "./parser.js";
3
- import { assertDistinctRootPlaceholders, tenantPolicyFrontmatterSchema, TENANT_POLICY_H2_SECTIONS, } from "./tenant-policy.js";
3
+ import { assertDistinctRootPlaceholders, formatTenantPolicyWarning, tenantPolicyFrontmatterSchema, TENANT_POLICY_H2_SECTIONS, } from "./tenant-policy.js";
4
4
  // ---------------------------------------------------------------------------
5
5
  // Parsing
6
6
  // ---------------------------------------------------------------------------
@@ -34,18 +34,28 @@ function extractTenantPolicySections(body) {
34
34
  // ---------------------------------------------------------------------------
35
35
  // Cross-reference validation & normalization
36
36
  // ---------------------------------------------------------------------------
37
+ /** Problems that stay warnings in every mode: an entry for a table schema.json no longer has. */
38
+ const TABLE_REMOVED_KINDS = new Set([
39
+ "orphaned_root_id",
40
+ "orphaned_scoped_table_id",
41
+ "orphaned_polymorphic_table_id",
42
+ "orphaned_global_table_id",
43
+ ]);
37
44
  export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnIds) {
38
45
  const fm = parsed.frontmatter;
39
46
  const warnings = [];
40
47
  // A shared placeholder would bind one root's IDs where another root's column is compared.
41
48
  assertDistinctRootPlaceholders(fm.roots);
42
49
  const rootIds = new Set(fm.roots.map((r) => r.id));
50
+ // An entry whose own table schema.json no longer has reports only that table: its
51
+ // columns went with it, and the entry scopes nothing, so they are not checked.
52
+ const tableRemoved = (tableId) => !physicalTableIds.has(tableId);
43
53
  // Validate root table IDs exist in physical schema
44
54
  for (const root of fm.roots) {
45
- if (!physicalTableIds.has(root.id)) {
55
+ if (tableRemoved(root.id)) {
46
56
  warnings.push({ kind: "orphaned_root_id", id: root.id });
47
57
  }
48
- if (!physicalColumnIds.has(root.tenantIdColumn)) {
58
+ else if (!physicalColumnIds.has(root.tenantIdColumn)) {
49
59
  warnings.push({
50
60
  kind: "orphaned_column_id",
51
61
  id: root.tenantIdColumn,
@@ -60,7 +70,7 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
60
70
  context: `parent of root ${root.id}`,
61
71
  });
62
72
  }
63
- if (!physicalColumnIds.has(root.parent.foreignKey)) {
73
+ if (!tableRemoved(root.id) && !physicalColumnIds.has(root.parent.foreignKey)) {
64
74
  warnings.push({
65
75
  kind: "orphaned_fk_id",
66
76
  id: root.parent.foreignKey,
@@ -85,7 +95,8 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
85
95
  context: `hierarchy child`,
86
96
  });
87
97
  }
88
- if (!physicalColumnIds.has(edge.foreignKey)) {
98
+ // The edge's foreign key sits on the child's table.
99
+ if (!tableRemoved(edge.child) && !physicalColumnIds.has(edge.foreignKey)) {
89
100
  warnings.push({
90
101
  kind: "orphaned_fk_id",
91
102
  id: edge.foreignKey,
@@ -100,7 +111,8 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
100
111
  }
101
112
  // Validate scoped tables
102
113
  for (const st of fm.scopedTables ?? []) {
103
- if (!physicalTableIds.has(st.id)) {
114
+ const removed = tableRemoved(st.id);
115
+ if (removed) {
104
116
  warnings.push({ kind: "orphaned_scoped_table_id", id: st.id });
105
117
  }
106
118
  for (const path of st.scopeThrough) {
@@ -111,6 +123,8 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
111
123
  context: `scopeThrough on ${st.id}`,
112
124
  });
113
125
  }
126
+ if (removed)
127
+ continue;
114
128
  if ("column" in path) {
115
129
  if (!physicalColumnIds.has(path.column)) {
116
130
  warnings.push({
@@ -142,17 +156,18 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
142
156
  }
143
157
  // Validate polymorphic tables
144
158
  for (const pt of fm.polymorphicTables ?? []) {
145
- if (!physicalTableIds.has(pt.id)) {
159
+ const removed = tableRemoved(pt.id);
160
+ if (removed) {
146
161
  warnings.push({ kind: "orphaned_polymorphic_table_id", id: pt.id });
147
162
  }
148
- if (!physicalColumnIds.has(pt.typeColumn)) {
163
+ if (!removed && !physicalColumnIds.has(pt.typeColumn)) {
149
164
  warnings.push({
150
165
  kind: "orphaned_column_id",
151
166
  id: pt.typeColumn,
152
167
  context: `polymorphic typeColumn on ${pt.id}`,
153
168
  });
154
169
  }
155
- if (!physicalColumnIds.has(pt.idColumn)) {
170
+ if (!removed && !physicalColumnIds.has(pt.idColumn)) {
156
171
  warnings.push({
157
172
  kind: "orphaned_column_id",
158
173
  id: pt.idColumn,
@@ -171,10 +186,20 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
171
186
  }
172
187
  // Validate global tables
173
188
  for (const gt of fm.globalTables ?? []) {
174
- if (!physicalTableIds.has(gt)) {
189
+ if (tableRemoved(gt)) {
175
190
  warnings.push({ kind: "orphaned_global_table_id", id: gt });
176
191
  }
177
192
  }
193
+ // Under strict, a policy that doesn't match schema.json fails the load: tenancy
194
+ // must not run on a policy with a renamed column or a cycle (ADR 0023). Only a
195
+ // removed table's entry stays a warning, since it scopes nothing.
196
+ if (fm.enforcement === "strict") {
197
+ const errors = warnings.filter((w) => !TABLE_REMOVED_KINDS.has(w.kind));
198
+ if (errors.length > 0) {
199
+ throw new SchemaParseError(`the tenant policy doesn't match schema.json, and enforcement is strict: ` +
200
+ `${errors.map(formatTenantPolicyWarning).join("; ")}. Update tenant-policy.md to match schema.json.`);
201
+ }
202
+ }
178
203
  // Build coverage report
179
204
  const coverage = buildCoverage(fm, physicalTableIds);
180
205
  return {
@@ -232,54 +257,43 @@ function buildCoverage(fm, physicalTableIds) {
232
257
  return entries;
233
258
  }
234
259
  // ---------------------------------------------------------------------------
235
- // Helpers — scope-through classification for mixed tables
236
- // ---------------------------------------------------------------------------
237
- export function isScopeThroughColumn(s) {
238
- return "column" in s;
239
- }
240
- export function isScopeThroughJoin(s) {
241
- return "join" in s;
242
- }
243
- // ---------------------------------------------------------------------------
244
260
  // Cycle detection in hierarchy
245
261
  // ---------------------------------------------------------------------------
246
262
  function detectHierarchyCycles(fm) {
247
- const parentMap = new Map();
263
+ // Every parent of every child: the hierarchy is a DAG, so a root may have several
264
+ // parents, and keeping one per child would hide a cycle behind a later edge.
265
+ const parents = new Map();
266
+ const addEdge = (child, parent) => {
267
+ const set = parents.get(child) ?? new Set();
268
+ set.add(parent);
269
+ parents.set(child, set);
270
+ };
248
271
  for (const root of fm.roots) {
249
- if (root.parent) {
250
- parentMap.set(root.id, root.parent.root);
251
- }
252
- }
253
- // Also use hierarchy edges
254
- for (const edge of fm.hierarchy ?? []) {
255
- parentMap.set(edge.child, edge.parent);
272
+ if (root.parent)
273
+ addEdge(root.id, root.parent.root);
256
274
  }
257
- // Walk each node up — if we revisit a node, there's a cycle
258
- const visited = new Set();
259
- const inStack = new Set();
275
+ for (const edge of fm.hierarchy ?? [])
276
+ addEdge(edge.child, edge.parent);
277
+ // Depth-first walk up the parent edges; reaching a node still on the stack closes a cycle.
278
+ const state = new Map();
279
+ const stack = [];
260
280
  const cycleNodes = [];
261
- for (const node of parentMap.keys()) {
262
- if (visited.has(node))
263
- continue;
264
- const path = [];
265
- let current = node;
266
- while (current && !visited.has(current)) {
267
- if (inStack.has(current)) {
268
- // Found a cycle — collect the cycle nodes
269
- const cycleStart = path.indexOf(current);
270
- if (cycleStart !== -1) {
271
- cycleNodes.push(...path.slice(cycleStart));
272
- }
273
- break;
274
- }
275
- inStack.add(current);
276
- path.push(current);
277
- current = parentMap.get(current);
278
- }
279
- for (const n of path) {
280
- visited.add(n);
281
- inStack.delete(n);
281
+ const visit = (node) => {
282
+ state.set(node, "open");
283
+ stack.push(node);
284
+ for (const parent of parents.get(node) ?? []) {
285
+ const seen = state.get(parent);
286
+ if (seen === "open")
287
+ cycleNodes.push(...stack.slice(stack.indexOf(parent)));
288
+ else if (seen === undefined)
289
+ visit(parent);
282
290
  }
291
+ stack.pop();
292
+ state.set(node, "done");
293
+ };
294
+ for (const node of parents.keys()) {
295
+ if (!state.has(node))
296
+ visit(node);
283
297
  }
284
298
  return [...new Set(cycleNodes)];
285
299
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-policy-loader.js","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tenant-policy-loader.js","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"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"}
@@ -43,14 +43,14 @@ export declare const polymorphicTableSchema: z.ZodObject<{
43
43
  mapping: z.ZodRecord<z.ZodString, z.ZodString>;
44
44
  }, z.core.$strict>;
45
45
  export declare const enforcementModeSchema: z.ZodEnum<{
46
- strict: "strict";
47
46
  warn: "warn";
47
+ strict: "strict";
48
48
  }>;
49
49
  export declare const tenantPolicyFrontmatterSchema: z.ZodObject<{
50
50
  schemaId: z.ZodString;
51
51
  enforcement: z.ZodEnum<{
52
- strict: "strict";
53
52
  warn: "warn";
53
+ strict: "strict";
54
54
  }>;
55
55
  roots: z.ZodArray<z.ZodObject<{
56
56
  id: z.ZodString;
@@ -254,6 +254,11 @@ export type TenantPolicyWarning = {
254
254
  id: string;
255
255
  context: string;
256
256
  };
257
+ /**
258
+ * One line describing a tenant policy problem, naming the IDs involved. The strict
259
+ * load error, the `askdb.tenant.policy_warnings` log message and the CLI all use it.
260
+ */
261
+ export declare function formatTenantPolicyWarning(warning: TenantPolicyWarning): string;
257
262
  export type NormalizedTenantPolicy = {
258
263
  schemaId: string;
259
264
  enforcement: EnforcementMode;