@cosmicdrift/kumiko-bundled-features 0.330.2 → 0.331.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.
@@ -16,6 +16,8 @@ export declare const tenantComplianceProfileEntity: import("@cosmicdrift/kumiko-
16
16
  readonly "minimal-no-region"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
17
17
  readonly "swiss-dsg"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
18
18
  } | undefined;
19
+ readonly optionsQuery?: string;
20
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
19
21
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
20
22
  required: true;
21
23
  };
@@ -54,6 +56,8 @@ export declare const tenantComplianceProfileTable: import("@cosmicdrift/kumiko-f
54
56
  readonly "minimal-no-region"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
55
57
  readonly "swiss-dsg"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
56
58
  } | undefined;
59
+ readonly optionsQuery?: string;
60
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
57
61
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
58
62
  required: true;
59
63
  };
@@ -37,6 +37,8 @@ export declare const accountEntity: import("@cosmicdrift/kumiko-types/fields").E
37
37
  readonly income?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
38
38
  readonly liability?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
39
39
  } | undefined;
40
+ readonly optionsQuery?: string;
41
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
40
42
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
41
43
  required: true;
42
44
  };
@@ -151,6 +153,8 @@ export declare const transactionEntity: import("@cosmicdrift/kumiko-types/fields
151
153
  readonly draft?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
152
154
  readonly posted?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
153
155
  } | undefined;
156
+ readonly optionsQuery?: string;
157
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
154
158
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
155
159
  required: true;
156
160
  };
@@ -274,6 +278,8 @@ export declare const scheduleEntity: import("@cosmicdrift/kumiko-types/fields").
274
278
  readonly optionTones?: {
275
279
  readonly monthly?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
276
280
  } | undefined;
281
+ readonly optionsQuery?: string;
282
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
277
283
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
278
284
  required: true;
279
285
  };
@@ -376,4 +382,24 @@ export declare const scheduleEntity: import("@cosmicdrift/kumiko-types/fields").
376
382
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
377
383
  required: false;
378
384
  };
385
+ sourceRef: {
386
+ readonly type: "text";
387
+ readonly description?: string;
388
+ readonly maxLength?: number;
389
+ readonly required?: boolean;
390
+ readonly searchable?: boolean;
391
+ readonly sortable?: boolean;
392
+ readonly filterable?: boolean;
393
+ readonly encrypted?: boolean;
394
+ readonly sensitive?: boolean;
395
+ readonly readAsInstruction?: boolean;
396
+ readonly format?: "email" | "url" | "phone" | "password";
397
+ readonly default?: string;
398
+ readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
399
+ readonly multiline?: boolean | {
400
+ readonly rows?: number;
401
+ };
402
+ } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
403
+ required: false;
404
+ };
379
405
  }, "tenant">;
@@ -142,6 +142,20 @@ export const scheduleEntity = createEntity({
142
142
  reason: "technical_reference",
143
143
  filterable: true,
144
144
  }),
145
+ // Caller-assigned stable key (e.g. one id per lease position) to find the
146
+ // schedule again. Not unique: callers keep their own find-then-create;
147
+ // `description` stays pure display text instead of a lookup key.
148
+ sourceRef: createTextField({
149
+ maxLength: 128,
150
+ personal: false,
151
+ reason: "technical_reference",
152
+ filterable: true,
153
+ }),
145
154
  },
146
- indexes: [{ columns: ["tenantId", "subjectType", "subjectId"] }],
155
+ // A separate non-unique index: changing the subject index would drop and
156
+ // recreate it, an additional one is a plain CREATE INDEX.
157
+ indexes: [
158
+ { columns: ["tenantId", "subjectType", "subjectId"] },
159
+ { columns: ["tenantId", "sourceRef"] },
160
+ ],
147
161
  });
