@infuro/cms-core 1.0.61 → 1.0.62

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 (50) hide show
  1. package/dist/admin.cjs +3621 -2639
  2. package/dist/admin.js +2412 -1430
  3. package/dist/api.cjs +41 -37
  4. package/dist/api.js +9 -5
  5. package/dist/{chunk-URN7GS23.js → chunk-6LV36PCL.js} +199 -1059
  6. package/dist/{chunk-O2642WVS.js → chunk-6XAVZE4I.js} +17 -3
  7. package/dist/{chunk-BXYZDMTZ.cjs → chunk-AXMP2U43.cjs} +3 -94
  8. package/dist/{chunk-T3HPSF7K.js → chunk-AYWDQFJZ.js} +3 -0
  9. package/dist/chunk-CTIEAHQL.cjs +96 -0
  10. package/dist/chunk-GWDI752Q.js +83 -0
  11. package/dist/chunk-GZGFNVTK.js +886 -0
  12. package/dist/chunk-H3IVLIPR.cjs +86 -0
  13. package/dist/{chunk-2KUCQVAQ.js → chunk-HMLVPIJR.js} +2 -91
  14. package/dist/{chunk-V25RDUOU.cjs → chunk-LRD4CGOG.cjs} +38 -4
  15. package/dist/{chunk-73WVHINE.cjs → chunk-LVQSG25Y.cjs} +18 -4
  16. package/dist/chunk-NMYGQWHV.js +93 -0
  17. package/dist/chunk-OVTOP42W.js +199 -0
  18. package/dist/{chunk-CNAHVRRU.cjs → chunk-QA5C477U.cjs} +676 -312
  19. package/dist/{chunk-UHT4INVW.js → chunk-R6Q67HAS.js} +625 -252
  20. package/dist/{chunk-YSYX4GUD.cjs → chunk-TWTISTZB.cjs} +210 -1080
  21. package/dist/{chunk-77I3KS7V.cjs → chunk-UEE4PTTB.cjs} +3 -0
  22. package/dist/chunk-WFMVD567.cjs +209 -0
  23. package/dist/{chunk-L3525VXI.js → chunk-YW7EF7K7.js} +36 -2
  24. package/dist/chunk-ZPAPCGCR.cjs +899 -0
  25. package/dist/{email-queue-OI2HSCGE.js → email-queue-65PQAG4C.js} +3 -2
  26. package/dist/{email-queue-6NJY6HNM.cjs → email-queue-J7DXYNCE.cjs} +7 -6
  27. package/dist/email-service-F7HA4X63.js +3 -0
  28. package/dist/email-service-RDOTY3CO.cjs +28 -0
  29. package/dist/{emit-order-notification-trigger-TNEZOYEE.cjs → emit-order-notification-trigger-K7URAZHJ.cjs} +4 -4
  30. package/dist/{emit-order-notification-trigger-CZU3V2WE.js → emit-order-notification-trigger-MD7EBODC.js} +2 -2
  31. package/dist/{erp-order-invoice-EYYNR526.cjs → erp-order-invoice-C5GZCOBM.cjs} +6 -5
  32. package/dist/{erp-order-invoice-3GXDE443.js → erp-order-invoice-MYFCXOCY.js} +2 -1
  33. package/dist/index.cjs +363 -314
  34. package/dist/index.d.cts +53 -19
  35. package/dist/index.d.ts +53 -19
  36. package/dist/index.js +75 -26
  37. package/dist/migrations/1783000000000-AddOrderPendingProcessingCompletedTriggers.ts +56 -0
  38. package/dist/migrations/1783100000000-AddSmsToOrderNotificationBindingsChannelEnum.ts +17 -0
  39. package/dist/migrations/1783200000000-AddOrderAssigneeColumns.ts +30 -0
  40. package/dist/order-assignees-handlers-LKMAGLG6.js +150 -0
  41. package/dist/order-assignees-handlers-NPKD64P6.cjs +152 -0
  42. package/dist/order-completion-otp-handlers-3NTOGEA5.js +361 -0
  43. package/dist/order-completion-otp-handlers-4EOLYLAP.cjs +363 -0
  44. package/dist/order-notification-dispatcher-IYMOS4VY.js +10 -0
  45. package/dist/order-notification-dispatcher-X2XM5VUY.cjs +35 -0
  46. package/dist/sms-notification-templates-handlers-SJLO7JGZ.js +47 -0
  47. package/dist/sms-notification-templates-handlers-YSB3L2PK.cjs +49 -0
  48. package/package.json +1 -1
  49. package/dist/order-notification-dispatcher-KJVGLK5E.cjs +0 -24
  50. package/dist/order-notification-dispatcher-ZSFKEYMP.js +0 -7
package/dist/index.d.cts CHANGED
@@ -1900,7 +1900,7 @@ declare function serializeEmailRecipients(emails: string[]): string;
1900
1900
  /** Join for SMTP `to` header (multiple recipients). */
1901
1901
  declare function joinRecipientsForSend(emails: string[]): string | null;
1902
1902
 
1903
- type OtpPurpose = 'login' | 'verify_email' | 'verify_phone';
1903
+ type OtpPurpose = 'login' | 'verify_email' | 'verify_phone' | 'order_completion';
1904
1904
  type OtpChannel = 'email' | 'sms';
1905
1905
  declare function hashOtpCode(code: string, purpose: string, identifier: string, pepper?: string): string;
1906
1906
  declare function verifyOtpCodeHash(code: string, storedHash: string, purpose: string, identifier: string, pepper?: string): boolean;
