@01.software/sdk 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +253 -38
  2. package/dist/analytics/react.cjs.map +1 -1
  3. package/dist/analytics/react.js.map +1 -1
  4. package/dist/analytics.cjs.map +1 -1
  5. package/dist/analytics.js.map +1 -1
  6. package/dist/client.cjs +368 -24
  7. package/dist/client.cjs.map +1 -1
  8. package/dist/client.d.cts +7 -6
  9. package/dist/client.d.ts +7 -6
  10. package/dist/client.js +368 -24
  11. package/dist/client.js.map +1 -1
  12. package/dist/{collection-client-CORhppPb.d.cts → collection-client-CR2B8c1v.d.cts} +7 -3
  13. package/dist/{collection-client-DPGXnhoF.d.ts → collection-client-DkREjhQ9.d.ts} +7 -3
  14. package/dist/{const-DcY2_z9O.d.ts → const-BTvdrXtY.d.cts} +5 -5
  15. package/dist/{const-Brk2Ff0q.d.cts → const-CdqCauHQ.d.ts} +5 -5
  16. package/dist/index-CjA3U6X3.d.cts +186 -0
  17. package/dist/index-DK8_NXkh.d.ts +186 -0
  18. package/dist/index.cjs +1651 -260
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +74 -9
  21. package/dist/index.d.ts +74 -9
  22. package/dist/index.js +1651 -260
  23. package/dist/index.js.map +1 -1
  24. package/dist/{payload-types-DVK1QCeU.d.cts → payload-types-C7tb7Xbs.d.cts} +2115 -1833
  25. package/dist/{payload-types-DVK1QCeU.d.ts → payload-types-C7tb7Xbs.d.ts} +2115 -1833
  26. package/dist/query.cjs +194 -35
  27. package/dist/query.cjs.map +1 -1
  28. package/dist/query.d.cts +45 -18
  29. package/dist/query.d.ts +45 -18
  30. package/dist/query.js +194 -35
  31. package/dist/query.js.map +1 -1
  32. package/dist/realtime.cjs.map +1 -1
  33. package/dist/realtime.d.cts +2 -2
  34. package/dist/realtime.d.ts +2 -2
  35. package/dist/realtime.js.map +1 -1
  36. package/dist/{server-CrsPyqEc.d.cts → server-nXOezi4b.d.cts} +22 -6
  37. package/dist/{server-CrsPyqEc.d.ts → server-nXOezi4b.d.ts} +22 -6
  38. package/dist/server.cjs +474 -36
  39. package/dist/server.cjs.map +1 -1
  40. package/dist/server.d.cts +11 -179
  41. package/dist/server.d.ts +11 -179
  42. package/dist/server.js +474 -36
  43. package/dist/server.js.map +1 -1
  44. package/dist/{types-DUPC7Xn6.d.ts → types-1ylMrCuW.d.ts} +1 -1
  45. package/dist/{types-ByMrR_Z_.d.cts → types-Bx558PU6.d.cts} +1 -1
  46. package/dist/{types-CYMSBkJC.d.ts → types-Byo_Rty4.d.ts} +728 -75
  47. package/dist/{types-CAkWqIr6.d.cts → types-DDhtZI6E.d.cts} +728 -75
  48. package/dist/ui/canvas/server.cjs +231 -38
  49. package/dist/ui/canvas/server.cjs.map +1 -1
  50. package/dist/ui/canvas/server.d.cts +1 -1
  51. package/dist/ui/canvas/server.d.ts +1 -1
  52. package/dist/ui/canvas/server.js +221 -38
  53. package/dist/ui/canvas/server.js.map +1 -1
  54. package/dist/ui/canvas.cjs +320 -257
  55. package/dist/ui/canvas.cjs.map +1 -1
  56. package/dist/ui/canvas.d.cts +5 -19
  57. package/dist/ui/canvas.d.ts +5 -19
  58. package/dist/ui/canvas.js +323 -260
  59. package/dist/ui/canvas.js.map +1 -1
  60. package/dist/ui/form.d.cts +1 -1
  61. package/dist/ui/form.d.ts +1 -1
  62. package/dist/ui/video.d.cts +1 -1
  63. package/dist/ui/video.d.ts +1 -1
  64. package/dist/webhook.cjs +95 -0
  65. package/dist/webhook.cjs.map +1 -1
  66. package/dist/webhook.d.cts +20 -104
  67. package/dist/webhook.d.ts +20 -104
  68. package/dist/webhook.js +95 -0
  69. package/dist/webhook.js.map +1 -1
  70. package/package.json +4 -5