@@ -19,7 +19,7 @@ import { createCreateTransactionHandler } from "./handlers/create-transaction.wr
19
19
  import { createBalanceSheetHandler, createBalancesReportHandler, createIncomeStatementHandler, } from "./handlers/reports.query.js";
20
20
  import { createReverseTransactionHandler } from "./handlers/reverse-transaction.write.js";
21
21
  function registerLedger(r, access, toggleable) {
22
- r.describe("Double-entry bookkeeping primitive. Owns two event-sourced entities — the per-tenant `account` chart of accounts (`read_ledger_accounts`, self-referential via parentId, typed asset/liability/equity/income/expense) and immutable `transaction` journal entries (`read_ledger_transactions`) whose balanced posting lines are embedded as jsonb (Σ amount = 0, signed integer minor units). The account catalog uses the generic entity handlers (create, update, list, detail); create-transaction books a balanced entry (Σ=0 and ≥2 distinct accounts enforced at the command boundary, referential integrity against accounts checked) and reverse-transaction books its Storno mirror — there is deliberately NO transaction update/delete, so a posted entry is an immutable fact and the audit trail stays intact. Recurring schedules (`read_ledger_schedules`) layer Dauerauftrag templates on top — a schedule names debit/credit accounts, an amount and a monthly interval, from which the Soll (forecast) is a pure projection (projectSchedule) needing no bookings, and confirm-schedule-period materialises one period as an idempotent, reversal-aware balanced entry referencing scheduleReference(id, period); only confirming writes. Balances and reports (balance sheet, P&L, cashflow) derive as pure queries over the postings. Everything financial — banking, accounting, rent cashflow, credits, invoices — models as accounts + balanced transactions on top. Pin roles with createLedgerFeature({ roles }) or adopt the host model with { access }; pass { toggleable: { default: false } } to tier-gate the whole feature.");
22
+ r.describe("Double-entry bookkeeping primitive. Owns two event-sourced entities — the per-tenant `account` chart of accounts (`read_ledger_accounts`, self-referential via parentId, typed asset/liability/equity/income/expense) and immutable `transaction` journal entries (`read_ledger_transactions`) whose balanced posting lines are embedded as jsonb (Σ amount = 0, signed integer minor units). The account catalog uses the generic entity handlers (create, update, list, detail); create-transaction books a balanced entry (Σ=0 and ≥2 distinct accounts enforced at the command boundary, referential integrity against accounts checked) and reverse-transaction books its Storno mirror — there is deliberately NO transaction update/delete, so a posted entry is an immutable fact and the audit trail stays intact. Recurring schedules (`read_ledger_schedules`) layer Dauerauftrag templates on top — a schedule names debit/credit accounts, an amount, a monthly interval and an optional caller-assigned `sourceRef` key (filterable, to find a schedule again), from which the Soll (forecast) is a pure projection (projectSchedule) needing no bookings, and confirm-schedule-period materialises one period as an idempotent, reversal-aware balanced entry referencing scheduleReference(id, period); only confirming writes. Balances and reports (balance sheet, P&L, cashflow) derive as pure queries over the postings. Everything financial — banking, accounting, rent cashflow, credits, invoices — models as accounts + balanced transactions on top. Pin roles with createLedgerFeature({ roles }) or adopt the host model with { access }; pass { toggleable: { default: false } } to tier-gate the whole feature.");
23
23
  r.uiHints({
24
24
  displayLabel: "Ledger",
25
25
  category: "data",
@@ -38,6 +38,8 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
38
38
  readonly notification?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
39
39
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
40
40
  } | undefined;
41
+ readonly optionsQuery?: string;
42
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
41
43
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
42
44
  required: true;
43
45
  };
@@ -134,6 +136,8 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
134
136
  readonly mjml?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
135
137
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
136
138
  } | undefined;
139
+ readonly optionsQuery?: string;
140
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
137
141
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
138
142
  required: true;
139
143
  };
@@ -184,6 +188,8 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
184
188
  readonly system?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
