@objectstack/plugin-approvals 9.2.0 → 9.4.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.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as _objectstack_spec_data from '@objectstack/spec/data';
2
2
  import { ApprovalNodeConfig } from '@objectstack/spec/automation';
3
- import { IApprovalService, SharingExecutionContext, ApprovalRequestRow, ApprovalDecisionInput, ApprovalDecisionResult, ApprovalRecallInput, ApprovalRecallResult, ApprovalStatus, ApprovalActionRow } from '@objectstack/spec/contracts';
3
+ import { IApprovalService, SharingExecutionContext, ApprovalRequestRow, ApprovalDecisionInput, ApprovalDecisionResult, ApprovalRecallInput, ApprovalRecallResult, ApprovalSendBackInput, ApprovalSendBackResult, ApprovalResubmitInput, ApprovalResubmitResult, ApprovalStatus, ApprovalActionRow } from '@objectstack/spec/contracts';
4
4
  export { ApprovalActionRow, ApprovalDecisionInput, ApprovalDecisionResult, ApprovalRequestRow, ApprovalStatus, IApprovalService } from '@objectstack/spec/contracts';
5
5
  import { Plugin, PluginContext } from '@objectstack/core';
6
6
 
@@ -454,6 +454,37 @@ declare const SysApprovalRequest: Omit<{
454
454
  }[] | undefined;
455
455
  searchableFields?: string[] | undefined;
456
456
  filterableFields?: string[] | undefined;
457
+ userFilters?: {
458
+ element: "toggle" | "tabs" | "dropdown";
459
+ fields?: {
460
+ field: string;
461
+ label?: string | undefined;
462
+ type?: "boolean" | "text" | "select" | "multi-select" | "date-range" | undefined;
463
+ options?: {
464
+ value: string | number | boolean;
465
+ label: string;
466
+ color?: string | undefined;
467
+ }[] | undefined;
468
+ showCount?: boolean | undefined;
469
+ defaultValues?: (string | number | boolean)[] | undefined;
470
+ }[] | undefined;
471
+ tabs?: {
472
+ name: string;
473
+ pinned: boolean;
474
+ isDefault: boolean;
475
+ visible: boolean;
476
+ label?: string | undefined;
477
+ icon?: string | undefined;
478
+ view?: string | undefined;
479
+ filter?: {
480
+ field: string;
481
+ operator: string;
482
+ value?: string | number | boolean | (string | number)[] | null | undefined;
483
+ }[] | undefined;
484
+ order?: number | undefined;
485
+ }[] | undefined;
486
+ showAllRecords?: boolean | undefined;
487
+ } | undefined;
457
488
  resizable?: boolean | undefined;
458
489
  striped?: boolean | undefined;
459
490
  bordered?: boolean | undefined;
@@ -566,7 +597,7 @@ declare const SysApprovalRequest: Omit<{
566
597
  } | undefined;
567
598
  appearance?: {
568
599
  showDescription: boolean;
569
- allowedVisualizations?: ("grid" | "kanban" | "calendar" | "gantt" | "gallery" | "timeline" | "map")[] | undefined;
600
+ allowedVisualizations?: ("grid" | "kanban" | "calendar" | "gantt" | "gallery" | "timeline" | "chart" | "map")[] | undefined;
570
601
  } | undefined;
