@cosmicdrift/kumiko-bundled-features 0.211.0 → 0.213.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 (75) hide show
  1. package/package.json +8 -8
  2. package/src/admin-shell/feature.ts +2 -0
  3. package/src/admin-shell/web/platform-overview-screen.tsx +1 -0
  4. package/src/admin-shell/web/tenant-overview-screen.tsx +1 -0
  5. package/src/audit/__tests__/audit-log-screen.test.tsx +228 -0
  6. package/src/audit/constants.ts +3 -0
  7. package/src/audit/feature.ts +2 -0
  8. package/src/audit/i18n.ts +1 -0
  9. package/src/audit/web/audit-log-detail-screen.tsx +28 -6
  10. package/src/audit/web/audit-log-screen.tsx +51 -23
  11. package/src/auth-email-password/__tests__/password-reset.integration.test.ts +31 -2
  12. package/src/auth-email-password/__tests__/signup-flow.integration.test.ts +175 -2
  13. package/src/auth-email-password/feature.ts +9 -4
  14. package/src/auth-email-password/handlers/invite-create.write.ts +14 -4
  15. package/src/auth-email-password/handlers/signup-request.write.ts +48 -34
  16. package/src/auth-email-password/handlers/token-request-handler.ts +20 -4
  17. package/src/auth-email-password/i18n.ts +2 -0
  18. package/src/auth-email-password/magic-link-mail.ts +11 -2
  19. package/src/auth-email-password/web/__tests__/signup-complete-screen.test.tsx +15 -6
  20. package/src/auth-email-password/web/auth-form-primitives.tsx +2 -0
  21. package/src/auth-email-password/web/auth-gate.tsx +1 -0
  22. package/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -0
  23. package/src/auth-email-password/web/invite-accept-screen.tsx +3 -0
  24. package/src/auth-email-password/web/session.tsx +1 -0
  25. package/src/auth-email-password/web/signup-complete-screen.tsx +29 -14
  26. package/src/auth-email-password/web/verify-email-screen.tsx +1 -0
  27. package/src/auth-mfa/feature.ts +1 -0
  28. package/src/auth-mfa/web/mfa-disable-dialog.tsx +1 -0
  29. package/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +1 -0
  30. package/src/compliance-profiles/feature.ts +1 -5
  31. package/src/config/db/queries/__tests__/resolver.test.ts +64 -0
  32. package/src/config/db/queries/resolver.ts +5 -3
  33. package/src/crypto-shredding/changes.json +2 -1
  34. package/src/custom-fields/__tests__/feature.test.ts +42 -0
  35. package/src/custom-fields/__tests__/field-definition-role-config.integration.test.ts +139 -0
  36. package/src/custom-fields/constants.ts +6 -0
  37. package/src/custom-fields/feature.ts +56 -10
  38. package/src/custom-fields/handlers/define-tenant-field.write.ts +7 -1
  39. package/src/custom-fields/handlers/delete-tenant-field.write.ts +54 -33
  40. package/src/custom-fields/handlers/update-tenant-field.write.ts +58 -35
  41. package/src/delivery/feature.ts +1 -3
  42. package/src/feature-toggles/feature.ts +1 -0
  43. package/src/feature-toggles/web/toggle-admin-screen.tsx +1 -0
  44. package/src/folders/web/folder-manager.tsx +1 -0
  45. package/src/inbound-mail-foundation/__tests__/watch-supervisor.integration.test.ts +141 -0
  46. package/src/inbound-mail-foundation/watch-supervisor.ts +152 -11
  47. package/src/jobs/__tests__/jobs-pii-kms.integration.test.ts +174 -0
  48. package/src/jobs/__tests__/jobs-stale-run-sweep.integration.test.ts +148 -0
  49. package/src/jobs/db/queries/stale-run-sweep.ts +51 -0
  50. package/src/jobs/feature.ts +25 -1
  51. package/src/jobs/handlers/detail.query.ts +13 -1
  52. package/src/jobs/handlers/stale-run-sweep.job.ts +28 -0
  53. package/src/jobs/job-run-logger.ts +68 -18
  54. package/src/jobs/web/job-run-detail-screen.tsx +1 -0
  55. package/src/page-render/web.ts +1 -0
  56. package/src/personal-access-tokens/feature.ts +1 -0
  57. package/src/secrets/__tests__/access-options.integration.test.ts +114 -0
  58. package/src/secrets/constants.ts +12 -0
  59. package/src/secrets/feature.ts +35 -9
  60. package/src/secrets/handlers/delete.write.ts +23 -16
  61. package/src/secrets/handlers/list.query.ts +37 -30
  62. package/src/secrets/handlers/set.write.ts +43 -36
  63. package/src/secrets/index.ts +5 -0
  64. package/src/seo/feature.ts +1 -0
  65. package/src/tags/feature.ts +1 -0
  66. package/src/tags/web/tag-chip.tsx +2 -0
  67. package/src/tags/web/tag-manager.tsx +2 -1
  68. package/src/tags/web/tag-picker.tsx +1 -0
  69. package/src/template-resolver/web/client-plugin.tsx +2 -0
  70. package/src/tier-engine/feature.ts +2 -0
  71. package/src/tier-engine/web/tier-admin-screen.tsx +5 -5
  72. package/src/user-data-rights/feature.ts +2 -0
  73. package/src/user-data-rights/web/privacy-center-screen.tsx +2 -1
  74. package/src/user-profile/i18n.ts +1 -0
  75. package/src/user-profile/web/profile-screen.tsx +1 -1
