@objectstack/plugin-security 6.8.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -21,34 +21,6 @@ interface SecurityPluginOptions {
21
21
  * @default 'member_default'
22
22
  */
23
23
  fallbackPermissionSet?: string | null;
24
- /**
25
- * Whether this deployment is multi-tenant.
26
- *
27
- * When `true` (default), SecurityPlugin:
28
- * - Auto-injects `organization_id = ctx.tenantId` on insert when
29
- * the target object declares an `organization_id` field.
30
- * - Honours the wildcard `tenant_isolation` RLS policy
31
- * (`organization_id = current_user.organization_id`) shipped with
32
- * the default `member_default` / `viewer_readonly` permission
33
- * sets.
34
- *
35
- * When `false`, SecurityPlugin:
36
- * - Skips the `organization_id` auto-injection block (saves a
37
- * metadata lookup per insert; `owner_id` injection still runs).
38
- * - Strips any RLS policy whose USING expression references
39
- * `current_user.organization_id` from the per-request policy
40
- * set, so single-tenant deployments don't pay the
41
- * field-existence safety-net cost on every find.
42
- *
43
- * Field-Level Security, owner-based RLS, and per-object permission
44
- * checks (allowRead/allowCreate/…) all operate identically regardless
45
- * of this flag. Set this to `false` for single-tenant or
46
- * single-organization deployments where `organization_id` carries no
47
- * meaning.
48
- *
49
- * @default true
50
- */
51
- multiTenant?: boolean;
52
24
  }
