@nacre.work/api 0.0.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 (46) hide show
  1. package/README.md +3 -0
  2. package/dist/__tests__/admin-surface.test.d.ts +2 -0
  3. package/dist/__tests__/admin-surface.test.d.ts.map +1 -0
  4. package/dist/__tests__/admin-surface.test.js +431 -0
  5. package/dist/__tests__/admin-surface.test.js.map +1 -0
  6. package/dist/__tests__/init.test.d.ts +2 -0
  7. package/dist/__tests__/init.test.d.ts.map +1 -0
  8. package/dist/__tests__/init.test.js +125 -0
  9. package/dist/__tests__/init.test.js.map +1 -0
  10. package/dist/__tests__/service-keys.test.d.ts +2 -0
  11. package/dist/__tests__/service-keys.test.d.ts.map +1 -0
  12. package/dist/__tests__/service-keys.test.js +204 -0
  13. package/dist/__tests__/service-keys.test.js.map +1 -0
  14. package/dist/adapters.d.ts +197 -0
  15. package/dist/adapters.d.ts.map +1 -0
  16. package/dist/adapters.js +672 -0
  17. package/dist/adapters.js.map +1 -0
  18. package/dist/auth.d.ts +42 -0
  19. package/dist/auth.d.ts.map +1 -0
  20. package/dist/auth.js +106 -0
  21. package/dist/auth.js.map +1 -0
  22. package/dist/errors.d.ts +43 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +101 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +10 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/init.d.ts +49 -0
  31. package/dist/init.d.ts.map +1 -0
  32. package/dist/init.js +201 -0
  33. package/dist/init.js.map +1 -0
  34. package/dist/main.d.ts +2 -0
  35. package/dist/main.d.ts.map +1 -0
  36. package/dist/main.js +113 -0
  37. package/dist/main.js.map +1 -0
  38. package/dist/server.d.ts +239 -0
  39. package/dist/server.d.ts.map +1 -0
  40. package/dist/server.js +543 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/service-keys.d.ts +82 -0
  43. package/dist/service-keys.d.ts.map +1 -0
  44. package/dist/service-keys.js +158 -0
  45. package/dist/service-keys.js.map +1 -0
  46. package/package.json +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ import type { OrgRole, Principal } from '@nacre.work/core';
