@objectstack/platform-objects 5.1.0 → 5.2.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.
@@ -15557,6 +15557,49 @@ declare const SysNotification: Omit<{
15557
15557
  readonly displayNameField: "title";
15558
15558
  readonly titleFormat: "{title}";
15559
15559
  readonly compactLayout: ["title", "type", "is_read", "created_at"];
15560
+ /**
15561
+ * Row-level inbox actions. Use `visible` CEL expressions to ensure
15562
+ * `mark_read` only shows on unread rows and vice-versa, mirroring the
15563
+ * mark-as-read affordances in GitHub / Linear inboxes. The toolbar-level
15564
+ * `mark_all_read` is intentionally omitted server-side: it requires a
15565
+ * bulk update primitive that doesn't yet exist on the REST surface, and
15566
+ * the popover already handles the multi-row case client-side via N
15567
+ * single-row PATCHes (see `InboxPopover.tsx` -> AppHeader `markAllRead`).
15568
+ */
15569
+ readonly actions: [{
15570
+ readonly name: "mark_read";
15571
+ readonly label: "Mark as Read";
15572
+ readonly icon: "check";
15573
+ readonly variant: "secondary";
15574
+ readonly mode: "custom";
15575
+ readonly locations: ["list_item"];
15576
+ readonly type: "api";
15577
+ readonly method: "PATCH";
15578
+ readonly target: "/api/v1/data/sys_notification/{id}";
15579
+ readonly bodyExtra: {
15580
+ readonly is_read: true;
15581
+ };
15582
+ readonly visible: "!record.is_read";
15583
+ readonly successMessage: "Notification marked as read";
15584
+ readonly refreshAfter: true;
15585
+ }, {
15586
+ readonly name: "mark_unread";
15587
+ readonly label: "Mark as Unread";
15588
+ readonly icon: "bell-dot";
15589
+ readonly variant: "secondary";
15590
+ readonly mode: "custom";
15591
+ readonly locations: ["list_item"];
15592
+ readonly type: "api";
15593
+ readonly method: "PATCH";
15594
+ readonly target: "/api/v1/data/sys_notification/{id}";
15595
+ readonly bodyExtra: {
15596
+ readonly is_read: false;
15597
+ readonly read_at: null;
15598
+ };
15599
+ readonly visible: "record.is_read";
15600
+ readonly successMessage: "Notification marked as unread";
15601
+ readonly refreshAfter: true;
15602
+ }];
15560
15603
  readonly listViews: {
15561
15604
  readonly unread: {
15562
15605
  readonly type: "grid";
@@ -15566,7 +15609,7 @@ declare const SysNotification: Omit<{
15566
15609
  readonly provider: "object";
15567
15610
  readonly object: "sys_notification";
15568
15611
  };
15569
- readonly columns: ["type", "title", "recipient_id", "created_at"];
15612
+ readonly columns: ["title", "actor_name", "type", "created_at"];
15570
15613
  readonly filter: [{
15571
15614
  readonly field: "recipient_id";
15572
15615
  readonly operator: "equals";
@@ -15596,7 +15639,7 @@ declare const SysNotification: Omit<{
15596
15639
  readonly provider: "object";
15597
15640
  readonly object: "sys_notification";
15598
15641
  };
15599
- readonly columns: ["type", "title", "is_read", "created_at"];
15642
+ readonly columns: ["title", "actor_name", "type", "is_read", "created_at"];
15600
15643
  readonly filter: [{
15601
15644
  readonly field: "recipient_id";
15602
15645
  readonly operator: "equals";
@@ -15609,6 +15652,13 @@ declare const SysNotification: Omit<{
15609
15652
  readonly pagination: {
15610
15653
  readonly pageSize: 50;
15611
15654
  };
15655
+ readonly grouping: {
15656
+ readonly fields: [{
15657
+ readonly field: "type";
15658
+ readonly order: "asc";
15659
+ readonly collapsed: false;
15660
+ }];
15661
+ };
15612
15662
  };
15613
15663
  readonly all_notifications: {
15614
15664
  readonly type: "grid";
@@ -15618,7 +15668,7 @@ declare const SysNotification: Omit<{
15618
15668
  readonly provider: "object";
15619
15669
  readonly object: "sys_notification";
15620
15670
  };
15621
- readonly columns: ["type", "title", "recipient_id", "is_read", "created_at"];
15671
+ readonly columns: ["title", "recipient_id", "actor_name", "type", "is_read", "created_at"];
15622
15672
  readonly sort: [{
15623
15673
  readonly field: "created_at";
15624
15674
  readonly order: "desc";
@@ -37384,6 +37434,181 @@ declare const SysApprovalRequest: Omit<{
37384
37434
  readonly index?: boolean | undefined;
37385
37435
  readonly type: "textarea";
37386
37436
  };
37437
+ readonly process_hash: {
37438
+ readonly readonly?: boolean | undefined;
37439
+ readonly format?: string | undefined;
37440
+ readonly options?: {
37441
+ label: string;
37442
+ value: string;
37443
+ color?: string | undefined;
37444
+ default?: boolean | undefined;
37445
+ }[] | undefined;
37446
+ readonly description?: string | undefined;
37447
+ readonly label?: string | undefined;
37448
+ readonly name?: string | undefined;
37449
+ readonly precision?: number | undefined;
37450
+ readonly required?: boolean | undefined;
37451
+ readonly multiple?: boolean | undefined;
37452
+ readonly dependencies?: string[] | undefined;
37453
+ readonly theme?: string | undefined;
37454
+ readonly externalId?: boolean | undefined;
37455
+ readonly system?: boolean | undefined;
37456
+ readonly min?: number | undefined;
37457
+ readonly max?: number | undefined;
37458
+ readonly group?: string | undefined;
37459
+ readonly encryptionConfig?: {
37460
+ enabled: boolean;
37461
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
37462
+ keyManagement: {
37463
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
37464
+ keyId?: string | undefined;
37465
+ rotationPolicy?: {
37466
+ enabled: boolean;
37467
+ frequencyDays: number;
37468
+ retainOldVersions: number;
37469
+ autoRotate: boolean;
37470
+ } | undefined;
37471
+ };
37472
+ scope: "record" | "field" | "table" | "database";
37473
+ deterministicEncryption: boolean;
37474
+ searchableEncryption: boolean;
37475
+ } | undefined;
37476
+ readonly columnName?: string | undefined;
37477
+ readonly searchable?: boolean | undefined;
37478
+ readonly unique?: boolean | undefined;
37479
+ readonly defaultValue?: unknown;
37480
+ readonly maxLength?: number | undefined;
37481
+ readonly minLength?: number | undefined;
37482
+ readonly scale?: number | undefined;
37483
+ readonly reference?: string | undefined;
37484
+ readonly referenceFilters?: string[] | undefined;
37485
+ readonly writeRequiresMasterRead?: boolean | undefined;
37486
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
37487
+ readonly expression?: {
37488
+ dialect: "cel" | "js" | "cron" | "template";
37489
+ source?: string | undefined;
37490
+ ast?: unknown;
37491
+ meta?: {
37492
+ rationale?: string | undefined;
37493
+ generatedBy?: string | undefined;
37494
+ } | undefined;
37495
+ } | undefined;
37496
+ readonly summaryOperations?: {
37497
+ object: string;
37498
+ field: string;
37499
+ function: "min" | "max" | "count" | "sum" | "avg";
37500
+ } | undefined;
37501
+ readonly language?: string | undefined;
37502
+ readonly lineNumbers?: boolean | undefined;
37503
+ readonly maxRating?: number | undefined;
37504
+ readonly allowHalf?: boolean | undefined;
37505
+ readonly displayMap?: boolean | undefined;
37506
+ readonly allowGeocoding?: boolean | undefined;
37507
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
37508
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
37509
+ readonly allowAlpha?: boolean | undefined;
37510
+ readonly presetColors?: string[] | undefined;
37511
+ readonly step?: number | undefined;
37512
+ readonly showValue?: boolean | undefined;
37513
+ readonly marks?: Record<string, string> | undefined;
37514
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
37515
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
37516
+ readonly displayValue?: boolean | undefined;
37517
+ readonly allowScanning?: boolean | undefined;
37518
+ readonly currencyConfig?: {
37519
+ precision: number;
37520
+ currencyMode: "fixed" | "dynamic";
37521
+ defaultCurrency: string;
37522
+ } | undefined;
37523
+ readonly vectorConfig?: {
37524
+ dimensions: number;
37525
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
37526
+ normalized: boolean;
37527
+ indexed: boolean;
37528
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
37529
+ } | undefined;
37530
+ readonly fileAttachmentConfig?: {
37531
+ virusScan: boolean;
37532
+ virusScanOnUpload: boolean;
37533
+ quarantineOnThreat: boolean;
37534
+ allowMultiple: boolean;
37535
+ allowReplace: boolean;
37536
+ allowDelete: boolean;
37537
+ requireUpload: boolean;
37538
+ extractMetadata: boolean;
37539
+ extractText: boolean;
37540
+ versioningEnabled: boolean;
37541
+ publicRead: boolean;
37542
+ presignedUrlExpiry: number;
37543
+ minSize?: number | undefined;
37544
+ maxSize?: number | undefined;
37545
+ allowedTypes?: string[] | undefined;
37546
+ blockedTypes?: string[] | undefined;
37547
+ allowedMimeTypes?: string[] | undefined;
37548
+ blockedMimeTypes?: string[] | undefined;
37549
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
37550
+ storageProvider?: string | undefined;
37551
+ storageBucket?: string | undefined;
37552
+ storagePrefix?: string | undefined;
37553
+ imageValidation?: {
37554
+ generateThumbnails: boolean;
37555
+ preserveMetadata: boolean;
37556
+ autoRotate: boolean;
37557
+ minWidth?: number | undefined;
37558
+ maxWidth?: number | undefined;
37559
+ minHeight?: number | undefined;
37560
+ maxHeight?: number | undefined;
37561
+ aspectRatio?: string | undefined;
37562
+ thumbnailSizes?: {
37563
+ name: string;
37564
+ width: number;
37565
+ height: number;
37566
+ crop: boolean;
37567
+ }[] | undefined;
37568
+ } | undefined;
37569
+ maxVersions?: number | undefined;
37570
+ } | undefined;
37571
+ readonly maskingRule?: {
37572
+ field: string;
37573
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
37574
+ preserveFormat: boolean;
37575
+ preserveLength: boolean;
37576
+ pattern?: string | undefined;
37577
+ roles?: string[] | undefined;
37578
+ exemptRoles?: string[] | undefined;
37579
+ } | undefined;
37580
+ readonly auditTrail?: boolean | undefined;
37581
+ readonly cached?: {
37582
+ enabled: boolean;
37583
+ ttl: number;
37584
+ invalidateOn: string[];
37585
+ } | undefined;
37586
+ readonly dataQuality?: {
37587
+ uniqueness: boolean;
37588
+ completeness: number;
37589
+ accuracy?: {
37590
+ source: string;
37591
+ threshold: number;
37592
+ } | undefined;
37593
+ } | undefined;
37594
+ readonly conditionalRequired?: {
37595
+ dialect: "cel" | "js" | "cron" | "template";
37596
+ source?: string | undefined;
37597
+ ast?: unknown;
37598
+ meta?: {
37599
+ rationale?: string | undefined;
37600
+ generatedBy?: string | undefined;
37601
+ } | undefined;
37602
+ } | undefined;
37603
+ readonly hidden?: boolean | undefined;
37604
+ readonly sortable?: boolean | undefined;
37605
+ readonly inlineHelpText?: string | undefined;
37606
+ readonly trackFeedHistory?: boolean | undefined;
37607
+ readonly caseSensitive?: boolean | undefined;
37608
+ readonly autonumberFormat?: string | undefined;
37609
+ readonly index?: boolean | undefined;
37610
+ readonly type: "text";
37611
+ };
37387
37612
  readonly completed_at: {
37388
37613
  readonly readonly?: boolean | undefined;
37389
37614
  readonly format?: string | undefined;
@@ -15557,6 +15557,49 @@ declare const SysNotification: Omit<{
15557
15557
  readonly displayNameField: "title";
15558
15558
  readonly titleFormat: "{title}";
15559
15559
  readonly compactLayout: ["title", "type", "is_read", "created_at"];
15560
+ /**
15561
+ * Row-level inbox actions. Use `visible` CEL expressions to ensure
15562
+ * `mark_read` only shows on unread rows and vice-versa, mirroring the
15563
+ * mark-as-read affordances in GitHub / Linear inboxes. The toolbar-level
15564
+ * `mark_all_read` is intentionally omitted server-side: it requires a
15565
+ * bulk update primitive that doesn't yet exist on the REST surface, and
15566
+ * the popover already handles the multi-row case client-side via N
15567
+ * single-row PATCHes (see `InboxPopover.tsx` -> AppHeader `markAllRead`).
15568
+ */
15569
+ readonly actions: [{
15570
+ readonly name: "mark_read";
15571
+ readonly label: "Mark as Read";
15572
+ readonly icon: "check";
15573
+ readonly variant: "secondary";
15574
+ readonly mode: "custom";
15575
+ readonly locations: ["list_item"];
15576
+ readonly type: "api";
15577
+ readonly method: "PATCH";
15578
+ readonly target: "/api/v1/data/sys_notification/{id}";
15579
+ readonly bodyExtra: {
15580
+ readonly is_read: true;
15581
+ };
15582
+ readonly visible: "!record.is_read";
15583
+ readonly successMessage: "Notification marked as read";
15584
+ readonly refreshAfter: true;
15585
+ }, {
15586
+ readonly name: "mark_unread";
15587
+ readonly label: "Mark as Unread";
15588
+ readonly icon: "bell-dot";
15589
+ readonly variant: "secondary";
15590
+ readonly mode: "custom";
15591
+ readonly locations: ["list_item"];
15592
+ readonly type: "api";
15593
+ readonly method: "PATCH";
15594
+ readonly target: "/api/v1/data/sys_notification/{id}";
15595
+ readonly bodyExtra: {
15596
+ readonly is_read: false;
15597
+ readonly read_at: null;
15598
+ };
15599
+ readonly visible: "record.is_read";
15600
+ readonly successMessage: "Notification marked as unread";
15601
+ readonly refreshAfter: true;
15602
+ }];
15560
15603
  readonly listViews: {
15561
15604
  readonly unread: {
15562
15605
  readonly type: "grid";
@@ -15566,7 +15609,7 @@ declare const SysNotification: Omit<{
15566
15609
  readonly provider: "object";
15567
15610
  readonly object: "sys_notification";
15568
15611
  };
15569
- readonly columns: ["type", "title", "recipient_id", "created_at"];
15612
+ readonly columns: ["title", "actor_name", "type", "created_at"];
15570
15613
  readonly filter: [{
15571
15614
  readonly field: "recipient_id";
15572
15615
  readonly operator: "equals";
@@ -15596,7 +15639,7 @@ declare const SysNotification: Omit<{
15596
15639
  readonly provider: "object";
15597
15640
  readonly object: "sys_notification";
15598
15641
  };
15599
- readonly columns: ["type", "title", "is_read", "created_at"];
15642
+ readonly columns: ["title", "actor_name", "type", "is_read", "created_at"];
15600
15643
  readonly filter: [{
15601
15644
  readonly field: "recipient_id";
15602
15645
  readonly operator: "equals";
@@ -15609,6 +15652,13 @@ declare const SysNotification: Omit<{
15609
15652
  readonly pagination: {
15610
15653
  readonly pageSize: 50;
15611
15654
  };
15655
+ readonly grouping: {
15656
+ readonly fields: [{
15657
+ readonly field: "type";
15658
+ readonly order: "asc";
15659
+ readonly collapsed: false;
15660
+ }];
15661
+ };
15612
15662
  };
15613
15663
  readonly all_notifications: {
15614
15664
  readonly type: "grid";
@@ -15618,7 +15668,7 @@ declare const SysNotification: Omit<{
15618
15668
  readonly provider: "object";
15619
15669
  readonly object: "sys_notification";
15620
15670
  };
15621
- readonly columns: ["type", "title", "recipient_id", "is_read", "created_at"];
15671
+ readonly columns: ["title", "recipient_id", "actor_name", "type", "is_read", "created_at"];
15622
15672
  readonly sort: [{
15623
15673
  readonly field: "created_at";
15624
15674
  readonly order: "desc";
@@ -37384,6 +37434,181 @@ declare const SysApprovalRequest: Omit<{
37384
37434
  readonly index?: boolean | undefined;
37385
37435
  readonly type: "textarea";
37386
37436
  };
37437
+ readonly process_hash: {
37438
+ readonly readonly?: boolean | undefined;
37439
+ readonly format?: string | undefined;
37440
+ readonly options?: {
37441
+ label: string;
37442
+ value: string;
37443
+ color?: string | undefined;
37444
+ default?: boolean | undefined;
37445
+ }[] | undefined;
37446
+ readonly description?: string | undefined;
37447
+ readonly label?: string | undefined;
37448
+ readonly name?: string | undefined;
37449
+ readonly precision?: number | undefined;
37450
+ readonly required?: boolean | undefined;
37451
+ readonly multiple?: boolean | undefined;
37452
+ readonly dependencies?: string[] | undefined;
37453
+ readonly theme?: string | undefined;
37454
+ readonly externalId?: boolean | undefined;
37455
+ readonly system?: boolean | undefined;
37456
+ readonly min?: number | undefined;
37457
+ readonly max?: number | undefined;
37458
+ readonly group?: string | undefined;
37459
+ readonly encryptionConfig?: {
37460
+ enabled: boolean;
37461
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
37462
+ keyManagement: {
37463
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
37464
+ keyId?: string | undefined;
37465
+ rotationPolicy?: {
37466
+ enabled: boolean;
37467
+ frequencyDays: number;
37468
+ retainOldVersions: number;
37469
+ autoRotate: boolean;
37470
+ } | undefined;
37471
+ };
37472
+ scope: "record" | "field" | "table" | "database";
37473
+ deterministicEncryption: boolean;
37474
+ searchableEncryption: boolean;
37475
+ } | undefined;
37476
+ readonly columnName?: string | undefined;
37477
+ readonly searchable?: boolean | undefined;
37478
+ readonly unique?: boolean | undefined;
37479
+ readonly defaultValue?: unknown;
37480
+ readonly maxLength?: number | undefined;
37481
+ readonly minLength?: number | undefined;
37482
+ readonly scale?: number | undefined;
37483
+ readonly reference?: string | undefined;
37484
+ readonly referenceFilters?: string[] | undefined;
37485
+ readonly writeRequiresMasterRead?: boolean | undefined;
37486
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
37487
+ readonly expression?: {
37488
+ dialect: "cel" | "js" | "cron" | "template";
37489
+ source?: string | undefined;
37490
+ ast?: unknown;
37491
+ meta?: {
37492
+ rationale?: string | undefined;
37493
+ generatedBy?: string | undefined;
37494
+ } | undefined;
37495
+ } | undefined;
37496
+ readonly summaryOperations?: {
37497
+ object: string;
37498
+ field: string;
37499
+ function: "min" | "max" | "count" | "sum" | "avg";
37500
+ } | undefined;
37501
+ readonly language?: string | undefined;
37502
+ readonly lineNumbers?: boolean | undefined;
37503
+ readonly maxRating?: number | undefined;
37504
+ readonly allowHalf?: boolean | undefined;
37505
+ readonly displayMap?: boolean | undefined;
37506
+ readonly allowGeocoding?: boolean | undefined;
37507
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
37508
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
37509
+ readonly allowAlpha?: boolean | undefined;
37510
+ readonly presetColors?: string[] | undefined;
37511
+ readonly step?: number | undefined;
37512
+ readonly showValue?: boolean | undefined;
37513
+ readonly marks?: Record<string, string> | undefined;
37514
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
37515
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
37516
+ readonly displayValue?: boolean | undefined;
37517
+ readonly allowScanning?: boolean | undefined;
37518
+ readonly currencyConfig?: {
37519
+ precision: number;
37520
+ currencyMode: "fixed" | "dynamic";
37521
+ defaultCurrency: string;
37522
+ } | undefined;
37523
+ readonly vectorConfig?: {
37524
+ dimensions: number;
37525
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
37526
+ normalized: boolean;
37527
+ indexed: boolean;
37528
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
37529
+ } | undefined;
37530
+ readonly fileAttachmentConfig?: {
37531
+ virusScan: boolean;
37532
+ virusScanOnUpload: boolean;
37533
+ quarantineOnThreat: boolean;
37534
+ allowMultiple: boolean;
37535
+ allowReplace: boolean;
37536
+ allowDelete: boolean;
37537
+ requireUpload: boolean;
37538
+ extractMetadata: boolean;
37539
+ extractText: boolean;
37540
+ versioningEnabled: boolean;
37541
+ publicRead: boolean;
37542
+ presignedUrlExpiry: number;
37543
+ minSize?: number | undefined;
37544
+ maxSize?: number | undefined;
37545
+ allowedTypes?: string[] | undefined;
37546
+ blockedTypes?: string[] | undefined;
37547
+ allowedMimeTypes?: string[] | undefined;
37548
+ blockedMimeTypes?: string[] | undefined;
37549
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
37550
+ storageProvider?: string | undefined;
37551
+ storageBucket?: string | undefined;
37552
+ storagePrefix?: string | undefined;
37553
+ imageValidation?: {
37554
+ generateThumbnails: boolean;
37555
+ preserveMetadata: boolean;
37556
+ autoRotate: boolean;
37557
+ minWidth?: number | undefined;
37558
+ maxWidth?: number | undefined;
37559
+ minHeight?: number | undefined;
37560
+ maxHeight?: number | undefined;
37561
+ aspectRatio?: string | undefined;
37562
+ thumbnailSizes?: {
37563
+ name: string;
37564
+ width: number;
37565
+ height: number;
37566
+ crop: boolean;
37567
+ }[] | undefined;
37568
+ } | undefined;
37569
+ maxVersions?: number | undefined;
37570
+ } | undefined;
37571
+ readonly maskingRule?: {
37572
+ field: string;
37573
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
37574
+ preserveFormat: boolean;
37575
+ preserveLength: boolean;
37576
+ pattern?: string | undefined;
37577
+ roles?: string[] | undefined;
37578
+ exemptRoles?: string[] | undefined;
37579
+ } | undefined;
37580
+ readonly auditTrail?: boolean | undefined;
37581
+ readonly cached?: {
37582
+ enabled: boolean;
37583
+ ttl: number;
37584
+ invalidateOn: string[];
37585
+ } | undefined;
37586
+ readonly dataQuality?: {
37587
+ uniqueness: boolean;
37588
+ completeness: number;
37589
+ accuracy?: {
37590
+ source: string;
37591
+ threshold: number;
37592
+ } | undefined;
37593
+ } | undefined;
37594
+ readonly conditionalRequired?: {
37595
+ dialect: "cel" | "js" | "cron" | "template";
37596
+ source?: string | undefined;
37597
+ ast?: unknown;
37598
+ meta?: {
37599
+ rationale?: string | undefined;
37600
+ generatedBy?: string | undefined;
37601
+ } | undefined;
37602
+ } | undefined;
37603
+ readonly hidden?: boolean | undefined;
37604
+ readonly sortable?: boolean | undefined;
37605
+ readonly inlineHelpText?: string | undefined;
37606
+ readonly trackFeedHistory?: boolean | undefined;
37607
+ readonly caseSensitive?: boolean | undefined;
37608
+ readonly autonumberFormat?: string | undefined;
37609
+ readonly index?: boolean | undefined;
37610
+ readonly type: "text";
37611
+ };
37387
37612
  readonly completed_at: {
37388
37613
  readonly readonly?: boolean | undefined;
37389
37614
  readonly format?: string | undefined;
@@ -666,13 +666,56 @@ var SysNotification = data.ObjectSchema.create({
666
666
  displayNameField: "title",
667
667
  titleFormat: "{title}",
668
668
  compactLayout: ["title", "type", "is_read", "created_at"],
669
+ /**
670
+ * Row-level inbox actions. Use `visible` CEL expressions to ensure
671
+ * `mark_read` only shows on unread rows and vice-versa, mirroring the
672
+ * mark-as-read affordances in GitHub / Linear inboxes. The toolbar-level
673
+ * `mark_all_read` is intentionally omitted server-side: it requires a
674
+ * bulk update primitive that doesn't yet exist on the REST surface, and
675
+ * the popover already handles the multi-row case client-side via N
676
+ * single-row PATCHes (see `InboxPopover.tsx` -> AppHeader `markAllRead`).
677
+ */
678
+ actions: [
679
+ {
680
+ name: "mark_read",
681
+ label: "Mark as Read",
682
+ icon: "check",
683
+ variant: "secondary",
684
+ mode: "custom",
685
+ locations: ["list_item"],
686
+ type: "api",
687
+ method: "PATCH",
688
+ target: "/api/v1/data/sys_notification/{id}",
689
+ bodyExtra: { is_read: true },
690
+ visible: "!record.is_read",
691
+ successMessage: "Notification marked as read",
692
+ refreshAfter: true
693
+ },
694
+ {
695
+ name: "mark_unread",
696
+ label: "Mark as Unread",
697
+ icon: "bell-dot",
698
+ variant: "secondary",
699
+ mode: "custom",
700
+ locations: ["list_item"],
701
+ type: "api",
702
+ method: "PATCH",
703
+ target: "/api/v1/data/sys_notification/{id}",
704
+ bodyExtra: { is_read: false, read_at: null },
705
+ visible: "record.is_read",
706
+ successMessage: "Notification marked as unread",
707
+ refreshAfter: true
708
+ }
709
+ ],
669
710
  listViews: {
670
711
  unread: {
671
712
  type: "grid",
672
713
  name: "unread",
673
714
  label: "Unread",
674
715
  data: { provider: "object", object: "sys_notification" },
675
- columns: ["type", "title", "recipient_id", "created_at"],
716
+ // Title + actor first (the "who/what" the user actually scans);
717
+ // type stays as a categorising chip; created_at right-aligned.
718
+ columns: ["title", "actor_name", "type", "created_at"],
676
719
  filter: [
677
720
  { field: "recipient_id", operator: "equals", value: "{current_user_id}" },
678
721
  { field: "is_read", operator: "equals", value: false }
@@ -686,17 +729,21 @@ var SysNotification = data.ObjectSchema.create({
686
729
  name: "mine",
687
730
  label: "Mine",
688
731
  data: { provider: "object", object: "sys_notification" },
689
- columns: ["type", "title", "is_read", "created_at"],
732
+ columns: ["title", "actor_name", "type", "is_read", "created_at"],
690
733
  filter: [{ field: "recipient_id", operator: "equals", value: "{current_user_id}" }],
691
734
  sort: [{ field: "created_at", order: "desc" }],
692
- pagination: { pageSize: 50 }
735
+ pagination: { pageSize: 50 },
736
+ // Group by notification category so mention/assignment storms don't
737
+ // hide system or task_due rows. Users still toggle to flat via the
738
+ // toolbar Group control if they prefer chronology only.
739
+ grouping: { fields: [{ field: "type", order: "asc", collapsed: false }] }
693
740
  },
694
741
  all_notifications: {
695
742
  type: "grid",
696
743
  name: "all_notifications",
697
744
  label: "All",
698
745
  data: { provider: "object", object: "sys_notification" },
699
- columns: ["type", "title", "recipient_id", "is_read", "created_at"],
746
+ columns: ["title", "recipient_id", "actor_name", "type", "is_read", "created_at"],
700
747
  sort: [{ field: "created_at", order: "desc" }],
701
748
  pagination: { pageSize: 100 }
702
749
  }
@@ -1549,6 +1596,14 @@ var SysApprovalRequest = data.ObjectSchema.create({
1549
1596
  description: "Record snapshot at submission time",
1550
1597
  group: "State"
1551
1598
  }),
1599
+ process_hash: data.Field.text({
1600
+ label: "Process Hash",
1601
+ required: false,
1602
+ maxLength: 80,
1603
+ readonly: true,
1604
+ description: "sha256 of the approval process body at submit time (ADR-0009 execution pinning). Resolved through sys_metadata_history so process upgrades do not affect in-flight requests.",
1605
+ group: "State"
1606
+ }),
1552
1607
  completed_at: data.Field.datetime({
1553
1608
  label: "Completed At",
1554
1609
  required: false,