53
25
  /**
54
26
  * SecurityPlugin
@@ -59,6 +31,16 @@ interface SecurityPluginOptions {
59
31
  * This plugin is fully optional — without it, the system operates
60
32
  * without permission checks (same as current behavior).
61
33
  *
34
+ * **Multi-tenant Organization scoping is provided by the separate
35
+ * `@objectstack/plugin-org-scoping` package** (auto-stamps
36
+ * `organization_id` on insert, per-org seed replay, default-org
37
+ * bootstrap). When that plugin is installed, SecurityPlugin detects
38
+ * it via `getService('org-scoping')` and keeps the wildcard
39
+ * `current_user.organization_id` RLS policies that ship with the
40
+ * default permission sets. Without it, those policies are stripped so
41
+ * single-tenant deployments don't pay the field-existence safety-net
42
+ * cost on every find.
43
+ *
62
44
  * Dependencies:
63
45
  * - objectql service (ObjectQL engine with middleware support)
64
46
  * - metadata service (MetadataFacade for reading permission sets and RLS policies)
@@ -73,7 +55,15 @@ declare class SecurityPlugin implements Plugin {
73
55
  private fieldMasker;
74
56
  private readonly bootstrapPermissionSets;
75
57
  private readonly fallbackPermissionSet;
76
- private readonly multiTenant;
58
+ /**
59
+ * Runtime probe — set in `start()` from
60
+ * `ctx.getService('org-scoping')`. When `false`, wildcard RLS
61
+ * policies that reference `current_user.organization_id` are
62
+ * stripped from the per-request policy set (saves the
63
+ * field-existence safety net cost on every find in single-tenant
64
+ * deployments). When `true`, the policies apply normally.
65
+ */
66
+ private orgScopingEnabled;
77
67
  /**
78
68
  * Per-object field-name cache. Populated lazily from the metadata
79
69
  * service / ObjectQL registry on first access per object. Schemas are
@@ -927,6 +917,14 @@ declare const securityObjects: ((Omit<{
927
917
  } | undefined;
928
918
  recordTypes?: string[] | undefined;
929
919
  sharingModel?: "read" | "full" | "private" | "read_write" | undefined;
920
+ publicSharing?: {
921
+ enabled: boolean;
922
+ allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
923
+ allowedPermissions?: ("edit" | "view" | "comment")[] | undefined;
924
+ maxExpiryDays?: number | undefined;
925
+ redactFields?: string[] | undefined;
926
+ eligibility?: string | undefined;
927
+ } | undefined;
930
928
  keyPrefix?: string | undefined;
931
929
  detail?: {
932
930
  [x: string]: unknown;
@@ -941,7 +939,7 @@ declare const securityObjects: ((Omit<{
941
939
  refreshAfter: boolean;
942
940
  objectName?: string | undefined;
943
941
  icon?: string | undefined;
944
- locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "global_nav")[] | undefined;
942
+ locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "record_section" | "global_nav")[] | undefined;
945
943
  component?: "action:button" | "action:icon" | "action:menu" | "action:group" | undefined;
946
944
  target?: string | undefined;
947
945
  body?: {
@@ -974,6 +972,17 @@ declare const securityObjects: ((Omit<{
974
972
  variant?: "link" | "primary" | "secondary" | "danger" | "ghost" | undefined;
975
973
  confirmText?: string | undefined;
976
974
  successMessage?: string | undefined;
975
+ resultDialog?: {
976
+ title?: string | undefined;
977
+ description?: string | undefined;
978
+ acknowledge?: string | undefined;
979
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
980
+ fields?: {
981
+ path: string;
982
+ label?: string | undefined;
983
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
984
+ }[] | undefined;
985
+ } | undefined;
977
986
  visible?: {
978
987
  dialect: "cel" | "js" | "cron" | "template";
979
988
  source?: string | undefined;
@@ -3366,6 +3375,14 @@ declare const securityObjects: ((Omit<{
3366
3375
  } | undefined;
3367
3376
  recordTypes?: string[] | undefined;
3368
3377
  sharingModel?: "read" | "full" | "private" | "read_write" | undefined;
3378
+ publicSharing?: {
3379
+ enabled: boolean;
3380
+ allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
3381
+ allowedPermissions?: ("edit" | "view" | "comment")[] | undefined;
3382
+ maxExpiryDays?: number | undefined;
3383
+ redactFields?: string[] | undefined;
3384
+ eligibility?: string | undefined;
3385
+ } | undefined;
3369
3386
  keyPrefix?: string | undefined;
3370
3387
  detail?: {
3371
3388
  [x: string]: unknown;
@@ -3380,7 +3397,7 @@ declare const securityObjects: ((Omit<{
3380
3397
  refreshAfter: boolean;
3381
3398
  objectName?: string | undefined;
3382
3399
  icon?: string | undefined;
3383
- locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "global_nav")[] | undefined;
3400
+ locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "record_section" | "global_nav")[] | undefined;
3384
3401
  component?: "action:button" | "action:icon" | "action:menu" | "action:group" | undefined;
3385
3402
  target?: string | undefined;
3386
3403
  body?: {
@@ -3413,6 +3430,17 @@ declare const securityObjects: ((Omit<{
3413
3430
  variant?: "link" | "primary" | "secondary" | "danger" | "ghost" | undefined;
3414
3431
  confirmText?: string | undefined;
3415
3432
  successMessage?: string | undefined;
3433
+ resultDialog?: {
3434
+ title?: string | undefined;
3435
+ description?: string | undefined;
3436
+ acknowledge?: string | undefined;
3437
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
3438
+ fields?: {
3439
+ path: string;
3440
+ label?: string | undefined;
3441
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
3442
+ }[] | undefined;
3443
+ } | undefined;
3416
3444
  visible?: {
3417
3445
  dialect: "cel" | "js" | "cron" | "template";
3418
3446
  source?: string | undefined;
@@ -3421,178 +3449,703 @@ declare const securityObjects: ((Omit<{
3421
3449
  rationale?: string | undefined;
3422
3450
  generatedBy?: string | undefined;
3423
3451
  } | undefined;
3424
- } | undefined;
3425
- disabled?: boolean | {
3426
- dialect: "cel" | "js" | "cron" | "template";
3427
- source?: string | undefined;
3428
- ast?: unknown;
3429
- meta?: {
3430
- rationale?: string | undefined;
3431
- generatedBy?: string | undefined;
3452
+ } | undefined;
3453
+ disabled?: boolean | {
3454
+ dialect: "cel" | "js" | "cron" | "template";
3455
+ source?: string | undefined;
3456
+ ast?: unknown;
3457
+ meta?: {
3458
+ rationale?: string | undefined;
3459
+ generatedBy?: string | undefined;
3460
+ } | undefined;
3461
+ } | undefined;
3462
+ shortcut?: string | undefined;
3463
+ bulkEnabled?: boolean | undefined;
3464
+ aiExposed?: boolean | undefined;
3465
+ recordIdParam?: string | undefined;
3466
+ recordIdField?: string | undefined;
3467
+ bodyShape?: "flat" | {
3468
+ wrap: string;
3469
+ } | undefined;
3470
+ method?: "POST" | "PATCH" | "PUT" | "DELETE" | undefined;
3471
+ bodyExtra?: Record<string, unknown> | undefined;
3472
+ mode?: "custom" | "delete" | "create" | "edit" | undefined;
3473
+ timeout?: number | undefined;
3474
+ aria?: {
3475
+ ariaLabel?: string | undefined;
3476
+ ariaDescribedBy?: string | undefined;
3477
+ role?: string | undefined;
3478
+ } | undefined;
3479
+ }[] | undefined;
3480
+ }, "fields"> & Pick<{
3481
+ readonly name: "sys_permission_set";
3482
+ readonly label: "Permission Set";
3483
+ readonly pluralLabel: "Permission Sets";
3484
+ readonly icon: "lock";
3485
+ readonly isSystem: true;
3486
+ readonly managedBy: "config";
3487
+ readonly description: "Named permission groupings for fine-grained access control";
3488
+ readonly displayNameField: "label";
3489
+ readonly titleFormat: "{label}";
3490
+ readonly compactLayout: ["label", "name", "active"];
3491
+ readonly actions: [{
3492
+ readonly name: "activate_permission_set";
3493
+ readonly label: "Activate";
3494
+ readonly icon: "circle-check";
3495
+ readonly variant: "secondary";
3496
+ readonly mode: "custom";
3497
+ readonly locations: ["list_item", "record_header"];
3498
+ readonly type: "api";
3499
+ readonly method: "PATCH";
3500
+ readonly target: "/api/v1/data/sys_permission_set/{id}";
3501
+ readonly bodyExtra: {
3502
+ readonly active: true;
3503
+ };
3504
+ readonly successMessage: "Permission set activated";
3505
+ readonly refreshAfter: true;
3506
+ }, {
3507
+ readonly name: "deactivate_permission_set";
3508
+ readonly label: "Deactivate";
3509
+ readonly icon: "circle-off";
3510
+ readonly variant: "danger";
3511
+ readonly mode: "custom";
3512
+ readonly locations: ["list_item", "record_header"];
3513
+ readonly type: "api";
3514
+ readonly method: "PATCH";
3515
+ readonly target: "/api/v1/data/sys_permission_set/{id}";
3516
+ readonly bodyExtra: {
3517
+ readonly active: false;
3518
+ };
3519
+ readonly confirmText: "Deactivate this permission set? Existing assignments stay in place but stop granting access until re-activated.";
3520
+ readonly successMessage: "Permission set deactivated";
3521
+ readonly refreshAfter: true;
3522
+ }, {
3523
+ readonly name: "clone_permission_set";
3524
+ readonly label: "Clone";
3525
+ readonly icon: "copy";
3526
+ readonly variant: "secondary";
3527
+ readonly mode: "custom";
3528
+ readonly locations: ["list_item", "record_header"];
3529
+ readonly type: "api";
3530
+ readonly method: "POST";
3531
+ readonly target: "/api/v1/data/sys_permission_set";
3532
+ readonly bodyExtra: {
3533
+ readonly active: true;
3534
+ };
3535
+ readonly successMessage: "Permission set cloned";
3536
+ readonly refreshAfter: true;
3537
+ readonly params: [{
3538
+ readonly name: "label";
3539
+ readonly label: "New Display Name";
3540
+ readonly type: "text";
3541
+ readonly required: true;
3542
+ }, {
3543
+ readonly name: "name";
3544
+ readonly label: "New API Name";
3545
+ readonly type: "text";
3546
+ readonly required: true;
3547
+ readonly helpText: "Unique snake_case machine name";
3548
+ }, {
3549
+ readonly field: "description";
3550
+ readonly defaultFromRow: true;
3551
+ }, {
3552
+ readonly field: "object_permissions";
3553
+ readonly defaultFromRow: true;
3554
+ }, {
3555
+ readonly field: "field_permissions";
3556
+ readonly defaultFromRow: true;
3557
+ }];
3558
+ }];
3559
+ readonly listViews: {
3560
+ readonly active: {
3561
+ readonly type: "grid";
3562
+ readonly name: "active";
3563
+ readonly label: "Active";
3564
+ readonly data: {
3565
+ readonly provider: "object";
3566
+ readonly object: "sys_permission_set";
3567
+ };
3568
+ readonly columns: ["label", "name", "description", "updated_at"];
3569
+ readonly filter: [{
3570
+ readonly field: "active";
3571
+ readonly operator: "equals";
3572
+ readonly value: true;
3573
+ }];
3574
+ readonly sort: [{
3575
+ readonly field: "label";
3576
+ readonly order: "asc";
3577
+ }];
3578
+ readonly pagination: {
3579
+ readonly pageSize: 50;
3580
+ };
3581
+ };
3582
+ readonly inactive: {
3583
+ readonly type: "grid";
3584
+ readonly name: "inactive";
3585
+ readonly label: "Inactive";
3586
+ readonly data: {
3587
+ readonly provider: "object";
3588
+ readonly object: "sys_permission_set";
3589
+ };
3590
+ readonly columns: ["label", "name", "updated_at"];
3591
+ readonly filter: [{
3592
+ readonly field: "active";
3593
+ readonly operator: "equals";
3594
+ readonly value: false;
3595
+ }];
3596
+ readonly sort: [{
3597
+ readonly field: "label";
3598
+ readonly order: "asc";
3599
+ }];
3600
+ readonly pagination: {
3601
+ readonly pageSize: 50;
3602
+ };
3603
+ };
3604
+ readonly all_permsets: {
3605
+ readonly type: "grid";
3606
+ readonly name: "all_permsets";
3607
+ readonly label: "All";
3608
+ readonly data: {
3609
+ readonly provider: "object";
3610
+ readonly object: "sys_permission_set";
3611
+ };
3612
+ readonly columns: ["label", "name", "active", "updated_at"];
3613
+ readonly sort: [{
3614
+ readonly field: "label";
3615
+ readonly order: "asc";
3616
+ }];
3617
+ readonly pagination: {
3618
+ readonly pageSize: 50;
3619
+ };
3620
+ };
3621
+ };
3622
+ readonly fields: {
3623
+ readonly label: {
3624
+ readonly readonly?: boolean | undefined;
3625
+ readonly format?: string | undefined;
3626
+ readonly options?: {
3627
+ label: string;
3628
+ value: string;
3629
+ color?: string | undefined;
3630
+ default?: boolean | undefined;
3631
+ }[] | undefined;
3632
+ readonly description?: string | undefined;
3633
+ readonly label?: string | undefined;
3634
+ readonly name?: string | undefined;
3635
+ readonly precision?: number | undefined;
3636
+ readonly required?: boolean | undefined;
3637
+ readonly multiple?: boolean | undefined;
3638
+ readonly dependencies?: string[] | undefined;
3639
+ readonly theme?: string | undefined;
3640
+ readonly externalId?: boolean | undefined;
3641
+ readonly system?: boolean | undefined;
3642
+ readonly min?: number | undefined;
3643
+ readonly max?: number | undefined;
3644
+ readonly group?: string | undefined;
3645
+ readonly encryptionConfig?: {
3646
+ enabled: boolean;
3647
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
3648
+ keyManagement: {
3649
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
3650
+ keyId?: string | undefined;
3651
+ rotationPolicy?: {
3652
+ enabled: boolean;
3653
+ frequencyDays: number;
3654
+ retainOldVersions: number;
3655
+ autoRotate: boolean;
3656
+ } | undefined;
3657
+ };
3658
+ scope: "record" | "field" | "table" | "database";
3659
+ deterministicEncryption: boolean;
3660
+ searchableEncryption: boolean;
3661
+ } | undefined;
3662
+ readonly columnName?: string | undefined;
3663
+ readonly searchable?: boolean | undefined;
3664
+ readonly unique?: boolean | undefined;
3665
+ readonly defaultValue?: unknown;
3666
+ readonly maxLength?: number | undefined;
3667
+ readonly minLength?: number | undefined;
3668
+ readonly scale?: number | undefined;
3669
+ readonly reference?: string | undefined;
3670
+ readonly referenceFilters?: string[] | undefined;
3671
+ readonly writeRequiresMasterRead?: boolean | undefined;
3672
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
3673
+ readonly expression?: {
3674
+ dialect: "cel" | "js" | "cron" | "template";
3675
+ source?: string | undefined;
3676
+ ast?: unknown;
3677
+ meta?: {
3678
+ rationale?: string | undefined;
3679
+ generatedBy?: string | undefined;
3680
+ } | undefined;
3681
+ } | undefined;
3682
+ readonly summaryOperations?: {
3683
+ object: string;
3684
+ field: string;
3685
+ function: "min" | "max" | "count" | "sum" | "avg";
3686
+ } | undefined;
3687
+ readonly language?: string | undefined;
3688
+ readonly lineNumbers?: boolean | undefined;
3689
+ readonly maxRating?: number | undefined;
3690
+ readonly allowHalf?: boolean | undefined;
3691
+ readonly displayMap?: boolean | undefined;
3692
+ readonly allowGeocoding?: boolean | undefined;
3693
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
3694
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
3695
+ readonly allowAlpha?: boolean | undefined;
3696
+ readonly presetColors?: string[] | undefined;
3697
+ readonly step?: number | undefined;
3698
+ readonly showValue?: boolean | undefined;
3699
+ readonly marks?: Record<string, string> | undefined;
3700
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
3701
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
3702
+ readonly displayValue?: boolean | undefined;
3703
+ readonly allowScanning?: boolean | undefined;
3704
+ readonly currencyConfig?: {
3705
+ precision: number;
3706
+ currencyMode: "fixed" | "dynamic";
3707
+ defaultCurrency: string;
3708
+ } | undefined;
3709
+ readonly vectorConfig?: {
3710
+ dimensions: number;
3711
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
3712
+ normalized: boolean;
3713
+ indexed: boolean;
3714
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
3715
+ } | undefined;
3716
+ readonly fileAttachmentConfig?: {
3717
+ virusScan: boolean;
3718
+ virusScanOnUpload: boolean;
3719
+ quarantineOnThreat: boolean;
3720
+ allowMultiple: boolean;
3721
+ allowReplace: boolean;
3722
+ allowDelete: boolean;
3723
+ requireUpload: boolean;
3724
+ extractMetadata: boolean;
3725
+ extractText: boolean;
3726
+ versioningEnabled: boolean;
3727
+ publicRead: boolean;
3728
+ presignedUrlExpiry: number;
3729
+ minSize?: number | undefined;
3730
+ maxSize?: number | undefined;
3731
+ allowedTypes?: string[] | undefined;
3732
+ blockedTypes?: string[] | undefined;
3733
+ allowedMimeTypes?: string[] | undefined;
3734
+ blockedMimeTypes?: string[] | undefined;
3735
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
3736
+ storageProvider?: string | undefined;
3737
+ storageBucket?: string | undefined;
3738
+ storagePrefix?: string | undefined;
3739
+ imageValidation?: {
3740
+ generateThumbnails: boolean;
3741
+ preserveMetadata: boolean;
3742
+ autoRotate: boolean;
3743
+ minWidth?: number | undefined;
3744
+ maxWidth?: number | undefined;
3745
+ minHeight?: number | undefined;
3746
+ maxHeight?: number | undefined;
3747
+ aspectRatio?: string | undefined;
3748
+ thumbnailSizes?: {
3749
+ name: string;
3750
+ width: number;
3751
+ height: number;
3752
+ crop: boolean;
3753
+ }[] | undefined;
3754
+ } | undefined;
3755
+ maxVersions?: number | undefined;
3756
+ } | undefined;
3757
+ readonly maskingRule?: {
3758
+ field: string;
3759
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
3760
+ preserveFormat: boolean;
3761
+ preserveLength: boolean;
3762
+ pattern?: string | undefined;
3763
+ roles?: string[] | undefined;
3764
+ exemptRoles?: string[] | undefined;
3765
+ } | undefined;
3766
+ readonly auditTrail?: boolean | undefined;
3767
+ readonly cached?: {
3768
+ enabled: boolean;
3769
+ ttl: number;
3770
+ invalidateOn: string[];
3771
+ } | undefined;
3772
+ readonly dataQuality?: {
3773
+ uniqueness: boolean;
3774
+ completeness: number;
3775
+ accuracy?: {
3776
+ source: string;
3777
+ threshold: number;
3778
+ } | undefined;
3779
+ } | undefined;
3780
+ readonly conditionalRequired?: {
3781
+ dialect: "cel" | "js" | "cron" | "template";
3782
+ source?: string | undefined;
3783
+ ast?: unknown;
3784
+ meta?: {
3785
+ rationale?: string | undefined;
3786
+ generatedBy?: string | undefined;
3787
+ } | undefined;
3788
+ } | undefined;
3789
+ readonly hidden?: boolean | undefined;
3790
+ readonly sortable?: boolean | undefined;
3791
+ readonly inlineHelpText?: string | undefined;
3792
+ readonly trackFeedHistory?: boolean | undefined;
3793
+ readonly caseSensitive?: boolean | undefined;
3794
+ readonly autonumberFormat?: string | undefined;
3795
+ readonly index?: boolean | undefined;
3796
+ readonly type: "text";
3797
+ };
3798
+ readonly name: {
3799
+ readonly readonly?: boolean | undefined;
3800
+ readonly format?: string | undefined;
3801
+ readonly options?: {
3802
+ label: string;
3803
+ value: string;
3804
+ color?: string | undefined;
3805
+ default?: boolean | undefined;
3806
+ }[] | undefined;
3807
+ readonly description?: string | undefined;
3808
+ readonly label?: string | undefined;
3809
+ readonly name?: string | undefined;
3810
+ readonly precision?: number | undefined;
3811
+ readonly required?: boolean | undefined;
3812
+ readonly multiple?: boolean | undefined;
3813
+ readonly dependencies?: string[] | undefined;
3814
+ readonly theme?: string | undefined;
3815
+ readonly externalId?: boolean | undefined;
3816
+ readonly system?: boolean | undefined;
3817
+ readonly min?: number | undefined;
3818
+ readonly max?: number | undefined;
3819
+ readonly group?: string | undefined;
3820
+ readonly encryptionConfig?: {
3821
+ enabled: boolean;
3822
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
3823
+ keyManagement: {
3824
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
3825
+ keyId?: string | undefined;
3826
+ rotationPolicy?: {
3827
+ enabled: boolean;
3828
+ frequencyDays: number;
3829
+ retainOldVersions: number;
3830
+ autoRotate: boolean;
3831
+ } | undefined;
3832
+ };
3833
+ scope: "record" | "field" | "table" | "database";
3834
+ deterministicEncryption: boolean;
3835
+ searchableEncryption: boolean;
3836
+ } | undefined;
3837
+ readonly columnName?: string | undefined;
3838
+ readonly searchable?: boolean | undefined;
3839
+ readonly unique?: boolean | undefined;
3840
+ readonly defaultValue?: unknown;
3841
+ readonly maxLength?: number | undefined;
3842
+ readonly minLength?: number | undefined;
3843
+ readonly scale?: number | undefined;
3844
+ readonly reference?: string | undefined;
3845
+ readonly referenceFilters?: string[] | undefined;
3846
+ readonly writeRequiresMasterRead?: boolean | undefined;
3847
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
3848
+ readonly expression?: {
3849
+ dialect: "cel" | "js" | "cron" | "template";
3850
+ source?: string | undefined;
3851
+ ast?: unknown;
3852
+ meta?: {
3853
+ rationale?: string | undefined;
3854
+ generatedBy?: string | undefined;
3855
+ } | undefined;
3856
+ } | undefined;
3857
+ readonly summaryOperations?: {
3858
+ object: string;
3859
+ field: string;
3860
+ function: "min" | "max" | "count" | "sum" | "avg";
3861
+ } | undefined;
3862
+ readonly language?: string | undefined;
3863
+ readonly lineNumbers?: boolean | undefined;
3864
+ readonly maxRating?: number | undefined;
3865
+ readonly allowHalf?: boolean | undefined;
3866
+ readonly displayMap?: boolean | undefined;
3867
+ readonly allowGeocoding?: boolean | undefined;
3868
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
3869
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
3870
+ readonly allowAlpha?: boolean | undefined;
3871
+ readonly presetColors?: string[] | undefined;
3872
+ readonly step?: number | undefined;
3873
+ readonly showValue?: boolean | undefined;
3874
+ readonly marks?: Record<string, string> | undefined;
3875
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
3876
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
3877
+ readonly displayValue?: boolean | undefined;
3878
+ readonly allowScanning?: boolean | undefined;
3879
+ readonly currencyConfig?: {
3880
+ precision: number;
3881
+ currencyMode: "fixed" | "dynamic";
3882
+ defaultCurrency: string;
3883
+ } | undefined;
3884
+ readonly vectorConfig?: {
3885
+ dimensions: number;
3886
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
3887
+ normalized: boolean;
3888
+ indexed: boolean;
3889
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
3890
+ } | undefined;
3891
+ readonly fileAttachmentConfig?: {
3892
+ virusScan: boolean;
3893
+ virusScanOnUpload: boolean;
3894
+ quarantineOnThreat: boolean;
3895
+ allowMultiple: boolean;
3896
+ allowReplace: boolean;
3897
+ allowDelete: boolean;
3898
+ requireUpload: boolean;
3899
+ extractMetadata: boolean;
3900
+ extractText: boolean;
3901
+ versioningEnabled: boolean;
3902
+ publicRead: boolean;
3903
+ presignedUrlExpiry: number;
3904
+ minSize?: number | undefined;
3905
+ maxSize?: number | undefined;
3906
+ allowedTypes?: string[] | undefined;
3907
+ blockedTypes?: string[] | undefined;
3908
+ allowedMimeTypes?: string[] | undefined;
3909
+ blockedMimeTypes?: string[] | undefined;
3910
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
3911
+ storageProvider?: string | undefined;
3912
+ storageBucket?: string | undefined;
3913
+ storagePrefix?: string | undefined;
3914
+ imageValidation?: {
3915
+ generateThumbnails: boolean;
3916
+ preserveMetadata: boolean;
3917
+ autoRotate: boolean;
3918
+ minWidth?: number | undefined;
3919
+ maxWidth?: number | undefined;
3920
+ minHeight?: number | undefined;
3921
+ maxHeight?: number | undefined;
3922
+ aspectRatio?: string | undefined;
3923
+ thumbnailSizes?: {
3924
+ name: string;
3925
+ width: number;
3926
+ height: number;
3927
+ crop: boolean;
3928
+ }[] | undefined;
3929
+ } | undefined;
3930
+ maxVersions?: number | undefined;
3931
+ } | undefined;
3932
+ readonly maskingRule?: {
3933
+ field: string;
3934
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
3935
+ preserveFormat: boolean;
3936
+ preserveLength: boolean;
3937
+ pattern?: string | undefined;
3938
+ roles?: string[] | undefined;
3939
+ exemptRoles?: string[] | undefined;
3940
+ } | undefined;
3941
+ readonly auditTrail?: boolean | undefined;
3942
+ readonly cached?: {
3943
+ enabled: boolean;
3944
+ ttl: number;
3945
+ invalidateOn: string[];
3946
+ } | undefined;
3947
+ readonly dataQuality?: {
3948
+ uniqueness: boolean;
3949
+ completeness: number;
3950
+ accuracy?: {
3951
+ source: string;
3952
+ threshold: number;
3953
+ } | undefined;
3954
+ } | undefined;
3955
+ readonly conditionalRequired?: {
3956
+ dialect: "cel" | "js" | "cron" | "template";
3957
+ source?: string | undefined;
3958
+ ast?: unknown;
3959
+ meta?: {
3960
+ rationale?: string | undefined;
3961
+ generatedBy?: string | undefined;
3962
+ } | undefined;
3963
+ } | undefined;
3964
+ readonly hidden?: boolean | undefined;
3965
+ readonly sortable?: boolean | undefined;
3966
+ readonly inlineHelpText?: string | undefined;
3967
+ readonly trackFeedHistory?: boolean | undefined;
3968
+ readonly caseSensitive?: boolean | undefined;
3969
+ readonly autonumberFormat?: string | undefined;
3970
+ readonly index?: boolean | undefined;
3971
+ readonly type: "text";
3972
+ };
3973
+ readonly description: {
3974
+ readonly readonly?: boolean | undefined;
3975
+ readonly format?: string | undefined;
3976
+ readonly options?: {
3977
+ label: string;
3978
+ value: string;
3979
+ color?: string | undefined;
3980
+ default?: boolean | undefined;
3981
+ }[] | undefined;
3982
+ readonly description?: string | undefined;
3983
+ readonly label?: string | undefined;
3984
+ readonly name?: string | undefined;
3985
+ readonly precision?: number | undefined;
3986
+ readonly required?: boolean | undefined;
3987
+ readonly multiple?: boolean | undefined;
3988
+ readonly dependencies?: string[] | undefined;
3989
+ readonly theme?: string | undefined;
3990
+ readonly externalId?: boolean | undefined;
3991
+ readonly system?: boolean | undefined;
3992
+ readonly min?: number | undefined;
3993
+ readonly max?: number | undefined;
3994
+ readonly group?: string | undefined;
3995
+ readonly encryptionConfig?: {
3996
+ enabled: boolean;
3997
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
3998
+ keyManagement: {
3999
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
4000
+ keyId?: string | undefined;
4001
+ rotationPolicy?: {
4002
+ enabled: boolean;
4003
+ frequencyDays: number;
4004
+ retainOldVersions: number;
4005
+ autoRotate: boolean;
4006
+ } | undefined;
4007
+ };
4008
+ scope: "record" | "field" | "table" | "database";
4009
+ deterministicEncryption: boolean;
4010
+ searchableEncryption: boolean;
4011
+ } | undefined;
4012
+ readonly columnName?: string | undefined;
4013
+ readonly searchable?: boolean | undefined;
4014
+ readonly unique?: boolean | undefined;
4015
+ readonly defaultValue?: unknown;
4016
+ readonly maxLength?: number | undefined;
4017
+ readonly minLength?: number | undefined;
4018
+ readonly scale?: number | undefined;
4019
+ readonly reference?: string | undefined;
4020
+ readonly referenceFilters?: string[] | undefined;
4021
+ readonly writeRequiresMasterRead?: boolean | undefined;
4022
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
4023
+ readonly expression?: {
4024
+ dialect: "cel" | "js" | "cron" | "template";
4025
+ source?: string | undefined;
4026
+ ast?: unknown;
4027
+ meta?: {
4028
+ rationale?: string | undefined;
4029
+ generatedBy?: string | undefined;
4030
+ } | undefined;
4031
+ } | undefined;
4032
+ readonly summaryOperations?: {
4033
+ object: string;
4034
+ field: string;
4035
+ function: "min" | "max" | "count" | "sum" | "avg";
4036
+ } | undefined;
4037
+ readonly language?: string | undefined;
4038
+ readonly lineNumbers?: boolean | undefined;
4039
+ readonly maxRating?: number | undefined;
4040
+ readonly allowHalf?: boolean | undefined;
4041
+ readonly displayMap?: boolean | undefined;
4042
+ readonly allowGeocoding?: boolean | undefined;
4043
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
4044
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
4045
+ readonly allowAlpha?: boolean | undefined;
4046
+ readonly presetColors?: string[] | undefined;
4047
+ readonly step?: number | undefined;
4048
+ readonly showValue?: boolean | undefined;
4049
+ readonly marks?: Record<string, string> | undefined;
4050
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
4051
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
4052
+ readonly displayValue?: boolean | undefined;
4053
+ readonly allowScanning?: boolean | undefined;
4054
+ readonly currencyConfig?: {
4055
+ precision: number;
4056
+ currencyMode: "fixed" | "dynamic";
4057
+ defaultCurrency: string;
4058
+ } | undefined;
4059
+ readonly vectorConfig?: {
4060
+ dimensions: number;
4061
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
4062
+ normalized: boolean;
4063
+ indexed: boolean;
4064
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
4065
+ } | undefined;
4066
+ readonly fileAttachmentConfig?: {
4067
+ virusScan: boolean;
4068
+ virusScanOnUpload: boolean;
4069
+ quarantineOnThreat: boolean;
4070
+ allowMultiple: boolean;
4071
+ allowReplace: boolean;
4072
+ allowDelete: boolean;
4073
+ requireUpload: boolean;
4074
+ extractMetadata: boolean;
4075
+ extractText: boolean;
4076
+ versioningEnabled: boolean;
4077
+ publicRead: boolean;
4078
+ presignedUrlExpiry: number;
4079
+ minSize?: number | undefined;
4080
+ maxSize?: number | undefined;
4081
+ allowedTypes?: string[] | undefined;
4082
+ blockedTypes?: string[] | undefined;
4083
+ allowedMimeTypes?: string[] | undefined;
4084
+ blockedMimeTypes?: string[] | undefined;
4085
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
4086
+ storageProvider?: string | undefined;
4087
+ storageBucket?: string | undefined;
4088
+ storagePrefix?: string | undefined;
4089
+ imageValidation?: {
4090
+ generateThumbnails: boolean;
4091
+ preserveMetadata: boolean;
4092
+ autoRotate: boolean;
4093
+ minWidth?: number | undefined;
4094
+ maxWidth?: number | undefined;
4095
+ minHeight?: number | undefined;
4096
+ maxHeight?: number | undefined;
4097
+ aspectRatio?: string | undefined;
4098
+ thumbnailSizes?: {
4099
+ name: string;
4100
+ width: number;
4101
+ height: number;
4102
+ crop: boolean;
4103
+ }[] | undefined;
4104
+ } | undefined;
4105
+ maxVersions?: number | undefined;
4106
+ } | undefined;
4107
+ readonly maskingRule?: {
4108
+ field: string;
4109
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
4110
+ preserveFormat: boolean;
4111
+ preserveLength: boolean;
4112
+ pattern?: string | undefined;
4113
+ roles?: string[] | undefined;
4114
+ exemptRoles?: string[] | undefined;
3432
4115
  } | undefined;
3433
- } | undefined;
3434
- shortcut?: string | undefined;
3435
- bulkEnabled?: boolean | undefined;
3436
- aiExposed?: boolean | undefined;
3437
- recordIdParam?: string | undefined;
3438
- recordIdField?: string | undefined;
3439
- bodyShape?: "flat" | {
3440
- wrap: string;
3441
- } | undefined;
3442
- method?: "POST" | "PATCH" | "PUT" | "DELETE" | undefined;
3443
- bodyExtra?: Record<string, unknown> | undefined;
3444
- mode?: "custom" | "delete" | "create" | "edit" | undefined;
3445
- timeout?: number | undefined;
3446
- aria?: {
3447
- ariaLabel?: string | undefined;
3448
- ariaDescribedBy?: string | undefined;
3449
- role?: string | undefined;
3450
- } | undefined;
3451
- }[] | undefined;
3452
- }, "fields"> & Pick<{
3453
- readonly name: "sys_permission_set";
3454
- readonly label: "Permission Set";
3455
- readonly pluralLabel: "Permission Sets";
3456
- readonly icon: "lock";
3457
- readonly isSystem: true;
3458
- readonly managedBy: "config";
3459
- readonly description: "Named permission groupings for fine-grained access control";
3460
- readonly displayNameField: "label";
3461
- readonly titleFormat: "{label}";
3462
- readonly compactLayout: ["label", "name", "active"];
3463
- readonly actions: [{
3464
- readonly name: "activate_permission_set";
3465
- readonly label: "Activate";
3466
- readonly icon: "circle-check";
3467
- readonly variant: "secondary";
3468
- readonly mode: "custom";
3469
- readonly locations: ["list_item", "record_header"];
3470
- readonly type: "api";
3471
- readonly method: "PATCH";
3472
- readonly target: "/api/v1/data/sys_permission_set/{id}";
3473
- readonly bodyExtra: {
3474
- readonly active: true;
3475
- };
3476
- readonly successMessage: "Permission set activated";
3477
- readonly refreshAfter: true;
3478
- }, {
3479
- readonly name: "deactivate_permission_set";
3480
- readonly label: "Deactivate";
3481
- readonly icon: "circle-off";
3482
- readonly variant: "danger";
3483
- readonly mode: "custom";
3484
- readonly locations: ["list_item", "record_header"];
3485
- readonly type: "api";
3486
- readonly method: "PATCH";
3487
- readonly target: "/api/v1/data/sys_permission_set/{id}";
3488
- readonly bodyExtra: {
3489
- readonly active: false;
3490
- };
3491
- readonly confirmText: "Deactivate this permission set? Existing assignments stay in place but stop granting access until re-activated.";
3492
- readonly successMessage: "Permission set deactivated";
3493
- readonly refreshAfter: true;
3494
- }, {
3495
- readonly name: "clone_permission_set";
3496
- readonly label: "Clone";
3497
- readonly icon: "copy";
3498
- readonly variant: "secondary";
3499
- readonly mode: "custom";
3500
- readonly locations: ["list_item", "record_header"];
3501
- readonly type: "api";
3502
- readonly method: "POST";
3503
- readonly target: "/api/v1/data/sys_permission_set";
3504
- readonly bodyExtra: {
3505
- readonly active: true;
3506
- };
3507
- readonly successMessage: "Permission set cloned";
3508
- readonly refreshAfter: true;
3509
- readonly params: [{
3510
- readonly name: "label";
3511
- readonly label: "New Display Name";
3512
- readonly type: "text";
3513
- readonly required: true;
3514
- }, {
3515
- readonly name: "name";
3516
- readonly label: "New API Name";
3517
- readonly type: "text";
3518
- readonly required: true;
3519
- readonly helpText: "Unique snake_case machine name";
3520
- }, {
3521
- readonly field: "description";
3522
- readonly defaultFromRow: true;
3523
- }, {
3524
- readonly field: "object_permissions";
3525
- readonly defaultFromRow: true;
3526
- }, {
3527
- readonly field: "field_permissions";
3528
- readonly defaultFromRow: true;
3529
- }];
3530
- }];
3531
- readonly listViews: {
3532
- readonly active: {
3533
- readonly type: "grid";
3534
- readonly name: "active";
3535
- readonly label: "Active";
3536
- readonly data: {
3537
- readonly provider: "object";
3538
- readonly object: "sys_permission_set";
3539
- };
3540
- readonly columns: ["label", "name", "description", "updated_at"];
3541
- readonly filter: [{
3542
- readonly field: "active";
3543
- readonly operator: "equals";
3544
- readonly value: true;
3545
- }];
3546
- readonly sort: [{
3547
- readonly field: "label";
3548
- readonly order: "asc";
3549
- }];
3550
- readonly pagination: {
3551
- readonly pageSize: 50;
3552
- };
3553
- };
3554
- readonly inactive: {
3555
- readonly type: "grid";
3556
- readonly name: "inactive";
3557
- readonly label: "Inactive";
3558
- readonly data: {
3559
- readonly provider: "object";
3560
- readonly object: "sys_permission_set";
3561
- };
3562
- readonly columns: ["label", "name", "updated_at"];
3563
- readonly filter: [{
3564
- readonly field: "active";
3565
- readonly operator: "equals";
3566
- readonly value: false;
3567
- }];
3568
- readonly sort: [{
3569
- readonly field: "label";
3570
- readonly order: "asc";
3571
- }];
3572
- readonly pagination: {
3573
- readonly pageSize: 50;
3574
- };
3575
- };
3576
- readonly all_permsets: {
3577
- readonly type: "grid";
3578
- readonly name: "all_permsets";
3579
- readonly label: "All";
3580
- readonly data: {
3581
- readonly provider: "object";
3582
- readonly object: "sys_permission_set";
3583
- };
3584
- readonly columns: ["label", "name", "active", "updated_at"];
3585
- readonly sort: [{
3586
- readonly field: "label";
3587
- readonly order: "asc";
3588
- }];
3589
- readonly pagination: {
3590
- readonly pageSize: 50;
3591
- };
4116
+ readonly auditTrail?: boolean | undefined;
4117
+ readonly cached?: {
4118
+ enabled: boolean;
4119
+ ttl: number;
4120
+ invalidateOn: string[];
4121
+ } | undefined;
4122
+ readonly dataQuality?: {
4123
+ uniqueness: boolean;
4124
+ completeness: number;
4125
+ accuracy?: {
4126
+ source: string;
4127
+ threshold: number;
4128
+ } | undefined;
4129
+ } | undefined;
4130
+ readonly conditionalRequired?: {
4131
+ dialect: "cel" | "js" | "cron" | "template";
4132
+ source?: string | undefined;
4133
+ ast?: unknown;
4134
+ meta?: {
4135
+ rationale?: string | undefined;
4136
+ generatedBy?: string | undefined;
4137
+ } | undefined;
4138
+ } | undefined;
4139
+ readonly hidden?: boolean | undefined;
4140
+ readonly sortable?: boolean | undefined;
4141
+ readonly inlineHelpText?: string | undefined;
4142
+ readonly trackFeedHistory?: boolean | undefined;
4143
+ readonly caseSensitive?: boolean | undefined;
4144
+ readonly autonumberFormat?: string | undefined;
4145
+ readonly index?: boolean | undefined;
4146
+ readonly type: "textarea";
3592
4147
  };
3593
- };
3594
- readonly fields: {
3595
- readonly label: {
4148
+ readonly object_permissions: {
3596
4149
  readonly readonly?: boolean | undefined;
3597
4150
  readonly format?: string | undefined;
3598
4151
  readonly options?: {
@@ -3765,9 +4318,9 @@ declare const securityObjects: ((Omit<{
3765
4318
  readonly caseSensitive?: boolean | undefined;
3766
4319
  readonly autonumberFormat?: string | undefined;
3767
4320
  readonly index?: boolean | undefined;
3768
- readonly type: "text";
4321
+ readonly type: "textarea";
3769
4322
  };
3770
- readonly name: {
4323
+ readonly field_permissions: {
3771
4324
  readonly readonly?: boolean | undefined;
3772
4325
  readonly format?: string | undefined;
3773
4326
  readonly options?: {
@@ -3940,9 +4493,9 @@ declare const securityObjects: ((Omit<{
3940
4493
  readonly caseSensitive?: boolean | undefined;
3941
4494
  readonly autonumberFormat?: string | undefined;
3942
4495
  readonly index?: boolean | undefined;
3943
- readonly type: "text";
4496
+ readonly type: "textarea";
3944
4497
  };
3945
- readonly description: {
4498
+ readonly system_permissions: {
3946
4499
  readonly readonly?: boolean | undefined;
3947
4500
  readonly format?: string | undefined;
3948
4501
  readonly options?: {
@@ -4117,7 +4670,7 @@ declare const securityObjects: ((Omit<{
4117
4670
  readonly index?: boolean | undefined;
4118
4671
  readonly type: "textarea";
4119
4672
  };
4120
- readonly object_permissions: {
4673
+ readonly row_level_security: {
4121
4674
  readonly readonly?: boolean | undefined;
4122
4675
  readonly format?: string | undefined;
4123
4676
  readonly options?: {
@@ -4292,7 +4845,7 @@ declare const securityObjects: ((Omit<{
4292
4845
  readonly index?: boolean | undefined;
4293
4846
  readonly type: "textarea";
4294
4847
  };
4295
- readonly field_permissions: {
4848
+ readonly tab_permissions: {
4296
4849
  readonly readonly?: boolean | undefined;
4297
4850
  readonly format?: string | undefined;
4298
4851
  readonly options?: {
@@ -5769,6 +6322,14 @@ declare const securityObjects: ((Omit<{
5769
6322
  } | undefined;
5770
6323
  recordTypes?: string[] | undefined;
5771
6324
  sharingModel?: "read" | "full" | "private" | "read_write" | undefined;
6325
+ publicSharing?: {
6326
+ enabled: boolean;
6327
+ allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
6328
+ allowedPermissions?: ("edit" | "view" | "comment")[] | undefined;
6329
+ maxExpiryDays?: number | undefined;
6330
+ redactFields?: string[] | undefined;
6331
+ eligibility?: string | undefined;
6332
+ } | undefined;
5772
6333
  keyPrefix?: string | undefined;
5773
6334
  detail?: {
5774
6335
  [x: string]: unknown;
@@ -5783,7 +6344,7 @@ declare const securityObjects: ((Omit<{
5783
6344
  refreshAfter: boolean;
5784
6345
  objectName?: string | undefined;
5785
6346
  icon?: string | undefined;
5786
- locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "global_nav")[] | undefined;
6347
+ locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "record_section" | "global_nav")[] | undefined;
5787
6348
  component?: "action:button" | "action:icon" | "action:menu" | "action:group" | undefined;
5788
6349
  target?: string | undefined;
5789
6350
  body?: {
@@ -5816,6 +6377,17 @@ declare const securityObjects: ((Omit<{
5816
6377
  variant?: "link" | "primary" | "secondary" | "danger" | "ghost" | undefined;
5817
6378
  confirmText?: string | undefined;
5818
6379
  successMessage?: string | undefined;
6380
+ resultDialog?: {
6381
+ title?: string | undefined;
6382
+ description?: string | undefined;
6383
+ acknowledge?: string | undefined;
6384
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
6385
+ fields?: {
6386
+ path: string;
6387
+ label?: string | undefined;
6388
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
6389
+ }[] | undefined;
6390
+ } | undefined;
5819
6391
  visible?: {
5820
6392
  dialect: "cel" | "js" | "cron" | "template";
5821
6393
  source?: string | undefined;
@@ -7694,6 +8266,14 @@ declare const securityObjects: ((Omit<{
7694
8266
  } | undefined;
7695
8267
  recordTypes?: string[] | undefined;
7696
8268
  sharingModel?: "read" | "full" | "private" | "read_write" | undefined;
8269
+ publicSharing?: {
8270
+ enabled: boolean;
8271
+ allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
8272
+ allowedPermissions?: ("edit" | "view" | "comment")[] | undefined;
8273
+ maxExpiryDays?: number | undefined;
8274
+ redactFields?: string[] | undefined;
8275
+ eligibility?: string | undefined;
8276
+ } | undefined;
7697
8277
  keyPrefix?: string | undefined;
7698
8278
  detail?: {
7699
8279
  [x: string]: unknown;
@@ -7708,7 +8288,7 @@ declare const securityObjects: ((Omit<{
7708
8288
  refreshAfter: boolean;
7709
8289
  objectName?: string | undefined;
7710
8290
  icon?: string | undefined;
7711
- locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "global_nav")[] | undefined;
8291
+ locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "record_section" | "global_nav")[] | undefined;
7712
8292
  component?: "action:button" | "action:icon" | "action:menu" | "action:group" | undefined;
7713
8293
  target?: string | undefined;
7714
8294
  body?: {
@@ -7741,6 +8321,17 @@ declare const securityObjects: ((Omit<{
7741
8321
  variant?: "link" | "primary" | "secondary" | "danger" | "ghost" | undefined;
7742
8322
  confirmText?: string | undefined;
7743
8323
  successMessage?: string | undefined;
8324
+ resultDialog?: {
8325
+ title?: string | undefined;
8326
+ description?: string | undefined;
8327
+ acknowledge?: string | undefined;
8328
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
8329
+ fields?: {
8330
+ path: string;
8331
+ label?: string | undefined;
8332
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
8333
+ }[] | undefined;
8334
+ } | undefined;
7744
8335
  visible?: {
7745
8336
  dialect: "cel" | "js" | "cron" | "template";
7746
8337
  source?: string | undefined;
@@ -8730,78 +9321,43 @@ declare const securityPluginManifestHeader: {
8730
9321
  description: string;
8731
9322
  };
8732
9323
 
9324
+ interface MaybeLogger {
9325
+ info?: (message: string, meta?: Record<string, any>) => void;
9326
+ warn?: (message: string, meta?: Record<string, any>) => void;
9327
+ debug?: (message: string, meta?: Record<string, any>) => void;
9328
+ }
8733
9329
  /**
8734
- * ensureUserHasOrganization auto-create a personal org for new users.
9330
+ * Ensure (or revoke) the org-scoped `organization_admin` grant for
9331
+ * `(userId, orgId)` based on the current `sys_member` rows.
8735
9332
  *
8736
- * In multi-tenant mode, every record visible through the default
8737
- * `tenant_isolation` RLS policy must have an `organization_id`, and
8738
- * every authenticated user must have an `activeOrganizationId` on their
8739
- * session for that policy to evaluate to anything other than "deny
8740
- * all". A user with zero `sys_member` rows, however, can sign in
8741
- * successfully and reach the dashboard — the dashboard's
8742
- * `RequireOrganization` guard has a single-tenant carve-out that lets
8743
- * users with empty organization lists through, so they land on a UI
8744
- * that simply hides every record. The standard remedy ("invite users
8745
- * via an admin") doesn't apply to self-service signup.
9333
+ * - If ANY membership row for the pair carries an owner/admin role,
9334
+ * ensure exactly one `sys_user_permission_set` row exists.
9335
+ * - Else, remove every `sys_user_permission_set` row that links the
9336
+ * pair to `organization_admin` (handles demotion and membership
9337
+ * removal symmetrically).
8746
9338
  *
8747
- * This helper, run right after a `sys_user` insert, ensures the new
8748
- * user has at least one organization by creating a personal workspace
8749
- * (named "<User>'s Workspace", slug `<username>-workspace`) and an
8750
- * owner-role `sys_member` row. The user's session will pick this up as
8751
- * their `activeOrganizationId` on the next sign-in / org-list refresh
8752
- * (better-auth's `setActiveOrganization` runs lazily when the picker
8753
- * sees exactly one membership).
8754
- *
8755
- * Idempotent: bails out if the user already has any `sys_member` row.
8756
- * Slug collisions retry with a numeric suffix; a cap of 5 attempts
8757
- * means a pathological username will fail loudly rather than loop.
9339
+ * Returns a structured report for observability. Never throws.
8758
9340
  */