185
189
  readonly tenant?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
186
190
  } | undefined;
191
+ readonly optionsQuery?: string;
192
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
187
193
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
188
194
  required: true;
189
195
  };
@@ -223,6 +229,8 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
223
229
  readonly archived?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
224
230
  readonly draft?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
225
231
  } | undefined;
232
+ readonly optionsQuery?: string;
233
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
226
234
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
227
235
  required: true;
228
236
  };
@@ -267,6 +275,8 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
267
275
  readonly notification?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
268
276
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
269
277
  } | undefined;
278
+ readonly optionsQuery?: string;
279
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
270
280
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
271
281
  required: true;
272
282
  };
@@ -363,6 +373,8 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
363
373
  readonly mjml?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
364
374
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
365
375
  } | undefined;
376
+ readonly optionsQuery?: string;
377
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
366
378
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
367
379
  required: true;
368
380
  };
@@ -413,6 +425,8 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
413
425
  readonly system?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
414
426
  readonly tenant?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
415
427
  } | undefined;
428
+ readonly optionsQuery?: string;
429
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
416
430
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
417
431
  required: true;
418
432
  };
@@ -452,6 +466,8 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
452
466
  readonly archived?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
453
467
  readonly draft?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
454
468
  } | undefined;
469
+ readonly optionsQuery?: string;
470
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
455
471
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
456
472
  required: true;
457
473
  };
@@ -58,6 +58,8 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
58
58
  readonly notification?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
59
59
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
60
60
  } | undefined;
61
+ readonly optionsQuery?: string;
62
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
61
63
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
62
64
  required: true;
63
65
  };
@@ -154,6 +156,8 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
154
156
  readonly mjml?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
155
157
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
156
158
  } | undefined;
159
+ readonly optionsQuery?: string;
160
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
157
161
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
158
162
  required: true;
159
163
  };
@@ -218,6 +222,8 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
218
222
  readonly notification?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
219
223
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
220
224
  } | undefined;
225
+ readonly optionsQuery?: string;
226
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
221
227
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
222
228
  required: true;
223
229
  };
@@ -314,6 +320,8 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
314
320
  readonly mjml?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
315
321
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
316
322
  } | undefined;
323
+ readonly optionsQuery?: string;
324
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
317
325
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
318
326
  required: true;
319
327
  };
@@ -64,6 +64,8 @@ export declare const tenantInvitationEntity: import("@cosmicdrift/kumiko-types/f
64
64
  readonly expired?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
65
65
  readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
66
66
  } | undefined;
67
+ readonly optionsQuery?: string;
68
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
67
69
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
68
70
  required: true;
69
71
  };
@@ -161,6 +163,8 @@ export declare const tenantInvitationsTable: import("@cosmicdrift/kumiko-framewo
161
163
  readonly expired?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
162
164
  readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
163
165
  } | undefined;
166
+ readonly optionsQuery?: string;
167
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
164
168
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
165
169
  required: true;
166
170
  };
@@ -62,6 +62,8 @@ export declare const tenantEntity: import("@cosmicdrift/kumiko-types/fields").En
62
62
  readonly destroyed?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
63
63
  readonly destroying?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
64
64
  } | undefined;
65
+ readonly optionsQuery?: string;
66
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
65
67
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
66
68
  required: true;
67
69
  };
@@ -208,6 +210,8 @@ export declare const tenantTable: import("@cosmicdrift/kumiko-framework/db").Ent
208
210
  readonly destroyed?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
209
211
  readonly destroying?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
210
212
  } | undefined;
213
+ readonly optionsQuery?: string;
214
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
211
215
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
212
216
  required: true;
213
217
  };
@@ -158,6 +158,8 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
158
158
  readonly deletionRequested?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
159
159
  readonly restricted?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
160
160
  } | undefined;
161
+ readonly optionsQuery?: string;
162
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
161
163
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
162
164
  required: true;
