@substrat-run/engine-invites 0.5.2 → 0.6.1

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.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,15 @@
1
+ /**
2
+ * engine-invites — composed **by call**, not by event.
3
+ *
4
+ * The in-scope functions are the surface: `sendInvite`, `acceptInvite`,
5
+ * `revokeInvite`, `listInvites`, `expireOverdue`. A vertical imports those into its
6
+ * own operations and runs them inside its own transaction — the dashboard and every
7
+ * hosted vertical need the same invitation surface, which is D-31's "two consumers
8
+ * on day one" and the reason this is an engine at all
9
+ * (`docs/engines/invites.md`).
10
+ *
11
+ * There are no consumers here. Nothing composes this engine by emitting at it.
12
+ */
1
13
  import { type OrgId } from '@substrat-run/contracts';
2
14
  /**
3
15
  * The conflict reasons this engine raises — its own vocabulary, narrowing the platform's
@@ -12,18 +24,19 @@ export declare const INVITES_CONFLICT_REASONS: readonly ['open_invite_limit'];
12
24
  export type InvitesConflictReason = (typeof INVITES_CONFLICT_REASONS)[number];
13
25
  export { invitation, invitesEntities, invitationRow } from './entities.js';
14
26
  export { invitesOperations, INVITES_PERMISSIONS } from './operations.js';
27
+ import { z } from 'zod';
15
28
  import { type ModuleRegistration, type OperationContext } from '@substrat-run/kernel';
16
29
  export declare const INVITES_PERM: {
17
- send: string & import("zod").$brand<"PermissionKey">;
18
- read: string & import("zod").$brand<"PermissionKey">;
19
- revoke: string & import("zod").$brand<"PermissionKey">;
30
+ send: string & z.$brand<"PermissionKey">;
31
+ read: string & z.$brand<"PermissionKey">;
32
+ revoke: string & z.$brand<"PermissionKey">;
20
33
  };
21
34
  export declare const invitesManifest: {
22
- id: string & import("zod").$brand<"ModuleId">;
35
+ id: string & z.$brand<"ModuleId">;
23
36
  version: string;
24
37
  kernelContract: string;
25
38
  permissions: {
26
- key: string & import("zod").$brand<"PermissionKey">;
39
+ key: string & z.$brand<"PermissionKey">;
27
40
  description: string;
28
41
  }[];
29
42
  events: {
@@ -42,8 +55,8 @@ export declare const invitesManifest: {
42
55
  };
43
56
  attachmentTargets: {
44
57
  entityType: string;
45
- readPermission: string & import("zod").$brand<"PermissionKey">;
46
- writePermission?: (string & import("zod").$brand<"PermissionKey">) | undefined;
58
+ readPermission: string & z.$brand<"PermissionKey">;
59
+ writePermission?: (string & z.$brand<"PermissionKey">) | undefined;
47
60
  }[];
48
61
  entityRelations?: {
49
62
  entityType: string;
@@ -60,7 +73,7 @@ export declare const invitesManifest: {
60
73
  everyMinutes: number;
61
74
  };
62
75
  input?: Record<string, unknown> | undefined;
63
- permissions: (string & import("zod").$brand<"PermissionKey">)[];
76
+ permissions: (string & z.$brand<"PermissionKey">)[];
64
77
  }[] | undefined;
65
78
  withdraws?: string[] | undefined;
66
79
  entitlementKey: string;
@@ -74,7 +87,7 @@ export declare const invitesManifest: {
74
87
  default?: string | undefined;
75
88
  group?: string | undefined;
76
89
  }[] | undefined;
77
- ownerGrants?: (string & import("zod").$brand<"PermissionKey">)[] | undefined;
90
+ ownerGrants?: (string & z.$brand<"PermissionKey">)[] | undefined;
78
91
  entitlements?: string[] | undefined;
79
92
  provides?: string[] | undefined;
80
93
  requires?: string[] | undefined;
@@ -97,13 +110,13 @@ export declare const invitesManifest: {
97
110
  routes?: {
98
111
  path: string;
99
112
  screen: string;
100
- permission: string & import("zod").$brand<"PermissionKey">;
113
+ permission: string & z.$brand<"PermissionKey">;
101
114
  }[] | undefined;
102
115
  nav?: {
103
116
  label: string;
104
117
  icon?: string | undefined;
105
118
  to: string;
106
- permission: string & import("zod").$brand<"PermissionKey">;
119
+ permission: string & z.$brand<"PermissionKey">;
107
120
  }[] | undefined;
108
121
  entityViews?: {
109
122
  entityType: string;
@@ -112,12 +125,12 @@ export declare const invitesManifest: {
112
125
  widgets?: {
113
126
  slot: string;
114
127
  component: string;
115
- permission: string & import("zod").$brand<"PermissionKey">;
128
+ permission: string & z.$brand<"PermissionKey">;
116
129
  }[] | undefined;
117
130
  settingsPanels?: {
118
131
  label: string;
119
132
  component: string;
120
- permission: string & import("zod").$brand<"PermissionKey">;
133
+ permission: string & z.$brand<"PermissionKey">;
121
134
  }[] | undefined;
122
135
  } | undefined;
123
136
  };
@@ -125,21 +138,61 @@ export declare const invitesMigrations: {
125
138
  version: string;
126
139
  sql: string;
127
140
  }[];
128
- export type InviteState = 'invited' | 'accepted' | 'revoked' | 'expired';
129
- export interface InvitationRow {
130
- id: string;
131
- org_id: string;
132
- identifier_hash: string;
133
- role_key: string;
134
- state: InviteState;
135
- invited_by: string;
136
- accepted_by: string | null;
137
- created_at: string;
138
- expires_at: string;
139
- settled_at: string | null;
140
- }
141
+ /**
142
+ * The seam schemas (#771/#970).
143
+ *
144
+ * `entities.ts` describes what is STORED, which is what the journal comparison
145
+ * checks against, so `state` is a bare string there. The engine's own machine is
146
+ * narrower than that, and the narrowing is the point: `state` decides whether an
147
+ * invitation is acceptable, so a row that drifted to a state this engine does not
148
+ * know must be a throw at the seam rather than a value `acceptInvite` compares
149
+ * against and silently refuses.
150
+ */
151
+ declare const inviteState: z.ZodEnum<{
152
+ accepted: "accepted";
153
+ expired: "expired";
154
+ invited: "invited";
155
+ revoked: "revoked";
156
+ }>;
157
+ export type InviteState = z.infer<typeof inviteState>;
158
+ /** The stored row, hash included — never returned, only matched against. */
159
+ declare const invitationStored: z.ZodObject<{
160
+ id: z.ZodString;
161
+ org_id: z.ZodString;
162
+ identifier_hash: z.ZodString;
163
+ role_key: z.ZodString;
164
+ invited_by: z.ZodString;
165
+ accepted_by: z.ZodNullable<z.ZodString>;
166
+ created_at: z.ZodString;
167
+ expires_at: z.ZodString;
168
+ settled_at: z.ZodNullable<z.ZodString>;
169
+ state: z.ZodEnum<{
170
+ accepted: "accepted";
171
+ expired: "expired";
172
+ invited: "invited";
173
+ revoked: "revoked";
174
+ }>;
175
+ }, z.core.$strip>;
176
+ export type InvitationRow = z.infer<typeof invitationStored>;
177
+ /** What crosses the seam: the row minus the hash (`entities.ts` omits it). */
178
+ declare const invitationPublished: z.ZodObject<{
179
+ id: z.ZodString;
180
+ org_id: z.ZodString;
181
+ role_key: z.ZodString;
182
+ invited_by: z.ZodString;
183
+ accepted_by: z.ZodNullable<z.ZodString>;
184
+ created_at: z.ZodString;
185
+ expires_at: z.ZodString;
186
+ settled_at: z.ZodNullable<z.ZodString>;
187
+ state: z.ZodEnum<{
188
+ accepted: "accepted";
189
+ expired: "expired";
190
+ invited: "invited";
191
+ revoked: "revoked";
192
+ }>;
193
+ }, z.core.$strip>;
141
194
  /** Public shape: the hash never leaves the engine. */