8759
- interface EnsureOptions {
8760
- logger?: {
8761
- info: (message: string, meta?: Record<string, any>) => void;
8762
- warn: (message: string, meta?: Record<string, any>) => void;
8763
- };
8764
- /**
8765
- * Optional hook called after a personal org is successfully created.
8766
- * Used by SecurityPlugin to wire in `cloneTenantSeedData` so each
8767
- * new workspace gets its own copy of demo data. Pulled in via DI
8768
- * to keep this helper free of a hard import on the cloner (which
8769
- * keeps the tenant-claim and ensure-org test surfaces narrow).
8770
- */
8771
- cloneSeedData?: (ql: any, targetOrgId: string, opts: {
8772
- logger?: EnsureOptions['logger'];
8773
- }) => Promise<{
8774
- object: string;
8775
- count: number;
8776
- }[]>;
8777
- }
9341
+ declare function reconcileOrgAdminGrant(ql: any, userId: string, orgId: string, options?: {
9342
+ logger?: MaybeLogger;
9343
+ }): Promise<{
9344
+ action: 'granted' | 'revoked' | 'noop' | 'skipped';
9345
+ reason?: string;
9346
+ }>;
8778
9347
  /**
8779
- * Ensure `user` has at least one `sys_member` row. Creates a personal
8780
- * organization owned by them if not.
8781
- *
8782
- * Returns `{ created: true, organizationId }` when a new org was made,
8783
- * or `{ created: false, reason }` when the user already has memberships
8784
- * or the operation was skipped.
9348
+ * Reconcile every `(user_id, organization_id)` pair that has at least
9349
+ * one `sys_member` row. Used by `kernel:ready` to backfill grants for
9350
+ * memberships that pre-date this feature, and as a safety net after
9351
+ * the platform admin bootstrap auto-creates the default organization.
8785
9352
  */