163
165
  };
@@ -328,6 +330,8 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
328
330
  readonly deletionRequested?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
329
331
  readonly restricted?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
330
332
  } | undefined;
333
+ readonly optionsQuery?: string;
334
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
331
335
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
332
336
  required: true;
333
337
  };
@@ -70,6 +70,8 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
70
70
  readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
71
71
  readonly running?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
72
72
  } | undefined;
73
+ readonly optionsQuery?: string;
74
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
73
75
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
74
76
  required: true;
75
77
  };
@@ -240,6 +242,8 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
240
242
  readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
241
243
  readonly running?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
242
244
  } | undefined;
245
+ readonly optionsQuery?: string;
246
+ readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
243
247
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
244
248
  required: true;
245
249
  };
@@ -31,7 +31,11 @@ export function ConfirmAccountDeletionScreen({ title, }) {
31
31
  setPhase("error");
32
32
  }
33
33
  };
34
- return (_jsx(Card, { className: "w-full max-w-sm mx-auto", options: { padded: false }, slots: {
34
+ return (_jsx(Card
35
+ // kumiko-lint-ignore primitives-discipline narrow centered confirmation card, not a screen container
36
+ , {
37
+ // kumiko-lint-ignore primitives-discipline narrow centered confirmation card, not a screen container
38
+ className: "w-full max-w-sm mx-auto", options: { padded: false }, slots: {
35
39
  header: (_jsx("div", { className: "flex flex-col space-y-1.5 p-6 pb-4", children: _jsx("h1", { className: "text-xl font-semibold tracking-tight", children: title ?? t("userDataRights.deletion.confirm.title") }) })),
36
40
  }, children: _jsx("div", { className: "p-6 pt-0 flex flex-col gap-4", children: phase === "success" ? (_jsxs(Banner, { variant: "info", children: [_jsx("p", { className: "font-medium text-foreground", children: t("userDataRights.deletion.confirm.successTitle") }), _jsx("p", { className: "mt-1", children: t("userDataRights.deletion.confirm.successBody") })] })) : phase === "missing" ? (_jsx(Banner, { variant: "error", children: t("userDataRights.deletion.confirm.missingToken") })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-sm text-muted-foreground", children: t("userDataRights.deletion.confirm.intro") }), phase === "invalid" && (_jsx(Banner, { variant: "error", children: t("userDataRights.deletion.confirm.invalidToken") })), phase === "error" && (_jsx(Banner, { variant: "error", children: t("userDataRights.deletion.confirm.error") })), _jsx(Button, { type: "button", variant: "danger", loading: phase === "submitting", disabled: phase === "submitting", onClick: () => void doConfirm(), children: phase === "submitting"
37
41
  ? t("userDataRights.deletion.confirm.submitting")
@@ -41,7 +41,11 @@ export function RequestAccountDeletionScreen({ title, }) {
41
41
  e?.preventDefault();
42
42
  void doSubmit();
43
43
  };
44
- return (_jsx(Card, { className: "w-full max-w-sm mx-auto", options: { padded: false }, slots: {
44
+ return (_jsx(Card
45
+ // kumiko-lint-ignore primitives-discipline narrow centered confirmation card, not a screen container
46
+ , {
47
+ // kumiko-lint-ignore primitives-discipline narrow centered confirmation card, not a screen container
48
+ className: "w-full max-w-sm mx-auto", options: { padded: false }, slots: {
45
49
  header: (_jsx("div", { className: "flex flex-col space-y-1.5 p-6 pb-4", children: _jsx("h1", { className: "text-xl font-semibold tracking-tight", children: title ?? t("userDataRights.deletion.request.title") }) })),
46
50
  }, children: done ? (_jsx("div", { className: "p-6 pt-0", children: _jsxs(Banner, { variant: "info", children: [_jsx("p", { className: "font-medium text-foreground", children: t("userDataRights.deletion.request.successTitle") }), _jsx("p", { className: "mt-1", children: t("userDataRights.deletion.request.successBody") })] }) })) : (_jsxs("div", { className: "p-6 pt-0 flex flex-col gap-4", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: t("userDataRights.deletion.request.intro") }), _jsxs(Form, { onSubmit: onSubmit, children: [_jsx(Field, { id: "delete-email", label: t("userDataRights.deletion.request.email"), required: true, children: _jsx(Input, { kind: "text", id: "delete-email", name: "delete-email", value: email, onChange: setEmail, disabled: submitting, required: true }) }), error !== null && _jsx(Banner, { variant: "error", children: error }), _jsx(Button, { type: "submit", loading: submitting, disabled: submitting, children: submitting
47
51
  ? t("userDataRights.deletion.request.submitting")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-bundled-features",
3
- "version": "0.330.2",
3
+ "version": "0.331.0",
4
4
  "description": "Built-in features — tenant, user, auth, delivery. The stuff you'd rewrite anyway, already typed.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -483,12 +483,12 @@
483
483
  }
484
484
  },
485
485
  "dependencies": {
486
- "@cosmicdrift/kumiko-dispatcher-live": "0.330.2",
487
- "@cosmicdrift/kumiko-framework": "0.330.2",
488
- "@cosmicdrift/kumiko-headless": "0.330.2",
489
- "@cosmicdrift/kumiko-renderer": "0.330.2",
490
- "@cosmicdrift/kumiko-renderer-web": "0.330.2",
491
- "@cosmicdrift/kumiko-types": "0.330.2",
486
+ "@cosmicdrift/kumiko-dispatcher-live": "0.331.0",
487
+ "@cosmicdrift/kumiko-framework": "0.331.0",
488
+ "@cosmicdrift/kumiko-headless": "0.331.0",
489
+ "@cosmicdrift/kumiko-renderer": "0.331.0",
490
+ "@cosmicdrift/kumiko-renderer-web": "0.331.0",
491
+ "@cosmicdrift/kumiko-types": "0.331.0",
492
492
  "@mollie/api-client": "^4.5.0",
493
493
  "@node-rs/argon2": "^2.0.2",
494
494
  "@types/mailparser": "^3.4.6",
@@ -983,8 +983,8 @@
983
983
  ],
984
984
  "devDependencies": {
985
985
  "@testing-library/user-event": "^14.6.1",
986
- "@cosmicdrift/kumiko-locale-de": "0.330.2",
987
- "@cosmicdrift/kumiko-locale-es": "0.330.2",
986
+ "@cosmicdrift/kumiko-locale-de": "0.331.0",
987
+ "@cosmicdrift/kumiko-locale-es": "0.331.0",
988
988
  "jsqr": "^1.4.0"
989
989
  }
990
990
  }
@@ -1,4 +1,11 @@
1
1
  [
2
+ {
3
+ "version": "0.331.0",
4
+ "type": "improvement",
5
+ "title": "Ledger schedules get an optional filterable sourceRef field",
6
+ "detail": "`read_ledger_schedules` gets a nullable text column `source_ref` (max 128) plus the non-unique index `(tenant_id, source_ref)`. Callers set it on `createSchedule` / `updateSchedule` to find a schedule again without parsing `description`. Existing schedules keep `sourceRef = null`.",
7
+ "migration": "Run `kumiko schema generate`. For a new nullable column and a new non-unique index on a managed projection it emits an in-place `ALTER TABLE \"read_ledger_schedules\" ADD COLUMN \"source_ref\" text` plus a `CREATE INDEX`, with no DROP/CREATE and no `.rebuild.json`. No backfill: do not write the column with SQL. Old schedules stay at `sourceRef = null`, so callers should fall back to their previous lookup key for them."
8
+ },
2
9
  {
3
10
  "version": "0.320.0",
4
11
  "type": "breaking",