571
602
  tabs?: {
572
603
  name: string;
@@ -760,6 +791,8 @@ declare const SysApprovalRequest: Omit<{
760
791
  method?: "POST" | "PATCH" | "PUT" | "DELETE" | undefined;
761
792
  bodyExtra?: Record<string, unknown> | undefined;
762
793
  mode?: "custom" | "delete" | "edit" | "create" | undefined;
794
+ opensInNewTab?: boolean | undefined;
795
+ newTabUrl?: string | undefined;
763
796
  timeout?: number | undefined;
764
797
  aria?: {
765
798
  ariaLabel?: string | undefined;
@@ -5110,6 +5143,37 @@ declare const SysApprovalAction: Omit<{
5110
5143
  }[] | undefined;
5111
5144
  searchableFields?: string[] | undefined;
5112
5145
  filterableFields?: string[] | undefined;
5146
+ userFilters?: {
5147
+ element: "toggle" | "tabs" | "dropdown";
5148
+ fields?: {
5149
+ field: string;
5150
+ label?: string | undefined;
5151
+ type?: "boolean" | "text" | "select" | "multi-select" | "date-range" | undefined;
5152
+ options?: {
5153
+ value: string | number | boolean;
5154
+ label: string;
5155
+ color?: string | undefined;
5156
+ }[] | undefined;
5157
+ showCount?: boolean | undefined;
5158
+ defaultValues?: (string | number | boolean)[] | undefined;
5159
+ }[] | undefined;
5160
+ tabs?: {
5161
+ name: string;
5162
+ pinned: boolean;
5163
+ isDefault: boolean;
5164
+ visible: boolean;
5165
+ label?: string | undefined;
5166
+ icon?: string | undefined;
5167
+ view?: string | undefined;
5168
+ filter?: {
5169
+ field: string;
5170
+ operator: string;
5171
+ value?: string | number | boolean | (string | number)[] | null | undefined;
5172
+ }[] | undefined;
5173
+ order?: number | undefined;
5174
+ }[] | undefined;
5175
+ showAllRecords?: boolean | undefined;
5176
+ } | undefined;
5113
5177
  resizable?: boolean | undefined;
5114
5178
  striped?: boolean | undefined;
5115
5179
  bordered?: boolean | undefined;
@@ -5222,7 +5286,7 @@ declare const SysApprovalAction: Omit<{
5222
5286
  } | undefined;
5223
5287
  appearance?: {
5224
5288
  showDescription: boolean;
5225
- allowedVisualizations?: ("grid" | "kanban" | "calendar" | "gantt" | "gallery" | "timeline" | "map")[] | undefined;
5289
+ allowedVisualizations?: ("grid" | "kanban" | "calendar" | "gantt" | "gallery" | "timeline" | "chart" | "map")[] | undefined;
5226
5290
  } | undefined;
5227
5291
  tabs?: {
5228
5292
  name: string;
@@ -5416,6 +5480,8 @@ declare const SysApprovalAction: Omit<{
5416
5480
  method?: "POST" | "PATCH" | "PUT" | "DELETE" | undefined;
5417
5481
  bodyExtra?: Record<string, unknown> | undefined;
5418
5482
  mode?: "custom" | "delete" | "edit" | "create" | undefined;
5483
+ opensInNewTab?: boolean | undefined;
5484
+ newTabUrl?: string | undefined;
5419
5485
  timeout?: number | undefined;
5420
5486
  aria?: {
5421
5487
  ariaLabel?: string | undefined;
@@ -7406,181 +7472,2280 @@ declare const SysApprovalAction: Omit<{
7406
7472
  }, "fields">;
7407
7473
 
7408
7474
  /**
7409
- * Node-era approval runtime (ADR-0019).
7475
+ * sys_approval_approver — Pending-approver index (issue #1745).
7410
7476
  *
7411
- * Approval is no longer a standalone engine it is a **flow node**. A flow's
7412
- * Approval node opens a request via {@link ApprovalService.openNodeRequest} and
7413
- * the run suspends; a human decision via {@link ApprovalService.decide}
7414
- * finalises the request and resumes the owning run down the matching
7415
- * `approve` / `reject` edge.
7477
+ * One row per (request, approver identity) while the request is **pending**.
7478
+ * `sys_approval_request.pending_approvers` stays the human-readable source of
7479
+ * truth (a CSV column), but CSV substring matching can neither be indexed nor
7480
+ * pushed into an engine query which made "my pending" a post-filter in
7481
+ * memory and broke pagination beyond the scan window.
7416
7482
  *
7417
- * This service owns the durable approval *state* `sys_approval_request` /
7418
- * `sys_approval_action`, approver resolution (team / department / role /
7419
- * manager graph), and the optional status-field mirror plus the decision
7420
- * API. It does not author processes, submit, or walk multi-step machinery
7421
- * anymore; that orchestration lives on the one automation engine.
7422
- */
7423
- interface ApprovalEngine {
7424
- find(object: string, options?: any): Promise<any[]>;
7425
- insert(object: string, data: any, options?: any): Promise<any>;
7426
- update(object: string, idOrData: any, dataOrOptions?: any, options?: any): Promise<any>;
7427
- delete(object: string, options?: any): Promise<any>;
7428
- }
7429
- interface ApprovalClock {
7430
- now(): Date;
7431
- }
7432
- /**
7433
- * Minimal automation surface the service uses to resume a suspended flow run
7434
- * once a decision finalises a node-driven request. Optional — attached by the
7435
- * plugin when an automation engine is present (see `approval-node.ts`).
7483
+ * This table is that CSV, normalized: the service mirrors every change to
7484
+ * `pending_approvers` here (open / decide / recall / send-back / reassign /
7485
+ * escalate), and clears the rows when the request leaves `pending`. So the
7486
+ * table only ever holds the live work queue its size tracks the number of
7487
+ * open approvals, not the append-only request history.
7488
+ *
7489
+ * `approver` holds one identity literal exactly as it appears in the CSV:
7490
+ * a user id, an email, or a `role:<name>` / `team:<name>` style literal.
7491
+ * Equality (or `$in`) on this column is the indexed replacement for the old
7492
+ * per-row substring match.
7493
+ *
7494
+ * @namespace sys
7436
7495
  */
7437
- interface ApprovalResumeSurface {
7438
- resume?(runId: string, signal?: {
7439
- output?: Record<string, unknown>;
7440
- branchLabel?: string;
7441
- }): Promise<unknown>;
7442
- }
7443
- interface ApprovalServiceOptions {
7444
- engine: ApprovalEngine;
7445
- clock?: ApprovalClock;
7446
- logger?: {
7447
- info?: (msg: any, ...rest: any[]) => void;
7448
- warn?: (msg: any, ...rest: any[]) => void;
7449
- error?: (msg: any, ...rest: any[]) => void;
7450
- debug?: (msg: any, ...rest: any[]) => void;
7451
- };
7452
- /**
7453
- * Optional automation surface used to resume a suspended flow run when a
7454
- * decision finalises a request. Usually attached after construction via
7455
- * {@link ApprovalService.attachAutomation} once the automation engine is
7456
- * available.
7457
- */
7458
- automation?: ApprovalResumeSurface;
7459
- }
7460
- declare class ApprovalService implements IApprovalService {
7461
- private readonly engine;
7462
- private readonly clock;
7463
- private readonly logger?;
7464
- private automation?;
7465
- constructor(opts: ApprovalServiceOptions);
7466
- /** Attach (or replace) the automation surface used to resume flow runs. */
7467
- attachAutomation(automation: ApprovalResumeSurface): void;
7468
- /**
7469
- * Expand the approvers on an Approval node into user IDs by querying the
7470
- * graph tables for `team:` / `department:` / `role:` / `manager:` approver
7471
- * types. Falls back to a prefixed literal (`type:value`) when graph lookups
7472
- * produce nothing — so existing fixtures and flows that rely on substring
7473
- * matching keep working.
7474
- *
7475
- * **Graph semantics:**
7476
- * - `team` → flat members of `sys_team` (better-auth; no BFS)
7477
- * - `department` recursive BFS of `sys_department.parent_department_id`
7478
- * → members of every descendant via `sys_department_member`
7479
- * - `role` → users with `sys_member.role = value` in tenant
7480
- * - `manager` → `sys_user.manager_id` of `record[value] ?? record.owner_id`
7481
- * - `field` → literal user id stored in `record[value]`
7482
- * - `user` → literal value
7483
- */
7484
- private expandApprovers;
7485
- /** Flat team `sys_team` is better-auth's collaboration grouping (no hierarchy). */
7486
- private expandTeamUsers;
7487
- /** Recursive department — walks `sys_department.parent_department_id`. */
7488
- private expandDepartmentUsers;
7489
- private expandRoleUsers;
7490
- private lookupManager;
7491
- /** Mirror a request status onto a business-object field, if configured. */
7492
- private mirrorStatusField;
7493
- /**
7494
- * Open a pending approval request on behalf of a flow's Approval node. The
7495
- * node config (approvers / behavior / status field) is snapshotted on the row
7496
- * so a decision can be made without any process to resolve against.
7497
- */
7498
- openNodeRequest(input: {
7499
- object: string;
7500
- recordId: string;
7501
- runId: string;
7502
- nodeId: string;
7503
- config: ApprovalNodeConfig;
7504
- flowName?: string;
7505
- /** Authored flow label, snapshotted for inbox display. */
7506
- flowLabel?: string;
7507
- /** Authored node label, snapshotted for inbox display. */
7508
- nodeLabel?: string;
7509
- submitterId?: string | null;
7510
- record?: any;
7511
- organizationId?: string | null;
7512
- }, context: SharingExecutionContext): Promise<ApprovalRequestRow>;
7513
- /**
7514
- * Record a decision on a node-driven request. Honours the node's `unanimous`
7515
- * behavior (holds until every approver has approved). When the request
7516
- * finalizes, returns the suspended run id + node id so the caller (or
7517
- * {@link ApprovalService.decide}) can resume the flow down the matching
7518
- * branch.
7519
- */
7520
- decideNode(requestId: string, input: {
7521
- decision: 'approve' | 'reject';
7522
- actorId: string;
7523
- comment?: string;
7524
- }, context: SharingExecutionContext): Promise<{
7525
- request: ApprovalRequestRow;
7526
- runId: string | null;
7527
- nodeId: string | null;
7528
- finalized: boolean;
7529
- decision: 'approve' | 'reject';
7530
- }>;
7531
- /**
7532
- * Public contract entrypoint (ADR-0019). Records a decision on a node-driven
7533
- * request via {@link ApprovalService.decideNode} and, when it finalizes,
7534
- * resumes the owning flow run down the matching `approve` / `reject` edge.
7535
- */
7536
- decide(requestId: string, input: ApprovalDecisionInput, context: SharingExecutionContext): Promise<ApprovalDecisionResult>;
7537
- /**
7538
- * Withdraw a pending request (submitter only). Finalises the row as
7539
- * `recalled`, releases the record lock (keyed on pending status), mirrors
7540
- * the status field when configured, and resumes the owning flow run down
7541
- * the `reject` branch with `output.decision = 'recall'` — the engine has no
7542
- * run-cancel primitive, and leaving the run suspended forever would leak it.
7543
- */
7544
- recall(requestId: string, input: ApprovalRecallInput, context: SharingExecutionContext): Promise<ApprovalRecallResult>;
7545
- /**
7546
- * Resolve the schema-declared display field for an object, when the engine
7547
- * exposes schema metadata (`getSchema`). Falls back to common title-ish
7548
- * field names so plain `ApprovalEngine` fakes still enrich sensibly.
7549
- */
7550
- private resolveDisplayField;
7551
- private static pickTitle;
7552
- /**
7553
- * Batch-resolve `sys_user` display names for identifiers that may be user
7554
- * ids or emails. Best-effort — failures leave entries unresolved.
7555
- */
7556
- private resolveUserNames;
7557
- /** Lookup-typed fields (key + referenced object) of an object's schema. */
7558
- private resolveLookupFields;
7559
- /**
7560
- * Attach inbox display fields to rows so clients never render a raw
7561
- * identifier: `record_title`, `submitter_name`, `object_label`,
7562
- * `pending_approver_names` (user-id approvers), and `payload_display`
7563
- * (lookup foreign keys in the snapshot → referenced record titles).
7564
- * Batched: one query per distinct object (target + referenced) plus one
7565
- * `sys_user` lookup. Best-effort — a deleted record falls back to the
7566
- * payload snapshot, and any failure leaves the field unset rather than
7567
- * failing the list.
7568
- */
7569
- private enrichRows;
7570
- listRequests(filter: {
7571
- object?: string;
7572
- recordId?: string;
7573
- status?: ApprovalStatus | ApprovalStatus[];
7574
- approverId?: string | string[];
7575
- submitterId?: string;
7576
- } | undefined, context: SharingExecutionContext): Promise<ApprovalRequestRow[]>;
7577
- getRequest(requestId: string, context: SharingExecutionContext): Promise<ApprovalRequestRow | null>;
7578
- listActions(requestId: string, context: SharingExecutionContext): Promise<ApprovalActionRow[]>;
7579
- }
7580
-
7581
- interface ApprovalsPluginOptions {
7582
- /** Disable runtime registration (schemas still register). */
7583
- disableService?: boolean;
7496
+ declare const SysApprovalApprover: Omit<{
7497
+ name: string;
7498
+ active: boolean;
7499
+ isSystem: boolean;
7500
+ abstract: boolean;
7501
+ datasource: string;
7502
+ fields: Record<string, {
7503
+ type: "number" | "boolean" | "tags" | "date" | "record" | "file" | "code" | "datetime" | "signature" | "progress" | "url" | "lookup" | "master_detail" | "currency" | "percent" | "password" | "secret" | "email" | "time" | "text" | "textarea" | "phone" | "markdown" | "html" | "richtext" | "toggle" | "select" | "multiselect" | "radio" | "checkboxes" | "tree" | "image" | "avatar" | "video" | "audio" | "formula" | "summary" | "autonumber" | "composite" | "repeater" | "location" | "address" | "json" | "color" | "rating" | "slider" | "qrcode" | "vector";
7504
+ required: boolean;
7505
+ searchable: boolean;
7506
+ multiple: boolean;
7507
+ unique: boolean;
7508
+ deleteBehavior: "set_null" | "cascade" | "restrict";
7509
+ auditTrail: boolean;
7510
+ hidden: boolean;
7511
+ readonly: boolean;
7512
+ sortable: boolean;
7513
+ index: boolean;
7514
+ externalId: boolean;
7515
+ name?: string | undefined;
7516
+ label?: string | undefined;
7517
+ description?: string | undefined;
7518
+ format?: string | undefined;
7519
+ columnName?: string | undefined;
7520
+ defaultValue?: unknown;
7521
+ maxLength?: number | undefined;
7522
+ minLength?: number | undefined;
7523
+ precision?: number | undefined;
7524
+ scale?: number | undefined;
7525
+ min?: number | undefined;
7526
+ max?: number | undefined;
7527
+ options?: {
7528
+ label: string;
7529
+ value: string;
7530
+ color?: string | undefined;
7531
+ default?: boolean | undefined;
7532
+ }[] | undefined;
7533
+ reference?: string | undefined;
7534
+ referenceFilters?: string[] | undefined;
7535
+ writeRequiresMasterRead?: boolean | undefined;
7536
+ inlineEdit?: boolean | "grid" | "form" | undefined;
7537
+ inlineTitle?: string | undefined;
7538
+ inlineColumns?: any[] | undefined;
7539
+ inlineAmountField?: string | undefined;
7540
+ relatedList?: boolean | undefined;
7541
+ relatedListTitle?: string | undefined;
7542
+ relatedListColumns?: any[] | undefined;
7543
+ expression?: {
7544
+ dialect: "cel" | "js" | "cron" | "template";
7545
+ source?: string | undefined;
7546
+ ast?: unknown;
7547
+ meta?: {
7548
+ rationale?: string | undefined;
7549
+ generatedBy?: string | undefined;
7550
+ } | undefined;
7551
+ } | {
7552
+ dialect: "cel" | "js" | "cron" | "template";
7553
+ source?: string | undefined;
7554
+ ast?: unknown;
7555
+ meta?: {
7556
+ rationale?: string | undefined;
7557
+ generatedBy?: string | undefined;
7558
+ } | undefined;
7559
+ } | undefined;
7560
+ summaryOperations?: {
7561
+ object: string;
7562
+ field: string;
7563
+ function: "min" | "max" | "count" | "sum" | "avg";
7564
+ relationshipField?: string | undefined;
7565
+ } | undefined;
7566
+ language?: string | undefined;
7567
+ theme?: string | undefined;
7568
+ lineNumbers?: boolean | undefined;
7569
+ maxRating?: number | undefined;
7570
+ allowHalf?: boolean | undefined;
7571
+ displayMap?: boolean | undefined;
7572
+ allowGeocoding?: boolean | undefined;
7573
+ addressFormat?: "us" | "uk" | "international" | undefined;
7574
+ colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
7575
+ allowAlpha?: boolean | undefined;
7576
+ presetColors?: string[] | undefined;
7577
+ step?: number | undefined;
7578
+ showValue?: boolean | undefined;
7579
+ marks?: Record<string, string> | undefined;
7580
+ barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
7581
+ qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
7582
+ displayValue?: boolean | undefined;
7583
+ allowScanning?: boolean | undefined;
7584
+ currencyConfig?: {
7585
+ precision: number;
7586
+ currencyMode: "fixed" | "dynamic";
7587
+ defaultCurrency: string;
7588
+ } | undefined;
7589
+ vectorConfig?: {
7590
+ dimensions: number;
7591
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
7592
+ normalized: boolean;
7593
+ indexed: boolean;
7594
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
7595
+ } | undefined;
7596
+ fileAttachmentConfig?: {
7597
+ virusScan: boolean;
7598
+ virusScanOnUpload: boolean;
7599
+ quarantineOnThreat: boolean;
7600
+ allowMultiple: boolean;
7601
+ allowReplace: boolean;
7602
+ allowDelete: boolean;
7603
+ requireUpload: boolean;
7604
+ extractMetadata: boolean;
7605
+ extractText: boolean;
7606
+ versioningEnabled: boolean;
7607
+ publicRead: boolean;
7608
+ presignedUrlExpiry: number;
7609
+ minSize?: number | undefined;
7610
+ maxSize?: number | undefined;
7611
+ allowedTypes?: string[] | undefined;
7612
+ blockedTypes?: string[] | undefined;
7613
+ allowedMimeTypes?: string[] | undefined;
7614
+ blockedMimeTypes?: string[] | undefined;
7615
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
7616
+ storageProvider?: string | undefined;
7617
+ storageBucket?: string | undefined;
7618
+ storagePrefix?: string | undefined;
7619
+ imageValidation?: {
7620
+ generateThumbnails: boolean;
7621
+ preserveMetadata: boolean;
7622
+ autoRotate: boolean;
7623
+ minWidth?: number | undefined;
7624
+ maxWidth?: number | undefined;
7625
+ minHeight?: number | undefined;
7626
+ maxHeight?: number | undefined;
7627
+ aspectRatio?: string | undefined;
7628
+ thumbnailSizes?: {
7629
+ name: string;
7630
+ width: number;
7631
+ height: number;
7632
+ crop: boolean;
7633
+ }[] | undefined;
7634
+ } | undefined;
7635
+ maxVersions?: number | undefined;
7636
+ } | undefined;
7637
+ encryptionConfig?: {
7638
+ enabled: boolean;
7639
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
7640
+ keyManagement: {
7641
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
7642
+ keyId?: string | undefined;
7643
+ rotationPolicy?: {
7644
+ enabled: boolean;
7645
+ frequencyDays: number;
7646
+ retainOldVersions: number;
7647
+ autoRotate: boolean;
7648
+ } | undefined;
7649
+ };
7650
+ scope: "record" | "field" | "table" | "database";
7651
+ deterministicEncryption: boolean;
7652
+ searchableEncryption: boolean;
7653
+ } | undefined;
7654
+ maskingRule?: {
7655
+ field: string;
7656
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
7657
+ preserveFormat: boolean;
7658
+ preserveLength: boolean;
7659
+ pattern?: string | undefined;
7660
+ roles?: string[] | undefined;
7661
+ exemptRoles?: string[] | undefined;
7662
+ } | undefined;
7663
+ dependencies?: string[] | undefined;
7664
+ cached?: {
7665
+ enabled: boolean;
7666
+ ttl: number;
7667
+ invalidateOn: string[];
7668
+ } | undefined;
7669
+ dataQuality?: {
7670
+ uniqueness: boolean;
7671
+ completeness: number;
7672
+ accuracy?: {
7673
+ source: string;
7674
+ threshold: number;
7675
+ } | undefined;
7676
+ } | undefined;
7677
+ group?: string | undefined;
7678
+ visibleWhen?: {
7679
+ dialect: "cel" | "js" | "cron" | "template";
7680
+ source?: string | undefined;
7681
+ ast?: unknown;
7682
+ meta?: {
7683
+ rationale?: string | undefined;
7684
+ generatedBy?: string | undefined;
7685
+ } | undefined;
7686
+ } | {
7687
+ dialect: "cel" | "js" | "cron" | "template";
7688
+ source?: string | undefined;
7689
+ ast?: unknown;
7690
+ meta?: {
7691
+ rationale?: string | undefined;
7692
+ generatedBy?: string | undefined;
7693
+ } | undefined;
7694
+ } | undefined;
7695
+ readonlyWhen?: {
7696
+ dialect: "cel" | "js" | "cron" | "template";
7697
+ source?: string | undefined;
7698
+ ast?: unknown;
7699
+ meta?: {
7700
+ rationale?: string | undefined;
7701
+ generatedBy?: string | undefined;
7702
+ } | undefined;
7703
+ } | {
7704
+ dialect: "cel" | "js" | "cron" | "template";
7705
+ source?: string | undefined;
7706
+ ast?: unknown;
7707
+ meta?: {
7708
+ rationale?: string | undefined;
7709
+ generatedBy?: string | undefined;
7710
+ } | undefined;
7711
+ } | undefined;
7712
+ requiredWhen?: {
7713
+ dialect: "cel" | "js" | "cron" | "template";
7714
+ source?: string | undefined;
7715
+ ast?: unknown;
7716
+ meta?: {
7717
+ rationale?: string | undefined;
7718
+ generatedBy?: string | undefined;
7719
+ } | undefined;
7720
+ } | {
7721
+ dialect: "cel" | "js" | "cron" | "template";
7722
+ source?: string | undefined;
7723
+ ast?: unknown;
7724
+ meta?: {
7725
+ rationale?: string | undefined;
7726
+ generatedBy?: string | undefined;
7727
+ } | undefined;
7728
+ } | undefined;
7729
+ conditionalRequired?: {
7730
+ dialect: "cel" | "js" | "cron" | "template";
7731
+ source?: string | undefined;
7732
+ ast?: unknown;
7733
+ meta?: {
7734
+ rationale?: string | undefined;
7735
+ generatedBy?: string | undefined;
7736
+ } | undefined;
7737
+ } | {
7738
+ dialect: "cel" | "js" | "cron" | "template";
7739
+ source?: string | undefined;
7740
+ ast?: unknown;
7741
+ meta?: {
7742
+ rationale?: string | undefined;
7743
+ generatedBy?: string | undefined;
7744
+ } | undefined;
7745
+ } | undefined;
7746
+ system?: boolean | undefined;
7747
+ inlineHelpText?: string | undefined;
7748
+ trackFeedHistory?: boolean | undefined;
7749
+ caseSensitive?: boolean | undefined;
7750
+ autonumberFormat?: string | undefined;
7751
+ }>;
7752
+ _lock?: "full" | "none" | "no-overlay" | "no-delete" | undefined;
7753
+ _lockReason?: string | undefined;
7754
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
7755
+ _provenance?: "package" | "env-forced" | "org" | undefined;
7756
+ _packageId?: string | undefined;
7757
+ _packageVersion?: string | undefined;
7758
+ _lockDocsUrl?: string | undefined;
7759
+ label?: string | undefined;
7760
+ pluralLabel?: string | undefined;
7761
+ description?: string | undefined;
7762
+ icon?: string | undefined;
7763
+ tags?: string[] | undefined;
7764
+ managedBy?: "platform" | "system" | "config" | "append-only" | "better-auth" | undefined;
7765
+ userActions?: {
7766
+ create?: boolean | undefined;
7767
+ import?: boolean | undefined;
7768
+ edit?: boolean | undefined;
7769
+ delete?: boolean | undefined;
7770
+ exportCsv?: boolean | undefined;
7771
+ } | undefined;
7772
+ systemFields?: false | {
7773
+ tenant?: boolean | undefined;
7774
+ owner?: boolean | undefined;
7775
+ audit?: boolean | undefined;
7776
+ } | undefined;
7777
+ external?: {
7778
+ writable: boolean;
7779
+ remoteName?: string | undefined;
7780
+ remoteSchema?: string | undefined;
7781
+ columnMap?: Record<string, string> | undefined;
7782
+ introspectedAt?: string | undefined;
7783
+ ignoreColumns?: string[] | undefined;
7784
+ } | undefined;
7785
+ indexes?: {
7786
+ fields: string[];
7787
+ type: "hash" | "btree" | "gin" | "gist" | "fulltext";
7788
+ unique: boolean;
7789
+ name?: string | undefined;
7790
+ partial?: string | undefined;
7791
+ }[] | undefined;
7792
+ fieldGroups?: {
7793
+ key: string;
7794
+ label: string;
7795
+ defaultExpanded: boolean;
7796
+ icon?: string | undefined;
7797
+ description?: string | undefined;
7798
+ visibleOn?: {
7799
+ dialect: "cel" | "js" | "cron" | "template";
7800
+ source?: string | undefined;
7801
+ ast?: unknown;
7802
+ meta?: {
7803
+ rationale?: string | undefined;
7804
+ generatedBy?: string | undefined;
7805
+ } | undefined;
7806
+ } | {
7807
+ dialect: "cel" | "js" | "cron" | "template";
7808
+ source?: string | undefined;
7809
+ ast?: unknown;
7810
+ meta?: {
7811
+ rationale?: string | undefined;
7812
+ generatedBy?: string | undefined;
7813
+ } | undefined;
7814
+ } | undefined;
7815
+ }[] | undefined;
7816
+ tenancy?: {
7817
+ enabled: boolean;
7818
+ strategy: "hybrid" | "shared" | "isolated";
7819
+ tenantField: string;
7820
+ crossTenantAccess: boolean;
7821
+ } | undefined;
7822
+ softDelete?: {
7823
+ enabled: boolean;
7824
+ field: string;
7825
+ cascadeDelete: boolean;
7826
+ } | undefined;
7827
+ versioning?: {
7828
+ enabled: boolean;
7829
+ strategy: "snapshot" | "delta" | "event-sourcing";
7830
+ versionField: string;
7831
+ retentionDays?: number | undefined;
7832
+ } | undefined;
7833
+ partitioning?: {
7834
+ enabled: boolean;
7835
+ strategy: "hash" | "list" | "range";
7836
+ key: string;
7837
+ interval?: string | undefined;
7838
+ } | undefined;
7839
+ cdc?: {
7840
+ enabled: boolean;
7841
+ events: ("delete" | "update" | "insert")[];
7842
+ destination: string;
7843
+ } | undefined;
7844
+ validations?: _objectstack_spec_data.BaseValidationRuleShape[] | undefined;
7845
+ displayNameField?: string | undefined;
7846
+ recordName?: {
7847
+ type: "text" | "autonumber";
7848
+ displayFormat?: string | undefined;
7849
+ startNumber?: number | undefined;
7850
+ } | undefined;
7851
+ titleFormat?: {
7852
+ dialect: "cel" | "js" | "cron" | "template";
7853
+ source?: string | undefined;
7854
+ ast?: unknown;
7855
+ meta?: {
7856
+ rationale?: string | undefined;
7857
+ generatedBy?: string | undefined;
7858
+ } | undefined;
7859
+ } | {
7860
+ dialect: "cel" | "js" | "cron" | "template";
7861
+ source?: string | undefined;
7862
+ ast?: unknown;
7863
+ meta?: {
7864
+ rationale?: string | undefined;
7865
+ generatedBy?: string | undefined;
7866
+ } | undefined;
7867
+ } | undefined;
7868
+ compactLayout?: string[] | undefined;
7869
+ listViews?: Record<string, {
7870
+ type: "grid" | "kanban" | "calendar" | "gantt" | "gallery" | "timeline" | "chart" | "map";
7871
+ columns: string[] | {
7872
+ field: string;
7873
+ label?: string | undefined;
7874
+ width?: number | undefined;
7875
+ align?: "left" | "center" | "right" | undefined;
7876
+ hidden?: boolean | undefined;
7877
+ sortable?: boolean | undefined;
7878
+ resizable?: boolean | undefined;
7879
+ wrap?: boolean | undefined;
7880
+ type?: string | undefined;
7881
+ pinned?: "left" | "right" | undefined;
7882
+ summary?: "none" | "min" | "max" | "count" | "sum" | "avg" | "count_empty" | "count_filled" | "count_unique" | "percent_empty" | "percent_filled" | undefined;
7883
+ link?: boolean | undefined;
7884
+ action?: string | undefined;
7885
+ }[];
7886
+ name?: string | undefined;
7887
+ label?: string | undefined;
7888
+ data?: {
7889
+ provider: "object";
7890
+ object: string;
7891
+ } | {
7892
+ provider: "api";
7893
+ read?: {
7894
+ url: string;
7895
+ method: "POST" | "PATCH" | "PUT" | "DELETE" | "GET";
7896
+ headers?: Record<string, string> | undefined;
7897
+ params?: Record<string, unknown> | undefined;
7898
+ body?: unknown;
7899
+ } | undefined;
7900
+ write?: {
7901
+ url: string;
7902
+ method: "POST" | "PATCH" | "PUT" | "DELETE" | "GET";
7903
+ headers?: Record<string, string> | undefined;
7904
+ params?: Record<string, unknown> | undefined;
7905
+ body?: unknown;
7906
+ } | undefined;
7907
+ } | {
7908
+ provider: "value";
7909
+ items: unknown[];
7910
+ } | {
7911
+ provider: "schema";
7912
+ schemaId: string;
7913
+ schema?: Record<string, unknown> | undefined;
7914
+ } | undefined;
7915
+ filter?: {
7916
+ field: string;
7917
+ operator: string;
7918
+ value?: string | number | boolean | (string | number)[] | null | undefined;
7919
+ }[] | undefined;
7920
+ sort?: string | {
7921
+ field: string;
7922
+ order: "asc" | "desc";
7923
+ }[] | undefined;
7924
+ searchableFields?: string[] | undefined;
7925
+ filterableFields?: string[] | undefined;
7926
+ userFilters?: {
7927
+ element: "toggle" | "tabs" | "dropdown";
7928
+ fields?: {
7929
+ field: string;
7930
+ label?: string | undefined;
7931
+ type?: "boolean" | "text" | "select" | "multi-select" | "date-range" | undefined;
7932
+ options?: {
7933
+ value: string | number | boolean;
7934
+ label: string;
7935
+ color?: string | undefined;
7936
+ }[] | undefined;
7937
+ showCount?: boolean | undefined;
7938
+ defaultValues?: (string | number | boolean)[] | undefined;
7939
+ }[] | undefined;
7940
+ tabs?: {
7941
+ name: string;
7942
+ pinned: boolean;
7943
+ isDefault: boolean;
7944
+ visible: boolean;
7945
+ label?: string | undefined;
7946
+ icon?: string | undefined;
7947
+ view?: string | undefined;
7948
+ filter?: {
7949
+ field: string;
7950
+ operator: string;
7951
+ value?: string | number | boolean | (string | number)[] | null | undefined;
7952
+ }[] | undefined;
7953
+ order?: number | undefined;
7954
+ }[] | undefined;
7955
+ showAllRecords?: boolean | undefined;
7956
+ } | undefined;
7957
+ resizable?: boolean | undefined;
7958
+ striped?: boolean | undefined;
7959
+ bordered?: boolean | undefined;
7960
+ compactToolbar?: boolean | undefined;
7961
+ selection?: {
7962
+ type: "none" | "multiple" | "single";
7963
+ } | undefined;
7964
+ navigation?: {
7965
+ mode: "none" | "split" | "page" | "drawer" | "modal" | "popover" | "new_window";
7966
+ preventNavigation: boolean;
7967
+ openNewTab: boolean;
7968
+ view?: string | undefined;
7969
+ width?: string | number | undefined;
7970
+ } | undefined;
7971
+ pagination?: {
7972
+ pageSize: number;
7973
+ pageSizeOptions?: number[] | undefined;
7974
+ } | undefined;
7975
+ kanban?: {
7976
+ groupByField: string;
7977
+ columns: string[];
7978
+ summarizeField?: string | undefined;
7979
+ } | undefined;
7980
+ calendar?: {
7981
+ startDateField: string;
7982
+ titleField: string;
7983
+ endDateField?: string | undefined;
7984
+ colorField?: string | undefined;
7985
+ } | undefined;
7986
+ gantt?: {
7987
+ startDateField: string;
7988
+ endDateField: string;
7989
+ titleField: string;
7990
+ progressField?: string | undefined;
7991
+ dependenciesField?: string | undefined;
7992
+ } | undefined;
7993
+ gallery?: {
7994
+ coverFit: "cover" | "contain";
7995
+ cardSize: "small" | "medium" | "large";
7996
+ coverField?: string | undefined;
7997
+ titleField?: string | undefined;
7998
+ visibleFields?: string[] | undefined;
7999
+ } | undefined;
8000
+ timeline?: {
8001
+ startDateField: string;
8002
+ titleField: string;
8003
+ scale: "hour" | "day" | "week" | "month" | "quarter" | "year";
8004
+ endDateField?: string | undefined;
8005
+ groupByField?: string | undefined;
8006
+ colorField?: string | undefined;
8007
+ } | undefined;
8008
+ chart?: {
8009
+ chartType: "bar" | "line" | "pie" | "area" | "scatter";
8010
+ dataset: string;
8011
+ values: string[];
8012
+ dimensions?: string[] | undefined;
8013
+ } | undefined;
8014
+ description?: string | undefined;
8015
+ sharing?: {
8016
+ type: "personal" | "collaborative";
8017
+ lockedBy?: string | undefined;
8018
+ } | undefined;
8019
+ rowHeight?: "medium" | "short" | "compact" | "tall" | "extra_tall" | undefined;
8020
+ grouping?: {
8021
+ fields: {
8022
+ field: string;
8023
+ order: "asc" | "desc";
8024
+ collapsed: boolean;
8025
+ }[];
8026
+ } | undefined;
8027
+ rowColor?: {
8028
+ field: string;
8029
+ colors?: Record<string, string> | undefined;
8030
+ } | undefined;
8031
+ hiddenFields?: string[] | undefined;
8032
+ fieldOrder?: string[] | undefined;
8033
+ rowActions?: string[] | undefined;
8034
+ bulkActions?: string[] | undefined;
8035
+ bulkActionDefs?: Record<string, any>[] | undefined;
8036
+ virtualScroll?: boolean | undefined;
8037
+ conditionalFormatting?: {
8038
+ condition: {
8039
+ dialect: "cel" | "js" | "cron" | "template";
8040
+ source?: string | undefined;
8041
+ ast?: unknown;
8042
+ meta?: {
8043
+ rationale?: string | undefined;
8044
+ generatedBy?: string | undefined;
8045
+ } | undefined;
8046
+ } | {
8047
+ dialect: "cel" | "js" | "cron" | "template";
8048
+ source?: string | undefined;
8049
+ ast?: unknown;
8050
+ meta?: {
8051
+ rationale?: string | undefined;
8052
+ generatedBy?: string | undefined;
8053
+ } | undefined;
8054
+ };
8055
+ style: Record<string, string>;
8056
+ }[] | undefined;
8057
+ inlineEdit?: boolean | undefined;
8058
+ exportOptions?: ("json" | "csv" | "xlsx" | "pdf")[] | undefined;
8059
+ userActions?: {
8060
+ sort: boolean;
8061
+ search: boolean;
8062
+ filter: boolean;
8063
+ rowHeight: boolean;
8064
+ addRecordForm: boolean;
8065
+ buttons?: string[] | undefined;
8066
+ } | undefined;
8067
+ appearance?: {
8068
+ showDescription: boolean;
8069
+ allowedVisualizations?: ("grid" | "kanban" | "calendar" | "gantt" | "gallery" | "timeline" | "chart" | "map")[] | undefined;
8070
+ } | undefined;
8071
+ tabs?: {
8072
+ name: string;
8073
+ pinned: boolean;
8074
+ isDefault: boolean;
8075
+ visible: boolean;
8076
+ label?: string | undefined;
8077
+ icon?: string | undefined;
8078
+ view?: string | undefined;
8079
+ filter?: {
8080
+ field: string;
8081
+ operator: string;
8082
+ value?: string | number | boolean | (string | number)[] | null | undefined;
8083
+ }[] | undefined;
8084
+ order?: number | undefined;
8085
+ }[] | undefined;
8086
+ addRecord?: {
8087
+ enabled: boolean;
8088
+ position: "top" | "bottom" | "both";
8089
+ mode: "form" | "modal" | "inline";
8090
+ formView?: string | undefined;
8091
+ } | undefined;
8092
+ showRecordCount?: boolean | undefined;
8093
+ allowPrinting?: boolean | undefined;
8094
+ emptyState?: {
8095
+ title?: string | undefined;
8096
+ message?: string | undefined;
8097
+ icon?: string | undefined;
8098
+ } | undefined;
8099
+ aria?: {
8100
+ ariaLabel?: string | undefined;
8101
+ ariaDescribedBy?: string | undefined;
8102
+ role?: string | undefined;
8103
+ } | undefined;
8104
+ responsive?: {
8105
+ breakpoint?: "md" | "xs" | "sm" | "lg" | "xl" | "2xl" | undefined;
8106
+ hiddenOn?: ("md" | "xs" | "sm" | "lg" | "xl" | "2xl")[] | undefined;
8107
+ columns?: {
8108
+ xs?: number | undefined;
8109
+ sm?: number | undefined;
8110
+ md?: number | undefined;
8111
+ lg?: number | undefined;
8112
+ xl?: number | undefined;
8113
+ '2xl'?: number | undefined;
8114
+ } | undefined;
8115
+ order?: {
8116
+ xs?: number | undefined;
8117
+ sm?: number | undefined;
8118
+ md?: number | undefined;
8119
+ lg?: number | undefined;
8120
+ xl?: number | undefined;
8121
+ '2xl'?: number | undefined;
8122
+ } | undefined;
8123
+ } | undefined;
8124
+ performance?: {
8125
+ lazyLoad?: boolean | undefined;
8126
+ virtualScroll?: {
8127
+ enabled: boolean;
8128
+ itemHeight?: number | undefined;
8129
+ overscan?: number | undefined;
8130
+ } | undefined;
8131
+ cacheStrategy?: "none" | "cache-first" | "network-first" | "stale-while-revalidate" | undefined;
8132
+ prefetch?: boolean | undefined;
8133
+ pageSize?: number | undefined;
8134
+ debounceMs?: number | undefined;
8135
+ } | undefined;
8136
+ }> | undefined;
8137
+ defaultDetailForm?: string | undefined;
8138
+ search?: {
8139
+ fields: string[];
8140
+ displayFields?: string[] | undefined;
8141
+ filters?: string[] | undefined;
8142
+ } | undefined;
8143
+ enable?: {
8144
+ trackHistory: boolean;
8145
+ searchable: boolean;
8146
+ apiEnabled: boolean;
8147
+ files: boolean;
8148
+ feeds: boolean;
8149
+ activities: boolean;
8150
+ trash: boolean;
8151
+ mru: boolean;
8152
+ clone: boolean;
8153
+ apiMethods?: ("search" | "create" | "import" | "delete" | "list" | "get" | "update" | "upsert" | "bulk" | "aggregate" | "history" | "restore" | "purge" | "export")[] | undefined;
8154
+ } | undefined;
8155
+ recordTypes?: string[] | undefined;
8156
+ sharingModel?: "full" | "read" | "private" | "read_write" | undefined;
8157
+ publicSharing?: {
8158
+ enabled: boolean;
8159
+ allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
8160
+ allowedPermissions?: ("edit" | "view" | "comment")[] | undefined;
8161
+ maxExpiryDays?: number | undefined;
8162
+ redactFields?: string[] | undefined;
8163
+ eligibility?: string | undefined;
8164
+ } | undefined;
8165
+ keyPrefix?: string | undefined;
8166
+ detail?: {
8167
+ [x: string]: unknown;
8168
+ renderViaSchema?: boolean | undefined;
8169
+ hideReferenceRail?: boolean | undefined;
8170
+ hideRelatedTab?: boolean | undefined;
8171
+ } | undefined;
8172
+ actions?: {
8173
+ name: string;
8174
+ label: string;
8175
+ type: "url" | "form" | "flow" | "api" | "script" | "modal";
8176
+ refreshAfter: boolean;
8177
+ objectName?: string | undefined;
8178
+ icon?: string | undefined;
8179
+ locations?: ("list_toolbar" | "list_item" | "record_header" | "record_more" | "record_related" | "record_section" | "global_nav")[] | undefined;
8180
+ component?: "action:button" | "action:icon" | "action:menu" | "action:group" | undefined;
8181
+ target?: string | undefined;
8182
+ body?: {
8183
+ language: "expression";
8184
+ source: string;
8185
+ } | {
8186
+ language: "js";
8187
+ source: string;
8188
+ capabilities: ("api.read" | "api.write" | "crypto.uuid" | "crypto.hash" | "log")[];
8189
+ timeoutMs?: number | undefined;
8190
+ memoryMb?: number | undefined;
8191
+ } | undefined;
8192
+ execute?: string | undefined;
8193
+ params?: {
8194
+ required: boolean;
8195
+ name?: string | undefined;
8196
+ field?: string | undefined;
8197
+ objectOverride?: string | undefined;
8198
+ label?: string | undefined;
8199
+ type?: "number" | "boolean" | "date" | "record" | "file" | "code" | "datetime" | "signature" | "progress" | "url" | "lookup" | "master_detail" | "currency" | "percent" | "password" | "secret" | "email" | "time" | "text" | "textarea" | "phone" | "markdown" | "html" | "richtext" | "toggle" | "select" | "multiselect" | "radio" | "checkboxes" | "tree" | "image" | "avatar" | "video" | "audio" | "formula" | "summary" | "autonumber" | "composite" | "repeater" | "location" | "address" | "json" | "color" | "rating" | "slider" | "qrcode" | "tags" | "vector" | undefined;
8200
+ options?: {
8201
+ label: string;
8202
+ value: string;
8203
+ }[] | undefined;
8204
+ placeholder?: string | undefined;
8205
+ helpText?: string | undefined;
8206
+ defaultValue?: unknown;
8207
+ defaultFromRow?: boolean | undefined;
8208
+ }[] | undefined;
8209
+ variant?: "link" | "primary" | "secondary" | "danger" | "ghost" | undefined;
8210
+ confirmText?: string | undefined;
8211
+ successMessage?: string | undefined;
8212
+ resultDialog?: {
8213
+ title?: string | undefined;
8214
+ description?: string | undefined;
8215
+ acknowledge?: string | undefined;
8216
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
8217
+ fields?: {
8218
+ path: string;
8219
+ label?: string | undefined;
8220
+ format?: "secret" | "text" | "json" | "qrcode" | "code-list" | undefined;
8221
+ }[] | undefined;
8222
+ } | undefined;
8223
+ visible?: {
8224
+ dialect: "cel" | "js" | "cron" | "template";
8225
+ source?: string | undefined;
8226
+ ast?: unknown;
8227
+ meta?: {
8228
+ rationale?: string | undefined;
8229
+ generatedBy?: string | undefined;
8230
+ } | undefined;
8231
+ } | undefined;
8232
+ disabled?: boolean | {
8233
+ dialect: "cel" | "js" | "cron" | "template";
8234
+ source?: string | undefined;
8235
+ ast?: unknown;
8236
+ meta?: {
8237
+ rationale?: string | undefined;
8238
+ generatedBy?: string | undefined;
8239
+ } | undefined;
8240
+ } | undefined;
8241
+ shortcut?: string | undefined;
8242
+ bulkEnabled?: boolean | undefined;
8243
+ ai?: {
8244
+ exposed: boolean;
8245
+ description?: string | undefined;
8246
+ category?: "action" | "data" | "flow" | "integration" | "vector_search" | "analytics" | "utility" | undefined;
8247
+ paramHints?: Record<string, {
8248
+ description?: string | undefined;
8249
+ enum?: (string | number)[] | undefined;
8250
+ examples?: unknown[] | undefined;
8251
+ }> | undefined;
8252
+ outputSchema?: Record<string, unknown> | undefined;
8253
+ requiresConfirmation?: boolean | undefined;
8254
+ } | undefined;
8255
+ recordIdParam?: string | undefined;
8256
+ recordIdField?: string | undefined;
8257
+ bodyShape?: "flat" | {
8258
+ wrap: string;
8259
+ } | undefined;
8260
+ method?: "POST" | "PATCH" | "PUT" | "DELETE" | undefined;
8261
+ bodyExtra?: Record<string, unknown> | undefined;
8262
+ mode?: "custom" | "delete" | "edit" | "create" | undefined;
8263
+ opensInNewTab?: boolean | undefined;
8264
+ newTabUrl?: string | undefined;
8265
+ timeout?: number | undefined;
8266
+ aria?: {
8267
+ ariaLabel?: string | undefined;
8268
+ ariaDescribedBy?: string | undefined;
8269
+ role?: string | undefined;
8270
+ } | undefined;
8271
+ }[] | undefined;
8272
+ protection?: {
8273
+ lock: "full" | "none" | "no-overlay" | "no-delete";
8274
+ reason: string;
8275
+ docsUrl?: string | undefined;
8276
+ } | undefined;
8277
+ }, "fields"> & Pick<{
8278
+ readonly name: "sys_approval_approver";
8279
+ readonly label: "Approval Approver";
8280
+ readonly pluralLabel: "Approval Approvers";
8281
+ readonly icon: "users";
8282
+ readonly isSystem: true;
8283
+ readonly managedBy: "system";
8284
+ readonly description: "Normalized pending-approver rows for indexed inbox queries";
8285
+ readonly displayNameField: "id";
8286
+ readonly titleFormat: "{approver} · {request_id}";
8287
+ readonly compactLayout: ["request_id", "approver", "created_at"];
8288
+ readonly fields: {
8289
+ readonly id: {
8290
+ readonly readonly?: boolean | undefined;
8291
+ readonly format?: string | undefined;
8292
+ readonly options?: {
8293
+ label: string;
8294
+ value: string;
8295
+ color?: string | undefined;
8296
+ default?: boolean | undefined;
8297
+ }[] | undefined;
8298
+ readonly description?: string | undefined;
8299
+ readonly label?: string | undefined;
8300
+ readonly name?: string | undefined;
8301
+ readonly precision?: number | undefined;
8302
+ readonly required?: boolean | undefined;
8303
+ readonly multiple?: boolean | undefined;
8304
+ readonly dependencies?: string[] | undefined;
8305
+ readonly theme?: string | undefined;
8306
+ readonly externalId?: boolean | undefined;
8307
+ readonly defaultValue?: unknown;
8308
+ readonly group?: string | undefined;
8309
+ readonly hidden?: boolean | undefined;
8310
+ readonly system?: boolean | undefined;
8311
+ readonly min?: number | undefined;
8312
+ readonly max?: number | undefined;
8313
+ readonly encryptionConfig?: {
8314
+ enabled: boolean;
8315
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
8316
+ keyManagement: {
8317
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
8318
+ keyId?: string | undefined;
8319
+ rotationPolicy?: {
8320
+ enabled: boolean;
8321
+ frequencyDays: number;
8322
+ retainOldVersions: number;
8323
+ autoRotate: boolean;
8324
+ } | undefined;
8325
+ };
8326
+ scope: "record" | "field" | "table" | "database";
8327
+ deterministicEncryption: boolean;
8328
+ searchableEncryption: boolean;
8329
+ } | undefined;
8330
+ readonly columnName?: string | undefined;
8331
+ readonly searchable?: boolean | undefined;
8332
+ readonly unique?: boolean | undefined;
8333
+ readonly maxLength?: number | undefined;
8334
+ readonly minLength?: number | undefined;
8335
+ readonly scale?: number | undefined;
8336
+ readonly reference?: string | undefined;
8337
+ readonly referenceFilters?: string[] | undefined;
8338
+ readonly writeRequiresMasterRead?: boolean | undefined;
8339
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
8340
+ readonly inlineEdit?: boolean | "grid" | "form" | undefined;
8341
+ readonly inlineTitle?: string | undefined;
8342
+ readonly inlineColumns?: any[] | undefined;
8343
+ readonly inlineAmountField?: string | undefined;
8344
+ readonly relatedList?: boolean | undefined;
8345
+ readonly relatedListTitle?: string | undefined;
8346
+ readonly relatedListColumns?: any[] | undefined;
8347
+ readonly expression?: {
8348
+ dialect: "cel" | "js" | "cron" | "template";
8349
+ source?: string | undefined;
8350
+ ast?: unknown;
8351
+ meta?: {
8352
+ rationale?: string | undefined;
8353
+ generatedBy?: string | undefined;
8354
+ } | undefined;
8355
+ } | undefined;
8356
+ readonly summaryOperations?: {
8357
+ object: string;
8358
+ field: string;
8359
+ function: "min" | "max" | "count" | "sum" | "avg";
8360
+ relationshipField?: string | undefined;
8361
+ } | undefined;
8362
+ readonly language?: string | undefined;
8363
+ readonly lineNumbers?: boolean | undefined;
8364
+ readonly maxRating?: number | undefined;
8365
+ readonly allowHalf?: boolean | undefined;
8366
+ readonly displayMap?: boolean | undefined;
8367
+ readonly allowGeocoding?: boolean | undefined;
8368
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
8369
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
8370
+ readonly allowAlpha?: boolean | undefined;
8371
+ readonly presetColors?: string[] | undefined;
8372
+ readonly step?: number | undefined;
8373
+ readonly showValue?: boolean | undefined;
8374
+ readonly marks?: Record<string, string> | undefined;
8375
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
8376
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
8377
+ readonly displayValue?: boolean | undefined;
8378
+ readonly allowScanning?: boolean | undefined;
8379
+ readonly currencyConfig?: {
8380
+ precision: number;
8381
+ currencyMode: "fixed" | "dynamic";
8382
+ defaultCurrency: string;
8383
+ } | undefined;
8384
+ readonly vectorConfig?: {
8385
+ dimensions: number;
8386
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
8387
+ normalized: boolean;
8388
+ indexed: boolean;
8389
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
8390
+ } | undefined;
8391
+ readonly fileAttachmentConfig?: {
8392
+ virusScan: boolean;
8393
+ virusScanOnUpload: boolean;
8394
+ quarantineOnThreat: boolean;
8395
+ allowMultiple: boolean;
8396
+ allowReplace: boolean;
8397
+ allowDelete: boolean;
8398
+ requireUpload: boolean;
8399
+ extractMetadata: boolean;
8400
+ extractText: boolean;
8401
+ versioningEnabled: boolean;
8402
+ publicRead: boolean;
8403
+ presignedUrlExpiry: number;
8404
+ minSize?: number | undefined;
8405
+ maxSize?: number | undefined;
8406
+ allowedTypes?: string[] | undefined;
8407
+ blockedTypes?: string[] | undefined;
8408
+ allowedMimeTypes?: string[] | undefined;
8409
+ blockedMimeTypes?: string[] | undefined;
8410
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
8411
+ storageProvider?: string | undefined;
8412
+ storageBucket?: string | undefined;
8413
+ storagePrefix?: string | undefined;
8414
+ imageValidation?: {
8415
+ generateThumbnails: boolean;
8416
+ preserveMetadata: boolean;
8417
+ autoRotate: boolean;
8418
+ minWidth?: number | undefined;
8419
+ maxWidth?: number | undefined;
8420
+ minHeight?: number | undefined;
8421
+ maxHeight?: number | undefined;
8422
+ aspectRatio?: string | undefined;
8423
+ thumbnailSizes?: {
8424
+ name: string;
8425
+ width: number;
8426
+ height: number;
8427
+ crop: boolean;
8428
+ }[] | undefined;
8429
+ } | undefined;
8430
+ maxVersions?: number | undefined;
8431
+ } | undefined;
8432
+ readonly maskingRule?: {
8433
+ field: string;
8434
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
8435
+ preserveFormat: boolean;
8436
+ preserveLength: boolean;
8437
+ pattern?: string | undefined;
8438
+ roles?: string[] | undefined;
8439
+ exemptRoles?: string[] | undefined;
8440
+ } | undefined;
8441
+ readonly auditTrail?: boolean | undefined;
8442
+ readonly cached?: {
8443
+ enabled: boolean;
8444
+ ttl: number;
8445
+ invalidateOn: string[];
8446
+ } | undefined;
8447
+ readonly dataQuality?: {
8448
+ uniqueness: boolean;
8449
+ completeness: number;
8450
+ accuracy?: {
8451
+ source: string;
8452
+ threshold: number;
8453
+ } | undefined;
8454
+ } | undefined;
8455
+ readonly visibleWhen?: {
8456
+ dialect: "cel" | "js" | "cron" | "template";
8457
+ source?: string | undefined;
8458
+ ast?: unknown;
8459
+ meta?: {
8460
+ rationale?: string | undefined;
8461
+ generatedBy?: string | undefined;
8462
+ } | undefined;
8463
+ } | undefined;
8464
+ readonly readonlyWhen?: {
8465
+ dialect: "cel" | "js" | "cron" | "template";
8466
+ source?: string | undefined;
8467
+ ast?: unknown;
8468
+ meta?: {
8469
+ rationale?: string | undefined;
8470
+ generatedBy?: string | undefined;
8471
+ } | undefined;
8472
+ } | undefined;
8473
+ readonly requiredWhen?: {
8474
+ dialect: "cel" | "js" | "cron" | "template";
8475
+ source?: string | undefined;
8476
+ ast?: unknown;
8477
+ meta?: {
8478
+ rationale?: string | undefined;
8479
+ generatedBy?: string | undefined;
8480
+ } | undefined;
8481
+ } | undefined;
8482
+ readonly conditionalRequired?: {
8483
+ dialect: "cel" | "js" | "cron" | "template";
8484
+ source?: string | undefined;
8485
+ ast?: unknown;
8486
+ meta?: {
8487
+ rationale?: string | undefined;
8488
+ generatedBy?: string | undefined;
8489
+ } | undefined;
8490
+ } | undefined;
8491
+ readonly sortable?: boolean | undefined;
8492
+ readonly inlineHelpText?: string | undefined;
8493
+ readonly trackFeedHistory?: boolean | undefined;
8494
+ readonly caseSensitive?: boolean | undefined;
8495
+ readonly autonumberFormat?: string | undefined;
8496
+ readonly index?: boolean | undefined;
8497
+ readonly type: "text";
8498
+ };
8499
+ readonly organization_id: {
8500
+ readonly readonly?: boolean | undefined;
8501
+ readonly format?: string | undefined;
8502
+ readonly options?: {
8503
+ label: string;
8504
+ value: string;
8505
+ color?: string | undefined;
8506
+ default?: boolean | undefined;
8507
+ }[] | undefined;
8508
+ readonly description?: string | undefined;
8509
+ readonly label?: string | undefined;
8510
+ readonly name?: string | undefined;
8511
+ readonly precision?: number | undefined;
8512
+ readonly required?: boolean | undefined;
8513
+ readonly multiple?: boolean | undefined;
8514
+ readonly dependencies?: string[] | undefined;
8515
+ readonly theme?: string | undefined;
8516
+ readonly externalId?: boolean | undefined;
8517
+ readonly defaultValue?: unknown;
8518
+ readonly group?: string | undefined;
8519
+ readonly hidden?: boolean | undefined;
8520
+ readonly system?: boolean | undefined;
8521
+ readonly min?: number | undefined;
8522
+ readonly max?: number | undefined;
8523
+ readonly encryptionConfig?: {
8524
+ enabled: boolean;
8525
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
8526
+ keyManagement: {
8527
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
8528
+ keyId?: string | undefined;
8529
+ rotationPolicy?: {
8530
+ enabled: boolean;
8531
+ frequencyDays: number;
8532
+ retainOldVersions: number;
8533
+ autoRotate: boolean;
8534
+ } | undefined;
8535
+ };
8536
+ scope: "record" | "field" | "table" | "database";
8537
+ deterministicEncryption: boolean;
8538
+ searchableEncryption: boolean;
8539
+ } | undefined;
8540
+ readonly columnName?: string | undefined;
8541
+ readonly searchable?: boolean | undefined;
8542
+ readonly unique?: boolean | undefined;
8543
+ readonly maxLength?: number | undefined;
8544
+ readonly minLength?: number | undefined;
8545
+ readonly scale?: number | undefined;
8546
+ reference: string;
8547
+ readonly referenceFilters?: string[] | undefined;
8548
+ readonly writeRequiresMasterRead?: boolean | undefined;
8549
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
8550
+ readonly inlineEdit?: boolean | "grid" | "form" | undefined;
8551
+ readonly inlineTitle?: string | undefined;
8552
+ readonly inlineColumns?: any[] | undefined;
8553
+ readonly inlineAmountField?: string | undefined;
8554
+ readonly relatedList?: boolean | undefined;
8555
+ readonly relatedListTitle?: string | undefined;
8556
+ readonly relatedListColumns?: any[] | undefined;
8557
+ readonly expression?: {
8558
+ dialect: "cel" | "js" | "cron" | "template";
8559
+ source?: string | undefined;
8560
+ ast?: unknown;
8561
+ meta?: {
8562
+ rationale?: string | undefined;
8563
+ generatedBy?: string | undefined;
8564
+ } | undefined;
8565
+ } | undefined;
8566
+ readonly summaryOperations?: {
8567
+ object: string;
8568
+ field: string;
8569
+ function: "min" | "max" | "count" | "sum" | "avg";
8570
+ relationshipField?: string | undefined;
8571
+ } | undefined;
8572
+ readonly language?: string | undefined;
8573
+ readonly lineNumbers?: boolean | undefined;
8574
+ readonly maxRating?: number | undefined;
8575
+ readonly allowHalf?: boolean | undefined;
8576
+ readonly displayMap?: boolean | undefined;
8577
+ readonly allowGeocoding?: boolean | undefined;
8578
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
8579
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
8580
+ readonly allowAlpha?: boolean | undefined;
8581
+ readonly presetColors?: string[] | undefined;
8582
+ readonly step?: number | undefined;
8583
+ readonly showValue?: boolean | undefined;
8584
+ readonly marks?: Record<string, string> | undefined;
8585
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
8586
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
8587
+ readonly displayValue?: boolean | undefined;
8588
+ readonly allowScanning?: boolean | undefined;
8589
+ readonly currencyConfig?: {
8590
+ precision: number;
8591
+ currencyMode: "fixed" | "dynamic";
8592
+ defaultCurrency: string;
8593
+ } | undefined;
8594
+ readonly vectorConfig?: {
8595
+ dimensions: number;
8596
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
8597
+ normalized: boolean;
8598
+ indexed: boolean;
8599
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
8600
+ } | undefined;
8601
+ readonly fileAttachmentConfig?: {
8602
+ virusScan: boolean;
8603
+ virusScanOnUpload: boolean;
8604
+ quarantineOnThreat: boolean;
8605
+ allowMultiple: boolean;
8606
+ allowReplace: boolean;
8607
+ allowDelete: boolean;
8608
+ requireUpload: boolean;
8609
+ extractMetadata: boolean;
8610
+ extractText: boolean;
8611
+ versioningEnabled: boolean;
8612
+ publicRead: boolean;
8613
+ presignedUrlExpiry: number;
8614
+ minSize?: number | undefined;
8615
+ maxSize?: number | undefined;
8616
+ allowedTypes?: string[] | undefined;
8617
+ blockedTypes?: string[] | undefined;
8618
+ allowedMimeTypes?: string[] | undefined;
8619
+ blockedMimeTypes?: string[] | undefined;
8620
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
8621
+ storageProvider?: string | undefined;
8622
+ storageBucket?: string | undefined;
8623
+ storagePrefix?: string | undefined;
8624
+ imageValidation?: {
8625
+ generateThumbnails: boolean;
8626
+ preserveMetadata: boolean;
8627
+ autoRotate: boolean;
8628
+ minWidth?: number | undefined;
8629
+ maxWidth?: number | undefined;
8630
+ minHeight?: number | undefined;
8631
+ maxHeight?: number | undefined;
8632
+ aspectRatio?: string | undefined;
8633
+ thumbnailSizes?: {
8634
+ name: string;
8635
+ width: number;
8636
+ height: number;
8637
+ crop: boolean;
8638
+ }[] | undefined;
8639
+ } | undefined;
8640
+ maxVersions?: number | undefined;
8641
+ } | undefined;
8642
+ readonly maskingRule?: {
8643
+ field: string;
8644
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
8645
+ preserveFormat: boolean;
8646
+ preserveLength: boolean;
8647
+ pattern?: string | undefined;
8648
+ roles?: string[] | undefined;
8649
+ exemptRoles?: string[] | undefined;
8650
+ } | undefined;
8651
+ readonly auditTrail?: boolean | undefined;
8652
+ readonly cached?: {
8653
+ enabled: boolean;
8654
+ ttl: number;
8655
+ invalidateOn: string[];
8656
+ } | undefined;
8657
+ readonly dataQuality?: {
8658
+ uniqueness: boolean;
8659
+ completeness: number;
8660
+ accuracy?: {
8661
+ source: string;
8662
+ threshold: number;
8663
+ } | undefined;
8664
+ } | undefined;
8665
+ readonly visibleWhen?: {
8666
+ dialect: "cel" | "js" | "cron" | "template";
8667
+ source?: string | undefined;
8668
+ ast?: unknown;
8669
+ meta?: {
8670
+ rationale?: string | undefined;
8671
+ generatedBy?: string | undefined;
8672
+ } | undefined;
8673
+ } | undefined;
8674
+ readonly readonlyWhen?: {
8675
+ dialect: "cel" | "js" | "cron" | "template";
8676
+ source?: string | undefined;
8677
+ ast?: unknown;
8678
+ meta?: {
8679
+ rationale?: string | undefined;
8680
+ generatedBy?: string | undefined;
8681
+ } | undefined;
8682
+ } | undefined;
8683
+ readonly requiredWhen?: {
8684
+ dialect: "cel" | "js" | "cron" | "template";
8685
+ source?: string | undefined;
8686
+ ast?: unknown;
8687
+ meta?: {
8688
+ rationale?: string | undefined;
8689
+ generatedBy?: string | undefined;
8690
+ } | undefined;
8691
+ } | undefined;
8692
+ readonly conditionalRequired?: {
8693
+ dialect: "cel" | "js" | "cron" | "template";
8694
+ source?: string | undefined;
8695
+ ast?: unknown;
8696
+ meta?: {
8697
+ rationale?: string | undefined;
8698
+ generatedBy?: string | undefined;
8699
+ } | undefined;
8700
+ } | undefined;
8701
+ readonly sortable?: boolean | undefined;
8702
+ readonly inlineHelpText?: string | undefined;
8703
+ readonly trackFeedHistory?: boolean | undefined;
8704
+ readonly caseSensitive?: boolean | undefined;
8705
+ readonly autonumberFormat?: string | undefined;
8706
+ readonly index?: boolean | undefined;
8707
+ readonly type: "lookup";
8708
+ };
8709
+ readonly request_id: {
8710
+ readonly readonly?: boolean | undefined;
8711
+ readonly format?: string | undefined;
8712
+ readonly options?: {
8713
+ label: string;
8714
+ value: string;
8715
+ color?: string | undefined;
8716
+ default?: boolean | undefined;
8717
+ }[] | undefined;
8718
+ readonly description?: string | undefined;
8719
+ readonly label?: string | undefined;
8720
+ readonly name?: string | undefined;
8721
+ readonly precision?: number | undefined;
8722
+ readonly required?: boolean | undefined;
8723
+ readonly multiple?: boolean | undefined;
8724
+ readonly dependencies?: string[] | undefined;
8725
+ readonly theme?: string | undefined;
8726
+ readonly externalId?: boolean | undefined;
8727
+ readonly defaultValue?: unknown;
8728
+ readonly group?: string | undefined;
8729
+ readonly hidden?: boolean | undefined;
8730
+ readonly system?: boolean | undefined;
8731
+ readonly min?: number | undefined;
8732
+ readonly max?: number | undefined;
8733
+ readonly encryptionConfig?: {
8734
+ enabled: boolean;
8735
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
8736
+ keyManagement: {
8737
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
8738
+ keyId?: string | undefined;
8739
+ rotationPolicy?: {
8740
+ enabled: boolean;
8741
+ frequencyDays: number;
8742
+ retainOldVersions: number;
8743
+ autoRotate: boolean;
8744
+ } | undefined;
8745
+ };
8746
+ scope: "record" | "field" | "table" | "database";
8747
+ deterministicEncryption: boolean;
8748
+ searchableEncryption: boolean;
8749
+ } | undefined;
8750
+ readonly columnName?: string | undefined;
8751
+ readonly searchable?: boolean | undefined;
8752
+ readonly unique?: boolean | undefined;
8753
+ readonly maxLength?: number | undefined;
8754
+ readonly minLength?: number | undefined;
8755
+ readonly scale?: number | undefined;
8756
+ reference: string;
8757
+ readonly referenceFilters?: string[] | undefined;
8758
+ readonly writeRequiresMasterRead?: boolean | undefined;
8759
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
8760
+ readonly inlineEdit?: boolean | "grid" | "form" | undefined;
8761
+ readonly inlineTitle?: string | undefined;
8762
+ readonly inlineColumns?: any[] | undefined;
8763
+ readonly inlineAmountField?: string | undefined;
8764
+ readonly relatedList?: boolean | undefined;
8765
+ readonly relatedListTitle?: string | undefined;
8766
+ readonly relatedListColumns?: any[] | undefined;
8767
+ readonly expression?: {
8768
+ dialect: "cel" | "js" | "cron" | "template";
8769
+ source?: string | undefined;
8770
+ ast?: unknown;
8771
+ meta?: {
8772
+ rationale?: string | undefined;
8773
+ generatedBy?: string | undefined;
8774
+ } | undefined;
8775
+ } | undefined;
8776
+ readonly summaryOperations?: {
8777
+ object: string;
8778
+ field: string;
8779
+ function: "min" | "max" | "count" | "sum" | "avg";
8780
+ relationshipField?: string | undefined;
8781
+ } | undefined;
8782
+ readonly language?: string | undefined;
8783
+ readonly lineNumbers?: boolean | undefined;
8784
+ readonly maxRating?: number | undefined;
8785
+ readonly allowHalf?: boolean | undefined;
8786
+ readonly displayMap?: boolean | undefined;
8787
+ readonly allowGeocoding?: boolean | undefined;
8788
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
8789
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
8790
+ readonly allowAlpha?: boolean | undefined;
8791
+ readonly presetColors?: string[] | undefined;
8792
+ readonly step?: number | undefined;
8793
+ readonly showValue?: boolean | undefined;
8794
+ readonly marks?: Record<string, string> | undefined;
8795
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
8796
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
8797
+ readonly displayValue?: boolean | undefined;
8798
+ readonly allowScanning?: boolean | undefined;
8799
+ readonly currencyConfig?: {
8800
+ precision: number;
8801
+ currencyMode: "fixed" | "dynamic";
8802
+ defaultCurrency: string;
8803
+ } | undefined;
8804
+ readonly vectorConfig?: {
8805
+ dimensions: number;
8806
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
8807
+ normalized: boolean;
8808
+ indexed: boolean;
8809
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
8810
+ } | undefined;
8811
+ readonly fileAttachmentConfig?: {
8812
+ virusScan: boolean;
8813
+ virusScanOnUpload: boolean;
8814
+ quarantineOnThreat: boolean;
8815
+ allowMultiple: boolean;
8816
+ allowReplace: boolean;
8817
+ allowDelete: boolean;
8818
+ requireUpload: boolean;
8819
+ extractMetadata: boolean;
8820
+ extractText: boolean;
8821
+ versioningEnabled: boolean;
8822
+ publicRead: boolean;
8823
+ presignedUrlExpiry: number;
8824
+ minSize?: number | undefined;
8825
+ maxSize?: number | undefined;
8826
+ allowedTypes?: string[] | undefined;
8827
+ blockedTypes?: string[] | undefined;
8828
+ allowedMimeTypes?: string[] | undefined;
8829
+ blockedMimeTypes?: string[] | undefined;
8830
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
8831
+ storageProvider?: string | undefined;
8832
+ storageBucket?: string | undefined;
8833
+ storagePrefix?: string | undefined;
8834
+ imageValidation?: {
8835
+ generateThumbnails: boolean;
8836
+ preserveMetadata: boolean;
8837
+ autoRotate: boolean;
8838
+ minWidth?: number | undefined;
8839
+ maxWidth?: number | undefined;
8840
+ minHeight?: number | undefined;
8841
+ maxHeight?: number | undefined;
8842
+ aspectRatio?: string | undefined;
8843
+ thumbnailSizes?: {
8844
+ name: string;
8845
+ width: number;
8846
+ height: number;
8847
+ crop: boolean;
8848
+ }[] | undefined;
8849
+ } | undefined;
8850
+ maxVersions?: number | undefined;
8851
+ } | undefined;
8852
+ readonly maskingRule?: {
8853
+ field: string;
8854
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
8855
+ preserveFormat: boolean;
8856
+ preserveLength: boolean;
8857
+ pattern?: string | undefined;
8858
+ roles?: string[] | undefined;
8859
+ exemptRoles?: string[] | undefined;
8860
+ } | undefined;
8861
+ readonly auditTrail?: boolean | undefined;
8862
+ readonly cached?: {
8863
+ enabled: boolean;
8864
+ ttl: number;
8865
+ invalidateOn: string[];
8866
+ } | undefined;
8867
+ readonly dataQuality?: {
8868
+ uniqueness: boolean;
8869
+ completeness: number;
8870
+ accuracy?: {
8871
+ source: string;
8872
+ threshold: number;
8873
+ } | undefined;
8874
+ } | undefined;
8875
+ readonly visibleWhen?: {
8876
+ dialect: "cel" | "js" | "cron" | "template";
8877
+ source?: string | undefined;
8878
+ ast?: unknown;
8879
+ meta?: {
8880
+ rationale?: string | undefined;
8881
+ generatedBy?: string | undefined;
8882
+ } | undefined;
8883
+ } | undefined;
8884
+ readonly readonlyWhen?: {
8885
+ dialect: "cel" | "js" | "cron" | "template";
8886
+ source?: string | undefined;
8887
+ ast?: unknown;
8888
+ meta?: {
8889
+ rationale?: string | undefined;
8890
+ generatedBy?: string | undefined;
8891
+ } | undefined;
8892
+ } | undefined;
8893
+ readonly requiredWhen?: {
8894
+ dialect: "cel" | "js" | "cron" | "template";
8895
+ source?: string | undefined;
8896
+ ast?: unknown;
8897
+ meta?: {
8898
+ rationale?: string | undefined;
8899
+ generatedBy?: string | undefined;
8900
+ } | undefined;
8901
+ } | undefined;
8902
+ readonly conditionalRequired?: {
8903
+ dialect: "cel" | "js" | "cron" | "template";
8904
+ source?: string | undefined;
8905
+ ast?: unknown;
8906
+ meta?: {
8907
+ rationale?: string | undefined;
8908
+ generatedBy?: string | undefined;
8909
+ } | undefined;
8910
+ } | undefined;
8911
+ readonly sortable?: boolean | undefined;
8912
+ readonly inlineHelpText?: string | undefined;
8913
+ readonly trackFeedHistory?: boolean | undefined;
8914
+ readonly caseSensitive?: boolean | undefined;
8915
+ readonly autonumberFormat?: string | undefined;
8916
+ readonly index?: boolean | undefined;
8917
+ readonly type: "lookup";
8918
+ };
8919
+ readonly approver: {
8920
+ readonly readonly?: boolean | undefined;
8921
+ readonly format?: string | undefined;
8922
+ readonly options?: {
8923
+ label: string;
8924
+ value: string;
8925
+ color?: string | undefined;
8926
+ default?: boolean | undefined;
8927
+ }[] | undefined;
8928
+ readonly description?: string | undefined;
8929
+ readonly label?: string | undefined;
8930
+ readonly name?: string | undefined;
8931
+ readonly precision?: number | undefined;
8932
+ readonly required?: boolean | undefined;
8933
+ readonly multiple?: boolean | undefined;
8934
+ readonly dependencies?: string[] | undefined;
8935
+ readonly theme?: string | undefined;
8936
+ readonly externalId?: boolean | undefined;
8937
+ readonly defaultValue?: unknown;
8938
+ readonly group?: string | undefined;
8939
+ readonly hidden?: boolean | undefined;
8940
+ readonly system?: boolean | undefined;
8941
+ readonly min?: number | undefined;
8942
+ readonly max?: number | undefined;
8943
+ readonly encryptionConfig?: {
8944
+ enabled: boolean;
8945
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
8946
+ keyManagement: {
8947
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
8948
+ keyId?: string | undefined;
8949
+ rotationPolicy?: {
8950
+ enabled: boolean;
8951
+ frequencyDays: number;
8952
+ retainOldVersions: number;
8953
+ autoRotate: boolean;
8954
+ } | undefined;
8955
+ };
8956
+ scope: "record" | "field" | "table" | "database";
8957
+ deterministicEncryption: boolean;
8958
+ searchableEncryption: boolean;
8959
+ } | undefined;
8960
+ readonly columnName?: string | undefined;
8961
+ readonly searchable?: boolean | undefined;
8962
+ readonly unique?: boolean | undefined;
8963
+ readonly maxLength?: number | undefined;
8964
+ readonly minLength?: number | undefined;
8965
+ readonly scale?: number | undefined;
8966
+ readonly reference?: string | undefined;
8967
+ readonly referenceFilters?: string[] | undefined;
8968
+ readonly writeRequiresMasterRead?: boolean | undefined;
8969
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
8970
+ readonly inlineEdit?: boolean | "grid" | "form" | undefined;
8971
+ readonly inlineTitle?: string | undefined;
8972
+ readonly inlineColumns?: any[] | undefined;
8973
+ readonly inlineAmountField?: string | undefined;
8974
+ readonly relatedList?: boolean | undefined;
8975
+ readonly relatedListTitle?: string | undefined;
8976
+ readonly relatedListColumns?: any[] | undefined;
8977
+ readonly expression?: {
8978
+ dialect: "cel" | "js" | "cron" | "template";
8979
+ source?: string | undefined;
8980
+ ast?: unknown;
8981
+ meta?: {
8982
+ rationale?: string | undefined;
8983
+ generatedBy?: string | undefined;
8984
+ } | undefined;
8985
+ } | undefined;
8986
+ readonly summaryOperations?: {
8987
+ object: string;
8988
+ field: string;
8989
+ function: "min" | "max" | "count" | "sum" | "avg";
8990
+ relationshipField?: string | undefined;
8991
+ } | undefined;
8992
+ readonly language?: string | undefined;
8993
+ readonly lineNumbers?: boolean | undefined;
8994
+ readonly maxRating?: number | undefined;
8995
+ readonly allowHalf?: boolean | undefined;
8996
+ readonly displayMap?: boolean | undefined;
8997
+ readonly allowGeocoding?: boolean | undefined;
8998
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
8999
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
9000
+ readonly allowAlpha?: boolean | undefined;
9001
+ readonly presetColors?: string[] | undefined;
9002
+ readonly step?: number | undefined;
9003
+ readonly showValue?: boolean | undefined;
9004
+ readonly marks?: Record<string, string> | undefined;
9005
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
9006
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
9007
+ readonly displayValue?: boolean | undefined;
9008
+ readonly allowScanning?: boolean | undefined;
9009
+ readonly currencyConfig?: {
9010
+ precision: number;
9011
+ currencyMode: "fixed" | "dynamic";
9012
+ defaultCurrency: string;
9013
+ } | undefined;
9014
+ readonly vectorConfig?: {
9015
+ dimensions: number;
9016
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
9017
+ normalized: boolean;
9018
+ indexed: boolean;
9019
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
9020
+ } | undefined;
9021
+ readonly fileAttachmentConfig?: {
9022
+ virusScan: boolean;
9023
+ virusScanOnUpload: boolean;
9024
+ quarantineOnThreat: boolean;
9025
+ allowMultiple: boolean;
9026
+ allowReplace: boolean;
9027
+ allowDelete: boolean;
9028
+ requireUpload: boolean;
9029
+ extractMetadata: boolean;
9030
+ extractText: boolean;
9031
+ versioningEnabled: boolean;
9032
+ publicRead: boolean;
9033
+ presignedUrlExpiry: number;
9034
+ minSize?: number | undefined;
9035
+ maxSize?: number | undefined;
9036
+ allowedTypes?: string[] | undefined;
9037
+ blockedTypes?: string[] | undefined;
9038
+ allowedMimeTypes?: string[] | undefined;
9039
+ blockedMimeTypes?: string[] | undefined;
9040
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
9041
+ storageProvider?: string | undefined;
9042
+ storageBucket?: string | undefined;
9043
+ storagePrefix?: string | undefined;
9044
+ imageValidation?: {
9045
+ generateThumbnails: boolean;
9046
+ preserveMetadata: boolean;
9047
+ autoRotate: boolean;
9048
+ minWidth?: number | undefined;
9049
+ maxWidth?: number | undefined;
9050
+ minHeight?: number | undefined;
9051
+ maxHeight?: number | undefined;
9052
+ aspectRatio?: string | undefined;
9053
+ thumbnailSizes?: {
9054
+ name: string;
9055
+ width: number;
9056
+ height: number;
9057
+ crop: boolean;
9058
+ }[] | undefined;
9059
+ } | undefined;
9060
+ maxVersions?: number | undefined;
9061
+ } | undefined;
9062
+ readonly maskingRule?: {
9063
+ field: string;
9064
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
9065
+ preserveFormat: boolean;
9066
+ preserveLength: boolean;
9067
+ pattern?: string | undefined;
9068
+ roles?: string[] | undefined;
9069
+ exemptRoles?: string[] | undefined;
9070
+ } | undefined;
9071
+ readonly auditTrail?: boolean | undefined;
9072
+ readonly cached?: {
9073
+ enabled: boolean;
9074
+ ttl: number;
9075
+ invalidateOn: string[];
9076
+ } | undefined;
9077
+ readonly dataQuality?: {
9078
+ uniqueness: boolean;
9079
+ completeness: number;
9080
+ accuracy?: {
9081
+ source: string;
9082
+ threshold: number;
9083
+ } | undefined;
9084
+ } | undefined;
9085
+ readonly visibleWhen?: {
9086
+ dialect: "cel" | "js" | "cron" | "template";
9087
+ source?: string | undefined;
9088
+ ast?: unknown;
9089
+ meta?: {
9090
+ rationale?: string | undefined;
9091
+ generatedBy?: string | undefined;
9092
+ } | undefined;
9093
+ } | undefined;
9094
+ readonly readonlyWhen?: {
9095
+ dialect: "cel" | "js" | "cron" | "template";
9096
+ source?: string | undefined;
9097
+ ast?: unknown;
9098
+ meta?: {
9099
+ rationale?: string | undefined;
9100
+ generatedBy?: string | undefined;
9101
+ } | undefined;
9102
+ } | undefined;
9103
+ readonly requiredWhen?: {
9104
+ dialect: "cel" | "js" | "cron" | "template";
9105
+ source?: string | undefined;
9106
+ ast?: unknown;
9107
+ meta?: {
9108
+ rationale?: string | undefined;
9109
+ generatedBy?: string | undefined;
9110
+ } | undefined;
9111
+ } | undefined;
9112
+ readonly conditionalRequired?: {
9113
+ dialect: "cel" | "js" | "cron" | "template";
9114
+ source?: string | undefined;
9115
+ ast?: unknown;
9116
+ meta?: {
9117
+ rationale?: string | undefined;
9118
+ generatedBy?: string | undefined;
9119
+ } | undefined;
9120
+ } | undefined;
9121
+ readonly sortable?: boolean | undefined;
9122
+ readonly inlineHelpText?: string | undefined;
9123
+ readonly trackFeedHistory?: boolean | undefined;
9124
+ readonly caseSensitive?: boolean | undefined;
9125
+ readonly autonumberFormat?: string | undefined;
9126
+ readonly index?: boolean | undefined;
9127
+ readonly type: "text";
9128
+ };
9129
+ readonly created_at: {
9130
+ readonly readonly?: boolean | undefined;
9131
+ readonly format?: string | undefined;
9132
+ readonly options?: {
9133
+ label: string;
9134
+ value: string;
9135
+ color?: string | undefined;
9136
+ default?: boolean | undefined;
9137
+ }[] | undefined;
9138
+ readonly description?: string | undefined;
9139
+ readonly label?: string | undefined;
9140
+ readonly name?: string | undefined;
9141
+ readonly precision?: number | undefined;
9142
+ readonly required?: boolean | undefined;
9143
+ readonly multiple?: boolean | undefined;
9144
+ readonly dependencies?: string[] | undefined;
9145
+ readonly theme?: string | undefined;
9146
+ readonly externalId?: boolean | undefined;
9147
+ readonly defaultValue?: unknown;
9148
+ readonly group?: string | undefined;
9149
+ readonly hidden?: boolean | undefined;
9150
+ readonly system?: boolean | undefined;
9151
+ readonly min?: number | undefined;
9152
+ readonly max?: number | undefined;
9153
+ readonly encryptionConfig?: {
9154
+ enabled: boolean;
9155
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
9156
+ keyManagement: {
9157
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
9158
+ keyId?: string | undefined;
9159
+ rotationPolicy?: {
9160
+ enabled: boolean;
9161
+ frequencyDays: number;
9162
+ retainOldVersions: number;
9163
+ autoRotate: boolean;
9164
+ } | undefined;
9165
+ };
9166
+ scope: "record" | "field" | "table" | "database";
9167
+ deterministicEncryption: boolean;
9168
+ searchableEncryption: boolean;
9169
+ } | undefined;
9170
+ readonly columnName?: string | undefined;
9171
+ readonly searchable?: boolean | undefined;
9172
+ readonly unique?: boolean | undefined;
9173
+ readonly maxLength?: number | undefined;
9174
+ readonly minLength?: number | undefined;
9175
+ readonly scale?: number | undefined;
9176
+ readonly reference?: string | undefined;
9177
+ readonly referenceFilters?: string[] | undefined;
9178
+ readonly writeRequiresMasterRead?: boolean | undefined;
9179
+ readonly deleteBehavior?: "set_null" | "cascade" | "restrict" | undefined;
9180
+ readonly inlineEdit?: boolean | "grid" | "form" | undefined;
9181
+ readonly inlineTitle?: string | undefined;
9182
+ readonly inlineColumns?: any[] | undefined;
9183
+ readonly inlineAmountField?: string | undefined;
9184
+ readonly relatedList?: boolean | undefined;
9185
+ readonly relatedListTitle?: string | undefined;
9186
+ readonly relatedListColumns?: any[] | undefined;
9187
+ readonly expression?: {
9188
+ dialect: "cel" | "js" | "cron" | "template";
9189
+ source?: string | undefined;
9190
+ ast?: unknown;
9191
+ meta?: {
9192
+ rationale?: string | undefined;
9193
+ generatedBy?: string | undefined;
9194
+ } | undefined;
9195
+ } | undefined;
9196
+ readonly summaryOperations?: {
9197
+ object: string;
9198
+ field: string;
9199
+ function: "min" | "max" | "count" | "sum" | "avg";
9200
+ relationshipField?: string | undefined;
9201
+ } | undefined;
9202
+ readonly language?: string | undefined;
9203
+ readonly lineNumbers?: boolean | undefined;
9204
+ readonly maxRating?: number | undefined;
9205
+ readonly allowHalf?: boolean | undefined;
9206
+ readonly displayMap?: boolean | undefined;
9207
+ readonly allowGeocoding?: boolean | undefined;
9208
+ readonly addressFormat?: "us" | "uk" | "international" | undefined;
9209
+ readonly colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
9210
+ readonly allowAlpha?: boolean | undefined;
9211
+ readonly presetColors?: string[] | undefined;
9212
+ readonly step?: number | undefined;
9213
+ readonly showValue?: boolean | undefined;
9214
+ readonly marks?: Record<string, string> | undefined;
9215
+ readonly barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
9216
+ readonly qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
9217
+ readonly displayValue?: boolean | undefined;
9218
+ readonly allowScanning?: boolean | undefined;
9219
+ readonly currencyConfig?: {
9220
+ precision: number;
9221
+ currencyMode: "fixed" | "dynamic";
9222
+ defaultCurrency: string;
9223
+ } | undefined;
9224
+ readonly vectorConfig?: {
9225
+ dimensions: number;
9226
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
9227
+ normalized: boolean;
9228
+ indexed: boolean;
9229
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
9230
+ } | undefined;
9231
+ readonly fileAttachmentConfig?: {
9232
+ virusScan: boolean;
9233
+ virusScanOnUpload: boolean;
9234
+ quarantineOnThreat: boolean;
9235
+ allowMultiple: boolean;
9236
+ allowReplace: boolean;
9237
+ allowDelete: boolean;
9238
+ requireUpload: boolean;
9239
+ extractMetadata: boolean;
9240
+ extractText: boolean;
9241
+ versioningEnabled: boolean;
9242
+ publicRead: boolean;
9243
+ presignedUrlExpiry: number;
9244
+ minSize?: number | undefined;
9245
+ maxSize?: number | undefined;
9246
+ allowedTypes?: string[] | undefined;
9247
+ blockedTypes?: string[] | undefined;
9248
+ allowedMimeTypes?: string[] | undefined;
9249
+ blockedMimeTypes?: string[] | undefined;
9250
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
9251
+ storageProvider?: string | undefined;
9252
+ storageBucket?: string | undefined;
9253
+ storagePrefix?: string | undefined;
9254
+ imageValidation?: {
9255
+ generateThumbnails: boolean;
9256
+ preserveMetadata: boolean;
9257
+ autoRotate: boolean;
9258
+ minWidth?: number | undefined;
9259
+ maxWidth?: number | undefined;
9260
+ minHeight?: number | undefined;
9261
+ maxHeight?: number | undefined;
9262
+ aspectRatio?: string | undefined;
9263
+ thumbnailSizes?: {
9264
+ name: string;
9265
+ width: number;
9266
+ height: number;
9267
+ crop: boolean;
9268
+ }[] | undefined;
9269
+ } | undefined;
9270
+ maxVersions?: number | undefined;
9271
+ } | undefined;
9272
+ readonly maskingRule?: {
9273
+ field: string;
9274
+ strategy: "partial" | "hash" | "redact" | "tokenize" | "randomize" | "nullify" | "substitute";
9275
+ preserveFormat: boolean;
9276
+ preserveLength: boolean;
9277
+ pattern?: string | undefined;
9278
+ roles?: string[] | undefined;
9279
+ exemptRoles?: string[] | undefined;
9280
+ } | undefined;
9281
+ readonly auditTrail?: boolean | undefined;
9282
+ readonly cached?: {
9283
+ enabled: boolean;
9284
+ ttl: number;
9285
+ invalidateOn: string[];
9286
+ } | undefined;
9287
+ readonly dataQuality?: {
9288
+ uniqueness: boolean;
9289
+ completeness: number;
9290
+ accuracy?: {
9291
+ source: string;
9292
+ threshold: number;
9293
+ } | undefined;
9294
+ } | undefined;
9295
+ readonly visibleWhen?: {
9296
+ dialect: "cel" | "js" | "cron" | "template";
9297
+ source?: string | undefined;
9298
+ ast?: unknown;
9299
+ meta?: {
9300
+ rationale?: string | undefined;
9301
+ generatedBy?: string | undefined;
9302
+ } | undefined;
9303
+ } | undefined;
9304
+ readonly readonlyWhen?: {
9305
+ dialect: "cel" | "js" | "cron" | "template";
9306
+ source?: string | undefined;
9307
+ ast?: unknown;
9308
+ meta?: {
9309
+ rationale?: string | undefined;
9310
+ generatedBy?: string | undefined;
9311
+ } | undefined;
9312
+ } | undefined;
9313
+ readonly requiredWhen?: {
9314
+ dialect: "cel" | "js" | "cron" | "template";
9315
+ source?: string | undefined;
9316
+ ast?: unknown;
9317
+ meta?: {
9318
+ rationale?: string | undefined;
9319
+ generatedBy?: string | undefined;
9320
+ } | undefined;
9321
+ } | undefined;
9322
+ readonly conditionalRequired?: {
9323
+ dialect: "cel" | "js" | "cron" | "template";
9324
+ source?: string | undefined;
9325
+ ast?: unknown;
9326
+ meta?: {
9327
+ rationale?: string | undefined;
9328
+ generatedBy?: string | undefined;
9329
+ } | undefined;
9330
+ } | undefined;
9331
+ readonly sortable?: boolean | undefined;
9332
+ readonly inlineHelpText?: string | undefined;
9333
+ readonly trackFeedHistory?: boolean | undefined;
9334
+ readonly caseSensitive?: boolean | undefined;
9335
+ readonly autonumberFormat?: string | undefined;
9336
+ readonly index?: boolean | undefined;
9337
+ readonly type: "datetime";
9338
+ };
9339
+ };
9340
+ readonly indexes: [{
9341
+ readonly fields: ["approver", "organization_id"];
9342
+ }, {
9343
+ readonly fields: ["request_id"];
9344
+ }];
9345
+ }, "fields">;
9346
+
9347
+ /**
9348
+ * Node-era approval runtime (ADR-0019).
9349
+ *
9350
+ * Approval is no longer a standalone engine — it is a **flow node**. A flow's
9351
+ * Approval node opens a request via {@link ApprovalService.openNodeRequest} and
9352
+ * the run suspends; a human decision via {@link ApprovalService.decide}
9353
+ * finalises the request and resumes the owning run down the matching
9354
+ * `approve` / `reject` edge.
9355
+ *
9356
+ * This service owns the durable approval *state* — `sys_approval_request` /
9357
+ * `sys_approval_action`, approver resolution (team / department / role /
9358
+ * manager graph), and the optional status-field mirror — plus the decision
9359
+ * API. It does not author processes, submit, or walk multi-step machinery
9360
+ * anymore; that orchestration lives on the one automation engine.
9361
+ */
9362
+ interface ApprovalEngine {
9363
+ find(object: string, options?: any): Promise<any[]>;
9364
+ insert(object: string, data: any, options?: any): Promise<any>;
9365
+ update(object: string, idOrData: any, dataOrOptions?: any, options?: any): Promise<any>;
9366
+ delete(object: string, options?: any): Promise<any>;
9367
+ }
9368
+ interface ApprovalClock {
9369
+ now(): Date;
9370
+ }
9371
+ /**
9372
+ * Minimal automation surface the service uses to resume a suspended flow run
9373
+ * once a decision finalises a node-driven request. Optional — attached by the
9374
+ * plugin when an automation engine is present (see `approval-node.ts`).
9375
+ */
9376
+ interface ApprovalResumeSurface {
9377
+ resume?(runId: string, signal?: {
9378
+ output?: Record<string, unknown>;
9379
+ branchLabel?: string;
9380
+ }): Promise<unknown>;
9381
+ /** Flow definition lookup, used to derive step-progress display data. */
9382
+ getFlow?(name: string): Promise<any | null>;
9383
+ /**
9384
+ * Terminally cancel a suspended run (ADR-0044). Used when a recall lands
9385
+ * during a revision window — the run is paused at the revise wait node,
9386
+ * which has no reject edge to resume down.
9387
+ */
9388
+ cancelRun?(runId: string, reason?: string): Promise<unknown>;
9389
+ }
9390
+ /**
9391
+ * Optional messaging surface (ADR-0012 `messaging` service). When attached,
9392
+ * thread interactions (reassign / remind / request-info / comment) notify the
9393
+ * affected users; without it they degrade to audit-only.
9394
+ */
9395
+ interface ApprovalMessagingSurface {
9396
+ emit(input: {
9397
+ topic: string;
9398
+ audience: string[];
9399
+ payload?: Record<string, unknown>;
9400
+ severity?: string;
9401
+ dedupKey?: string;
9402
+ source?: {
9403
+ object: string;
9404
+ id: string;
9405
+ };
9406
+ actorId?: string;
9407
+ }): Promise<unknown>;
9408
+ }
9409
+ /** Outcome of redeeming (or peeking) an actionable-link token. */
9410
+ type ActionTokenOutcome = {
9411
+ ok: true;
9412
+ action: 'approve' | 'reject';
9413
+ request: ApprovalRequestRow;
9414
+ approverId: string;
9415
+ } | {
9416
+ ok: false;
9417
+ reason: 'invalid' | 'expired' | 'consumed' | 'not_pending' | 'not_approver';
9418
+ request?: ApprovalRequestRow;
9419
+ };
9420
+ interface ApprovalServiceOptions {
9421
+ engine: ApprovalEngine;
9422
+ clock?: ApprovalClock;
9423
+ logger?: {
9424
+ info?: (msg: any, ...rest: any[]) => void;
9425
+ warn?: (msg: any, ...rest: any[]) => void;
9426
+ error?: (msg: any, ...rest: any[]) => void;
9427
+ debug?: (msg: any, ...rest: any[]) => void;
9428
+ };
9429
+ /**
9430
+ * Optional automation surface used to resume a suspended flow run when a
9431
+ * decision finalises a request. Usually attached after construction via
9432
+ * {@link ApprovalService.attachAutomation} once the automation engine is
9433
+ * available.
9434
+ */
9435
+ automation?: ApprovalResumeSurface;
9436
+ /** Optional messaging service for thread notifications. */
9437
+ messaging?: ApprovalMessagingSurface;
9438
+ /**
9439
+ * Absolute origin prefixed onto actionable links (ADR-0043), e.g.
9440
+ * `https://app.example.com`. Defaults to relative URLs, which work inside
9441
+ * the Console and IM webviews; outbound email needs the absolute form.
9442
+ */
9443
+ publicBaseUrl?: string;
9444
+ }
9445
+ declare class ApprovalService implements IApprovalService {
9446
+ private readonly engine;
9447
+ private readonly clock;
9448
+ private readonly logger?;
9449
+ private automation?;
9450
+ private messaging?;
9451
+ private publicBaseUrl;
9452
+ constructor(opts: ApprovalServiceOptions);
9453
+ /** Attach (or replace) the automation surface used to resume flow runs. */
9454
+ attachAutomation(automation: ApprovalResumeSurface): void;
9455
+ /** Attach (or replace) the messaging surface used for thread notifications. */
9456
+ attachMessaging(messaging: ApprovalMessagingSurface): void;
9457
+ /** Best-effort notification fan-out — failures only log. */
9458
+ private notify;
9459
+ /** Load a request row and assert it is still pending. */
9460
+ private loadPendingRow;
9461
+ /**
9462
+ * Expand the approvers on an Approval node into user IDs by querying the
9463
+ * graph tables for `team:` / `department:` / `role:` / `manager:` approver
9464
+ * types. Falls back to a prefixed literal (`type:value`) when graph lookups
9465
+ * produce nothing — so existing fixtures and flows that rely on substring
9466
+ * matching keep working.
9467
+ *
9468
+ * **Graph semantics:**
9469
+ * - `team` → flat members of `sys_team` (better-auth; no BFS)
9470
+ * - `department` → recursive BFS of `sys_department.parent_department_id`
9471
+ * → members of every descendant via `sys_department_member`
9472
+ * - `role` → users with `sys_member.role = value` in tenant
9473
+ * - `manager` → `sys_user.manager_id` of `record[value] ?? record.owner_id`
9474
+ * - `field` → literal user id stored in `record[value]`
9475
+ * - `user` → literal value
9476
+ */
9477
+ private expandApprovers;
9478
+ /** Flat team — `sys_team` is better-auth's collaboration grouping (no hierarchy). */
9479
+ private expandTeamUsers;
9480
+ /** Recursive department — walks `sys_department.parent_department_id`. */
9481
+ private expandDepartmentUsers;
9482
+ private expandRoleUsers;
9483
+ private lookupManager;
9484
+ /** Mirror a request status onto a business-object field, if configured. */
9485
+ private mirrorStatusField;
9486
+ /**
9487
+ * Open a pending approval request on behalf of a flow's Approval node. The
9488
+ * node config (approvers / behavior / status field) is snapshotted on the row
9489
+ * so a decision can be made without any process to resolve against.
9490
+ */
9491
+ openNodeRequest(input: {
9492
+ object: string;
9493
+ recordId: string;
9494
+ runId: string;
9495
+ nodeId: string;
9496
+ config: ApprovalNodeConfig;
9497
+ flowName?: string;
9498
+ /** Authored flow label, snapshotted for inbox display. */
9499
+ flowLabel?: string;
9500
+ /** Authored node label, snapshotted for inbox display. */
9501
+ nodeLabel?: string;
9502
+ submitterId?: string | null;
9503
+ record?: any;
9504
+ organizationId?: string | null;
9505
+ }, context: SharingExecutionContext): Promise<ApprovalRequestRow>;
9506
+ /**
9507
+ * Record a decision on a node-driven request. Honours the node's `unanimous`
9508
+ * behavior (holds until every approver has approved). When the request
9509
+ * finalizes, returns the suspended run id + node id so the caller (or
9510
+ * {@link ApprovalService.decide}) can resume the flow down the matching
9511
+ * branch.
9512
+ */
9513
+ decideNode(requestId: string, input: {
9514
+ decision: 'approve' | 'reject';
9515
+ actorId: string;
9516
+ comment?: string;
9517
+ }, context: SharingExecutionContext): Promise<{
9518
+ request: ApprovalRequestRow;
9519
+ runId: string | null;
9520
+ nodeId: string | null;
9521
+ finalized: boolean;
9522
+ decision: 'approve' | 'reject';
9523
+ }>;
9524
+ /**
9525
+ * Public contract entrypoint (ADR-0019). Records a decision on a node-driven
9526
+ * request via {@link ApprovalService.decideNode} and, when it finalizes,
9527
+ * resumes the owning flow run down the matching `approve` / `reject` edge.
9528
+ */
9529
+ decide(requestId: string, input: ApprovalDecisionInput, context: SharingExecutionContext): Promise<ApprovalDecisionResult>;
9530
+ /**
9531
+ * Withdraw a pending request (submitter only). Finalises the row as
9532
+ * `recalled`, releases the record lock (keyed on pending status), mirrors
9533
+ * the status field when configured, and resumes the owning flow run down
9534
+ * the `reject` branch with `output.decision = 'recall'` — leaving the run
9535
+ * suspended forever would leak it.
9536
+ *
9537
+ * ADR-0044: also valid on the LATEST `returned` request of its run — the
9538
+ * submitter abandons the revision window instead of resubmitting. The run
9539
+ * is then paused at the revise wait node (no reject edge), so it is
9540
+ * terminally cancelled via {@link ApprovalResumeSurface.cancelRun} rather
9541
+ * than resumed.
9542
+ */
9543
+ recall(requestId: string, input: ApprovalRecallInput, context: SharingExecutionContext): Promise<ApprovalRecallResult>;
9544
+ /**
9545
+ * ADR-0044 send back for revision. Finalises the pending request as
9546
+ * `returned` (a third terminal state — approver-initiated rework, distinct
9547
+ * from submitter-initiated `recalled`) and resumes the owning flow run down
9548
+ * its `revise` edge to a wait point: the record lock (keyed on `pending`)
9549
+ * releases, the submitter reworks the data, then {@link resubmit}s.
9550
+ *
9551
+ * Requires the approval node to declare a `revise` out-edge — validated
9552
+ * BEFORE any mutation, because resuming with an unmatched `branchLabel`
9553
+ * falls back to *all* out-edges. Past the node's `maxRevisions` budget the
9554
+ * request auto-rejects instead (resumes down `reject` with
9555
+ * `output.autoRejected = true`) so instances cannot orbit forever.
9556
+ */
9557
+ sendBack(requestId: string, input: ApprovalSendBackInput, context: SharingExecutionContext): Promise<ApprovalSendBackResult>;
9558
+ /**
9559
+ * ADR-0044 resubmit after rework. Valid on the LATEST `returned` request of
9560
+ * its run, submitter-only. Audits `resubmit` on the returned (round-N)
9561
+ * request and resumes the run from the revise wait node; traversal walks
9562
+ * the declared back-edge into the approval node, whose executor opens the
9563
+ * round-N+1 request — fresh approver slate, record re-locks.
9564
+ */
9565
+ resubmit(requestId: string, input: ApprovalResubmitInput, context: SharingExecutionContext): Promise<ApprovalResubmitResult>;
9566
+ /**
9567
+ * ADR-0044 guard: the flow's approval node must declare a `revise`
9568
+ * out-edge before send-back is allowed — the engine's branch-label fallback
9569
+ * (no matching label ⇒ ALL out-edges) must never be reachable from a user
9570
+ * action.
9571
+ */
9572
+ private assertReviseEdge;
9573
+ /**
9574
+ * ADR-0044 guard: a `returned` request is only actionable (resubmit /
9575
+ * recall) while it is still the newest request on its run — a later round
9576
+ * or a later node's request supersedes it.
9577
+ */
9578
+ private assertLatestForRun;
9579
+ /**
9580
+ * Hand a pending-approver slot to someone else. `from` defaults to the
9581
+ * actor itself; the actor must hold the slot being handed over (or be a
9582
+ * system caller). Audits `reassign` and notifies the new approver.
9583
+ */
9584
+ reassign(requestId: string, input: {
9585
+ actorId: string;
9586
+ to: string;
9587
+ from?: string;
9588
+ comment?: string;
9589
+ }, context: SharingExecutionContext): Promise<{
9590
+ request: ApprovalRequestRow;
9591
+ }>;
9592
+ /**
9593
+ * Submitter nudge — notify every pending approver. Throttled to one
9594
+ * reminder per {@link REMIND_COOLDOWN_MS} per request.
9595
+ */
9596
+ remind(requestId: string, input: {
9597
+ actorId: string;
9598
+ comment?: string;
9599
+ }, context: SharingExecutionContext): Promise<{
9600
+ request: ApprovalRequestRow;
9601
+ notified: number;
9602
+ }>;
9603
+ /** Build the session-less confirm-page URL for a raw token. */
9604
+ actionLinkUrl(rawToken: string): string;
9605
+ /**
9606
+ * Issue one-tap approve/reject tokens for one approver on one pending
9607
+ * request. Raw tokens are returned ONCE; only SHA-256 hashes are stored
9608
+ * (`sys_approval_token`), so a DB leak yields no usable links.
9609
+ */
9610
+ issueActionTokens(requestId: string, approverId: string, opts?: {
9611
+ ttlMs?: number;
9612
+ }): Promise<{
9613
+ approve: string;
9614
+ reject: string;
9615
+ }>;
9616
+ /** Shared validation chain for peek/redeem. Returns the token row when live. */
9617
+ private resolveActionToken;
9618
+ /** GET confirm page: validate WITHOUT consuming — never mutates. */
9619
+ peekActionToken(rawToken: string): Promise<ActionTokenOutcome>;
9620
+ /**
9621
+ * POST redemption: consume the token FIRST (a failed decide still burns
9622
+ * it — replay-safe), then decide as the bound approver.
9623
+ */
9624
+ redeemActionToken(rawToken: string): Promise<ActionTokenOutcome>;
9625
+ /**
9626
+ * Approver asks the submitter for more information. The request stays
9627
+ * pending — a thread interaction, not a flow decision.
9628
+ */
9629
+ requestInfo(requestId: string, input: {
9630
+ actorId: string;
9631
+ comment: string;
9632
+ }, context: SharingExecutionContext): Promise<{
9633
+ request: ApprovalRequestRow;
9634
+ }>;
9635
+ /** Free-form reply on the thread (submitter or any pending approver). */
9636
+ comment(requestId: string, input: {
9637
+ actorId: string;
9638
+ comment: string;
9639
+ }, context: SharingExecutionContext): Promise<{
9640
+ request: ApprovalRequestRow;
9641
+ }>;
9642
+ /**
9643
+ * One escalation sweep: every *pending* request whose node config declares
9644
+ * `escalation.timeoutHours` and whose deadline has passed is escalated
9645
+ * **at most once, ever** — the `escalate` audit row is the idempotency
9646
+ * marker, written before any mutation (audit-first, like reassign). One
9647
+ * bad row never stops the sweep.
9648
+ */
9649
+ runEscalations(): Promise<{
9650
+ scanned: number;
9651
+ escalated: number;
9652
+ }>;
9653
+ /** Execute the configured escalation action for one overdue request. */
9654
+ private escalateRequest;
9655
+ /**
9656
+ * Resolve the schema-declared display field for an object, when the engine
9657
+ * exposes schema metadata (`getSchema`). Falls back to common title-ish
9658
+ * field names so plain `ApprovalEngine` fakes still enrich sensibly.
9659
+ */
9660
+ private resolveDisplayField;
9661
+ private static pickTitle;
9662
+ /**
9663
+ * Batch-resolve `sys_user` display names for identifiers that may be user
9664
+ * ids or emails. Best-effort — failures leave entries unresolved.
9665
+ */
9666
+ private resolveUserNames;
9667
+ /** Lookup-typed fields (key + referenced object) of an object's schema. */
9668
+ private resolveLookupFields;
9669
+ /**
9670
+ * Attach inbox display fields to rows so clients never render a raw
9671
+ * identifier: `record_title`, `submitter_name`, `object_label`,
9672
+ * `pending_approver_names` (user-id approvers), and `payload_display`
9673
+ * (lookup foreign keys in the snapshot → referenced record titles).
9674
+ * Batched: one query per distinct object (target + referenced) plus one
9675
+ * `sys_user` lookup. Best-effort — a deleted record falls back to the
9676
+ * payload snapshot, and any failure leaves the field unset rather than
9677
+ * failing the list.
9678
+ */
9679
+ private enrichRows;
9680
+ /**
9681
+ * Mirror one request's `pending_approvers` CSV into the normalized
9682
+ * `sys_approval_approver` index. Called by every write path that changes
9683
+ * the approver set; an empty `approvers` clears the request's rows (the
9684
+ * request left `pending`). Diff-based so reassign/unanimous churn doesn't
9685
+ * rewrite untouched rows.
9686
+ */
9687
+ private syncApproverIndex;
9688
+ /**
9689
+ * Rebuild the whole `sys_approval_approver` index from the CSV source of
9690
+ * truth. Idempotent; run at plugin start so rows written before the index
9691
+ * existed (or drifted past a crashed sync) become queryable. Cost tracks
9692
+ * the number of *pending* requests, not the request history.
9693
+ */
9694
+ rebuildApproverIndex(): Promise<{
9695
+ requests: number;
9696
+ inserted: number;
9697
+ deleted: number;
9698
+ }>;
9699
+ /** Filter type accepted by {@link listRequests} / {@link countRequests}. */
9700
+ private buildRequestWhere;
9701
+ /** Window the approver-index probe — pending queues live far below this. */
9702
+ private static readonly APPROVER_INDEX_CAP;
9703
+ /**
9704
+ * Resolve an approver filter to matching request ids via the normalized
9705
+ * `sys_approval_approver` index — the indexed replacement for the old
9706
+ * in-memory CSV scan, and what makes approver-filtered pagination correct
9707
+ * past any scan window (issue #1745). A request matches when ANY of the
9708
+ * caller's identities (user id / email / role:<r>) holds a pending slot.
9709
+ * Returns null when the filter is absent (callers skip the id constraint).
9710
+ */
9711
+ private approverRequestIds;
9712
+ listRequests(filter: {
9713
+ object?: string;
9714
+ recordId?: string;
9715
+ status?: ApprovalStatus | ApprovalStatus[];
9716
+ approverId?: string | string[];
9717
+ submitterId?: string;
9718
+ q?: string;
9719
+ limit?: number;
9720
+ offset?: number;
9721
+ } | undefined, context: SharingExecutionContext): Promise<ApprovalRequestRow[]>;
9722
+ countRequests(filter: Parameters<IApprovalService['listRequests']>[0], context: SharingExecutionContext): Promise<number>;
9723
+ getRequest(requestId: string, context: SharingExecutionContext): Promise<ApprovalRequestRow | null>;
9724
+ /**
9725
+ * Derive approval-step progress from the owning flow's graph (single-read
9726
+ * enrichment only — list reads skip it). Walks from the start node
9727
+ * preferring `approve`/`true` edges, so the result is the flow's main
9728
+ * approval trunk; conditional side-steps show as part of the potential
9729
+ * path. Display-only and best-effort.
9730
+ */
9731
+ private attachFlowSteps;
9732
+ listActions(requestId: string, context: SharingExecutionContext): Promise<ApprovalActionRow[]>;
9733
+ }
9734
+
9735
+ interface ApprovalsPluginOptions {
9736
+ /** Disable runtime registration (schemas still register). */
9737
+ disableService?: boolean;
9738
+ /**
9739
+ * Interval between SLA escalation scans (ADR-0042). Defaults to
9740
+ * {@link ESCALATION_SCAN_INTERVAL_MS} (5 min). Only takes effect when a
9741
+ * `job` service is installed; without one, SLA stays display-only.
9742
+ */
9743
+ escalationScanIntervalMs?: number;
9744
+ /**
9745
+ * Absolute origin for actionable links in outbound notifications
9746
+ * (ADR-0043), e.g. `https://app.example.com`. Relative by default.
9747
+ */
9748
+ publicBaseUrl?: string;
7584
9749
  /**
7585
9750
  * Disable the record-lock hook. Schema + service stay intact; only the
7586
9751
  * engine-level lock wiring is suppressed. Useful when a caller wants the
@@ -7605,10 +9770,11 @@ declare class ApprovalsServicePlugin implements Plugin {
7605
9770
  private readonly options;
7606
9771
  private service?;
7607
9772
  private engine?;
9773
+ private escalationJobScheduled;
7608
9774
  constructor(options?: ApprovalsPluginOptions);
7609
9775
  init(ctx: PluginContext): Promise<void>;
7610
9776
  start(ctx: PluginContext): Promise<void>;
7611
- stop(_ctx: PluginContext): Promise<void>;
9777
+ stop(ctx: PluginContext): Promise<void>;
7612
9778
  }
7613
9779
 
7614
9780
  /** Minimal surface of the automation engine this provider depends on. */
@@ -7640,4 +9806,4 @@ interface MinimalLogger {
7640
9806
  */
7641
9807
  declare function registerApprovalNode(automation: ApprovalAutomationSurface, service: ApprovalService, logger?: MinimalLogger): void;
7642
9808
 
7643
- export { type ApprovalAutomationSurface, type ApprovalClock, type ApprovalEngine, type ApprovalResumeSurface, ApprovalService, type ApprovalServiceOptions, type ApprovalsPluginOptions, ApprovalsServicePlugin, SysApprovalAction, SysApprovalRequest, registerApprovalNode };
9809
+ export { type ApprovalAutomationSurface, type ApprovalClock, type ApprovalEngine, type ApprovalResumeSurface, ApprovalService, type ApprovalServiceOptions, type ApprovalsPluginOptions, ApprovalsServicePlugin, SysApprovalAction, SysApprovalApprover, SysApprovalRequest, registerApprovalNode };