8786
- declare function ensureUserHasOrganization(ql: any, user: {
8787
- id: string;
8788
- name?: string;
8789
- email?: string;
8790
- }, options?: EnsureOptions): Promise<{
8791
- created: boolean;
8792
- organizationId?: string;
8793
- reason?: string;
9353
+ declare function backfillOrgAdminGrants(ql: any, options?: {
9354
+ logger?: MaybeLogger;
9355
+ limit?: number;
9356
+ }): Promise<{
9357
+ scanned: number;
9358
+ granted: number;
9359
+ revoked: number;
9360
+ skipped: number;
8794
9361
  }>;
8795
9362
 
8796
- interface CloneOptions {
8797
- logger?: {
8798
- info: (message: string, meta?: Record<string, any>) => void;
8799
- warn: (message: string, meta?: Record<string, any>) => void;
8800
- };
8801
- }
8802
- declare function cloneTenantSeedData(ql: any, targetOrgId: string, options?: CloneOptions): Promise<{
8803
- object: string;
8804
- count: number;
8805
- }[]>;
8806
-
8807
- export { FieldMasker, PermissionDeniedError, PermissionEvaluator, RLSCompiler, RLS_DENY_FILTER, SECURITY_PLUGIN_ID, SECURITY_PLUGIN_VERSION, SecurityPlugin, cloneTenantSeedData, ensureUserHasOrganization, isPermissionDeniedError, securityDefaultPermissionSets, securityObjects, securityPluginManifestHeader };
9363
+ export { FieldMasker, PermissionDeniedError, PermissionEvaluator, RLSCompiler, RLS_DENY_FILTER, SECURITY_PLUGIN_ID, SECURITY_PLUGIN_VERSION, SecurityPlugin, backfillOrgAdminGrants, isPermissionDeniedError, reconcileOrgAdminGrant, securityDefaultPermissionSets, securityObjects, securityPluginManifestHeader };