2
+ import { type KeyObject } from 'jose';
3
+ import { type Problem } from './errors.js';
4
+ export interface AuthContext {
5
+ /** From the token. Never from anywhere else. */
6
+ readonly orgId: string;
7
+ readonly principal: Principal;
8
+ readonly role: OrgRole;
9
+ }
10
+ export interface VerifyOptions {
11
+ readonly key: KeyObject | Uint8Array;
12
+ readonly issuer: string;
13
+ readonly audience: string;
14
+ /**
15
+ * Resolves a service account key, when one is presented.
16
+ *
17
+ * Injected rather than imported so this module keeps no database of its own:
18
+ * the JWT path is pure and stays that way, and a surface with no service
19
+ * accounts simply does not pass this.
20
+ */
21
+ readonly serviceKeys?: {
22
+ resolve(key: string): Promise<AuthContext | undefined>;
23
+ };
24
+ }
25
+ export declare function findTenantOverride(value: unknown, path?: string[]): string | undefined;
26
+ /**
27
+ * T2. A body, path, or header naming an organization is refused with 403.
28
+ *
29
+ * 403 rather than 404 is deliberate and is the one place the wording matters in
30
+ * the other direction: the caller is authenticated, the refusal is about the
31
+ * *operation*, and no object's existence is revealed by saying so.
32
+ */
33
+ export declare function rejectTenantOverride(body: unknown, query: URLSearchParams, headers: Record<string, string | string[] | undefined>, instance: string, requestId: string): Problem | undefined;
34
+ /**
35
+ * Verify a bearer token into an AuthContext.
36
+ *
37
+ * Every failure path returns 401 with the same shape. Distinguishing "expired"
38
+ * from "wrong audience" from "unknown issuer" in the response tells an attacker
39
+ * which of their guesses was closest.
40
+ */
41
+ export declare function authenticate(authorization: string | undefined, options: VerifyOptions, instance: string, requestId: string): Promise<AuthContext | Problem>;
42
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,MAAM,CAAA;AAEjE,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,aAAa,CAAA;AAEnE,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAA;KACvD,CAAA;CACF;AAcD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,MAAM,GAAG,SAAS,CAW1F;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EACtD,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,GAAG,SAAS,CAgBrB;AAWD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,CAoDhC"}
package/dist/auth.js ADDED
@@ -0,0 +1,106 @@
1
+ import { jwtVerify } from 'jose';
2
+ import { forbidden, unauthorized } from './errors.js';
3
+ /**
4
+ * Fields a request body, path, or query string may never carry.
5
+ *
6
+ * Rule 1 is a precondition, not a validation step: the organization comes from
7
+ * the token, so a request that names one is not a request with a bad field —
8
+ * it is an attempt to act as another tenant, and it is journaled as one.
9
+ *
10
+ * `organization` and `tenant` are here because the next person to add a field
11
+ * will not call it `org_id`.
12
+ */
13
+ const FORBIDDEN_KEYS = ['org_id', 'orgId', 'organization', 'organization_id', 'tenant', 'tenant_id'];
14
+ export function findTenantOverride(value, path = []) {
15
+ if (value === null || typeof value !== 'object')
16
+ return undefined;
17
+ for (const [key, nested] of Object.entries(value)) {
18
+ if (FORBIDDEN_KEYS.includes(key))
19
+ return [...path, key].join('.');
20
+ // Nested, because a body that cannot say org_id at the top level will say
21
+ // it one level down.
22
+ const deeper = findTenantOverride(nested, [...path, key]);
23
+ if (deeper !== undefined)
24
+ return deeper;
25
+ }
26
+ return undefined;
27
+ }
28
+ /**
29
+ * T2. A body, path, or header naming an organization is refused with 403.
30
+ *
31
+ * 403 rather than 404 is deliberate and is the one place the wording matters in
32
+ * the other direction: the caller is authenticated, the refusal is about the
33
+ * *operation*, and no object's existence is revealed by saying so.
34
+ */
35
+ export function rejectTenantOverride(body, query, headers, instance, requestId) {
36
+ const inBody = findTenantOverride(body);
37
+ if (inBody !== undefined) {
38
+ return forbidden(instance, requestId, `The organization comes from the token. Remove '${inBody}'.`);
39
+ }
40
+ for (const key of FORBIDDEN_KEYS) {
41
+ if (query.has(key)) {
42
+ return forbidden(instance, requestId, `The organization comes from the token. Remove '${key}'.`);
43
+ }
44
+ if (headers[`x-${key.replace(/_/g, '-')}`] !== undefined) {
45
+ return forbidden(instance, requestId, 'The organization comes from the token.');
46
+ }
47
+ }
48
+ return undefined;
49
+ }
50
+ const ROLES = ['platform_admin', 'org_admin', 'member'];
51
+ const PRINCIPAL_TYPES = ['user', 'group', 'service_account'];
52
+ /**
53
+ * Verify a bearer token into an AuthContext.
54
+ *
55
+ * Every failure path returns 401 with the same shape. Distinguishing "expired"
56
+ * from "wrong audience" from "unknown issuer" in the response tells an attacker
57
+ * which of their guesses was closest.
58
+ */
59
+ export async function authenticate(authorization, options, instance, requestId) {
60
+ const bearer = authorization?.startsWith('Bearer ') ? authorization.slice(7) : undefined;
61
+ if (bearer === undefined) {
62
+ return unauthorized(instance, requestId, 'A bearer token is required.');
63
+ }
64
+ // A service account key is opaque and has nothing to verify locally, so it
65
+ // takes a different route — but only the route differs. It fails into the
66
+ // same 401 with the same wording as every JWT failure below, because
67
+ // "revoked key" and "wrong audience" and "expired" must be one answer.
68
+ if (bearer.startsWith('nacre_sk_')) {
69
+ if (options.serviceKeys === undefined) {
70
+ return unauthorized(instance, requestId, 'The token is not valid.');
71
+ }
72
+ const resolved = await options.serviceKeys.resolve(bearer);
73
+ return resolved ?? unauthorized(instance, requestId, 'The token is not valid.');
74
+ }
75
+ let claims;
76
+ try {
77
+ const verified = await jwtVerify(bearer, options.key, {
78
+ issuer: options.issuer,
79
+ audience: options.audience,
80
+ });
81
+ claims = verified.payload;
82
+ }
83
+ catch {
84
+ return unauthorized(instance, requestId, 'The token is not valid.');
85
+ }
86
+ const org = claims.org;
87
+ const sub = claims.sub;
88
+ const type = claims.principal_type;
89
+ const role = claims.role ?? 'member';
90
+ if (typeof org !== 'string' ||
91
+ typeof sub !== 'string' ||
92
+ typeof type !== 'string' ||
93
+ !PRINCIPAL_TYPES.includes(type) ||
94
+ typeof role !== 'string' ||
95
+ !ROLES.includes(role)) {
96
+ // A token that verifies but does not say who it is cannot be evaluated, and
97
+ // rule I3 makes that a denial rather than a default.
98
+ return unauthorized(instance, requestId, 'The token is not valid.');
99
+ }
100
+ return {
101
+ orgId: org,
102
+ principal: { type: type, id: sub },
103
+ role: role,
104
+ };
105
+ }
106
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAmC,MAAM,MAAM,CAAA;AAEjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAyBnE;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;AAEpG,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,OAAiB,EAAE;IACpE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAEjE,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjE,0EAA0E;QAC1E,qBAAqB;QACrB,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QACzD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAA;IACzC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAa,EACb,KAAsB,EACtB,OAAsD,EACtD,QAAgB,EAChB,SAAiB;IAEjB,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,kDAAkD,MAAM,IAAI,CAAC,CAAA;IACrG,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,kDAAkD,GAAG,IAAI,CAAC,CAAA;QAClG,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,wCAAwC,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAQD,MAAM,KAAK,GAAuB,CAAC,gBAAgB,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;AAC3E,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAU,CAAA;AAErE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,aAAiC,EACjC,OAAsB,EACtB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,MAAM,GAAG,aAAa,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,6BAA6B,CAAC,CAAA;IACzE,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAA;QACrE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC1D,OAAO,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAA;IACjF,CAAC;IAED,IAAI,MAAmB,CAAA;IACvB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAc,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE;YACjE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAA;QACF,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAA;IACrE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAA;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAA;IAEpC,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,OAAO,GAAG,KAAK,QAAQ;QACvB,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAE,eAAqC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtD,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAE,KAA2B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC5C,CAAC;QACD,4EAA4E;QAC5E,qDAAqD;QACrD,OAAO,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAA;IACrE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,GAAG;QACV,SAAS,EAAE,EAAE,IAAI,EAAE,IAAyB,EAAE,EAAE,EAAE,GAAG,EAAE;QACvD,IAAI,EAAE,IAAe;KACtB,CAAA;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * RFC 9457 problem details, and the status-code discipline that goes with them.
3
+ *
4
+ * The whole file exists for one distinction. `403` says "this exists and you
5
+ * may not touch it". `404` says nothing at all. Using the first where the
6
+ * caller cannot already see the object turns identifier enumeration into a
7
+ * directory of what exists, which is invariant I6.
8
+ */
9
+ export interface ProblemInit {
10
+ readonly type: string;
11
+ readonly title: string;
12
+ readonly status: number;
13
+ readonly detail: string;
14
+ readonly instance: string;
15
+ readonly requestId: string;
16
+ }
17
+ export declare class Problem extends Error {
18
+ readonly type: string;
19
+ readonly title: string;
20
+ readonly status: number;
21
+ readonly detail: string;
22
+ readonly instance: string;
23
+ readonly requestId: string;
24
+ constructor(init: ProblemInit);
25
+ toJSON(): Record<string, unknown>;
26
+ }
27
+ /**
28
+ * The response for anything the caller may not see.
29
+ *
30
+ * One function, one wording, for both "absent" and "invisible". Two call sites
31
+ * with two different messages is how the distinction leaks back in — the
32
+ * status matching while the body differs is still an oracle.
33
+ */
34
+ export declare function notFound(instance: string, requestId: string): Problem;
35
+ export declare function unauthorized(instance: string, requestId: string, detail: string): Problem;
36
+ /**
37
+ * Only for an operation refused on an object the caller can already see — and
38
+ * for a request that tries to name its own organization, which is T2.
39
+ */
40
+ export declare function forbidden(instance: string, requestId: string, detail: string): Problem;
41
+ export declare function badRequest(instance: string, requestId: string, detail: string): Problem;
42
+ export declare function internal(instance: string, requestId: string): Problem;
43
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,qBAAa,OAAQ,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;gBAEd,IAAI,EAAE,WAAW;IAW7B,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAUlC;AAID;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CASrE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CASzF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAStF;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CASvF;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAWrE"}
package/dist/errors.js ADDED
@@ -0,0 +1,101 @@
1
+ /**
2
+ * RFC 9457 problem details, and the status-code discipline that goes with them.
3
+ *
4
+ * The whole file exists for one distinction. `403` says "this exists and you
5
+ * may not touch it". `404` says nothing at all. Using the first where the
6
+ * caller cannot already see the object turns identifier enumeration into a
7
+ * directory of what exists, which is invariant I6.
8
+ */
9
+ export class Problem extends Error {
10
+ type;
11
+ title;
12
+ status;
13
+ detail;
14
+ instance;
15
+ requestId;
16
+ constructor(init) {
17
+ super(`${init.status} ${init.title}`);
18
+ this.name = 'Problem';
19
+ this.type = init.type;
20
+ this.title = init.title;
21
+ this.status = init.status;
22
+ this.detail = init.detail;
23
+ this.instance = init.instance;
24
+ this.requestId = init.requestId;
25
+ }
26
+ toJSON() {
27
+ return {
28
+ type: this.type,
29
+ title: this.title,
30
+ status: this.status,
31
+ detail: this.detail,
32
+ instance: this.instance,
33
+ request_id: this.requestId,
34
+ };
35
+ }
36
+ }
37
+ const uri = (slug) => `https://nacre.work/errors/${slug}`;
38
+ /**
39
+ * The response for anything the caller may not see.
40
+ *
41
+ * One function, one wording, for both "absent" and "invisible". Two call sites
42
+ * with two different messages is how the distinction leaks back in — the
43
+ * status matching while the body differs is still an oracle.
44
+ */
45
+ export function notFound(instance, requestId) {
46
+ return new Problem({
47
+ type: uri('not-found'),
48
+ title: 'Not found',
49
+ status: 404,
50
+ detail: 'The requested resource does not exist or is not accessible.',
51
+ instance,
52
+ requestId,
53
+ });
54
+ }
55
+ export function unauthorized(instance, requestId, detail) {
56
+ return new Problem({
57
+ type: uri('unauthorized'),
58
+ title: 'Unauthorized',
59
+ status: 401,
60
+ detail,
61
+ instance,
62
+ requestId,
63
+ });
64
+ }
65
+ /**
66
+ * Only for an operation refused on an object the caller can already see — and
67
+ * for a request that tries to name its own organization, which is T2.
68
+ */
69
+ export function forbidden(instance, requestId, detail) {
70
+ return new Problem({
71
+ type: uri('forbidden'),
72
+ title: 'Forbidden',
73
+ status: 403,
74
+ detail,
75
+ instance,
76
+ requestId,
77
+ });
78
+ }
79
+ export function badRequest(instance, requestId, detail) {
80
+ return new Problem({
81
+ type: uri('bad-request'),
82
+ title: 'Bad request',
83
+ status: 400,
84
+ detail,
85
+ instance,
86
+ requestId,
87
+ });
88
+ }
89
+ export function internal(instance, requestId) {
90
+ return new Problem({
91
+ type: uri('internal'),
92
+ title: 'Internal error',
93
+ status: 500,
94
+ // No cause, no stack, no internal service name. Whatever went wrong is in
95
+ // the journal under this request_id.
96
+ detail: 'The request could not be completed.',
97
+ instance,
98
+ requestId,
99
+ });
100
+ }
101
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,MAAM,OAAO,OAAQ,SAAQ,KAAK;IACvB,IAAI,CAAQ;IACZ,KAAK,CAAQ;IACb,MAAM,CAAQ;IACd,MAAM,CAAQ;IACd,QAAQ,CAAQ;IAChB,SAAS,CAAQ;IAE1B,YAAY,IAAiB;QAC3B,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IACjC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAA;IACH,CAAC;CACF;AAED,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,6BAA6B,IAAI,EAAE,CAAA;AAEjE;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,SAAiB;IAC1D,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC;QACtB,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,6DAA6D;QACrE,QAAQ;QACR,SAAS;KACV,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,SAAiB,EAAE,MAAc;IAC9E,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;QACzB,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,GAAG;QACX,MAAM;QACN,QAAQ;QACR,SAAS;KACV,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,SAAiB,EAAE,MAAc;IAC3E,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC;QACtB,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,GAAG;QACX,MAAM;QACN,QAAQ;QACR,SAAS;KACV,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,SAAiB,EAAE,MAAc;IAC5E,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC,aAAa,CAAC;QACxB,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,GAAG;QACX,MAAM;QACN,QAAQ;QACR,SAAS;KACV,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,SAAiB;IAC1D,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;QACrB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,GAAG;QACX,0EAA0E;QAC1E,qCAAqC;QACrC,MAAM,EAAE,qCAAqC;QAC7C,QAAQ;QACR,SAAS;KACV,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { createApi } from './server.js';
2
+ export type { ApiOptions, AuditEvent, AuditSink, DocumentView, Documents, GrantInput, GrantRecord, Grants, Ingest, IngestOutcome, IngestRequest, Job, Jobs, Layer, LayerOutcome, Layers, SearchHit, SearchService, ServiceAccountPort, ServiceAccountView, } from './server.js';
3
+ export { authenticate, findTenantOverride, rejectTenantOverride } from './auth.js';
4
+ export type { AuthContext, VerifyOptions } from './auth.js';
5
+ export { Problem, badRequest, forbidden, internal, notFound, unauthorized } from './errors.js';
6
+ export { HttpEmbedder, NacreIngest, NacreSearchService, PostgresAudit, PostgresDocuments, PostgresGrants, PostgresJobs, PostgresLayers, } from './adapters.js';
7
+ export type { DocumentTombstone, Embedder, IngestDeps, SearchDeps } from './adapters.js';
8
+ export { generateKey, hashOf, KEY_PREFIX, looksLikeServiceKey, PostgresServiceAccounts, PostgresServiceKeys, prefixOf, } from './service-keys.js';
9
+ export type { ServiceAccount, ServiceAccounts, ServiceKeyResolver } from './service-keys.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,UAAU,EACV,WAAW,EACX,MAAM,EACN,MAAM,EACN,aAAa,EACb,aAAa,EACb,GAAG,EACH,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAClF,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACxF,OAAO,EACL,WAAW,EACX,MAAM,EACN,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,QAAQ,GACT,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { createApi } from './server.js';
2
+ export { authenticate, findTenantOverride, rejectTenantOverride } from './auth.js';
3
+ export { Problem, badRequest, forbidden, internal, notFound, unauthorized } from './errors.js';
4
+ export { HttpEmbedder, NacreIngest, NacreSearchService, PostgresAudit, PostgresDocuments, PostgresGrants, PostgresJobs, PostgresLayers, } from './adapters.js';
5
+ export { generateKey, hashOf, KEY_PREFIX, looksLikeServiceKey, PostgresServiceAccounts, PostgresServiceKeys, prefixOf, } from './service-keys.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAuBvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAElF,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,WAAW,EACX,MAAM,EACN,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,QAAQ,GACT,MAAM,mBAAmB,CAAA"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ import type { Pool } from 'pg';
2
+ /**
3
+ * Create the first organization.
4
+ *
5
+ * Everything else in this repository assumes an organization, a user, an
6
+ * embedding provider, a workspace and a Qdrant collection already exist.
7
+ * Nothing created them. A new installation could start every process, get
8
+ * `{"status":"ok"}` from health, and have no way to reach a single endpoint
9
+ * that does anything — the quickstart began one step after where a real
10
+ * installation begins.
11
+ *
12
+ * A one-shot command rather than an endpoint, because an HTTP route that
13
+ * creates the first organization has to be reachable before any organization
14
+ * exists, which means unauthenticated, which means it has to be disabled again
15
+ * afterwards. Every version of that is a race between the first deploy and the
16
+ * internet. A command runs where the operator already has credentials.
17
+ *
18
+ * Idempotent: run it twice and the second run reports what already existed and
19
+ * changes nothing. Half-finished state is the normal outcome of a first
20
+ * install — the collection created, the process killed before the workspace —
21
+ * and refusing to continue from it would leave no way forward but manual SQL.
22
+ */
23
+ export interface Options {
24
+ readonly slug: string;
25
+ readonly name: string;
26
+ readonly email: string;
27
+ readonly workspace: string;
28
+ }
29
+ export declare function parseArgs(argv: readonly string[]): Options | string;
30
+ export interface InitResult {
31
+ readonly orgId: string;
32
+ readonly userId: string;
33
+ readonly workspaceId: string;
34
+ /** False when the organization was already there — the run changed nothing. */
35
+ readonly created: boolean;
36
+ }
37
+ /**
38
+ * The database half, in one transaction.
39
+ *
40
+ * Separate from `main` so it can be tested: idempotency is the property that
41
+ * matters here and the one that regresses silently, because the second run of
42
+ * something non-idempotent usually still exits zero.
43
+ */
44
+ export declare function initialize(pool: Pool, options: Options, provider: {
45
+ endpoint: string;
46
+ model: string;
47
+ dimensions: number;
48
+ }, collection: string, log?: (msg: string, extra?: Record<string, unknown>) => void): Promise<InitResult>;
49
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAG9B;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,CA6BnE;AAMD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EACjE,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAsB,GAC5E,OAAO,CAAC,UAAU,CAAC,CAsFrB"}
package/dist/init.js ADDED
@@ -0,0 +1,201 @@
1
+ import { collectionName, ConfigError, createPool, loadConfig, vectorName, VectorStore, } from '@nacre.work/core';
2
+ import { SignJWT } from 'jose';
3
+ import { pathToFileURL } from 'node:url';
4
+ export function parseArgs(argv) {
5
+ const values = new Map();
6
+ for (let i = 0; i < argv.length; i += 2) {
7
+ const key = argv[i];
8
+ const value = argv[i + 1];
9
+ if (key === undefined || !key.startsWith('--') || value === undefined) {
10
+ return 'usage: nacre-init --org <slug> --email <address> [--name <display name>] [--workspace <slug>]';
11
+ }
12
+ values.set(key.slice(2), value);
13
+ }
14
+ const slug = values.get('org');
15
+ const email = values.get('email');
16
+ if (slug === undefined || email === undefined) {
17
+ return 'usage: nacre-init --org <slug> --email <address> [--name <display name>] [--workspace <slug>]';
18
+ }
19
+ // The slug becomes the Qdrant collection name, so the characters it may
20
+ // contain are not a matter of taste.
21
+ if (!/^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$/.test(slug)) {
22
+ return `--org must be 2-40 characters of lowercase letters, digits and hyphens, not starting or ending with one: ${slug}`;
23
+ }
24
+ if (!email.includes('@'))
25
+ return `--email does not look like an address: ${email}`;
26
+ return {
27
+ slug,
28
+ email,
29
+ name: values.get('name') ?? slug,
30
+ workspace: values.get('workspace') ?? 'default',
31
+ };
32
+ }
33
+ const say = (msg, extra = {}) => {
34
+ console.log(JSON.stringify({ msg, ...extra }));
35
+ };
36
+ /**
37
+ * The database half, in one transaction.
38
+ *
39
+ * Separate from `main` so it can be tested: idempotency is the property that
40
+ * matters here and the one that regresses silently, because the second run of
41
+ * something non-idempotent usually still exits zero.
42
+ */
43
+ export async function initialize(pool, options, provider, collection, log = () => undefined) {
44
+ const client = await pool.connect();
45
+ try {
46
+ await client.query('BEGIN');
47
+ const { rows: orgs } = await client.query(`WITH ins AS (
48
+ INSERT INTO organizations (slug, name, vector_collection)
49
+ VALUES ($1,$2,$3) ON CONFLICT (slug) DO NOTHING
50
+ RETURNING id
51
+ )
52
+ SELECT id, false AS existed FROM ins
53
+ UNION ALL
54
+ SELECT id, true AS existed FROM organizations WHERE slug = $1
55
+ LIMIT 1`, [options.slug, options.name, collection]);
56
+ const org = orgs[0];
57
+ if (org === undefined)
58
+ throw new Error('the organization insert returned no row');
59
+ log(org.existed ? 'organization already existed' : 'organization created', {
60
+ org_id: org.id,
61
+ slug: options.slug,
62
+ });
63
+ // RLS is forced on every tenant table, so everything below this line needs
64
+ // the organization in the transaction-local setting. The organizations row
65
+ // itself is not covered — it is the tenant registry, not tenant data.
66
+ await client.query('SELECT set_config($1, $2, true)', ['app.current_org', org.id]);
67
+ const { rows: users } = await client.query(`INSERT INTO users (org_id, email, role) VALUES ($1,$2,'org_admin')
68
+ ON CONFLICT (org_id, email) DO UPDATE SET email = EXCLUDED.email
69
+ RETURNING id`, [org.id, options.email]);
70
+ const userId = users[0]?.id;
71
+ if (userId === undefined)
72
+ throw new Error('the user insert returned no row');
73
+ log('admin user ready', { user_id: userId, email: options.email });
74
+ // Shared across organizations by default: one endpoint serves every tenant
75
+ // in a self-hosted install, and a per-organization provider is the
76
+ // exception rather than the shape to create on day one.
77
+ const { rows: providers } = await client.query(`WITH ins AS (
78
+ INSERT INTO embedding_providers (org_id, name, endpoint, model, dimensions)
79
+ SELECT NULL,'default',$1,$2,$3
80
+ WHERE NOT EXISTS (SELECT 1 FROM embedding_providers WHERE org_id IS NULL)
81
+ RETURNING id
82
+ )
83
+ SELECT id FROM ins
84
+ UNION ALL
85
+ SELECT id FROM embedding_providers WHERE org_id IS NULL
86
+ LIMIT 1`, [provider.endpoint, provider.model, provider.dimensions]);
87
+ const providerId = providers[0]?.id;
88
+ if (providerId === undefined)
89
+ throw new Error('the embedding provider insert returned no row');
90
+ log('embedding provider ready', { provider_id: providerId, model: provider.model });
91
+ const { rows: workspaces } = await client.query(`WITH ins AS (
92
+ -- slug and name take separate parameters despite the same value: slug
93
+ -- is citext, name is text, and Postgres refuses to deduce one type for
94
+ -- a parameter feeding both.
95
+ INSERT INTO workspaces (org_id, slug, name) VALUES ($1,$2,$3)
96
+ ON CONFLICT (org_id, slug) DO NOTHING
97
+ RETURNING id
98
+ )
99
+ SELECT id FROM ins
100
+ UNION ALL
101
+ SELECT id FROM workspaces WHERE org_id = $1 AND slug = $2
102
+ LIMIT 1`, [org.id, options.workspace, options.workspace]);
103
+ const workspaceId = workspaces[0]?.id;
104
+ if (workspaceId === undefined)
105
+ throw new Error('the workspace insert returned no row');
106
+ log('workspace ready', { workspace_id: workspaceId, slug: options.workspace });
107
+ await client.query('COMMIT');
108
+ return { orgId: org.id, userId, workspaceId, created: !org.existed };
109
+ }
110
+ catch (error) {
111
+ await client.query('ROLLBACK').catch(() => { });
112
+ throw error;
113
+ }
114
+ finally {
115
+ client.release();
116
+ }
117
+ }
118
+ async function main() {
119
+ const parsed = parseArgs(process.argv.slice(2));
120
+ if (typeof parsed === 'string')
121
+ throw new ConfigError([parsed]);
122
+ const config = loadConfig();
123
+ const secret = process.env.NACRE_JWT_SECRET;
124
+ if (secret === undefined || secret.length < 32) {
125
+ throw new ConfigError([
126
+ 'NACRE_JWT_SECRET is not set, or is shorter than 32 bytes. It is needed to ' +
127
+ 'issue the first token, and the API will refuse to start without it either.',
128
+ ]);
129
+ }
130
+ const pool = createPool({ connectionString: config.pgUrl, max: 2 });
131
+ const vector = vectorName(config.embeddingModel, config.embeddingDim);
132
+ const collection = collectionName(parsed.slug);
133
+ try {
134
+ const ids = await initialize(pool, parsed, {
135
+ endpoint: config.embeddingEndpoint,
136
+ model: config.embeddingModel,
137
+ dimensions: config.embeddingDim,
138
+ }, collection, say);
139
+ // Qdrant after Postgres commits. The reverse order can leave a collection
140
+ // belonging to an organization that was rolled back, and the next run with
141
+ // the same slug would then adopt it.
142
+ //
143
+ // `ensureCollection` is already idempotent and already creates the payload
144
+ // indexes, which is the part worth not reimplementing: a filter that falls
145
+ // back to a scan is a latency problem that only appears at volume.
146
+ const vectors = new VectorStore(config.qdrantApiKey === undefined
147
+ ? { url: config.qdrantUrl }
148
+ : { url: config.qdrantUrl, apiKey: config.qdrantApiKey });
149
+ await vectors.ensureCollection(parsed.slug, vector, config.embeddingDim);
150
+ say('collection ready', { collection, vector, dimensions: config.embeddingDim });
151
+ // A short life on purpose. This is a symmetric secret signed by the same
152
+ // value the API verifies with, printed to a terminal and probably into a
153
+ // shell history; it exists to get through the quickstart, not to be the
154
+ // credential an installation runs on.
155
+ const token = await new SignJWT({
156
+ org: ids.orgId,
157
+ principal_type: 'user',
158
+ role: 'org_admin',
159
+ })
160
+ .setProtectedHeader({ alg: 'HS256' })
161
+ .setSubject(ids.userId)
162
+ .setIssuer(config.jwtIssuer)
163
+ .setAudience(config.jwtAudience)
164
+ .setExpirationTime('1h')
165
+ .sign(new TextEncoder().encode(secret));
166
+ console.log('');
167
+ console.log(`Organization ${parsed.slug} is ready.`);
168
+ console.log('');
169
+ console.log(` Workspace id ${ids.workspaceId}`);
170
+ console.log(` Admin user ${parsed.email}`);
171
+ console.log('');
172
+ console.log('An administrator token, valid for one hour:');
173
+ console.log('');
174
+ console.log(` export NACRE_TOKEN=${token}`);
175
+ console.log('');
176
+ console.log('Create a layer with it, then follow docs/quickstart.md:');
177
+ console.log('');
178
+ console.log(` curl -X POST ${config.canonicalUrl}/v1/layers \\`);
179
+ console.log(` -H "Authorization: Bearer $NACRE_TOKEN" -H 'Content-Type: application/json' \\`);
180
+ console.log(` -d '{"workspace_id":"${ids.workspaceId}","slug":"handbook","name":"Handbook"}'`);
181
+ console.log('');
182
+ }
183
+ finally {
184
+ await pool.end();
185
+ }
186
+ }
187
+ // Only when run as a command. This module is also imported — `initialize` is
188
+ // the part with a test on it — and an unguarded call here runs the whole
189
+ // command on import, which under a test runner means `process.exit(2)` in the
190
+ // middle of somebody else's suite.
191
+ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
192
+ main().catch((error) => {
193
+ if (error instanceof ConfigError) {
194
+ console.error(error.message);
195
+ process.exit(2);
196
+ }
197
+ console.error(JSON.stringify({ msg: 'init failed', error: String(error) }));
198
+ process.exit(1);
199
+ });
200
+ }
201
+ //# sourceMappingURL=init.js.map