@nacre.work/core 0.1.0 → 0.3.0

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 (78) hide show
  1. package/dist/audit.d.ts +41 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +18 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/authz/cache.d.ts +20 -0
  6. package/dist/authz/cache.d.ts.map +1 -1
  7. package/dist/authz/cache.js +29 -0
  8. package/dist/authz/cache.js.map +1 -1
  9. package/dist/authz/index.d.ts +1 -2
  10. package/dist/authz/index.d.ts.map +1 -1
  11. package/dist/authz/index.js +1 -2
  12. package/dist/authz/index.js.map +1 -1
  13. package/dist/config.d.ts +132 -5
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +439 -22
  16. package/dist/config.js.map +1 -1
  17. package/dist/db/migrate.d.ts +45 -0
  18. package/dist/db/migrate.d.ts.map +1 -1
  19. package/dist/db/migrate.js +61 -0
  20. package/dist/db/migrate.js.map +1 -1
  21. package/dist/extensions.d.ts +298 -0
  22. package/dist/extensions.d.ts.map +1 -0
  23. package/dist/extensions.js +246 -0
  24. package/dist/extensions.js.map +1 -0
  25. package/dist/index.d.ts +16 -6
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +9 -4
  28. package/dist/index.js.map +1 -1
  29. package/dist/lifecycle.d.ts.map +1 -1
  30. package/dist/lifecycle.js +13 -26
  31. package/dist/lifecycle.js.map +1 -1
  32. package/dist/logging.d.ts +46 -0
  33. package/dist/logging.d.ts.map +1 -0
  34. package/dist/logging.js +110 -0
  35. package/dist/logging.js.map +1 -0
  36. package/dist/metrics.d.ts +11 -7
  37. package/dist/metrics.d.ts.map +1 -1
  38. package/dist/metrics.js +32 -7
  39. package/dist/metrics.js.map +1 -1
  40. package/dist/migrations/0014_retired_collections.sql +68 -0
  41. package/dist/migrations/0015_reference_queries.sql +97 -0
  42. package/dist/migrations/0016_drop_acl_tag_cache.sql +62 -0
  43. package/dist/migrations/0017_drop_workspace_admin_role.sql +30 -0
  44. package/dist/migrations/0018_group_members_nulls_not_distinct.sql +46 -0
  45. package/dist/migrations/0019_embedding_provider_write_guard.sql +58 -0
  46. package/dist/multipart.d.ts +55 -0
  47. package/dist/multipart.d.ts.map +1 -0
  48. package/dist/multipart.js +158 -0
  49. package/dist/multipart.js.map +1 -0
  50. package/dist/oauth.d.ts +10 -0
  51. package/dist/oauth.d.ts.map +1 -1
  52. package/dist/oauth.js +10 -0
  53. package/dist/oauth.js.map +1 -1
  54. package/dist/observability.d.ts.map +1 -1
  55. package/dist/observability.js +43 -46
  56. package/dist/observability.js.map +1 -1
  57. package/dist/reindex.d.ts +44 -0
  58. package/dist/reindex.d.ts.map +1 -1
  59. package/dist/reindex.js +49 -0
  60. package/dist/reindex.js.map +1 -1
  61. package/dist/s3.d.ts +111 -0
  62. package/dist/s3.d.ts.map +1 -0
  63. package/dist/s3.js +242 -0
  64. package/dist/s3.js.map +1 -0
  65. package/dist/tsconfig.tsbuildinfo +1 -1
  66. package/dist/vector/query.d.ts +7 -9
  67. package/dist/vector/query.d.ts.map +1 -1
  68. package/dist/vector/query.js +7 -6
  69. package/dist/vector/query.js.map +1 -1
  70. package/dist/vector/search.d.ts +86 -1
  71. package/dist/vector/search.d.ts.map +1 -1
  72. package/dist/vector/search.js +185 -1
  73. package/dist/vector/search.js.map +1 -1
  74. package/package.json +1 -1
  75. package/dist/authz/tags.d.ts +0 -40
  76. package/dist/authz/tags.d.ts.map +0 -1
  77. package/dist/authz/tags.js +0 -48
  78. package/dist/authz/tags.js.map +0 -1
package/dist/config.js CHANGED
@@ -14,22 +14,218 @@
14
14
  * obviously right value — and never fine for anything naming a host or
15
15
  * carrying a credential.
16
16
  */