@@ -33,6 +33,7 @@ function hexToRgb(color: string): { r: number; g: number; b: number } | null {
33
33
  };
34
34
  }
35
35
 
36
+ // kumiko-lint-ignore no-inline-styles Tag color is user-defined (hex from the DB), no finite token palette possible
36
37
  const BASE_STYLE: CSSProperties = {
37
38
  display: "inline-flex",
38
39
  alignItems: "center",
@@ -56,6 +57,7 @@ export function TagChip({
56
57
  const fg = color != null && color !== "" ? contrastText(color) : null;
57
58
  const palette = fg !== null && color != null ? { backgroundColor: color, color: fg } : NEUTRAL;
58
59
  return (
60
+ // kumiko-lint-ignore no-inline-styles Tag color is user-defined (hex from the DB), no finite token palette possible
59
61
  <span data-testid="tag-chip" style={{ ...BASE_STYLE, ...palette }}>
60
62
  {name}
61
63
  </span>
@@ -63,7 +63,7 @@ function ColorPicker({
63
63
  <div className="flex items-center gap-2">
64
64
  <div className="flex flex-wrap gap-1">
65
65
  {PRESET_COLORS.map((c) => (
66
- // kumiko-lint-ignore primitives-discipline color swatch needs a raw colored button — Button is variant-styled
66
+ // kumiko-lint-ignore primitives-discipline color swatch needs a raw colored button — Button is variant-styled. kumiko-lint-ignore no-inline-styles Preset swatch color is user-defined (hex), no finite token palette possible
67
67
  <button
68
68
  key={c}
69
69
  type="button"
@@ -87,6 +87,7 @@ function ColorPicker({
87
87
  name={`${idPrefix}-hex`}
88
88
  value={value}
89
89
  onChange={onChange}
90
+ // kumiko-lint-ignore i18n-ui-strings Hex color value as an example placeholder, not UI text
90
91
  placeholder="#22cc88"
91
92
  />
92
93
  </div>
@@ -27,6 +27,7 @@ export function TagPicker({
27
27
  const t = useTranslation();
28
28
  const [buffer, setBuffer] = useState<readonly string[]>(value);
29
29
  // Reset the buffer to the caller's truth every time the modal (re)opens.
30
+ // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
30
31
  useEffect(() => {
31
32
  if (open) setBuffer(value);
32
33
  }, [open, value]);
@@ -170,6 +170,7 @@ function makeTreeProvider(tenantIdOverride?: string, collectionId?: string): Tre
170
170
  const headers: Record<string, string> = { "content-type": "application/json" };
171
171
  const csrf = readCsrfToken();
172
172
  if (csrf !== undefined) headers[CSRF_HEADER_NAME] = csrf;
173
+ // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
173
174
  fetch("/api/query", {
174
175
  method: "POST",
175
176
  headers,
@@ -338,6 +339,7 @@ function TextBlockEditor({
338
339
 
339
340
  // Sync loaded data into the form state. loaded === null means the block does
340
341
  // not exist yet — empty form for the create flow.
342
+ // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
341
343
  useEffect(() => {
342
344
  if (loading) return;
343
345
  setTitle(loaded?.title ?? "");
@@ -40,6 +40,7 @@
40
40
  //
41
41
  // **Boot-Dependencies:** config + tenant.
42
42
 
43
+ // kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312 (feature.ts > 300 lines)
43
44
  import { fetchOne, selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
44
45
  import {
45
46
  buildEntityTable,
@@ -236,6 +237,7 @@ export function createTierEngineFeature<
236
237
  // platziert ihn nur via r.nav("tier-engine:screen:tier-admin"); die
237
238
  // Komponente liefert tierEngineClient() aus dem ./web-subpath.
238
239
  r.translations({ keys: TIER_ENGINE_I18N });
240
+ // kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312
239
241
  r.screen({
240
242
  id: TIER_ADMIN_SCREEN_ID,
241
243
  type: "custom",
@@ -56,11 +56,11 @@ export function TierAdminScreen(): ReactNode {
56
56
  { enabled: tenantId !== "" },
57
57
  );
58
58
 
59
- // Tenant-Wechsel: Auswahl + Status zurücksetzen, damit kein Tier eines
60
- // anderen Tenants stehen bleibt (Mis-Grant-Schutz auf UI-Ebene). tenantId
61
- // ist hier reiner Trigger (Body liest es nicht) — Biome's "extra dep"-
62
- // Autofix würde die Deps leeren und den Reset auf den Mount beschränken.
63
- // biome-ignore lint/correctness/useExhaustiveDependencies: tenantId ist der gewollte Reset-Trigger, nicht entfernen.
59
+ // Tenant switch: reset selection + status so no other tenant's tier stays
60
+ // shown (UI-level mis-grant guard). tenantId is a pure trigger here (the
61
+ // body doesn't read it) — Biome's "extra dep" autofix would empty the deps
62
+ // and limit the reset to mount.
63
+ // biome-ignore lint/correctness/useExhaustiveDependencies: tenantId is the intended reset trigger, do not remove. kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
64
64
  useEffect(() => {
65
65
  setTier("");
66
66
  setStatus({ kind: "idle" });
@@ -1,3 +1,4 @@
1
+ // kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312 (feature.ts > 300 lines)
1
2
  import {
2
3
  createSystemConfig,
3
4
  defineFeature,
@@ -291,6 +292,7 @@ export function createUserDataRightsFeature(opts: UserDataRightsOptions = {}): F
291
292
  // its authed area. dormant: true so createKumikoApp's boot diagnostic
292
293
  // (#2025) doesn't flag apps that haven't (yet) navved the screen as
293
294
  // having a missing client plugin (#2034).
295
+ // kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312
294
296
  r.screen({
295
297
  id: PRIVACY_CENTER_SCREEN_ID,
296
298
  type: "custom",
@@ -121,8 +121,9 @@ function ExportSection(): ReactNode {
121
121
  const done = job?.status === EXPORT_JOB_STATUS.Done;
122
122
  const failed = job?.status === EXPORT_JOB_STATUS.Failed;
123
123
 
124
- // Solange der Job läuft: pollen bis Done/Failed, dann auto-Stop.
124
+ // While the job is running: poll until Done/Failed, then auto-stop.
125
125
  const refetch = statusQuery.refetch;
126
+ // kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
126
127
  useEffect(() => {
127
128
  if (!inProgress || !refetch) return;
128
129
  const id = setInterval(() => void refetch(), EXPORT_POLL_MS);
@@ -11,6 +11,7 @@ import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
11
11
  export const defaultTranslations: TranslationsByLocale = {
12
12
  en: {
13
13
  "profile.title": "Profile",
14
+ "profile.loading": "Loading…",
14
15
 
15
16
  "profile.email.title": "Email address",
16
17
  "profile.email.current": "Current email",
@@ -351,7 +351,7 @@ export function ProfileScreen(): ReactNode {
351
351
  if (me === null || me === undefined) {
352
352
  return (
353
353
  <Banner padded variant="loading" testId="profile-loading">
354
- Loading…
354
+ {t("profile.loading")}
355
355
  </Banner>
356
356
  );
357
357
  }