@@ -2566,6 +2566,9 @@ declare class Order {
2566
2566
  customerContact: Customer_Contacts | null;
2567
2567
  billingAddress: OrderAddresses | null;
2568
2568
  shippingAddress: OrderAddresses | null;
2569
+ assignedUserId: number | null;
2570
+ assignedAt: Date | null;
2571
+ assignedUser: User | null;
2569
2572
  items: OrderItem[];
2570
2573
  payments: Payment[];
2571
2574
  }
@@ -2819,19 +2822,10 @@ declare function fireOrderNotificationTrigger(triggerKey: string, orderId: numbe
2819
2822
  extraVariables?: Record<string, string>;
2820
2823
  }): void;
2821
2824
 
2822
- interface OrderNotificationDispatcherDeps {
2823
- dataSource: any;
2824
- entityMap: EntityMap$2;
2825
- getCms: () => Promise<CmsAppLike$1>;
2826
- }
2827
- declare function initWhatsappTriggerDispatcher(deps: OrderNotificationDispatcherDeps): void;
2828
- /** Manually re-fire a trigger for an existing order (admin testing / resend). */
2829
- declare function resendOrderNotification(triggerKey: string, orderId: number, deps: OrderNotificationDispatcherDeps): Promise<{
2830
- ok: boolean;
2831
- error?: string;
2832
- }>;
2833
-
2834
2825
  declare const KNOWN_NOTIFICATION_TRIGGERS: {
2826
+ readonly ORDER_PENDING: "order_pending";
2827
+ readonly ORDER_PROCESSING: "order_processing";
2828
+ readonly ORDER_COMPLETED: "order_completed";
2835
2829
  readonly ORDER_PLACED: "order_placed";
2836
2830
  readonly ORDER_CANCELLED: "order_cancelled";
2837
2831
  readonly PAYMENT_SUCCESS: "payment_success";
@@ -2855,41 +2849,80 @@ declare class NotificationTriggerEmitter extends EventEmitter {
2855
2849
  }
2856
2850
  declare const notificationTriggerEmitter: NotificationTriggerEmitter;
2857
2851
 
2852
+ interface OrderNotificationDispatcherDeps {
2853
+ dataSource: any;
2854
+ entityMap: EntityMap$2;
2855
+ getCms: () => Promise<CmsAppLike$1>;
2856
+ }
2857
+ declare function initWhatsappTriggerDispatcher(deps: OrderNotificationDispatcherDeps): void;
2858
+ /** Manually re-fire a trigger for an existing order (admin testing / resend). */
2859
+ declare function resendOrderNotification(triggerKey: string, orderId: number, deps: OrderNotificationDispatcherDeps): Promise<{
2860
+ ok: boolean;
2861
+ error?: string;
2862
+ }>;
2863
+
2858
2864
  /** Default order lifecycle triggers — seeded by migration, not tied to the `events` table. */
2859
2865
  declare const DEFAULT_ORDER_NOTIFICATION_TRIGGER_SEEDS: readonly [{
2866
+ readonly triggerKey: "order_pending";
2867
+ readonly label: "Order pending";
2868
+ readonly description: "Fires when an order is created and pending confirmation or payment.";
2869
+ readonly category: "order";
2870
+ readonly sortOrder: 1;
2871
+ }, {
2872
+ readonly triggerKey: "order_processing";
2873
+ readonly label: "Order processing";
2874
+ readonly description: "Fires when an order moves to processing after being assigned.";
2875
+ readonly category: "order";
2876
+ readonly sortOrder: 2;
2877
+ }, {
2878
+ readonly triggerKey: "order_completed";
2879
+ readonly label: "Order completed";
2880
+ readonly description: "Fires when an order is completed after customer OTP validation.";
2881
+ readonly category: "order";
2882
+ readonly sortOrder: 3;
2883
+ }, {
2860
2884
  readonly triggerKey: "order_placed";
2861
2885
  readonly label: "Order placed";
2862
2886
  readonly description: "Fires when a new order is created (storefront checkout or admin).";
2863
2887
  readonly category: "order";
2864
- readonly sortOrder: 1;
2888
+ readonly sortOrder: 4;
2865
2889
  }, {
2866
2890
  readonly triggerKey: "order_cancelled";
2867
2891
  readonly label: "Order cancelled";
2868
2892
  readonly description: "Fires when an order is cancelled (includes refund amount when applicable).";
2869
2893
  readonly category: "order";
2870
- readonly sortOrder: 2;
2894
+ readonly sortOrder: 5;
2871
2895
  }, {
2872
2896
  readonly triggerKey: "payment_success";
2873
2897
  readonly label: "Payment success";
2874
2898
  readonly description: "Fires when order is placed and payment status is paid.";
2875
2899
  readonly category: "order";
2876
- readonly sortOrder: 3;
2900
+ readonly sortOrder: 6;
2877
2901
  }, {
2878
2902
  readonly triggerKey: "payment_failed";
2879
2903
  readonly label: "Payment failed";
2880
2904
  readonly description: "Fires when payment status is pending, unpaid, or failed, or when order is cancelled without payment.";
2881
2905
  readonly category: "order";
2882
- readonly sortOrder: 4;
2906
+ readonly sortOrder: 7;
2883
2907
  }, {
2884
2908
  readonly triggerKey: "payment_refund_initiated";
2885
2909
  readonly label: "Payment refund initiated";
2886
2910
  readonly description: "Fires when order is cancelled and its payment status is paid (refund initiated).";
2887
2911
  readonly category: "order";
2888
- readonly sortOrder: 5;
2912
+ readonly sortOrder: 8;
2889
2913
  }];
2890
2914
 
2891
2915
  /** @deprecated Use DB catalog `order_notification_triggers`; kept for type hints. */
2892
2916
  declare const ORDER_NOTIFICATION_TRIGGERS: readonly [{
2917
+ readonly key: "order_pending";
2918
+ readonly label: "Order pending";
2919
+ }, {
2920
+ readonly key: "order_processing";
2921
+ readonly label: "Order processing";
2922
+ }, {
2923
+ readonly key: "order_completed";
2924
+ readonly label: "Order completed";
2925
+ }, {
2893
2926
  readonly key: "order_placed";
2894
2927
  readonly label: "Order placed";
2895
2928
  }, {
@@ -4065,7 +4098,8 @@ declare class Attendee {
4065
4098
  declare enum NotificationChannel {
4066
4099
  WHATSAPP = "whatsapp",
4067
4100
  EMAIL = "email",
4068
- MOBILE = "mobile"
4101
+ MOBILE = "mobile",
4102
+ SMS = "sms"
4069
4103
  }
4070
4104
  declare enum NotificationAudienceType {
4071
4105
  CUSTOMERS = "customers",
package/dist/index.d.ts CHANGED
@@ -1900,7 +1900,7 @@ declare function serializeEmailRecipients(emails: string[]): string;
1900
1900
  /** Join for SMTP `to` header (multiple recipients). */
1901
1901
  declare function joinRecipientsForSend(emails: string[]): string | null;
1902
1902
 
1903
- type OtpPurpose = 'login' | 'verify_email' | 'verify_phone';
1903
+ type OtpPurpose = 'login' | 'verify_email' | 'verify_phone' | 'order_completion';
1904
1904
  type OtpChannel = 'email' | 'sms';
1905
1905
  declare function hashOtpCode(code: string, purpose: string, identifier: string, pepper?: string): string;
1906
1906
  declare function verifyOtpCodeHash(code: string, storedHash: string, purpose: string, identifier: string, pepper?: string): boolean;
@@ -2566,6 +2566,9 @@ declare class Order {
2566
2566
  customerContact: Customer_Contacts | null;
2567
2567
  billingAddress: OrderAddresses | null;
2568
2568
  shippingAddress: OrderAddresses | null;
2569
+ assignedUserId: number | null;
2570
+ assignedAt: Date | null;
2571
+ assignedUser: User | null;
2569
2572
  items: OrderItem[];
2570
2573
  payments: Payment[];
2571
2574
  }
@@ -2819,19 +2822,10 @@ declare function fireOrderNotificationTrigger(triggerKey: string, orderId: numbe
2819
2822
  extraVariables?: Record<string, string>;
2820
2823
  }): void;
2821
2824
 
2822
- interface OrderNotificationDispatcherDeps {
2823
- dataSource: any;
2824
- entityMap: EntityMap$2;
2825
- getCms: () => Promise<CmsAppLike$1>;
2826
- }
2827
- declare function initWhatsappTriggerDispatcher(deps: OrderNotificationDispatcherDeps): void;
2828
- /** Manually re-fire a trigger for an existing order (admin testing / resend). */
2829
- declare function resendOrderNotification(triggerKey: string, orderId: number, deps: OrderNotificationDispatcherDeps): Promise<{
2830
- ok: boolean;
2831
- error?: string;
2832
- }>;
2833
-
2834
2825
  declare const KNOWN_NOTIFICATION_TRIGGERS: {
2826
+ readonly ORDER_PENDING: "order_pending";
2827
+ readonly ORDER_PROCESSING: "order_processing";
2828
+ readonly ORDER_COMPLETED: "order_completed";
2835
2829
  readonly ORDER_PLACED: "order_placed";
2836
2830
  readonly ORDER_CANCELLED: "order_cancelled";
2837
2831
  readonly PAYMENT_SUCCESS: "payment_success";
@@ -2855,41 +2849,80 @@ declare class NotificationTriggerEmitter extends EventEmitter {
2855
2849
  }
2856
2850
  declare const notificationTriggerEmitter: NotificationTriggerEmitter;
2857
2851
 
2852
+ interface OrderNotificationDispatcherDeps {
2853
+ dataSource: any;
2854
+ entityMap: EntityMap$2;
2855
+ getCms: () => Promise<CmsAppLike$1>;
2856
+ }
2857
+ declare function initWhatsappTriggerDispatcher(deps: OrderNotificationDispatcherDeps): void;
2858
+ /** Manually re-fire a trigger for an existing order (admin testing / resend). */
2859
+ declare function resendOrderNotification(triggerKey: string, orderId: number, deps: OrderNotificationDispatcherDeps): Promise<{
2860
+ ok: boolean;
2861
+ error?: string;
2862
+ }>;
2863
+
2858
2864
  /** Default order lifecycle triggers — seeded by migration, not tied to the `events` table. */
2859
2865
  declare const DEFAULT_ORDER_NOTIFICATION_TRIGGER_SEEDS: readonly [{
2866
+ readonly triggerKey: "order_pending";
2867
+ readonly label: "Order pending";
2868
+ readonly description: "Fires when an order is created and pending confirmation or payment.";
2869
+ readonly category: "order";
2870
+ readonly sortOrder: 1;
2871
+ }, {
2872
+ readonly triggerKey: "order_processing";
2873
+ readonly label: "Order processing";
2874
+ readonly description: "Fires when an order moves to processing after being assigned.";
2875
+ readonly category: "order";
2876
+ readonly sortOrder: 2;
2877
+ }, {
2878
+ readonly triggerKey: "order_completed";
2879
+ readonly label: "Order completed";
2880
+ readonly description: "Fires when an order is completed after customer OTP validation.";
2881
+ readonly category: "order";
2882
+ readonly sortOrder: 3;
2883
+ }, {
2860
2884
  readonly triggerKey: "order_placed";
2861
2885
  readonly label: "Order placed";
2862
2886
  readonly description: "Fires when a new order is created (storefront checkout or admin).";
2863
2887
  readonly category: "order";
2864
- readonly sortOrder: 1;
2888
+ readonly sortOrder: 4;
2865
2889
  }, {
2866
2890
  readonly triggerKey: "order_cancelled";
2867
2891
  readonly label: "Order cancelled";
2868
2892
  readonly description: "Fires when an order is cancelled (includes refund amount when applicable).";
2869
2893
  readonly category: "order";
2870
- readonly sortOrder: 2;
2894
+ readonly sortOrder: 5;
2871
2895
  }, {
2872
2896
  readonly triggerKey: "payment_success";
2873
2897
  readonly label: "Payment success";
2874
2898
  readonly description: "Fires when order is placed and payment status is paid.";
2875
2899
  readonly category: "order";
2876
- readonly sortOrder: 3;
2900
+ readonly sortOrder: 6;
2877
2901
  }, {
2878
2902
  readonly triggerKey: "payment_failed";
2879
2903
  readonly label: "Payment failed";
2880
2904
  readonly description: "Fires when payment status is pending, unpaid, or failed, or when order is cancelled without payment.";
2881
2905
  readonly category: "order";
2882
- readonly sortOrder: 4;
2906
+ readonly sortOrder: 7;
2883
2907
  }, {
2884
2908
  readonly triggerKey: "payment_refund_initiated";
2885
2909
  readonly label: "Payment refund initiated";
2886
2910
  readonly description: "Fires when order is cancelled and its payment status is paid (refund initiated).";
2887
2911
  readonly category: "order";
2888
- readonly sortOrder: 5;
2912
+ readonly sortOrder: 8;
2889
2913
  }];
2890
2914
 
2891
2915
  /** @deprecated Use DB catalog `order_notification_triggers`; kept for type hints. */
2892
2916
  declare const ORDER_NOTIFICATION_TRIGGERS: readonly [{
2917
+ readonly key: "order_pending";
2918
+ readonly label: "Order pending";
2919
+ }, {
2920
+ readonly key: "order_processing";
2921
+ readonly label: "Order processing";
2922
+ }, {
2923
+ readonly key: "order_completed";
2924
+ readonly label: "Order completed";
2925
+ }, {
2893
2926
  readonly key: "order_placed";
2894
2927
  readonly label: "Order placed";
2895
2928
  }, {
@@ -4065,7 +4098,8 @@ declare class Attendee {
4065
4098
  declare enum NotificationChannel {
4066
4099
  WHATSAPP = "whatsapp",
4067
4100
  EMAIL = "email",
4068
- MOBILE = "mobile"
4101
+ MOBILE = "mobile",
4102
+ SMS = "sms"
4069
4103
  }
4070
4104
  declare enum NotificationAudienceType {
4071
4105
  CUSTOMERS = "customers",
package/dist/index.js CHANGED
@@ -1,18 +1,22 @@
1
- export { emitOrderNotificationTrigger, fireOrderNotificationTrigger } from './chunk-O2642WVS.js';
2
- import { checkMultiVendorEnabled, loadUserVendorContext, getPublicSettingsGroup, BlogGeneratorService } from './chunk-UHT4INVW.js';
3
- export { Address, Attendee, Attribute, BLOG_GENERATOR_AGENT_NAME, BLOG_GENERATOR_DEFAULT_SYSTEM_INSTRUCTION, BLOG_GENERATOR_DEFAULT_VALIDATION_RULES, BLOG_GENERATOR_LLM_AGENT_SLUG, BLOG_GENERATOR_MARKDOWN_ARTICLE_SEPARATOR, BLOG_METADATA_ENRICHER_AGENT_NAME, BLOG_METADATA_ENRICHER_DEFAULT_SYSTEM_INSTRUCTION, BLOG_METADATA_ENRICHER_DEFAULT_VALIDATION_RULES, BLOG_METADATA_ENRICHER_LLM_AGENT_SLUG, Blog, BlogGeneratorService, Brand, CMS_ENTITY_MAP, Cart, CartItem, Category, ChatConversation, ChatMessage, Collection, Combo, ComboItem, Comment, Config, Contact, Currency, CurrencyExchange, Customer, Customer_Contacts, Discount, DiscountRules, Event, EventProduct, Form, FormField, FormSubmission, JobSchedule, JobScheduleRun, KnowledgeBaseChunk, KnowledgeBaseDocument, LlmAgent, LlmAgentKnowledgeDocument, Media, MessageTemplate, Order, OrderAddresses, OrderDiscounts, OrderItem, OrderNotificationBinding, OrderNotificationTrigger, OtpChallenge, Page, PasswordResetToken, Payment, Permission, Product, ProductAttribute, ProductCategory, ProductConfig, ProductVariant, RefundPolicy, RefundRequest, RssArticle, RssFeed, Seo, Tag, Tax, User, UserDeviceToken, UserGroup, Vendor, VendorCustomer, VendorRole, VendorRolePermission, VendorUser, VendorUserProfile, Wishlist, WishlistItem, ZIP_MIME_TYPES, applyApprovalStatusSideEffects, applyEventApprovalStatusSideEffects, applyRotatingVendorInvite, applyVendorCustomersContactFilter, applyVendorEventCreateApproval, applyVendorProductCreateApproval, assertCaptchaOk, assertContactAllowedForVendorOrder, assertEventApprovalUpdate, assertProductApprovalUpdate, autoExpireOrderIfPaymentTimeExceeded, buildBlogMetadataUserPrompt, buildCronFromSchedule, buildRssUserPromptFromFeeds, buildUserInviteLink, buildVendorInviteLink, calculateOrderRefundPreview, calculateRefundFromPolicy, checkAndIncrementDiscountUsage, checkEventsEnabled, checkMultiVendorEnabled, completeUserInviteAccept, consumeAppliedDiscountUsages, contactIsVendorCustomer, countDiscountOrdersForContact, countRecentOtpSends, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCmsApp, createCmsAppWithMessaging, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createEventOrderMessageTemplateHandlers, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createMessageTemplateRowLoader, createOtpChallenge, createSetPasswordHandler, createSettingsApiHandlers, createSocialMediaHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, daysBeforeEventStart, decrementDiscountUsage, describeEventTierPolicy, ensureMessagingPluginsOnCms, ensureScheduleQueueWorker, ensureVendorCustomerForOrderContact, ensureVendorCustomersForOrder, findActiveRefundPolicyForVendor, findUserByInviteToken, findVendorByInviteToken, formatTierRange, generateNumericOtp, getPublicSettingsGroup, getRequireEventApproval, getRequireProductApproval, getRssArticleSummaryFromItem, getVendorCatalogCreateFlags, hashOtpCode, hydrateVendorSessionUser, invalidateEventsCache, invalidateMultiVendorCache, invalidateRequireEventApprovalCache, invalidateRequireProductApprovalCache, invalidateVendorCatalogCreateFlagsCache, isCustomerTypeContact, isMaxPerUserUsageReached, isMaxTotalUsageReached, isZipMedia, llmAgentToChatAgentOptions, loadSettingsGroupFromDb, loadUserVendorContext, mergeGuardrailsIntoSystemPrompt, messagingPlugins, metaFetchUserManagedPages, metaPostPageFeed, metaPostPagePhoto, metaResolvePageAccessToken, newUserInviteToken, normalizePhoneE164, normalizeRefundTiers, overlayCmsPlugins, parseBlogGeneratorAgentContent, parseBlogGeneratorModelOutput, parseBlogMetadataEnrichmentJson, parseLlmAgentValidationRules, pgBossScheduleNameForId, queueErpCreateContactIfEnabled, queueJobScheduleNow, queuePlugin, queueSms, recordDiscountUsage, registerJobRunnerWorker, registerMessagingQueueProcessors, registerSmsQueueProcessor, relativePathFromMediaParentId, resolveBlogCategoryIdByName, resolveSettingsEncryptionKey, resolveVendorIdForContactCheck, sanitizeMediaFolderPath, sanitizeStorageSegment, sendVendorOnboardEmails, simpleDecrypt, simpleEncrypt, syncJobScheduleToPgBoss, validateRefundTiers, validateScheduleInput, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules, verifyAndConsumeOtpChallenge, verifyOtpCodeHash, whatsappPlugin, wrapGetCmsWithMessaging } from './chunk-UHT4INVW.js';
1
+ export { emitOrderNotificationTrigger, fireOrderNotificationTrigger } from './chunk-6XAVZE4I.js';
2
+ import { checkMultiVendorEnabled, loadUserVendorContext, getPublicSettingsGroup, BlogGeneratorService } from './chunk-R6Q67HAS.js';
3
+ export { Address, Attendee, Attribute, BLOG_GENERATOR_AGENT_NAME, BLOG_GENERATOR_DEFAULT_SYSTEM_INSTRUCTION, BLOG_GENERATOR_DEFAULT_VALIDATION_RULES, BLOG_GENERATOR_LLM_AGENT_SLUG, BLOG_GENERATOR_MARKDOWN_ARTICLE_SEPARATOR, BLOG_METADATA_ENRICHER_AGENT_NAME, BLOG_METADATA_ENRICHER_DEFAULT_SYSTEM_INSTRUCTION, BLOG_METADATA_ENRICHER_DEFAULT_VALIDATION_RULES, BLOG_METADATA_ENRICHER_LLM_AGENT_SLUG, Blog, BlogGeneratorService, Brand, CMS_ENTITY_MAP, Cart, CartItem, Category, ChatConversation, ChatMessage, Collection, Combo, ComboItem, Comment, Config, Contact, Currency, CurrencyExchange, Customer, Customer_Contacts, Discount, DiscountRules, Event, EventProduct, Form, FormField, FormSubmission, JobSchedule, JobScheduleRun, KnowledgeBaseChunk, KnowledgeBaseDocument, LlmAgent, LlmAgentKnowledgeDocument, Media, MessageTemplate, Order, OrderAddresses, OrderDiscounts, OrderItem, OrderNotificationBinding, OrderNotificationTrigger, OtpChallenge, Page, PasswordResetToken, Payment, Permission, Product, ProductAttribute, ProductCategory, ProductConfig, ProductVariant, RefundPolicy, RefundRequest, RssArticle, RssFeed, Seo, Tag, Tax, User, UserDeviceToken, UserGroup, Vendor, VendorCustomer, VendorRole, VendorRolePermission, VendorUser, VendorUserProfile, Wishlist, WishlistItem, ZIP_MIME_TYPES, applyApprovalStatusSideEffects, applyEventApprovalStatusSideEffects, applyRotatingVendorInvite, applyVendorCustomersContactFilter, applyVendorEventCreateApproval, applyVendorProductCreateApproval, assertCaptchaOk, assertContactAllowedForVendorOrder, assertEventApprovalUpdate, assertProductApprovalUpdate, autoExpireOrderIfPaymentTimeExceeded, buildBlogMetadataUserPrompt, buildCronFromSchedule, buildRssUserPromptFromFeeds, buildUserInviteLink, buildVendorInviteLink, calculateOrderRefundPreview, calculateRefundFromPolicy, checkAndIncrementDiscountUsage, checkEventsEnabled, checkMultiVendorEnabled, completeUserInviteAccept, consumeAppliedDiscountUsages, contactIsVendorCustomer, countDiscountOrdersForContact, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCmsApp, createCmsAppWithMessaging, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createEventOrderMessageTemplateHandlers, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createMessageTemplateRowLoader, createSetPasswordHandler, createSettingsApiHandlers, createSocialMediaHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, daysBeforeEventStart, decrementDiscountUsage, describeEventTierPolicy, ensureMessagingPluginsOnCms, ensureScheduleQueueWorker, ensureVendorCustomerForOrderContact, ensureVendorCustomersForOrder, findActiveRefundPolicyForVendor, findUserByInviteToken, findVendorByInviteToken, formatTierRange, getPublicSettingsGroup, getRequireEventApproval, getRequireProductApproval, getRssArticleSummaryFromItem, getVendorCatalogCreateFlags, hydrateVendorSessionUser, invalidateEventsCache, invalidateMultiVendorCache, invalidateRequireEventApprovalCache, invalidateRequireProductApprovalCache, invalidateVendorCatalogCreateFlagsCache, isCustomerTypeContact, isMaxPerUserUsageReached, isMaxTotalUsageReached, isZipMedia, llmAgentToChatAgentOptions, loadSettingsGroupFromDb, loadUserVendorContext, mergeGuardrailsIntoSystemPrompt, messagingPlugins, metaFetchUserManagedPages, metaPostPageFeed, metaPostPagePhoto, metaResolvePageAccessToken, newUserInviteToken, normalizeRefundTiers, overlayCmsPlugins, parseBlogGeneratorAgentContent, parseBlogGeneratorModelOutput, parseBlogMetadataEnrichmentJson, parseLlmAgentValidationRules, pgBossScheduleNameForId, queueErpCreateContactIfEnabled, queueJobScheduleNow, queuePlugin, recordDiscountUsage, registerJobRunnerWorker, registerMessagingQueueProcessors, relativePathFromMediaParentId, resolveBlogCategoryIdByName, resolveSettingsEncryptionKey, resolveVendorIdForContactCheck, sanitizeMediaFolderPath, sanitizeStorageSegment, sendVendorOnboardEmails, simpleDecrypt, simpleEncrypt, syncJobScheduleToPgBoss, validateRefundTiers, validateScheduleInput, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules, whatsappPlugin, wrapGetCmsWithMessaging } from './chunk-R6Q67HAS.js';
4
+ export { countRecentOtpSends, createOtpChallenge, generateNumericOtp, hashOtpCode, normalizePhoneE164, queueSms, registerSmsQueueProcessor, verifyAndConsumeOtpChallenge, verifyOtpCodeHash } from './chunk-OVTOP42W.js';
4
5
  import { PgBossService } from './chunk-GO7PPYNU.js';
5
6
  export { JOB_RUNNER_QUEUE, PgBossService } from './chunk-GO7PPYNU.js';
6
7
  export { deductInventoryForConfirmedOrder, mergeInventoryLines, orderInventorySnapshotFromRow, orderStatusHoldsStock, reconcileOrderInventoryBetweenSnapshots, restoreInventoryForCancelledOrder, validateInventoryForConfirmedOrderLines, validateInventoryForOrderBecomingConfirmed } from './chunk-3K5AIEIZ.js';
7
- import { parseEmailRecipientsFromConfig } from './chunk-URN7GS23.js';
8
- export { EmailService, buildEventOrderTemplateVariables, emailPlugin, emailTemplates, initWhatsappTriggerDispatcher, joinRecipientsForSend, parseEmailRecipientsFromConfig, queueWhatsApp, registerWhatsAppQueueProcessor, renderEmail, renderLayout, resendOrderNotification, serializeEmailRecipients } from './chunk-URN7GS23.js';
9
- export { KNOWN_NOTIFICATION_TRIGGERS, notificationTriggerEmitter } from './chunk-T3HPSF7K.js';
8
+ import { parseEmailRecipientsFromConfig } from './chunk-6LV36PCL.js';
9
+ export { buildEventOrderTemplateVariables, emailPlugin, initWhatsappTriggerDispatcher, joinRecipientsForSend, parseEmailRecipientsFromConfig, resendOrderNotification, serializeEmailRecipients } from './chunk-6LV36PCL.js';
10
+ export { queueWhatsApp, registerWhatsAppQueueProcessor } from './chunk-GWDI752Q.js';
11
+ export { KNOWN_NOTIFICATION_TRIGGERS, notificationTriggerEmitter } from './chunk-AYWDQFJZ.js';
10
12
  import './chunk-JXF23MPG.js';
11
- import { queueOrderPlacedEmails } from './chunk-L3525VXI.js';
12
- export { queueEmail, queueOrderPlacedEmails, queueVendorOnboardEmails, registerEmailQueueProcessor } from './chunk-L3525VXI.js';
13
- import { mergeEmailLayoutCompanyDetails } from './chunk-2KUCQVAQ.js';
14
- export { INVOICE_TEMPLATE_IDS, INVOICE_TEMPLATE_OPTIONS, buildLocalInvoicePdfForOrder, generateLocalInvoicePdf, getCompanyDetailsFromSettings, isOrderEligibleForInvoiceEmail, mergeEmailLayoutCompanyDetails, normalizeInvoiceTemplateId, resolveInvoiceAssetUrl, resolveOrderInvoicePdfBytes, streamOrderInvoicePdf } from './chunk-2KUCQVAQ.js';
13
+ export { EmailService, emailTemplates, renderEmail, renderLayout } from './chunk-GZGFNVTK.js';
14
+ import { queueOrderPlacedEmails } from './chunk-YW7EF7K7.js';
15
+ export { queueEmail, queueOrderPlacedEmails, queueVendorOnboardEmails, registerEmailQueueProcessor } from './chunk-YW7EF7K7.js';
16
+ export { INVOICE_TEMPLATE_IDS, INVOICE_TEMPLATE_OPTIONS, buildLocalInvoicePdfForOrder, generateLocalInvoicePdf, isOrderEligibleForInvoiceEmail, normalizeInvoiceTemplateId, resolveInvoiceAssetUrl, resolveOrderInvoicePdfBytes, streamOrderInvoicePdf } from './chunk-HMLVPIJR.js';
15
17
  import './chunk-JC6DLWTE.js';
18
+ import { mergeEmailLayoutCompanyDetails } from './chunk-NMYGQWHV.js';
19
+ export { getCompanyDetailsFromSettings, mergeEmailLayoutCompanyDetails } from './chunk-NMYGQWHV.js';
16
20
  import './chunk-MQBT33IV.js';
17
21
  import './chunk-CRFV5WJK.js';
18
22
  export { EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS, EVENT_ORDER_TEMPLATE_KEY, EVENT_ORDER_TEMPLATE_VARIABLES, resolveEventOrderTemplate } from './chunk-AYERBA7I.js';
@@ -774,10 +778,6 @@ function resolveSmsProvider(cfg) {
774
778
  return null;
775
779
  }
776
780
  __name(resolveSmsProvider, "resolveSmsProvider");
777
- function anySmsProviderConfigured(cfg) {
778
- return resolveSmsProvider(cfg) !== null;
779
- }
780
- __name(anySmsProviderConfigured, "anySmsProviderConfigured");
781
781
  var MSG91_FLOW_URL = "https://control.msg91.com/api/v5/flow/";
782
782
  async function sendViaMsg91Flow(cfg, to, body, opts, overrides) {
783
783
  const authkey = cfg.msg91AuthKey;
@@ -987,17 +987,33 @@ function smsPlugin(config = {}) {
987
987
  async init(context) {
988
988
  const env = context.config;
989
989
  const { getSmsSettings, getMessageTemplateRow, ...staticRest } = config;
990
+ let settingsLoader = getSmsSettings;
991
+ if (!settingsLoader && context.dataSource) {
992
+ settingsLoader = /* @__PURE__ */ __name(async () => {
993
+ try {
994
+ const ds = context.dataSource;
995
+ const repo = ds.getRepository("configs");
996
+ const rows = await repo.find({
997
+ where: {
998
+ settings: "sms",
999
+ deleted: false
1000
+ }
1001
+ });
1002
+ return Object.fromEntries(rows.map((r) => [
1003
+ r.key,
1004
+ r.value
1005
+ ]));
1006
+ } catch {
1007
+ return {};
1008
+ }
1009
+ }, "settingsLoader");
1010
+ }
990
1011
  let db = {};
991
1012
  try {
992
- db = await getSmsSettings?.() ?? {};
1013
+ db = await settingsLoader?.() ?? {};
993
1014
  } catch {
994
1015
  }
995
- const merged = mergeSmsConfigLayers(env, db, staticRest);
996
- if (!anySmsProviderConfigured(merged)) {
997
- context.logger.warn("SMS plugin skipped: set MSG91_AUTH_KEY (Flow template id per Plugins \u2192 SMS templates or MSG91_TEMPLATE_ID; or sendhttp: MSG91_SENDER_ID), or TWILIO_*, or SMS_WEBHOOK_URL");
998
- return null;
999
- }
1000
- const svc = new SmsService(env, staticRest, getSmsSettings, getMessageTemplateRow);
1016
+ const svc = new SmsService(env, staticRest, settingsLoader, getMessageTemplateRow);
1001
1017
  return {
1002
1018
  send: /* @__PURE__ */ __name((opts) => svc.send(opts), "send")
1003
1019
  };
@@ -2721,45 +2737,78 @@ __name(sendOrderPlacedEmailsAfterConfirmation, "sendOrderPlacedEmailsAfterConfir
2721
2737
 
2722
2738
  // src/lib/order-notification-trigger-seeds.ts
2723
2739
  var DEFAULT_ORDER_NOTIFICATION_TRIGGER_SEEDS = [
2740
+ {
2741
+ triggerKey: "order_pending",
2742
+ label: "Order pending",
2743
+ description: "Fires when an order is created and pending confirmation or payment.",
2744
+ category: "order",
2745
+ sortOrder: 1
2746
+ },
2747
+ {
2748
+ triggerKey: "order_processing",
2749
+ label: "Order processing",
2750
+ description: "Fires when an order moves to processing after being assigned.",
2751
+ category: "order",
2752
+ sortOrder: 2
2753
+ },
2754
+ {
2755
+ triggerKey: "order_completed",
2756
+ label: "Order completed",
2757
+ description: "Fires when an order is completed after customer OTP validation.",
2758
+ category: "order",
2759
+ sortOrder: 3
2760
+ },
2724
2761
  {
2725
2762
  triggerKey: "order_placed",
2726
2763
  label: "Order placed",
2727
2764
  description: "Fires when a new order is created (storefront checkout or admin).",
2728
2765
  category: "order",
2729
- sortOrder: 1
2766
+ sortOrder: 4
2730
2767
  },
2731
2768
  {
2732
2769
  triggerKey: "order_cancelled",
2733
2770
  label: "Order cancelled",
2734
2771
  description: "Fires when an order is cancelled (includes refund amount when applicable).",
2735
2772
  category: "order",
2736
- sortOrder: 2
2773
+ sortOrder: 5
2737
2774
  },
2738
2775
  {
2739
2776
  triggerKey: "payment_success",
2740
2777
  label: "Payment success",
2741
2778
  description: "Fires when order is placed and payment status is paid.",
2742
2779
  category: "order",
2743
- sortOrder: 3
2780
+ sortOrder: 6
2744
2781
  },
2745
2782
  {
2746
2783
  triggerKey: "payment_failed",
2747
2784
  label: "Payment failed",
2748
2785
  description: "Fires when payment status is pending, unpaid, or failed, or when order is cancelled without payment.",
2749
2786
  category: "order",
2750
- sortOrder: 4
2787
+ sortOrder: 7
2751
2788
  },
2752
2789
  {
2753
2790
  triggerKey: "payment_refund_initiated",
2754
2791
  label: "Payment refund initiated",
2755
2792
  description: "Fires when order is cancelled and its payment status is paid (refund initiated).",
2756
2793
  category: "order",
2757
- sortOrder: 5
2794
+ sortOrder: 8
2758
2795
  }
2759
2796
  ];
2760
2797
 
2761
2798
  // src/lib/order-notification-triggers.ts
2762
2799
  var ORDER_NOTIFICATION_TRIGGERS = [
2800
+ {
2801
+ key: "order_pending",
2802
+ label: "Order pending"
2803
+ },
2804
+ {
2805
+ key: "order_processing",
2806
+ label: "Order processing"
2807
+ },
2808
+ {
2809
+ key: "order_completed",
2810
+ label: "Order completed"
2811
+ },
2763
2812
  {
2764
2813
  key: "order_placed",
2765
2814
  label: "Order placed"
@@ -0,0 +1,56 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ export class AddOrderPendingProcessingCompletedTriggers1783000000000 implements MigrationInterface {
4
+ name = "AddOrderPendingProcessingCompletedTriggers1783000000000";
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ const tableExists = await queryRunner.hasTable("notification_triggers");
8
+ if (!tableExists) return;
9
+
10
+ const triggers = [
11
+ {
12
+ id: "order.pending",
13
+ name: "Order Pending",
14
+ description: "Triggered when a customer places an order and it is pending confirmation or payment.",
15
+ category: "orders",
16
+ enabled: true,
17
+ },
18
+ {
19
+ id: "order.processing",
20
+ name: "Order Processing",
21
+ description: "Triggered when an order transitions to processing status after being assigned to a team member.",
22
+ category: "orders",
23
+ enabled: true,
24
+ },
25
+ {
26
+ id: "order.completed",
27
+ name: "Order Completed",
28
+ description: "Triggered when an order is completed after customer OTP validation.",
29
+ category: "orders",
30
+ enabled: true,
31
+ },
32
+ ];
33
+
34
+ for (const t of triggers) {
35
+ await queryRunner.query(
36
+ `INSERT INTO "notification_triggers" ("id", "name", "description", "category", "enabled")
37
+ VALUES ($1, $2, $3, $4, $5)
38
+ ON CONFLICT ("id") DO UPDATE
39
+ SET "name" = EXCLUDED."name",
40
+ "description" = EXCLUDED."description",
41
+ "category" = EXCLUDED."category",
42
+ "enabled" = EXCLUDED."enabled"`,
43
+ [t.id, t.name, t.description, t.category, t.enabled]
44
+ );
45
+ }
46
+ }
47
+
48
+ public async down(queryRunner: QueryRunner): Promise<void> {
49
+ const tableExists = await queryRunner.hasTable("notification_triggers");
50
+ if (!tableExists) return;
51
+
52
+ await queryRunner.query(
53
+ `DELETE FROM "notification_triggers" WHERE "id" IN ('order.pending', 'order.processing', 'order.completed')`
54
+ );
55
+ }
56
+ }
@@ -0,0 +1,17 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ export class AddSmsToOrderNotificationBindingsChannelEnum1783100000000 implements MigrationInterface {
4
+ name = "AddSmsToOrderNotificationBindingsChannelEnum1783100000000";
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ try {
8
+ await queryRunner.query(`ALTER TYPE "order_notification_bindings_channel_enum" ADD VALUE IF NOT EXISTS 'sms'`);
9
+ } catch {
10
+ /* ignore if enum doesn't exist or already added */
11
+ }
12
+ }
13
+
14
+ public async down(_queryRunner: QueryRunner): Promise<void> {
15
+ // Enum values cannot easily be removed in Postgres without recreating
16
+ }
17
+ }
@@ -0,0 +1,30 @@
1
+ import type { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ /** Add assignedUserId and assignedAt columns to orders table. */
4
+ export class AddOrderAssigneeColumns1783200000000 implements MigrationInterface {
5
+ name = 'AddOrderAssigneeColumns1783200000000';
6
+
7
+ public async up(queryRunner: QueryRunner): Promise<void> {
8
+ await queryRunner.query(`
9
+ ALTER TABLE "orders"
10
+ ADD COLUMN IF NOT EXISTS "assignedUserId" integer NULL,
11
+ ADD COLUMN IF NOT EXISTS "assignedAt" TIMESTAMP NULL;
12
+ `);
13
+
14
+ await queryRunner.query(`
15
+ CREATE INDEX IF NOT EXISTS "IDX_orders_assigned_user"
16
+ ON "orders" ("assignedUserId");
17
+ `);
18
+ }
19
+
20
+ public async down(queryRunner: QueryRunner): Promise<void> {
21
+ await queryRunner.query(`
22
+ DROP INDEX IF EXISTS "IDX_orders_assigned_user";
23
+ `);
24
+ await queryRunner.query(`
25
+ ALTER TABLE "orders"
26
+ DROP COLUMN IF EXISTS "assignedAt",
27
+ DROP COLUMN IF EXISTS "assignedUserId";
28
+ `);
29
+ }
30
+ }