@cosmicdrift/kumiko-bundled-features 0.373.0 → 0.377.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 (215) hide show
  1. package/dist/account-security/constants.d.ts +1 -0
  2. package/dist/account-security/constants.js +1 -0
  3. package/dist/account-security/index.d.ts +1 -1
  4. package/dist/account-security/index.js +1 -1
  5. package/dist/admin-shell/web/client-plugin.d.ts +1 -1
  6. package/dist/audit/web/client-plugin.d.ts +1 -1
  7. package/dist/auth-email-password/i18n.js +1 -0
  8. package/dist/auth-email-password/mail-notifications.js +1 -1
  9. package/dist/auth-email-password/web/auth-client.js +1 -1
  10. package/dist/auth-email-password/web/auth-form-primitives.js +1 -1
  11. package/dist/auth-email-password/web/client-actions.d.ts +2 -0
  12. package/dist/auth-email-password/web/client-actions.js +23 -0
  13. package/dist/auth-email-password/web/client-plugin.d.ts +2 -1
  14. package/dist/auth-email-password/web/client-plugin.js +2 -0
  15. package/dist/auth-email-password/web/default-topbar-actions.js +1 -1
  16. package/dist/auth-email-password/web/index.js +1 -1
  17. package/dist/auth-email-password/web/session.js +1 -1
  18. package/dist/auth-email-password/web/tenant-menu-items.js +1 -1
  19. package/dist/auth-email-password/web/tenant-switcher.js +1 -1
  20. package/dist/auth-email-password/web/user-menu.js +1 -1
  21. package/dist/auth-foundation/env.d.ts +9 -0
  22. package/dist/auth-foundation/env.js +21 -0
  23. package/dist/auth-foundation/index.d.ts +1 -0
  24. package/dist/auth-foundation/index.js +1 -0
  25. package/dist/auth-mfa/schema/user-mfa.d.ts +6 -6
  26. package/dist/billing-foundation/consumer-protection/confirmation-mail.js +1 -1
  27. package/dist/billing-foundation/consumer-protection/termination-pages.js +1 -1
  28. package/dist/billing-foundation/contact-card.d.ts +2 -0
  29. package/dist/billing-foundation/contact-card.js +16 -0
  30. package/dist/billing-foundation/entities.d.ts +8 -8
  31. package/dist/billing-foundation/handlers/billing-plans.query.js +1 -1
  32. package/dist/billing-foundation/index.d.ts +1 -1
  33. package/dist/billing-foundation/plan-catalog.js +1 -0
  34. package/dist/billing-foundation/projection.d.ts +8 -8
  35. package/dist/billing-foundation/types.d.ts +11 -0
  36. package/dist/billing-foundation/validate-options.js +13 -0
  37. package/dist/billing-foundation/web/billing-contact-plan.d.ts +5 -0
  38. package/dist/billing-foundation/web/billing-contact-plan.js +17 -0
  39. package/dist/billing-foundation/web/billing-plans-panel.js +5 -13
  40. package/dist/billing-foundation/web/cancel-contract-dialog.js +2 -2
  41. package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +1 -1
  42. package/dist/billing-foundation/web/checkout-consent-dialog.js +1 -0
  43. package/dist/billing-foundation/web/client-plugin.d.ts +1 -1
  44. package/dist/billing-foundation/web/localized-params.d.ts +1 -0
  45. package/dist/billing-foundation/web/localized-params.js +11 -0
  46. package/dist/cap-counter/entity.d.ts +1 -1
  47. package/dist/cap-overview/handlers/tenant-caps-list.query.d.ts +9 -4
  48. package/dist/cap-overview/handlers/tenant-caps-list.query.js +14 -61
  49. package/dist/cap-overview/i18n.js +0 -2
  50. package/dist/cap-overview/web/cap-cards-panel.js +3 -3
  51. package/dist/cap-overview/web/client-plugin.d.ts +1 -1
  52. package/dist/channel-email/email-channel.d.ts +2 -1
  53. package/dist/compliance-profiles/web/client-plugin.d.ts +1 -1
  54. package/dist/config/feature.js +2 -2
  55. package/dist/config/table.d.ts +6 -6
  56. package/dist/custom-fields/entity.d.ts +4 -4
  57. package/dist/custom-fields/web/client-plugin.d.ts +1 -1
  58. package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -4
  59. package/dist/delivery/tables.d.ts +6 -6
  60. package/dist/delivery/unsubscribe-page.js +1 -1
  61. package/dist/delivery/web/client-plugin.d.ts +1 -1
  62. package/dist/delivery/web/delivery-status-cell.js +1 -1
  63. package/dist/document-ingest-foundation/entity.d.ts +4 -4
  64. package/dist/feature-toggles/web/client-plugin.d.ts +1 -1
  65. package/dist/file-provider-s3/env-named-feature.d.ts +17 -0
  66. package/dist/file-provider-s3/env-named-feature.js +23 -0
  67. package/dist/file-provider-s3/env-schema.d.ts +7 -0
  68. package/dist/file-provider-s3/env-schema.js +15 -10
  69. package/dist/file-provider-s3/index.d.ts +1 -0
  70. package/dist/file-provider-s3/index.js +1 -0
  71. package/dist/folders/entity.d.ts +8 -8
  72. package/dist/folders/web/client-plugin.d.ts +1 -1
  73. package/dist/form-draft/entity.d.ts +2 -2
  74. package/dist/host-routing/constants.d.ts +2 -0
  75. package/dist/host-routing/constants.js +3 -0
  76. package/dist/host-routing/dispatch.d.ts +1 -1
  77. package/dist/host-routing/dispatch.js +35 -25
  78. package/dist/host-routing/feature.js +100 -27
  79. package/dist/host-routing/host.d.ts +9 -0
  80. package/dist/host-routing/host.js +24 -2
  81. package/dist/host-routing/index.d.ts +2 -1
  82. package/dist/host-routing/index.js +1 -0
  83. package/dist/host-routing/options.d.ts +14 -0
  84. package/dist/host-routing/redirects.d.ts +6 -0
  85. package/dist/host-routing/redirects.js +27 -0
  86. package/dist/host-routing/tenant-lookup.d.ts +7 -0
  87. package/dist/host-routing/tenant-lookup.js +39 -0
  88. package/dist/host-routing/validate-options.js +34 -1
  89. package/dist/inbound-mail-foundation/entities.d.ts +25 -25
  90. package/dist/inbound-mail-foundation/feature.js +7 -0
  91. package/dist/inbound-mail-foundation/i18n.d.ts +3 -0
  92. package/dist/inbound-mail-foundation/i18n.js +35 -0
  93. package/dist/inbound-mail-foundation/index.d.ts +1 -0
  94. package/dist/inbound-mail-foundation/index.js +1 -0
  95. package/dist/inbound-mail-foundation/projection.d.ts +20 -20
  96. package/dist/inbound-mail-foundation/screens.d.ts +7 -0
  97. package/dist/inbound-mail-foundation/screens.js +86 -0
  98. package/dist/inbound-mail-foundation/types.d.ts +2 -2
  99. package/dist/jobs/job-run-table.d.ts +6 -6
  100. package/dist/jobs/web/client-plugin.d.ts +1 -1
  101. package/dist/ledger/entity.d.ts +13 -13
  102. package/dist/legal-pages/feature.js +11 -1
  103. package/dist/legal-pages/layout.d.ts +2 -2
  104. package/dist/legal-pages/layout.js +4 -4
  105. package/dist/legal-pages/web/client-plugin.d.ts +1 -1
  106. package/dist/mail-foundation/feature.d.ts +20 -21
  107. package/dist/mail-foundation/feature.js +1 -1
  108. package/dist/managed-pages/table.d.ts +12 -12
  109. package/dist/managed-pages/web/client-plugin.d.ts +1 -1
  110. package/dist/notes-history/entity.d.ts +12 -12
  111. package/dist/notes-history/web/client-plugin.d.ts +1 -1
  112. package/dist/page-render/branding.js +1 -1
  113. package/dist/page-render/layout.d.ts +1 -1
  114. package/dist/page-render/layout.js +2 -2
  115. package/dist/page-render/markdown.js +1 -1
  116. package/dist/personal-access-tokens/i18n.js +1 -1
  117. package/dist/personal-access-tokens/schema/api-token.d.ts +6 -6
  118. package/dist/personal-access-tokens/screens.js +1 -1
  119. package/dist/secrets/feature.d.ts +1 -1
  120. package/dist/secrets/feature.js +3 -3
  121. package/dist/secrets/table.d.ts +1 -1
  122. package/dist/seo/sitemap.js +1 -1
  123. package/dist/sessions/schema/user-session.d.ts +4 -4
  124. package/dist/shared/mail-template-body.js +1 -1
  125. package/dist/shared/purge-files-reaching-subject.js +98 -3
  126. package/dist/tags/entity.d.ts +9 -9
  127. package/dist/tags/web/client-plugin.d.ts +1 -1
  128. package/dist/template-resolver/document-blocks.d.ts +5 -0
  129. package/dist/template-resolver/document-blocks.js +21 -0
  130. package/dist/template-resolver/document-ops.d.ts +167 -0
  131. package/dist/template-resolver/document-ops.js +390 -0
  132. package/dist/template-resolver/document-sanitizer.d.ts +3 -0
  133. package/dist/template-resolver/document-sanitizer.js +6 -0
  134. package/dist/template-resolver/feature.d.ts +2 -0
  135. package/dist/template-resolver/feature.js +4 -0
  136. package/dist/template-resolver/handlers/bundle-import.js +1 -0
  137. package/dist/template-resolver/handlers/document-base.d.ts +23 -0
  138. package/dist/template-resolver/handlers/document-base.js +55 -0
  139. package/dist/template-resolver/handlers/document-blocks.query.d.ts +22 -0
  140. package/dist/template-resolver/handlers/document-blocks.query.js +46 -0
  141. package/dist/template-resolver/handlers/export-bundle.query.d.ts +1 -0
  142. package/dist/template-resolver/handlers/export-bundle.query.js +9 -2
  143. package/dist/template-resolver/handlers/import-bundle-system.write.d.ts +1 -0
  144. package/dist/template-resolver/handlers/import-bundle.write.d.ts +1 -0
  145. package/dist/template-resolver/handlers/patch-draft.write.d.ts +66 -0
  146. package/dist/template-resolver/handlers/patch-draft.write.js +105 -0
  147. package/dist/template-resolver/handlers/preview.query.d.ts +1 -0
  148. package/dist/template-resolver/handlers/preview.query.js +2 -1
  149. package/dist/template-resolver/handlers/send-test.write.d.ts +1 -0
  150. package/dist/template-resolver/handlers/send-test.write.js +2 -1
  151. package/dist/template-resolver/handlers/template-write.d.ts +2 -0
  152. package/dist/template-resolver/handlers/template-write.js +14 -2
  153. package/dist/template-resolver/handlers/validate.query.d.ts +10 -4
  154. package/dist/template-resolver/handlers/validate.query.js +12 -7
  155. package/dist/template-resolver/{web/placeholder-text.js → placeholder-text.js} +1 -1
  156. package/dist/template-resolver/qualified-names.d.ts +2 -0
  157. package/dist/template-resolver/qualified-names.js +2 -0
  158. package/dist/template-resolver/seeding.d.ts +1 -0
  159. package/dist/template-resolver/seeding.js +2 -1
  160. package/dist/template-resolver/table.d.ts +10 -10
  161. package/dist/template-resolver/template-bundle.d.ts +1 -0
  162. package/dist/template-resolver/template-bundle.js +6 -1
  163. package/dist/template-resolver/template-preview.d.ts +4 -1
  164. package/dist/template-resolver/template-preview.js +16 -3
  165. package/dist/template-resolver/template-validation.d.ts +2 -1
  166. package/dist/template-resolver/template-validation.js +1 -1
  167. package/dist/template-resolver/user-content-table.d.ts +10 -10
  168. package/dist/template-resolver/web/client-plugin.d.ts +1 -1
  169. package/dist/template-resolver/web/client-plugin.js +3 -3
  170. package/dist/template-resolver/web/document-tiptap-editor.js +1 -1
  171. package/dist/template-resolver/web/document-toolbar-blocks.d.ts +2 -5
  172. package/dist/template-resolver/web/document-toolbar-blocks.js +1 -21
  173. package/dist/template-resolver/web/i18n.js +14 -0
  174. package/dist/template-resolver/web/placeholder-line-editor.js +2 -2
  175. package/dist/tenant/invitation-table.d.ts +6 -6
  176. package/dist/tenant/membership-table.d.ts +4 -4
  177. package/dist/tenant/schema/tenant.d.ts +6 -6
  178. package/dist/tenant/web/client-plugin.d.ts +1 -1
  179. package/dist/tenant/web/member-status-cell.js +1 -1
  180. package/dist/tier-engine/entity.d.ts +1 -1
  181. package/dist/tier-engine/tier-resolver.d.ts +1 -1
  182. package/dist/tier-engine/web/client-plugin.d.ts +1 -1
  183. package/dist/user/schema/user.d.ts +12 -12
  184. package/dist/user-data-rights/env.d.ts +5 -0
  185. package/dist/user-data-rights/env.js +11 -0
  186. package/dist/user-data-rights/feature.js +4 -2
  187. package/dist/user-data-rights/index.d.ts +1 -0
  188. package/dist/user-data-rights/index.js +1 -0
  189. package/dist/user-data-rights/lib/mail-transport-resolver.js +1 -1
  190. package/dist/user-data-rights/lib/storage-provider-resolver.js +1 -1
  191. package/dist/user-data-rights/mail-notifications.js +1 -1
  192. package/dist/user-data-rights/schema/download-attempt.d.ts +14 -14
  193. package/dist/user-data-rights/schema/download-token.d.ts +8 -8
  194. package/dist/user-data-rights/schema/export-job.d.ts +6 -6
  195. package/dist/user-data-rights/web/client-plugin.d.ts +1 -1
  196. package/dist/user-data-rights/web/privacy-center-screen.js +2 -2
  197. package/dist/waitlist/entity.d.ts +14 -14
  198. package/dist/waitlist/legacy-migrate.d.ts +2 -0
  199. package/dist/waitlist/legacy-migrate.js +38 -3
  200. package/package.json +16 -11
  201. package/src/account-security/changes.json +6 -0
  202. package/src/auth-email-password/changes.json +6 -0
  203. package/src/auth-foundation/changes.json +6 -0
  204. package/src/billing-foundation/changes.json +6 -0
  205. package/src/cap-overview/changes.json +7 -0
  206. package/src/channel-email/changes.json +6 -0
  207. package/src/crypto-shredding/changes.json +6 -0
  208. package/src/file-provider-s3/changes.json +6 -0
  209. package/src/host-routing/changes.json +6 -0
  210. package/src/inbound-mail-foundation/changes.json +7 -0
  211. package/src/legal-pages/changes.json +6 -0
  212. package/src/template-resolver/changes.json +18 -0
  213. package/src/user-data-rights/changes.json +6 -0
  214. package/src/waitlist/changes.json +6 -0
  215. /package/dist/template-resolver/{web/placeholder-text.d.ts → placeholder-text.d.ts} +0 -0