17
+ import { createHash, createPrivateKey, createPublicKey } from 'node:crypto';
18
+ import { readFileSync } from 'node:fs';
19
+ import { fileURLToPath } from 'node:url';
20
+ /** A stable identifier for a key, from its public bytes. Never from the secret. */
21
+ function fingerprint(der) {
22
+ return createHash('sha256').update(der).digest('base64url').slice(0, 16);
23
+ }
24
+ /**
25
+ * One public key as a JWK.
26
+ *
27
+ * `kid` is derived from the public bytes rather than configured, so it is
28
+ * stable across restarts and identical in every process without anyone having
29
+ * to keep two settings in step.
30
+ */
31
+ function publicJwk(key) {
32
+ const der = key.export({ type: 'spki', format: 'der' });
33
+ return {
34
+ ...key.export({ format: 'jwk' }),
35
+ kid: fingerprint(der),
36
+ use: 'sig',
37
+ alg: 'EdDSA',
38
+ };
39
+ }
40
+ /**
41
+ * A short, non-reversible name for whichever key is in use, for a startup line.
42
+ *
43
+ * An operator needs to know *which* key a process loaded when two environments
44
+ * disagree — and nobody needs the key itself in a log. `api` and `mcp` each had
45
+ * their own copy of this, taking a `Uint8Array`; two copies of a function that
46
+ * hashes a secret is two chances for one of them to log the wrong thing.
47
+ *
48
+ * For an asymmetric key it is a digest of the **public** half, which means the
49
+ * value printed by a process holding the private key matches the one printed by
50
+ * a process holding only the public key. That is precisely the comparison this
51
+ * exists to let someone make.
52
+ */
53
+ export function keyFingerprint(key) {
54
+ if (key instanceof Uint8Array) {
55
+ return `sha256:${createHash('sha256').update(key).digest('hex').slice(0, 12)}`;
56
+ }
57
+ const der = (key.type === 'private' ? createPublicKey(key) : key).export({
58
+ type: 'spki',
59
+ format: 'der',
60
+ });
61
+ return `ed25519:${fingerprint(der)}`;
62
+ }
63
+ /**
64
+ * One Ed25519 key from a `file://` reference, plus its public half.
65
+ *
66
+ * `file://` only, and that is the whole of the scheme support. The variable is
67
+ * named `_REF` because `docs/config.md` requires secrets to be references into
68
+ * a secret store rather than values, and every platform that has one — Docker
69
+ * secrets, Kubernetes, systemd credentials — presents it as a file. A `vault://`
70
+ * or `aws-kms://` scheme would be a network client on the startup path, which
71
+ * is a different feature with different failure modes.
72
+ */
73
+ /**
74
+ * Read the PEM a `file://` reference names. Shared by the private- and
75
+ * public-key loaders so the `file://`-only rule and its error wording live in
76
+ * one place; `kind` only changes the noun in the messages.
77
+ */
78
+ function readPemRef(ref, variable, kind) {
79
+ let path;
80
+ try {
81
+ const url = new URL(ref);
82
+ if (url.protocol !== 'file:') {
83
+ throw new Error(`scheme ${url.protocol} is not supported`);
84
+ }
85
+ path = fileURLToPath(url);
86
+ }
87
+ catch (cause) {
88
+ throw new ConfigError([
89
+ `${variable} is not a file:// URL: ${String(cause)}. ` +
90
+ `It names a file holding a PEM ${kind} key, for example ` +
91
+ 'file:///run/secrets/jwt_ed25519.',
92
+ ]);
93
+ }
94
+ try {
95
+ return readFileSync(path, 'utf8');
96
+ }
97
+ catch (cause) {
98
+ throw new ConfigError([
99
+ `${variable} names ${path}, which cannot be read: ${String(cause)}.`,
100
+ ]);
101
+ }
102
+ }
103
+ /**
104
+ * The public half of an Ed25519 key, from a `file://` reference to a PEM public
105
+ * key. This is what a process that only *verifies* tokens needs — and all it
106
+ * needs, which is the point: reading its environment gets an attacker to "can
107
+ * check tokens" and no further. See `loadJwtVerification`.
108
+ */
109
+ function loadEd25519Public(ref, variable) {
110
+ const pem = readPemRef(ref, variable, 'public');
111
+ // `createPublicKey` will happily extract the public half from a *private* PEM,
112
+ // which would let an operator paste the private key into the public-key
113
+ // variable and never notice — leaving the file this variable exists to keep
114
+ // off this process sitting right on it. Refuse it by name: the whole point of
115
+ // a verify-only process is that the private key is nowhere near it.
116
+ if (/PRIVATE KEY/.test(pem)) {
117
+ throw new ConfigError([
118
+ `${variable} names a file that contains a PRIVATE key. This variable is for ` +
119
+ 'the public half only — a process that verifies must not be given the ' +
120
+ 'signing key. Export the public half with ' +
121
+ '`openssl pkey -in jwt_ed25519.pem -pubout -out jwt_ed25519.pub`.',
122
+ ]);
123
+ }
124
+ let key;
125
+ try {
126
+ key = createPublicKey(pem);
127
+ }
128
+ catch (cause) {
129
+ throw new ConfigError([
130
+ `${variable} names a file that is not a PEM public key: ${String(cause)}. ` +
131
+ 'Export one from the signing key with ' +
132
+ '`openssl pkey -in jwt_ed25519.pem -pubout -out jwt_ed25519.pub`.',
133
+ ]);
134
+ }
135
+ if (key.asymmetricKeyType !== 'ed25519') {
136
+ throw new ConfigError([
137
+ `${variable} names a ${String(key.asymmetricKeyType)} public key. Only Ed25519 ` +
138
+ 'is accepted — it must match the signing key, which is Ed25519.',
139
+ ]);
140
+ }
141
+ return key;
142
+ }
143
+ function loadEd25519(ref, variable) {
144
+ const pem = readPemRef(ref, variable, 'private');
145
+ let key;
146
+ try {
147
+ key = createPrivateKey(pem);
148
+ }
149
+ catch (cause) {
150
+ throw new ConfigError([
151
+ `${variable} names a file that is not a PEM private key: ${String(cause)}.`,
152
+ ]);
153
+ }
154
+ if (key.asymmetricKeyType !== 'ed25519') {
155
+ // One algorithm, refused rather than adapted. RSA needs a size check and a
156
+ // padding choice, and EC needs a curve-to-algorithm mapping — each a place
157
+ // to be wrong about something a token's signature depends on. Ed25519 has
158
+ // no parameters, and it is what `docs/config.md` has named in its example
159
+ // since the variable was written.
160
+ throw new ConfigError([
161
+ `${variable} names a ${String(key.asymmetricKeyType)} key. Only Ed25519 is ` +
162
+ 'accepted: it has no parameters to get wrong, and it is what the example ' +
163
+ 'in docs/config.md names. Generate one with ' +
164
+ '`openssl genpkey -algorithm ed25519 -out jwt_ed25519.pem`.',
165
+ ]);
166
+ }
167
+ return { private: key, public: createPublicKey(key) };
168
+ }
17
169
  export function loadJwtKeys(env = process.env) {
18
- // Development uses a symmetric secret. Production is meant to load an Ed25519
19
- // key through NACRE_JWT_PRIVATE_KEY_REF; until that lands, refusing is the
20
- // honest behaviour — a hardcoded fallback here would be a signing key anyone
21
- // reading the source can forge tokens with.
22
170
  const secret = env.NACRE_JWT_SECRET;
171
+ const ref = env.NACRE_JWT_PRIVATE_KEY_REF;
172
+ if (secret !== undefined && secret !== '' && ref !== undefined && ref !== '') {
173
+ // Refused rather than resolved by precedence. Whichever one this picked, the
174
+ // other would be configured, apparently in use, and silently ignored — and
175
+ // the operator would find out when the tokens they expected to be Ed25519
176
+ // turned out to be HMAC, or the other way round.
177
+ throw new ConfigError([
178
+ 'NACRE_JWT_SECRET and NACRE_JWT_PRIVATE_KEY_REF are both set. They are two ' +
179
+ 'answers to "what signs a token" and there is no order of precedence ' +
180
+ 'worth inventing. Set one.',
181
+ ]);
182
+ }
183
+ if (ref !== undefined && ref !== '') {
184
+ const current = loadEd25519(ref, 'NACRE_JWT_PRIVATE_KEY_REF');
185
+ const der = current.public.export({ type: 'spki', format: 'der' });
186
+ const previousRef = env.NACRE_JWT_PREVIOUS_KEY_REF;
187
+ const previous = previousRef === undefined || previousRef === ''
188
+ ? undefined
189
+ : loadEd25519(previousRef, 'NACRE_JWT_PREVIOUS_KEY_REF');
190
+ if (previous !== undefined &&
191
+ previous.public.export({ type: 'spki', format: 'der' }).equals(der)) {
192
+ // The same refusal the symmetric path makes, for the same reason: this is
193
+ // what an operator does when they mean to rotate and copy the wrong path,
194
+ // and it leaves an installation that believes it has rotated and has not.
195
+ throw new ConfigError([
196
+ 'NACRE_JWT_PREVIOUS_KEY_REF names the same key as NACRE_JWT_PRIVATE_KEY_REF. ' +
197
+ 'That is not a rotation: it accepts one key twice. Point ' +
198
+ 'NACRE_JWT_PRIVATE_KEY_REF at the new key and NACRE_JWT_PREVIOUS_KEY_REF ' +
199
+ 'at the one it replaces.',
200
+ ]);
201
+ }
202
+ return {
203
+ signing: current.private,
204
+ verification: current.public,
205
+ alsoAccept: previous === undefined ? [] : [previous.public],
206
+ algorithm: 'EdDSA',
207
+ keyId: fingerprint(der),
208
+ jwks: [
209
+ publicJwk(current.public),
210
+ ...(previous === undefined ? [] : [publicJwk(previous.public)]),
211
+ ],
212
+ };
213
+ }
214
+ // A symmetric secret is still supported and is still the default. It is what
215
+ // a laptop and a Compose file want, and refusing it would make the asymmetric
216
+ // path mandatory for a product whose first run is `docker compose up`.
23
217
  if (secret === undefined || secret.length < 32) {
24
218
  throw new ConfigError([
25
219
  'NACRE_JWT_SECRET is not set, or is shorter than 32 bytes. ' +
26
- 'Asymmetric keys through NACRE_JWT_PRIVATE_KEY_REF are not implemented yet; ' +
27
- 'until they are, this is required and there is no default.',
220
+ 'Set it, or point NACRE_JWT_PRIVATE_KEY_REF at an Ed25519 private key. ' +
221
+ 'There is no default: a signing key in the source is one anybody reading ' +
222
+ 'the source can forge tokens with.',
28
223
  ]);
29
224
  }
30
225
  const previous = env.NACRE_JWT_SECRET_PREVIOUS;
31
226
  if (previous === undefined || previous === '') {
32
- return { key: new TextEncoder().encode(secret), alsoAccept: [] };
227
+ const key = new TextEncoder().encode(secret);
228
+ return { signing: key, verification: key, alsoAccept: [], algorithm: 'HS256' };
33
229
  }
34
230
  if (previous.length < 32) {
35
231
  throw new ConfigError([
@@ -48,9 +244,127 @@ export function loadJwtKeys(env = process.env) {
48
244
  'new key and NACRE_JWT_SECRET_PREVIOUS to the one it replaces.',
49
245
  ]);
50
246
  }
247
+ const key = new TextEncoder().encode(secret);
51
248
  return {
52
- key: new TextEncoder().encode(secret),
249
+ signing: key,
250
+ verification: key,
53
251
  alsoAccept: [new TextEncoder().encode(previous)],
252
+ algorithm: 'HS256',
253
+ };
254
+ }
255
+ /**
256
+ * Verification-only key material, for a process that checks tokens and never
257
+ * signs one — the MCP transport, which is a resource server.
258
+ *
259
+ * Three ways to name the key, exactly one of them at a time:
260
+ *
261
+ * - `NACRE_JWT_PUBLIC_KEY_REF` — the Ed25519 **public** key, and nothing else.
262
+ * This is the one that makes the asymmetric mode worth what it claims: the
263
+ * verifier holds no secret and no private key, so an attacker who reads its
264
+ * environment can check tokens and cannot mint them. `NACRE_JWT_PREVIOUS_PUBLIC_KEY_REF`
265
+ * is its rotation overlap, mirroring the private side.
266
+ * - `NACRE_JWT_PRIVATE_KEY_REF` — the private key, from which the public half is
267
+ * derived. Accepted so a process co-located with the signer, or one that
268
+ * simply has the private key, still verifies; it just does not get the
269
+ * separation the public-only path does.
270
+ * - `NACRE_JWT_SECRET` — the shared secret. Verifying and signing are the same
271
+ * key here by definition, so there is no separation to be had and the process
272
+ * holds the secret regardless; this exists so a Compose deployment that runs
273
+ * on a shared secret still starts.
274
+ *
275
+ * Setting more than one is refused, for the same reason `loadJwtKeys` refuses
276
+ * two answers to "what signs a token": whichever won, the others would be
277
+ * configured, apparently in use, and ignored.
278
+ */
279
+ export function loadJwtVerification(env = process.env) {
280
+ const secret = env.NACRE_JWT_SECRET;
281
+ const publicRef = env.NACRE_JWT_PUBLIC_KEY_REF;
282
+ const privateRef = env.NACRE_JWT_PRIVATE_KEY_REF;
283
+ const named = [
284
+ secret !== undefined && secret !== '' ? 'NACRE_JWT_SECRET' : undefined,
285
+ publicRef !== undefined && publicRef !== '' ? 'NACRE_JWT_PUBLIC_KEY_REF' : undefined,
286
+ privateRef !== undefined && privateRef !== '' ? 'NACRE_JWT_PRIVATE_KEY_REF' : undefined,
287
+ ].filter((v) => v !== undefined);
288
+ if (named.length > 1) {
289
+ throw new ConfigError([
290
+ `${named.join(' and ')} are set together. They are ${named.length} answers to ` +
291
+ '"what verifies a token" and there is no order of precedence worth ' +
292
+ 'inventing. A resource server needs exactly one: the public key ' +
293
+ '(NACRE_JWT_PUBLIC_KEY_REF) if the deployment signs with Ed25519, or ' +
294
+ 'NACRE_JWT_SECRET if it signs with a shared secret.',
295
+ ]);
296
+ }
297
+ const sameSpki = (a, b) => a
298
+ .export({ type: 'spki', format: 'der' })
299
+ .equals(b.export({ type: 'spki', format: 'der' }));
300
+ if (publicRef !== undefined && publicRef !== '') {
301
+ const current = loadEd25519Public(publicRef, 'NACRE_JWT_PUBLIC_KEY_REF');
302
+ const prevRef = env.NACRE_JWT_PREVIOUS_PUBLIC_KEY_REF;
303
+ const previous = prevRef === undefined || prevRef === ''
304
+ ? undefined
305
+ : loadEd25519Public(prevRef, 'NACRE_JWT_PREVIOUS_PUBLIC_KEY_REF');
306
+ if (previous !== undefined && sameSpki(current, previous)) {
307
+ throw new ConfigError([
308
+ 'NACRE_JWT_PREVIOUS_PUBLIC_KEY_REF names the same key as ' +
309
+ 'NACRE_JWT_PUBLIC_KEY_REF. That is not a rotation: it accepts one key ' +
310
+ 'twice. Point NACRE_JWT_PUBLIC_KEY_REF at the new public key and ' +
311
+ 'NACRE_JWT_PREVIOUS_PUBLIC_KEY_REF at the one it replaces.',
312
+ ]);
313
+ }
314
+ return {
315
+ verification: current,
316
+ alsoAccept: previous === undefined ? [] : [previous],
317
+ algorithm: 'EdDSA',
318
+ };
319
+ }
320
+ if (privateRef !== undefined && privateRef !== '') {
321
+ const current = loadEd25519(privateRef, 'NACRE_JWT_PRIVATE_KEY_REF');
322
+ const prevRef = env.NACRE_JWT_PREVIOUS_KEY_REF;
323
+ const previous = prevRef === undefined || prevRef === ''
324
+ ? undefined
325
+ : loadEd25519(prevRef, 'NACRE_JWT_PREVIOUS_KEY_REF');
326
+ if (previous !== undefined && sameSpki(current.public, previous.public)) {
327
+ throw new ConfigError([
328
+ 'NACRE_JWT_PREVIOUS_KEY_REF names the same key as NACRE_JWT_PRIVATE_KEY_REF. ' +
329
+ 'That is not a rotation: it accepts one key twice.',
330
+ ]);
331
+ }
332
+ return {
333
+ verification: current.public,
334
+ alsoAccept: previous === undefined ? [] : [previous.public],
335
+ algorithm: 'EdDSA',
336
+ };
337
+ }
338
+ if (secret === undefined || secret.length < 32) {
339
+ throw new ConfigError([
340
+ 'no verification key is set, or NACRE_JWT_SECRET is shorter than 32 bytes. ' +
341
+ 'A resource server needs one of NACRE_JWT_PUBLIC_KEY_REF (Ed25519 public ' +
342
+ 'key), NACRE_JWT_PRIVATE_KEY_REF, or NACRE_JWT_SECRET — matching how the ' +
343
+ 'issuer signs.',
344
+ ]);
345
+ }
346
+ const previousSecret = env.NACRE_JWT_SECRET_PREVIOUS;
347
+ if (previousSecret !== undefined && previousSecret !== '') {
348
+ if (previousSecret.length < 32) {
349
+ throw new ConfigError([
350
+ 'NACRE_JWT_SECRET_PREVIOUS is set but shorter than 32 bytes. It holds the ' +
351
+ 'key being rotated out and is held to the same floor as the one replacing it.',
352
+ ]);
353
+ }
354
+ if (previousSecret === secret) {
355
+ throw new ConfigError([
356
+ 'NACRE_JWT_SECRET_PREVIOUS is the same value as NACRE_JWT_SECRET. That is ' +
357
+ 'not a rotation: it accepts one key twice.',
358
+ ]);
359
+ }
360
+ }
361
+ const key = new TextEncoder().encode(secret);
362
+ return {
363
+ verification: key,
364
+ alsoAccept: previousSecret === undefined || previousSecret === ''
365
+ ? []
366
+ : [new TextEncoder().encode(previousSecret)],
367
+ algorithm: 'HS256',
54
368
  };
55
369
  }
56
370
  export class ConfigError extends Error {
@@ -141,6 +455,73 @@ class Reader {
141
455
  return raw;
142
456
  }
143
457
  }
458
+ /** The protocol, or an empty string when the value does not parse at all. */
459
+ function safeProtocol(url) {
460
+ try {
461
+ return new URL(url).protocol;
462
+ }
463
+ catch {
464
+ return '';
465
+ }
466
+ }
467
+ /**
468
+ * The object-storage block, present only when a deployment configured one.
469
+ *
470
+ * Written as a group because it *is* one. Six independent optionals would
471
+ * accept an endpoint with no credential, or a credential with no bucket, and
472
+ * every one of those parses — the failure arrives later, as an ingest that
473
+ * cannot store bytes, on a deployment whose configuration looked accepted.
474
+ *
475
+ * `NACRE_S3_*` spent its whole life in `docs/config.md` and in the `full`
476
+ * Compose profile without `loadConfig` mentioning it once, so a wrong endpoint
477
+ * or a missing key was silent while MinIO sat there talking to nobody. That is
478
+ * the specific failure this shape exists to make impossible.
479
+ */
480
+ function s3From(r, env) {
481
+ const keys = [
482
+ 'NACRE_S3_ENDPOINT',
483
+ 'NACRE_S3_BUCKET',
484
+ 'NACRE_S3_ACCESS_KEY',
485
+ 'NACRE_S3_SECRET_KEY',
486
+ ];
487
+ const present = keys.filter((k) => (env[k] ?? '').trim() !== '');
488
+ if (present.length === 0)
489
+ return undefined;
490
+ if (present.length < keys.length) {
491
+ const missing = keys.filter((k) => !present.includes(k));
492
+ r.problems.push(`object storage is half configured: ${present.join(', ')} set, ` +
493
+ `${missing.join(', ')} missing. Set all four to store document bytes in ` +
494
+ 'object storage, or none to keep them in Postgres. There is no partial ' +
495
+ 'mode — the endpoint without the credential is a deployment that accepts ' +
496
+ 'documents and cannot store them.');
497
+ return undefined;
498
+ }
499
+ // `r.url` only asks whether `new URL` parses, and `minio:9000` does — it
500
+ // reads as the scheme `minio:` with the path `9000`, with an empty host. That
501
+ // would start, and then every request would be built against a URL with
502
+ // nowhere to send it. A missing `http://` is the likeliest thing to be wrong
503
+ // in this variable, so it is the one thing worth checking twice.
504
+ const endpoint = r.url('NACRE_S3_ENDPOINT');
505
+ if (endpoint !== '' && !/^https?:$/.test(safeProtocol(endpoint))) {
506
+ r.problems.push(`NACRE_S3_ENDPOINT must be an http or https URL, and is ${JSON.stringify(endpoint)}. ` +
507
+ 'A bare host and port parses as a URL — the host ends up empty and every ' +
508
+ 'request goes nowhere.');
509
+ }
510
+ return {
511
+ endpoint,
512
+ bucket: r.required('NACRE_S3_BUCKET'),
513
+ // A default is fine here and nowhere else in this block: the region names
514
+ // no host and carries no credential, MinIO ignores it entirely, and it is
515
+ // signed into every request so it has to be *something*.
516
+ region: r.optional('NACRE_S3_REGION') ?? 'us-east-1',
517
+ accessKey: r.required('NACRE_S3_ACCESS_KEY'),
518
+ secretKey: r.required('NACRE_S3_SECRET_KEY'),
519
+ // True by default because the default deployment is self-hosted: MinIO, or
520
+ // an endpoint reached by a name that is not a wildcard DNS entry. AWS
521
+ // proper is the case that has to say so.
522
+ forcePathStyle: r.boolean('NACRE_S3_FORCE_PATH_STYLE', true),
523
+ };
524
+ }
144
525
  export function loadConfig(env = process.env) {
145
526
  const r = new Reader(env);
146
527
  const config = {
@@ -171,6 +552,14 @@ export function loadConfig(env = process.env) {
171
552
  // this is the one tunable here that trades latency for quality directly,
172
553
  // and there is a value at which a search stops answering in time.
173
554
  rerankCandidates: r.number('NACRE_RERANK_CANDIDATES', 50, { min: 1, max: 500 }),
555
+ // Comma-separated, trimmed, empties dropped. A module that cannot be
556
+ // imported fails startup rather than warning: naming one is a statement
557
+ // that the deployment is paying for what it does, and coming up without it
558
+ // would silently be a different product.
559
+ modules: (env.NACRE_MODULES ?? '')
560
+ .split(',')
561
+ .map((m) => m.trim())
562
+ .filter((m) => m !== ''),
174
563
  jwtIssuer: r.required('NACRE_JWT_ISSUER'),
175
564
  jwtAudience: r.required('NACRE_JWT_AUDIENCE'),
176
565
  accessTokenTtl: r.number('NACRE_ACCESS_TOKEN_TTL', 900, { min: 60, max: 86_400 }),
@@ -179,7 +568,6 @@ export function loadConfig(env = process.env) {
179
568
  // choice nobody makes deliberately.
180
569
  refreshTokenTtl: r.number('NACRE_REFRESH_TOKEN_TTL', 2_592_000, { min: 300, max: 31_536_000 }),
181
570
  aclCacheTtl: r.number('NACRE_ACL_CACHE_TTL', 60, { min: 0, max: 3600 }),
182
- aclPropagationSla: r.number('NACRE_ACL_PROPAGATION_SLA', 60, { min: 1, max: 3600 }),
183
571
  gcGrace: r.number('NACRE_GC_GRACE', 3600, { min: 0, max: 2_592_000 }),
184
572
  // 15 minutes: long enough for a large PDF through parse, chunk, embed, and
185
573
  // upsert, short enough that a drained node's documents are not stuck for an
@@ -187,7 +575,6 @@ export function loadConfig(env = process.env) {
187
575
  // document the instant it is claimed, which is a loop, not a setting.
188
576
  indexLease: r.number('NACRE_INDEX_LEASE', 900, { min: 60, max: 86_400 }),
189
577
  indexMaxAttempts: r.number('NACRE_INDEX_MAX_ATTEMPTS', 5, { min: 1, max: 100 }),
190
- aclTagHashBytes: r.number('NACRE_ACL_TAG_HASH_BYTES', 8, { min: 4, max: 32 }),
191
578
  rateSearchPerMin: r.number('NACRE_RATE_SEARCH_PER_MIN', 60, { min: 1 }),
192
579
  rateIngestPerHour: r.number('NACRE_RATE_INGEST_PER_HOUR', 600, { min: 1 }),
193
580
  // Ten attempts per quarter hour, counted per email address. Low enough that
@@ -234,6 +621,48 @@ export function loadConfig(env = process.env) {
234
621
  // should stop the deployment, not fill a log.
235
622
  auditRetentionDays: r.number('NACRE_AUDIT_RETENTION_DAYS', 400, { min: 30 }),
236
623
  auditQueryText: r.boolean('NACRE_AUDIT_QUERY_TEXT', false),
624
+ // How long a superseded collection survives a model migration.
625
+ //
626
+ // It is a rollback window and nothing else. The cheap rollback in
627
+ // `rollback-layer-reindex.md` is "move the pointer back", which works for
628
+ // exactly as long as the collection it points back to still exists; past
629
+ // this horizon that option is gone and a rollback means reindexing.
630
+ //
631
+ // The floor is 1 rather than 0 because a collection deleted the instant the
632
+ // pointer moved would make a migration irreversible at the moment it is
633
+ // most likely to be found wrong. Setting it high costs disk: each retained
634
+ // collection is a full copy of the organization's vectors.
635
+ collectionRetentionDays: r.number('NACRE_COLLECTION_RETENTION_DAYS', 7, { min: 1 }),
636
+ // The floor a reindex's recall check must reach before the layer switches.
637
+ //
638
+ // A whole-number percentage rather than a fraction, because this reader
639
+ // takes integers and `0.8` typed into an environment file is a value two
640
+ // different parsers would disagree about. Divided here so everything
641
+ // downstream works in the [0, 1] the arithmetic produces.
642
+ //
643
+ // The default is 80 and it gates nothing on its own: a layer with no
644
+ // reference query set has no check at all, so this applies to deployments
645
+ // that went and wrote one — which is a deployment asking for a gate.
646
+ //
647
+ // 0 is allowed and means measure without blocking. That is arithmetic
648
+ // rather than a special case for "disabled": every recall is at least 0, so
649
+ // the comparison passes and the number is still recorded. `min: 1` would be
650
+ // wrong here for exactly the reason it is right on the retention window
651
+ // above — there the low value destroys something, here it destroys nothing.
652
+ reindexMinRecall: r.number('NACRE_REINDEX_MIN_RECALL', 80, { min: 0, max: 100 }) / 100,
653
+ // How long a `source_url` outlives the permission check that minted it.
654
+ //
655
+ // A presigned URL is a bearer capability: whoever holds it fetches that
656
+ // object without a Nacre credential, and a revocation inside the window
657
+ // does not reach it. So the ceiling is a week — SigV4's own maximum, and
658
+ // already far longer than any reason to hand one out — and the floor is a
659
+ // minute, because a link that expires while the client is still following
660
+ // the redirect is a link that never worked.
661
+ presignTtl: r.number('NACRE_PRESIGN_TTL', 900, { min: 60, max: 604_800 }),
662
+ // All of it or none of it — see the cross-field check below. Read here so
663
+ // that a malformed endpoint is a startup problem like any other; whether
664
+ // the *set* is coherent is a question no per-variable check can answer.
665
+ s3: s3From(r, env),
237
666
  };
238
667
  // Cross-field checks. Each one is a combination that parses fine and is
239
668
  // wrong, which is exactly the class a per-variable check cannot catch.
@@ -259,23 +688,11 @@ export function loadConfig(env = process.env) {
259
688
  'so accepting this would give you a single-collection deployment that ' +
260
689
  'believes it is isolated. Use `collection`, which is the default.');
261
690
  }
262
- if (config.aclTagHashBytes !== 8) {
263
- r.problems.push('NACRE_ACL_TAG_HASH_BYTES is not implemented: the tag width is fixed at 8 ' +
264
- 'bytes in the code that writes and matches tags. Setting it changes the ' +
265
- 'collision probability you think you have and nothing else. Leave it at 8.');
266
- }
267
691
  if (config.refreshTokenTtl <= config.accessTokenTtl) {
268
692
  r.problems.push('NACRE_REFRESH_TOKEN_TTL is not longer than NACRE_ACCESS_TOKEN_TTL. A refresh ' +
269
693
  'token that expires no later than the access token it renews cannot renew ' +
270
694
  'anything, so every session would end at the first refresh.');
271
695
  }
272
- if (config.aclCacheTtl > config.aclPropagationSla) {
273
- // The cache would still be serving a revoked grant after the SLA has
274
- // passed, and nacre_acl_propagation_lag_seconds would report compliance.
275
- r.problems.push(`NACRE_ACL_CACHE_TTL (${config.aclCacheTtl}) is longer than ` +
276
- `NACRE_ACL_PROPAGATION_SLA (${config.aclPropagationSla}); a revoked grant ` +
277
- 'would still be served after the SLA it promises.');
278
- }
279
696
  if (config.env === 'production' && config.canonicalUrl.startsWith('http://')) {
280
697
  // The canonical URL is the OAuth issuer and goes into every token ever
281
698
  // issued. Over plaintext it is also the thing an attacker rewrites.
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,51 @@ export interface MigrateResult {
11
11
  readonly applied: readonly string[];
12
12
  readonly skipped: readonly string[];
13
13
  }
14
+ /**
15
+ * Just enough of `Client` to ask what the connected role may do — so the check
16
+ * below can be exercised without a database for its branches, having been
17
+ * verified against a real one for its premise.
18
+ */
19
+ export interface RoleReader {
20
+ query<T>(sql: string): Promise<{
21
+ rows: T[];
22
+ }>;
23
+ }
24
+ /**
25
+ * Refuse, before applying anything, if the connected role cannot finish.
26
+ *
27
+ * Every tenant table has `FORCE ROW LEVEL SECURITY`, and `FORCE` is what makes
28
+ * the policy apply to the table's **owner** as well. Migrations run as the
29
+ * owner and several of them read a tenant table — 0006 checks for duplicate
30
+ * layer slugs, 0007 backfills a lease column, 0017 rewrites a role, 0018
31
+ * dedupes group members. Each of those evaluates
32
+ * `current_setting('app.current_org')`, which is unset during a migration, so
33
+ * the statement fails with:
34
+ *
35
+ * ERROR: unrecognized configuration parameter "app.current_org"
36
+ *
37
+ * That message names nothing an operator can act on. It says nothing about
38
+ * roles, nothing about row-level security, and it arrives at migration 0006
39
+ * rather than at the start — five migrations of schema already applied.
40
+ *
41
+ * It has never been seen because development connects as a superuser, and a
42
+ * superuser bypasses row-level security entirely. It appears the moment an
43
+ * operator follows `docs/config.md` and stops doing that, which is the same
44
+ * shape as the two subsystems already found this way.
45
+ *
46
+ * So the requirement is stated once, up front, with the SQL that satisfies it.
47
+ * The `WITH ADMIN OPTION` line is in the message even though it is not what is
48
+ * being checked: migration 0008 runs `GRANT nacre_worker TO nacre_app` and
49
+ * plain membership is not enough to grant a role onward. That migration's own
50
+ * hint says to grant membership, which does not fix it — and 0008 has been
51
+ * applied everywhere, so its text is checksummed and cannot be corrected in
52
+ * place. Naming the whole block here is what stops an operator satisfying one
53
+ * requirement and meeting the next one on the following run.
54
+ *
55
+ * Only called when there is something to apply, so re-running `migrate` on an
56
+ * up-to-date database stays a no-op whatever role it connects as.
57
+ */
58
+ export declare function requireMigrationPrivileges(client: RoleReader): Promise<void>;
14
59
  /**
15
60
  * Apply every migration that has not been applied yet.
16
61
  *
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../db/migrate.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAuB,GAAG,SAAS,SAAS,EAAE,CAyBjF;AAeD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,OAAO,CAC3B,gBAAgB,EAAE,MAAM,EACxB,UAAU,GAAE,SAAS,SAAS,EAAqB,GAClD,OAAO,CAAC,aAAa,CAAC,CA4FxB"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../db/migrate.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAuB,GAAG,SAAS,SAAS,EAAE,CAyBjF;AAeD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAA;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,OAAO,CAC3B,gBAAgB,EAAE,MAAM,EACxB,UAAU,GAAE,SAAS,SAAS,EAAqB,GAClD,OAAO,CAAC,aAAa,CAAC,CAkGxB"}