@@ -16,6 +16,7 @@ interface Config {
16
16
  'system-media': SystemMedia;
17
17
  audiences: Audience;
18
18
  'email-logs': EmailLog;
19
+ 'commerce-notification-intents': CommerceNotificationIntent;
19
20
  'api-keys': ApiKey;
20
21
  'personal-access-tokens': PersonalAccessToken;
21
22
  'audit-logs': AuditLog;
@@ -101,6 +102,7 @@ interface Config {
101
102
  'reaction-types': ReactionType;
102
103
  bookmarks: Bookmark;
103
104
  'post-categories': PostCategory;
105
+ 'post-tags': PostTag;
104
106
  reports: Report;
105
107
  'community-bans': CommunityBan;
106
108
  'event-calendars': EventCalendar;
@@ -183,6 +185,7 @@ interface Config {
183
185
  'system-media': SystemMediaSelect<false> | SystemMediaSelect<true>;
184
186
  audiences: AudiencesSelect<false> | AudiencesSelect<true>;
185
187
  'email-logs': EmailLogsSelect<false> | EmailLogsSelect<true>;
188
+ 'commerce-notification-intents': CommerceNotificationIntentsSelect<false> | CommerceNotificationIntentsSelect<true>;
186
189
  'api-keys': ApiKeysSelect<false> | ApiKeysSelect<true>;
187
190
  'personal-access-tokens': PersonalAccessTokensSelect<false> | PersonalAccessTokensSelect<true>;
188
191
  'audit-logs': AuditLogsSelect<false> | AuditLogsSelect<true>;
@@ -268,6 +271,7 @@ interface Config {
268
271
  'reaction-types': ReactionTypesSelect<false> | ReactionTypesSelect<true>;
269
272
  bookmarks: BookmarksSelect<false> | BookmarksSelect<true>;
270
273
  'post-categories': PostCategoriesSelect<false> | PostCategoriesSelect<true>;
274
+ 'post-tags': PostTagsSelect<false> | PostTagsSelect<true>;
271
275
  reports: ReportsSelect<false> | ReportsSelect<true>;
272
276
  'community-bans': CommunityBansSelect<false> | CommunityBansSelect<true>;
273
277
  'event-calendars': EventCalendarsSelect<false> | EventCalendarsSelect<true>;
@@ -539,6 +543,35 @@ interface Tenant {
539
543
  origin: string;
540
544
  id?: string | null;
541
545
  }[] | null;
546
+ /**
547
+ * Commerce customer email notification settings. All v1 events are disabled by default.
548
+ */
549
+ commerceNotifications?: {
550
+ /**
551
+ * Allow customer email sends for this event.
552
+ */
553
+ orderPaid?: boolean | null;
554
+ /**
555
+ * Allow customer email sends for this event.
556
+ */
557
+ orderCanceled?: boolean | null;
558
+ /**
559
+ * Allow customer email sends for this event.
560
+ */
561
+ fulfillmentShipped?: boolean | null;
562
+ /**
563
+ * Allow customer email sends for this event.
564
+ */
565
+ orderDelivered?: boolean | null;
566
+ /**
567
+ * Allow customer email sends for this event.
568
+ */
569
+ returnRequested?: boolean | null;
570
+ /**
571
+ * Allow customer email sends for this event.
572
+ */
573
+ returnCompleted?: boolean | null;
574
+ };
542
575
  /**
543
576
  * Users connected to this tenant
544
577
  */
@@ -683,7 +716,7 @@ interface SystemMedia {
683
716
  interface FieldConfig {
684
717
  id: string;
685
718
  tenant?: (string | null) | Tenant;
686
- collectionSlug: 'products' | 'product-variants' | 'product-options' | 'product-option-values' | 'product-collections' | 'product-categories' | 'product-tags' | 'brands' | 'discounts' | 'shipping-policies' | 'orders' | 'carts' | 'transactions' | 'fulfillments' | 'returns' | 'customers' | 'customer-groups' | 'customer-profiles' | 'customer-profile-lists' | 'article-authors' | 'articles' | 'article-categories' | 'article-tags' | 'documents' | 'document-categories' | 'document-types' | 'playlists' | 'playlist-categories' | 'playlist-tags' | 'tracks' | 'track-categories' | 'track-tags' | 'galleries' | 'gallery-categories' | 'gallery-tags' | 'gallery-items' | 'links' | 'link-categories' | 'link-tags' | 'canvases' | 'canvas-categories' | 'canvas-tags' | 'canvas-node-types' | 'canvas-edge-types' | 'videos' | 'video-categories' | 'video-tags' | 'live-streams' | 'forms' | 'posts' | 'comments' | 'reactions' | 'reaction-types' | 'bookmarks' | 'post-categories' | 'event-calendars' | 'events' | 'event-categories' | 'event-tags' | 'event-occurrences' | 'event-registrations';
719
+ collectionSlug: 'products' | 'product-variants' | 'product-options' | 'product-option-values' | 'product-collections' | 'product-categories' | 'product-tags' | 'brands' | 'discounts' | 'shipping-policies' | 'orders' | 'carts' | 'transactions' | 'fulfillments' | 'returns' | 'customers' | 'customer-groups' | 'customer-profiles' | 'customer-profile-lists' | 'article-authors' | 'articles' | 'article-categories' | 'article-tags' | 'documents' | 'document-categories' | 'document-types' | 'playlists' | 'playlist-categories' | 'playlist-tags' | 'tracks' | 'track-categories' | 'track-tags' | 'galleries' | 'gallery-categories' | 'gallery-tags' | 'gallery-items' | 'links' | 'link-categories' | 'link-tags' | 'canvases' | 'canvas-categories' | 'canvas-tags' | 'canvas-node-types' | 'canvas-edge-types' | 'videos' | 'video-categories' | 'video-tags' | 'live-streams' | 'forms' | 'posts' | 'comments' | 'reactions' | 'reaction-types' | 'bookmarks' | 'post-categories' | 'post-tags' | 'event-calendars' | 'events' | 'event-categories' | 'event-tags' | 'event-occurrences' | 'event-registrations';
687
720
  isHidden?: boolean | null;
688
721
  hiddenFields?: {
689
722
  [k: string]: unknown;
@@ -733,7 +766,7 @@ interface EmailLog {
733
766
  /**
734
767
  * Email purpose and consent category. Used for verification, password reset, marketing, and audit review.
735
768
  */
736
- type: 'usage-alert' | 'verification' | 'password-reset' | 'newsletter' | 'other' | 'oauth-login' | 'account-link';
769
+ type: 'usage-alert' | 'verification' | 'password-reset' | 'newsletter' | 'other' | 'oauth-login' | 'account-link' | 'commerce';
737
770
  status: 'sent' | 'failed';
738
771
  sentAt: string;
739
772
  error?: string | null;
@@ -748,1264 +781,1261 @@ interface EmailLog {
748
781
  * Consent category for compliance audit
749
782
  */
750
783
  recipientConsent?: ('marketing' | 'transactional' | 'service_notice') | null;
751
- updatedAt: string;
752
- createdAt: string;
753
- }
754
- /**
755
- * This interface was referenced by `Config`'s JSON-Schema
756
- * via the `definition` "api-keys".
757
- */
758
- interface ApiKey {
759
- id: string;
760
- tenant: string | Tenant;
761
- name: string;
762
- secretHash: string;
763
- /**
764
- * Key prefix (e.g. sk01_ab12cd3)
765
- */
766
- displayPrefix: string;
767
- /**
768
- * Trailing characters used to identify the key. The raw secret key is not stored or displayed.
769
- */
770
- displaySuffix: string;
771
- /**
772
- * Capability scopes. Default is read+write; webhook dispatch requires webhook, analytics writes require analytics.
773
- */
774
- scopes?: ('read' | 'write' | 'webhook' | 'analytics' | 'super-admin')[] | null;
775
- /**
776
- * User who issued the key. Read-only provenance for issuance audit.
777
- */
778
- createdBy?: (string | null) | User;
779
- /**
780
- * IP address of the key creation request. Privacy-bearing security audit metadata.
781
- */
782
- createdByIp?: string | null;
783
- lastUsedAt?: string | null;
784
784
  /**
785
- * Last IP address that used the key. Privacy-bearing audit value for abuse investigation.
786
- */
787
- lastUsedIp?: string | null;
788
- revokedAt?: string | null;
789
- /**
790
- * User who revoked the key. Read-only provenance for revocation audit.
791
- */
792
- revokedBy?: (string | null) | User;
793
- /**
794
- * Optional expiration. Empty = never expires.
785
+ * Commerce notification send audit metadata. Consent classification remains owned by recipientConsent.
795
786
  */
796
- expiresAt?: string | null;
787
+ commerceNotification?: {
788
+ event?: ('orderPaid' | 'orderCanceled' | 'fulfillmentShipped' | 'orderDelivered' | 'returnRequested' | 'returnCompleted') | null;
789
+ intent?: (string | null) | CommerceNotificationIntent;
790
+ dedupeKey?: string | null;
791
+ order?: (string | null) | Order;
792
+ fulfillment?: (string | null) | Fulfillment;
793
+ return?: (string | null) | Return;
794
+ customer?: (string | null) | Customer;
795
+ };
797
796
  updatedAt: string;
798
797
  createdAt: string;
799
- deletedAt?: string | null;
800
798
  }
801
799
  /**
802
800
  * This interface was referenced by `Config`'s JSON-Schema
803
- * via the `definition` "personal-access-tokens".
801
+ * via the `definition` "commerce-notification-intents".
804
802
  */
805
- interface PersonalAccessToken {
803
+ interface CommerceNotificationIntent {
806
804
  id: string;
807
- user: string | User;
808
- /**
809
- * e.g. "CLI: MacBook Pro (darwin)", "GitHub Actions"
810
- */
811
- name: string;
812
- secretHash: string;
813
- /**
814
- * PAT prefix. Display-only token type marker, not the raw token.
815
- */
816
- displayPrefix: string;
817
- /**
818
- * Trailing characters used to identify the PAT. The raw token is not shown again.
819
- */
820
- displaySuffix: string;
805
+ tenant?: (string | null) | Tenant;
821
806
  /**
822
- * Default tenant ID for CLI operations. Set via `01 tenant use <name>`.
807
+ * Stable key that prevents duplicate notification intents within a tenant.
823
808
  */
824
- defaultTenant?: string | null;
809
+ dedupeKey: string;
810
+ event: 'orderPaid' | 'orderCanceled' | 'fulfillmentShipped' | 'orderDelivered' | 'returnRequested' | 'returnCompleted';
811
+ status: 'queued' | 'processing' | 'sent' | 'failed' | 'canceled';
825
812
  /**
826
- * IP address of the PAT creation request. Privacy-bearing security audit metadata.
813
+ * Customer email address targeted by this notification.
827
814
  */
828
- createdByIp?: string | null;
829
- lastUsedAt?: string | null;
815
+ recipientEmail: string;
830
816
  /**
831
- * Last IP address that used the PAT. Privacy-bearing audit value for abuse investigation.
817
+ * Locale hint for template rendering.
832
818
  */
833
- lastUsedIp?: string | null;
834
- revokedAt?: string | null;
819
+ locale?: string | null;
835
820
  /**
836
- * User who revoked the PAT. Read-only provenance for revocation audit.
821
+ * Secret-free event snapshot for processor template rendering.
837
822
  */
838
- revokedBy?: (string | null) | User;
823
+ payload?: {
824
+ [k: string]: unknown;
825
+ } | unknown[] | string | number | boolean | null;
826
+ order?: (string | null) | Order;
827
+ fulfillment?: (string | null) | Fulfillment;
828
+ return?: (string | null) | Return;
829
+ customer?: (string | null) | Customer;
839
830
  /**
840
- * PATs expire after 90 days by default.
831
+ * Email audit log produced from this intent.
841
832
  */
842
- expiresAt?: string | null;
833
+ emailLog?: (string | null) | EmailLog;
834
+ attempts: number;
835
+ nextAttemptAt?: string | null;
836
+ lockedAt?: string | null;
837
+ processedAt?: string | null;
838
+ lastError?: string | null;
843
839
  updatedAt: string;
844
840
  createdAt: string;
845
- deletedAt?: string | null;
846
841
  }
847
842
  /**
848
843
  * This interface was referenced by `Config`'s JSON-Schema
849
- * via the `definition` "audit-logs".
844
+ * via the `definition` "orders".
850
845
  */
851
- interface AuditLog {
846
+ interface Order {
852
847
  id: string;
853
848
  tenant?: (string | null) | Tenant;
849
+ orderNumber: string;
850
+ cartToken?: string | null;
851
+ status: 'pending' | 'paid' | 'failed' | 'canceled' | 'refunded' | 'preparing' | 'shipped' | 'delivered' | 'confirmed' | 'return_requested' | 'return_processing' | 'returned';
852
+ totalAmount?: number | null;
853
+ discountCode?: string | null;
854
+ discountAmount?: number | null;
854
855
  /**
855
- * Event type
856
+ * Cumulative refunded amount
856
857
  */
857
- eventType: string;
858
+ refundedAmount?: number | null;
858
859
  /**
859
- * Actor ID. May refer to a user or service, and can be empty for system actions.
860
+ * Shipping amount at time of order
860
861
  */
861
- actorId?: string | null;
862
+ shippingAmount?: number | null;
862
863
  /**
863
- * Detailed audit event payload. May contain sensitive security, billing, or provider context.
864
+ * Item subtotal (excl. shipping & discount)
864
865
  */
865
- payload?: {
866
- [k: string]: unknown;
867
- } | unknown[] | string | number | boolean | null;
868
- updatedAt: string;
869
- createdAt: string;
870
- }
871
- /**
872
- * This interface was referenced by `Config`'s JSON-Schema
873
- * via the `definition` "webhook-events".
874
- */
875
- interface WebhookEvent {
876
- id: string;
877
- tenant?: (string | null) | Tenant;
866
+ subtotalAmount?: number | null;
867
+ taxAmount?: number | null;
868
+ source?: ('web' | 'app' | 'manual') | null;
869
+ currency?: string | null;
878
870
  /**
879
- * Provider
871
+ * Internal admin notes (not visible to customers)
880
872
  */
881
- provider: string;
873
+ adminNotes?: string | null;
874
+ cancelReason?: string | null;
875
+ canceledAt?: string | null;
876
+ completedAt?: string | null;
882
877
  /**
883
- * Provider-supplied event ID. Used with provider as the idempotency key for duplicate prevention.
878
+ * Note left by customer at checkout
884
879
  */
885
- eventId: string;
886
- receivedAt?: string | null;
880
+ customerNote?: string | null;
881
+ customer?: (string | null) | Customer;
887
882
  /**
888
- * Raw provider event body. May contain sensitive security or payment context.
883
+ * Customer info at the time of order
889
884
  */
890
- payload?: {
885
+ customerSnapshot?: {
886
+ name?: string | null;
887
+ email?: string | null;
888
+ phone?: string | null;
889
+ };
890
+ shippingAddress?: {
891
+ recipientName?: string | null;
892
+ phone?: string | null;
893
+ postalCode?: string | null;
894
+ address?: string | null;
895
+ detailAddress?: string | null;
896
+ deliveryMessage?: string | null;
897
+ };
898
+ billingAddress?: {
899
+ recipientName?: string | null;
900
+ businessRegistrationNumber?: string | null;
901
+ email?: string | null;
902
+ phone?: string | null;
903
+ address?: string | null;
904
+ };
905
+ items?: {
906
+ docs?: (string | OrderItem)[];
907
+ hasNextPage?: boolean;
908
+ totalDocs?: number;
909
+ };
910
+ transactions?: {
911
+ docs?: (string | Transaction)[];
912
+ hasNextPage?: boolean;
913
+ totalDocs?: number;
914
+ };
915
+ fulfillments?: {
916
+ docs?: (string | Fulfillment)[];
917
+ hasNextPage?: boolean;
918
+ totalDocs?: number;
919
+ };
920
+ returns?: {
921
+ docs?: (string | Return)[];
922
+ hasNextPage?: boolean;
923
+ totalDocs?: number;
924
+ };
925
+ metadata?: {
891
926
  [k: string]: unknown;
892
927
  } | unknown[] | string | number | boolean | null;
928
+ nextRefundSeq?: number | null;
929
+ nextCaptureSeq?: number | null;
930
+ nextVoidSeq?: number | null;
893
931
  updatedAt: string;
894
932
  createdAt: string;
933
+ deletedAt?: string | null;
895
934
  }
896
935
  /**
897
936
  * This interface was referenced by `Config`'s JSON-Schema
898
- * via the `definition` "webhook-deliveries".
937
+ * via the `definition` "customers".
899
938
  */
900
- interface WebhookDelivery {
939
+ interface Customer {
901
940
  id: string;
941
+ _customers_customers_order?: string | null;
942
+ _order?: string | null;
902
943
  tenant?: (string | null) | Tenant;
944
+ name: string;
945
+ email?: string | null;
946
+ phone?: string | null;
947
+ groups?: (string | CustomerGroup)[] | null;
903
948
  /**
904
- * Active webhook endpoint used for this delivery attempt.
949
+ * Internal notes (not visible to customers)
905
950
  */
906
- webhookId?: (string | null) | Webhook;
951
+ note?: string | null;
952
+ birthDate?: string | null;
953
+ gender?: ('male' | 'female' | 'other' | 'prefer_not_to_say') | null;
954
+ isGuest?: boolean | null;
907
955
  /**
908
- * Value sent to receivers as x-webhook-delivery-id.
956
+ * Authentication provider used at signup. Immutable account provenance after creation.
909
957
  */
910
- deliveryId?: string | null;
911
- attempt: number;
958
+ authProvider?: ('local' | 'google' | 'apple' | 'kakao' | 'naver') | null;
912
959
  /**
913
- * Webhook delivery state. Updated by dispatcher and retry handling paths.
960
+ * External provider user ID. Paired with authProvider to identify the linked account and not edited after creation.
914
961
  */
915
- status: 'queued' | 'success' | 'failed' | 'dead';
962
+ providerUserId?: string | null;
963
+ lastLoginAt?: string | null;
916
964
  /**
917
- * Destination host with query string removed. Full URLs are not stored.
965
+ * Last password change timestamp (used for JWT revocation)
918
966
  */
919
- endpointHost?: string | null;
967
+ passwordChangedAt?: string | null;
968
+ orders?: {
969
+ docs?: (string | Order)[];
970
+ hasNextPage?: boolean;
971
+ totalDocs?: number;
972
+ };
973
+ addresses?: {
974
+ docs?: (string | CustomerAddress)[];
975
+ hasNextPage?: boolean;
976
+ totalDocs?: number;
977
+ };
978
+ defaultShippingAddress?: (string | null) | CustomerAddress;
979
+ defaultBillingAddress?: (string | null) | CustomerAddress;
920
980
  /**
921
- * HMAC hash of the endpoint URL with query string removed.
981
+ * Read-only counter maintained by order hooks for this customer's completed orders.
922
982
  */
923
- endpointUrlHash?: string | null;
983
+ totalOrderCount?: number | null;
984
+ lifetimeValue?: number | null;
985
+ firstOrderAt?: string | null;
986
+ lastOrderAt?: string | null;
987
+ profile?: {
988
+ docs?: (string | CustomerProfile)[];
989
+ hasNextPage?: boolean;
990
+ totalDocs?: number;
991
+ };
924
992
  /**
925
- * Collection that produced this delivery attempt.
993
+ * Read-only counter maintained by hooks for community posts authored by this customer.
926
994
  */
927
- collection?: string | null;
995
+ postCount?: number | null;
928
996
  /**
929
- * Operation that produced this delivery attempt.
997
+ * Read-only counter maintained by hooks for community comments authored by this customer.
930
998
  */
931
- operation?: string | null;
999
+ commentCount?: number | null;
932
1000
  /**
933
- * Path that produced the delivery attempt.
1001
+ * Read-only counter maintained by hooks for community reactions made by this customer.
934
1002
  */
935
- source?: ('registry' | 'retry_queue' | 'dlq_retry' | 'password_reset') | null;
1003
+ reactionCount?: number | null;
936
1004
  /**
937
- * HTTP status returned by the receiver.
1005
+ * Marks a minor customer. When enabled, guardian consent fields are managed as compliance evidence.
938
1006
  */
939
- statusCode?: number | null;
1007
+ isMinor?: boolean | null;
1008
+ marketingConsent?: {
1009
+ email?: {
1010
+ isConsented?: boolean | null;
1011
+ consentedAt?: string | null;
1012
+ expiresAt?: string | null;
1013
+ unsubscribedAt?: string | null;
1014
+ };
1015
+ sms?: {
1016
+ isConsented?: boolean | null;
1017
+ consentedAt?: string | null;
1018
+ expiresAt?: string | null;
1019
+ unsubscribedAt?: string | null;
1020
+ };
1021
+ push?: {
1022
+ isConsented?: boolean | null;
1023
+ consentedAt?: string | null;
1024
+ expiresAt?: string | null;
1025
+ unsubscribedAt?: string | null;
1026
+ };
1027
+ /**
1028
+ * Channel through which consent was obtained (e.g. signup, checkout, import)
1029
+ */
1030
+ consentSource?: string | null;
1031
+ };
940
1032
  /**
941
- * Delivery failure kind. Sensitive request body or headers are not stored.
1033
+ * Guardian consent evidence for a minor customer. May contain guardian PII.
942
1034
  */
943
- errorKind?: string | null;
1035
+ guardianConsent?: {
1036
+ /**
1037
+ * Whether guardian consent has been collected. Internal compliance marker for minor-customer handling.
1038
+ */
1039
+ hasGuardianConsent?: boolean | null;
1040
+ /**
1041
+ * Guardian name. Treat as guardian PII.
1042
+ */
1043
+ guardianName?: string | null;
1044
+ /**
1045
+ * Guardian phone number. Treat as guardian PII.
1046
+ */
1047
+ guardianPhone?: string | null;
1048
+ /**
1049
+ * Timestamp when guardian consent was recorded. Read-only audit evidence.
1050
+ */
1051
+ guardianConsentedAt?: string | null;
1052
+ };
1053
+ acceptsTos?: boolean | null;
1054
+ tosVersion?: string | null;
944
1055
  /**
945
- * Truncated error message. Sensitive request body or headers are not stored.
1056
+ * Withdrawal reason (internal)
946
1057
  */
947
- errorMessage?: string | null;
1058
+ withdrawReason?: string | null;
1059
+ withdrawnAt?: string | null;
948
1060
  /**
949
- * Delivery attempt duration in milliseconds.
1061
+ * Legal retention deadline. Retention cleanup or manual hard-delete paths may purge after this date.
950
1062
  */
951
- durationMs?: number | null;
1063
+ retainUntil?: string | null;
1064
+ anonymizedAt?: string | null;
1065
+ hashedPassword?: string | null;
1066
+ salt?: string | null;
1067
+ resetPasswordToken?: string | null;
1068
+ resetPasswordExpiresAt?: string | null;
1069
+ loginAttemptCount?: number | null;
1070
+ lockedUntil?: string | null;
952
1071
  /**
953
- * Next scheduled retry time for a failed delivery.
1072
+ * Account suspension flag. Used with password/JWT revocation paths to block sessions.
954
1073
  */
955
- nextRetryAt?: string | null;
1074
+ isSuspended?: boolean | null;
1075
+ metadata?: {
1076
+ [k: string]: unknown;
1077
+ } | unknown[] | string | number | boolean | null;
1078
+ updatedAt: string;
1079
+ createdAt: string;
1080
+ deletedAt?: string | null;
1081
+ collection: 'customers';
1082
+ }
1083
+ /**
1084
+ * This interface was referenced by `Config`'s JSON-Schema
1085
+ * via the `definition` "customer-groups".
1086
+ */
1087
+ interface CustomerGroup {
1088
+ id: string;
1089
+ _order?: string | null;
1090
+ tenant?: (string | null) | Tenant;
1091
+ title?: string | null;
956
1092
  /**
957
- * Marks attempts produced by Redis retry or DLQ replay paths.
1093
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
958
1094
  */
959
- redelivery?: boolean | null;
1095
+ generateSlug?: boolean | null;
1096
+ slug?: string | null;
960
1097
  /**
961
- * Timestamp when the webhook request was dispatched to the endpoint.
1098
+ * Short summary for listing/cards
962
1099
  */
963
- dispatchedAt?: string | null;
1100
+ description?: string | null;
1101
+ /**
1102
+ * Optional #RRGGBB display color for Admin surfaces.
1103
+ */
1104
+ color?: string | null;
1105
+ image?: (string | null) | Image;
1106
+ isActive?: boolean | null;
1107
+ /**
1108
+ * Show this group as a customer-facing membership badge. The group collection itself remains private.
1109
+ */
1110
+ customerVisible?: boolean | null;
1111
+ /**
1112
+ * Customer-facing label. Falls back to title when empty.
1113
+ */
1114
+ publicTitle?: string | null;
1115
+ publicDescription?: string | null;
1116
+ publicBenefits?: {
1117
+ title?: string | null;
1118
+ description?: string | null;
1119
+ id?: string | null;
1120
+ }[] | null;
1121
+ /**
1122
+ * Customer-facing badge color. Example: #2563eb
1123
+ */
1124
+ badgeColor?: string | null;
1125
+ badgeImage?: (string | null) | Image;
1126
+ /**
1127
+ * Customer membership display order. Lower values appear first.
1128
+ */
1129
+ displayOrder?: number | null;
1130
+ metadata?: {
1131
+ [k: string]: unknown;
1132
+ } | unknown[] | string | number | boolean | null;
1133
+ customers?: {
1134
+ docs?: (string | Customer)[];
1135
+ hasNextPage?: boolean;
1136
+ totalDocs?: number;
1137
+ };
964
1138
  updatedAt: string;
965
1139
  createdAt: string;
1140
+ deletedAt?: string | null;
966
1141
  }
967
1142
  /**
968
1143
  * This interface was referenced by `Config`'s JSON-Schema
969
- * via the `definition` "webhooks".
1144
+ * via the `definition` "customer-addresses".
970
1145
  */
971
- interface Webhook {
1146
+ interface CustomerAddress {
972
1147
  id: string;
973
1148
  tenant?: (string | null) | Tenant;
1149
+ customer: string | Customer;
1150
+ label?: string | null;
1151
+ recipientName?: string | null;
1152
+ phone?: string | null;
1153
+ postalCode?: string | null;
974
1154
  /**
975
- * Webhook name
1155
+ * Road-name address (returned by Daum/Naver postal code pickers)
976
1156
  */
977
- name: string;
1157
+ address1?: string | null;
978
1158
  /**
979
- * Webhook endpoint HTTPS URL. Treat this endpoint as a recipient of sensitive workspace events.
1159
+ * Detail address (unit / floor / building name)
980
1160
  */
981
- url: string;
1161
+ address2?: string | null;
982
1162
  /**
983
- * HMAC signing secret (immutable once set)
1163
+ * Jibun lot-based address. Stored alongside the road-name `address1` so we can fall back when 도로명 is missing or for delivery providers that require 지번.
984
1164
  */
985
- secret: string;
1165
+ jibunAddress?: string | null;
986
1166
  /**
987
- * Collections to subscribe to. Leave empty to receive every supported collection event.
1167
+ * City (KR: 시/군 — e.g. "Seoul", "Busan"; non-KR: city/town).
988
1168
  */
989
- subscriptions?: {
990
- /**
991
- * Receives create/update events for this collection.
992
- */
993
- collection: 'tenant-metadata' | 'tenant-logos' | 'images' | 'products' | 'product-variants' | 'product-options' | 'product-option-values' | 'product-categories' | 'product-tags' | 'product-collections' | 'brands' | 'brand-logos' | 'orders' | 'order-items' | 'transactions' | 'fulfillments' | 'fulfillment-items' | 'returns' | 'return-items' | 'carts' | 'cart-items' | 'discounts' | 'shipping-policies' | 'shipping-zones' | 'customers' | 'customer-profiles' | 'customer-addresses' | 'playlists' | 'playlist-categories' | 'playlist-tags' | 'tracks' | 'track-categories' | 'track-tags' | 'galleries' | 'gallery-items' | 'gallery-categories' | 'gallery-tags' | 'links' | 'link-categories' | 'link-tags' | 'forms' | 'form-submissions' | 'articles' | 'article-authors' | 'article-categories' | 'article-tags' | 'documents' | 'document-categories' | 'document-types' | 'canvases' | 'canvas-node-types' | 'canvas-edge-types' | 'canvas-categories' | 'canvas-tags' | 'canvas-nodes' | 'canvas-edges' | 'videos' | 'video-categories' | 'video-tags' | 'live-streams' | 'posts' | 'comments' | 'reactions' | 'reaction-types' | 'bookmarks' | 'post-categories' | 'customer-profile-lists' | 'event-calendars' | 'events' | 'event-categories' | 'event-occurrences' | 'event-tags';
994
- id?: string | null;
995
- }[] | null;
996
- isActive?: boolean | null;
997
- lastDispatchedAt?: string | null;
1169
+ city?: string | null;
1170
+ /**
1171
+ * Administrative area (KR: 시/도 — usually folded into `city`; non-KR: state / province / region).
1172
+ */
1173
+ administrativeArea?: string | null;
1174
+ /**
1175
+ * Which address form to print on the shipping label (default: road).
1176
+ */
1177
+ addressType?: ('road' | 'jibun') | null;
1178
+ /**
1179
+ * ISO 3166-1 alpha-2 country code
1180
+ */
1181
+ country?: string | null;
1182
+ isDefault?: boolean | null;
1183
+ /**
1184
+ * Delivery request preset. Pick "Other" to switch to a free-form deliveryNote.
1185
+ */
1186
+ deliveryRequest?: ('security_office' | 'handoff_in_person' | 'call_before' | 'leave_at_door' | 'other') | null;
1187
+ /**
1188
+ * Free-form delivery note. Prefer the deliveryRequest preset when one of the choices fits; reserve this for actually-custom instructions.
1189
+ */
1190
+ deliveryNote?: string | null;
998
1191
  updatedAt: string;
999
1192
  createdAt: string;
1000
1193
  deletedAt?: string | null;
1001
1194
  }
1002
1195
  /**
1003
1196
  * This interface was referenced by `Config`'s JSON-Schema
1004
- * via the `definition` "tenant-metadata".
1197
+ * via the `definition` "customer-profiles".
1005
1198
  */
1006
- interface TenantMetadatum {
1199
+ interface CustomerProfile {
1007
1200
  id: string;
1008
1201
  tenant?: (string | null) | Tenant;
1009
- siteInfo?: {
1010
- /**
1011
- * Site title (used in browser tab and SEO)
1012
- */
1013
- title?: string | null;
1014
- /**
1015
- * Site description (used for SEO and social media)
1016
- */
1017
- description?: string | null;
1018
- /**
1019
- * Comma-separated keywords for SEO
1020
- */
1021
- keywords?: string | null;
1022
- /**
1023
- * Site author or company name
1024
- */
1025
- author?: string | null;
1026
- /**
1027
- * Full site URL (e.g., https://example.com)
1028
- */
1029
- url?: string | null;
1030
- };
1202
+ customer: string | Customer;
1031
1203
  /**
1032
- * Required by Korean e-commerce law
1204
+ * Public username shown like @01works. Store 3-30 characters without @, using lowercase ASCII letters, numbers, hyphens, or underscores, and keep it unique within the tenant.
1033
1205
  */
1034
- businessInfo?: {
1035
- businessRegistrationNumber?: string | null;
1036
- businessName?: string | null;
1037
- ceoName?: string | null;
1038
- businessAddress?: string | null;
1039
- businessEmail?: string | null;
1040
- onlineSalesRegistrationNumber?: string | null;
1041
- };
1042
- branding?: {
1043
- /**
1044
- * Primary logo
1045
- */
1046
- logo?: (string | null) | TenantLogo;
1047
- /**
1048
- * Logo for dark mode (optional)
1049
- */
1050
- logoDark?: (string | null) | TenantLogo;
1051
- /**
1052
- * Logo mark / Icon (optional)
1053
- */
1054
- logomark?: (string | null) | TenantLogo;
1055
- /**
1056
- * Favicon (will be resized automatically)
1057
- */
1058
- favicon?: (string | null) | TenantLogo;
1059
- /**
1060
- * Theme color for mobile browsers (hex color)
1061
- */
1062
- themeColor?: string | null;
1063
- };
1064
- seo?: {
1065
- /**
1066
- * Robots meta tag (e.g., "index, follow" or "noindex, nofollow")
1067
- */
1068
- robots?: string | null;
1069
- /**
1070
- * Google Site Verification code
1071
- */
1072
- googleSiteVerification?: string | null;
1073
- /**
1074
- * Bing Site Verification code
1075
- */
1076
- bingSiteVerification?: string | null;
1077
- /**
1078
- * Naver Site Verification code
1079
- */
1080
- naverSiteVerification?: string | null;
1081
- /**
1082
- * Canonical URL (if different from site URL)
1083
- */
1084
- canonicalUrl?: string | null;
1085
- };
1086
- analytics?: {
1087
- /**
1088
- * Google Analytics ID (e.g., G-XXXXXXXXXX)
1089
- */
1090
- googleAnalyticsId?: string | null;
1091
- /**
1092
- * Google Tag Manager ID (e.g., GTM-XXXXXXX)
1093
- */
1094
- googleTagManagerId?: string | null;
1095
- /**
1096
- * Facebook Pixel ID
1097
- */
1098
- facebookPixelId?: string | null;
1099
- /**
1100
- * LinkedIn Partner ID
1101
- */
1102
- linkedInPartnerId?: string | null;
1103
- };
1104
- openGraph?: {
1105
- /**
1106
- * Open Graph title (falls back to site title)
1107
- */
1108
- ogTitle?: string | null;
1109
- /**
1110
- * Open Graph description (falls back to site description)
1111
- */
1112
- ogDescription?: string | null;
1113
- /**
1114
- * Open Graph image (1200x630 recommended)
1115
- */
1116
- ogImage?: (string | null) | Image;
1117
- /**
1118
- * Open Graph type
1119
- */
1120
- ogType?: ('website' | 'article' | 'product' | 'profile') | null;
1121
- /**
1122
- * Open Graph locale (e.g., ko_KR, en_US)
1123
- */
1124
- ogLocale?: string | null;
1125
- };
1126
- twitter?: {
1127
- /**
1128
- * Twitter card type
1129
- */
1130
- twitterCard?: ('summary' | 'summary_large_image' | 'app' | 'player') | null;
1131
- /**
1132
- * Twitter username for the site (e.g., @yoursite)
1133
- */
1134
- twitterSite?: string | null;
1135
- /**
1136
- * Twitter username for the content creator (e.g., @author)
1137
- */
1138
- twitterCreator?: string | null;
1139
- /**
1140
- * Twitter title (falls back to OG title or site title)
1141
- */
1142
- twitterTitle?: string | null;
1143
- /**
1144
- * Twitter description (falls back to OG or site description)
1145
- */
1146
- twitterDescription?: string | null;
1147
- /**
1148
- * Twitter card image (falls back to OG image)
1149
- */
1150
- twitterImage?: (string | null) | Image;
1151
- };
1152
- pwa?: {
1153
- /**
1154
- * Short name for PWA (12 characters max)
1155
- */
1156
- shortName?: string | null;
1157
- /**
1158
- * Background color for PWA splash screen
1159
- */
1160
- backgroundColor?: string | null;
1161
- /**
1162
- * PWA display mode
1163
- */
1164
- display?: ('fullscreen' | 'standalone' | 'minimal-ui' | 'browser') | null;
1165
- };
1166
- updatedAt: string;
1167
- createdAt: string;
1168
- deletedAt?: string | null;
1206
+ handle?: string | null;
1207
+ displayName?: string | null;
1208
+ avatar?: (string | null) | Image;
1209
+ bio?: string | null;
1210
+ bioRichText?: {
1211
+ root: {
1212
+ type: string;
1213
+ children: {
1214
+ type: any;
1215
+ version: number;
1216
+ [k: string]: unknown;
1217
+ }[];
1218
+ direction: ('ltr' | 'rtl') | null;
1219
+ format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
1220
+ indent: number;
1221
+ version: number;
1222
+ };
1223
+ [k: string]: unknown;
1224
+ } | null;
1225
+ joinedAt?: string | null;
1226
+ isPublic?: boolean | null;
1227
+ anonymizedAt?: string | null;
1228
+ metadata?: {
1229
+ [k: string]: unknown;
1230
+ } | unknown[] | string | number | boolean | null;
1169
1231
  }
1170
1232
  /**
1171
1233
  * This interface was referenced by `Config`'s JSON-Schema
1172
- * via the `definition` "tenant-logos".
1234
+ * via the `definition` "order-items".
1173
1235
  */
1174
- interface TenantLogo {
1236
+ interface OrderItem {
1175
1237
  id: string;
1176
1238
  tenant?: (string | null) | Tenant;
1239
+ order: string | Order;
1177
1240
  /**
1178
- * Describe the image. Used for users who cannot see it, screen readers, and search/share previews.
1241
+ * Quantity snapshot at order time. Used for payment and inventory calculations and not edited directly.
1179
1242
  */
1180
- alt?: string | null;
1243
+ product: string | Product;
1244
+ variant?: (string | null) | ProductVariant;
1245
+ quantity: number;
1181
1246
  /**
1182
- * Low quality image placeholder
1247
+ * Unit-price snapshot at order time. Later product price changes do not rewrite it.
1183
1248
  */
1184
- lqip?: string | null;
1185
- palette?: {
1186
- vibrant?: string | null;
1187
- muted?: string | null;
1188
- darkVibrant?: string | null;
1189
- darkMuted?: string | null;
1190
- lightVibrant?: string | null;
1191
- lightMuted?: string | null;
1192
- };
1193
- prefix?: string | null;
1194
- updatedAt: string;
1195
- createdAt: string;
1196
- deletedAt?: string | null;
1197
- url?: string | null;
1198
- thumbnailURL?: string | null;
1199
- filename?: string | null;
1200
- mimeType?: string | null;
1201
- filesize?: number | null;
1202
- width?: number | null;
1203
- height?: number | null;
1204
- focalX?: number | null;
1205
- focalY?: number | null;
1206
- sizes?: {
1207
- '16'?: {
1208
- url?: string | null;
1209
- width?: number | null;
1210
- height?: number | null;
1211
- mimeType?: string | null;
1212
- filesize?: number | null;
1213
- filename?: string | null;
1214
- };
1215
- '32'?: {
1216
- url?: string | null;
1217
- width?: number | null;
1218
- height?: number | null;
1219
- mimeType?: string | null;
1220
- filesize?: number | null;
1221
- filename?: string | null;
1222
- };
1223
- '64'?: {
1224
- url?: string | null;
1225
- width?: number | null;
1226
- height?: number | null;
1227
- mimeType?: string | null;
1228
- filesize?: number | null;
1229
- filename?: string | null;
1230
- };
1231
- '128'?: {
1232
- url?: string | null;
1233
- width?: number | null;
1234
- height?: number | null;
1235
- mimeType?: string | null;
1236
- filesize?: number | null;
1237
- filename?: string | null;
1238
- };
1239
- '180'?: {
1240
- url?: string | null;
1241
- width?: number | null;
1242
- height?: number | null;
1243
- mimeType?: string | null;
1244
- filesize?: number | null;
1245
- filename?: string | null;
1246
- };
1247
- '192'?: {
1248
- url?: string | null;
1249
- width?: number | null;
1250
- height?: number | null;
1251
- mimeType?: string | null;
1252
- filesize?: number | null;
1253
- filename?: string | null;
1254
- };
1255
- '512'?: {
1256
- url?: string | null;
1257
- width?: number | null;
1258
- height?: number | null;
1259
- mimeType?: string | null;
1260
- filesize?: number | null;
1261
- filename?: string | null;
1262
- };
1263
- };
1264
- }
1265
- /**
1266
- * This interface was referenced by `Config`'s JSON-Schema
1267
- * via the `definition` "tenant-entitlements".
1268
- */
1269
- interface TenantEntitlement {
1270
- id: string;
1271
- tenant: string | Tenant;
1272
- plan: 'free' | 'starter' | 'basic' | 'pro' | 'enterprise';
1249
+ unitPrice: number;
1250
+ variantTitle?: string | null;
1251
+ sku?: string | null;
1252
+ compareAtPrice?: number | null;
1253
+ weight?: number | null;
1254
+ requiresShipping?: boolean | null;
1273
1255
  /**
1274
- * Lifecycle status for the entitlement. Only active rows participate in current plan resolution.
1256
+ * Total-price snapshot at order time, preserved from unitPrice × quantity.
1275
1257
  */
1276
- status: 'active' | 'scheduled' | 'expired' | 'revoked';
1277
- sourceType: 'subscription' | 'manual' | 'support' | 'promo' | 'trial' | 'enterprise_contract';
1278
- sourceSubscription?: (string | null) | Subscription;
1258
+ totalPrice: number;
1259
+ productTitle?: string | null;
1279
1260
  /**
1280
- * Tie-breaker for overlapping entitlements. Higher values win within the same source precedence.
1261
+ * Option combination snapshot at order time. Later variant/option changes do not rewrite it.
1281
1262
  */
1282
- priority: number;
1283
- startsAt: string;
1263
+ optionSelection?: {
1264
+ [k: string]: unknown;
1265
+ } | unknown[] | string | number | boolean | null;
1284
1266
  /**
1285
- * Entitlement end date. Required by hook validation for promo / trial sources and excluded from current plan resolution after expiry.
1267
+ * Tax rate at time of order (%)
1286
1268
  */
1287
- endsAt?: string | null;
1288
- reason?: string | null;
1289
- grantedBy?: (string | null) | User;
1290
- revokedAt?: string | null;
1291
- revokedBy?: (string | null) | User;
1269
+ taxRate?: number | null;
1270
+ /**
1271
+ * Currency at time of order (ISO-4217)
1272
+ */
1273
+ currency?: string | null;
1274
+ /**
1275
+ * Snapshot of the discount amount allocated to this line at order time (minor units).
1276
+ */
1277
+ discountAllocation?: number | null;
1278
+ /**
1279
+ * Per-unit price snapshot after discount allocation. round(discountedTotalPrice / quantity).
1280
+ */
1281
+ discountedUnitPrice?: number | null;
1282
+ /**
1283
+ * Line total snapshot after discount allocation at order time (totalPrice - discountAllocation).
1284
+ */
1285
+ discountedTotalPrice?: number | null;
1292
1286
  updatedAt: string;
1293
1287
  createdAt: string;
1294
1288
  deletedAt?: string | null;
1295
1289
  }
1296
1290
  /**
1297
1291
  * This interface was referenced by `Config`'s JSON-Schema
1298
- * via the `definition` "subscriptions".
1292
+ * via the `definition` "products".
1299
1293
  */
1300
- interface Subscription {
1294
+ interface Product {
1301
1295
  id: string;
1302
- tenant: string | Tenant;
1303
- plan: 'starter' | 'basic' | 'pro';
1304
- billingCycle: 'monthly' | 'yearly';
1296
+ _order?: string | null;
1297
+ tenant?: (string | null) | Tenant;
1298
+ title: string;
1305
1299
  /**
1306
- * Payment amount (KRW)
1300
+ * Short supporting line shown on product cards and detail headers.
1307
1301
  */
1308
- amount: number;
1309
- status: 'active' | 'past_due' | 'canceled' | 'expired' | 'suspended';
1310
- currency: 'KRW' | 'USD';
1311
- provider: 'toss';
1312
- currentPeriodStart?: string | null;
1313
- currentPeriodEnd?: string | null;
1314
- trialStartAt?: string | null;
1315
- trialEndAt?: string | null;
1316
- endedAt?: string | null;
1317
- pastDueAt?: string | null;
1302
+ subtitle?: string | null;
1318
1303
  /**
1319
- * Toss billing key (AES-256-GCM encrypted)
1304
+ * Summary description used for product detail and search previews.
1320
1305
  */
1321
- billingKey?: string | null;
1306
+ description?: string | null;
1322
1307
  /**
1323
- * Toss customer key (UUID)
1308
+ * Product detail gallery images. Order them in storefront display order.
1324
1309
  */
1325
- customerKey?: string | null;
1310
+ images?: (string | Image)[] | null;
1326
1311
  /**
1327
- * Registered card info
1312
+ * Optional primary image pointer from product media pool (images[]).
1328
1313
  */
1329
- cardInfo?: {
1330
- issuerCode?: string | null;
1331
- /**
1332
- * Masked card number
1333
- */
1334
- number?: string | null;
1335
- cardType?: string | null;
1336
- };
1314
+ primaryMediaItemId?: (string | null) | Image;
1337
1315
  /**
1338
- * Provider-owned diagnostic and audit metadata returned by the billing provider. Not a general manual-edit field.
1316
+ * Links this content to videos from the Mux-backed videos collection.
1339
1317
  */
1340
- providerMetadata?: {
1318
+ videos?: (string | Video)[] | null;
1319
+ /**
1320
+ * Product detail body content. Supports images and Iframe/Player/Carousel embed blocks.
1321
+ */
1322
+ content?: {
1323
+ root: {
1324
+ type: string;
1325
+ children: {
1326
+ type: any;
1327
+ version: number;
1328
+ [k: string]: unknown;
1329
+ }[];
1330
+ direction: ('ltr' | 'rtl') | null;
1331
+ format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
1332
+ indent: number;
1333
+ version: number;
1334
+ };
1341
1335
  [k: string]: unknown;
1342
- } | unknown[] | string | number | boolean | null;
1343
- cancelAtPeriodEnd?: boolean | null;
1344
- canceledAt?: string | null;
1345
- cancelReason?: string | null;
1346
- retryCount?: number | null;
1347
- graceDeadline?: string | null;
1348
- lastPaymentError?: string | null;
1349
- pendingPlanChange?: {
1350
- targetPlan?: ('starter' | 'basic' | 'pro') | null;
1351
- targetAmount?: number | null;
1352
- effectiveAt?: string | null;
1336
+ } | null;
1337
+ variants?: {
1338
+ docs?: (string | ProductVariant)[];
1339
+ hasNextPage?: boolean;
1340
+ totalDocs?: number;
1353
1341
  };
1354
- updatedAt: string;
1355
- createdAt: string;
1356
- deletedAt?: string | null;
1357
- }
1358
- /**
1359
- * This interface was referenced by `Config`'s JSON-Schema
1360
- * via the `definition` "tenant-purge-jobs".
1361
- */
1362
- interface TenantPurgeJob {
1363
- id: string;
1364
- tenantId: string;
1365
- status: 'pending' | 'running' | 'failed' | 'ready-to-delete';
1366
- currentCollection?: string | null;
1367
- deletedCount?: number | null;
1368
- failure?: string | null;
1369
- completedAt?: string | null;
1370
- updatedAt: string;
1371
- createdAt: string;
1372
- }
1373
- /**
1374
- * This interface was referenced by `Config`'s JSON-Schema
1375
- * via the `definition` "billing-history".
1376
- */
1377
- interface BillingHistory {
1378
- id: string;
1379
- tenant: string | Tenant;
1380
- subscription?: (string | null) | Subscription;
1381
- type: 'payment' | 'refund' | 'plan_change';
1382
- status: 'success' | 'failed' | 'refunded' | 'partial_refund';
1342
+ options?: {
1343
+ docs?: (string | ProductOption)[];
1344
+ hasNextPage?: boolean;
1345
+ totalDocs?: number;
1346
+ };
1347
+ categories?: (string | ProductCategory)[] | null;
1348
+ tags?: (string | ProductTag)[] | null;
1383
1349
  /**
1384
- * Amount (KRW)
1350
+ * Canonical brand used for storefront brand filtering.
1385
1351
  */
1386
- amount: number;
1352
+ brand?: (string | null) | Brand;
1387
1353
  /**
1388
- * Plan at time of payment
1354
+ * Shipping policy for this product. When empty on create, the default policy is applied.
1389
1355
  */
1390
- plan: 'starter' | 'basic' | 'pro';
1391
- provider: 'toss';
1392
- currency: 'KRW' | 'USD';
1393
- billingCycle?: ('monthly' | 'yearly') | null;
1394
- periodStart?: string | null;
1395
- periodEnd?: string | null;
1356
+ shippingPolicy?: (string | null) | ShippingPolicy;
1396
1357
  /**
1397
- * Unique order number
1358
+ * Integer weight in grams. For example, enter 2500 for 2.5 kg.
1398
1359
  */
1399
- invoiceNumber: string;
1400
- orderName?: string | null;
1360
+ weight?: number | null;
1401
1361
  /**
1402
- * Toss payment key
1362
+ * Supplier name imported from external systems, separate from the brand relationship.
1403
1363
  */
1404
- paymentKey?: string | null;
1364
+ vendor?: string | null;
1405
1365
  /**
1406
- * Full Toss API response
1366
+ * External catalog product type, separate from categories.
1407
1367
  */
1408
- tossResponse?: {
1409
- [k: string]: unknown;
1410
- } | unknown[] | string | number | boolean | null;
1411
- errorMessage?: string | null;
1368
+ productType?: string | null;
1369
+ /**
1370
+ * Collection memberships for this product. Managed from the collection edit view.
1371
+ */
1372
+ collectionItems?: {
1373
+ docs?: (string | ProductCollectionItem)[];
1374
+ hasNextPage?: boolean;
1375
+ totalDocs?: number;
1376
+ };
1377
+ /**
1378
+ * Minimum order quantity for this product.
1379
+ */
1380
+ minOrderQuantity?: number | null;
1381
+ /**
1382
+ * Maximum order quantity for this product.
1383
+ */
1384
+ maxOrderQuantity?: number | null;
1412
1385
  /**
1413
- * Original billing record for retry
1386
+ * Primary option used to expand this product into option-value cards.
1414
1387
  */
1415
- retryOf?: (string | null) | BillingHistory;
1416
- updatedAt: string;
1417
- createdAt: string;
1418
- deletedAt?: string | null;
1419
- }
1420
- /**
1421
- * This interface was referenced by `Config`'s JSON-Schema
1422
- * via the `definition` "plans".
1423
- */
1424
- interface Plan {
1425
- id: string;
1388
+ listingPrimaryOption?: (string | null) | ProductOption;
1426
1389
  /**
1427
- * Plan identifier (free, starter, basic, pro, enterprise)
1390
+ * Automatically computed values for product cards and search.
1428
1391
  */
1429
- key: string;
1392
+ listing?: {
1393
+ /**
1394
+ * Variant prioritized for product cards. Automatically derived.
1395
+ */
1396
+ selectionHintVariant?: (string | null) | ProductVariant;
1397
+ /**
1398
+ * Primary image for product cards and search. Automatically derived.
1399
+ */
1400
+ primaryImage?: (string | null) | Image;
1401
+ /**
1402
+ * Lowest active variant price. Automatically derived.
1403
+ */
1404
+ minPrice?: number | null;
1405
+ /**
1406
+ * Highest active variant price. Automatically derived.
1407
+ */
1408
+ maxPrice?: number | null;
1409
+ /**
1410
+ * Lowest compare-at price across active variants. Automatically derived.
1411
+ */
1412
+ minCompareAtPrice?: number | null;
1413
+ /**
1414
+ * Highest compare-at price across active variants. Automatically derived.
1415
+ */
1416
+ maxCompareAtPrice?: number | null;
1417
+ /**
1418
+ * Automatically enabled when min and max prices differ.
1419
+ */
1420
+ isPriceRange?: boolean | null;
1421
+ /**
1422
+ * Enabled when at least one variant is sellable.
1423
+ */
1424
+ availableForSale?: boolean | null;
1425
+ /**
1426
+ * Automatically derived from the primary option setting.
1427
+ */
1428
+ groupingState?: ('grouped' | 'no_primary_option' | 'empty') | null;
1429
+ /**
1430
+ * Shown when grouping produces zero cards. Visible before publish.
1431
+ */
1432
+ groupingEmptyReason?: ('primary_option_not_linked' | 'primary_option_has_no_values' | 'no_variants_for_primary_option') | null;
1433
+ /**
1434
+ * Number of expandable option-value cards.
1435
+ */
1436
+ groupingCount?: number | null;
1437
+ };
1438
+ seo?: {
1439
+ /**
1440
+ * Search result title (falls back to document title)
1441
+ */
1442
+ title?: string | null;
1443
+ /**
1444
+ * Search result description
1445
+ */
1446
+ description?: string | null;
1447
+ /**
1448
+ * Block search engine indexing
1449
+ */
1450
+ noIndex?: boolean | null;
1451
+ /**
1452
+ * Canonical URL (prevents duplicate content)
1453
+ */
1454
+ canonical?: string | null;
1455
+ openGraph?: {
1456
+ /**
1457
+ * OG title (falls back to seo.title)
1458
+ */
1459
+ title?: string | null;
1460
+ /**
1461
+ * OG description (falls back to seo.description)
1462
+ */
1463
+ description?: string | null;
1464
+ /**
1465
+ * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
1466
+ */
1467
+ image?: (string | null) | Image;
1468
+ };
1469
+ };
1430
1470
  /**
1431
- * Plan display name
1471
+ * Preferred thumbnail for product lists. Falls back to the first gallery image when empty.
1432
1472
  */
1433
- name: string;
1473
+ thumbnail?: (string | null) | Image;
1434
1474
  /**
1435
- * Reference-only feature list; enforced elsewhere.
1475
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
1436
1476
  */
1437
- featuresAllowed?: ('ecommerce' | 'customers' | 'playlists' | 'galleries' | 'links' | 'forms' | 'articles' | 'documents' | 'canvas' | 'videos' | 'live-streaming' | 'community' | 'events')[] | null;
1477
+ generateSlug?: boolean | null;
1438
1478
  /**
1439
- * Reference-only quotas such as storageBytes; enforced by entitlement and usage policy elsewhere.
1479
+ * Canonical product URL slug. Generated from the title or editable directly.
1440
1480
  */
1441
- quotas?: {
1442
- [k: string]: unknown;
1443
- } | unknown[] | string | number | boolean | null;
1444
- updatedAt: string;
1445
- createdAt: string;
1446
- deletedAt?: string | null;
1447
- }
1448
- /**
1449
- * This interface was referenced by `Config`'s JSON-Schema
1450
- * via the `definition` "tenant-web-analytics-config".
1451
- */
1452
- interface TenantWebAnalyticsConfig {
1453
- id: string;
1454
- tenant?: (string | null) | Tenant;
1455
- enabled?: boolean | null;
1481
+ slug?: string | null;
1456
1482
  /**
1457
- * Domains allowed to send analytics events. If empty, browser analytics is blocked.
1483
+ * Draft is hidden, Published is public, and Archived hides without deleting.
1458
1484
  */
1459
- allowedOrigins?: {
1460
- origin: string;
1461
- id?: string | null;
1462
- }[] | null;
1485
+ status?: ('draft' | 'published' | 'archived') | null;
1463
1486
  /**
1464
- * Timezone used to group daily analytics. Once data starts coming in, this is locked and cannot be changed.
1487
+ * Automatically enabled when no variant is sellable.
1465
1488
  */
1466
- timezone: string;
1489
+ isSoldOut?: boolean | null;
1490
+ isFeatured?: boolean | null;
1467
1491
  /**
1468
- * Automatically locked once the first analytics record is saved. Contact support to unlock.
1492
+ * Automatically stamped the first time a draft is published.
1469
1493
  */
1470
- tzLocked?: boolean | null;
1494
+ publishedAt?: string | null;
1495
+ metadata?: {
1496
+ [k: string]: unknown;
1497
+ } | unknown[] | string | number | boolean | null;
1471
1498
  updatedAt: string;
1472
1499
  createdAt: string;
1473
1500
  deletedAt?: string | null;
1474
1501
  }
1475
1502
  /**
1476
1503
  * This interface was referenced by `Config`'s JSON-Schema
1477
- * via the `definition` "tenant-analytics-daily".
1504
+ * via the `definition` "videos".
1478
1505
  */
1479
- interface TenantAnalyticsDaily {
1506
+ interface Video {
1480
1507
  id: string;
1481
1508
  tenant?: (string | null) | Tenant;
1509
+ title?: string | null;
1482
1510
  /**
1483
- * YYYY-MM-DD (UTC)
1484
- */
1485
- date: string;
1486
- pageviews: number;
1487
- /**
1488
- * Estimated via HyperLogLog (±0.81%)
1489
- */
1490
- visitors: number;
1491
- topPages?: {
1492
- pathname: string;
1493
- views: number;
1494
- id?: string | null;
1495
- }[] | null;
1496
- topReferrers?: {
1497
- source: string;
1498
- views: number;
1499
- id?: string | null;
1500
- }[] | null;
1501
- topEvents?: {
1502
- name: string;
1503
- count: number;
1504
- id?: string | null;
1505
- }[] | null;
1506
- eventsDropped?: {
1507
- cardinality?: number | null;
1508
- schema?: number | null;
1509
- late?: number | null;
1510
- origin?: number | null;
1511
- key?: number | null;
1512
- rate?: number | null;
1513
- disabled?: number | null;
1514
- };
1515
- snapshottedAt?: string | null;
1516
- /**
1517
- * Tenant timezone used to bucket this snapshot's date.
1511
+ * Secondary display line shown in cards, listings, and detail headers.
1518
1512
  */
1519
- bucketTz: string;
1513
+ subtitle?: string | null;
1514
+ filename?: string | null;
1520
1515
  /**
1521
- * Deterministic aggregate schema shape hash for mismatch detection.
1516
+ * Short summary for listing/cards
1522
1517
  */
1523
- schemaShape: string;
1518
+ description?: string | null;
1519
+ content?: {
1520
+ root: {
1521
+ type: string;
1522
+ children: {
1523
+ type: any;
1524
+ version: number;
1525
+ [k: string]: unknown;
1526
+ }[];
1527
+ direction: ('ltr' | 'rtl') | null;
1528
+ format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
1529
+ indent: number;
1530
+ version: number;
1531
+ };
1532
+ [k: string]: unknown;
1533
+ } | null;
1534
+ sourceLiveStream?: (string | null) | LiveStream;
1535
+ categories?: (string | VideoCategory)[] | null;
1536
+ tags?: (string | VideoTag)[] | null;
1524
1537
  /**
1525
- * Per-event dimension/page/referrer aggregates. Populated by snapshot cron when registered events have Redis data.
1538
+ * Mux processing status. Updated by upload/encoding jobs and not edited directly.
1526
1539
  */
1527
- eventDetails?: {
1528
- eventName: string;
1529
- count?: number | null;
1540
+ muxStatus?: ('waiting' | 'preparing' | 'ready' | 'errored') | null;
1541
+ durationSeconds?: number | null;
1542
+ muxAspectRatio?: string | null;
1543
+ maxResolution?: string | null;
1544
+ quality?: ('basic' | 'plus' | 'premium') | null;
1545
+ mp4Support?: ('none' | 'standard' | 'capped-1080p') | null;
1546
+ muxAssetId?: string | null;
1547
+ muxPlaybackId?: string | null;
1548
+ muxUploadId?: string | null;
1549
+ seo?: {
1530
1550
  /**
1531
- * Deterministic schema shape hash for this event detail row.
1551
+ * Search result title (falls back to document title)
1532
1552
  */
1533
- schemaShape?: string | null;
1534
- dimensions?: {
1535
- dimension: string;
1536
- values?: {
1537
- value: string;
1538
- count: number;
1539
- id?: string | null;
1540
- }[] | null;
1541
- id?: string | null;
1542
- }[] | null;
1543
- pages?: {
1544
- pathname: string;
1545
- count: number;
1546
- id?: string | null;
1547
- }[] | null;
1548
- referrers?: {
1549
- source: string;
1550
- count: number;
1551
- id?: string | null;
1552
- }[] | null;
1553
- id?: string | null;
1554
- }[] | null;
1555
- /**
1556
- * MCP tool usage aggregate. Populated by snapshot cron from daily Redis keys.
1557
- */
1558
- mcpUsage?: {
1559
- toolCalls?: number | null;
1560
- sessions?: number | null;
1561
- convertedSessions?: number | null;
1562
- conversionRate?: number | null;
1563
- successfulWrites?: number | null;
1564
- isPartial?: boolean | null;
1565
- topTools?: {
1566
- name: string;
1567
- count: number;
1568
- readOnly?: boolean | null;
1569
- id?: string | null;
1570
- }[] | null;
1571
- transports?: {
1572
- name: string;
1573
- count: number;
1574
- id?: string | null;
1575
- }[] | null;
1576
- httpDurationMs?: {
1577
- p50?: number | null;
1578
- p99?: number | null;
1579
- buckets?: {
1580
- bucket: string;
1581
- label: string;
1582
- count: number;
1583
- id?: string | null;
1584
- }[] | null;
1553
+ title?: string | null;
1554
+ /**
1555
+ * Search result description
1556
+ */
1557
+ description?: string | null;
1558
+ /**
1559
+ * Block search engine indexing
1560
+ */
1561
+ noIndex?: boolean | null;
1562
+ /**
1563
+ * Canonical URL (prevents duplicate content)
1564
+ */
1565
+ canonical?: string | null;
1566
+ openGraph?: {
1567
+ /**
1568
+ * OG title (falls back to seo.title)
1569
+ */
1570
+ title?: string | null;
1571
+ /**
1572
+ * OG description (falls back to seo.description)
1573
+ */
1574
+ description?: string | null;
1575
+ /**
1576
+ * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
1577
+ */
1578
+ image?: (string | null) | Image;
1585
1579
  };
1586
1580
  };
1581
+ /**
1582
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
1583
+ */
1584
+ generateSlug?: boolean | null;
1585
+ slug?: string | null;
1586
+ thumbnail?: (string | null) | Image;
1587
+ isFeatured?: boolean | null;
1588
+ publishedAt?: string | null;
1589
+ metadata?: {
1590
+ [k: string]: unknown;
1591
+ } | unknown[] | string | number | boolean | null;
1592
+ /**
1593
+ * Read-only counter accumulated from video view events.
1594
+ */
1595
+ viewCount?: number | null;
1596
+ aspectRatio?: ('16_9' | '9_16' | '4_3' | '1_1') | null;
1597
+ /**
1598
+ * Chapter markers
1599
+ */
1600
+ chapters?: {
1601
+ title: string;
1602
+ startSeconds: number;
1603
+ id?: string | null;
1604
+ }[] | null;
1587
1605
  updatedAt: string;
1588
1606
  createdAt: string;
1607
+ deletedAt?: string | null;
1589
1608
  }
1590
1609
  /**
1591
1610
  * This interface was referenced by `Config`'s JSON-Schema
1592
- * via the `definition` "analytics-event-schemas".
1611
+ * via the `definition` "live-streams".
1593
1612
  */
1594
- interface AnalyticsEventSchema {
1613
+ interface LiveStream {
1595
1614
  id: string;
1596
1615
  tenant?: (string | null) | Tenant;
1616
+ title?: string | null;
1597
1617
  /**
1598
- * Valid event name pattern.
1618
+ * Secondary display line shown in cards, listings, and detail headers.
1599
1619
  */
1600
- eventName: string;
1601
- enabled: boolean;
1602
- dimensions?: {
1603
- key: string;
1604
- type: 'enum' | 'boolean';
1620
+ subtitle?: string | null;
1621
+ /**
1622
+ * Short summary for listing/cards
1623
+ */
1624
+ description?: string | null;
1625
+ /**
1626
+ * Scheduled start time
1627
+ */
1628
+ scheduledAt?: string | null;
1629
+ latencyMode?: ('standard' | 'reduced' | 'low') | null;
1630
+ /**
1631
+ * Reconnect window (seconds)
1632
+ */
1633
+ reconnectWindowSeconds?: number | null;
1634
+ /**
1635
+ * Mux live stream status. Updated by stream create/disable jobs and not edited directly.
1636
+ */
1637
+ muxStatus?: ('idle' | 'active' | 'disabled') | null;
1638
+ muxLiveStreamId?: string | null;
1639
+ muxPlaybackId?: string | null;
1640
+ streamKey?: string | null;
1641
+ muxActiveAssetId?: string | null;
1642
+ recentAssetIds?: {
1643
+ [k: string]: unknown;
1644
+ } | unknown[] | string | number | boolean | null;
1645
+ seo?: {
1605
1646
  /**
1606
- * Comma-separated values. Required when type=enum, optional otherwise. Boolean auto-derives {true,false}. Max 20 per key.
1647
+ * Search result title (falls back to document title)
1648
+ */
1649
+ title?: string | null;
1650
+ /**
1651
+ * Search result description
1607
1652
  */
1608
- allowedValues?: string | null;
1609
1653
  description?: string | null;
1610
- id?: string | null;
1611
- }[] | null;
1612
- createdBy?: (string | null) | User;
1613
- updatedBy?: (string | null) | User;
1654
+ /**
1655
+ * Block search engine indexing
1656
+ */
1657
+ noIndex?: boolean | null;
1658
+ /**
1659
+ * Canonical URL (prevents duplicate content)
1660
+ */
1661
+ canonical?: string | null;
1662
+ openGraph?: {
1663
+ /**
1664
+ * OG title (falls back to seo.title)
1665
+ */
1666
+ title?: string | null;
1667
+ /**
1668
+ * OG description (falls back to seo.description)
1669
+ */
1670
+ description?: string | null;
1671
+ /**
1672
+ * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
1673
+ */
1674
+ image?: (string | null) | Image;
1675
+ };
1676
+ };
1677
+ /**
1678
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
1679
+ */
1680
+ generateSlug?: boolean | null;
1681
+ slug?: string | null;
1682
+ thumbnail?: (string | null) | Image;
1683
+ isFeatured?: boolean | null;
1684
+ metadata?: {
1685
+ [k: string]: unknown;
1686
+ } | unknown[] | string | number | boolean | null;
1687
+ startedAt?: string | null;
1688
+ endedAt?: string | null;
1689
+ /**
1690
+ * Highest concurrent viewer count recorded during live sessions.
1691
+ */
1692
+ peakViewerCount?: number | null;
1693
+ /**
1694
+ * Read-only counter accumulated from live stream view events.
1695
+ */
1696
+ viewCount?: number | null;
1614
1697
  updatedAt: string;
1615
1698
  createdAt: string;
1616
1699
  deletedAt?: string | null;
1617
1700
  }
1618
1701
  /**
1619
1702
  * This interface was referenced by `Config`'s JSON-Schema
1620
- * via the `definition` "api-usage".
1703
+ * via the `definition` "video-categories".
1621
1704
  */
1622
- interface ApiUsage {
1705
+ interface VideoCategory {
1623
1706
  id: string;
1707
+ _order?: string | null;
1624
1708
  tenant?: (string | null) | Tenant;
1709
+ title?: string | null;
1625
1710
  /**
1626
- * YYYY-MM format
1627
- */
1628
- month: string;
1629
- apiCallCount: number;
1630
- plan: 'free' | 'starter' | 'basic' | 'pro' | 'enterprise';
1631
- /**
1632
- * -1 means unlimited
1711
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
1633
1712
  */
1634
- apiCallLimit: number;
1713
+ generateSlug?: boolean | null;
1714
+ slug?: string | null;
1635
1715
  /**
1636
- * Storage usage in bytes
1716
+ * Short summary for listing/cards
1637
1717
  */
1638
- storageUsedBytes?: number | null;
1718
+ description?: string | null;
1639
1719
  /**
1640
- * Storage limit in bytes (-1 means unlimited)
1720
+ * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
1641
1721
  */
1642
- storageLimitBytes?: number | null;
1722
+ image?: (string | null) | Image;
1643
1723
  /**
1644
- * Total document count across all tenant-scoped collections
1724
+ * Optional parent category used for hierarchy and breadcrumbs.
1645
1725
  */
1646
- documentCount?: number | null;
1726
+ parent?: (string | null) | VideoCategory;
1647
1727
  /**
1648
- * Number of video documents
1728
+ * Optional #RRGGBB hex color for taxonomy badges or filter UI. This does not replace the representative image.
1649
1729
  */
1650
- videoCount?: number | null;
1730
+ color?: string | null;
1731
+ updatedAt: string;
1732
+ createdAt: string;
1733
+ deletedAt?: string | null;
1734
+ }
1735
+ /**
1736
+ * This interface was referenced by `Config`'s JSON-Schema
1737
+ * via the `definition` "video-tags".
1738
+ */
1739
+ interface VideoTag {
1740
+ id: string;
1741
+ _order?: string | null;
1742
+ tenant?: (string | null) | Tenant;
1743
+ title?: string | null;
1651
1744
  /**
1652
- * Weighted video minutes used (duration × quality multiplier)
1745
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
1653
1746
  */
1654
- videoMinutesUsed?: number | null;
1747
+ generateSlug?: boolean | null;
1748
+ slug?: string | null;
1655
1749
  /**
1656
- * Monthly viewer watch time from Mux Data
1750
+ * Short summary for listing/cards
1657
1751
  */
1658
- deliveryMinutesUsed?: number | null;
1752
+ description?: string | null;
1659
1753
  /**
1660
- * AI generation count
1754
+ * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
1661
1755
  */
1662
- aiGenerationCount?: number | null;
1756
+ image?: (string | null) | Image;
1663
1757
  /**
1664
- * Timestamp when the usage snapshot cron calculated this monthly aggregate.
1758
+ * Optional #RRGGBB hex color for taxonomy badges or filter UI. This does not replace the representative image.
1665
1759
  */
1666
- snapshottedAt?: string | null;
1760
+ color?: string | null;
1667
1761
  updatedAt: string;
1668
1762
  createdAt: string;
1763
+ deletedAt?: string | null;
1669
1764
  }
1670
1765
  /**
1671
1766
  * This interface was referenced by `Config`'s JSON-Schema
1672
- * via the `definition` "products".
1767
+ * via the `definition` "product-variants".
1673
1768
  */
1674
- interface Product {
1769
+ interface ProductVariant {
1675
1770
  id: string;
1771
+ '_product-variants_variants_order'?: string | null;
1676
1772
  _order?: string | null;
1677
1773
  tenant?: (string | null) | Tenant;
1678
- title: string;
1679
- /**
1680
- * Short supporting line shown on product cards and detail headers.
1681
- */
1682
- subtitle?: string | null;
1683
1774
  /**
1684
- * Summary description used for product detail and search previews.
1775
+ * Parent product for this variant. It cannot be moved to another product after creation.
1685
1776
  */
1686
- description?: string | null;
1777
+ product: string | Product;
1687
1778
  /**
1688
- * Product detail gallery images. When thumbnail and listing.primaryImage are empty, the first gallery image can appear as the product list thumbnail. Add alt text when uploading new images and order images in storefront display order.
1779
+ * Auto-generated from option value combination.
1689
1780
  */
1781
+ title?: string | null;
1690
1782
  images?: (string | Image)[] | null;
1691
1783
  /**
1692
- * Links this content to videos from the Mux-backed videos collection.
1784
+ * Variant-specific SKU
1693
1785
  */
1694
- videos?: (string | Video)[] | null;
1786
+ sku?: string | null;
1695
1787
  /**
1696
- * Product detail body content. Supports image uploads and Iframe/Player/Carousel embed blocks. The article editor Code block and AI assist are not shown in this product profile.
1788
+ * Selling price (KRW)
1697
1789
  */
1698
- content?: {
1699
- root: {
1700
- type: string;
1701
- children: {
1702
- type: any;
1703
- version: number;
1704
- [k: string]: unknown;
1705
- }[];
1706
- direction: ('ltr' | 'rtl') | null;
1707
- format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
1708
- indent: number;
1709
- version: number;
1710
- };
1711
- [k: string]: unknown;
1712
- } | null;
1713
- variants?: {
1714
- docs?: (string | ProductVariant)[];
1715
- hasNextPage?: boolean;
1716
- totalDocs?: number;
1717
- };
1718
- options?: {
1719
- docs?: (string | ProductOption)[];
1720
- hasNextPage?: boolean;
1721
- totalDocs?: number;
1722
- };
1723
- categories?: (string | ProductCategory)[] | null;
1724
- tags?: (string | ProductTag)[] | null;
1790
+ price?: number | null;
1791
+ /**
1792
+ * Original price before discount
1793
+ */
1794
+ compareAtPrice?: number | null;
1725
1795
  /**
1726
- * Canonical storefront brand used for brand filtering and brand pages. Preserve external supplier names in the sidebar Vendor field.
1796
+ * Sell without tracking inventory
1727
1797
  */
1728
- brand?: (string | null) | Brand;
1798
+ isUnlimited?: boolean | null;
1729
1799
  /**
1730
- * Shipping fee, free-shipping threshold, and estimated delivery policy for this product. When empty on a new product, the tenant default shipping policy is applied automatically.
1800
+ * Available quantity is stock minus reserved stock.
1731
1801
  */
1732
- shippingPolicy?: (string | null) | ShippingPolicy;
1802
+ stock?: number | null;
1733
1803
  /**
1734
- * Integer weight in grams. For example, enter 2500 for 2.5 kg.
1804
+ * Reserved stock increased automatically during order processing.
1805
+ */
1806
+ reservedStock?: number | null;
1807
+ /**
1808
+ * Minimum quantity before low-stock alerts.
1809
+ */
1810
+ safetyStockThreshold?: number | null;
1811
+ /**
1812
+ * Inventory alert summary. Automatically derived.
1813
+ */
1814
+ inventoryAlertState?: ('untracked' | 'inactive' | 'out_of_stock' | 'low_stock' | 'ok') | null;
1815
+ /**
1816
+ * Variant-specific barcode
1817
+ */
1818
+ barcode?: string | null;
1819
+ /**
1820
+ * Variant-specific integer weight in grams. For example, enter 2500 for 2.5 kg.
1735
1821
  */
1736
1822
  weight?: number | null;
1737
1823
  /**
1738
- * Collection memberships for this product. Managed from the collection edit view.
1824
+ * Enable for physical variants that require shipping.
1739
1825
  */
1740
- collectionItems?: {
1741
- docs?: (string | ProductCollectionItem)[];
1742
- hasNextPage?: boolean;
1743
- totalDocs?: number;
1744
- };
1826
+ requiresShipping?: boolean | null;
1745
1827
  /**
1746
- * Minimum order quantity
1828
+ * External system ID
1747
1829
  */
1748
- minOrderQuantity?: number | null;
1830
+ externalId?: string | null;
1749
1831
  /**
1750
- * Maximum order quantity
1832
+ * Option value combination for this variant (e.g. Black + S)
1751
1833
  */
1752
- maxOrderQuantity?: number | null;
1834
+ optionValues?: (string | ProductOptionValue)[] | null;
1753
1835
  /**
1754
- * Operator-selected primary option. Save the product, then add options to make this selectable. When selected, product cards/search expand this product by option value (for example, Color).
1836
+ * Internal unique key for the variant option combination. Products without options use __default__; temporary invalid states use the __invalid__: prefix.
1755
1837
  */
1756
- listingPrimaryOption?: (string | null) | ProductOption;
1838
+ optionKey?: string | null;
1839
+ isActive?: boolean | null;
1840
+ metadata?: {
1841
+ [k: string]: unknown;
1842
+ } | unknown[] | string | number | boolean | null;
1843
+ updatedAt: string;
1844
+ createdAt: string;
1845
+ deletedAt?: string | null;
1846
+ }
1847
+ /**
1848
+ * This interface was referenced by `Config`'s JSON-Schema
1849
+ * via the `definition` "product-option-values".
1850
+ */
1851
+ interface ProductOptionValue {
1852
+ id: string;
1853
+ '_product-option-values_values_order'?: string | null;
1854
+ _order?: string | null;
1855
+ tenant?: (string | null) | Tenant;
1757
1856
  /**
1758
- * Automatically derived listing projection for product cards and search. Operators do not edit these fields directly.
1857
+ * Parent option for this value. It cannot be moved to another option after creation.
1759
1858
  */
1760
- listing?: {
1761
- /**
1762
- * Variant prioritized for product cards. Automatically derived from sellable variants, active variants, and sort order. Storefront product cards use this as the option hint.
1763
- */
1764
- selectionHintVariant?: (string | null) | ProductVariant;
1765
- /**
1766
- * Primary image rendered by storefront product cards and search results. Product thumbnail/gallery media is preferred, then variant media is used as fallback.
1767
- */
1768
- primaryImage?: (string | null) | Image;
1769
- /**
1770
- * Lowest active variant price. Automatically recalculated when variants change. Storefront cards and filters use this price.
1771
- */
1772
- minPrice?: number | null;
1773
- /**
1774
- * Highest active variant price. Automatically recalculated when variants change. Storefront cards and filters use this price.
1775
- */
1776
- maxPrice?: number | null;
1777
- /**
1778
- * Lowest compare-at price across active variants. Automatically recalculated when variants change. Storefront discount displays use this value.
1779
- */
1780
- minCompareAtPrice?: number | null;
1781
- /**
1782
- * Highest compare-at price across active variants. Automatically recalculated when variants change. Storefront discount displays use this value.
1783
- */
1784
- maxCompareAtPrice?: number | null;
1785
- /**
1786
- * Automatically enabled when the minimum and maximum active variant prices differ. Storefront cards use this to decide whether to show a price range.
1787
- */
1788
- isPriceRange?: boolean | null;
1789
- /**
1790
- * Automatically enabled when at least one active variant is sellable. Storefront grids and filters use this to render and filter in-stock products.
1791
- */
1792
- availableForSale?: boolean | null;
1793
- };
1794
- seo?: {
1795
- /**
1796
- * Search result title (falls back to document title)
1797
- */
1798
- title?: string | null;
1859
+ option: string | ProductOption;
1860
+ displayLabel?: string | null;
1861
+ /**
1862
+ * Editable option-value display label for Admin and storefront copy. Changing it after creation does not change the public slug. (e.g. Black, S)
1863
+ */
1864
+ value: string;
1865
+ /**
1866
+ * Single visual swatch for this option value. Use either a color or one image from the product media pool.
1867
+ */
1868
+ swatch?: {
1799
1869
  /**
1800
- * Search result description
1870
+ * How this option-value swatch is rendered.
1801
1871
  */
1802
- description?: string | null;
1872
+ type?: ('color' | 'media') | null;
1803
1873
  /**
1804
- * Block search engine indexing
1874
+ * Hex color swatch for this option value (for example #111111)
1805
1875
  */
1806
- noIndex?: boolean | null;
1876
+ color?: string | null;
1807
1877
  /**
1808
- * Canonical URL (prevents duplicate content)
1878
+ * One image from the product media pool used as this option-value swatch.
1809
1879
  */
1810
- canonical?: string | null;
1811
- openGraph?: {
1812
- /**
1813
- * OG title (falls back to seo.title)
1814
- */
1815
- title?: string | null;
1816
- /**
1817
- * OG description (falls back to seo.description)
1818
- */
1819
- description?: string | null;
1820
- /**
1821
- * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
1822
- */
1823
- image?: (string | null) | Image;
1824
- };
1880
+ mediaItemId?: (string | null) | Image;
1825
1881
  };
1826
- /**
1827
- * Preferred product list thumbnail. When empty, the list falls back to listing primary image, then the first gallery image. Add alt text when uploading new images.
1828
- */
1829
- thumbnail?: (string | null) | Image;
1830
1882
  /**
1831
1883
  * When enabled, the slug will auto-generate from the title field on save and autosave.
1832
1884
  */
1833
1885
  generateSlug?: boolean | null;
1834
1886
  /**
1835
- * Canonical product URL slug. Generated from the title or editable directly.
1836
- */
1837
- slug?: string | null;
1838
- /**
1839
- * Draft products are hidden from the storefront. Only Published products are exposed through public APIs. Archived hides without deleting. Deleting a product also deletes variants and options. The last 50 saved versions can be restored from the Versions tab.
1887
+ * Compatibility URL token generated from the option-value label on create. It is fixed after creation.
1840
1888
  */
1841
- status?: ('draft' | 'published' | 'archived') | null;
1889
+ slug: string;
1890
+ metadata?: {
1891
+ [k: string]: unknown;
1892
+ } | unknown[] | string | number | boolean | null;
1893
+ updatedAt: string;
1894
+ createdAt: string;
1895
+ deletedAt?: string | null;
1896
+ }
1897
+ /**
1898
+ * This interface was referenced by `Config`'s JSON-Schema
1899
+ * via the `definition` "product-options".
1900
+ */
1901
+ interface ProductOption {
1902
+ id: string;
1903
+ '_product-options_options_order'?: string | null;
1904
+ _order?: string | null;
1905
+ tenant?: (string | null) | Tenant;
1842
1906
  /**
1843
- * Automatically enabled when no active variant is sellable. A variant is sellable when it is active and either unlimited or has stock minus reserved stock greater than 0.
1907
+ * Parent product for this option. It cannot be moved to another product after creation.
1844
1908
  */
1845
- isSoldOut?: boolean | null;
1846
- isFeatured?: boolean | null;
1909
+ product: string | Product;
1847
1910
  /**
1848
- * Automatically stamped the first time a draft is published when empty. This is not used as a scheduled publish time.
1911
+ * Option display name in Admin and storefront. (e.g. Color, Size)
1849
1912
  */
1850
- publishedAt?: string | null;
1851
- metadata?: {
1852
- [k: string]: unknown;
1853
- } | unknown[] | string | number | boolean | null;
1913
+ title: string;
1854
1914
  /**
1855
- * Supplier name imported from external systems, separate from the brand relationship.
1915
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
1856
1916
  */
1857
- vendor?: string | null;
1917
+ generateSlug?: boolean | null;
1858
1918
  /**
1859
- * External catalog product type, separate from categories.
1919
+ * Compatibility URL token generated from the option name on create. It is fixed after creation.
1860
1920
  */
1861
- productType?: string | null;
1921
+ slug: string;
1922
+ values?: {
1923
+ docs?: (string | ProductOptionValue)[];
1924
+ hasNextPage?: boolean;
1925
+ totalDocs?: number;
1926
+ };
1862
1927
  updatedAt: string;
1863
1928
  createdAt: string;
1864
1929
  deletedAt?: string | null;
1865
1930
  }
1866
1931
  /**
1932
+ * Product categories are a hierarchical taxonomy for navigation and grouping.
1933
+ *
1867
1934
  * This interface was referenced by `Config`'s JSON-Schema
1868
- * via the `definition` "videos".
1935
+ * via the `definition` "product-categories".
1869
1936
  */
1870
- interface Video {
1937
+ interface ProductCategory {
1871
1938
  id: string;
1939
+ _order?: string | null;
1872
1940
  tenant?: (string | null) | Tenant;
1873
1941
  title?: string | null;
1874
1942
  /**
1875
- * Secondary display line shown in cards, listings, and detail headers.
1943
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
1876
1944
  */
1877
- subtitle?: string | null;
1878
- filename?: string | null;
1945
+ generateSlug?: boolean | null;
1946
+ slug?: string | null;
1879
1947
  /**
1880
1948
  * Short summary for listing/cards
1881
1949
  */
1882
1950
  description?: string | null;
1883
- content?: {
1884
- root: {
1885
- type: string;
1886
- children: {
1887
- type: any;
1888
- version: number;
1889
- [k: string]: unknown;
1890
- }[];
1891
- direction: ('ltr' | 'rtl') | null;
1892
- format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
1893
- indent: number;
1894
- version: number;
1895
- };
1896
- [k: string]: unknown;
1897
- } | null;
1898
- sourceLiveStream?: (string | null) | LiveStream;
1899
- categories?: (string | VideoCategory)[] | null;
1900
- tags?: (string | VideoTag)[] | null;
1901
1951
  /**
1902
- * Mux processing status. Updated by upload/encoding jobs and not edited directly.
1952
+ * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
1903
1953
  */
1904
- muxStatus?: ('waiting' | 'preparing' | 'ready' | 'errored') | null;
1905
- durationSeconds?: number | null;
1906
- muxAspectRatio?: string | null;
1907
- maxResolution?: string | null;
1908
- quality?: ('basic' | 'plus' | 'premium') | null;
1909
- mp4Support?: ('none' | 'standard' | 'capped-1080p') | null;
1910
- muxAssetId?: string | null;
1911
- muxPlaybackId?: string | null;
1912
- muxUploadId?: string | null;
1913
- seo?: {
1914
- /**
1915
- * Search result title (falls back to document title)
1916
- */
1917
- title?: string | null;
1918
- /**
1919
- * Search result description
1920
- */
1921
- description?: string | null;
1922
- /**
1923
- * Block search engine indexing
1924
- */
1925
- noIndex?: boolean | null;
1926
- /**
1927
- * Canonical URL (prevents duplicate content)
1928
- */
1929
- canonical?: string | null;
1930
- openGraph?: {
1931
- /**
1932
- * OG title (falls back to seo.title)
1933
- */
1934
- title?: string | null;
1935
- /**
1936
- * OG description (falls back to seo.description)
1937
- */
1938
- description?: string | null;
1939
- /**
1940
- * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
1941
- */
1942
- image?: (string | null) | Image;
1943
- };
1944
- };
1954
+ image?: (string | null) | Image;
1955
+ /**
1956
+ * Optional parent category used for hierarchy and breadcrumbs.
1957
+ */
1958
+ parent?: (string | null) | ProductCategory;
1959
+ /**
1960
+ * Optional #RRGGBB hex color for taxonomy badges or filter UI. This does not replace the representative image.
1961
+ */
1962
+ color?: string | null;
1963
+ updatedAt: string;
1964
+ createdAt: string;
1965
+ deletedAt?: string | null;
1966
+ }
1967
+ /**
1968
+ * Product tags are flat labels for search and loose grouping.
1969
+ *
1970
+ * This interface was referenced by `Config`'s JSON-Schema
1971
+ * via the `definition` "product-tags".
1972
+ */
1973
+ interface ProductTag {
1974
+ id: string;
1975
+ _order?: string | null;
1976
+ tenant?: (string | null) | Tenant;
1977
+ title?: string | null;
1945
1978
  /**
1946
1979
  * When enabled, the slug will auto-generate from the title field on save and autosave.
1947
1980
  */
1948
1981
  generateSlug?: boolean | null;
1949
1982
  slug?: string | null;
1950
- thumbnail?: (string | null) | Image;
1951
- isFeatured?: boolean | null;
1952
- publishedAt?: string | null;
1953
- metadata?: {
1954
- [k: string]: unknown;
1955
- } | unknown[] | string | number | boolean | null;
1956
1983
  /**
1957
- * Read-only counter accumulated from video view events.
1984
+ * Short summary for listing/cards
1958
1985
  */
1959
- viewCount?: number | null;
1960
- aspectRatio?: ('16_9' | '9_16' | '4_3' | '1_1') | null;
1986
+ description?: string | null;
1961
1987
  /**
1962
- * Chapter markers
1988
+ * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
1963
1989
  */
1964
- chapters?: {
1965
- title: string;
1966
- startSeconds: number;
1967
- id?: string | null;
1968
- }[] | null;
1990
+ image?: (string | null) | Image;
1969
1991
  updatedAt: string;
1970
1992
  createdAt: string;
1971
1993
  deletedAt?: string | null;
1972
1994
  }
1973
1995
  /**
1974
1996
  * This interface was referenced by `Config`'s JSON-Schema
1975
- * via the `definition` "live-streams".
1997
+ * via the `definition` "brands".
1976
1998
  */
1977
- interface LiveStream {
1999
+ interface Brand {
1978
2000
  id: string;
2001
+ _order?: string | null;
1979
2002
  tenant?: (string | null) | Tenant;
1980
- title?: string | null;
1981
- /**
1982
- * Secondary display line shown in cards, listings, and detail headers.
1983
- */
1984
- subtitle?: string | null;
2003
+ name: string;
1985
2004
  /**
1986
2005
  * Short summary for listing/cards
1987
2006
  */
1988
2007
  description?: string | null;
2008
+ content?: {
2009
+ root: {
2010
+ type: string;
2011
+ children: {
2012
+ type: any;
2013
+ version: number;
2014
+ [k: string]: unknown;
2015
+ }[];
2016
+ direction: ('ltr' | 'rtl') | null;
2017
+ format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
2018
+ indent: number;
2019
+ version: number;
2020
+ };
2021
+ [k: string]: unknown;
2022
+ } | null;
1989
2023
  /**
1990
- * Scheduled start time
2024
+ * Primary brand logo
1991
2025
  */
1992
- scheduledAt?: string | null;
1993
- latencyMode?: ('standard' | 'reduced' | 'low') | null;
2026
+ logo?: (string | null) | BrandLogo;
1994
2027
  /**
1995
- * Reconnect window (seconds)
2028
+ * Logo for dark mode (optional)
1996
2029
  */
1997
- reconnectWindowSeconds?: number | null;
2030
+ logoDark?: (string | null) | BrandLogo;
1998
2031
  /**
1999
- * Mux live stream status. Updated by stream create/disable jobs and not edited directly.
2032
+ * Logo mark / Icon (optional)
2000
2033
  */
2001
- muxStatus?: ('idle' | 'active' | 'disabled') | null;
2002
- muxLiveStreamId?: string | null;
2003
- muxPlaybackId?: string | null;
2004
- streamKey?: string | null;
2005
- muxActiveAssetId?: string | null;
2006
- recentAssetIds?: {
2007
- [k: string]: unknown;
2008
- } | unknown[] | string | number | boolean | null;
2034
+ logomark?: (string | null) | BrandLogo;
2035
+ /**
2036
+ * Brand official website URL
2037
+ */
2038
+ website?: string | null;
2009
2039
  seo?: {
2010
2040
  /**
2011
2041
  * Search result title (falls back to document title)
@@ -2035,7 +2065,7 @@ interface LiveStream {
2035
2065
  /**
2036
2066
  * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
2037
2067
  */
2038
- image?: (string | null) | Image;
2068
+ image?: (string | null) | BrandLogo;
2039
2069
  };
2040
2070
  };
2041
2071
  /**
@@ -2043,157 +2073,155 @@ interface LiveStream {
2043
2073
  */
2044
2074
  generateSlug?: boolean | null;
2045
2075
  slug?: string | null;
2046
- thumbnail?: (string | null) | Image;
2076
+ status?: ('draft' | 'published' | 'archived') | null;
2047
2077
  isFeatured?: boolean | null;
2078
+ publishedAt?: string | null;
2048
2079
  metadata?: {
2049
2080
  [k: string]: unknown;
2050
2081
  } | unknown[] | string | number | boolean | null;
2051
- startedAt?: string | null;
2052
- endedAt?: string | null;
2053
- /**
2054
- * Highest concurrent viewer count recorded during live sessions.
2055
- */
2056
- peakViewerCount?: number | null;
2057
- /**
2058
- * Read-only counter accumulated from live stream view events.
2059
- */
2060
- viewCount?: number | null;
2061
- updatedAt: string;
2062
- createdAt: string;
2063
- deletedAt?: string | null;
2064
- }
2065
- /**
2066
- * This interface was referenced by `Config`'s JSON-Schema
2067
- * via the `definition` "video-categories".
2068
- */
2069
- interface VideoCategory {
2070
- id: string;
2071
- _order?: string | null;
2072
- tenant?: (string | null) | Tenant;
2073
- title?: string | null;
2074
- /**
2075
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2076
- */
2077
- generateSlug?: boolean | null;
2078
- slug?: string | null;
2079
- /**
2080
- * Short summary for listing/cards
2081
- */
2082
- description?: string | null;
2083
- /**
2084
- * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
2085
- */
2086
- image?: (string | null) | Image;
2087
- /**
2088
- * Optional parent category used for hierarchy and breadcrumbs.
2089
- */
2090
- parent?: (string | null) | VideoCategory;
2091
- /**
2092
- * Optional #RRGGBB hex color for taxonomy badges or filter UI. This does not replace the representative image.
2093
- */
2094
- color?: string | null;
2095
2082
  updatedAt: string;
2096
2083
  createdAt: string;
2097
2084
  deletedAt?: string | null;
2098
2085
  }
2099
2086
  /**
2100
2087
  * This interface was referenced by `Config`'s JSON-Schema
2101
- * via the `definition` "video-tags".
2088
+ * via the `definition` "brand-logos".
2102
2089
  */
2103
- interface VideoTag {
2090
+ interface BrandLogo {
2104
2091
  id: string;
2105
- _order?: string | null;
2106
2092
  tenant?: (string | null) | Tenant;
2107
- title?: string | null;
2108
2093
  /**
2109
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2110
- */
2111
- generateSlug?: boolean | null;
2112
- slug?: string | null;
2113
- /**
2114
- * Short summary for listing/cards
2115
- */
2116
- description?: string | null;
2117
- /**
2118
- * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
2094
+ * Describe the image. Used for users who cannot see it, screen readers, and search/share previews.
2119
2095
  */
2120
- image?: (string | null) | Image;
2096
+ alt?: string | null;
2121
2097
  /**
2122
- * Optional #RRGGBB hex color for taxonomy badges or filter UI. This does not replace the representative image.
2098
+ * Low quality image placeholder
2123
2099
  */
2124
- color?: string | null;
2100
+ lqip?: string | null;
2101
+ palette?: {
2102
+ vibrant?: string | null;
2103
+ muted?: string | null;
2104
+ darkVibrant?: string | null;
2105
+ darkMuted?: string | null;
2106
+ lightVibrant?: string | null;
2107
+ lightMuted?: string | null;
2108
+ };
2109
+ prefix?: string | null;
2125
2110
  updatedAt: string;
2126
2111
  createdAt: string;
2127
2112
  deletedAt?: string | null;
2113
+ url?: string | null;
2114
+ thumbnailURL?: string | null;
2115
+ filename?: string | null;
2116
+ mimeType?: string | null;
2117
+ filesize?: number | null;
2118
+ width?: number | null;
2119
+ height?: number | null;
2120
+ focalX?: number | null;
2121
+ focalY?: number | null;
2122
+ sizes?: {
2123
+ '16'?: {
2124
+ url?: string | null;
2125
+ width?: number | null;
2126
+ height?: number | null;
2127
+ mimeType?: string | null;
2128
+ filesize?: number | null;
2129
+ filename?: string | null;
2130
+ };
2131
+ '32'?: {
2132
+ url?: string | null;
2133
+ width?: number | null;
2134
+ height?: number | null;
2135
+ mimeType?: string | null;
2136
+ filesize?: number | null;
2137
+ filename?: string | null;
2138
+ };
2139
+ '64'?: {
2140
+ url?: string | null;
2141
+ width?: number | null;
2142
+ height?: number | null;
2143
+ mimeType?: string | null;
2144
+ filesize?: number | null;
2145
+ filename?: string | null;
2146
+ };
2147
+ '128'?: {
2148
+ url?: string | null;
2149
+ width?: number | null;
2150
+ height?: number | null;
2151
+ mimeType?: string | null;
2152
+ filesize?: number | null;
2153
+ filename?: string | null;
2154
+ };
2155
+ '180'?: {
2156
+ url?: string | null;
2157
+ width?: number | null;
2158
+ height?: number | null;
2159
+ mimeType?: string | null;
2160
+ filesize?: number | null;
2161
+ filename?: string | null;
2162
+ };
2163
+ '192'?: {
2164
+ url?: string | null;
2165
+ width?: number | null;
2166
+ height?: number | null;
2167
+ mimeType?: string | null;
2168
+ filesize?: number | null;
2169
+ filename?: string | null;
2170
+ };
2171
+ '512'?: {
2172
+ url?: string | null;
2173
+ width?: number | null;
2174
+ height?: number | null;
2175
+ mimeType?: string | null;
2176
+ filesize?: number | null;
2177
+ filename?: string | null;
2178
+ };
2179
+ };
2128
2180
  }
2129
2181
  /**
2130
2182
  * This interface was referenced by `Config`'s JSON-Schema
2131
- * via the `definition` "product-variants".
2183
+ * via the `definition` "shipping-policies".
2132
2184
  */
2133
- interface ProductVariant {
2185
+ interface ShippingPolicy {
2134
2186
  id: string;
2135
- '_product-variants_variants_order'?: string | null;
2136
2187
  _order?: string | null;
2137
2188
  tenant?: (string | null) | Tenant;
2189
+ displayLabel?: string | null;
2138
2190
  /**
2139
- * Parent product for this variant. It cannot be moved to another product after creation.
2140
- */
2141
- product: string | Product;
2142
- /**
2143
- * Leave blank to auto-generate from option values. Manual display labels are preserved.
2191
+ * e.g. Standard shipping, Large items
2144
2192
  */
2145
2193
  title?: string | null;
2146
- thumbnail?: (string | null) | Image;
2147
- images?: (string | Image)[] | null;
2148
- /**
2149
- * Variant-specific SKU
2150
- */
2151
- sku?: string | null;
2152
- /**
2153
- * Selling price (KRW)
2154
- */
2155
- price?: number | null;
2156
- /**
2157
- * Original price before discount
2158
- */
2159
- compareAtPrice?: number | null;
2160
- /**
2161
- * Sell without tracking inventory
2162
- */
2163
- isUnlimited?: boolean | null;
2164
- /**
2165
- * Tracked inventory. Available quantity is stock - reservedStock; isUnlimited bypasses stock tracking.
2166
- */
2167
- stock?: number | null;
2168
2194
  /**
2169
- * Server-owned reserved stock derived from held inventory-reservations. Only payment, cancellation, delivery, and inventory reservation reconcile paths update it.
2195
+ * Amount in KRW (won)
2170
2196
  */
2171
- reservedStock?: number | null;
2197
+ baseAmount?: number | null;
2172
2198
  /**
2173
- * Variant-specific barcode
2199
+ * Amount in KRW (won)
2174
2200
  */
2175
- barcode?: string | null;
2201
+ freeShippingMinAmount?: number | null;
2176
2202
  /**
2177
- * Variant-specific integer weight in grams. For example, enter 2500 for 2.5 kg.
2203
+ * Amount in KRW (won)
2178
2204
  */
2179
- weight?: number | null;
2205
+ jejuExtraAmount?: number | null;
2180
2206
  /**
2181
- * Enable for physical variants that require shipping.
2207
+ * Amount in KRW (won)
2182
2208
  */
2183
- requiresShipping?: boolean | null;
2209
+ remoteAreaExtraAmount?: number | null;
2184
2210
  /**
2185
- * External system ID
2211
+ * Short summary for listing/cards
2186
2212
  */
2187
- externalId?: string | null;
2213
+ description?: string | null;
2188
2214
  /**
2189
- * Option value combination for this variant (e.g. Black + S)
2215
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
2190
2216
  */
2191
- optionValues?: (string | ProductOptionValue)[] | null;
2217
+ generateSlug?: boolean | null;
2218
+ slug?: string | null;
2192
2219
  /**
2193
- * Internal unique key for the variant option combination. Products without options use __default__; temporary invalid states use the __invalid__: prefix.
2220
+ * Estimated delivery days
2194
2221
  */
2195
- optionKey?: string | null;
2222
+ estimatedDays?: number | null;
2196
2223
  isActive?: boolean | null;
2224
+ isDefault?: boolean | null;
2197
2225
  metadata?: {
2198
2226
  [k: string]: unknown;
2199
2227
  } | unknown[] | string | number | boolean | null;
@@ -2203,42 +2231,173 @@ interface ProductVariant {
2203
2231
  }
2204
2232
  /**
2205
2233
  * This interface was referenced by `Config`'s JSON-Schema
2206
- * via the `definition` "product-option-values".
2234
+ * via the `definition` "product-collection-items".
2207
2235
  */
2208
- interface ProductOptionValue {
2236
+ interface ProductCollectionItem {
2209
2237
  id: string;
2210
- '_product-option-values_values_order'?: string | null;
2238
+ '_product-collection-items_items_order'?: string | null;
2211
2239
  _order?: string | null;
2212
2240
  tenant?: (string | null) | Tenant;
2213
2241
  /**
2214
- * Parent option for this value. It cannot be moved to another option after creation.
2242
+ * Product collection for this membership. It cannot be moved to another collection after creation.
2215
2243
  */
2216
- option: string | ProductOption;
2217
- displayLabel?: string | null;
2244
+ collection: string | ProductCollection;
2218
2245
  /**
2219
- * Editable option-value display label for Admin and storefront copy. Changing it after creation does not change the public slug. (e.g. Black, S)
2246
+ * Product shown in this collection. Its display order inside the collection is managed by dragging this membership row.
2220
2247
  */
2221
- value: string;
2248
+ product: string | Product;
2249
+ updatedAt: string;
2250
+ createdAt: string;
2251
+ }
2252
+ /**
2253
+ * Curated product grouping for campaigns, recommendations, and merchandising.
2254
+ *
2255
+ * This interface was referenced by `Config`'s JSON-Schema
2256
+ * via the `definition` "product-collections".
2257
+ */
2258
+ interface ProductCollection {
2259
+ id: string;
2260
+ _order?: string | null;
2261
+ tenant?: (string | null) | Tenant;
2262
+ title?: string | null;
2263
+ /**
2264
+ * Secondary display line shown in cards, listings, and detail headers.
2265
+ */
2266
+ subtitle?: string | null;
2267
+ /**
2268
+ * Short summary for listing/cards
2269
+ */
2270
+ description?: string | null;
2271
+ content?: {
2272
+ root: {
2273
+ type: string;
2274
+ children: {
2275
+ type: any;
2276
+ version: number;
2277
+ [k: string]: unknown;
2278
+ }[];
2279
+ direction: ('ltr' | 'rtl') | null;
2280
+ format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
2281
+ indent: number;
2282
+ version: number;
2283
+ };
2284
+ [k: string]: unknown;
2285
+ } | null;
2286
+ images?: (string | Image)[] | null;
2222
2287
  /**
2223
- * Hex color swatch for this option value (for example #111111)
2288
+ * Collection item memberships. Public collections include only published products, and display order follows the dragged membership row order.
2224
2289
  */
2225
- swatchColor?: string | null;
2290
+ items?: {
2291
+ docs?: (string | ProductCollectionItem)[];
2292
+ hasNextPage?: boolean;
2293
+ totalDocs?: number;
2294
+ };
2295
+ seo?: {
2296
+ /**
2297
+ * Search result title (falls back to document title)
2298
+ */
2299
+ title?: string | null;
2300
+ /**
2301
+ * Search result description
2302
+ */
2303
+ description?: string | null;
2304
+ /**
2305
+ * Block search engine indexing
2306
+ */
2307
+ noIndex?: boolean | null;
2308
+ /**
2309
+ * Canonical URL (prevents duplicate content)
2310
+ */
2311
+ canonical?: string | null;
2312
+ openGraph?: {
2313
+ /**
2314
+ * OG title (falls back to seo.title)
2315
+ */
2316
+ title?: string | null;
2317
+ /**
2318
+ * OG description (falls back to seo.description)
2319
+ */
2320
+ description?: string | null;
2321
+ /**
2322
+ * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
2323
+ */
2324
+ image?: (string | null) | Image;
2325
+ };
2326
+ };
2327
+ thumbnail?: (string | null) | Image;
2226
2328
  /**
2227
2329
  * When enabled, the slug will auto-generate from the title field on save and autosave.
2228
2330
  */
2229
2331
  generateSlug?: boolean | null;
2332
+ slug?: string | null;
2333
+ status?: ('draft' | 'published' | 'archived') | null;
2334
+ isFeatured?: boolean | null;
2335
+ publishedAt?: string | null;
2336
+ metadata?: {
2337
+ [k: string]: unknown;
2338
+ } | unknown[] | string | number | boolean | null;
2339
+ updatedAt: string;
2340
+ createdAt: string;
2341
+ deletedAt?: string | null;
2342
+ }
2343
+ /**
2344
+ * This interface was referenced by `Config`'s JSON-Schema
2345
+ * via the `definition` "transactions".
2346
+ */
2347
+ interface Transaction {
2348
+ id: string;
2349
+ tenant?: (string | null) | Tenant;
2350
+ _title?: string | null;
2351
+ type: 'payment' | 'refund';
2352
+ status: 'pending' | 'paid' | 'failed' | 'canceled' | 'refunded';
2353
+ order: string | Order;
2354
+ amount?: number | null;
2230
2355
  /**
2231
- * Compatibility URL token generated from the option-value label on create. It is fixed after creation.
2356
+ * Payment method snapshot returned by the provider. Not edited directly.
2232
2357
  */
2233
- slug: string;
2358
+ paymentMethod?: string | null;
2234
2359
  /**
2235
- * Representative image for this option value. Listing group media uses variant media first, then option-value media, and finally product media.
2360
+ * Installment months (0 = lump sum)
2236
2361
  */
2237
- thumbnail?: (string | null) | Image;
2362
+ installmentMonths?: number | null;
2363
+ approvedAt?: string | null;
2364
+ receiptUrl?: string | null;
2365
+ pgPaymentId?: string | null;
2366
+ pgOrderId?: string | null;
2367
+ providerEventId?: string | null;
2368
+ providerStatus?: string | null;
2369
+ confirmedAmount?: number | null;
2370
+ confirmedCurrency?: string | null;
2371
+ confirmedAt?: string | null;
2372
+ confirmationSource?: ('provider_webhook' | 'provider_lookup' | 'provider_api_confirm' | 'manual_server') | null;
2373
+ cashReceipt?: {
2374
+ issuanceType?: ('none' | 'personal' | 'business') | null;
2375
+ /**
2376
+ * Personal: phone or cash receipt card number / Business: business registration number
2377
+ */
2378
+ registrationNumber?: string | null;
2379
+ issueNumber?: string | null;
2380
+ issuedAt?: string | null;
2381
+ };
2382
+ cardInfo?: {
2383
+ brand?: string | null;
2384
+ last4?: string | null;
2385
+ expMonth?: number | null;
2386
+ expYear?: number | null;
2387
+ issuerCode?: string | null;
2388
+ type?: ('credit' | 'debit' | 'gift') | null;
2389
+ owner?: string | null;
2390
+ };
2391
+ failureCode?: string | null;
2392
+ failureMessage?: string | null;
2238
2393
  /**
2239
- * Reusable supporting images for this option value; used after variant media is missing, then followed by product media.
2394
+ * Payment gateway (e.g. toss, stripe)
2240
2395
  */
2241
- images?: (string | Image)[] | null;
2396
+ pgProvider?: string | null;
2397
+ /**
2398
+ * Legal retention deadline (5 years, Electronic Financial Transactions Act)
2399
+ */
2400
+ retainUntil?: string | null;
2242
2401
  metadata?: {
2243
2402
  [k: string]: unknown;
2244
2403
  } | unknown[] | string | number | boolean | null;
@@ -2248,1093 +2407,1095 @@ interface ProductOptionValue {
2248
2407
  }
2249
2408
  /**
2250
2409
  * This interface was referenced by `Config`'s JSON-Schema
2251
- * via the `definition` "product-options".
2410
+ * via the `definition` "fulfillments".
2252
2411
  */
2253
- interface ProductOption {
2412
+ interface Fulfillment {
2254
2413
  id: string;
2255
- '_product-options_options_order'?: string | null;
2256
- _order?: string | null;
2257
2414
  tenant?: (string | null) | Tenant;
2415
+ order: string | Order;
2416
+ status: 'pending' | 'packed' | 'shipped' | 'delivered' | 'failed';
2258
2417
  /**
2259
- * Parent product for this option. It cannot be moved to another product after creation.
2260
- */
2261
- product: string | Product;
2262
- /**
2263
- * Editable option display name for Admin and storefront copy. Changing it after creation does not change the public slug. (e.g. Color, Size)
2418
+ * Carrier name (e.g. CJ Logistics, FedEx)
2264
2419
  */
2265
- title: string;
2420
+ carrier?: string | null;
2266
2421
  /**
2267
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2422
+ * Carrier tracking number. Used as input for the derived trackingUrl.
2268
2423
  */
2269
- generateSlug?: boolean | null;
2424
+ trackingNumber?: string | null;
2270
2425
  /**
2271
- * Compatibility URL token generated from the option name on create. It is fixed after creation.
2426
+ * Tracking URL (auto-derived from carrier + trackingNumber)
2272
2427
  */
2273
- slug: string;
2274
- values?: {
2275
- docs?: (string | ProductOptionValue)[];
2428
+ trackingUrl?: string | null;
2429
+ packedAt?: string | null;
2430
+ shippedAt?: string | null;
2431
+ deliveredAt?: string | null;
2432
+ items?: {
2433
+ docs?: (string | FulfillmentItem)[];
2276
2434
  hasNextPage?: boolean;
2277
2435
  totalDocs?: number;
2278
2436
  };
2437
+ /**
2438
+ * Internal fulfillment note. Not shown directly to customers.
2439
+ */
2440
+ adminNotes?: string | null;
2441
+ metadata?: {
2442
+ [k: string]: unknown;
2443
+ } | unknown[] | string | number | boolean | null;
2279
2444
  updatedAt: string;
2280
2445
  createdAt: string;
2281
2446
  deletedAt?: string | null;
2282
2447
  }
2283
2448
  /**
2284
- * Product categories are a hierarchical taxonomy for navigation and grouping.
2285
- *
2286
2449
  * This interface was referenced by `Config`'s JSON-Schema
2287
- * via the `definition` "product-categories".
2450
+ * via the `definition` "fulfillment-items".
2288
2451
  */
2289
- interface ProductCategory {
2452
+ interface FulfillmentItem {
2290
2453
  id: string;
2291
- _order?: string | null;
2292
2454
  tenant?: (string | null) | Tenant;
2293
- title?: string | null;
2455
+ fulfillment: string | Fulfillment;
2456
+ orderItem: string | OrderItem;
2457
+ quantity: number;
2458
+ updatedAt: string;
2459
+ createdAt: string;
2460
+ deletedAt?: string | null;
2461
+ }
2462
+ /**
2463
+ * This interface was referenced by `Config`'s JSON-Schema
2464
+ * via the `definition` "returns".
2465
+ */
2466
+ interface Return {
2467
+ id: string;
2468
+ tenant?: (string | null) | Tenant;
2469
+ returnNumber?: string | null;
2470
+ order: string | Order;
2471
+ type: 'refund' | 'exchange';
2472
+ /**
2473
+ * New order created for exchange
2474
+ */
2475
+ exchangeOrder?: (string | null) | Order;
2476
+ status: 'requested' | 'processing' | 'approved' | 'rejected' | 'completed';
2477
+ /**
2478
+ * Reason category for the return or refund request. Used for reporting and operations.
2479
+ */
2480
+ reason?: ('change_of_mind' | 'defective' | 'wrong_delivery' | 'damaged' | 'other') | null;
2294
2481
  /**
2295
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2482
+ * Detailed return reason
2296
2483
  */
2297
- generateSlug?: boolean | null;
2298
- slug?: string | null;
2484
+ reasonDetail?: string | null;
2485
+ items?: {
2486
+ docs?: (string | ReturnItem)[];
2487
+ hasNextPage?: boolean;
2488
+ totalDocs?: number;
2489
+ };
2299
2490
  /**
2300
- * Short summary for listing/cards
2491
+ * Internal return-processing note. Not shown directly to customers.
2301
2492
  */
2302
- description?: string | null;
2493
+ adminNotes?: string | null;
2494
+ completedAt?: string | null;
2303
2495
  /**
2304
- * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
2496
+ * Refund receipt URL
2305
2497
  */
2306
- image?: (string | null) | Image;
2498
+ refundReceiptUrl?: string | null;
2499
+ refundAmount: number;
2307
2500
  /**
2308
- * Optional parent category used for hierarchy and breadcrumbs.
2501
+ * Return shipping fee deducted from refundAmount
2309
2502
  */
2310
- parent?: (string | null) | ProductCategory;
2503
+ returnShippingFee?: number | null;
2311
2504
  /**
2312
- * Optional #RRGGBB hex color for taxonomy badges or filter UI. This does not replace the representative image.
2505
+ * Exchange balance (positive: extra charge, negative: extra refund)
2313
2506
  */
2314
- color?: string | null;
2507
+ exchangeDifference?: number | null;
2508
+ metadata?: {
2509
+ [k: string]: unknown;
2510
+ } | unknown[] | string | number | boolean | null;
2315
2511
  updatedAt: string;
2316
2512
  createdAt: string;
2317
2513
  deletedAt?: string | null;
2318
2514
  }
2319
2515
  /**
2320
- * Product tags are flat labels for search and loose grouping.
2321
- *
2322
2516
  * This interface was referenced by `Config`'s JSON-Schema
2323
- * via the `definition` "product-tags".
2517
+ * via the `definition` "return-items".
2324
2518
  */
2325
- interface ProductTag {
2519
+ interface ReturnItem {
2326
2520
  id: string;
2327
- _order?: string | null;
2328
2521
  tenant?: (string | null) | Tenant;
2329
- title?: string | null;
2330
- /**
2331
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2332
- */
2333
- generateSlug?: boolean | null;
2334
- slug?: string | null;
2522
+ return: string | Return;
2523
+ order: string | Order;
2524
+ status: 'requested' | 'processing' | 'approved' | 'rejected' | 'completed';
2525
+ orderItem: string | OrderItem;
2526
+ product: string | Product;
2527
+ variant?: (string | null) | ProductVariant;
2335
2528
  /**
2336
- * Short summary for listing/cards
2529
+ * Quantity fixed when the return item is created. It cannot be edited after create to protect refund/restock calculations.
2337
2530
  */
2338
- description?: string | null;
2531
+ quantity: number;
2532
+ restockAction: 'return_to_stock' | 'discard';
2339
2533
  /**
2340
- * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
2534
+ * Restocking fee for this line (deducted from line refund)
2341
2535
  */
2342
- image?: (string | null) | Image;
2536
+ restockingFee?: number | null;
2537
+ productTitle?: string | null;
2343
2538
  updatedAt: string;
2344
2539
  createdAt: string;
2345
2540
  deletedAt?: string | null;
2346
2541
  }
2347
2542
  /**
2348
2543
  * This interface was referenced by `Config`'s JSON-Schema
2349
- * via the `definition` "brands".
2544
+ * via the `definition` "api-keys".
2350
2545
  */
2351
- interface Brand {
2546
+ interface ApiKey {
2352
2547
  id: string;
2353
- _order?: string | null;
2354
- tenant?: (string | null) | Tenant;
2548
+ tenant: string | Tenant;
2355
2549
  name: string;
2550
+ secretHash: string;
2356
2551
  /**
2357
- * Short summary for listing/cards
2552
+ * Key prefix (e.g. sk01_ab12cd3)
2358
2553
  */
2359
- description?: string | null;
2360
- content?: {
2361
- root: {
2362
- type: string;
2363
- children: {
2364
- type: any;
2365
- version: number;
2366
- [k: string]: unknown;
2367
- }[];
2368
- direction: ('ltr' | 'rtl') | null;
2369
- format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
2370
- indent: number;
2371
- version: number;
2372
- };
2373
- [k: string]: unknown;
2374
- } | null;
2554
+ displayPrefix: string;
2375
2555
  /**
2376
- * Primary brand logo
2556
+ * Trailing characters used to identify the key. The raw secret key is not stored or displayed.
2377
2557
  */
2378
- logo?: (string | null) | BrandLogo;
2558
+ displaySuffix: string;
2379
2559
  /**
2380
- * Logo for dark mode (optional)
2560
+ * Capability scopes. Default is read+write; webhook dispatch requires webhook, analytics writes require analytics.
2381
2561
  */
2382
- logoDark?: (string | null) | BrandLogo;
2562
+ scopes?: ('read' | 'write' | 'webhook' | 'analytics' | 'super-admin')[] | null;
2383
2563
  /**
2384
- * Logo mark / Icon (optional)
2564
+ * User who issued the key. Read-only provenance for issuance audit.
2385
2565
  */
2386
- logomark?: (string | null) | BrandLogo;
2566
+ createdBy?: (string | null) | User;
2387
2567
  /**
2388
- * Brand official website URL
2568
+ * IP address of the key creation request. Privacy-bearing security audit metadata.
2389
2569
  */
2390
- website?: string | null;
2391
- seo?: {
2392
- /**
2393
- * Search result title (falls back to document title)
2394
- */
2395
- title?: string | null;
2396
- /**
2397
- * Search result description
2398
- */
2399
- description?: string | null;
2400
- /**
2401
- * Block search engine indexing
2402
- */
2403
- noIndex?: boolean | null;
2404
- /**
2405
- * Canonical URL (prevents duplicate content)
2406
- */
2407
- canonical?: string | null;
2408
- openGraph?: {
2409
- /**
2410
- * OG title (falls back to seo.title)
2411
- */
2412
- title?: string | null;
2413
- /**
2414
- * OG description (falls back to seo.description)
2415
- */
2416
- description?: string | null;
2417
- /**
2418
- * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
2419
- */
2420
- image?: (string | null) | BrandLogo;
2421
- };
2422
- };
2570
+ createdByIp?: string | null;
2571
+ lastUsedAt?: string | null;
2423
2572
  /**
2424
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2573
+ * Last IP address that used the key. Privacy-bearing audit value for abuse investigation.
2425
2574
  */
2426
- generateSlug?: boolean | null;
2427
- slug?: string | null;
2428
- status?: ('draft' | 'published' | 'archived') | null;
2429
- isFeatured?: boolean | null;
2430
- publishedAt?: string | null;
2431
- metadata?: {
2432
- [k: string]: unknown;
2433
- } | unknown[] | string | number | boolean | null;
2434
- updatedAt: string;
2435
- createdAt: string;
2436
- deletedAt?: string | null;
2437
- }
2438
- /**
2439
- * This interface was referenced by `Config`'s JSON-Schema
2440
- * via the `definition` "brand-logos".
2441
- */
2442
- interface BrandLogo {
2443
- id: string;
2444
- tenant?: (string | null) | Tenant;
2575
+ lastUsedIp?: string | null;
2576
+ revokedAt?: string | null;
2445
2577
  /**
2446
- * Describe the image. Used for users who cannot see it, screen readers, and search/share previews.
2578
+ * User who revoked the key. Read-only provenance for revocation audit.
2447
2579
  */
2448
- alt?: string | null;
2580
+ revokedBy?: (string | null) | User;
2449
2581
  /**
2450
- * Low quality image placeholder
2582
+ * Optional expiration. Empty = never expires.
2451
2583
  */
2452
- lqip?: string | null;
2453
- palette?: {
2454
- vibrant?: string | null;
2455
- muted?: string | null;
2456
- darkVibrant?: string | null;
2457
- darkMuted?: string | null;
2458
- lightVibrant?: string | null;
2459
- lightMuted?: string | null;
2460
- };
2461
- prefix?: string | null;
2584
+ expiresAt?: string | null;
2462
2585
  updatedAt: string;
2463
2586
  createdAt: string;
2464
2587
  deletedAt?: string | null;
2465
- url?: string | null;
2466
- thumbnailURL?: string | null;
2467
- filename?: string | null;
2468
- mimeType?: string | null;
2469
- filesize?: number | null;
2470
- width?: number | null;
2471
- height?: number | null;
2472
- focalX?: number | null;
2473
- focalY?: number | null;
2474
- sizes?: {
2475
- '16'?: {
2476
- url?: string | null;
2477
- width?: number | null;
2478
- height?: number | null;
2479
- mimeType?: string | null;
2480
- filesize?: number | null;
2481
- filename?: string | null;
2482
- };
2483
- '32'?: {
2484
- url?: string | null;
2485
- width?: number | null;
2486
- height?: number | null;
2487
- mimeType?: string | null;
2488
- filesize?: number | null;
2489
- filename?: string | null;
2490
- };
2491
- '64'?: {
2492
- url?: string | null;
2493
- width?: number | null;
2494
- height?: number | null;
2495
- mimeType?: string | null;
2496
- filesize?: number | null;
2497
- filename?: string | null;
2498
- };
2499
- '128'?: {
2500
- url?: string | null;
2501
- width?: number | null;
2502
- height?: number | null;
2503
- mimeType?: string | null;
2504
- filesize?: number | null;
2505
- filename?: string | null;
2506
- };
2507
- '180'?: {
2508
- url?: string | null;
2509
- width?: number | null;
2510
- height?: number | null;
2511
- mimeType?: string | null;
2512
- filesize?: number | null;
2513
- filename?: string | null;
2514
- };
2515
- '192'?: {
2516
- url?: string | null;
2517
- width?: number | null;
2518
- height?: number | null;
2519
- mimeType?: string | null;
2520
- filesize?: number | null;
2521
- filename?: string | null;
2522
- };
2523
- '512'?: {
2524
- url?: string | null;
2525
- width?: number | null;
2526
- height?: number | null;
2527
- mimeType?: string | null;
2528
- filesize?: number | null;
2529
- filename?: string | null;
2530
- };
2531
- };
2532
2588
  }
2533
2589
  /**
2534
2590
  * This interface was referenced by `Config`'s JSON-Schema
2535
- * via the `definition` "shipping-policies".
2591
+ * via the `definition` "personal-access-tokens".
2536
2592
  */
2537
- interface ShippingPolicy {
2593
+ interface PersonalAccessToken {
2538
2594
  id: string;
2539
- _order?: string | null;
2540
- tenant?: (string | null) | Tenant;
2541
- displayLabel?: string | null;
2595
+ user: string | User;
2542
2596
  /**
2543
- * e.g. Standard shipping, Large items
2597
+ * e.g. "CLI: MacBook Pro (darwin)", "GitHub Actions"
2544
2598
  */
2545
- title?: string | null;
2599
+ name: string;
2600
+ secretHash: string;
2546
2601
  /**
2547
- * Amount in KRW (won)
2602
+ * PAT prefix. Display-only token type marker, not the raw token.
2548
2603
  */
2549
- baseAmount?: number | null;
2604
+ displayPrefix: string;
2550
2605
  /**
2551
- * Amount in KRW (won)
2606
+ * Trailing characters used to identify the PAT. The raw token is not shown again.
2552
2607
  */
2553
- freeShippingMinAmount?: number | null;
2608
+ displaySuffix: string;
2554
2609
  /**
2555
- * Amount in KRW (won)
2610
+ * Default tenant ID for CLI operations. Set via `01 tenant use <name>`.
2556
2611
  */
2557
- jejuExtraAmount?: number | null;
2612
+ defaultTenant?: string | null;
2558
2613
  /**
2559
- * Amount in KRW (won)
2614
+ * IP address of the PAT creation request. Privacy-bearing security audit metadata.
2560
2615
  */
2561
- remoteAreaExtraAmount?: number | null;
2616
+ createdByIp?: string | null;
2617
+ lastUsedAt?: string | null;
2562
2618
  /**
2563
- * Short summary for listing/cards
2619
+ * Last IP address that used the PAT. Privacy-bearing audit value for abuse investigation.
2564
2620
  */
2565
- description?: string | null;
2621
+ lastUsedIp?: string | null;
2622
+ revokedAt?: string | null;
2566
2623
  /**
2567
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2624
+ * User who revoked the PAT. Read-only provenance for revocation audit.
2568
2625
  */
2569
- generateSlug?: boolean | null;
2570
- slug?: string | null;
2626
+ revokedBy?: (string | null) | User;
2571
2627
  /**
2572
- * Estimated delivery days
2628
+ * PATs expire after 90 days by default.
2573
2629
  */
2574
- estimatedDays?: number | null;
2575
- isActive?: boolean | null;
2576
- isDefault?: boolean | null;
2577
- metadata?: {
2578
- [k: string]: unknown;
2579
- } | unknown[] | string | number | boolean | null;
2630
+ expiresAt?: string | null;
2580
2631
  updatedAt: string;
2581
2632
  createdAt: string;
2582
2633
  deletedAt?: string | null;
2583
2634
  }
2584
2635
  /**
2585
2636
  * This interface was referenced by `Config`'s JSON-Schema
2586
- * via the `definition` "product-collection-items".
2637
+ * via the `definition` "audit-logs".
2587
2638
  */
2588
- interface ProductCollectionItem {
2639
+ interface AuditLog {
2589
2640
  id: string;
2590
- '_product-collection-items_items_order'?: string | null;
2591
- _order?: string | null;
2592
2641
  tenant?: (string | null) | Tenant;
2593
2642
  /**
2594
- * Product collection for this membership. It cannot be moved to another collection after creation.
2643
+ * Event type
2595
2644
  */
2596
- collection: string | ProductCollection;
2645
+ eventType: string;
2597
2646
  /**
2598
- * Product shown in this collection. Its display order inside the collection is managed by dragging this membership row.
2647
+ * Actor ID. May refer to a user or service, and can be empty for system actions.
2599
2648
  */
2600
- product: string | Product;
2649
+ actorId?: string | null;
2650
+ /**
2651
+ * Detailed audit event payload. May contain sensitive security, billing, or provider context.
2652
+ */
2653
+ payload?: {
2654
+ [k: string]: unknown;
2655
+ } | unknown[] | string | number | boolean | null;
2601
2656
  updatedAt: string;
2602
2657
  createdAt: string;
2603
2658
  }
2604
2659
  /**
2605
- * Curated product grouping for campaigns, recommendations, and merchandising.
2606
- *
2607
2660
  * This interface was referenced by `Config`'s JSON-Schema
2608
- * via the `definition` "product-collections".
2661
+ * via the `definition` "webhook-events".
2609
2662
  */
2610
- interface ProductCollection {
2663
+ interface WebhookEvent {
2611
2664
  id: string;
2612
- _order?: string | null;
2613
2665
  tenant?: (string | null) | Tenant;
2614
- title?: string | null;
2615
- /**
2616
- * Secondary display line shown in cards, listings, and detail headers.
2617
- */
2618
- subtitle?: string | null;
2619
2666
  /**
2620
- * Short summary for listing/cards
2667
+ * Provider
2621
2668
  */
2622
- description?: string | null;
2623
- content?: {
2624
- root: {
2625
- type: string;
2626
- children: {
2627
- type: any;
2628
- version: number;
2629
- [k: string]: unknown;
2630
- }[];
2631
- direction: ('ltr' | 'rtl') | null;
2632
- format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
2633
- indent: number;
2634
- version: number;
2635
- };
2636
- [k: string]: unknown;
2637
- } | null;
2638
- images?: (string | Image)[] | null;
2669
+ provider: string;
2639
2670
  /**
2640
- * Collection item memberships. Public collections include only published products, and display order follows the dragged membership row order.
2671
+ * Provider-supplied event ID. Used with provider as the idempotency key for duplicate prevention.
2641
2672
  */
2642
- items?: {
2643
- docs?: (string | ProductCollectionItem)[];
2644
- hasNextPage?: boolean;
2645
- totalDocs?: number;
2646
- };
2647
- seo?: {
2648
- /**
2649
- * Search result title (falls back to document title)
2650
- */
2651
- title?: string | null;
2652
- /**
2653
- * Search result description
2654
- */
2655
- description?: string | null;
2656
- /**
2657
- * Block search engine indexing
2658
- */
2659
- noIndex?: boolean | null;
2660
- /**
2661
- * Canonical URL (prevents duplicate content)
2662
- */
2663
- canonical?: string | null;
2664
- openGraph?: {
2665
- /**
2666
- * OG title (falls back to seo.title)
2667
- */
2668
- title?: string | null;
2669
- /**
2670
- * OG description (falls back to seo.description)
2671
- */
2672
- description?: string | null;
2673
- /**
2674
- * OG / Twitter Card image (1200×630 recommended). Leaving this empty does not set it automatically from collection media.
2675
- */
2676
- image?: (string | null) | Image;
2677
- };
2678
- };
2679
- thumbnail?: (string | null) | Image;
2673
+ eventId: string;
2674
+ receivedAt?: string | null;
2680
2675
  /**
2681
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2676
+ * Raw provider event body. May contain sensitive security or payment context.
2682
2677
  */
2683
- generateSlug?: boolean | null;
2684
- slug?: string | null;
2685
- status?: ('draft' | 'published' | 'archived') | null;
2686
- isFeatured?: boolean | null;
2687
- publishedAt?: string | null;
2688
- metadata?: {
2678
+ payload?: {
2689
2679
  [k: string]: unknown;
2690
2680
  } | unknown[] | string | number | boolean | null;
2691
2681
  updatedAt: string;
2692
2682
  createdAt: string;
2693
- deletedAt?: string | null;
2694
2683
  }
2695
2684
  /**
2696
2685
  * This interface was referenced by `Config`'s JSON-Schema
2697
- * via the `definition` "orders".
2686
+ * via the `definition` "webhook-deliveries".
2698
2687
  */
2699
- interface Order {
2688
+ interface WebhookDelivery {
2700
2689
  id: string;
2701
2690
  tenant?: (string | null) | Tenant;
2702
- orderNumber: string;
2703
- cartToken?: string | null;
2704
- status: 'pending' | 'paid' | 'failed' | 'canceled' | 'refunded' | 'preparing' | 'shipped' | 'delivered' | 'confirmed' | 'return_requested' | 'return_processing' | 'returned';
2705
- totalAmount?: number | null;
2706
- discountCode?: string | null;
2707
- discountAmount?: number | null;
2708
2691
  /**
2709
- * Cumulative refunded amount
2692
+ * Active webhook endpoint used for this delivery attempt.
2710
2693
  */
2711
- refundedAmount?: number | null;
2694
+ webhookId?: (string | null) | Webhook;
2712
2695
  /**
2713
- * Shipping amount at time of order
2696
+ * Value sent to receivers as x-webhook-delivery-id.
2714
2697
  */
2715
- shippingAmount?: number | null;
2698
+ deliveryId?: string | null;
2699
+ attempt: number;
2716
2700
  /**
2717
- * Item subtotal (excl. shipping & discount)
2701
+ * Webhook delivery state. Updated by dispatcher and retry handling paths.
2718
2702
  */
2719
- subtotalAmount?: number | null;
2720
- taxAmount?: number | null;
2721
- source?: ('web' | 'app' | 'manual') | null;
2722
- currency?: string | null;
2703
+ status: 'queued' | 'success' | 'failed' | 'dead';
2723
2704
  /**
2724
- * Internal admin notes (not visible to customers)
2705
+ * Destination host with query string removed. Full URLs are not stored.
2725
2706
  */
2726
- adminNotes?: string | null;
2727
- cancelReason?: string | null;
2728
- canceledAt?: string | null;
2729
- completedAt?: string | null;
2707
+ endpointHost?: string | null;
2730
2708
  /**
2731
- * Note left by customer at checkout
2709
+ * HMAC hash of the endpoint URL with query string removed.
2732
2710
  */
2733
- customerNote?: string | null;
2734
- customer?: (string | null) | Customer;
2711
+ endpointUrlHash?: string | null;
2735
2712
  /**
2736
- * Customer info at the time of order
2713
+ * Collection that produced this delivery attempt.
2737
2714
  */
2738
- customerSnapshot?: {
2739
- name?: string | null;
2740
- email?: string | null;
2741
- phone?: string | null;
2742
- };
2743
- shippingAddress?: {
2744
- recipientName?: string | null;
2745
- phone?: string | null;
2746
- postalCode?: string | null;
2747
- address?: string | null;
2748
- detailAddress?: string | null;
2749
- deliveryMessage?: string | null;
2750
- };
2751
- billingAddress?: {
2752
- recipientName?: string | null;
2753
- businessRegistrationNumber?: string | null;
2754
- email?: string | null;
2755
- phone?: string | null;
2756
- address?: string | null;
2757
- };
2758
- items?: {
2759
- docs?: (string | OrderItem)[];
2760
- hasNextPage?: boolean;
2761
- totalDocs?: number;
2762
- };
2763
- transactions?: {
2764
- docs?: (string | Transaction)[];
2765
- hasNextPage?: boolean;
2766
- totalDocs?: number;
2767
- };
2768
- fulfillments?: {
2769
- docs?: (string | Fulfillment)[];
2770
- hasNextPage?: boolean;
2771
- totalDocs?: number;
2772
- };
2773
- returns?: {
2774
- docs?: (string | Return)[];
2775
- hasNextPage?: boolean;
2776
- totalDocs?: number;
2777
- };
2778
- metadata?: {
2779
- [k: string]: unknown;
2780
- } | unknown[] | string | number | boolean | null;
2781
- nextRefundSeq?: number | null;
2782
- nextCaptureSeq?: number | null;
2783
- nextVoidSeq?: number | null;
2715
+ collection?: string | null;
2716
+ /**
2717
+ * Operation that produced this delivery attempt.
2718
+ */
2719
+ operation?: string | null;
2720
+ /**
2721
+ * Path that produced the delivery attempt.
2722
+ */
2723
+ source?: ('registry' | 'retry_queue' | 'dlq_retry' | 'password_reset') | null;
2724
+ /**
2725
+ * HTTP status returned by the receiver.
2726
+ */
2727
+ statusCode?: number | null;
2728
+ /**
2729
+ * Delivery failure kind. Sensitive request body or headers are not stored.
2730
+ */
2731
+ errorKind?: string | null;
2732
+ /**
2733
+ * Truncated error message. Sensitive request body or headers are not stored.
2734
+ */
2735
+ errorMessage?: string | null;
2736
+ /**
2737
+ * Delivery attempt duration in milliseconds.
2738
+ */
2739
+ durationMs?: number | null;
2740
+ /**
2741
+ * Next scheduled retry time for a failed delivery.
2742
+ */
2743
+ nextRetryAt?: string | null;
2744
+ /**
2745
+ * Marks attempts produced by Redis retry or DLQ replay paths.
2746
+ */
2747
+ redelivery?: boolean | null;
2748
+ /**
2749
+ * Timestamp when the webhook request was dispatched to the endpoint.
2750
+ */
2751
+ dispatchedAt?: string | null;
2784
2752
  updatedAt: string;
2785
2753
  createdAt: string;
2786
- deletedAt?: string | null;
2787
2754
  }
2788
2755
  /**
2789
2756
  * This interface was referenced by `Config`'s JSON-Schema
2790
- * via the `definition` "customers".
2757
+ * via the `definition` "webhooks".
2791
2758
  */
2792
- interface Customer {
2759
+ interface Webhook {
2793
2760
  id: string;
2794
- _customers_customers_order?: string | null;
2795
- _order?: string | null;
2796
2761
  tenant?: (string | null) | Tenant;
2797
- name: string;
2798
- email?: string | null;
2799
- phone?: string | null;
2800
- groups?: (string | CustomerGroup)[] | null;
2801
- /**
2802
- * Internal notes (not visible to customers)
2803
- */
2804
- note?: string | null;
2805
- birthDate?: string | null;
2806
- gender?: ('male' | 'female' | 'other' | 'prefer_not_to_say') | null;
2807
- isGuest?: boolean | null;
2808
2762
  /**
2809
- * Authentication provider used at signup. Immutable account provenance after creation.
2763
+ * Webhook name
2810
2764
  */
2811
- authProvider?: ('local' | 'google' | 'apple' | 'kakao' | 'naver') | null;
2765
+ name: string;
2812
2766
  /**
2813
- * External provider user ID. Paired with authProvider to identify the linked account and not edited after creation.
2767
+ * Webhook endpoint HTTPS URL. Treat this endpoint as a recipient of sensitive workspace events.
2814
2768
  */
2815
- providerUserId?: string | null;
2816
- lastLoginAt?: string | null;
2769
+ url: string;
2817
2770
  /**
2818
- * Last password change timestamp (used for JWT revocation)
2771
+ * HMAC signing secret (encrypted at rest, never returned on read). Reveal or rotate in Admin.
2819
2772
  */
2820
- passwordChangedAt?: string | null;
2821
- orders?: {
2822
- docs?: (string | Order)[];
2823
- hasNextPage?: boolean;
2824
- totalDocs?: number;
2825
- };
2826
- addresses?: {
2827
- docs?: (string | CustomerAddress)[];
2828
- hasNextPage?: boolean;
2829
- totalDocs?: number;
2830
- };
2831
- defaultShippingAddress?: (string | null) | CustomerAddress;
2832
- defaultBillingAddress?: (string | null) | CustomerAddress;
2773
+ secret: string;
2833
2774
  /**
2834
- * Read-only counter maintained by order hooks for this customer's completed orders.
2775
+ * When the signing secret was first revealed to a tenant-admin (one time).
2835
2776
  */
2836
- totalOrderCount?: number | null;
2837
- lifetimeValue?: number | null;
2838
- firstOrderAt?: string | null;
2839
- lastOrderAt?: string | null;
2840
- profile?: {
2841
- docs?: (string | CustomerProfile)[];
2842
- hasNextPage?: boolean;
2843
- totalDocs?: number;
2844
- };
2777
+ secretRevealedAt?: string | null;
2845
2778
  /**
2846
- * Read-only counter maintained by hooks for community posts authored by this customer.
2779
+ * Last webhook signing secret rotation time.
2847
2780
  */
2848
- postCount?: number | null;
2781
+ secretRotatedAt?: string | null;
2849
2782
  /**
2850
- * Read-only counter maintained by hooks for community comments authored by this customer.
2783
+ * User who last rotated the webhook signing secret.
2851
2784
  */
2852
- commentCount?: number | null;
2785
+ secretRotatedBy?: (string | null) | User;
2853
2786
  /**
2854
- * Read-only counter maintained by hooks for community reactions made by this customer.
2787
+ * Collections to subscribe to. Leave empty to receive every supported collection event.
2855
2788
  */
2856
- reactionCount?: number | null;
2789
+ subscriptions?: {
2790
+ /**
2791
+ * Receives create/update events for this collection.
2792
+ */
2793
+ collection: 'tenant-metadata' | 'tenant-logos' | 'images' | 'products' | 'product-variants' | 'product-options' | 'product-option-values' | 'product-categories' | 'product-tags' | 'product-collections' | 'brands' | 'brand-logos' | 'orders' | 'order-items' | 'transactions' | 'fulfillments' | 'fulfillment-items' | 'returns' | 'return-items' | 'carts' | 'cart-items' | 'discounts' | 'shipping-policies' | 'shipping-zones' | 'customers' | 'customer-profiles' | 'customer-addresses' | 'playlists' | 'playlist-categories' | 'playlist-tags' | 'tracks' | 'track-categories' | 'track-tags' | 'galleries' | 'gallery-items' | 'gallery-categories' | 'gallery-tags' | 'links' | 'link-categories' | 'link-tags' | 'forms' | 'form-submissions' | 'articles' | 'article-authors' | 'article-categories' | 'article-tags' | 'documents' | 'document-categories' | 'document-types' | 'canvases' | 'canvas-node-types' | 'canvas-edge-types' | 'canvas-categories' | 'canvas-tags' | 'canvas-nodes' | 'canvas-edges' | 'videos' | 'video-categories' | 'video-tags' | 'live-streams' | 'posts' | 'comments' | 'reactions' | 'reaction-types' | 'bookmarks' | 'post-categories' | 'customer-profile-lists' | 'event-calendars' | 'events' | 'event-categories' | 'event-occurrences' | 'event-tags';
2794
+ id?: string | null;
2795
+ }[] | null;
2796
+ isActive?: boolean | null;
2797
+ lastDispatchedAt?: string | null;
2798
+ updatedAt: string;
2799
+ createdAt: string;
2800
+ deletedAt?: string | null;
2801
+ }
2802
+ /**
2803
+ * This interface was referenced by `Config`'s JSON-Schema
2804
+ * via the `definition` "tenant-metadata".
2805
+ */
2806
+ interface TenantMetadatum {
2807
+ id: string;
2808
+ tenant?: (string | null) | Tenant;
2809
+ siteInfo?: {
2810
+ /**
2811
+ * Site title (used in browser tab and SEO)
2812
+ */
2813
+ title?: string | null;
2814
+ /**
2815
+ * Site description (used for SEO and social media)
2816
+ */
2817
+ description?: string | null;
2818
+ /**
2819
+ * Comma-separated keywords for SEO
2820
+ */
2821
+ keywords?: string | null;
2822
+ /**
2823
+ * Site author or company name
2824
+ */
2825
+ author?: string | null;
2826
+ /**
2827
+ * Full site URL (e.g., https://example.com)
2828
+ */
2829
+ url?: string | null;
2830
+ };
2857
2831
  /**
2858
- * Marks a minor customer. When enabled, guardian consent fields are managed as compliance evidence.
2832
+ * Required by Korean e-commerce law
2859
2833
  */
2860
- isMinor?: boolean | null;
2861
- marketingConsent?: {
2862
- email?: {
2863
- isConsented?: boolean | null;
2864
- consentedAt?: string | null;
2865
- expiresAt?: string | null;
2866
- unsubscribedAt?: string | null;
2867
- };
2868
- sms?: {
2869
- isConsented?: boolean | null;
2870
- consentedAt?: string | null;
2871
- expiresAt?: string | null;
2872
- unsubscribedAt?: string | null;
2873
- };
2874
- push?: {
2875
- isConsented?: boolean | null;
2876
- consentedAt?: string | null;
2877
- expiresAt?: string | null;
2878
- unsubscribedAt?: string | null;
2879
- };
2834
+ businessInfo?: {
2835
+ businessRegistrationNumber?: string | null;
2836
+ businessName?: string | null;
2837
+ ceoName?: string | null;
2838
+ businessAddress?: string | null;
2839
+ businessEmail?: string | null;
2840
+ onlineSalesRegistrationNumber?: string | null;
2841
+ };
2842
+ branding?: {
2880
2843
  /**
2881
- * Channel through which consent was obtained (e.g. signup, checkout, import)
2844
+ * Primary logo
2882
2845
  */
2883
- consentSource?: string | null;
2846
+ logo?: (string | null) | TenantLogo;
2847
+ /**
2848
+ * Logo for dark mode (optional)
2849
+ */
2850
+ logoDark?: (string | null) | TenantLogo;
2851
+ /**
2852
+ * Logo mark / Icon (optional)
2853
+ */
2854
+ logomark?: (string | null) | TenantLogo;
2855
+ /**
2856
+ * Favicon (will be resized automatically)
2857
+ */
2858
+ favicon?: (string | null) | TenantLogo;
2859
+ /**
2860
+ * Theme color for mobile browsers (hex color)
2861
+ */
2862
+ themeColor?: string | null;
2863
+ };
2864
+ seo?: {
2865
+ /**
2866
+ * Robots meta tag (e.g., "index, follow" or "noindex, nofollow")
2867
+ */
2868
+ robots?: string | null;
2869
+ /**
2870
+ * Google Site Verification code
2871
+ */
2872
+ googleSiteVerification?: string | null;
2873
+ /**
2874
+ * Bing Site Verification code
2875
+ */
2876
+ bingSiteVerification?: string | null;
2877
+ /**
2878
+ * Naver Site Verification code
2879
+ */
2880
+ naverSiteVerification?: string | null;
2881
+ /**
2882
+ * Canonical URL (if different from site URL)
2883
+ */
2884
+ canonicalUrl?: string | null;
2885
+ };
2886
+ analytics?: {
2887
+ /**
2888
+ * Google Analytics ID (e.g., G-XXXXXXXXXX)
2889
+ */
2890
+ googleAnalyticsId?: string | null;
2891
+ /**
2892
+ * Google Tag Manager ID (e.g., GTM-XXXXXXX)
2893
+ */
2894
+ googleTagManagerId?: string | null;
2895
+ /**
2896
+ * Facebook Pixel ID
2897
+ */
2898
+ facebookPixelId?: string | null;
2899
+ /**
2900
+ * LinkedIn Partner ID
2901
+ */
2902
+ linkedInPartnerId?: string | null;
2903
+ };
2904
+ openGraph?: {
2905
+ /**
2906
+ * Open Graph title (falls back to site title)
2907
+ */
2908
+ ogTitle?: string | null;
2909
+ /**
2910
+ * Open Graph description (falls back to site description)
2911
+ */
2912
+ ogDescription?: string | null;
2913
+ /**
2914
+ * Open Graph image (1200x630 recommended)
2915
+ */
2916
+ ogImage?: (string | null) | Image;
2917
+ /**
2918
+ * Open Graph type
2919
+ */
2920
+ ogType?: ('website' | 'article' | 'product' | 'profile') | null;
2921
+ /**
2922
+ * Open Graph locale (e.g., ko_KR, en_US)
2923
+ */
2924
+ ogLocale?: string | null;
2925
+ };
2926
+ twitter?: {
2927
+ /**
2928
+ * Twitter card type
2929
+ */
2930
+ twitterCard?: ('summary' | 'summary_large_image' | 'app' | 'player') | null;
2931
+ /**
2932
+ * Twitter username for the site (e.g., @yoursite)
2933
+ */
2934
+ twitterSite?: string | null;
2935
+ /**
2936
+ * Twitter username for the content creator (e.g., @author)
2937
+ */
2938
+ twitterCreator?: string | null;
2939
+ /**
2940
+ * Twitter title (falls back to OG title or site title)
2941
+ */
2942
+ twitterTitle?: string | null;
2943
+ /**
2944
+ * Twitter description (falls back to OG or site description)
2945
+ */
2946
+ twitterDescription?: string | null;
2947
+ /**
2948
+ * Twitter card image (falls back to OG image)
2949
+ */
2950
+ twitterImage?: (string | null) | Image;
2884
2951
  };
2885
2952
  /**
2886
- * Guardian consent evidence for a minor customer. May contain guardian PII.
2953
+ * Reusable option name and value lists for the Product Editor. Up to 20 presets.
2887
2954
  */
2888
- guardianConsent?: {
2955
+ optionPresets?: {
2889
2956
  /**
2890
- * Whether guardian consent has been collected. Internal compliance marker for minor-customer handling.
2957
+ * Name to identify this preset (e.g. Basic Clothing Sizes)
2891
2958
  */
2892
- hasGuardianConsent?: boolean | null;
2959
+ name: string;
2960
+ /**
2961
+ * Options included in this preset. Up to 10.
2962
+ */
2963
+ options?: {
2964
+ /**
2965
+ * Option name (e.g. Color, Size)
2966
+ */
2967
+ title?: string | null;
2968
+ /**
2969
+ * Values for this option. Up to 30.
2970
+ */
2971
+ values?: {
2972
+ /**
2973
+ * Option value (e.g. Red, S)
2974
+ */
2975
+ value?: string | null;
2976
+ id?: string | null;
2977
+ }[] | null;
2978
+ id?: string | null;
2979
+ }[] | null;
2980
+ id?: string | null;
2981
+ }[] | null;
2982
+ pwa?: {
2893
2983
  /**
2894
- * Guardian name. Treat as guardian PII.
2984
+ * Short name for PWA (12 characters max)
2895
2985
  */
2896
- guardianName?: string | null;
2986
+ shortName?: string | null;
2897
2987
  /**
2898
- * Guardian phone number. Treat as guardian PII.
2988
+ * Background color for PWA splash screen
2899
2989
  */
2900
- guardianPhone?: string | null;
2990
+ backgroundColor?: string | null;
2901
2991
  /**
2902
- * Timestamp when guardian consent was recorded. Read-only audit evidence.
2992
+ * PWA display mode
2903
2993
  */
2904
- guardianConsentedAt?: string | null;
2994
+ display?: ('fullscreen' | 'standalone' | 'minimal-ui' | 'browser') | null;
2905
2995
  };
2906
- acceptsTos?: boolean | null;
2907
- tosVersion?: string | null;
2908
- /**
2909
- * Withdrawal reason (internal)
2910
- */
2911
- withdrawReason?: string | null;
2912
- withdrawnAt?: string | null;
2913
- /**
2914
- * Legal retention deadline. Retention cleanup or manual hard-delete paths may purge after this date.
2915
- */
2916
- retainUntil?: string | null;
2917
- anonymizedAt?: string | null;
2918
- hashedPassword?: string | null;
2919
- salt?: string | null;
2920
- resetPasswordToken?: string | null;
2921
- resetPasswordExpiresAt?: string | null;
2922
- loginAttemptCount?: number | null;
2923
- lockedUntil?: string | null;
2924
- /**
2925
- * Account suspension flag. Used with password/JWT revocation paths to block sessions.
2926
- */
2927
- isSuspended?: boolean | null;
2928
- metadata?: {
2929
- [k: string]: unknown;
2930
- } | unknown[] | string | number | boolean | null;
2931
2996
  updatedAt: string;
2932
2997
  createdAt: string;
2933
2998
  deletedAt?: string | null;
2934
- collection: 'customers';
2935
2999
  }
2936
3000
  /**
2937
3001
  * This interface was referenced by `Config`'s JSON-Schema
2938
- * via the `definition` "customer-groups".
3002
+ * via the `definition` "tenant-logos".
2939
3003
  */
2940
- interface CustomerGroup {
3004
+ interface TenantLogo {
2941
3005
  id: string;
2942
- _order?: string | null;
2943
3006
  tenant?: (string | null) | Tenant;
2944
- title?: string | null;
2945
- /**
2946
- * When enabled, the slug will auto-generate from the title field on save and autosave.
2947
- */
2948
- generateSlug?: boolean | null;
2949
- slug?: string | null;
2950
- /**
2951
- * Short summary for listing/cards
2952
- */
2953
- description?: string | null;
2954
3007
  /**
2955
- * Optional #RRGGBB display color for Admin surfaces.
2956
- */
2957
- color?: string | null;
2958
- image?: (string | null) | Image;
2959
- isActive?: boolean | null;
2960
- /**
2961
- * Show this group as a customer-facing membership badge. The group collection itself remains private.
2962
- */
2963
- customerVisible?: boolean | null;
2964
- /**
2965
- * Customer-facing label. Falls back to title when empty.
2966
- */
2967
- publicTitle?: string | null;
2968
- publicDescription?: string | null;
2969
- publicBenefits?: {
2970
- title?: string | null;
2971
- description?: string | null;
2972
- id?: string | null;
2973
- }[] | null;
2974
- /**
2975
- * Customer-facing badge color. Example: #2563eb
3008
+ * Describe the image. Used for users who cannot see it, screen readers, and search/share previews.
2976
3009
  */
2977
- badgeColor?: string | null;
2978
- badgeImage?: (string | null) | Image;
3010
+ alt?: string | null;
2979
3011
  /**
2980
- * Customer membership display order. Lower values appear first.
3012
+ * Low quality image placeholder
2981
3013
  */
2982
- displayOrder?: number | null;
2983
- metadata?: {
2984
- [k: string]: unknown;
2985
- } | unknown[] | string | number | boolean | null;
2986
- customers?: {
2987
- docs?: (string | Customer)[];
2988
- hasNextPage?: boolean;
2989
- totalDocs?: number;
3014
+ lqip?: string | null;
3015
+ palette?: {
3016
+ vibrant?: string | null;
3017
+ muted?: string | null;
3018
+ darkVibrant?: string | null;
3019
+ darkMuted?: string | null;
3020
+ lightVibrant?: string | null;
3021
+ lightMuted?: string | null;
2990
3022
  };
3023
+ prefix?: string | null;
2991
3024
  updatedAt: string;
2992
3025
  createdAt: string;
2993
3026
  deletedAt?: string | null;
3027
+ url?: string | null;
3028
+ thumbnailURL?: string | null;
3029
+ filename?: string | null;
3030
+ mimeType?: string | null;
3031
+ filesize?: number | null;
3032
+ width?: number | null;
3033
+ height?: number | null;
3034
+ focalX?: number | null;
3035
+ focalY?: number | null;
3036
+ sizes?: {
3037
+ '16'?: {
3038
+ url?: string | null;
3039
+ width?: number | null;
3040
+ height?: number | null;
3041
+ mimeType?: string | null;
3042
+ filesize?: number | null;
3043
+ filename?: string | null;
3044
+ };
3045
+ '32'?: {
3046
+ url?: string | null;
3047
+ width?: number | null;
3048
+ height?: number | null;
3049
+ mimeType?: string | null;
3050
+ filesize?: number | null;
3051
+ filename?: string | null;
3052
+ };
3053
+ '64'?: {
3054
+ url?: string | null;
3055
+ width?: number | null;
3056
+ height?: number | null;
3057
+ mimeType?: string | null;
3058
+ filesize?: number | null;
3059
+ filename?: string | null;
3060
+ };
3061
+ '128'?: {
3062
+ url?: string | null;
3063
+ width?: number | null;
3064
+ height?: number | null;
3065
+ mimeType?: string | null;
3066
+ filesize?: number | null;
3067
+ filename?: string | null;
3068
+ };
3069
+ '180'?: {
3070
+ url?: string | null;
3071
+ width?: number | null;
3072
+ height?: number | null;
3073
+ mimeType?: string | null;
3074
+ filesize?: number | null;
3075
+ filename?: string | null;
3076
+ };
3077
+ '192'?: {
3078
+ url?: string | null;
3079
+ width?: number | null;
3080
+ height?: number | null;
3081
+ mimeType?: string | null;
3082
+ filesize?: number | null;
3083
+ filename?: string | null;
3084
+ };
3085
+ '512'?: {
3086
+ url?: string | null;
3087
+ width?: number | null;
3088
+ height?: number | null;
3089
+ mimeType?: string | null;
3090
+ filesize?: number | null;
3091
+ filename?: string | null;
3092
+ };
3093
+ };
2994
3094
  }
2995
3095
  /**
2996
3096
  * This interface was referenced by `Config`'s JSON-Schema
2997
- * via the `definition` "customer-addresses".
3097
+ * via the `definition` "tenant-entitlements".
2998
3098
  */
2999
- interface CustomerAddress {
3099
+ interface TenantEntitlement {
3000
3100
  id: string;
3001
- tenant?: (string | null) | Tenant;
3002
- customer: string | Customer;
3003
- label?: string | null;
3004
- recipientName?: string | null;
3005
- phone?: string | null;
3006
- postalCode?: string | null;
3007
- /**
3008
- * Road-name address (returned by Daum/Naver postal code pickers)
3009
- */
3010
- address1?: string | null;
3101
+ tenant: string | Tenant;
3102
+ plan: 'free' | 'starter' | 'basic' | 'pro' | 'enterprise';
3011
3103
  /**
3012
- * Detail address (unit / floor / building name)
3104
+ * Lifecycle status for the entitlement. Only active rows participate in current plan resolution.
3013
3105
  */
3014
- address2?: string | null;
3106
+ status: 'active' | 'scheduled' | 'expired' | 'revoked';
3107
+ sourceType: 'subscription' | 'manual' | 'support' | 'promo' | 'trial' | 'enterprise_contract';
3108
+ sourceSubscription?: (string | null) | Subscription;
3015
3109
  /**
3016
- * Jibun lot-based address. Stored alongside the road-name `address1` so we can fall back when 도로명 is missing or for delivery providers that require 지번.
3110
+ * Tie-breaker for overlapping entitlements. Higher values win within the same source precedence.
3017
3111
  */
3018
- jibunAddress?: string | null;
3112
+ priority: number;
3113
+ startsAt: string;
3019
3114
  /**
3020
- * City (KR: 시/군 e.g. "Seoul", "Busan"; non-KR: city/town).
3115
+ * Entitlement end date. Required by hook validation for promo / trial sources and excluded from current plan resolution after expiry.
3021
3116
  */
3022
- city?: string | null;
3117
+ endsAt?: string | null;
3118
+ reason?: string | null;
3119
+ grantedBy?: (string | null) | User;
3120
+ revokedAt?: string | null;
3121
+ revokedBy?: (string | null) | User;
3122
+ updatedAt: string;
3123
+ createdAt: string;
3124
+ deletedAt?: string | null;
3125
+ }
3126
+ /**
3127
+ * This interface was referenced by `Config`'s JSON-Schema
3128
+ * via the `definition` "subscriptions".
3129
+ */
3130
+ interface Subscription {
3131
+ id: string;
3132
+ tenant: string | Tenant;
3133
+ plan: 'starter' | 'basic' | 'pro';
3134
+ billingCycle: 'monthly' | 'yearly';
3023
3135
  /**
3024
- * Administrative area (KR: 시/도 — usually folded into `city`; non-KR: state / province / region).
3136
+ * Payment amount (KRW)
3025
3137
  */
3026
- administrativeArea?: string | null;
3138
+ amount: number;
3139
+ status: 'active' | 'past_due' | 'canceled' | 'expired' | 'suspended';
3140
+ currency: 'KRW' | 'USD';
3141
+ provider: 'toss';
3142
+ currentPeriodStart?: string | null;
3143
+ currentPeriodEnd?: string | null;
3144
+ trialStartAt?: string | null;
3145
+ trialEndAt?: string | null;
3146
+ endedAt?: string | null;
3147
+ pastDueAt?: string | null;
3027
3148
  /**
3028
- * Which address form to print on the shipping label (default: road).
3149
+ * Toss billing key (AES-256-GCM encrypted)
3029
3150
  */
3030
- addressType?: ('road' | 'jibun') | null;
3151
+ billingKey?: string | null;
3031
3152
  /**
3032
- * ISO 3166-1 alpha-2 country code
3153
+ * Toss customer key (UUID)
3033
3154
  */
3034
- country?: string | null;
3035
- isDefault?: boolean | null;
3155
+ customerKey?: string | null;
3036
3156
  /**
3037
- * Delivery request preset. Pick "Other" to switch to a free-form deliveryNote.
3157
+ * Registered card info
3038
3158
  */
3039
- deliveryRequest?: ('security_office' | 'handoff_in_person' | 'call_before' | 'leave_at_door' | 'other') | null;
3159
+ cardInfo?: {
3160
+ issuerCode?: string | null;
3161
+ /**
3162
+ * Masked card number
3163
+ */
3164
+ number?: string | null;
3165
+ cardType?: string | null;
3166
+ };
3040
3167
  /**
3041
- * Free-form delivery note. Prefer the deliveryRequest preset when one of the choices fits; reserve this for actually-custom instructions.
3168
+ * Provider-owned diagnostic and audit metadata returned by the billing provider. Not a general manual-edit field.
3042
3169
  */
3043
- deliveryNote?: string | null;
3170
+ providerMetadata?: {
3171
+ [k: string]: unknown;
3172
+ } | unknown[] | string | number | boolean | null;
3173
+ cancelAtPeriodEnd?: boolean | null;
3174
+ canceledAt?: string | null;
3175
+ cancelReason?: string | null;
3176
+ retryCount?: number | null;
3177
+ graceDeadline?: string | null;
3178
+ lastPaymentError?: string | null;
3179
+ pendingPlanChange?: {
3180
+ targetPlan?: ('starter' | 'basic' | 'pro') | null;
3181
+ targetAmount?: number | null;
3182
+ effectiveAt?: string | null;
3183
+ };
3044
3184
  updatedAt: string;
3045
3185
  createdAt: string;
3046
3186
  deletedAt?: string | null;
3047
3187
  }
3048
3188
  /**
3049
3189
  * This interface was referenced by `Config`'s JSON-Schema
3050
- * via the `definition` "customer-profiles".
3190
+ * via the `definition` "tenant-purge-jobs".
3051
3191
  */
3052
- interface CustomerProfile {
3192
+ interface TenantPurgeJob {
3053
3193
  id: string;
3054
- tenant?: (string | null) | Tenant;
3055
- customer: string | Customer;
3056
- /**
3057
- * Public username shown like @01works. Store 3-30 characters without @, using lowercase ASCII letters, numbers, hyphens, or underscores, and keep it unique within the tenant.
3058
- */
3059
- handle?: string | null;
3060
- displayName?: string | null;
3061
- avatar?: (string | null) | Image;
3062
- bio?: string | null;
3063
- bioRichText?: {
3064
- root: {
3065
- type: string;
3066
- children: {
3067
- type: any;
3068
- version: number;
3069
- [k: string]: unknown;
3070
- }[];
3071
- direction: ('ltr' | 'rtl') | null;
3072
- format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
3073
- indent: number;
3074
- version: number;
3075
- };
3076
- [k: string]: unknown;
3077
- } | null;
3078
- joinedAt?: string | null;
3079
- isPublic?: boolean | null;
3080
- anonymizedAt?: string | null;
3081
- metadata?: {
3082
- [k: string]: unknown;
3083
- } | unknown[] | string | number | boolean | null;
3194
+ tenantId: string;
3195
+ status: 'pending' | 'running' | 'failed' | 'ready-to-delete';
3196
+ currentCollection?: string | null;
3197
+ deletedCount?: number | null;
3198
+ failure?: string | null;
3199
+ completedAt?: string | null;
3200
+ updatedAt: string;
3201
+ createdAt: string;
3084
3202
  }
3085
3203
  /**
3086
3204
  * This interface was referenced by `Config`'s JSON-Schema
3087
- * via the `definition` "order-items".
3205
+ * via the `definition` "billing-history".
3088
3206
  */
3089
- interface OrderItem {
3207
+ interface BillingHistory {
3090
3208
  id: string;
3091
- tenant?: (string | null) | Tenant;
3092
- order: string | Order;
3209
+ tenant: string | Tenant;
3210
+ subscription?: (string | null) | Subscription;
3211
+ type: 'payment' | 'refund' | 'plan_change';
3212
+ status: 'success' | 'failed' | 'refunded' | 'partial_refund';
3093
3213
  /**
3094
- * Quantity snapshot at order time. Used for payment and inventory calculations and not edited directly.
3214
+ * Amount (KRW)
3095
3215
  */
3096
- product: string | Product;
3097
- variant?: (string | null) | ProductVariant;
3098
- quantity: number;
3216
+ amount: number;
3099
3217
  /**
3100
- * Unit-price snapshot at order time. Later product price changes do not rewrite it.
3218
+ * Plan at time of payment
3101
3219
  */
3102
- unitPrice: number;
3103
- variantTitle?: string | null;
3104
- sku?: string | null;
3105
- compareAtPrice?: number | null;
3106
- weight?: number | null;
3107
- requiresShipping?: boolean | null;
3220
+ plan: 'starter' | 'basic' | 'pro';
3221
+ provider: 'toss';
3222
+ currency: 'KRW' | 'USD';
3223
+ billingCycle?: ('monthly' | 'yearly') | null;
3224
+ periodStart?: string | null;
3225
+ periodEnd?: string | null;
3108
3226
  /**
3109
- * Total-price snapshot at order time, preserved from unitPrice × quantity.
3227
+ * Unique order number
3110
3228
  */
3111
- totalPrice: number;
3112
- productTitle?: string | null;
3229
+ invoiceNumber: string;
3230
+ orderName?: string | null;
3113
3231
  /**
3114
- * Option combination snapshot at order time. Later variant/option changes do not rewrite it.
3232
+ * Toss payment key
3115
3233
  */
3116
- optionSelection?: {
3234
+ paymentKey?: string | null;
3235
+ /**
3236
+ * Full Toss API response
3237
+ */
3238
+ tossResponse?: {
3117
3239
  [k: string]: unknown;
3118
3240
  } | unknown[] | string | number | boolean | null;
3241
+ errorMessage?: string | null;
3119
3242
  /**
3120
- * Tax rate at time of order (%)
3243
+ * Original billing record for retry
3121
3244
  */
3122
- taxRate?: number | null;
3245
+ retryOf?: (string | null) | BillingHistory;
3246
+ updatedAt: string;
3247
+ createdAt: string;
3248
+ deletedAt?: string | null;
3249
+ }
3250
+ /**
3251
+ * This interface was referenced by `Config`'s JSON-Schema
3252
+ * via the `definition` "plans".
3253
+ */
3254
+ interface Plan {
3255
+ id: string;
3123
3256
  /**
3124
- * Currency at time of order (ISO-4217)
3257
+ * Plan identifier (free, starter, basic, pro, enterprise)
3125
3258
  */
3126
- currency?: string | null;
3259
+ key: string;
3127
3260
  /**
3128
- * Snapshot of the discount amount allocated to this line at order time (minor units).
3261
+ * Plan display name
3129
3262
  */
3130
- discountAllocation?: number | null;
3263
+ name: string;
3131
3264
  /**
3132
- * Per-unit price snapshot after discount allocation. round(discountedTotalPrice / quantity).
3265
+ * Reference-only feature list; enforced elsewhere.
3133
3266
  */
3134
- discountedUnitPrice?: number | null;
3267
+ featuresAllowed?: ('ecommerce' | 'customers' | 'playlists' | 'galleries' | 'links' | 'forms' | 'articles' | 'documents' | 'canvas' | 'videos' | 'live-streaming' | 'community' | 'events')[] | null;
3135
3268
  /**
3136
- * Line total snapshot after discount allocation at order time (totalPrice - discountAllocation).
3269
+ * Reference-only quotas such as storageBytes; enforced by entitlement and usage policy elsewhere.
3137
3270
  */
3138
- discountedTotalPrice?: number | null;
3271
+ quotas?: {
3272
+ [k: string]: unknown;
3273
+ } | unknown[] | string | number | boolean | null;
3139
3274
  updatedAt: string;
3140
3275
  createdAt: string;
3141
3276
  deletedAt?: string | null;
3142
3277
  }
3143
3278
  /**
3144
3279
  * This interface was referenced by `Config`'s JSON-Schema
3145
- * via the `definition` "transactions".
3280
+ * via the `definition` "tenant-web-analytics-config".
3146
3281
  */
3147
- interface Transaction {
3282
+ interface TenantWebAnalyticsConfig {
3148
3283
  id: string;
3149
3284
  tenant?: (string | null) | Tenant;
3150
- _title?: string | null;
3151
- type: 'payment' | 'refund';
3152
- status: 'pending' | 'paid' | 'failed' | 'canceled' | 'refunded';
3153
- order: string | Order;
3154
- amount?: number | null;
3155
- /**
3156
- * Payment method snapshot returned by the provider. Not edited directly.
3157
- */
3158
- paymentMethod?: string | null;
3285
+ enabled?: boolean | null;
3159
3286
  /**
3160
- * Installment months (0 = lump sum)
3287
+ * Domains allowed to send analytics events. If empty, browser analytics is blocked.
3161
3288
  */
3162
- installmentMonths?: number | null;
3163
- approvedAt?: string | null;
3164
- receiptUrl?: string | null;
3165
- pgPaymentId?: string | null;
3166
- pgOrderId?: string | null;
3167
- providerEventId?: string | null;
3168
- providerStatus?: string | null;
3169
- confirmedAmount?: number | null;
3170
- confirmedCurrency?: string | null;
3171
- confirmedAt?: string | null;
3172
- confirmationSource?: ('provider_webhook' | 'provider_lookup' | 'provider_api_confirm' | 'manual_server') | null;
3173
- cashReceipt?: {
3174
- issuanceType?: ('none' | 'personal' | 'business') | null;
3175
- /**
3176
- * Personal: phone or cash receipt card number / Business: business registration number
3177
- */
3178
- registrationNumber?: string | null;
3179
- issueNumber?: string | null;
3180
- issuedAt?: string | null;
3181
- };
3182
- cardInfo?: {
3183
- brand?: string | null;
3184
- last4?: string | null;
3185
- expMonth?: number | null;
3186
- expYear?: number | null;
3187
- issuerCode?: string | null;
3188
- type?: ('credit' | 'debit' | 'gift') | null;
3189
- owner?: string | null;
3190
- };
3191
- failureCode?: string | null;
3192
- failureMessage?: string | null;
3289
+ allowedOrigins?: {
3290
+ origin: string;
3291
+ id?: string | null;
3292
+ }[] | null;
3193
3293
  /**
3194
- * Payment gateway (e.g. toss, stripe)
3294
+ * Timezone used to group daily analytics. Once data starts coming in, this is locked and cannot be changed.
3195
3295
  */
3196
- pgProvider?: string | null;
3296
+ timezone: string;
3197
3297
  /**
3198
- * Legal retention deadline (5 years, Electronic Financial Transactions Act)
3298
+ * Automatically locked once the first analytics record is saved. Contact support to unlock.
3199
3299
  */
3200
- retainUntil?: string | null;
3201
- metadata?: {
3202
- [k: string]: unknown;
3203
- } | unknown[] | string | number | boolean | null;
3300
+ tzLocked?: boolean | null;
3204
3301
  updatedAt: string;
3205
3302
  createdAt: string;
3206
3303
  deletedAt?: string | null;
3207
3304
  }
3208
3305
  /**
3209
3306
  * This interface was referenced by `Config`'s JSON-Schema
3210
- * via the `definition` "fulfillments".
3307
+ * via the `definition` "tenant-analytics-daily".
3211
3308
  */
3212
- interface Fulfillment {
3309
+ interface TenantAnalyticsDaily {
3213
3310
  id: string;
3214
3311
  tenant?: (string | null) | Tenant;
3215
- order: string | Order;
3216
- status: 'pending' | 'packed' | 'shipped' | 'delivered' | 'failed';
3217
3312
  /**
3218
- * Carrier name (e.g. CJ Logistics, FedEx)
3313
+ * YYYY-MM-DD (UTC)
3219
3314
  */
3220
- carrier?: string | null;
3315
+ date: string;
3316
+ pageviews: number;
3221
3317
  /**
3222
- * Carrier tracking number. Used as input for the derived trackingUrl.
3318
+ * Estimated via HyperLogLog (±0.81%)
3223
3319
  */
3224
- trackingNumber?: string | null;
3320
+ visitors: number;
3321
+ topPages?: {
3322
+ pathname: string;
3323
+ views: number;
3324
+ id?: string | null;
3325
+ }[] | null;
3326
+ topReferrers?: {
3327
+ source: string;
3328
+ views: number;
3329
+ id?: string | null;
3330
+ }[] | null;
3331
+ topEvents?: {
3332
+ name: string;
3333
+ count: number;
3334
+ id?: string | null;
3335
+ }[] | null;
3336
+ eventsDropped?: {
3337
+ cardinality?: number | null;
3338
+ schema?: number | null;
3339
+ late?: number | null;
3340
+ origin?: number | null;
3341
+ key?: number | null;
3342
+ rate?: number | null;
3343
+ disabled?: number | null;
3344
+ };
3345
+ snapshottedAt?: string | null;
3346
+ /**
3347
+ * Tenant timezone used to bucket this snapshot's date.
3348
+ */
3349
+ bucketTz: string;
3350
+ /**
3351
+ * Deterministic aggregate schema shape hash for mismatch detection.
3352
+ */
3353
+ schemaShape: string;
3354
+ /**
3355
+ * Per-event dimension/page/referrer aggregates. Populated by snapshot cron when registered events have Redis data.
3356
+ */
3357
+ eventDetails?: {
3358
+ eventName: string;
3359
+ count?: number | null;
3360
+ /**
3361
+ * Deterministic schema shape hash for this event detail row.
3362
+ */
3363
+ schemaShape?: string | null;
3364
+ dimensions?: {
3365
+ dimension: string;
3366
+ values?: {
3367
+ value: string;
3368
+ count: number;
3369
+ id?: string | null;
3370
+ }[] | null;
3371
+ id?: string | null;
3372
+ }[] | null;
3373
+ pages?: {
3374
+ pathname: string;
3375
+ count: number;
3376
+ id?: string | null;
3377
+ }[] | null;
3378
+ referrers?: {
3379
+ source: string;
3380
+ count: number;
3381
+ id?: string | null;
3382
+ }[] | null;
3383
+ id?: string | null;
3384
+ }[] | null;
3225
3385
  /**
3226
- * Tracking URL (auto-derived from carrier + trackingNumber)
3386
+ * MCP tool usage aggregate. Populated by snapshot cron from daily Redis keys.
3227
3387
  */
3228
- trackingUrl?: string | null;
3229
- packedAt?: string | null;
3230
- shippedAt?: string | null;
3231
- deliveredAt?: string | null;
3232
- items?: {
3233
- docs?: (string | FulfillmentItem)[];
3234
- hasNextPage?: boolean;
3235
- totalDocs?: number;
3388
+ mcpUsage?: {
3389
+ toolCalls?: number | null;
3390
+ sessions?: number | null;
3391
+ convertedSessions?: number | null;
3392
+ conversionRate?: number | null;
3393
+ successfulWrites?: number | null;
3394
+ isPartial?: boolean | null;
3395
+ topTools?: {
3396
+ name: string;
3397
+ count: number;
3398
+ readOnly?: boolean | null;
3399
+ id?: string | null;
3400
+ }[] | null;
3401
+ transports?: {
3402
+ name: string;
3403
+ count: number;
3404
+ id?: string | null;
3405
+ }[] | null;
3406
+ httpDurationMs?: {
3407
+ p50?: number | null;
3408
+ p99?: number | null;
3409
+ buckets?: {
3410
+ bucket: string;
3411
+ label: string;
3412
+ count: number;
3413
+ id?: string | null;
3414
+ }[] | null;
3415
+ };
3236
3416
  };
3237
- /**
3238
- * Internal fulfillment note. Not shown directly to customers.
3239
- */
3240
- adminNotes?: string | null;
3241
- metadata?: {
3242
- [k: string]: unknown;
3243
- } | unknown[] | string | number | boolean | null;
3244
3417
  updatedAt: string;
3245
3418
  createdAt: string;
3246
- deletedAt?: string | null;
3247
3419
  }
3248
3420
  /**
3249
3421
  * This interface was referenced by `Config`'s JSON-Schema
3250
- * via the `definition` "fulfillment-items".
3422
+ * via the `definition` "analytics-event-schemas".
3251
3423
  */
3252
- interface FulfillmentItem {
3424
+ interface AnalyticsEventSchema {
3253
3425
  id: string;
3254
3426
  tenant?: (string | null) | Tenant;
3255
- fulfillment: string | Fulfillment;
3256
- orderItem: string | OrderItem;
3257
- quantity: number;
3427
+ /**
3428
+ * Valid event name pattern.
3429
+ */
3430
+ eventName: string;
3431
+ enabled: boolean;
3432
+ dimensions?: {
3433
+ key: string;
3434
+ type: 'enum' | 'boolean';
3435
+ /**
3436
+ * Comma-separated values. Required when type=enum, optional otherwise. Boolean auto-derives {true,false}. Max 20 per key.
3437
+ */
3438
+ allowedValues?: string | null;
3439
+ description?: string | null;
3440
+ id?: string | null;
3441
+ }[] | null;
3442
+ createdBy?: (string | null) | User;
3443
+ updatedBy?: (string | null) | User;
3258
3444
  updatedAt: string;
3259
3445
  createdAt: string;
3260
3446
  deletedAt?: string | null;
3261
3447
  }
3262
3448
  /**
3263
3449
  * This interface was referenced by `Config`'s JSON-Schema
3264
- * via the `definition` "returns".
3450
+ * via the `definition` "api-usage".
3265
3451
  */
3266
- interface Return {
3452
+ interface ApiUsage {
3267
3453
  id: string;
3268
3454
  tenant?: (string | null) | Tenant;
3269
- returnNumber?: string | null;
3270
- order: string | Order;
3271
- type: 'refund' | 'exchange';
3272
3455
  /**
3273
- * New order created for exchange
3456
+ * YYYY-MM format
3274
3457
  */
3275
- exchangeOrder?: (string | null) | Order;
3276
- status: 'requested' | 'processing' | 'approved' | 'rejected' | 'completed';
3458
+ month: string;
3459
+ apiCallCount: number;
3460
+ plan: 'free' | 'starter' | 'basic' | 'pro' | 'enterprise';
3277
3461
  /**
3278
- * Reason category for the return or refund request. Used for reporting and operations.
3462
+ * -1 means unlimited
3279
3463
  */
3280
- reason?: ('change_of_mind' | 'defective' | 'wrong_delivery' | 'damaged' | 'other') | null;
3464
+ apiCallLimit: number;
3281
3465
  /**
3282
- * Detailed return reason
3466
+ * Storage usage in bytes
3283
3467
  */
3284
- reasonDetail?: string | null;
3285
- items?: {
3286
- docs?: (string | ReturnItem)[];
3287
- hasNextPage?: boolean;
3288
- totalDocs?: number;
3289
- };
3468
+ storageUsedBytes?: number | null;
3290
3469
  /**
3291
- * Internal return-processing note. Not shown directly to customers.
3470
+ * Storage limit in bytes (-1 means unlimited)
3292
3471
  */
3293
- adminNotes?: string | null;
3294
- completedAt?: string | null;
3472
+ storageLimitBytes?: number | null;
3295
3473
  /**
3296
- * Refund receipt URL
3474
+ * Total document count across all tenant-scoped collections
3297
3475
  */
3298
- refundReceiptUrl?: string | null;
3299
- refundAmount: number;
3476
+ documentCount?: number | null;
3300
3477
  /**
3301
- * Return shipping fee deducted from refundAmount
3478
+ * Number of video documents
3302
3479
  */
3303
- returnShippingFee?: number | null;
3480
+ videoCount?: number | null;
3304
3481
  /**
3305
- * Exchange balance (positive: extra charge, negative: extra refund)
3482
+ * Weighted video minutes used (duration × quality multiplier)
3306
3483
  */
3307
- exchangeDifference?: number | null;
3308
- metadata?: {
3309
- [k: string]: unknown;
3310
- } | unknown[] | string | number | boolean | null;
3311
- updatedAt: string;
3312
- createdAt: string;
3313
- deletedAt?: string | null;
3314
- }
3315
- /**
3316
- * This interface was referenced by `Config`'s JSON-Schema
3317
- * via the `definition` "return-items".
3318
- */
3319
- interface ReturnItem {
3320
- id: string;
3321
- tenant?: (string | null) | Tenant;
3322
- return: string | Return;
3323
- order: string | Order;
3324
- status: 'requested' | 'processing' | 'approved' | 'rejected' | 'completed';
3325
- orderItem: string | OrderItem;
3326
- product: string | Product;
3327
- variant?: (string | null) | ProductVariant;
3328
- quantity: number;
3329
- restockAction: 'return_to_stock' | 'discard';
3484
+ videoMinutesUsed?: number | null;
3330
3485
  /**
3331
- * Restocking fee for this line (deducted from line refund)
3486
+ * Monthly viewer watch time from Mux Data
3332
3487
  */
3333
- restockingFee?: number | null;
3334
- productTitle?: string | null;
3488
+ deliveryMinutesUsed?: number | null;
3489
+ /**
3490
+ * AI generation count
3491
+ */
3492
+ aiGenerationCount?: number | null;
3493
+ /**
3494
+ * Timestamp when the usage snapshot cron calculated this monthly aggregate.
3495
+ */
3496
+ snapshottedAt?: string | null;
3335
3497
  updatedAt: string;
3336
3498
  createdAt: string;
3337
- deletedAt?: string | null;
3338
3499
  }
3339
3500
  /**
3340
3501
  * This interface was referenced by `Config`'s JSON-Schema
@@ -4757,6 +4918,7 @@ interface CanvasNodeType {
4757
4918
  * Optional #RRGGBB display color for Admin surfaces.
4758
4919
  */
4759
4920
  color?: string | null;
4921
+ editorIntent?: ('text' | 'image') | null;
4760
4922
  defaultSize?: {
4761
4923
  width?: number | null;
4762
4924
  height?: number | null;
@@ -4825,6 +4987,7 @@ interface CanvasEdgeType {
4825
4987
  * Optional #RRGGBB display color for Admin surfaces.
4826
4988
  */
4827
4989
  color?: string | null;
4990
+ isDefaultEdge?: boolean | null;
4828
4991
  strokeWidth?: number | null;
4829
4992
  isAnimated?: boolean | null;
4830
4993
  lineStyle?: ('default' | 'step' | 'smoothstep' | 'bezier') | null;
@@ -4936,6 +5099,7 @@ interface Post {
4936
5099
  [k: string]: unknown;
4937
5100
  } | null;
4938
5101
  categories?: (string | PostCategory)[] | null;
5102
+ tags?: (string | PostTag)[] | null;
4939
5103
  /**
4940
5104
  * Comments on this post. Author and status are managed in the comments collection.
4941
5105
  */
@@ -4981,14 +5145,16 @@ interface Post {
4981
5145
  */
4982
5146
  isPinned?: boolean | null;
4983
5147
  /**
4984
- * Controls whether new comments can be created for this post.
5148
+ * Author/operator discussion toggle. When false, new comments are blocked.
4985
5149
  */
4986
5150
  allowsComments?: boolean | null;
4987
5151
  visibility?: ('visible' | 'hidden') | null;
4988
5152
  /**
4989
- * Lock comments
5153
+ * Moderator lock. When true, new comments are blocked regardless of allowsComments.
4990
5154
  */
4991
5155
  isLocked?: boolean | null;
5156
+ editedAt?: string | null;
5157
+ isEdited?: boolean | null;
4992
5158
  /**
4993
5159
  * Last comment or activity timestamp. Updated server-side for sorting and activity indicators.
4994
5160
  */
@@ -5037,6 +5203,37 @@ interface PostCategory {
5037
5203
  createdAt: string;
5038
5204
  deletedAt?: string | null;
5039
5205
  }
5206
+ /**
5207
+ * Post tags are flat labels for search and loose topic grouping.
5208
+ *
5209
+ * This interface was referenced by `Config`'s JSON-Schema
5210
+ * via the `definition` "post-tags".
5211
+ */
5212
+ interface PostTag {
5213
+ id: string;
5214
+ _order?: string | null;
5215
+ title?: string | null;
5216
+ /**
5217
+ * When enabled, the slug will auto-generate from the title field on save and autosave.
5218
+ */
5219
+ generateSlug?: boolean | null;
5220
+ slug?: string | null;
5221
+ /**
5222
+ * Short summary for listing/cards
5223
+ */
5224
+ description?: string | null;
5225
+ /**
5226
+ * Single representative taxonomy image. Add domain-specific fields for multiple images such as thumbnail and hero variants.
5227
+ */
5228
+ image?: (string | null) | Image;
5229
+ /**
5230
+ * Optional #RRGGBB hex color for taxonomy badges or filter UI. This does not replace the representative image.
5231
+ */
5232
+ color?: string | null;
5233
+ updatedAt: string;
5234
+ createdAt: string;
5235
+ deletedAt?: string | null;
5236
+ }
5040
5237
  /**
5041
5238
  * This interface was referenced by `Config`'s JSON-Schema
5042
5239
  * via the `definition` "comments".
@@ -6176,6 +6373,40 @@ interface EmailLogsSelect<T extends boolean = true> {
6176
6373
  clickedAt?: T;
6177
6374
  bouncedAt?: T;
6178
6375
  recipientConsent?: T;
6376
+ commerceNotification?: T | {
6377
+ event?: T;
6378
+ intent?: T;
6379
+ dedupeKey?: T;
6380
+ order?: T;
6381
+ fulfillment?: T;
6382
+ return?: T;
6383
+ customer?: T;
6384
+ };
6385
+ updatedAt?: T;
6386
+ createdAt?: T;
6387
+ }
6388
+ /**
6389
+ * This interface was referenced by `Config`'s JSON-Schema
6390
+ * via the `definition` "commerce-notification-intents_select".
6391
+ */
6392
+ interface CommerceNotificationIntentsSelect<T extends boolean = true> {
6393
+ tenant?: T;
6394
+ dedupeKey?: T;
6395
+ event?: T;
6396
+ status?: T;
6397
+ recipientEmail?: T;
6398
+ locale?: T;
6399
+ payload?: T;
6400
+ order?: T;
6401
+ fulfillment?: T;
6402
+ return?: T;
6403
+ customer?: T;
6404
+ emailLog?: T;
6405
+ attempts?: T;
6406
+ nextAttemptAt?: T;
6407
+ lockedAt?: T;
6408
+ processedAt?: T;
6409
+ lastError?: T;
6179
6410
  updatedAt?: T;
6180
6411
  createdAt?: T;
6181
6412
  }
@@ -6296,6 +6527,14 @@ interface TenantsSelect<T extends boolean = true> {
6296
6527
  origin?: T;
6297
6528
  id?: T;
6298
6529
  };
6530
+ commerceNotifications?: T | {
6531
+ orderPaid?: T;
6532
+ orderCanceled?: T;
6533
+ fulfillmentShipped?: T;
6534
+ orderDelivered?: T;
6535
+ returnRequested?: T;
6536
+ returnCompleted?: T;
6537
+ };
6299
6538
  members?: T;
6300
6539
  updatedAt?: T;
6301
6540
  createdAt?: T;
@@ -6357,6 +6596,18 @@ interface TenantMetadataSelect<T extends boolean = true> {
6357
6596
  twitterDescription?: T;
6358
6597
  twitterImage?: T;
6359
6598
  };
6599
+ optionPresets?: T | {
6600
+ name?: T;
6601
+ options?: T | {
6602
+ title?: T;
6603
+ values?: T | {
6604
+ value?: T;
6605
+ id?: T;
6606
+ };
6607
+ id?: T;
6608
+ };
6609
+ id?: T;
6610
+ };
6360
6611
  pwa?: T | {
6361
6612
  shortName?: T;
6362
6613
  backgroundColor?: T;
@@ -6490,6 +6741,9 @@ interface WebhooksSelect<T extends boolean = true> {
6490
6741
  name?: T;
6491
6742
  url?: T;
6492
6743
  secret?: T;
6744
+ secretRevealedAt?: T;
6745
+ secretRotatedAt?: T;
6746
+ secretRotatedBy?: T;
6493
6747
  subscriptions?: T | {
6494
6748
  collection?: T;
6495
6749
  id?: T;
@@ -6751,6 +7005,7 @@ interface ProductsSelect<T extends boolean = true> {
6751
7005
  subtitle?: T;
6752
7006
  description?: T;
6753
7007
  images?: T;
7008
+ primaryMediaItemId?: T;
6754
7009
  videos?: T;
6755
7010
  content?: T;
6756
7011
  variants?: T;
@@ -6760,6 +7015,8 @@ interface ProductsSelect<T extends boolean = true> {
6760
7015
  brand?: T;
6761
7016
  shippingPolicy?: T;
6762
7017
  weight?: T;
7018
+ vendor?: T;
7019
+ productType?: T;
6763
7020
  collectionItems?: T;
6764
7021
  minOrderQuantity?: T;
6765
7022
  maxOrderQuantity?: T;
@@ -6773,6 +7030,9 @@ interface ProductsSelect<T extends boolean = true> {
6773
7030
  maxCompareAtPrice?: T;
6774
7031
  isPriceRange?: T;
6775
7032
  availableForSale?: T;
7033
+ groupingState?: T;
7034
+ groupingEmptyReason?: T;
7035
+ groupingCount?: T;
6776
7036
  };
6777
7037
  seo?: T | {
6778
7038
  title?: T;
@@ -6793,8 +7053,6 @@ interface ProductsSelect<T extends boolean = true> {
6793
7053
  isFeatured?: T;
6794
7054
  publishedAt?: T;
6795
7055
  metadata?: T;
6796
- vendor?: T;
6797
- productType?: T;
6798
7056
  updatedAt?: T;
6799
7057
  createdAt?: T;
6800
7058
  deletedAt?: T;
@@ -6809,7 +7067,6 @@ interface ProductVariantsSelect<T extends boolean = true> {
6809
7067
  tenant?: T;
6810
7068
  product?: T;
6811
7069
  title?: T;
6812
- thumbnail?: T;
6813
7070
  images?: T;
6814
7071
  sku?: T;
6815
7072
  price?: T;
@@ -6817,6 +7074,8 @@ interface ProductVariantsSelect<T extends boolean = true> {
6817
7074
  isUnlimited?: T;
6818
7075
  stock?: T;
6819
7076
  reservedStock?: T;
7077
+ safetyStockThreshold?: T;
7078
+ inventoryAlertState?: T;
6820
7079
  barcode?: T;
6821
7080
  weight?: T;
6822
7081
  requiresShipping?: T;
@@ -6857,11 +7116,13 @@ interface ProductOptionValuesSelect<T extends boolean = true> {
6857
7116
  option?: T;
6858
7117
  displayLabel?: T;
6859
7118
  value?: T;
6860
- swatchColor?: T;
7119
+ swatch?: T | {
7120
+ type?: T;
7121
+ color?: T;
7122
+ mediaItemId?: T;
7123
+ };
6861
7124
  generateSlug?: T;
6862
7125
  slug?: T;
6863
- thumbnail?: T;
6864
- images?: T;
6865
7126
  metadata?: T;
6866
7127
  updatedAt?: T;
6867
7128
  createdAt?: T;
@@ -8181,6 +8442,7 @@ interface CanvasNodeTypesSelect<T extends boolean = true> {
8181
8442
  slug?: T;
8182
8443
  description?: T;
8183
8444
  color?: T;
8445
+ editorIntent?: T;
8184
8446
  defaultSize?: T | {
8185
8447
  width?: T;
8186
8448
  height?: T;
@@ -8218,6 +8480,7 @@ interface CanvasEdgeTypesSelect<T extends boolean = true> {
8218
8480
  slug?: T;
8219
8481
  description?: T;
8220
8482
  color?: T;
8483
+ isDefaultEdge?: T;
8221
8484
  strokeWidth?: T;
8222
8485
  isAnimated?: T;
8223
8486
  lineStyle?: T;
@@ -8442,6 +8705,7 @@ interface PostsSelect<T extends boolean = true> {
8442
8705
  title?: T;
8443
8706
  content?: T;
8444
8707
  categories?: T;
8708
+ tags?: T;
8445
8709
  comments?: T;
8446
8710
  displayTitle?: T;
8447
8711
  status?: T;
@@ -8464,6 +8728,8 @@ interface PostsSelect<T extends boolean = true> {
8464
8728
  allowsComments?: T;
8465
8729
  visibility?: T;
8466
8730
  isLocked?: T;
8731
+ editedAt?: T;
8732
+ isEdited?: T;
8467
8733
  lastActivityAt?: T;
8468
8734
  lastCommentByProfile?: T;
8469
8735
  isFeatured?: T;
@@ -8565,6 +8831,22 @@ interface PostCategoriesSelect<T extends boolean = true> {
8565
8831
  createdAt?: T;
8566
8832
  deletedAt?: T;
8567
8833
  }
8834
+ /**
8835
+ * This interface was referenced by `Config`'s JSON-Schema
8836
+ * via the `definition` "post-tags_select".
8837
+ */
8838
+ interface PostTagsSelect<T extends boolean = true> {
8839
+ _order?: T;
8840
+ title?: T;
8841
+ generateSlug?: T;
8842
+ slug?: T;
8843
+ description?: T;
8844
+ image?: T;
8845
+ color?: T;
8846
+ updatedAt?: T;
8847
+ createdAt?: T;
8848
+ deletedAt?: T;
8849
+ }
8568
8850
  /**
8569
8851
  * This interface was referenced by `Config`'s JSON-Schema
8570
8852
  * via the `definition` "reports_select".
@@ -9055,4 +9337,4 @@ declare module 'payload' {
9055
9337
  }
9056
9338
  }
9057
9339
 
9058
- export type { Article as A, CustomerProfile as C, Document as D, Form as F, Image as I, Order as O, Product as P, Reaction as R, Tenant as T, Video as V, CustomerProfileList as a, ProductCollection as b, Post as c, Comment as d, Config as e, ArticleAuthor as f, ArticleCategory as g, ArticleTag as h, Cart as i, CartItem as j, PostCategory as k, ProductVariant as l, Transaction as m, Fulfillment as n, Return as o };
9340
+ export type { Article as A, CustomerProfile as C, Document as D, Form as F, Image as I, Order as O, Product as P, Reaction as R, Tenant as T, Video as V, Webhook as W, CustomerProfileList as a, ProductCollection as b, Post as c, Comment as d, Config as e, ArticleAuthor as f, ArticleCategory as g, ArticleTag as h, Cart as i, CartItem as j, PostCategory as k, ProductVariant as l, Transaction as m, Fulfillment as n, Return as o };