@@ -1,12 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // @runtime client
3
- import { toInstant } from "@cosmicdrift/kumiko-headless";
4
3
  import { useLocale, useMutation, usePrimitives, useQuery, useTranslation, } from "@cosmicdrift/kumiko-renderer";
5
- import { formatMoney, PlanCard, PlanGrid, } from "@cosmicdrift/kumiko-renderer-web";
4
+ import { toInstant } from "@cosmicdrift/kumiko-renderer/headless";
5
+ import { formatMoney, PlanCard, PlanGrid, } from "@cosmicdrift/kumiko-renderer/web";
6
6
  import { useState } from "react";
7
7
  import { BillingPlanActions, SubscriptionFoundationHandlers, SubscriptionFoundationQueries, SubscriptionStatuses, } from "../constants.js";
8
+ import { BillingContactPlan } from "./billing-contact-plan.js";
8
9
  import { CancelContractDialog } from "./cancel-contract-dialog.js";
9
10
  import { CheckoutConsentDialog } from "./checkout-consent-dialog.js";
11
+ import { localizedParams } from "./localized-params.js";
10
12
  function intervalKey(price) {
11
13
  if (price === null || price.interval === null)
12
14
  return undefined;
@@ -21,16 +23,6 @@ function renewalKey(price) {
21
23
  ? `billing-foundation.consent.renewsEvery.${price.interval}`
22
24
  : `billing-foundation.consent.renews.${price.interval}`;
23
25
  }
24
- function localizedParams(params, locale) {
25
- if (params === undefined)
26
- return undefined;
27
- const localized = {};
28
- for (const [key, value] of Object.entries(params)) {
29
- localized[key] =
30
- typeof value === "number" ? new Intl.NumberFormat(locale).format(value) : value;
31
- }
32
- return localized;
33
- }
34
26
  /** Which action the plan "would" offer if it weren't blocked — mirrors
35
27
  * plan-catalog.ts's own decision tree, since `unavailable` collapses both
36
28
  * "would checkout" and "would switch" into one action and the disabled CTA
@@ -189,7 +181,7 @@ export function BillingPlansPanel(_props) {
189
181
  date: toInstant(result.subscription.cancelAt).toLocaleString(locale, {
190
182
  dateStyle: "medium",
191
183
  }),
192
- }), " ", t("billing-foundation.plans.switchRequiresReactivation")] })), consumerProtection !== undefined && canManage && result.subscription?.cancelAt == null && (_jsx("div", { children: _jsx(Button, { variant: "secondary", onClick: () => setCancelOpen(true), testId: "billing-plans-cancel-contract", children: t("billing-foundation.cancel.open") }) })), _jsxs(PlanGrid, { testId: "billing-plans-grid", children: [!currentTierInPlans && (_jsx(PlanCard, { title: t(result.currentTier.labelKey), current: true, testId: "billing-plan-card-current", features: result.currentTier.benefits.map((benefit) => t(benefit.labelKey, localizedParams(benefit.params, locale))), secondaryAction: manageOrReactivateAction(canManage, result.subscription, t, handleManage, redirecting) })), visiblePlans.map((plan) => (_jsx(PlanCard, { testId: `billing-plan-card-${plan.tier}`, ...toCardProps(plan) }, plan.tier)))] }), consumerProtection !== undefined &&
184
+ }), " ", t("billing-foundation.plans.switchRequiresReactivation")] })), consumerProtection !== undefined && canManage && result.subscription?.cancelAt == null && (_jsx("div", { children: _jsx(Button, { variant: "secondary", onClick: () => setCancelOpen(true), testId: "billing-plans-cancel-contract", children: t("billing-foundation.cancel.open") }) })), _jsxs(PlanGrid, { testId: "billing-plans-grid", children: [!currentTierInPlans && (_jsx(PlanCard, { title: t(result.currentTier.labelKey), current: true, testId: "billing-plan-card-current", features: result.currentTier.benefits.map((benefit) => t(benefit.labelKey, localizedParams(benefit.params, locale))), secondaryAction: manageOrReactivateAction(canManage, result.subscription, t, handleManage, redirecting) })), visiblePlans.map((plan) => (_jsx(PlanCard, { testId: `billing-plan-card-${plan.tier}`, ...toCardProps(plan) }, plan.tier))), result.contact !== undefined && _jsx(BillingContactPlan, { contact: result.contact })] }), consumerProtection !== undefined &&
193
185
  consentPlan !== undefined &&
194
186
  consentPlan.price !== null && (_jsx(CheckoutConsentDialog, { open: true, onOpenChange: (open) => {
195
187
  if (!open)
@@ -1,8 +1,8 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // @runtime client
3
- import { toInstant } from "@cosmicdrift/kumiko-headless";
4
3
  import { useLocale, useMutation, usePrimitives, useTranslation, } from "@cosmicdrift/kumiko-renderer";
5
- import { ModeSwitch } from "@cosmicdrift/kumiko-renderer-web";
4
+ import { toInstant } from "@cosmicdrift/kumiko-renderer/headless";
5
+ import { ModeSwitch } from "@cosmicdrift/kumiko-renderer/web";
6
6
  import { useState } from "react";
7
7
  import { SubscriptionFoundationHandlers } from "../constants.js";
8
8
  const DECLARATION_TYPES = [
@@ -1,4 +1,4 @@
1
- import type { WriteResult } from "@cosmicdrift/kumiko-headless";
1
+ import type { WriteResult } from "@cosmicdrift/kumiko-renderer/headless";
2
2
  import { type ReactNode } from "react";
3
3
  import type { BillingPlansResult } from "../types.ts";
4
4
  export declare const CONSENT_TEXT_OUTDATED_CODE = "consent_text_outdated";
@@ -1,4 +1,5 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // @runtime client
2
3
  import { useLocale, usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
3
4
  import { useState } from "react";
4
5
  import { resolveConsentLocale } from "../consumer-protection/consent-locale.js";
@@ -1,5 +1,5 @@
1
1
  import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
2
- import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer-web";
2
+ import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
3
3
  export type BillingFoundationClientOptions = {
4
4
  readonly translations?: TranslationsByLocale;
5
5
  };
@@ -0,0 +1 @@
1
+ export declare function localizedParams(params: Readonly<Record<string, string | number>> | undefined, locale: string): Readonly<Record<string, string>> | undefined;
@@ -0,0 +1,11 @@
1
+ // @runtime client
2
+ export function localizedParams(params, locale) {
3
+ if (params === undefined)
4
+ return undefined;
5
+ const localized = {};
6
+ for (const [key, value] of Object.entries(params)) {
7
+ localized[key] =
8
+ typeof value === "number" ? new Intl.NumberFormat(locale).format(value) : value;
9
+ }
10
+ return localized;
11
+ }
@@ -13,7 +13,7 @@ export declare const capCounterEntity: import("@cosmicdrift/kumiko-types/fields"
13
13
  readonly sensitive?: boolean;
14
14
  readonly writeOnly?: boolean;
15
15
  readonly readAsInstruction?: boolean;
16
- readonly format?: "email" | "url" | "phone" | "password";
16
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
17
17
  readonly default?: string;
18
18
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
19
19
  readonly multiline?: boolean | {
@@ -8,14 +8,20 @@ type TenantCapsListRow = {
8
8
  readonly [capField: string]: unknown;
9
9
  };
10
10
  export declare function createTenantCapsListQuery(caps: readonly CapSpec[], listCaps: readonly string[]): import("@cosmicdrift/kumiko-framework/engine").PagedQueryHandlerDefinition<"tenant-caps:list", z.ZodObject<{
11
- cursor: z.ZodOptional<z.ZodString>;
12
11
  limit: z.ZodDefault<z.ZodNumber>;
13
- sort: z.ZodOptional<z.ZodString>;
12
+ offset: z.ZodOptional<z.ZodNumber>;
13
+ search: z.ZodOptional<z.ZodString>;
14
+ sort: z.ZodOptional<z.ZodEnum<{
15
+ billing: "billing";
16
+ name: "name";
17
+ tier: "tier";
18
+ }>>;
14
19
  sortDirection: z.ZodOptional<z.ZodEnum<{
15
20
  asc: "asc";
16
21
  desc: "desc";
17
22
  }>>;
18
- search: z.ZodOptional<z.ZodString>;
23
+ totalCount: z.ZodOptional<z.ZodBoolean>;
24
+ cursor: z.ZodOptional<z.ZodNever>;
19
25
  filters: z.ZodOptional<z.ZodArray<z.ZodObject<{
20
26
  field: z.ZodString;
21
27
  op: z.ZodEnum<{
@@ -27,6 +33,5 @@ export declare function createTenantCapsListQuery(caps: readonly CapSpec[], list
27
33
  }>;
28
34
  value: z.ZodUnknown;
29
35
  }, z.core.$strip>>>;
30
- totalCount: z.ZodOptional<z.ZodBoolean>;
31
36
  }, z.core.$strip>, TenantCapsListRow, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
32
37
  export {};
@@ -1,7 +1,6 @@
1
- import { buildEntityTable, decodeCursor, encodeCursor, selectMany, } from "@cosmicdrift/kumiko-framework/db";
2
- import { definePagedQueryHandler, MAX_LIST_LIMIT, } from "@cosmicdrift/kumiko-framework/engine";
1
+ import { buildEntityTable, selectMany } from "@cosmicdrift/kumiko-framework/db";
2
+ import { definePagedQueryHandler, pagedListSchema, pageRows, } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import { InternalError, ValidationError } from "@cosmicdrift/kumiko-framework/errors";
4
- import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
5
4
  import * as z from "zod";
6
5
  import { subscriptionsProjectionTable } from "../../billing-foundation/index.js";
7
6
  import { decryptTenantNames, tenantTable } from "../../tenant/index.js";
@@ -33,9 +32,6 @@ async function resolveLimitsByTenantAndCap(caps, tenants, configFor) {
33
32
  }));
34
33
  return new Map(entries);
35
34
  }
36
- function isSortableField(field) {
37
- return isOneOf(SORTABLE_FIELDS, field);
38
- }
39
35
  // tier is a plain string with no defined ordering — lt/gt have no meaning
40
36
  // on it and are rejected rather than silently treated as "no filter".
41
37
  function assertSupportedTierFilterOp(op) {
@@ -93,16 +89,10 @@ export function createTenantCapsListQuery(caps, listCaps) {
93
89
  return definePagedQueryHandler({
94
90
  name: "tenant-caps:list",
95
91
  description: "Lists every tenant on the platform with its tier, billing provider/status and per-cap usage, paged, searchable by name and filterable by tier; use it as the operator-wide capacity overview.",
96
- schema: z.object({
97
- cursor: z.string().optional(),
98
- limit: z.number().int().min(1).max(MAX_LIST_LIMIT).default(50),
99
- sort: z.string().optional(),
100
- sortDirection: z.enum(["asc", "desc"]).optional(),
101
- search: z.string().optional(),
92
+ schema: pagedListSchema(SORTABLE_FIELDS).extend({
102
93
  filters: z
103
94
  .array(z.object({ field: z.string(), op: FILTER_OP, value: z.unknown() }))
104
95
  .optional(),
105
- totalCount: z.boolean().optional(),
106
96
  }),
107
97
  access: { roles: ["SystemAdmin"] },
108
98
  escapeHatch: {
@@ -122,60 +112,28 @@ export function createTenantCapsListQuery(caps, listCaps) {
122
112
  const subscriptions = await selectMany(db, subscriptionsProjectionTable, {});
123
113
  const assignmentByTenant = new Map(assignments.map((row) => [row.tenantId, row]));
124
114
  const subscriptionByTenant = new Map(subscriptions.map((row) => [row.tenantId, row]));
125
- // Case-insensitive substring search has no `ilike` operator in the
126
- // query builder (only `like`, SQL-LIKE case-sensitive) — filtered here
127
- // in JS, same as tenant/team-list.query.ts's search.
128
- const search = query.payload.search?.trim().toLowerCase();
129
115
  const tierFilter = extractTierFilter(query.payload.filters ?? []);
130
116
  const merged = tenants
131
- .filter((tenant) => search === undefined || search === "" || tenant.name.toLowerCase().includes(search))
132
117
  .map((tenant) => {
133
118
  const assignment = assignmentByTenant.get(tenant.id);
134
119
  return {
120
+ id: tenant.id,
135
121
  tenantId: tenant.id,
136
122
  name: tenant.name,
137
123
  tier: assignment?.tier ?? "",
138
- source: assignment?.source ?? null,
139
124
  billing: billingLabel(subscriptionByTenant.get(tenant.id), assignment?.source ?? null),
140
125
  };
141
126
  })
142
127
  .filter((row) => matchesTierFilter(row.tier, tierFilter));
143
- const sortField = query.payload.sort ?? "name";
144
- if (!isSortableField(sortField)) {
145
- throw new ValidationError({
146
- fields: [
147
- {
148
- path: "sort",
149
- code: "unsupported_field",
150
- i18nKey: "cap-overview.errors.sortFieldUnsupported",
151
- params: { field: sortField },
152
- },
153
- ],
154
- });
155
- }
156
- const sortDirection = query.payload.sortDirection ?? "asc";
157
- const directionMultiplier = sortDirection === "asc" ? 1 : -1;
158
- const sorted = [...merged].sort((a, b) => a[sortField].localeCompare(b[sortField]) * directionMultiplier);
159
- // ponytail: base64-wrapped offset, not a SQL keyset — rows come from a
160
- // JS merge of three tables (tenant/tier-assignment/subscription), same
161
- // rationale as tenant/team-list.query.ts. Holds up to tier-engine's
162
- // documented "single-pass scan" scale (a few thousand tenants); past
163
- // that the fix is a real combined read-projection, not a cursor
164
- // bolted onto this merge.
165
- const offset = query.payload.cursor ? Number(decodeCursor(query.payload.cursor)) : 0;
166
- if (!Number.isInteger(offset) || offset < 0) {
167
- throw new ValidationError({
168
- fields: [
169
- {
170
- path: "cursor",
171
- code: "invalid_cursor",
172
- i18nKey: "cap-overview.errors.invalidCursor",
173
- },
174
- ],
175
- });
176
- }
177
- const limit = query.payload.limit;
178
- const page = sorted.slice(offset, offset + limit);
128
+ // Search and paging run in memory because the rows are a JS merge of
129
+ // three tables (tenant/tier-assignment/subscription), same rationale as
130
+ // tenant/team-list.query.ts. Holds up to tier-engine's documented
131
+ // "single-pass scan" scale (a few thousand tenants); past that the fix
132
+ // is a real combined read-projection.
133
+ const { rows: page, total } = pageRows(merged, query.payload, {
134
+ searchFields: ["name"],
135
+ defaultSort: "name",
136
+ });
179
137
  // Usage is computed only for this page's tenant ids, never for the
180
138
  // full tenant set; caps without usageBatch still cost one query per
181
139
  // tenant of the page, so those run in parallel.
@@ -212,12 +170,7 @@ export function createTenantCapsListQuery(caps, listCaps) {
212
170
  ...capFields,
213
171
  };
214
172
  });
215
- const nextCursor = offset + limit < sorted.length ? encodeCursor(String(offset + limit)) : null;
216
- return {
217
- rows,
218
- nextCursor,
219
- ...(query.payload.totalCount === true && { total: merged.length }),
220
- };
173
+ return { rows, nextCursor: null, ...(total !== undefined && { total }) };
221
174
  },
222
175
  });
223
176
  }
@@ -15,11 +15,9 @@ export const CAP_OVERVIEW_I18N = {
15
15
  "cap-overview.errors.progressPrimitiveMissing": {
16
16
  en: "Usage bar unavailable — Progress primitive is not registered.",
17
17
  },
18
- "cap-overview.errors.invalidCursor": { en: "The pagination cursor is invalid." },
19
18
  "cap-overview.errors.filterFieldUnsupported": {
20
19
  en: "Filtering by this field is not supported, or tier was filtered more than once.",
21
20
  },
22
- "cap-overview.errors.sortFieldUnsupported": { en: "Sorting by this field is not supported." },
23
21
  "cap-overview.errors.tenantOverrideRequiresSystemAdmin": {
24
22
  en: "Only SystemAdmin may query another tenant's data.",
25
23
  },
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-headless";
3
2
  import { usePrimitives, useQuery, useTranslation } from "@cosmicdrift/kumiko-renderer";
4
- import { EmptyState, StatCard, StatusBadge, } from "@cosmicdrift/kumiko-renderer-web";
3
+ import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-renderer/headless";
4
+ import { EmptyState, StatCard, StatusBadge, } from "@cosmicdrift/kumiko-renderer/web";
5
5
  import { Database, FileText, Gauge, Hash, Mail, Users } from "lucide-react";
6
6
  import { CapOverviewQueries } from "../constants.js";
7
7
  import { CapUsageBar } from "./cap-usage-bar.js";
@@ -44,7 +44,7 @@ export function CapCardsPanel({ filterParams }) {
44
44
  }
45
45
  return (_jsxs("div", {
46
46
  // Arbitrary bracket values (grid-cols-[repeat(...)]) never compiled:
47
- // styles.css's Tailwind v4 @source scan only covers renderer-web/src,
47
+ // styles.css's Tailwind v4 @source scan only covers renderer/web/src,
48
48
  // renderer/src and samples/**/src (see its comment) — bundled-features
49
49
  // isn't scanned, so a class unique to this file has no generated rule
50
50
  // and silently no-ops (the grid fell back to one implicit column,
@@ -1,5 +1,5 @@
1
1
  import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
2
- import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer-web";
2
+ import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
3
3
  export type CapOverviewClientOptions = {
4
4
  readonly translations?: TranslationsByLocale;
5
5
  };
@@ -1,3 +1,4 @@
1
+ import type { TenantDb } from "@cosmicdrift/kumiko-framework/db";
1
2
  import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
2
3
  import { type ChannelContext, type DeliveryChannel, type EmailAttachmentRef } from "../delivery/index.ts";
3
4
  import type { EmailTransport } from "./types.ts";
@@ -16,7 +17,7 @@ type EmailChannelTransports = {
16
17
  };
17
18
  export type EmailChannelOptions = EmailChannelTransports & {
18
19
  readonly resolveEmail: (userId: string, ctx: {
19
- db: unknown;
20
+ db: TenantDb;
20
21
  tenantId: TenantId;
21
22
  }) => Promise<string | null>;
22
23
  };
@@ -1,5 +1,5 @@
1
1
  import { type TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
2
- import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer-web";
2
+ import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
3
3
  export type ComplianceProfilesClientOptions = {
4
4
  readonly translations?: TranslationsByLocale;
5
5
  };
@@ -53,7 +53,7 @@ export function createConfigAccessor(registry, resolver, tenantId, userId, db, s
53
53
  }
54
54
  return configAccessor;
55
55
  }
56
- // Pass to the test-stack / server-boot as `_configAccessorFactory` —
56
+ // Pass to the test-stack / server-boot as `configAccessorFactory` —
57
57
  // `buildHandlerContext` mints a per-user `ctx.config` from this.
58
58
  export function createConfigAccessorFactory(registry, resolver) {
59
59
  return ({ user, db, secrets }) => createConfigAccessor(registry, resolver, user.tenantId, user.id, db, secrets);
@@ -67,7 +67,7 @@ export function requireConfigResolver(ctx, handlerName) {
67
67
  if (!ctx.configResolver) {
68
68
  throw new InternalError({
69
69
  message: `[${handlerName}] ctx.configResolver missing — pass createConfigAccessorFactory's ` +
70
- `output via extraContext._configAccessorFactory and the resolver via ` +
70
+ `output via extraContext.configAccessorFactory and the resolver via ` +
71
71
  `extraContext.configResolver at boot.`,
72
72
  });
73
73
  }
@@ -13,7 +13,7 @@ export declare const configValueEntity: import("@cosmicdrift/kumiko-types/fields
13
13
  readonly sensitive?: boolean;
14
14
  readonly writeOnly?: boolean;
15
15
  readonly readAsInstruction?: boolean;
16
- readonly format?: "email" | "url" | "phone" | "password";
16
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
17
17
  readonly default?: string;
18
18
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
19
19
  readonly multiline?: boolean | {
@@ -36,7 +36,7 @@ export declare const configValueEntity: import("@cosmicdrift/kumiko-types/fields
36
36
  readonly sensitive?: boolean;
37
37
  readonly writeOnly?: boolean;
38
38
  readonly readAsInstruction?: boolean;
39
- readonly format?: "email" | "url" | "phone" | "password";
39
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
40
40
  readonly default?: string;
41
41
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
42
42
  readonly multiline?: boolean | {
@@ -59,7 +59,7 @@ export declare const configValueEntity: import("@cosmicdrift/kumiko-types/fields
59
59
  readonly sensitive?: boolean;
60
60
  readonly writeOnly?: boolean;
61
61
  readonly readAsInstruction?: boolean;
62
- readonly format?: "email" | "url" | "phone" | "password";
62
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
63
63
  readonly default?: string;
64
64
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
65
65
  readonly multiline?: boolean | {
@@ -84,7 +84,7 @@ export declare const configValuesTable: import("@cosmicdrift/kumiko-framework/db
84
84
  readonly sensitive?: boolean;
85
85
  readonly writeOnly?: boolean;
86
86
  readonly readAsInstruction?: boolean;
87
- readonly format?: "email" | "url" | "phone" | "password";
87
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
88
88
  readonly default?: string;
89
89
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
90
90
  readonly multiline?: boolean | {
@@ -107,7 +107,7 @@ export declare const configValuesTable: import("@cosmicdrift/kumiko-framework/db
107
107
  readonly sensitive?: boolean;
108
108
  readonly writeOnly?: boolean;
109
109
  readonly readAsInstruction?: boolean;
110
- readonly format?: "email" | "url" | "phone" | "password";
110
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
111
111
  readonly default?: string;
112
112
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
113
113
  readonly multiline?: boolean | {
@@ -130,7 +130,7 @@ export declare const configValuesTable: import("@cosmicdrift/kumiko-framework/db
130
130
  readonly sensitive?: boolean;
131
131
  readonly writeOnly?: boolean;
132
132
  readonly readAsInstruction?: boolean;
133
- readonly format?: "email" | "url" | "phone" | "password";
133
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
134
134
  readonly default?: string;
135
135
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
136
136
  readonly multiline?: boolean | {
@@ -13,7 +13,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
13
13
  readonly sensitive?: boolean;
14
14
  readonly writeOnly?: boolean;
15
15
  readonly readAsInstruction?: boolean;
16
- readonly format?: "email" | "url" | "phone" | "password";
16
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
17
17
  readonly default?: string;
18
18
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
19
19
  readonly multiline?: boolean | {
@@ -36,7 +36,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
36
36
  readonly sensitive?: boolean;
37
37
  readonly writeOnly?: boolean;
38
38
  readonly readAsInstruction?: boolean;
39
- readonly format?: "email" | "url" | "phone" | "password";
39
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
40
40
  readonly default?: string;
41
41
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
42
42
  readonly multiline?: boolean | {
@@ -59,7 +59,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
59
59
  readonly sensitive?: boolean;
60
60
  readonly writeOnly?: boolean;
61
61
  readonly readAsInstruction?: boolean;
62
- readonly format?: "email" | "url" | "phone" | "password";
62
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
63
63
  readonly default?: string;
64
64
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
65
65
  readonly multiline?: boolean | {
@@ -109,7 +109,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
109
109
  readonly sensitive?: boolean;
110
110
  readonly writeOnly?: boolean;
111
111
  readonly readAsInstruction?: boolean;
112
- readonly format?: "email" | "url" | "phone" | "password";
112
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
113
113
  readonly default?: string;
114
114
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
115
115
  readonly multiline?: boolean | {
@@ -1,2 +1,2 @@
1
- import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer-web";
1
+ import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
2
2
  export declare function customFieldsClient(): ClientFeatureDefinition;
@@ -13,7 +13,7 @@ export declare const tenantRetentionOverrideEntity: import("@cosmicdrift/kumiko-
13
13
  readonly sensitive?: boolean;
14
14
  readonly writeOnly?: boolean;
15
15
  readonly readAsInstruction?: boolean;
16
- readonly format?: "email" | "url" | "phone" | "password";
16
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
17
17
  readonly default?: string;
18
18
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
19
19
  readonly multiline?: boolean | {
@@ -52,7 +52,7 @@ export declare const tenantRetentionOverrideEntity: import("@cosmicdrift/kumiko-
52
52
  readonly sensitive?: boolean;
53
53
  readonly writeOnly?: boolean;
54
54
  readonly readAsInstruction?: boolean;
55
- readonly format?: "email" | "url" | "phone" | "password";
55
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
56
56
  readonly default?: string;
57
57
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
58
58
  readonly multiline?: boolean | {
@@ -77,7 +77,7 @@ export declare const tenantRetentionOverrideTable: import("@cosmicdrift/kumiko-f
77
77
  readonly sensitive?: boolean;
78
78
  readonly writeOnly?: boolean;
79
79
  readonly readAsInstruction?: boolean;
80
- readonly format?: "email" | "url" | "phone" | "password";
80
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
81
81
  readonly default?: string;
82
82
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
83
83
  readonly multiline?: boolean | {
@@ -116,7 +116,7 @@ export declare const tenantRetentionOverrideTable: import("@cosmicdrift/kumiko-f
116
116
  readonly sensitive?: boolean;
117
117
  readonly writeOnly?: boolean;
118
118
  readonly readAsInstruction?: boolean;
119
- readonly format?: "email" | "url" | "phone" | "password";
119
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
120
120
  readonly default?: string;
121
121
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
122
122
  readonly multiline?: boolean | {
@@ -16,7 +16,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
16
16
  readonly sensitive?: boolean;
17
17
  readonly writeOnly?: boolean;
18
18
  readonly readAsInstruction?: boolean;
19
- readonly format?: "email" | "url" | "phone" | "password";
19
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
20
20
  readonly default?: string;
21
21
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
22
22
  readonly multiline?: boolean | {
@@ -39,7 +39,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
39
39
  readonly sensitive?: boolean;
40
40
  readonly writeOnly?: boolean;
41
41
  readonly readAsInstruction?: boolean;
42
- readonly format?: "email" | "url" | "phone" | "password";
42
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
43
43
  readonly default?: string;
44
44
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
45
45
  readonly multiline?: boolean | {
@@ -62,7 +62,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
62
62
  readonly sensitive?: boolean;
63
63
  readonly writeOnly?: boolean;
64
64
  readonly readAsInstruction?: boolean;
65
- readonly format?: "email" | "url" | "phone" | "password";
65
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
66
66
  readonly default?: string;
67
67
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
68
68
  readonly multiline?: boolean | {
@@ -92,7 +92,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
92
92
  readonly sensitive?: boolean;
93
93
  readonly writeOnly?: boolean;
94
94
  readonly readAsInstruction?: boolean;
95
- readonly format?: "email" | "url" | "phone" | "password";
95
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
96
96
  readonly default?: string;
97
97
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
98
98
  readonly multiline?: boolean | {
@@ -115,7 +115,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
115
115
  readonly sensitive?: boolean;
116
116
  readonly writeOnly?: boolean;
117
117
  readonly readAsInstruction?: boolean;
118
- readonly format?: "email" | "url" | "phone" | "password";
118
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
119
119
  readonly default?: string;
120
120
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
121
121
  readonly multiline?: boolean | {
@@ -138,7 +138,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
138
138
  readonly sensitive?: boolean;
139
139
  readonly writeOnly?: boolean;
140
140
  readonly readAsInstruction?: boolean;
141
- readonly format?: "email" | "url" | "phone" | "password";
141
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
142
142
  readonly default?: string;
143
143
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
144
144
  readonly multiline?: boolean | {
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { mailT } from "@cosmicdrift/kumiko-framework/i18n";
3
- import { escapeHtml, escapeHtmlAttr } from "@cosmicdrift/kumiko-headless";
3
+ import { escapeHtml, escapeHtmlAttr } from "@cosmicdrift/kumiko-renderer/headless";
4
4
  import { DELIVERY_RESUBSCRIBE_PATH, DELIVERY_UNSUBSCRIBE_PATH } from "./public-names.js";
5
5
  import "./unsubscribe-page-strings.js";
6
6
  // Same values as the in-code mail layout of renderer-mail-html, so the page reads as the mail's sequel.
@@ -1,5 +1,5 @@
1
1
  import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
2
- import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer-web";
2
+ import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
3
3
  export type DeliveryClientOptions = {
4
4
  readonly translations?: TranslationsByLocale;
5
5
  };
@@ -5,7 +5,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
5
5
  // in feature.ts). The list frame itself is the generic declarative
6
6
  // projectionList renderer — only this one cell stays TSX.
7
7
  import { useTranslation } from "@cosmicdrift/kumiko-renderer";
8
- import { StatusBadge } from "@cosmicdrift/kumiko-renderer-web";
8
+ import { StatusBadge } from "@cosmicdrift/kumiko-renderer/web";
9
9
  import { translateOrRaw } from "../../shared/web/translate-or-raw.js";
10
10
  import { DeliveryStatus } from "../public-names.js";
11
11
  const STATUS_TONE = {
@@ -24,7 +24,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
24
24
  readonly sensitive?: boolean;
25
25
  readonly writeOnly?: boolean;
26
26
  readonly readAsInstruction?: boolean;
27
- readonly format?: "email" | "url" | "phone" | "password";
27
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
28
28
  readonly default?: string;
29
29
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
30
30
  readonly multiline?: boolean | {
@@ -47,7 +47,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
47
47
  readonly sensitive?: boolean;
48
48
  readonly writeOnly?: boolean;
49
49
  readonly readAsInstruction?: boolean;
50
- readonly format?: "email" | "url" | "phone" | "password";
50
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
51
51
  readonly default?: string;
52
52
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
53
53
  readonly multiline?: boolean | {
@@ -89,7 +89,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
89
89
  readonly sensitive?: boolean;
90
90
  readonly writeOnly?: boolean;
91
91
  readonly readAsInstruction?: boolean;
92
- readonly format?: "email" | "url" | "phone" | "password";
92
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
93
93
  readonly default?: string;
94
94
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
95
95
  readonly multiline?: boolean | {
@@ -112,7 +112,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
112
112
  readonly sensitive?: boolean;
113
113
  readonly writeOnly?: boolean;
114
114
  readonly readAsInstruction?: boolean;
115
- readonly format?: "email" | "url" | "phone" | "password";
115
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
116
116
  readonly default?: string;
117
117
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
118
118
  readonly multiline?: boolean | {
@@ -1,5 +1,5 @@
1
1
  import { type TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
2
- import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer-web";
2
+ import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
3
3
  export type FeatureTogglesClientOptions = {
4
4
  readonly translations?: TranslationsByLocale;
5
5
  };
@@ -0,0 +1,17 @@
1
+ export type NamedS3EnvProviderOptions = {
2
+ /** Provider key tenants select in `file-foundation`'s `provider` config; the feature is `file-provider-s3-env-<name>`. */
3
+ readonly name: string;
4
+ /** Env prefix of the credential set, e.g. `RELEASES_S3_`. */
5
+ readonly envPrefix: string;
6
+ /** Tolerate missing credentials at boot; the provider then fails on its first file operation. */
7
+ readonly lazy?: boolean;
8
+ };
9
+ /** An additional S3 provider next to `"s3-env"`, reading its credentials from `<envPrefix>BUCKET` etc. */
10
+ export declare function createFileProviderS3NamedEnvFeature(options: NamedS3EnvProviderOptions): import("@cosmicdrift/kumiko-framework/env").FeatureWithEnvSchema<import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
11
+ readonly exports: void;
12
+ }, {
13
+ [x: string]: import("zod").ZodOptional<import("zod").ZodEnum<{
14
+ false: "false";
15
+ true: "true";
16
+ }>> | import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodPipe<import("zod").ZodLiteral<"">, import("zod").ZodTransform<undefined, "">>, import("zod").ZodURL]>>;
17
+ }>;