142
- export type Invitation = Omit<InvitationRow, 'identifier_hash'>;
195
+ export type Invitation = z.infer<typeof invitationPublished>;
143
196
  /**
144
197
  * Hash an identifier with the scope's own salt (Web Crypto, never a node-only
145
198
  * import).
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,KAAK,EACX,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,YACnC,mBAAmB,CACX,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAS9E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG3E,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAEtB,MAAM,sBAAsB,CAAC;AAoB9B,eAAO,MAAM,YAAY;IACvB,IAAI;IACJ,IAAI;IACJ,MAAM;CACP,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;GAmB7B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,sDAAsD;AACtD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAmBhE;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3F;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAMvE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCzB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAClD,OAAO,CAAC,UAAU,CAAC,CAyDrB;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAc9E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,CAM7E;AA6BD,eAAO,MAAM,aAAa,EAAE,kBAW3B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAQL,KAAK,KAAK,EAEX,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,YACnC,mBAAmB,CACX,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAS9E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI3E,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAEtB,MAAM,sBAAsB,CAAC;AAoB9B,eAAO,MAAM,YAAY;IACvB,IAAI;IACJ,IAAI;IACJ,MAAM;CACP,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;GAmB7B,CAAC;AAEF;;;;;;;;;GASG;AACH,QAAA,MAAM,WAAW;;;;;EAAwD,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,4EAA4E;AAC5E,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;iBAA+C,CAAC;AACtE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D,8EAA8E;AAC9E,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;iBAA4C,CAAC;AAEtE,sDAAsD;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAmC7D;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3F;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAMvE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCzB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAClD,OAAO,CAAC,UAAU,CAAC,CAgErB;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAc9E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,CAe7E;AAqCD,eAAO,MAAM,aAAa,EAAE,kBAW3B,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,16 @@
1
- import { entityRef, moduleManifest, operationInputsOf, permissionKey, substratError, } from '@substrat-run/contracts';
1
+ /**
2
+ * engine-invites — composed **by call**, not by event.
3
+ *
4
+ * The in-scope functions are the surface: `sendInvite`, `acceptInvite`,
5
+ * `revokeInvite`, `listInvites`, `expireOverdue`. A vertical imports those into its
6
+ * own operations and runs them inside its own transaction — the dashboard and every
7
+ * hosted vertical need the same invitation surface, which is D-31's "two consumers
8
+ * on day one" and the reason this is an engine at all
9
+ * (`docs/engines/invites.md`).
10
+ *
11
+ * There are no consumers here. Nothing composes this engine by emitting at it.
12
+ */
13
+ import { entityRef, moduleManifest, operationInputsOf, pageOverFold, permissionKey, substratError, } from '@substrat-run/contracts';
2
14
  /**
3
15
  * The conflict reasons this engine raises — its own vocabulary, narrowing the platform's
4
16
  * `conflict` code (#113). Exported so a vertical can branch on WHY a refusal happened
@@ -17,10 +29,13 @@ const conflict = (reason, message) => substratError('conflict', message, { reaso
17
29
  // entity-type constants its relation edges name, and the row schema to declare
18
30
  // an operation's output against without retyping this engine's shape.
19
31
  export { invitation, invitesEntities, invitationRow } from './entities.js';
32
+ import { invitation, invitationRow } from './entities.js';
20
33
  // The declared operation surface (#865): what each operation checks and takes,
21
34
  // readable by the conformance kit and by a composing vertical's routes.
22
35
  export { invitesOperations, INVITES_PERMISSIONS } from './operations.js';
23
36
  import { invitesOperations } from './operations.js';
37
+ import { columnsOf, returns } from './seam.js';
38
+ import { z } from 'zod';
24
39
  import { assertAllowed, ulid, } from '@substrat-run/kernel';
25
40
  // ============================================================================
26
41
  // The invites engine (membership.md §6; mechanics from booking-social.md
@@ -102,7 +117,35 @@ export const invitesMigrations = [
102
117
  `,
103
118
  },
104
119
  ];
105
- const PUBLIC_COLUMNS = 'id, org_id, role_key, state, invited_by, accepted_by, created_at, expires_at, settled_at';
120
+ /**
121
+ * The seam schemas (#771/#970).
122
+ *
123
+ * `entities.ts` describes what is STORED, which is what the journal comparison
124
+ * checks against, so `state` is a bare string there. The engine's own machine is
125
+ * narrower than that, and the narrowing is the point: `state` decides whether an
126
+ * invitation is acceptable, so a row that drifted to a state this engine does not
127
+ * know must be a throw at the seam rather than a value `acceptInvite` compares
128
+ * against and silently refuses.
129
+ */
130
+ const inviteState = z.enum(['invited', 'accepted', 'revoked', 'expired']);
131
+ /** The stored row, hash included — never returned, only matched against. */
132
+ const invitationStored = invitationRow.extend({ state: inviteState });
133
+ /** What crosses the seam: the row minus the hash (`entities.ts` omits it). */
134
+ const invitationPublished = invitation.extend({ state: inviteState });
135
+ /**
136
+ * The SELECT lists, DERIVED from those schemas rather than transcribed (#771).
137
+ *
138
+ * `PUBLIC_COLUMNS` was a hand-written string, and it was the only thing keeping
139
+ * the hash out of a read — one `SELECT *` and the property this engine exists to
140
+ * hold would have been gone with nothing to notice. Deriving it from the schema
141
+ * that already omits `identifier_hash` makes the omission structural.
142
+ */
143
+ const PUBLIC_COLUMNS = columnsOf(invitationPublished);
144
+ const ROW_COLUMNS = columnsOf(invitationStored);
145
+ /** A stored row, parsed BEFORE anything is made of it. */
146
+ const storedInvitation = (r) => returns(invitationStored, `invitation row ${r.id}`, r);
147
+ /** A row on its way OUT, parsed by the shape a composing vertical declared. */
148
+ const publishedInvitation = (r) => returns(invitationPublished, `invitation ${r.id}`, r);
106
149
  /** How long an unaccepted invitation stands. Bounded, because a standing offer should be. */
107
150
  const DEFAULT_TTL_MS = 14 * 24 * 60 * 60 * 1000;
108
151
  /** Open invitations one sender may hold per org — booking-social's rate limit. */
@@ -183,13 +226,17 @@ export async function sendInvite(ctx, input) {
183
226
  * state that this transaction cannot reach atomically.
184
227
  */
185
228
  export async function acceptInvite(ctx, input) {
186
- const row = ctx.sql.query('SELECT * FROM invites_invitation WHERE id = ?', [
187
- input.invitationId,
188
- ])[0];
229
+ const raw = ctx.sql.query(`SELECT ${ROW_COLUMNS} FROM invites_invitation WHERE id = ?`, [input.invitationId])[0];
189
230
  // One message for every failure mode — wrong id, wrong person, already settled,
190
231
  // expired. Distinguishing them would turn this into an oracle.
191
232
  const refuse = () => new Error('invitation is not acceptable');
192
- if (!row || row.state !== 'invited')
233
+ if (!raw)
234
+ throw refuse();
235
+ // Parsed before the state machine reads it: a `state` this engine does not know
236
+ // is an engine fault, and answering `refuse()` for it would file that fault
237
+ // under "not acceptable" — indistinguishable from a wrong identifier forever.
238
+ const row = storedInvitation(raw);
239
+ if (row.state !== 'invited')
193
240
  throw refuse();
194
241
  if (row.expires_at <= ctx.now()) {
195
242
  ctx.sql.exec(`UPDATE invites_invitation SET state = 'expired', settled_at = ? WHERE id = ?`, [
@@ -231,7 +278,9 @@ export async function acceptInvite(ctx, input) {
231
278
  invitationId: row.id,
232
279
  },
233
280
  });
234
- return ctx.sql.query(`SELECT ${PUBLIC_COLUMNS} FROM invites_invitation WHERE id = ?`, [row.id])[0];
281
+ return publishedInvitation(ctx.sql.query(`SELECT ${PUBLIC_COLUMNS} FROM invites_invitation WHERE id = ?`, [
282
+ row.id,
283
+ ])[0]);
235
284
  }
236
285
  /** Withdraw an unaccepted invitation. Settled invitations are left alone. */
237
286
  export function revokeInvite(ctx, invitationId) {
@@ -254,7 +303,16 @@ export function revokeInvite(ctx, invitationId) {
254
303
  */
255
304
  export function listInvites(ctx, orgId) {
256
305
  expireOverdue(ctx, orgId);
257
- return ctx.sql.query(`SELECT ${PUBLIC_COLUMNS} FROM invites_invitation WHERE org_id = ? ORDER BY created_at DESC`, [orgId]);
306
+ // Newest first, ordered by `id` rather than `created_at` (#959). Same intent
307
+ // the id is a ULID, so it carries the same instant — but TOTAL: `created_at`
308
+ // comes from `ctx.now()`, which is stable for a whole invocation, so a seed or
309
+ // a batch that sends several invitations in one operation gives them all the
310
+ // same value and leaves their relative order to SQLite. That is fine for a
311
+ // whole-list read and fatal for the keyset walk `invites/list` now does, where
312
+ // a cursor over a column with ties skips or repeats rows.
313
+ return ctx.sql
314
+ .query(`SELECT ${PUBLIC_COLUMNS} FROM invites_invitation WHERE org_id = ? ORDER BY id DESC`, [orgId])
315
+ .map(publishedInvitation);
258
316
  }
259
317
  // -- operations: the permission check plus one exported function (D-28) -------
260
318
  const sendOp = async (ctx, input) => {
@@ -267,9 +325,14 @@ const acceptOp = async (ctx, input) => {
267
325
  // proven by re-hashing the identifier they present.
268
326
  return acceptInvite(ctx, input);
269
327
  };
328
+ // Paged (#959). `listInvites` above stays unpaged: a vertical composing it inside
329
+ // its own operation is reading one org's invitations to decide something, not
330
+ // rendering a table — the same split `listOrders` kept in #811.
270
331
  const listOp = async (ctx, input) => {
271
332
  assertAllowed(await ctx.check(INVITES_PERM.read));
272
- return listInvites(ctx, input.orgId);
333
+ // Newest first, so the walk descends; the id is a ULID, unique and ordered the
334
+ // same way `created_at` is.
335
+ return pageOverFold(listInvites(ctx, input.orgId), input, (i) => i.id, 'desc');
273
336
  };
274
337
  const revokeOp = async (ctx, input) => {
275
338
  assertAllowed(await ctx.check(INVITES_PERM.revoke));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The artifact of record for this engine (#697/#844, #976).
3
+ *
4
+ * `pnpm lint:model --check` re-emits this into `engines/invites/model.json`, so a
5
+ * changed table, a renamed field or a moved parent edge has to appear in a PR
6
+ * diff. No `lifecycles` option: this engine declares no state machine, and an
7
+ * empty one would claim otherwise.
8
+ *
9
+ * Imported by nothing, so the direction stays acyclic.
10
+ */
11
+ export declare const invitesModel: import("@substrat-run/contracts").EmittedModel;
12
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,gDAA6B,CAAC"}
package/dist/model.js ADDED
@@ -0,0 +1,14 @@
1
+ import { emitModel } from '@substrat-run/contracts';
2
+ import { invitesEntities } from './entities.js';
3
+ /**
4
+ * The artifact of record for this engine (#697/#844, #976).
5
+ *
6
+ * `pnpm lint:model --check` re-emits this into `engines/invites/model.json`, so a
7
+ * changed table, a renamed field or a moved parent edge has to appear in a PR
8
+ * diff. No `lifecycles` option: this engine declares no state machine, and an
9
+ * empty one would claim otherwise.
10
+ *
11
+ * Imported by nothing, so the direction stays acyclic.
12
+ */
13
+ export const invitesModel = emitModel(invitesEntities);
14
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC"}
@@ -100,6 +100,19 @@ export declare const invitesOperations: {
100
100
  expires_at: z.ZodString;
101
101
  settled_at: z.ZodNullable<z.ZodString>;
102
102
  }, z.core.$strip>;
103
+ /**
104
+ * Handler-composed, not `paged.over` (#959). The read answers the PROJECTION
105
+ * — the row minus the identifier hash — and it expires overdue invitations on
106
+ * the way past, which the kernel's walk has no place for.
107
+ *
108
+ * Newest first, so the page descends. `id` is the cursor rather than
109
+ * `created_at`: it is a ULID, so it is unique AND ordered the same way
110
+ * `created_at` is, and a keyset over a non-unique column skips ties.
111
+ */
112
+ readonly paged: {
113
+ readonly sortKey: "id";
114
+ readonly order: "desc";
115
+ };
103
116
  };
104
117
  readonly 'invites/revoke': {
105
118
  readonly summary: "Withdraw an invitation before it is accepted";
@@ -1 +1 @@
1
- {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAAoB,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAG9D,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,YAAI,cAAc,EAAE,cAAc,EAAE,gBAAgB,CAAU,CAAC;AAI/F,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D5B,CAAC"}
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAAoB,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAG9D,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,YAAI,cAAc,EAAE,cAAc,EAAE,gBAAgB,CAAU,CAAC;AAI/F,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAoD1B;;;;;;;;WAQG;;;;;;;;;;;;;;CAaL,CAAC"}
@@ -97,6 +97,16 @@ export const invitesOperations = defineOperations(invitesEntities, INVITES_PERMI
97
97
  // publish the identifier hash, which is the one thing hashing exists to keep
98
98
  // unreadable.
99
99
  output: invitation,
100
+ /**
101
+ * Handler-composed, not `paged.over` (#959). The read answers the PROJECTION
102
+ * — the row minus the identifier hash — and it expires overdue invitations on
103
+ * the way past, which the kernel's walk has no place for.
104
+ *
105
+ * Newest first, so the page descends. `id` is the cursor rather than
106
+ * `created_at`: it is a ULID, so it is unique AND ordered the same way
107
+ * `created_at` is, and a keyset over a non-unique column skips ties.
108
+ */
109
+ paged: { sortKey: 'id', order: 'desc' },
100
110
  },
101
111
  'invites/revoke': {
102
112
  summary: 'Withdraw an invitation before it is accepted',
@@ -1 +1 @@
1
- {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,gBAAgB,CAAU,CAAC;AAE/F,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;IACtF,cAAc,EAAE;QACd,OAAO,EAAE,mCAAmC;QAC5C,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,wEAAwE;YACxE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B;;;;;;;;eAQG;YACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;SACnC,CAAC;QACF,0EAA0E;QAC1E,2EAA2E;QAC3E,8EAA8E;QAC9E,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;KACrC;IAED,gBAAgB,EAAE;QAChB,OAAO,EAAE;YACP,MAAM,EACJ,sFAAsF;gBACtF,qFAAqF;gBACrF,mFAAmF;gBACnF,YAAY;YACd,MAAM,EAAE,EAAE;YACV,4EAA4E;YAC5E,2EAA2E;YAC3E,sEAAsE;YACtE,SAAS,EAAE,IAAI;SAChB;QACD,OAAO,EAAE,kEAAkE;QAC3E,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,EAAE,UAAU;KACnB;IAED,cAAc,EAAE;QACd,OAAO,EAAE,6CAA6C;QACtD,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,2EAA2E;QAC3E,6EAA6E;QAC7E,cAAc;QACd,MAAM,EAAE,UAAU;KACnB;IAED,gBAAgB,EAAE;QAChB,OAAO,EAAE,8CAA8C;QACvD,UAAU,EAAE,gBAAgB;QAC5B,KAAK,EAAE,YAAY;QACnB,mEAAmE;QACnE,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE;KACjB;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,gBAAgB,CAAU,CAAC;AAE/F,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;IACtF,cAAc,EAAE;QACd,OAAO,EAAE,mCAAmC;QAC5C,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,wEAAwE;YACxE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B;;;;;;;;eAQG;YACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;SACnC,CAAC;QACF,0EAA0E;QAC1E,2EAA2E;QAC3E,8EAA8E;QAC9E,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;KACrC;IAED,gBAAgB,EAAE;QAChB,OAAO,EAAE;YACP,MAAM,EACJ,sFAAsF;gBACtF,qFAAqF;gBACrF,mFAAmF;gBACnF,YAAY;YACd,MAAM,EAAE,EAAE;YACV,4EAA4E;YAC5E,2EAA2E;YAC3E,sEAAsE;YACtE,SAAS,EAAE,IAAI;SAChB;QACD,OAAO,EAAE,kEAAkE;QAC3E,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,EAAE,UAAU;KACnB;IAED,cAAc,EAAE;QACd,OAAO,EAAE,6CAA6C;QACtD,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,2EAA2E;QAC3E,6EAA6E;QAC7E,cAAc;QACd,MAAM,EAAE,UAAU;QAClB;;;;;;;;WAQG;QACH,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;KACxC;IAED,gBAAgB,EAAE;QAChB,OAAO,EAAE,8CAA8C;QACvD,UAAU,EAAE,gBAAgB;QAC5B,KAAK,EAAE,YAAY;QACnB,mEAAmE;QACnE,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE;KACjB;CACF,CAAC,CAAC"}
package/dist/seam.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /** How this engine names itself in a seam failure. */
2
+ export declare const columnsOf: (schema: {
3
+ readonly shape: Readonly<Record<string, unknown>>;
4
+ }) => string, returns: <T>(schema: import("zod").ZodType<T>, surface: string, value: unknown) => T;
5
+ //# sourceMappingURL=seam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seam.d.ts","sourceRoot":"","sources":["../src/seam.ts"],"names":[],"mappings":"AAgBA,sDAAsD;AACtD,eAAO,MAAQ,SAAS;;cAAE,OAAO,6EAAiC,CAAC"}
package/dist/seam.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The engine seam (#771) for engine-invites — the NAME, and nothing else.
3
+ *
4
+ * `returns(schema, surface, value)` and `columnsOf(schema)` live in
5
+ * `@substrat-run/contracts` (#970), where the prose explaining what they are for
6
+ * lives with them; an engine supplies only the name it answers under.
7
+ *
8
+ * What is specific to this engine is what the seam must NOT publish. The stored
9
+ * row carries `identifier_hash`, and the whole non-enumerability property depends
10
+ * on it never leaving — so the published schema is the row minus the hash, and
11
+ * `columnsOf` derives the SELECT list from THAT. The exclusion is then a fact
12
+ * about the read rather than a column list somebody remembered to keep in step:
13
+ * `SELECT *` here would have leaked the hash on the first read that forgot.
14
+ */
15
+ import { engineSeam } from '@substrat-run/contracts';
16
+ /** How this engine names itself in a seam failure. */
17
+ export const { columnsOf, returns } = engineSeam('engine-invites');
18
+ //# sourceMappingURL=seam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seam.js","sourceRoot":"","sources":["../src/seam.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,sDAAsD;AACtD,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@substrat-run/engine-invites",
3
- "version": "0.5.2",
3
+ "version": "0.6.1",
4
4
  "description": "Substrat engine: invitations — invite by verified hashed identifier, accept-required, non-enumerable",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
@@ -25,16 +25,16 @@
25
25
  "access": "public"
26
26
  },
27
27
  "dependencies": {
28
- "@substrat-run/contracts": "^0.92.0",
29
- "@substrat-run/kernel": "^0.92.0"
28
+ "@substrat-run/contracts": "^0.95.0",
29
+ "@substrat-run/kernel": "^0.95.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "typescript": "^7.0.0",
33
33
  "vitest": "^3.2.7",
34
34
  "zod": "^4.4.3",
35
- "@substrat-run/contract-tests": "^0.92.0",
36
- "@substrat-run/engine-test-kit": "^0.3.19",
37
- "@substrat-run/model-emit": "0.8.6"
35
+ "@substrat-run/contract-tests": "^0.95.0",
36
+ "@substrat-run/engine-test-kit": "^0.3.22",
37
+ "@substrat-run/model-emit": "0.8.10"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "zod": "^4.4.0"