@burdenoff/be-sdk 2026.611.1 → 2026.618.1

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 (87) hide show
  1. package/dist/auth/index.d.ts +2 -2
  2. package/dist/auth/index.js +3 -3
  3. package/dist/cache/index.d.ts +2 -2
  4. package/dist/cache/index.js +2 -2
  5. package/dist/{chunk-ZRRLY7SM.js → chunk-5FEOFBQ4.js} +4 -4
  6. package/dist/{chunk-ZRRLY7SM.js.map → chunk-5FEOFBQ4.js.map} +1 -1
  7. package/dist/chunk-DXX6C6X6.js +210 -0
  8. package/dist/chunk-DXX6C6X6.js.map +1 -0
  9. package/dist/{chunk-KKCC3Z4I.js → chunk-FKSMQLIV.js} +3 -3
  10. package/dist/{chunk-KKCC3Z4I.js.map → chunk-FKSMQLIV.js.map} +1 -1
  11. package/dist/{chunk-BNJFEOGH.js → chunk-FTDQ6NY5.js} +4 -4
  12. package/dist/{chunk-BNJFEOGH.js.map → chunk-FTDQ6NY5.js.map} +1 -1
  13. package/dist/{chunk-VWCN5PMD.js → chunk-HRCWJLCZ.js} +8 -3
  14. package/dist/chunk-HRCWJLCZ.js.map +1 -0
  15. package/dist/{chunk-5SD7DU3L.js → chunk-IC7YDBGE.js} +3 -3
  16. package/dist/{chunk-5SD7DU3L.js.map → chunk-IC7YDBGE.js.map} +1 -1
  17. package/dist/{chunk-4NFZOFRS.js → chunk-L2P4CJUR.js} +2 -2
  18. package/dist/{chunk-4NFZOFRS.js.map → chunk-L2P4CJUR.js.map} +1 -1
  19. package/dist/{chunk-BJVXHIUV.js → chunk-N7UJFZQH.js} +9 -5
  20. package/dist/chunk-N7UJFZQH.js.map +1 -0
  21. package/dist/{chunk-O6RHB2YP.js → chunk-SMGTXYFR.js} +2 -2
  22. package/dist/chunk-SMGTXYFR.js.map +1 -0
  23. package/dist/{chunk-GSEPF2B6.js → chunk-UIMPJNWC.js} +3 -3
  24. package/dist/{chunk-GSEPF2B6.js.map → chunk-UIMPJNWC.js.map} +1 -1
  25. package/dist/{chunk-7NYCLQFJ.js → chunk-UYE4IEPT.js} +3 -3
  26. package/dist/{chunk-7NYCLQFJ.js.map → chunk-UYE4IEPT.js.map} +1 -1
  27. package/dist/{chunk-GMFHIFS5.js → chunk-X7QMT2P6.js} +3 -3
  28. package/dist/{chunk-GMFHIFS5.js.map → chunk-X7QMT2P6.js.map} +1 -1
  29. package/dist/{chunk-UFQQSQG6.js → chunk-XNQUN3AE.js} +3 -3
  30. package/dist/{chunk-UFQQSQG6.js.map → chunk-XNQUN3AE.js.map} +1 -1
  31. package/dist/{chunk-TIINMQSD.js → chunk-XR3KUHJ5.js} +3 -3
  32. package/dist/{chunk-TIINMQSD.js.map → chunk-XR3KUHJ5.js.map} +1 -1
  33. package/dist/{chunk-HP6JTFNR.js → chunk-YFOHAHZE.js} +2 -2
  34. package/dist/{chunk-HP6JTFNR.js.map → chunk-YFOHAHZE.js.map} +1 -1
  35. package/dist/{chunk-RMDKB5O7.js → chunk-ZHQUXD6S.js} +3 -3
  36. package/dist/{chunk-RMDKB5O7.js.map → chunk-ZHQUXD6S.js.map} +1 -1
  37. package/dist/{chunk-PPIDJP2W.js → chunk-ZPEDC5V3.js} +5 -5
  38. package/dist/{chunk-PPIDJP2W.js.map → chunk-ZPEDC5V3.js.map} +1 -1
  39. package/dist/database/index.js +3 -3
  40. package/dist/event-queue/index.d.ts +4 -4
  41. package/dist/export/index.d.ts +2 -2
  42. package/dist/export/index.js +6 -5
  43. package/dist/feature-flags/index.js +2 -1
  44. package/dist/gateway/index.d.ts +2 -2
  45. package/dist/gateway/index.js +5 -4
  46. package/dist/gateway/security/index.js +1 -1
  47. package/dist/graph/index.d.ts +3 -3
  48. package/dist/graph/index.js +3 -3
  49. package/dist/{graphql-DH3L5Hj7.d.ts → graphql-CNhiZ89U.d.ts} +1 -1
  50. package/dist/{index-DLyc5o_K.d.ts → index-B-w7NWpD.d.ts} +1 -1
  51. package/dist/{index-BqSh1K8I.d.ts → index-B0ebYV9W.d.ts} +1 -1
  52. package/dist/{index-Dg4kH1VJ.d.ts → index-B4ciT3OZ.d.ts} +1 -1
  53. package/dist/{index-BVjR9llq.d.ts → index-BCUkR8sC.d.ts} +1 -1
  54. package/dist/{index-KA3gg4es.d.ts → index-BKjt3X8L.d.ts} +1 -1
  55. package/dist/{index-fhOvuvlv.d.ts → index-CVFEyBvK.d.ts} +1 -1
  56. package/dist/{index-C7T0Xx19.d.ts → index-D7BJuXP3.d.ts} +3 -3
  57. package/dist/{index-Caqvetqq.d.ts → index-D9RN6jp1.d.ts} +2 -0
  58. package/dist/{index-Cz9_vPi7.d.ts → index-DYQF_AIz.d.ts} +2 -2
  59. package/dist/{index-DBF8VqIf.d.ts → index-DkObbJD_.d.ts} +1 -1
  60. package/dist/{index-BZPEyVOl.d.ts → index-DohlGQGw.d.ts} +3 -3
  61. package/dist/{index-DohaJRZP.d.ts → index-DraeealK.d.ts} +2 -2
  62. package/dist/index.d.ts +23 -19
  63. package/dist/index.js +35 -161
  64. package/dist/index.js.map +1 -1
  65. package/dist/init/index.d.ts +2 -2
  66. package/dist/init/index.js +6 -5
  67. package/dist/instrumentation/index.d.ts +3 -3
  68. package/dist/layer/index.d.ts +2 -2
  69. package/dist/layer/index.js +2 -2
  70. package/dist/{layer-CUu_cZ7d.d.ts → layer-GNAVXBMf.d.ts} +2 -0
  71. package/dist/logger/index.d.ts +2 -2
  72. package/dist/notifications/index.d.ts +3 -3
  73. package/dist/notifications/index.js +3 -3
  74. package/dist/rbac/index.d.ts +3 -3
  75. package/dist/rbac/index.js +3 -3
  76. package/dist/resource-caps/index.d.ts +2 -2
  77. package/dist/server/index.js +2 -0
  78. package/dist/server/index.js.map +1 -1
  79. package/dist/telemetry/index.d.ts +4 -4
  80. package/dist/temporal/index.d.ts +1 -1
  81. package/dist/temporal/index.js +2 -2
  82. package/dist/tracker/index.d.ts +4 -4
  83. package/dist/tracker/index.js +5 -5
  84. package/package.json +1 -1
  85. package/dist/chunk-BJVXHIUV.js.map +0 -1
  86. package/dist/chunk-O6RHB2YP.js.map +0 -1
  87. package/dist/chunk-VWCN5PMD.js.map +0 -1
@@ -103,5 +103,5 @@ var DEFAULT_GATEWAY_RETRY_CONFIG = {
103
103
  };
104
104
 
105
105
  export { DEFAULT_CIRCUIT_BREAKER_CONFIG, DEFAULT_GATEWAY_RETRY_CONFIG, DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES, DEFAULT_LAYER_STREAMS };
106
- //# sourceMappingURL=chunk-HP6JTFNR.js.map
107
- //# sourceMappingURL=chunk-HP6JTFNR.js.map
106
+ //# sourceMappingURL=chunk-YFOHAHZE.js.map
107
+ //# sourceMappingURL=chunk-YFOHAHZE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/layer.ts"],"names":["DEFAULT_GATEWAY_ROUTING","wspace","layer","internalGateway","host","port","graphqlPath","crossLayerGateway","global","DEFAULT_LAYER_STREAMS","name","subjects","description","buildInternalGatewayUrl","routing","protocol","DEFAULT_LAYER_RESOURCES","eventQueueUrl","valkeyUrl","temporalAddress","temporalNamespace","rbacGatewayUrl","DEFAULT_CIRCUIT_BREAKER_CONFIG","failureThreshold","resetTimeout","failureWindow","DEFAULT_GATEWAY_RETRY_CONFIG","maxAttempts","initialDelay","maxDelay","backoffMultiplier"],"mappings":";;;AAyJO,IAAMA,uBAAAA,GAAsE;EACjFC,MAAAA,EAAQ;IACNC,KAAAA,EAAO,QAAA;IACPC,eAAAA,EAAiB;MACfC,IAAAA,EAAM,oBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf,KAAA;IACAC,iBAAAA,EAAmB;MACjBH,IAAAA,EAAM,uBAAA;MACNC,IAAAA,EAAM,GAAA;MACNC,WAAAA,EAAa;AACf;AACF,GAAA;EACAE,MAAAA,EAAQ;IACNN,KAAAA,EAAO,QAAA;IACPC,eAAAA,EAAiB;MACfC,IAAAA,EAAM,oBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf,KAAA;IACAC,iBAAAA,EAAmB;MACjBH,IAAAA,EAAM,uBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf;AACF;AACF;AAKO,IAAMG,qBAAAA,GAGT;EACFR,MAAAA,EAAQ;AACN,IAAA;MACES,IAAAA,EAAM,eAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf,KAAA;AACA,IAAA;MACEF,IAAAA,EAAM,qBAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf;;EAEFJ,MAAAA,EAAQ;AACN,IAAA;MACEE,IAAAA,EAAM,eAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf,KAAA;AACA,IAAA;MACEF,IAAAA,EAAM,qBAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf;;AAEJ;AAMA,SAASC,wBAAwBX,KAAAA,EAAmB;AAClD,EAAA,MAAMY,OAAAA,GAAUd,wBAAwBE,KAAAA,CAAAA;AACxC,EAAA,MAAM,EAAEE,IAAAA,EAAMC,IAAAA,EAAMC,WAAAA,KAAgBQ,OAAAA,CAAQX,eAAAA;AAE5C,EAAA,MAAMY,QAAAA,GAAW,MAAA;AACjB,EAAA,OAAO,GAAGA,QAAAA,CAAAA,GAAAA,EAAcX,IAAAA,CAAAA,CAAAA,EAAQC,IAAAA,GAAOC,WAAAA,CAAAA,CAAAA;AACzC;AANSO,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAcF,IAAMG,uBAAAA,GAAmE;;;;;EAK9Ef,MAAAA,EAAQ;IACNgB,aAAAA,EAAe,mCAAA;IACfC,SAAAA,EAAW,6BAAA;IACXC,eAAAA,EAAiB,sBAAA;IACjBC,iBAAAA,EAAmB,gBAAA;AACnBC,IAAAA,cAAAA,EAAgBR,wBAAwB,QAAA;AAC1C,GAAA;EACAL,MAAAA,EAAQ;IACNS,aAAAA,EAAe,mCAAA;IACfC,SAAAA,EAAW,6BAAA;IACXC,eAAAA,EAAiB,sBAAA;IACjBC,iBAAAA,EAAmB,gBAAA;AACnBC,IAAAA,cAAAA,EAAgBR,wBAAwB,QAAA;AAC1C;AACF;AA4BO,IAAMS,8BAAAA,GAAuD;EAClEC,gBAAAA,EAAkB,CAAA;EAClBC,YAAAA,EAAc,GAAA;EACdC,aAAAA,EAAe;AACjB;AAkCO,IAAMC,4BAAAA,GAAmD;EAC9DC,WAAAA,EAAa,CAAA;EACbC,YAAAA,EAAc,GAAA;EACdC,QAAAA,EAAU,GAAA;EACVC,iBAAAA,EAAmB;AACrB","file":"chunk-HP6JTFNR.js","sourcesContent":["/**\n * Layer Type Definitions for Burdenoff Backend SDK\n *\n * This module defines types for the layer-aware architecture,\n * supporting wspace (workspace) and global (tenant) service layers.\n *\n * @module types/layer\n * @category Configuration\n */\n\n/**\n * Service layer types\n * - wspace: Workspace layer services (product-specific operations)\n * - global: Global/tenant layer services (cross-product services)\n */\nexport type ServiceLayer = 'wspace' | 'global';\n\n/**\n * Layer configuration for a service\n */\nexport interface LayerConfig {\n /**\n * Layer type this service belongs to\n * @example 'wspace' or 'global'\n */\n layer: ServiceLayer;\n\n /**\n * Service name (e.g., 'wspace-tags-svc', 'global-auth-svc')\n */\n serviceName: string;\n\n /**\n * Service identity for bypass headers\n * Used for M2M authentication\n * @default serviceName\n */\n serviceIdentity?: string;\n}\n\n/**\n * Gateway configuration per layer\n */\nexport interface LayerGatewayConfig {\n /**\n * Internal gateway URL (same layer int-gateway)\n * - wspace services use: wspace-int-gateway\n * - global services use: global-int-gateway\n */\n internalGatewayUrl: string;\n\n /**\n * Cross-layer gateway URL (cross layer public-gateway)\n * - wspace services use: global-public-gateway\n * - global services use: wspace-public-gateway\n */\n crossLayerGatewayUrl: string;\n}\n\n/**\n * Resource URLs per layer\n */\nexport interface LayerResourceUrls {\n /**\n * Event queue (Redis Streams) URL.\n *\n * Single fleet-shared Redis instance in every environment:\n * - ACA (prod/alpha): Azure Managed Redis — `REDIS_URL` injected from\n * KeyVault overrides this default.\n * - Local dev: self-hosted `shared-valkey` reachable via\n * docker-compose; the default below points at the same container\n * name used by `~/products/dev`'s compose graph.\n *\n * `LayerManager.resolveResourceConfig()` always prefers `REDIS_URL`\n * from the environment, so the layer-scoped default is only the\n * local-dev fallback.\n */\n eventQueueUrl: string;\n\n /**\n * Valkey/Redis URL for the layer\n */\n valkeyUrl: string;\n\n /**\n * Temporal server address for the layer\n */\n temporalAddress: string;\n\n /**\n * Temporal namespace for the layer\n */\n temporalNamespace: string;\n\n /**\n * RBAC gateway URL (for permission checks)\n */\n rbacGatewayUrl: string;\n}\n\n/**\n * Complete layer configuration including gateways and resources\n */\nexport interface LayerFullConfig extends LayerConfig {\n /**\n * Gateway configuration\n */\n gateways: LayerGatewayConfig;\n\n /**\n * Resource URLs\n */\n resources: LayerResourceUrls;\n}\n\n/**\n * Gateway routing rules by layer\n * Defines which gateway to use for same-layer vs cross-layer communication\n */\nexport interface GatewayRoutingConfig {\n /**\n * Layer this config applies to\n */\n layer: ServiceLayer;\n\n /**\n * Internal gateway for same-layer M2M calls\n */\n internalGateway: {\n /** Gateway host (without protocol) */\n host: string;\n /** Gateway port */\n port: number;\n /** GraphQL endpoint path */\n graphqlPath: string;\n };\n\n /**\n * Public gateway for cross-layer calls\n */\n crossLayerGateway: {\n /** Gateway host (without protocol) */\n host: string;\n /** Gateway port */\n port: number;\n /** GraphQL endpoint path */\n graphqlPath: string;\n };\n}\n\n/**\n * Default gateway routing configuration\n */\nexport const DEFAULT_GATEWAY_ROUTING: Record<ServiceLayer, GatewayRoutingConfig> = {\n wspace: {\n layer: 'wspace',\n internalGateway: {\n host: 'wspace-int-gateway',\n port: 4001,\n graphqlPath: '/workspaces/graphql',\n },\n crossLayerGateway: {\n host: 'global-public-gateway',\n port: 4000,\n graphqlPath: '/global/graphql',\n },\n },\n global: {\n layer: 'global',\n internalGateway: {\n host: 'global-int-gateway',\n port: 4002,\n graphqlPath: '/global/graphql',\n },\n crossLayerGateway: {\n host: 'wspace-public-gateway',\n port: 4003,\n graphqlPath: '/workspaces/graphql',\n },\n },\n};\n\n/**\n * Default stream configurations per layer\n */\nexport const DEFAULT_LAYER_STREAMS: Record<\n ServiceLayer,\n Array<{ name: string; subjects: string[]; description?: string }>\n> = {\n wspace: [\n {\n name: 'WSPACE_EVENTS',\n subjects: ['wspace.>'],\n description: 'Workspace layer events stream',\n },\n {\n name: 'WSPACE_GRAPH_EVENTS',\n subjects: ['graph.>'],\n description: 'Workspace layer graph events stream (captures all graph entity events)',\n },\n ],\n global: [\n {\n name: 'GLOBAL_EVENTS',\n subjects: ['global.>'],\n description: 'Global layer events stream',\n },\n {\n name: 'GLOBAL_GRAPH_EVENTS',\n subjects: ['graph.>'],\n description: 'Global layer graph events stream (captures all graph entity events)',\n },\n ],\n};\n\n/**\n * Build internal gateway URL for a layer\n * Uses HTTP for internal K8s communication (mTLS via Istio service mesh)\n */\nfunction buildInternalGatewayUrl(layer: ServiceLayer): string {\n const routing = DEFAULT_GATEWAY_ROUTING[layer];\n const { host, port, graphqlPath } = routing.internalGateway;\n // Internal K8s services use plain HTTP with mTLS handled by Istio\n const protocol = 'http';\n return `${protocol}://${host}:${port}${graphqlPath}`;\n}\n\n/**\n * Default resource URLs per layer\n *\n * Note: Internal K8s service communication uses plain HTTP with mTLS via Istio.\n * External traffic uses HTTPS via ingress gateway.\n */\nexport const DEFAULT_LAYER_RESOURCES: Record<ServiceLayer, LayerResourceUrls> = {\n // The event queue is a single fleet-shared Redis (Azure Managed Redis in\n // ACA, fed via REDIS_URL; self-hosted shared-valkey in local dev). The\n // layer-scoped default URL below is only the local-dev compose hostname —\n // production always overrides via REDIS_URL.\n wspace: {\n eventQueueUrl: 'redis://wspace-shared-valkey:6379',\n valkeyUrl: 'valkey://wspace-valkey:6379',\n temporalAddress: 'wspace-temporal:7233',\n temporalNamespace: 'wspace-default',\n rbacGatewayUrl: buildInternalGatewayUrl('wspace'),\n },\n global: {\n eventQueueUrl: 'redis://global-shared-valkey:6379',\n valkeyUrl: 'valkey://global-valkey:6379',\n temporalAddress: 'global-temporal:7233',\n temporalNamespace: 'global-default',\n rbacGatewayUrl: buildInternalGatewayUrl('global'),\n },\n};\n\n/**\n * Circuit breaker configuration for gateway client\n */\nexport interface CircuitBreakerConfig {\n /**\n * Number of failures before opening circuit\n * @default 5\n */\n failureThreshold: number;\n\n /**\n * Time in milliseconds to wait before attempting to close circuit\n * @default 30000 (30 seconds)\n */\n resetTimeout: number;\n\n /**\n * Time window in milliseconds for counting failures\n * @default 60000 (60 seconds)\n */\n failureWindow: number;\n}\n\n/**\n * Default circuit breaker configuration\n */\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n resetTimeout: 30000,\n failureWindow: 60000,\n};\n\n/**\n * Retry configuration for gateway client\n */\nexport interface GatewayRetryConfig {\n /**\n * Maximum number of retry attempts\n * @default 3\n */\n maxAttempts: number;\n\n /**\n * Initial delay in milliseconds before first retry\n * @default 1000 (1 second)\n */\n initialDelay: number;\n\n /**\n * Maximum delay in milliseconds between retries\n * @default 10000 (10 seconds)\n */\n maxDelay: number;\n\n /**\n * Backoff multiplier for exponential backoff\n * @default 2\n */\n backoffMultiplier: number;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_GATEWAY_RETRY_CONFIG: GatewayRetryConfig = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 10000,\n backoffMultiplier: 2,\n};\n\n/**\n * Headers automatically added by gateway client for M2M calls\n */\nexport interface GatewayRequestHeaders {\n /**\n * Actor ID making the request\n */\n 'x-actor-id'?: string;\n\n /**\n * Actor type\n */\n 'x-actor-type'?: 'user' | 'app' | 'service' | 'super_admin';\n\n /**\n * Workspace ID for the request context\n */\n 'x-workspace-id'?: string;\n\n /**\n * Service identity for bypass validation\n */\n 'x-service-identity'?: string;\n\n /**\n * Call type indicator\n */\n 'x-call-type'?: 'internal' | 'cross-layer';\n\n /**\n * Permission bypass flag\n */\n 'x-bypass-permission'?: string;\n\n /**\n * RBAC bypass flag (set by gateway)\n */\n 'x-rbac-bypass'?: 'true' | 'false';\n\n /**\n * Bypass source (set by gateway)\n */\n 'x-bypass-source'?: string;\n\n /**\n * Bypass timestamp (set by gateway)\n */\n 'x-bypass-timestamp'?: string;\n}\n"]}
1
+ {"version":3,"sources":["../src/types/layer.ts"],"names":["DEFAULT_GATEWAY_ROUTING","wspace","layer","internalGateway","host","port","graphqlPath","crossLayerGateway","global","DEFAULT_LAYER_STREAMS","name","subjects","description","buildInternalGatewayUrl","routing","protocol","DEFAULT_LAYER_RESOURCES","eventQueueUrl","valkeyUrl","temporalAddress","temporalNamespace","rbacGatewayUrl","DEFAULT_CIRCUIT_BREAKER_CONFIG","failureThreshold","resetTimeout","failureWindow","DEFAULT_GATEWAY_RETRY_CONFIG","maxAttempts","initialDelay","maxDelay","backoffMultiplier"],"mappings":";;;AAyJO,IAAMA,uBAAAA,GAAsE;EACjFC,MAAAA,EAAQ;IACNC,KAAAA,EAAO,QAAA;IACPC,eAAAA,EAAiB;MACfC,IAAAA,EAAM,oBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf,KAAA;IACAC,iBAAAA,EAAmB;MACjBH,IAAAA,EAAM,uBAAA;MACNC,IAAAA,EAAM,GAAA;MACNC,WAAAA,EAAa;AACf;AACF,GAAA;EACAE,MAAAA,EAAQ;IACNN,KAAAA,EAAO,QAAA;IACPC,eAAAA,EAAiB;MACfC,IAAAA,EAAM,oBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf,KAAA;IACAC,iBAAAA,EAAmB;MACjBH,IAAAA,EAAM,uBAAA;MACNC,IAAAA,EAAM,IAAA;MACNC,WAAAA,EAAa;AACf;AACF;AACF;AAKO,IAAMG,qBAAAA,GAGT;EACFR,MAAAA,EAAQ;AACN,IAAA;MACES,IAAAA,EAAM,eAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf,KAAA;AACA,IAAA;MACEF,IAAAA,EAAM,qBAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf;;EAEFJ,MAAAA,EAAQ;AACN,IAAA;MACEE,IAAAA,EAAM,eAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf,KAAA;AACA,IAAA;MACEF,IAAAA,EAAM,qBAAA;MACNC,QAAAA,EAAU;AAAC,QAAA;;MACXC,WAAAA,EAAa;AACf;;AAEJ;AAMA,SAASC,wBAAwBX,KAAAA,EAAmB;AAClD,EAAA,MAAMY,OAAAA,GAAUd,wBAAwBE,KAAAA,CAAAA;AACxC,EAAA,MAAM,EAAEE,IAAAA,EAAMC,IAAAA,EAAMC,WAAAA,KAAgBQ,OAAAA,CAAQX,eAAAA;AAE5C,EAAA,MAAMY,QAAAA,GAAW,MAAA;AACjB,EAAA,OAAO,GAAGA,QAAAA,CAAAA,GAAAA,EAAcX,IAAAA,CAAAA,CAAAA,EAAQC,IAAAA,GAAOC,WAAAA,CAAAA,CAAAA;AACzC;AANSO,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAcF,IAAMG,uBAAAA,GAAmE;;;;;EAK9Ef,MAAAA,EAAQ;IACNgB,aAAAA,EAAe,mCAAA;IACfC,SAAAA,EAAW,6BAAA;IACXC,eAAAA,EAAiB,sBAAA;IACjBC,iBAAAA,EAAmB,gBAAA;AACnBC,IAAAA,cAAAA,EAAgBR,wBAAwB,QAAA;AAC1C,GAAA;EACAL,MAAAA,EAAQ;IACNS,aAAAA,EAAe,mCAAA;IACfC,SAAAA,EAAW,6BAAA;IACXC,eAAAA,EAAiB,sBAAA;IACjBC,iBAAAA,EAAmB,gBAAA;AACnBC,IAAAA,cAAAA,EAAgBR,wBAAwB,QAAA;AAC1C;AACF;AA4BO,IAAMS,8BAAAA,GAAuD;EAClEC,gBAAAA,EAAkB,CAAA;EAClBC,YAAAA,EAAc,GAAA;EACdC,aAAAA,EAAe;AACjB;AAkCO,IAAMC,4BAAAA,GAAmD;EAC9DC,WAAAA,EAAa,CAAA;EACbC,YAAAA,EAAc,GAAA;EACdC,QAAAA,EAAU,GAAA;EACVC,iBAAAA,EAAmB;AACrB","file":"chunk-YFOHAHZE.js","sourcesContent":["/**\n * Layer Type Definitions for Burdenoff Backend SDK\n *\n * This module defines types for the layer-aware architecture,\n * supporting wspace (workspace) and global (tenant) service layers.\n *\n * @module types/layer\n * @category Configuration\n */\n\n/**\n * Service layer types\n * - wspace: Workspace layer services (product-specific operations)\n * - global: Global/tenant layer services (cross-product services)\n */\nexport type ServiceLayer = 'wspace' | 'global';\n\n/**\n * Layer configuration for a service\n */\nexport interface LayerConfig {\n /**\n * Layer type this service belongs to\n * @example 'wspace' or 'global'\n */\n layer: ServiceLayer;\n\n /**\n * Service name (e.g., 'wspace-tags-svc', 'global-auth-svc')\n */\n serviceName: string;\n\n /**\n * Service identity for bypass headers\n * Used for M2M authentication\n * @default serviceName\n */\n serviceIdentity?: string;\n}\n\n/**\n * Gateway configuration per layer\n */\nexport interface LayerGatewayConfig {\n /**\n * Internal gateway URL (same layer int-gateway)\n * - wspace services use: wspace-int-gateway\n * - global services use: global-int-gateway\n */\n internalGatewayUrl: string;\n\n /**\n * Cross-layer gateway URL (cross layer public-gateway)\n * - wspace services use: global-public-gateway\n * - global services use: wspace-public-gateway\n */\n crossLayerGatewayUrl: string;\n}\n\n/**\n * Resource URLs per layer\n */\nexport interface LayerResourceUrls {\n /**\n * Event queue (Redis Streams) URL.\n *\n * Single fleet-shared Redis instance in every environment:\n * - ACA (prod/alpha): Azure Managed Redis — `REDIS_URL` injected from\n * KeyVault overrides this default.\n * - Local dev: self-hosted `shared-valkey` reachable via\n * docker-compose; the default below points at the same container\n * name used by `~/products/dev`'s compose graph.\n *\n * `LayerManager.resolveResourceConfig()` always prefers `REDIS_URL`\n * from the environment, so the layer-scoped default is only the\n * local-dev fallback.\n */\n eventQueueUrl: string;\n\n /**\n * Valkey/Redis URL for the layer\n */\n valkeyUrl: string;\n\n /**\n * Temporal server address for the layer\n */\n temporalAddress: string;\n\n /**\n * Temporal namespace for the layer\n */\n temporalNamespace: string;\n\n /**\n * RBAC gateway URL (for permission checks)\n */\n rbacGatewayUrl: string;\n}\n\n/**\n * Complete layer configuration including gateways and resources\n */\nexport interface LayerFullConfig extends LayerConfig {\n /**\n * Gateway configuration\n */\n gateways: LayerGatewayConfig;\n\n /**\n * Resource URLs\n */\n resources: LayerResourceUrls;\n}\n\n/**\n * Gateway routing rules by layer\n * Defines which gateway to use for same-layer vs cross-layer communication\n */\nexport interface GatewayRoutingConfig {\n /**\n * Layer this config applies to\n */\n layer: ServiceLayer;\n\n /**\n * Internal gateway for same-layer M2M calls\n */\n internalGateway: {\n /** Gateway host (without protocol) */\n host: string;\n /** Gateway port */\n port: number;\n /** GraphQL endpoint path */\n graphqlPath: string;\n };\n\n /**\n * Public gateway for cross-layer calls\n */\n crossLayerGateway: {\n /** Gateway host (without protocol) */\n host: string;\n /** Gateway port */\n port: number;\n /** GraphQL endpoint path */\n graphqlPath: string;\n };\n}\n\n/**\n * Default gateway routing configuration\n */\nexport const DEFAULT_GATEWAY_ROUTING: Record<ServiceLayer, GatewayRoutingConfig> = {\n wspace: {\n layer: 'wspace',\n internalGateway: {\n host: 'wspace-int-gateway',\n port: 4001,\n graphqlPath: '/workspaces/graphql',\n },\n crossLayerGateway: {\n host: 'global-public-gateway',\n port: 4000,\n graphqlPath: '/global/graphql',\n },\n },\n global: {\n layer: 'global',\n internalGateway: {\n host: 'global-int-gateway',\n port: 4002,\n graphqlPath: '/global/graphql',\n },\n crossLayerGateway: {\n host: 'wspace-public-gateway',\n port: 4003,\n graphqlPath: '/workspaces/graphql',\n },\n },\n};\n\n/**\n * Default stream configurations per layer\n */\nexport const DEFAULT_LAYER_STREAMS: Record<\n ServiceLayer,\n Array<{ name: string; subjects: string[]; description?: string }>\n> = {\n wspace: [\n {\n name: 'WSPACE_EVENTS',\n subjects: ['wspace.>'],\n description: 'Workspace layer events stream',\n },\n {\n name: 'WSPACE_GRAPH_EVENTS',\n subjects: ['graph.>'],\n description: 'Workspace layer graph events stream (captures all graph entity events)',\n },\n ],\n global: [\n {\n name: 'GLOBAL_EVENTS',\n subjects: ['global.>'],\n description: 'Global layer events stream',\n },\n {\n name: 'GLOBAL_GRAPH_EVENTS',\n subjects: ['graph.>'],\n description: 'Global layer graph events stream (captures all graph entity events)',\n },\n ],\n};\n\n/**\n * Build internal gateway URL for a layer\n * Uses HTTP for internal K8s communication (mTLS via Istio service mesh)\n */\nfunction buildInternalGatewayUrl(layer: ServiceLayer): string {\n const routing = DEFAULT_GATEWAY_ROUTING[layer];\n const { host, port, graphqlPath } = routing.internalGateway;\n // Internal K8s services use plain HTTP with mTLS handled by Istio\n const protocol = 'http';\n return `${protocol}://${host}:${port}${graphqlPath}`;\n}\n\n/**\n * Default resource URLs per layer\n *\n * Note: Internal K8s service communication uses plain HTTP with mTLS via Istio.\n * External traffic uses HTTPS via ingress gateway.\n */\nexport const DEFAULT_LAYER_RESOURCES: Record<ServiceLayer, LayerResourceUrls> = {\n // The event queue is a single fleet-shared Redis (Azure Managed Redis in\n // ACA, fed via REDIS_URL; self-hosted shared-valkey in local dev). The\n // layer-scoped default URL below is only the local-dev compose hostname —\n // production always overrides via REDIS_URL.\n wspace: {\n eventQueueUrl: 'redis://wspace-shared-valkey:6379',\n valkeyUrl: 'valkey://wspace-valkey:6379',\n temporalAddress: 'wspace-temporal:7233',\n temporalNamespace: 'wspace-default',\n rbacGatewayUrl: buildInternalGatewayUrl('wspace'),\n },\n global: {\n eventQueueUrl: 'redis://global-shared-valkey:6379',\n valkeyUrl: 'valkey://global-valkey:6379',\n temporalAddress: 'global-temporal:7233',\n temporalNamespace: 'global-default',\n rbacGatewayUrl: buildInternalGatewayUrl('global'),\n },\n};\n\n/**\n * Circuit breaker configuration for gateway client\n */\nexport interface CircuitBreakerConfig {\n /**\n * Number of failures before opening circuit\n * @default 5\n */\n failureThreshold: number;\n\n /**\n * Time in milliseconds to wait before attempting to close circuit\n * @default 30000 (30 seconds)\n */\n resetTimeout: number;\n\n /**\n * Time window in milliseconds for counting failures\n * @default 60000 (60 seconds)\n */\n failureWindow: number;\n}\n\n/**\n * Default circuit breaker configuration\n */\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n resetTimeout: 30000,\n failureWindow: 60000,\n};\n\n/**\n * Retry configuration for gateway client\n */\nexport interface GatewayRetryConfig {\n /**\n * Maximum number of retry attempts\n * @default 3\n */\n maxAttempts: number;\n\n /**\n * Initial delay in milliseconds before first retry\n * @default 1000 (1 second)\n */\n initialDelay: number;\n\n /**\n * Maximum delay in milliseconds between retries\n * @default 10000 (10 seconds)\n */\n maxDelay: number;\n\n /**\n * Backoff multiplier for exponential backoff\n * @default 2\n */\n backoffMultiplier: number;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_GATEWAY_RETRY_CONFIG: GatewayRetryConfig = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 10000,\n backoffMultiplier: 2,\n};\n\n/**\n * Headers automatically added by gateway client for M2M calls\n */\nexport interface GatewayRequestHeaders {\n /**\n * Actor ID making the request\n */\n 'x-actor-id'?: string;\n\n /**\n * Actor type\n */\n 'x-actor-type'?: 'user' | 'app' | 'service' | 'super_admin';\n\n /**\n * Workspace ID for the request context\n */\n 'x-workspace-id'?: string;\n\n /**\n * Service identity for bypass validation\n */\n 'x-service-identity'?: string;\n\n /**\n * Call type indicator\n */\n 'x-call-type'?: 'internal' | 'cross-layer';\n\n /**\n * Permission bypass flag\n */\n 'x-bypass-permission'?: string;\n\n /**\n * RBAC bypass flag (set by gateway)\n */\n 'x-rbac-bypass'?: 'true' | 'false';\n\n /**\n * Bypass source (set by gateway)\n */\n 'x-bypass-source'?: string;\n\n /**\n * Bypass timestamp (set by gateway)\n */\n 'x-bypass-timestamp'?: string;\n\n /**\n * Cloudflare Access service-token client id, re-presented on cross-layer\n * outbound calls so the peer layer's CF-Access-gated public gateway admits\n * the request. Normally attached automatically from request context.\n */\n 'cf-access-client-id'?: string;\n\n /**\n * Cloudflare Access service-token client secret (paired with the client id).\n */\n 'cf-access-client-secret'?: string;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { ValidationError } from './chunk-O6RHB2YP.js';
1
+ import { ValidationError } from './chunk-SMGTXYFR.js';
2
2
  import { logger } from './chunk-CBZNP6RF.js';
3
3
  import { __export, __name } from './chunk-XE4OXN2W.js';
4
4
 
@@ -927,5 +927,5 @@ var NotificationsModule = class {
927
927
  };
928
928
 
929
929
  export { NotificationChannel2 as NotificationChannel, NotificationPriority, NotificationType2 as NotificationType, NotificationsModule, TenantNotificationsModule, tenant_notifications_exports };
930
- //# sourceMappingURL=chunk-RMDKB5O7.js.map
931
- //# sourceMappingURL=chunk-RMDKB5O7.js.map
930
+ //# sourceMappingURL=chunk-ZHQUXD6S.js.map
931
+ //# sourceMappingURL=chunk-ZHQUXD6S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/notifications/tenant-notifications.ts","../src/notifications/index.ts"],"names":["NotificationChannel","NotificationPriority","NotificationType","TenantNotificationsModule","client","context","send","input","validateSendInput","logger","info","channel","type","priority","mutation","variables","recipient","subject","body","htmlBody","data","metadata","scheduledFor","toISOString","expiresAt","trackOpens","trackClicks","response","tenantQuery","notificationId","sendNotification","sendWithTemplate","templateSlug","trim","length","ValidationError","Object","keys","email","userId","channelId","platform","timezone","result","triggerNotificationWithTemplate","firstNotification","notifications","totalTriggered","totalRequested","totalFailed","id","status","sendBatch","count","batchSize","map","n","delayBetweenBatches","batchId","sendBatchNotifications","queued","totalQueued","failed","getNotification","query","notification","getNotifications","filter","startDate","endDate","undefined","limit","offset","getTemplate","slug","locale","notificationTemplate","getTemplates","notificationTemplates","getStats","notificationStats","markAsRead","notificationIds","markAllAsRead","deleteNotifications","deleteAllReadNotifications","phoneNumber","pushToken","NotificationsModule","options","title","message","userIds","userCount","redirectUrl","appName","sms","successCount","createNotification","failureCount","errors","sendToUser","debug","search","markMultipleAsRead","markNotificationsAsRead","markAllMyNotificationsAsRead","deleteNotification","deleteMultiple","getUnreadCount","unreadCount","sendChannelNotification","recipients","includeInApp","recipientCount","inAppUserCount","results","Promise","allSettled","forEach","index","value","push","triggerNotification","reason","Error","error","sendTemplateNotification"],"mappings":"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","file":"chunk-RMDKB5O7.js","sourcesContent":["/**\n * Tenant-Backend Notifications Module\n * Comprehensive notification system supporting 10+ channels via tenant-backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\n// ========================================\n// Enums\n// ========================================\n\nexport enum NotificationChannel {\n EMAIL = 'EMAIL',\n SMS = 'SMS',\n PUSH = 'PUSH',\n IN_APP = 'IN_APP',\n WEBHOOK = 'WEBHOOK',\n WHATSAPP = 'WHATSAPP',\n TEAMS = 'TEAMS',\n SLACK = 'SLACK',\n TELEGRAM = 'TELEGRAM',\n DISCORD = 'DISCORD',\n}\n\nexport enum NotificationPriority {\n LOW = 'LOW',\n MEDIUM = 'MEDIUM',\n HIGH = 'HIGH',\n URGENT = 'URGENT',\n}\n\nexport enum NotificationType {\n TRANSACTIONAL = 'TRANSACTIONAL',\n MARKETING = 'MARKETING',\n SYSTEM = 'SYSTEM',\n ALERT = 'ALERT',\n}\n\n// ========================================\n// Types & Interfaces\n// ========================================\n\nexport interface RecipientInput {\n userId?: string;\n email?: string;\n phoneNumber?: string;\n pushToken?: string;\n whatsappNumber?: string;\n teamsUserId?: string;\n slackUserId?: string;\n webhookUrl?: string;\n name?: string;\n locale?: string;\n timezone?: string;\n}\n\nexport interface SendNotificationInput {\n recipient: RecipientInput;\n channel: NotificationChannel;\n type?: NotificationType;\n priority?: NotificationPriority;\n subject?: string;\n body: string;\n htmlBody?: string;\n data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n scheduledFor?: Date;\n expiresAt?: Date;\n trackOpens?: boolean;\n trackClicks?: boolean;\n}\n\nexport interface SendWithTemplateInput {\n templateSlug: string;\n variables: Record<string, unknown>;\n recipient: RecipientInput;\n priority?: NotificationPriority;\n scheduledFor?: Date;\n expiresAt?: Date;\n trackOpens?: boolean;\n trackClicks?: boolean;\n /** Specific channel instance ID from channel service (takes precedence) */\n channelId?: string;\n /** Platform type for auto-failover (EMAIL, SMS, etc.) - used if channelId not provided */\n platform?: NotificationChannel;\n /** Timezone for scheduling */\n timezone?: string;\n}\n\nexport interface BatchNotificationInput {\n notifications: SendNotificationInput[];\n batchSize?: number;\n delayBetweenBatches?: number;\n priority?: NotificationPriority;\n}\n\nexport interface Notification {\n id: string;\n userId: string;\n channel: NotificationChannel;\n type: NotificationType;\n priority: NotificationPriority;\n status: string;\n deliveryStatus?: string;\n title: string;\n message: string;\n htmlMessage?: string;\n subject?: string;\n recipientEmail?: string;\n recipientPhone?: string;\n trackOpens: boolean;\n trackClicks: boolean;\n openedAt?: string;\n clickedAt?: string;\n sentAt?: string;\n deliveredAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NotificationTemplate {\n id: string;\n name: string;\n slug: string;\n description?: string;\n channel: NotificationChannel;\n type: NotificationType;\n locale: string;\n subject?: string;\n bodyTemplate: string;\n htmlTemplate?: string;\n variables: Array<{\n name: string;\n type: string;\n required: boolean;\n defaultValue?: unknown;\n description?: string;\n example?: unknown;\n }>;\n enabled: boolean;\n version: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NotificationStats {\n total: number;\n pending: number;\n queued: number;\n processing: number;\n sent: number;\n delivered: number;\n failed: number;\n byChannel: Record<string, number>;\n byType: Record<string, number>;\n}\n\n// ========================================\n// Tenant Notifications Module\n// ========================================\n\n/**\n * Tenant-Backend Notifications Module\n * Provides access to the centralized notification system\n */\nexport class TenantNotificationsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Send a single notification\n */\n public async send(input: SendNotificationInput): Promise<string> {\n // Validate inputs\n this.validateSendInput(input);\n\n logger.info('[TenantNotifications] Sending notification', {\n channel: input.channel,\n type: input.type || NotificationType.TRANSACTIONAL,\n priority: input.priority || NotificationPriority.MEDIUM,\n });\n\n const mutation = `\n mutation SendNotification($input: SendNotificationInput!) {\n sendNotification(input: $input)\n }\n `;\n\n const variables = {\n input: {\n recipient: input.recipient,\n channel: input.channel,\n type: input.type || NotificationType.TRANSACTIONAL,\n priority: input.priority || NotificationPriority.MEDIUM,\n subject: input.subject,\n body: input.body,\n htmlBody: input.htmlBody,\n data: input.data,\n metadata: input.metadata,\n scheduledFor: input.scheduledFor?.toISOString(),\n expiresAt: input.expiresAt?.toISOString(),\n trackOpens: input.trackOpens,\n trackClicks: input.trackClicks,\n },\n };\n\n const response = await this.client.tenantQuery<{\n sendNotification: string;\n }>(mutation, variables, this.context);\n\n logger.info('[TenantNotifications] Notification sent', {\n notificationId: response.sendNotification,\n });\n\n return response.sendNotification;\n }\n\n /**\n * Send notification using a template\n */\n public async sendWithTemplate(input: SendWithTemplateInput): Promise<string> {\n // Validate inputs\n if (!input.templateSlug || input.templateSlug.trim().length === 0) {\n throw new ValidationError('Template slug is required');\n }\n\n if (!input.variables || Object.keys(input.variables).length === 0) {\n throw new ValidationError('Template variables are required');\n }\n\n if (!input.recipient || (!input.recipient.email && !input.recipient.userId)) {\n throw new ValidationError('Recipient email or userId is required');\n }\n\n logger.info('[TenantNotifications] Sending notification with template', {\n templateSlug: input.templateSlug,\n priority: input.priority || NotificationPriority.MEDIUM,\n });\n\n const mutation = `\n mutation TriggerNotificationWithTemplate($input: TriggerNotificationWithTemplateInput!) {\n triggerNotificationWithTemplate(input: $input) {\n totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\n }\n }\n `;\n\n const variables = {\n input: {\n templateSlug: input.templateSlug,\n variables: input.variables,\n recipient: input.recipient,\n priority: input.priority || NotificationPriority.MEDIUM,\n scheduledFor: input.scheduledFor?.toISOString(),\n expiresAt: input.expiresAt?.toISOString(),\n trackOpens: input.trackOpens,\n trackClicks: input.trackClicks,\n // Platform is required for notification delivery routing\n // If channelId is specified, it takes precedence; otherwise platform determines delivery\n channelId: input.channelId,\n platform: input.platform || NotificationChannel.EMAIL,\n timezone: input.timezone,\n },\n };\n\n const response = await this.client.tenantQuery<{\n triggerNotificationWithTemplate: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const result = response.triggerNotificationWithTemplate;\n const firstNotification = result.notifications[0];\n\n if (result.totalTriggered === 0 || !firstNotification) {\n throw new ValidationError(\n `Notification trigger failed: requested=${result.totalRequested}, triggered=${result.totalTriggered}, failed=${result.totalFailed}`\n );\n }\n\n logger.info('[TenantNotifications] Notification sent with template', {\n notificationId: firstNotification.id,\n status: firstNotification.status,\n totalTriggered: result.totalTriggered,\n totalFailed: result.totalFailed,\n });\n\n return firstNotification.id;\n }\n\n /**\n * Send batch notifications\n */\n public async sendBatch(input: BatchNotificationInput): Promise<{\n totalRequested: number;\n totalQueued: number;\n totalFailed: number;\n batchId: string;\n }> {\n if (!input.notifications || input.notifications.length === 0) {\n throw new ValidationError('At least one notification is required');\n }\n\n logger.info('[TenantNotifications] Sending batch notifications', {\n count: input.notifications.length,\n batchSize: input.batchSize,\n });\n\n const mutation = `\n mutation SendBatchNotifications($input: BatchNotificationInput!) {\n sendBatchNotifications(input: $input) {\n totalRequested\n totalQueued\n totalFailed\n batchId\n }\n }\n `;\n\n const variables = {\n input: {\n notifications: input.notifications.map((n) => ({\n recipient: n.recipient,\n channel: n.channel,\n type: n.type || NotificationType.TRANSACTIONAL,\n priority: n.priority || NotificationPriority.MEDIUM,\n subject: n.subject,\n body: n.body,\n htmlBody: n.htmlBody,\n data: n.data,\n metadata: n.metadata,\n scheduledFor: n.scheduledFor?.toISOString(),\n expiresAt: n.expiresAt?.toISOString(),\n trackOpens: n.trackOpens,\n trackClicks: n.trackClicks,\n })),\n batchSize: input.batchSize,\n delayBetweenBatches: input.delayBetweenBatches,\n priority: input.priority,\n },\n };\n\n const response = await this.client.tenantQuery<{\n sendBatchNotifications: {\n totalRequested: number;\n totalQueued: number;\n totalFailed: number;\n batchId: string;\n };\n }>(mutation, variables, this.context);\n\n logger.info('[TenantNotifications] Batch notifications sent', {\n batchId: response.sendBatchNotifications.batchId,\n queued: response.sendBatchNotifications.totalQueued,\n failed: response.sendBatchNotifications.totalFailed,\n });\n\n return response.sendBatchNotifications;\n }\n\n /**\n * Get a notification by ID\n */\n public async getNotification(id: string): Promise<Notification | null> {\n const query = `\n query GetNotification($id: ID!) {\n notification(id: $id) {\n id\n userId\n channel\n type\n priority\n status\n deliveryStatus\n title\n message\n htmlMessage\n subject\n recipientEmail\n recipientPhone\n trackOpens\n trackClicks\n openedAt\n clickedAt\n sentAt\n deliveredAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notification: Notification | null;\n }>(query, { id }, this.context);\n\n return response.notification;\n }\n\n /**\n * Get notifications with filters\n */\n public async getNotifications(filter?: {\n userId?: string;\n channel?: NotificationChannel;\n type?: NotificationType;\n status?: string;\n priority?: NotificationPriority;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n }): Promise<Notification[]> {\n const query = `\n query GetNotifications($filter: NotificationFilterInput, $limit: Int, $offset: Int) {\n notifications(filter: $filter, limit: $limit, offset: $offset) {\n id\n userId\n channel\n type\n priority\n status\n deliveryStatus\n title\n message\n subject\n recipientEmail\n trackOpens\n trackClicks\n openedAt\n clickedAt\n sentAt\n deliveredAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n filter: filter\n ? {\n userId: filter.userId,\n channel: filter.channel,\n type: filter.type,\n status: filter.status,\n priority: filter.priority,\n startDate: filter.startDate?.toISOString(),\n endDate: filter.endDate?.toISOString(),\n }\n : undefined,\n limit: filter?.limit || 50,\n offset: filter?.offset || 0,\n };\n\n const response = await this.client.tenantQuery<{\n notifications: Notification[];\n }>(query, variables, this.context);\n\n return response.notifications;\n }\n\n /**\n * Get notification template\n */\n public async getTemplate(slug: string, locale?: string): Promise<NotificationTemplate | null> {\n const query = `\n query GetNotificationTemplate($slug: String!, $locale: String) {\n notificationTemplate(slug: $slug, locale: $locale) {\n id\n name\n slug\n description\n channel\n type\n locale\n subject\n bodyTemplate\n htmlTemplate\n variables\n enabled\n version\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notificationTemplate: NotificationTemplate | null;\n }>(query, { slug, locale }, this.context);\n\n return response.notificationTemplate;\n }\n\n /**\n * Get all notification templates\n */\n public async getTemplates(filter?: {\n channel?: NotificationChannel;\n type?: NotificationType;\n enabled?: boolean;\n }): Promise<NotificationTemplate[]> {\n const query = `\n query GetNotificationTemplates($filter: TemplateFilterInput) {\n notificationTemplates(filter: $filter) {\n id\n name\n slug\n description\n channel\n type\n locale\n subject\n bodyTemplate\n htmlTemplate\n variables\n enabled\n version\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notificationTemplates: NotificationTemplate[];\n }>(query, { filter }, this.context);\n\n return response.notificationTemplates;\n }\n\n /**\n * Get notification statistics\n */\n public async getStats(filter?: { userId?: string; startDate?: Date; endDate?: Date }): Promise<NotificationStats> {\n const query = `\n query GetNotificationStats($filter: NotificationFilterInput) {\n notificationStats(filter: $filter) {\n total\n pending\n queued\n processing\n sent\n delivered\n failed\n byChannel\n byType\n }\n }\n `;\n\n const variables = {\n filter: filter\n ? {\n userId: filter.userId,\n startDate: filter.startDate?.toISOString(),\n endDate: filter.endDate?.toISOString(),\n }\n : undefined,\n };\n\n const response = await this.client.tenantQuery<{\n notificationStats: NotificationStats;\n }>(query, variables, this.context);\n\n return response.notificationStats;\n }\n\n /**\n * Mark notifications as read\n */\n public async markAsRead(notificationIds: string[]): Promise<boolean> {\n const mutation = `\n mutation MarkNotificationsAsRead($notificationIds: [ID!]!) {\n markNotificationsAsRead(notificationIds: $notificationIds)\n }\n `;\n\n await this.client.tenantQuery(mutation, { notificationIds }, this.context);\n\n logger.info('[TenantNotifications] Notifications marked as read', {\n count: notificationIds.length,\n });\n\n return true;\n }\n\n /**\n * Mark all notifications as read for the current user\n */\n public async markAllAsRead(): Promise<boolean> {\n const mutation = `\n mutation MarkAllMyNotificationsAsRead {\n markAllMyNotificationsAsRead\n }\n `;\n\n await this.client.tenantQuery(mutation, {}, this.context);\n\n logger.info('[TenantNotifications] All notifications marked as read');\n\n return true;\n }\n\n /**\n * Delete notifications\n */\n public async deleteNotifications(notificationIds: string[]): Promise<boolean> {\n const mutation = `\n mutation DeleteNotifications($notificationIds: [ID!]!) {\n deleteNotifications(notificationIds: $notificationIds)\n }\n `;\n\n await this.client.tenantQuery(mutation, { notificationIds }, this.context);\n\n logger.info('[TenantNotifications] Notifications deleted', {\n count: notificationIds.length,\n });\n\n return true;\n }\n\n /**\n * Delete all read notifications for the current user\n */\n public async deleteAllReadNotifications(): Promise<boolean> {\n const mutation = `\n mutation DeleteMyReadNotifications {\n deleteMyReadNotifications\n }\n `;\n\n await this.client.tenantQuery(mutation, {}, this.context);\n\n logger.info('[TenantNotifications] All read notifications deleted');\n\n return true;\n }\n\n /**\n * Validate send notification input\n */\n private validateSendInput(input: SendNotificationInput): void {\n if (!input.recipient || (!input.recipient.email && !input.recipient.userId && !input.recipient.phoneNumber)) {\n throw new ValidationError('Recipient email, userId, or phoneNumber is required');\n }\n\n if (!input.channel) {\n throw new ValidationError('Notification channel is required');\n }\n\n if (!input.body || input.body.trim().length === 0) {\n throw new ValidationError('Notification body is required');\n }\n\n // Channel-specific validation\n if (input.channel === NotificationChannel.EMAIL && !input.recipient.email) {\n throw new ValidationError('Recipient email is required for EMAIL channel');\n }\n\n if (input.channel === NotificationChannel.SMS && !input.recipient.phoneNumber) {\n throw new ValidationError('Recipient phone number is required for SMS channel');\n }\n\n if (input.channel === NotificationChannel.PUSH && !input.recipient.pushToken && !input.recipient.userId) {\n throw new ValidationError('Recipient push token or userId is required for PUSH channel');\n }\n }\n}\n","/**\n * Notifications Module\n * Send in-app, email, SMS, and push notifications via workspaces-backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum NotificationType {\n INFO = 'info',\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\nexport enum NotificationChannel {\n EMAIL = 'EMAIL',\n SMS = 'SMS',\n WHATSAPP = 'WHATSAPP',\n PUSH = 'PUSH',\n SLACK = 'SLACK',\n TEAMS = 'TEAMS',\n WEBHOOK = 'WEBHOOK',\n}\n\n// Re-export from tenant-notifications\nexport { NotificationPriority, TenantNotificationsModule } from './tenant-notifications.js';\n\nexport interface SendNotificationOptions {\n /** Notification title */\n title: string;\n /** Notification message */\n message: string;\n /** Notification type */\n type?: NotificationType;\n /** Target user IDs */\n userIds: string[];\n /** Optional redirect URL */\n redirectUrl?: string;\n /** Application name */\n appName?: string;\n /** Send email notification */\n email?: boolean;\n /** Send SMS notification */\n sms?: boolean;\n}\n\nexport interface NotificationResponse {\n /** Number of successful notifications */\n successCount: number;\n /** Number of failed notifications */\n failureCount: number;\n /** Error messages if any */\n errors: string[];\n /** Created notification IDs */\n notificationIds?: string[];\n}\n\nexport interface GetNotificationsOptions {\n /** User ID to get notifications for */\n userId: string;\n /** Filter by status */\n status?: 'unread' | 'read' | 'all';\n /** Filter by type */\n type?: NotificationType;\n /** Filter by app name */\n appName?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\nexport interface Notification {\n id: string;\n userId: string;\n title: string;\n message: string;\n type: NotificationType;\n status: 'unread' | 'read';\n redirectUrl?: string;\n appName?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface RecipientInput {\n email?: string;\n locale?: string;\n name?: string;\n phoneNumber?: string;\n pushToken?: string;\n slackUserId?: string;\n teamsUserId?: string;\n timezone?: string;\n userId?: string;\n webhookUrl?: string;\n whatsappNumber?: string;\n}\n\nexport interface SendChannelNotificationOptions {\n /** Primary delivery channel (EMAIL, SMS, WHATSAPP, etc.) */\n platform: NotificationChannel;\n /** Recipient information for primary channel */\n recipient: RecipientInput;\n /** Multiple recipients for bulk delivery */\n recipients?: RecipientInput[];\n /** Notification subject (for EMAIL) */\n subject?: string;\n /** Notification body/message */\n body: string;\n /** HTML body (for EMAIL) */\n htmlBody?: string;\n /** Notification type */\n type?: NotificationType;\n /** Application name */\n appName?: string;\n /** Redirect URL */\n redirectUrl?: string;\n /** Also send as in-app notification */\n includeInApp?: boolean;\n /** User IDs for in-app notifications (required when includeInApp is true) */\n userIds?: string[];\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Track email opens */\n trackOpens?: boolean;\n /** Track link clicks */\n trackClicks?: boolean;\n /** Expiration time */\n expiresAt?: Date;\n /** Specific channel instance ID (overrides platform) */\n channelId?: string;\n}\n\nexport interface SendTemplateNotificationOptions {\n /** Primary delivery channel (EMAIL, SMS, WHATSAPP, etc.) */\n platform: NotificationChannel;\n /** Template slug to use */\n templateSlug: string;\n /** Template variables */\n variables: Record<string, unknown>;\n /** Recipient information for primary channel */\n recipient?: RecipientInput;\n /** Multiple recipients for bulk delivery */\n recipients?: RecipientInput[];\n /** Also send as in-app notification */\n includeInApp?: boolean;\n /** User IDs for in-app notifications (required when includeInApp is true) */\n userIds?: string[];\n /** Application name */\n appName?: string;\n /** Track email opens */\n trackOpens?: boolean;\n /** Track link clicks */\n trackClicks?: boolean;\n /** Expiration time */\n expiresAt?: Date;\n /** Scheduled delivery time */\n scheduledFor?: Date;\n /** Timezone for scheduling */\n timezone?: string;\n /** Specific channel instance ID (overrides platform) */\n channelId?: string;\n}\n\n/**\n * Notifications Module\n */\nexport class NotificationsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Send notification to users\n */\n public async send(options: SendNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.title || options.title.trim().length === 0) {\n throw new ValidationError('Notification title is required');\n }\n\n if (!options.message || options.message.trim().length === 0) {\n throw new ValidationError('Notification message is required');\n }\n\n if (!options.userIds || options.userIds.length === 0) {\n throw new ValidationError('At least one user ID is required');\n }\n\n logger.info('[Notifications] Sending notification', {\n title: options.title,\n userCount: options.userIds.length,\n type: options.type || NotificationType.INFO,\n });\n\n const mutation = `\n mutation CreateNotification($input: CreateNotificationInput!) {\n createNotification(input: $input) {\n successCount\n failureCount\n errors\n notifications {\n id\n }\n }\n }\n `;\n\n const variables = {\n input: {\n title: options.title,\n message: options.message,\n type: options.type || NotificationType.INFO,\n userIds: options.userIds,\n redirectUrl: options.redirectUrl || '',\n appName: options.appName,\n email: options.email || false,\n sms: options.sms || false,\n },\n };\n\n const response = await this.client.query<{\n createNotification: NotificationResponse & { notifications: Array<{ id: string }> };\n }>(mutation, variables, this.context);\n\n const result = {\n successCount: response.createNotification.successCount,\n failureCount: response.createNotification.failureCount,\n errors: response.createNotification.errors,\n notificationIds: response.createNotification.notifications.map((n) => n.id),\n };\n\n logger.info('[Notifications] Notification sent', {\n successCount: result.successCount,\n failureCount: result.failureCount,\n });\n\n return result;\n }\n\n /**\n * Send notification to a single user (convenience method)\n */\n public async sendToUser(\n userId: string,\n title: string,\n message: string,\n options?: Omit<SendNotificationOptions, 'userIds' | 'title' | 'message'>\n ): Promise<NotificationResponse> {\n return this.send({\n title,\n message,\n userIds: [userId],\n ...options,\n });\n }\n\n /**\n * Get notifications for a user\n */\n public async getNotifications(options: GetNotificationsOptions): Promise<{\n notifications: Notification[];\n total: number;\n unreadCount: number;\n }> {\n logger.debug('[Notifications] Getting notifications', { userId: options.userId });\n\n const query = `\n query GetNotifications(\n $userId: ID!\n $status: NotificationStatus\n $type: NotificationType\n $appName: String\n $search: String\n $limit: Int\n $offset: Int\n ) {\n getNotifications(\n userId: $userId\n status: $status\n type: $type\n appName: $appName\n search: $search\n limit: $limit\n offset: $offset\n ) {\n notifications {\n id\n userId\n title\n message\n type\n status\n redirectUrl\n appName\n createdAt\n updatedAt\n }\n total\n unreadCount\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n status: options.status,\n type: options.type,\n appName: options.appName,\n search: options.search,\n limit: options.limit || 20,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getNotifications: {\n notifications: Notification[];\n total: number;\n unreadCount: number;\n };\n }>(query, variables, this.context);\n\n return response.getNotifications;\n }\n\n /**\n * Mark notification as read\n */\n public async markAsRead(notificationId: string): Promise<boolean> {\n logger.debug('[Notifications] Marking notification as read', { notificationId });\n\n const mutation = `\n mutation MarkNotificationAsRead($notificationId: ID!) {\n markNotificationAsRead(notificationId: $notificationId) {\n id\n status\n }\n }\n `;\n\n await this.client.query(mutation, { notificationId }, this.context);\n\n logger.info('[Notifications] Notification marked as read', { notificationId });\n\n return true;\n }\n\n /**\n * Mark multiple notifications as read\n */\n public async markMultipleAsRead(notificationIds: string[]): Promise<number> {\n logger.debug('[Notifications] Marking multiple notifications as read', {\n count: notificationIds.length,\n });\n\n const mutation = `\n mutation MarkNotificationsAsRead($notificationIds: [ID!]!) {\n markNotificationsAsRead(notificationIds: $notificationIds) {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n markNotificationsAsRead: { count: number };\n }>(mutation, { notificationIds }, this.context);\n\n logger.info('[Notifications] Notifications marked as read', {\n count: response.markNotificationsAsRead.count,\n });\n\n return response.markNotificationsAsRead.count;\n }\n\n /**\n * Mark all notifications as read for the current user\n */\n public async markAllAsRead(): Promise<number> {\n logger.debug('[Notifications] Marking all notifications as read');\n\n const mutation = `\n mutation MarkAllMyNotificationsAsRead {\n markAllMyNotificationsAsRead {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n markAllMyNotificationsAsRead: { count: number };\n }>(mutation, {}, this.context);\n\n logger.info('[Notifications] All notifications marked as read', {\n count: response.markAllMyNotificationsAsRead.count,\n });\n\n return response.markAllMyNotificationsAsRead.count;\n }\n\n /**\n * Delete notification\n */\n public async deleteNotification(notificationId: string): Promise<boolean> {\n logger.debug('[Notifications] Deleting notification', { notificationId });\n\n const mutation = `\n mutation DeleteNotification($notificationId: ID!) {\n deleteNotification(notificationId: $notificationId) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { notificationId }, this.context);\n\n logger.info('[Notifications] Notification deleted', { notificationId });\n\n return true;\n }\n\n /**\n * Delete multiple notifications\n */\n public async deleteMultiple(notificationIds: string[]): Promise<number> {\n logger.debug('[Notifications] Deleting multiple notifications', {\n count: notificationIds.length,\n });\n\n const mutation = `\n mutation DeleteNotifications($notificationIds: [ID!]!) {\n deleteNotifications(notificationIds: $notificationIds) {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n deleteNotifications: { count: number };\n }>(mutation, { notificationIds }, this.context);\n\n logger.info('[Notifications] Notifications deleted', {\n count: response.deleteNotifications.count,\n });\n\n return response.deleteNotifications.count;\n }\n\n /**\n * Get unread notification count for a user\n */\n public async getUnreadCount(userId: string): Promise<number> {\n const result = await this.getNotifications({\n userId,\n status: 'unread',\n limit: 0,\n });\n\n return result.unreadCount;\n }\n\n /**\n * Send notification via specific channel (EMAIL, SMS, WHATSAPP, etc.)\n * with optional in-app notification\n */\n public async sendChannelNotification(options: SendChannelNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.body || options.body.trim().length === 0) {\n throw new ValidationError('Notification body is required');\n }\n\n if (!options.recipient && !options.recipients) {\n throw new ValidationError('At least one recipient is required');\n }\n\n if (options.includeInApp && (!options.userIds || options.userIds.length === 0)) {\n throw new ValidationError('User IDs are required when includeInApp is true');\n }\n\n logger.info('[Notifications] Sending channel notification', {\n platform: options.platform,\n recipientCount: options.recipients ? options.recipients.length : 1,\n includeInApp: options.includeInApp,\n inAppUserCount: options.userIds ? options.userIds.length : 0,\n });\n\n const mutation = `\n mutation TriggerNotification($input: TriggerNotificationInput!) {\n triggerNotification(input: $input) {\n id\n status\n deliveryStatus\n }\n }\n `;\n\n const variables = {\n input: {\n platform: options.platform,\n channelId: options.channelId,\n includeInApp: options.includeInApp || false,\n userIds: options.userIds || [],\n notification: {\n subject: options.subject || '',\n body: options.body,\n htmlBody: options.htmlBody || '',\n channel: options.platform,\n type: options.type || NotificationType.INFO,\n recipient: options.recipient,\n appName: options.appName,\n redirectUrl: options.redirectUrl || '',\n metadata: options.metadata || {},\n trackOpens: options.trackOpens || false,\n trackClicks: options.trackClicks || false,\n expiresAt: options.expiresAt?.toISOString(),\n },\n },\n };\n\n // Handle bulk recipients\n if (options.recipients && options.recipients.length > 1) {\n const results = await Promise.allSettled(\n options.recipients.map((recipient) =>\n this.client.query(\n mutation,\n {\n input: {\n ...variables.input,\n notification: {\n ...variables.input.notification,\n recipient,\n },\n },\n },\n this.context\n )\n )\n );\n\n let successCount = 0;\n let failureCount = 0;\n const errors: string[] = [];\n const notificationIds: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n successCount++;\n const response = result.value as { triggerNotification: { id: string } };\n notificationIds.push(response.triggerNotification.id);\n } else {\n failureCount++;\n errors.push(\n `Recipient ${index + 1}: ${result.reason instanceof Error ? result.reason.message : 'Unknown error'}`\n );\n }\n });\n\n const response: NotificationResponse = {\n successCount,\n failureCount,\n errors,\n notificationIds,\n };\n\n logger.info('[Notifications] Channel notification sent (bulk)', {\n successCount,\n failureCount,\n });\n\n return response;\n } else {\n // Single recipient\n try {\n const response = await this.client.query<{\n triggerNotification: { id: string; status: string; deliveryStatus: string };\n }>(mutation, variables, this.context);\n\n const result: NotificationResponse = {\n successCount: 1,\n failureCount: 0,\n errors: [],\n notificationIds: [response.triggerNotification.id],\n };\n\n logger.info('[Notifications] Channel notification sent', {\n notificationId: response.triggerNotification.id,\n status: response.triggerNotification.status,\n });\n\n return result;\n } catch (error) {\n logger.error('[Notifications] Failed to send channel notification', { error });\n\n return {\n successCount: 0,\n failureCount: 1,\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n notificationIds: [],\n };\n }\n }\n }\n\n /**\n * Send notification using a template with optional in-app notification\n */\n public async sendTemplateNotification(options: SendTemplateNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.templateSlug || options.templateSlug.trim().length === 0) {\n throw new ValidationError('Template slug is required');\n }\n\n if (!options.variables || typeof options.variables !== 'object') {\n throw new ValidationError('Template variables are required');\n }\n\n if (!options.recipient && !options.recipients) {\n throw new ValidationError('At least one recipient is required');\n }\n\n if (options.includeInApp && (!options.userIds || options.userIds.length === 0)) {\n throw new ValidationError('User IDs are required when includeInApp is true');\n }\n\n logger.info('[Notifications] Sending template notification', {\n templateSlug: options.templateSlug,\n platform: options.platform,\n recipientCount: options.recipients ? options.recipients.length : 1,\n includeInApp: options.includeInApp,\n inAppUserCount: options.userIds ? options.userIds.length : 0,\n });\n\n const mutation = `\n mutation TriggerNotificationWithTemplate($input: TriggerNotificationWithTemplateInput!) {\n triggerNotificationWithTemplate(input: $input) {\n totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\n }\n }\n `;\n\n const variables = {\n input: {\n platform: options.platform,\n channelId: options.channelId,\n includeInApp: options.includeInApp || false,\n userIds: options.userIds || [],\n templateSlug: options.templateSlug,\n variables: options.variables,\n recipient: options.recipient,\n recipients: options.recipients,\n trackOpens: options.trackOpens || false,\n trackClicks: options.trackClicks || false,\n expiresAt: options.expiresAt?.toISOString(),\n scheduledFor: options.scheduledFor?.toISOString(),\n timezone: options.timezone,\n },\n };\n\n try {\n const response = await this.client.query<{\n triggerNotificationWithTemplate: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const data = response.triggerNotificationWithTemplate;\n\n const result: NotificationResponse = {\n successCount: data.totalTriggered,\n failureCount: data.totalFailed,\n errors: [],\n notificationIds: data.notifications.map((n) => n.id),\n };\n\n logger.info('[Notifications] Template notification sent', {\n templateSlug: options.templateSlug,\n totalTriggered: data.totalTriggered,\n totalFailed: data.totalFailed,\n notificationIds: result.notificationIds,\n });\n\n return result;\n } catch (error) {\n logger.error('[Notifications] Failed to send template notification', { error });\n\n return {\n successCount: 0,\n failureCount: 1,\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n notificationIds: [],\n };\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/notifications/tenant-notifications.ts","../src/notifications/index.ts"],"names":["NotificationChannel","NotificationPriority","NotificationType","TenantNotificationsModule","client","context","send","input","validateSendInput","logger","info","channel","type","priority","mutation","variables","recipient","subject","body","htmlBody","data","metadata","scheduledFor","toISOString","expiresAt","trackOpens","trackClicks","response","tenantQuery","notificationId","sendNotification","sendWithTemplate","templateSlug","trim","length","ValidationError","Object","keys","email","userId","channelId","platform","timezone","result","triggerNotificationWithTemplate","firstNotification","notifications","totalTriggered","totalRequested","totalFailed","id","status","sendBatch","count","batchSize","map","n","delayBetweenBatches","batchId","sendBatchNotifications","queued","totalQueued","failed","getNotification","query","notification","getNotifications","filter","startDate","endDate","undefined","limit","offset","getTemplate","slug","locale","notificationTemplate","getTemplates","notificationTemplates","getStats","notificationStats","markAsRead","notificationIds","markAllAsRead","deleteNotifications","deleteAllReadNotifications","phoneNumber","pushToken","NotificationsModule","options","title","message","userIds","userCount","redirectUrl","appName","sms","successCount","createNotification","failureCount","errors","sendToUser","debug","search","markMultipleAsRead","markNotificationsAsRead","markAllMyNotificationsAsRead","deleteNotification","deleteMultiple","getUnreadCount","unreadCount","sendChannelNotification","recipients","includeInApp","recipientCount","inAppUserCount","results","Promise","allSettled","forEach","index","value","push","triggerNotification","reason","Error","error","sendTemplateNotification"],"mappings":";;;;;AAAA,IAAA,4BAAA,GAAA;;;;;;;AAcO,IAAKA,mBAAAA,6BAAAA,oBAAAA,EAAAA;;;;;;;;;;;AAAAA,EAAAA,OAAAA,oBAAAA;;AAaL,IAAKC,oBAAAA,6BAAAA,qBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,qBAAAA;;AAOL,IAAKC,gBAAAA,6BAAAA,iBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,iBAAAA;;AAsIL,IAAMC,4BAAN,MAAMA;EAxKb;;;;;AAyKE,EAAA,WAAA,CACUC,QACAC,OAAAA,EACR;SAFQD,MAAAA,GAAAA,MAAAA;SACAC,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAaC,KAAKC,KAAAA,EAA+C;AAE/D,IAAA,IAAA,CAAKC,kBAAkBD,KAAAA,CAAAA;AAEvBE,IAAAA,MAAAA,CAAOC,KAAK,4CAAA,EAA8C;AACxDC,MAAAA,OAAAA,EAASJ,KAAAA,CAAMI,OAAAA;AACfC,MAAAA,IAAAA,EAAML,MAAMK,IAAAA,IAAI,eAAA;AAChBC,MAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ;KAC1B,CAAA;AAEA,IAAA,MAAMC,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLS,QAAAA,SAAAA,EAAWT,KAAAA,CAAMS,SAAAA;AACjBL,QAAAA,OAAAA,EAASJ,KAAAA,CAAMI,OAAAA;AACfC,QAAAA,IAAAA,EAAML,MAAMK,IAAAA,IAAI,eAAA;AAChBC,QAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ,QAAA;AACxBI,QAAAA,OAAAA,EAASV,KAAAA,CAAMU,OAAAA;AACfC,QAAAA,IAAAA,EAAMX,KAAAA,CAAMW,IAAAA;AACZC,QAAAA,QAAAA,EAAUZ,KAAAA,CAAMY,QAAAA;AAChBC,QAAAA,IAAAA,EAAMb,KAAAA,CAAMa,IAAAA;AACZC,QAAAA,QAAAA,EAAUd,KAAAA,CAAMc,QAAAA;QAChBC,YAAAA,EAAcf,KAAAA,CAAMe,cAAcC,WAAAA,EAAAA;QAClCC,SAAAA,EAAWjB,KAAAA,CAAMiB,WAAWD,WAAAA,EAAAA;AAC5BE,QAAAA,UAAAA,EAAYlB,KAAAA,CAAMkB,UAAAA;AAClBC,QAAAA,WAAAA,EAAanB,KAAAA,CAAMmB;AACrB;AACF,KAAA;AAEA,IAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCd,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpCI,IAAAA,MAAAA,CAAOC,KAAK,yCAAA,EAA2C;AACrDmB,MAAAA,cAAAA,EAAgBF,QAAAA,CAASG;KAC3B,CAAA;AAEA,IAAA,OAAOH,QAAAA,CAASG,gBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,iBAAiBxB,KAAAA,EAA+C;AAE3E,IAAA,IAAI,CAACA,MAAMyB,YAAAA,IAAgBzB,KAAAA,CAAMyB,aAAaC,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACjE,MAAA,MAAM,IAAIC,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,MAAMQ,SAAAA,IAAaqB,MAAAA,CAAOC,KAAK9B,KAAAA,CAAMQ,SAAS,CAAA,CAAEmB,MAAAA,KAAW,CAAA,EAAG;AACjE,MAAA,MAAM,IAAIC,gBAAgB,iCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,KAAAA,CAAMS,SAAAA,IAAc,CAACT,KAAAA,CAAMS,UAAUsB,KAAAA,IAAS,CAAC/B,KAAAA,CAAMS,SAAAA,CAAUuB,MAAAA,EAAS;AAC3E,MAAA,MAAM,IAAIJ,gBAAgB,uCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,0DAAA,EAA4D;AACtEsB,MAAAA,YAAAA,EAAczB,KAAAA,CAAMyB,YAAAA;AACpBnB,MAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ;KAC1B,CAAA;AAEA,IAAA,MAAMC,QAAAA,GAAW;;;;;;;;;;;;;;AAejB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLyB,QAAAA,YAAAA,EAAczB,KAAAA,CAAMyB,YAAAA;AACpBjB,QAAAA,SAAAA,EAAWR,KAAAA,CAAMQ,SAAAA;AACjBC,QAAAA,SAAAA,EAAWT,KAAAA,CAAMS,SAAAA;AACjBH,QAAAA,QAAAA,EAAUN,MAAMM,QAAAA,IAAQ,QAAA;QACxBS,YAAAA,EAAcf,KAAAA,CAAMe,cAAcC,WAAAA,EAAAA;QAClCC,SAAAA,EAAWjB,KAAAA,CAAMiB,WAAWD,WAAAA,EAAAA;AAC5BE,QAAAA,UAAAA,EAAYlB,KAAAA,CAAMkB,UAAAA;AAClBC,QAAAA,WAAAA,EAAanB,KAAAA,CAAMmB,WAAAA;;;AAGnBc,QAAAA,SAAAA,EAAWjC,KAAAA,CAAMiC,SAAAA;AACjBC,QAAAA,QAAAA,EAAUlC,MAAMkC,QAAAA,IAAQ,OAAA;AACxBC,QAAAA,QAAAA,EAAUnC,KAAAA,CAAMmC;AAClB;AACF,KAAA;AAEA,IAAA,MAAMf,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAOhCd,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,IAAA,MAAMsC,SAAShB,QAAAA,CAASiB,+BAAAA;AACxB,IAAA,MAAMC,iBAAAA,GAAoBF,MAAAA,CAAOG,aAAAA,CAAc,CAAA,CAAA;AAE/C,IAAA,IAAIH,MAAAA,CAAOI,cAAAA,KAAmB,CAAA,IAAK,CAACF,iBAAAA,EAAmB;AACrD,MAAA,MAAM,IAAIV,eAAAA,CACR,CAAA,uCAAA,EAA0CQ,MAAAA,CAAOK,cAAc,CAAA,YAAA,EAAeL,MAAAA,CAAOI,cAAc,CAAA,SAAA,EAAYJ,MAAAA,CAAOM,WAAW,CAAA,CAAE,CAAA;AAEvI,IAAA;AAEAxC,IAAAA,MAAAA,CAAOC,KAAK,uDAAA,EAAyD;AACnEmB,MAAAA,cAAAA,EAAgBgB,iBAAAA,CAAkBK,EAAAA;AAClCC,MAAAA,MAAAA,EAAQN,iBAAAA,CAAkBM,MAAAA;AAC1BJ,MAAAA,cAAAA,EAAgBJ,MAAAA,CAAOI,cAAAA;AACvBE,MAAAA,WAAAA,EAAaN,MAAAA,CAAOM;KACtB,CAAA;AAEA,IAAA,OAAOJ,iBAAAA,CAAkBK,EAAAA;AAC3B,EAAA;;;;AAKA,EAAA,MAAaE,UAAU7C,KAAAA,EAKpB;AACD,IAAA,IAAI,CAACA,KAAAA,CAAMuC,aAAAA,IAAiBvC,KAAAA,CAAMuC,aAAAA,CAAcZ,WAAW,CAAA,EAAG;AAC5D,MAAA,MAAM,IAAIC,gBAAgB,uCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,mDAAA,EAAqD;AAC/D2C,MAAAA,KAAAA,EAAO9C,MAAMuC,aAAAA,CAAcZ,MAAAA;AAC3BoB,MAAAA,SAAAA,EAAW/C,KAAAA,CAAM+C;KACnB,CAAA;AAEA,IAAA,MAAMxC,QAAAA,GAAW;;;;;;;;;;AAWjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLuC,QAAAA,aAAAA,EAAevC,KAAAA,CAAMuC,aAAAA,CAAcS,GAAAA,CAAI,CAACC,CAAAA,MAAO;AAC7CxC,UAAAA,SAAAA,EAAWwC,CAAAA,CAAExC,SAAAA;AACbL,UAAAA,OAAAA,EAAS6C,CAAAA,CAAE7C,OAAAA;AACXC,UAAAA,IAAAA,EAAM4C,EAAE5C,IAAAA,IAAI,eAAA;AACZC,UAAAA,QAAAA,EAAU2C,EAAE3C,QAAAA,IAAQ,QAAA;AACpBI,UAAAA,OAAAA,EAASuC,CAAAA,CAAEvC,OAAAA;AACXC,UAAAA,IAAAA,EAAMsC,CAAAA,CAAEtC,IAAAA;AACRC,UAAAA,QAAAA,EAAUqC,CAAAA,CAAErC,QAAAA;AACZC,UAAAA,IAAAA,EAAMoC,CAAAA,CAAEpC,IAAAA;AACRC,UAAAA,QAAAA,EAAUmC,CAAAA,CAAEnC,QAAAA;UACZC,YAAAA,EAAckC,CAAAA,CAAElC,cAAcC,WAAAA,EAAAA;UAC9BC,SAAAA,EAAWgC,CAAAA,CAAEhC,WAAWD,WAAAA,EAAAA;AACxBE,UAAAA,UAAAA,EAAY+B,CAAAA,CAAE/B,UAAAA;AACdC,UAAAA,WAAAA,EAAa8B,CAAAA,CAAE9B;SACjB,CAAA,CAAA;AACA4B,QAAAA,SAAAA,EAAW/C,KAAAA,CAAM+C,SAAAA;AACjBG,QAAAA,mBAAAA,EAAqBlD,KAAAA,CAAMkD,mBAAAA;AAC3B5C,QAAAA,QAAAA,EAAUN,KAAAA,CAAMM;AAClB;AACF,KAAA;AAEA,IAAA,MAAMc,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAOhCd,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpCI,IAAAA,MAAAA,CAAOC,KAAK,gDAAA,EAAkD;AAC5DgD,MAAAA,OAAAA,EAAS/B,SAASgC,sBAAAA,CAAuBD,OAAAA;AACzCE,MAAAA,MAAAA,EAAQjC,SAASgC,sBAAAA,CAAuBE,WAAAA;AACxCC,MAAAA,MAAAA,EAAQnC,SAASgC,sBAAAA,CAAuBV;KAC1C,CAAA;AAEA,IAAA,OAAOtB,QAAAA,CAASgC,sBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaI,gBAAgBb,EAAAA,EAA0C;AACrE,IAAA,MAAMc,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4Bd,IAAA,MAAMrC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAO;AAAEd,MAAAA;AAAG,KAAA,EAAG,KAAK7C,OAAO,CAAA;AAE9B,IAAA,OAAOsB,QAAAA,CAASsC,YAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,iBAAiBC,MAAAA,EAUF;AAC1B,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0Bd,IAAA,MAAMjD,SAAAA,GAAY;AAChBoD,MAAAA,MAAAA,EAAQA,MAAAA,GACJ;AACE5B,QAAAA,MAAAA,EAAQ4B,MAAAA,CAAO5B,MAAAA;AACf5B,QAAAA,OAAAA,EAASwD,MAAAA,CAAOxD,OAAAA;AAChBC,QAAAA,IAAAA,EAAMuD,MAAAA,CAAOvD,IAAAA;AACbuC,QAAAA,MAAAA,EAAQgB,MAAAA,CAAOhB,MAAAA;AACftC,QAAAA,QAAAA,EAAUsD,MAAAA,CAAOtD,QAAAA;QACjBuD,SAAAA,EAAWD,MAAAA,CAAOC,WAAW7C,WAAAA,EAAAA;QAC7B8C,OAAAA,EAASF,MAAAA,CAAOE,SAAS9C,WAAAA;OAC3B,GACA+C,MAAAA;AACJC,MAAAA,KAAAA,EAAOJ,QAAQI,KAAAA,IAAS,EAAA;AACxBC,MAAAA,MAAAA,EAAQL,QAAQK,MAAAA,IAAU;AAC5B,KAAA;AAEA,IAAA,MAAM7C,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAOjD,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASmB,aAAAA;AAClB,EAAA;;;;EAKA,MAAa2B,WAAAA,CAAYC,MAAcC,MAAAA,EAAuD;AAC5F,IAAA,MAAMX,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;AAsBd,IAAA,MAAMrC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAO;AAAEU,MAAAA,IAAAA;AAAMC,MAAAA;AAAO,KAAA,EAAG,KAAKtE,OAAO,CAAA;AAExC,IAAA,OAAOsB,QAAAA,CAASiD,oBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,aAAaV,MAAAA,EAIU;AAClC,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;AAsBd,IAAA,MAAMrC,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAO;AAAEG,MAAAA;AAAO,KAAA,EAAG,KAAK9D,OAAO,CAAA;AAElC,IAAA,OAAOsB,QAAAA,CAASmD,qBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,SAASZ,MAAAA,EAA4F;AAChH,IAAA,MAAMH,KAAAA,GAAQ;;;;;;;;;;;;;;;AAgBd,IAAA,MAAMjD,SAAAA,GAAY;AAChBoD,MAAAA,MAAAA,EAAQA,MAAAA,GACJ;AACE5B,QAAAA,MAAAA,EAAQ4B,MAAAA,CAAO5B,MAAAA;QACf6B,SAAAA,EAAWD,MAAAA,CAAOC,WAAW7C,WAAAA,EAAAA;QAC7B8C,OAAAA,EAASF,MAAAA,CAAOE,SAAS9C,WAAAA;OAC3B,GACA+C;AACN,KAAA;AAEA,IAAA,MAAM3C,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAOwB,YAEhCoC,KAAAA,EAAOjD,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASqD,iBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,WAAWC,eAAAA,EAA6C;AACnE,IAAA,MAAMpE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAEzEI,IAAAA,MAAAA,CAAOC,KAAK,oDAAA,EAAsD;AAChE2C,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAaiD,aAAAA,GAAkC;AAC7C,IAAA,MAAMrE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,KAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,UAAU,EAAC,EAAG,KAAKT,OAAO,CAAA;AAExDI,IAAAA,MAAAA,CAAOC,KAAK,wDAAA,CAAA;AAEZ,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa0E,oBAAoBF,eAAAA,EAA6C;AAC5E,IAAA,MAAMpE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAEzEI,IAAAA,MAAAA,CAAOC,KAAK,6CAAA,EAA+C;AACzD2C,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAamD,0BAAAA,GAA+C;AAC1D,IAAA,MAAMvE,QAAAA,GAAW;;;;;AAMjB,IAAA,MAAM,KAAKV,MAAAA,CAAOwB,WAAAA,CAAYd,UAAU,EAAC,EAAG,KAAKT,OAAO,CAAA;AAExDI,IAAAA,MAAAA,CAAOC,KAAK,sDAAA,CAAA;AAEZ,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKQF,EAAAA,iBAAAA,CAAkBD,KAAAA,EAAoC;AAC5D,IAAA,IAAI,CAACA,KAAAA,CAAMS,SAAAA,IAAc,CAACT,MAAMS,SAAAA,CAAUsB,KAAAA,IAAS,CAAC/B,KAAAA,CAAMS,SAAAA,CAAUuB,MAAAA,IAAU,CAAChC,KAAAA,CAAMS,UAAUsE,WAAAA,EAAc;AAC3G,MAAA,MAAM,IAAInD,gBAAgB,qDAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,MAAMI,OAAAA,EAAS;AAClB,MAAA,MAAM,IAAIwB,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAAC5B,MAAMW,IAAAA,IAAQX,KAAAA,CAAMW,KAAKe,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACjD,MAAA,MAAM,IAAIC,gBAAgB,+BAAA,CAAA;AAC5B,IAAA;AAGA,IAAA,IAAI5B,MAAMI,OAAAA,KAAO,OAAA,IAAkC,CAACJ,KAAAA,CAAMS,UAAUsB,KAAAA,EAAO;AACzE,MAAA,MAAM,IAAIH,gBAAgB,+CAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI5B,MAAMI,OAAAA,KAAO,KAAA,IAAgC,CAACJ,KAAAA,CAAMS,UAAUsE,WAAAA,EAAa;AAC7E,MAAA,MAAM,IAAInD,gBAAgB,oDAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI5B,KAAAA,CAAMI,OAAAA,KAAO,MAAA,IAAiC,CAACJ,KAAAA,CAAMS,UAAUuE,SAAAA,IAAa,CAAChF,KAAAA,CAAMS,SAAAA,CAAUuB,MAAAA,EAAQ;AACvG,MAAA,MAAM,IAAIJ,gBAAgB,6DAAA,CAAA;AAC5B,IAAA;AACF,EAAA;AACF;;;ACnqBO,IAAKjC,iBAAAA,6BAAAA,iBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,iBAAAA;;AAOL,IAAKF,oBAAAA,6BAAAA,oBAAAA,EAAAA;;;;;;;;AAAAA,EAAAA,OAAAA,oBAAAA;;AA4JL,IAAMwF,sBAAN,MAAMA;EA7Kb;;;;;AA8KE,EAAA,WAAA,CACUpF,QACAC,OAAAA,EACR;SAFQD,MAAAA,GAAAA,MAAAA;SACAC,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAaC,KAAKmF,OAAAA,EAAiE;AAEjF,IAAA,IAAI,CAACA,QAAQC,KAAAA,IAASD,OAAAA,CAAQC,MAAMzD,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACvD,MAAA,MAAM,IAAIC,gBAAgB,gCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,QAAQE,OAAAA,IAAWF,OAAAA,CAAQE,QAAQ1D,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AAC3D,MAAA,MAAM,IAAIC,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQG,OAAAA,IAAWH,OAAAA,CAAQG,OAAAA,CAAQ1D,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,IAAIC,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,sCAAA,EAAwC;AAClDgF,MAAAA,KAAAA,EAAOD,OAAAA,CAAQC,KAAAA;AACfG,MAAAA,SAAAA,EAAWJ,QAAQG,OAAAA,CAAQ1D,MAAAA;AAC3BtB,MAAAA,IAAAA,EAAM6E,QAAQ7E,IAAAA,IAAI;KACpB,CAAA;AAEA,IAAA,MAAME,QAAAA,GAAW;;;;;;;;;;;;AAajB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLmF,QAAAA,KAAAA,EAAOD,OAAAA,CAAQC,KAAAA;AACfC,QAAAA,OAAAA,EAASF,OAAAA,CAAQE,OAAAA;AACjB/E,QAAAA,IAAAA,EAAM6E,QAAQ7E,IAAAA,IAAI,MAAA;AAClBgF,QAAAA,OAAAA,EAASH,OAAAA,CAAQG,OAAAA;AACjBE,QAAAA,WAAAA,EAAaL,QAAQK,WAAAA,IAAe,EAAA;AACpCC,QAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBzD,QAAAA,KAAAA,EAAOmD,QAAQnD,KAAAA,IAAS,KAAA;AACxB0D,QAAAA,GAAAA,EAAKP,QAAQO,GAAAA,IAAO;AACtB;AACF,KAAA;AAEA,IAAA,MAAMrE,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,IAAA,MAAMsC,MAAAA,GAAS;AACbsD,MAAAA,YAAAA,EAActE,SAASuE,kBAAAA,CAAmBD,YAAAA;AAC1CE,MAAAA,YAAAA,EAAcxE,SAASuE,kBAAAA,CAAmBC,YAAAA;AAC1CC,MAAAA,MAAAA,EAAQzE,SAASuE,kBAAAA,CAAmBE,MAAAA;AACpClB,MAAAA,eAAAA,EAAiBvD,SAASuE,kBAAAA,CAAmBpD,aAAAA,CAAcS,IAAI,CAACC,CAAAA,KAAMA,EAAEN,EAAE;AAC5E,KAAA;AAEAzC,IAAAA,MAAAA,CAAOC,KAAK,mCAAA,EAAqC;AAC/CuF,MAAAA,YAAAA,EAActD,MAAAA,CAAOsD,YAAAA;AACrBE,MAAAA,YAAAA,EAAcxD,MAAAA,CAAOwD;KACvB,CAAA;AAEA,IAAA,OAAOxD,MAAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa0D,UAAAA,CACX9D,MAAAA,EACAmD,KAAAA,EACAC,OAAAA,EACAF,OAAAA,EAC+B;AAC/B,IAAA,OAAO,KAAKnF,IAAAA,CAAK;AACfoF,MAAAA,KAAAA;AACAC,MAAAA,OAAAA;MACAC,OAAAA,EAAS;AAACrD,QAAAA;;MACV,GAAGkD;KACL,CAAA;AACF,EAAA;;;;AAKA,EAAA,MAAavB,iBAAiBuB,OAAAA,EAI3B;AACDhF,IAAAA,MAAAA,CAAO6F,MAAM,uCAAA,EAAyC;AAAE/D,MAAAA,MAAAA,EAAQkD,OAAAA,CAAQlD;KAAO,CAAA;AAE/E,IAAA,MAAMyB,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCd,IAAA,MAAMjD,SAAAA,GAAY;AAChBwB,MAAAA,MAAAA,EAAQkD,OAAAA,CAAQlD,MAAAA;AAChBY,MAAAA,MAAAA,EAAQsC,OAAAA,CAAQtC,MAAAA;AAChBvC,MAAAA,IAAAA,EAAM6E,OAAAA,CAAQ7E,IAAAA;AACdmF,MAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBQ,MAAAA,MAAAA,EAAQd,OAAAA,CAAQc,MAAAA;AAChBhC,MAAAA,KAAAA,EAAOkB,QAAQlB,KAAAA,IAAS,EAAA;AACxBC,MAAAA,MAAAA,EAAQiB,QAAQjB,MAAAA,IAAU;AAC5B,KAAA;AAEA,IAAA,MAAM7C,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAMhCA,KAAAA,EAAOjD,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEjC,IAAA,OAAOsB,QAAAA,CAASuC,gBAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAae,WAAWpD,cAAAA,EAA0C;AAChEpB,IAAAA,MAAAA,CAAO6F,MAAM,8CAAA,EAAgD;AAAEzE,MAAAA;KAAe,CAAA;AAE9E,IAAA,MAAMf,QAAAA,GAAW;;;;;;;;AASjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAO4D,KAAAA,CAAMlD,QAAAA,EAAU;AAAEe,MAAAA;AAAe,KAAA,EAAG,KAAKxB,OAAO,CAAA;AAElEI,IAAAA,MAAAA,CAAOC,KAAK,6CAAA,EAA+C;AAAEmB,MAAAA;KAAe,CAAA;AAE5E,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa2E,mBAAmBtB,eAAAA,EAA4C;AAC1EzE,IAAAA,MAAAA,CAAO6F,MAAM,wDAAA,EAA0D;AACrEjD,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAE9CI,IAAAA,MAAAA,CAAOC,KAAK,8CAAA,EAAgD;AAC1D2C,MAAAA,KAAAA,EAAO1B,SAAS8E,uBAAAA,CAAwBpD;KAC1C,CAAA;AAEA,IAAA,OAAO1B,SAAS8E,uBAAAA,CAAwBpD,KAAAA;AAC1C,EAAA;;;;AAKA,EAAA,MAAa8B,aAAAA,GAAiC;AAC5C1E,IAAAA,MAAAA,CAAO6F,MAAM,mDAAA,CAAA;AAEb,IAAA,MAAMxF,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAU,EAAC,EAAG,IAAA,CAAKT,OAAO,CAAA;AAE7BI,IAAAA,MAAAA,CAAOC,KAAK,kDAAA,EAAoD;AAC9D2C,MAAAA,KAAAA,EAAO1B,SAAS+E,4BAAAA,CAA6BrD;KAC/C,CAAA;AAEA,IAAA,OAAO1B,SAAS+E,4BAAAA,CAA6BrD,KAAAA;AAC/C,EAAA;;;;AAKA,EAAA,MAAasD,mBAAmB9E,cAAAA,EAA0C;AACxEpB,IAAAA,MAAAA,CAAO6F,MAAM,uCAAA,EAAyC;AAAEzE,MAAAA;KAAe,CAAA;AAEvE,IAAA,MAAMf,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAM,IAAA,CAAKV,MAAAA,CAAO4D,KAAAA,CAAMlD,QAAAA,EAAU;AAAEe,MAAAA;AAAe,KAAA,EAAG,KAAKxB,OAAO,CAAA;AAElEI,IAAAA,MAAAA,CAAOC,KAAK,sCAAA,EAAwC;AAAEmB,MAAAA;KAAe,CAAA;AAErE,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa+E,eAAe1B,eAAAA,EAA4C;AACtEzE,IAAAA,MAAAA,CAAO6F,MAAM,iDAAA,EAAmD;AAC9DjD,MAAAA,KAAAA,EAAO6B,eAAAA,CAAgBhD;KACzB,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMa,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAU;AAAEoE,MAAAA;AAAgB,KAAA,EAAG,KAAK7E,OAAO,CAAA;AAE9CI,IAAAA,MAAAA,CAAOC,KAAK,uCAAA,EAAyC;AACnD2C,MAAAA,KAAAA,EAAO1B,SAASyD,mBAAAA,CAAoB/B;KACtC,CAAA;AAEA,IAAA,OAAO1B,SAASyD,mBAAAA,CAAoB/B,KAAAA;AACtC,EAAA;;;;AAKA,EAAA,MAAawD,eAAetE,MAAAA,EAAiC;AAC3D,IAAA,MAAMI,MAAAA,GAAS,MAAM,IAAA,CAAKuB,gBAAAA,CAAiB;AACzC3B,MAAAA,MAAAA;MACAY,MAAAA,EAAQ,QAAA;MACRoB,KAAAA,EAAO;KACT,CAAA;AAEA,IAAA,OAAO5B,MAAAA,CAAOmE,WAAAA;AAChB,EAAA;;;;;AAMA,EAAA,MAAaC,wBAAwBtB,OAAAA,EAAwE;AAE3G,IAAA,IAAI,CAACA,QAAQvE,IAAAA,IAAQuE,OAAAA,CAAQvE,KAAKe,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACrD,MAAA,MAAM,IAAIC,gBAAgB,+BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQzE,SAAAA,IAAa,CAACyE,QAAQuB,UAAAA,EAAY;AAC7C,MAAA,MAAM,IAAI7E,gBAAgB,oCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAIsD,OAAAA,CAAQwB,iBAAiB,CAACxB,OAAAA,CAAQG,WAAWH,OAAAA,CAAQG,OAAAA,CAAQ1D,WAAW,CAAA,CAAA,EAAI;AAC9E,MAAA,MAAM,IAAIC,gBAAgB,iDAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,8CAAA,EAAgD;AAC1D+B,MAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClByE,MAAAA,cAAAA,EAAgBzB,OAAAA,CAAQuB,UAAAA,GAAavB,OAAAA,CAAQuB,UAAAA,CAAW9E,MAAAA,GAAS,CAAA;AACjE+E,MAAAA,YAAAA,EAAcxB,OAAAA,CAAQwB,YAAAA;AACtBE,MAAAA,cAAAA,EAAgB1B,OAAAA,CAAQG,OAAAA,GAAUH,OAAAA,CAAQG,OAAAA,CAAQ1D,MAAAA,GAAS;KAC7D,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;;;AAUjB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLkC,QAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClBD,QAAAA,SAAAA,EAAWiD,OAAAA,CAAQjD,SAAAA;AACnByE,QAAAA,YAAAA,EAAcxB,QAAQwB,YAAAA,IAAgB,KAAA;QACtCrB,OAAAA,EAASH,OAAAA,CAAQG,WAAW,EAAA;QAC5B3B,YAAAA,EAAc;AACZhD,UAAAA,OAAAA,EAASwE,QAAQxE,OAAAA,IAAW,EAAA;AAC5BC,UAAAA,IAAAA,EAAMuE,OAAAA,CAAQvE,IAAAA;AACdC,UAAAA,QAAAA,EAAUsE,QAAQtE,QAAAA,IAAY,EAAA;AAC9BR,UAAAA,OAAAA,EAAS8E,OAAAA,CAAQhD,QAAAA;AACjB7B,UAAAA,IAAAA,EAAM6E,QAAQ7E,IAAAA,IAAI,MAAA;AAClBI,UAAAA,SAAAA,EAAWyE,OAAAA,CAAQzE,SAAAA;AACnB+E,UAAAA,OAAAA,EAASN,OAAAA,CAAQM,OAAAA;AACjBD,UAAAA,WAAAA,EAAaL,QAAQK,WAAAA,IAAe,EAAA;UACpCzE,QAAAA,EAAUoE,OAAAA,CAAQpE,YAAY,EAAC;AAC/BI,UAAAA,UAAAA,EAAYgE,QAAQhE,UAAAA,IAAc,KAAA;AAClCC,UAAAA,WAAAA,EAAa+D,QAAQ/D,WAAAA,IAAe,KAAA;UACpCF,SAAAA,EAAWiE,OAAAA,CAAQjE,WAAWD,WAAAA;AAChC;AACF;AACF,KAAA;AAGA,IAAA,IAAIkE,OAAAA,CAAQuB,UAAAA,IAAcvB,OAAAA,CAAQuB,UAAAA,CAAW9E,SAAS,CAAA,EAAG;AACvD,MAAA,MAAMkF,OAAAA,GAAU,MAAMC,OAAAA,CAAQC,UAAAA,CAC5B7B,OAAAA,CAAQuB,UAAAA,CAAWzD,GAAAA,CAAI,CAACvC,SAAAA,KACtB,IAAA,CAAKZ,MAAAA,CAAO4D,KAAAA,CACVlD,QAAAA,EACA;QACEP,KAAAA,EAAO;AACL,UAAA,GAAGQ,SAAAA,CAAUR,KAAAA;UACb0D,YAAAA,EAAc;AACZ,YAAA,GAAGlD,UAAUR,KAAAA,CAAM0D,YAAAA;AACnBjD,YAAAA;AACF;AACF;OACF,EACA,IAAA,CAAKX,OAAO,CAAA,CAAA,CAAA;AAKlB,MAAA,IAAI4F,YAAAA,GAAe,CAAA;AACnB,MAAA,IAAIE,YAAAA,GAAe,CAAA;AACnB,MAAA,MAAMC,SAAmB,EAAA;AACzB,MAAA,MAAMlB,kBAA4B,EAAA;AAElCkC,MAAAA,OAAAA,CAAQG,OAAAA,CAAQ,CAAC5E,MAAAA,EAAQ6E,KAAAA,KAAAA;AACvB,QAAA,IAAI7E,MAAAA,CAAOQ,WAAW,WAAA,EAAa;AACjC8C,UAAAA,YAAAA,EAAAA;AACA,UAAA,MAAMtE,YAAWgB,MAAAA,CAAO8E,KAAAA;AACxBvC,UAAAA,eAAAA,CAAgBwC,IAAAA,CAAK/F,SAAAA,CAASgG,mBAAAA,CAAoBzE,EAAE,CAAA;QACtD,CAAA,MAAO;AACLiD,UAAAA,YAAAA,EAAAA;AACAC,UAAAA,MAAAA,CAAOsB,IAAAA,CACL,CAAA,UAAA,EAAaF,KAAAA,GAAQ,CAAA,CAAA,EAAA,EAAM7E,MAAAA,CAAOiF,MAAAA,YAAkBC,KAAAA,GAAQlF,MAAAA,CAAOiF,MAAAA,CAAOjC,OAAAA,GAAU,eAAA,CAAA,CAAiB,CAAA;AAEzG,QAAA;MACF,CAAA,CAAA;AAEA,MAAA,MAAMhE,QAAAA,GAAiC;AACrCsE,QAAAA,YAAAA;AACAE,QAAAA,YAAAA;AACAC,QAAAA,MAAAA;AACAlB,QAAAA;AACF,OAAA;AAEAzE,MAAAA,MAAAA,CAAOC,KAAK,kDAAA,EAAoD;AAC9DuF,QAAAA,YAAAA;AACAE,QAAAA;OACF,CAAA;AAEA,MAAA,OAAOxE,QAAAA;IACT,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,MAAMA,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAEhClD,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,QAAA,MAAMsC,MAAAA,GAA+B;UACnCsD,YAAAA,EAAc,CAAA;UACdE,YAAAA,EAAc,CAAA;AACdC,UAAAA,MAAAA,EAAQ,EAAA;UACRlB,eAAAA,EAAiB;AAACvD,YAAAA,QAAAA,CAASgG,mBAAAA,CAAoBzE;;AACjD,SAAA;AAEAzC,QAAAA,MAAAA,CAAOC,KAAK,2CAAA,EAA6C;AACvDmB,UAAAA,cAAAA,EAAgBF,SAASgG,mBAAAA,CAAoBzE,EAAAA;AAC7CC,UAAAA,MAAAA,EAAQxB,SAASgG,mBAAAA,CAAoBxE;SACvC,CAAA;AAEA,QAAA,OAAOR,MAAAA;AACT,MAAA,CAAA,CAAA,OAASmF,KAAAA,EAAO;AACdrH,QAAAA,MAAAA,CAAOqH,MAAM,qDAAA,EAAuD;AAAEA,UAAAA;SAAM,CAAA;AAE5E,QAAA,OAAO;UACL7B,YAAAA,EAAc,CAAA;UACdE,YAAAA,EAAc,CAAA;UACdC,MAAAA,EAAQ;YAAC0B,KAAAA,YAAiBD,KAAAA,GAAQC,MAAMnC,OAAAA,GAAU;;AAClDT,UAAAA,eAAAA,EAAiB;AACnB,SAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;;;;AAKA,EAAA,MAAa6C,yBAAyBtC,OAAAA,EAAyE;AAE7G,IAAA,IAAI,CAACA,QAAQzD,YAAAA,IAAgByD,OAAAA,CAAQzD,aAAaC,IAAAA,EAAI,CAAGC,WAAW,CAAA,EAAG;AACrE,MAAA,MAAM,IAAIC,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQ1E,SAAAA,IAAa,OAAO0E,OAAAA,CAAQ1E,cAAc,QAAA,EAAU;AAC/D,MAAA,MAAM,IAAIoB,gBAAgB,iCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACsD,OAAAA,CAAQzE,SAAAA,IAAa,CAACyE,QAAQuB,UAAAA,EAAY;AAC7C,MAAA,MAAM,IAAI7E,gBAAgB,oCAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAIsD,OAAAA,CAAQwB,iBAAiB,CAACxB,OAAAA,CAAQG,WAAWH,OAAAA,CAAQG,OAAAA,CAAQ1D,WAAW,CAAA,CAAA,EAAI;AAC9E,MAAA,MAAM,IAAIC,gBAAgB,iDAAA,CAAA;AAC5B,IAAA;AAEA1B,IAAAA,MAAAA,CAAOC,KAAK,+CAAA,EAAiD;AAC3DsB,MAAAA,YAAAA,EAAcyD,OAAAA,CAAQzD,YAAAA;AACtBS,MAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClByE,MAAAA,cAAAA,EAAgBzB,OAAAA,CAAQuB,UAAAA,GAAavB,OAAAA,CAAQuB,UAAAA,CAAW9E,MAAAA,GAAS,CAAA;AACjE+E,MAAAA,YAAAA,EAAcxB,OAAAA,CAAQwB,YAAAA;AACtBE,MAAAA,cAAAA,EAAgB1B,OAAAA,CAAQG,OAAAA,GAAUH,OAAAA,CAAQG,OAAAA,CAAQ1D,MAAAA,GAAS;KAC7D,CAAA;AAEA,IAAA,MAAMpB,QAAAA,GAAW;;;;;;;;;;;;;;AAejB,IAAA,MAAMC,SAAAA,GAAY;MAChBR,KAAAA,EAAO;AACLkC,QAAAA,QAAAA,EAAUgD,OAAAA,CAAQhD,QAAAA;AAClBD,QAAAA,SAAAA,EAAWiD,OAAAA,CAAQjD,SAAAA;AACnByE,QAAAA,YAAAA,EAAcxB,QAAQwB,YAAAA,IAAgB,KAAA;QACtCrB,OAAAA,EAASH,OAAAA,CAAQG,WAAW,EAAA;AAC5B5D,QAAAA,YAAAA,EAAcyD,OAAAA,CAAQzD,YAAAA;AACtBjB,QAAAA,SAAAA,EAAW0E,OAAAA,CAAQ1E,SAAAA;AACnBC,QAAAA,SAAAA,EAAWyE,OAAAA,CAAQzE,SAAAA;AACnBgG,QAAAA,UAAAA,EAAYvB,OAAAA,CAAQuB,UAAAA;AACpBvF,QAAAA,UAAAA,EAAYgE,QAAQhE,UAAAA,IAAc,KAAA;AAClCC,QAAAA,WAAAA,EAAa+D,QAAQ/D,WAAAA,IAAe,KAAA;QACpCF,SAAAA,EAAWiE,OAAAA,CAAQjE,WAAWD,WAAAA,EAAAA;QAC9BD,YAAAA,EAAcmE,OAAAA,CAAQnE,cAAcC,WAAAA,EAAAA;AACpCmB,QAAAA,QAAAA,EAAU+C,OAAAA,CAAQ/C;AACpB;AACF,KAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAMf,QAAAA,GAAW,MAAM,IAAA,CAAKvB,MAAAA,CAAO4D,MAOhClD,QAAAA,EAAUC,SAAAA,EAAW,KAAKV,OAAO,CAAA;AAEpC,MAAA,MAAMe,OAAOO,QAAAA,CAASiB,+BAAAA;AAEtB,MAAA,MAAMD,MAAAA,GAA+B;AACnCsD,QAAAA,YAAAA,EAAc7E,IAAAA,CAAK2B,cAAAA;AACnBoD,QAAAA,YAAAA,EAAc/E,IAAAA,CAAK6B,WAAAA;AACnBmD,QAAAA,MAAAA,EAAQ,EAAA;AACRlB,QAAAA,eAAAA,EAAiB9D,KAAK0B,aAAAA,CAAcS,GAAAA,CAAI,CAACC,CAAAA,KAAMA,EAAEN,EAAE;AACrD,OAAA;AAEAzC,MAAAA,MAAAA,CAAOC,KAAK,4CAAA,EAA8C;AACxDsB,QAAAA,YAAAA,EAAcyD,OAAAA,CAAQzD,YAAAA;AACtBe,QAAAA,cAAAA,EAAgB3B,IAAAA,CAAK2B,cAAAA;AACrBE,QAAAA,WAAAA,EAAa7B,IAAAA,CAAK6B,WAAAA;AAClBiC,QAAAA,eAAAA,EAAiBvC,MAAAA,CAAOuC;OAC1B,CAAA;AAEA,MAAA,OAAOvC,MAAAA;AACT,IAAA,CAAA,CAAA,OAASmF,KAAAA,EAAO;AACdrH,MAAAA,MAAAA,CAAOqH,MAAM,sDAAA,EAAwD;AAAEA,QAAAA;OAAM,CAAA;AAE7E,MAAA,OAAO;QACL7B,YAAAA,EAAc,CAAA;QACdE,YAAAA,EAAc,CAAA;QACdC,MAAAA,EAAQ;UAAC0B,KAAAA,YAAiBD,KAAAA,GAAQC,MAAMnC,OAAAA,GAAU;;AAClDT,QAAAA,eAAAA,EAAiB;AACnB,OAAA;AACF,IAAA;AACF,EAAA;AACF","file":"chunk-ZHQUXD6S.js","sourcesContent":["/**\n * Tenant-Backend Notifications Module\n * Comprehensive notification system supporting 10+ channels via tenant-backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\n// ========================================\n// Enums\n// ========================================\n\nexport enum NotificationChannel {\n EMAIL = 'EMAIL',\n SMS = 'SMS',\n PUSH = 'PUSH',\n IN_APP = 'IN_APP',\n WEBHOOK = 'WEBHOOK',\n WHATSAPP = 'WHATSAPP',\n TEAMS = 'TEAMS',\n SLACK = 'SLACK',\n TELEGRAM = 'TELEGRAM',\n DISCORD = 'DISCORD',\n}\n\nexport enum NotificationPriority {\n LOW = 'LOW',\n MEDIUM = 'MEDIUM',\n HIGH = 'HIGH',\n URGENT = 'URGENT',\n}\n\nexport enum NotificationType {\n TRANSACTIONAL = 'TRANSACTIONAL',\n MARKETING = 'MARKETING',\n SYSTEM = 'SYSTEM',\n ALERT = 'ALERT',\n}\n\n// ========================================\n// Types & Interfaces\n// ========================================\n\nexport interface RecipientInput {\n userId?: string;\n email?: string;\n phoneNumber?: string;\n pushToken?: string;\n whatsappNumber?: string;\n teamsUserId?: string;\n slackUserId?: string;\n webhookUrl?: string;\n name?: string;\n locale?: string;\n timezone?: string;\n}\n\nexport interface SendNotificationInput {\n recipient: RecipientInput;\n channel: NotificationChannel;\n type?: NotificationType;\n priority?: NotificationPriority;\n subject?: string;\n body: string;\n htmlBody?: string;\n data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n scheduledFor?: Date;\n expiresAt?: Date;\n trackOpens?: boolean;\n trackClicks?: boolean;\n}\n\nexport interface SendWithTemplateInput {\n templateSlug: string;\n variables: Record<string, unknown>;\n recipient: RecipientInput;\n priority?: NotificationPriority;\n scheduledFor?: Date;\n expiresAt?: Date;\n trackOpens?: boolean;\n trackClicks?: boolean;\n /** Specific channel instance ID from channel service (takes precedence) */\n channelId?: string;\n /** Platform type for auto-failover (EMAIL, SMS, etc.) - used if channelId not provided */\n platform?: NotificationChannel;\n /** Timezone for scheduling */\n timezone?: string;\n}\n\nexport interface BatchNotificationInput {\n notifications: SendNotificationInput[];\n batchSize?: number;\n delayBetweenBatches?: number;\n priority?: NotificationPriority;\n}\n\nexport interface Notification {\n id: string;\n userId: string;\n channel: NotificationChannel;\n type: NotificationType;\n priority: NotificationPriority;\n status: string;\n deliveryStatus?: string;\n title: string;\n message: string;\n htmlMessage?: string;\n subject?: string;\n recipientEmail?: string;\n recipientPhone?: string;\n trackOpens: boolean;\n trackClicks: boolean;\n openedAt?: string;\n clickedAt?: string;\n sentAt?: string;\n deliveredAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NotificationTemplate {\n id: string;\n name: string;\n slug: string;\n description?: string;\n channel: NotificationChannel;\n type: NotificationType;\n locale: string;\n subject?: string;\n bodyTemplate: string;\n htmlTemplate?: string;\n variables: Array<{\n name: string;\n type: string;\n required: boolean;\n defaultValue?: unknown;\n description?: string;\n example?: unknown;\n }>;\n enabled: boolean;\n version: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NotificationStats {\n total: number;\n pending: number;\n queued: number;\n processing: number;\n sent: number;\n delivered: number;\n failed: number;\n byChannel: Record<string, number>;\n byType: Record<string, number>;\n}\n\n// ========================================\n// Tenant Notifications Module\n// ========================================\n\n/**\n * Tenant-Backend Notifications Module\n * Provides access to the centralized notification system\n */\nexport class TenantNotificationsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Send a single notification\n */\n public async send(input: SendNotificationInput): Promise<string> {\n // Validate inputs\n this.validateSendInput(input);\n\n logger.info('[TenantNotifications] Sending notification', {\n channel: input.channel,\n type: input.type || NotificationType.TRANSACTIONAL,\n priority: input.priority || NotificationPriority.MEDIUM,\n });\n\n const mutation = `\n mutation SendNotification($input: SendNotificationInput!) {\n sendNotification(input: $input)\n }\n `;\n\n const variables = {\n input: {\n recipient: input.recipient,\n channel: input.channel,\n type: input.type || NotificationType.TRANSACTIONAL,\n priority: input.priority || NotificationPriority.MEDIUM,\n subject: input.subject,\n body: input.body,\n htmlBody: input.htmlBody,\n data: input.data,\n metadata: input.metadata,\n scheduledFor: input.scheduledFor?.toISOString(),\n expiresAt: input.expiresAt?.toISOString(),\n trackOpens: input.trackOpens,\n trackClicks: input.trackClicks,\n },\n };\n\n const response = await this.client.tenantQuery<{\n sendNotification: string;\n }>(mutation, variables, this.context);\n\n logger.info('[TenantNotifications] Notification sent', {\n notificationId: response.sendNotification,\n });\n\n return response.sendNotification;\n }\n\n /**\n * Send notification using a template\n */\n public async sendWithTemplate(input: SendWithTemplateInput): Promise<string> {\n // Validate inputs\n if (!input.templateSlug || input.templateSlug.trim().length === 0) {\n throw new ValidationError('Template slug is required');\n }\n\n if (!input.variables || Object.keys(input.variables).length === 0) {\n throw new ValidationError('Template variables are required');\n }\n\n if (!input.recipient || (!input.recipient.email && !input.recipient.userId)) {\n throw new ValidationError('Recipient email or userId is required');\n }\n\n logger.info('[TenantNotifications] Sending notification with template', {\n templateSlug: input.templateSlug,\n priority: input.priority || NotificationPriority.MEDIUM,\n });\n\n const mutation = `\n mutation TriggerNotificationWithTemplate($input: TriggerNotificationWithTemplateInput!) {\n triggerNotificationWithTemplate(input: $input) {\n totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\n }\n }\n `;\n\n const variables = {\n input: {\n templateSlug: input.templateSlug,\n variables: input.variables,\n recipient: input.recipient,\n priority: input.priority || NotificationPriority.MEDIUM,\n scheduledFor: input.scheduledFor?.toISOString(),\n expiresAt: input.expiresAt?.toISOString(),\n trackOpens: input.trackOpens,\n trackClicks: input.trackClicks,\n // Platform is required for notification delivery routing\n // If channelId is specified, it takes precedence; otherwise platform determines delivery\n channelId: input.channelId,\n platform: input.platform || NotificationChannel.EMAIL,\n timezone: input.timezone,\n },\n };\n\n const response = await this.client.tenantQuery<{\n triggerNotificationWithTemplate: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const result = response.triggerNotificationWithTemplate;\n const firstNotification = result.notifications[0];\n\n if (result.totalTriggered === 0 || !firstNotification) {\n throw new ValidationError(\n `Notification trigger failed: requested=${result.totalRequested}, triggered=${result.totalTriggered}, failed=${result.totalFailed}`\n );\n }\n\n logger.info('[TenantNotifications] Notification sent with template', {\n notificationId: firstNotification.id,\n status: firstNotification.status,\n totalTriggered: result.totalTriggered,\n totalFailed: result.totalFailed,\n });\n\n return firstNotification.id;\n }\n\n /**\n * Send batch notifications\n */\n public async sendBatch(input: BatchNotificationInput): Promise<{\n totalRequested: number;\n totalQueued: number;\n totalFailed: number;\n batchId: string;\n }> {\n if (!input.notifications || input.notifications.length === 0) {\n throw new ValidationError('At least one notification is required');\n }\n\n logger.info('[TenantNotifications] Sending batch notifications', {\n count: input.notifications.length,\n batchSize: input.batchSize,\n });\n\n const mutation = `\n mutation SendBatchNotifications($input: BatchNotificationInput!) {\n sendBatchNotifications(input: $input) {\n totalRequested\n totalQueued\n totalFailed\n batchId\n }\n }\n `;\n\n const variables = {\n input: {\n notifications: input.notifications.map((n) => ({\n recipient: n.recipient,\n channel: n.channel,\n type: n.type || NotificationType.TRANSACTIONAL,\n priority: n.priority || NotificationPriority.MEDIUM,\n subject: n.subject,\n body: n.body,\n htmlBody: n.htmlBody,\n data: n.data,\n metadata: n.metadata,\n scheduledFor: n.scheduledFor?.toISOString(),\n expiresAt: n.expiresAt?.toISOString(),\n trackOpens: n.trackOpens,\n trackClicks: n.trackClicks,\n })),\n batchSize: input.batchSize,\n delayBetweenBatches: input.delayBetweenBatches,\n priority: input.priority,\n },\n };\n\n const response = await this.client.tenantQuery<{\n sendBatchNotifications: {\n totalRequested: number;\n totalQueued: number;\n totalFailed: number;\n batchId: string;\n };\n }>(mutation, variables, this.context);\n\n logger.info('[TenantNotifications] Batch notifications sent', {\n batchId: response.sendBatchNotifications.batchId,\n queued: response.sendBatchNotifications.totalQueued,\n failed: response.sendBatchNotifications.totalFailed,\n });\n\n return response.sendBatchNotifications;\n }\n\n /**\n * Get a notification by ID\n */\n public async getNotification(id: string): Promise<Notification | null> {\n const query = `\n query GetNotification($id: ID!) {\n notification(id: $id) {\n id\n userId\n channel\n type\n priority\n status\n deliveryStatus\n title\n message\n htmlMessage\n subject\n recipientEmail\n recipientPhone\n trackOpens\n trackClicks\n openedAt\n clickedAt\n sentAt\n deliveredAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notification: Notification | null;\n }>(query, { id }, this.context);\n\n return response.notification;\n }\n\n /**\n * Get notifications with filters\n */\n public async getNotifications(filter?: {\n userId?: string;\n channel?: NotificationChannel;\n type?: NotificationType;\n status?: string;\n priority?: NotificationPriority;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n }): Promise<Notification[]> {\n const query = `\n query GetNotifications($filter: NotificationFilterInput, $limit: Int, $offset: Int) {\n notifications(filter: $filter, limit: $limit, offset: $offset) {\n id\n userId\n channel\n type\n priority\n status\n deliveryStatus\n title\n message\n subject\n recipientEmail\n trackOpens\n trackClicks\n openedAt\n clickedAt\n sentAt\n deliveredAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n filter: filter\n ? {\n userId: filter.userId,\n channel: filter.channel,\n type: filter.type,\n status: filter.status,\n priority: filter.priority,\n startDate: filter.startDate?.toISOString(),\n endDate: filter.endDate?.toISOString(),\n }\n : undefined,\n limit: filter?.limit || 50,\n offset: filter?.offset || 0,\n };\n\n const response = await this.client.tenantQuery<{\n notifications: Notification[];\n }>(query, variables, this.context);\n\n return response.notifications;\n }\n\n /**\n * Get notification template\n */\n public async getTemplate(slug: string, locale?: string): Promise<NotificationTemplate | null> {\n const query = `\n query GetNotificationTemplate($slug: String!, $locale: String) {\n notificationTemplate(slug: $slug, locale: $locale) {\n id\n name\n slug\n description\n channel\n type\n locale\n subject\n bodyTemplate\n htmlTemplate\n variables\n enabled\n version\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notificationTemplate: NotificationTemplate | null;\n }>(query, { slug, locale }, this.context);\n\n return response.notificationTemplate;\n }\n\n /**\n * Get all notification templates\n */\n public async getTemplates(filter?: {\n channel?: NotificationChannel;\n type?: NotificationType;\n enabled?: boolean;\n }): Promise<NotificationTemplate[]> {\n const query = `\n query GetNotificationTemplates($filter: TemplateFilterInput) {\n notificationTemplates(filter: $filter) {\n id\n name\n slug\n description\n channel\n type\n locale\n subject\n bodyTemplate\n htmlTemplate\n variables\n enabled\n version\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.tenantQuery<{\n notificationTemplates: NotificationTemplate[];\n }>(query, { filter }, this.context);\n\n return response.notificationTemplates;\n }\n\n /**\n * Get notification statistics\n */\n public async getStats(filter?: { userId?: string; startDate?: Date; endDate?: Date }): Promise<NotificationStats> {\n const query = `\n query GetNotificationStats($filter: NotificationFilterInput) {\n notificationStats(filter: $filter) {\n total\n pending\n queued\n processing\n sent\n delivered\n failed\n byChannel\n byType\n }\n }\n `;\n\n const variables = {\n filter: filter\n ? {\n userId: filter.userId,\n startDate: filter.startDate?.toISOString(),\n endDate: filter.endDate?.toISOString(),\n }\n : undefined,\n };\n\n const response = await this.client.tenantQuery<{\n notificationStats: NotificationStats;\n }>(query, variables, this.context);\n\n return response.notificationStats;\n }\n\n /**\n * Mark notifications as read\n */\n public async markAsRead(notificationIds: string[]): Promise<boolean> {\n const mutation = `\n mutation MarkNotificationsAsRead($notificationIds: [ID!]!) {\n markNotificationsAsRead(notificationIds: $notificationIds)\n }\n `;\n\n await this.client.tenantQuery(mutation, { notificationIds }, this.context);\n\n logger.info('[TenantNotifications] Notifications marked as read', {\n count: notificationIds.length,\n });\n\n return true;\n }\n\n /**\n * Mark all notifications as read for the current user\n */\n public async markAllAsRead(): Promise<boolean> {\n const mutation = `\n mutation MarkAllMyNotificationsAsRead {\n markAllMyNotificationsAsRead\n }\n `;\n\n await this.client.tenantQuery(mutation, {}, this.context);\n\n logger.info('[TenantNotifications] All notifications marked as read');\n\n return true;\n }\n\n /**\n * Delete notifications\n */\n public async deleteNotifications(notificationIds: string[]): Promise<boolean> {\n const mutation = `\n mutation DeleteNotifications($notificationIds: [ID!]!) {\n deleteNotifications(notificationIds: $notificationIds)\n }\n `;\n\n await this.client.tenantQuery(mutation, { notificationIds }, this.context);\n\n logger.info('[TenantNotifications] Notifications deleted', {\n count: notificationIds.length,\n });\n\n return true;\n }\n\n /**\n * Delete all read notifications for the current user\n */\n public async deleteAllReadNotifications(): Promise<boolean> {\n const mutation = `\n mutation DeleteMyReadNotifications {\n deleteMyReadNotifications\n }\n `;\n\n await this.client.tenantQuery(mutation, {}, this.context);\n\n logger.info('[TenantNotifications] All read notifications deleted');\n\n return true;\n }\n\n /**\n * Validate send notification input\n */\n private validateSendInput(input: SendNotificationInput): void {\n if (!input.recipient || (!input.recipient.email && !input.recipient.userId && !input.recipient.phoneNumber)) {\n throw new ValidationError('Recipient email, userId, or phoneNumber is required');\n }\n\n if (!input.channel) {\n throw new ValidationError('Notification channel is required');\n }\n\n if (!input.body || input.body.trim().length === 0) {\n throw new ValidationError('Notification body is required');\n }\n\n // Channel-specific validation\n if (input.channel === NotificationChannel.EMAIL && !input.recipient.email) {\n throw new ValidationError('Recipient email is required for EMAIL channel');\n }\n\n if (input.channel === NotificationChannel.SMS && !input.recipient.phoneNumber) {\n throw new ValidationError('Recipient phone number is required for SMS channel');\n }\n\n if (input.channel === NotificationChannel.PUSH && !input.recipient.pushToken && !input.recipient.userId) {\n throw new ValidationError('Recipient push token or userId is required for PUSH channel');\n }\n }\n}\n","/**\n * Notifications Module\n * Send in-app, email, SMS, and push notifications via workspaces-backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum NotificationType {\n INFO = 'info',\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\nexport enum NotificationChannel {\n EMAIL = 'EMAIL',\n SMS = 'SMS',\n WHATSAPP = 'WHATSAPP',\n PUSH = 'PUSH',\n SLACK = 'SLACK',\n TEAMS = 'TEAMS',\n WEBHOOK = 'WEBHOOK',\n}\n\n// Re-export from tenant-notifications\nexport { NotificationPriority, TenantNotificationsModule } from './tenant-notifications.js';\n\nexport interface SendNotificationOptions {\n /** Notification title */\n title: string;\n /** Notification message */\n message: string;\n /** Notification type */\n type?: NotificationType;\n /** Target user IDs */\n userIds: string[];\n /** Optional redirect URL */\n redirectUrl?: string;\n /** Application name */\n appName?: string;\n /** Send email notification */\n email?: boolean;\n /** Send SMS notification */\n sms?: boolean;\n}\n\nexport interface NotificationResponse {\n /** Number of successful notifications */\n successCount: number;\n /** Number of failed notifications */\n failureCount: number;\n /** Error messages if any */\n errors: string[];\n /** Created notification IDs */\n notificationIds?: string[];\n}\n\nexport interface GetNotificationsOptions {\n /** User ID to get notifications for */\n userId: string;\n /** Filter by status */\n status?: 'unread' | 'read' | 'all';\n /** Filter by type */\n type?: NotificationType;\n /** Filter by app name */\n appName?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\nexport interface Notification {\n id: string;\n userId: string;\n title: string;\n message: string;\n type: NotificationType;\n status: 'unread' | 'read';\n redirectUrl?: string;\n appName?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface RecipientInput {\n email?: string;\n locale?: string;\n name?: string;\n phoneNumber?: string;\n pushToken?: string;\n slackUserId?: string;\n teamsUserId?: string;\n timezone?: string;\n userId?: string;\n webhookUrl?: string;\n whatsappNumber?: string;\n}\n\nexport interface SendChannelNotificationOptions {\n /** Primary delivery channel (EMAIL, SMS, WHATSAPP, etc.) */\n platform: NotificationChannel;\n /** Recipient information for primary channel */\n recipient: RecipientInput;\n /** Multiple recipients for bulk delivery */\n recipients?: RecipientInput[];\n /** Notification subject (for EMAIL) */\n subject?: string;\n /** Notification body/message */\n body: string;\n /** HTML body (for EMAIL) */\n htmlBody?: string;\n /** Notification type */\n type?: NotificationType;\n /** Application name */\n appName?: string;\n /** Redirect URL */\n redirectUrl?: string;\n /** Also send as in-app notification */\n includeInApp?: boolean;\n /** User IDs for in-app notifications (required when includeInApp is true) */\n userIds?: string[];\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Track email opens */\n trackOpens?: boolean;\n /** Track link clicks */\n trackClicks?: boolean;\n /** Expiration time */\n expiresAt?: Date;\n /** Specific channel instance ID (overrides platform) */\n channelId?: string;\n}\n\nexport interface SendTemplateNotificationOptions {\n /** Primary delivery channel (EMAIL, SMS, WHATSAPP, etc.) */\n platform: NotificationChannel;\n /** Template slug to use */\n templateSlug: string;\n /** Template variables */\n variables: Record<string, unknown>;\n /** Recipient information for primary channel */\n recipient?: RecipientInput;\n /** Multiple recipients for bulk delivery */\n recipients?: RecipientInput[];\n /** Also send as in-app notification */\n includeInApp?: boolean;\n /** User IDs for in-app notifications (required when includeInApp is true) */\n userIds?: string[];\n /** Application name */\n appName?: string;\n /** Track email opens */\n trackOpens?: boolean;\n /** Track link clicks */\n trackClicks?: boolean;\n /** Expiration time */\n expiresAt?: Date;\n /** Scheduled delivery time */\n scheduledFor?: Date;\n /** Timezone for scheduling */\n timezone?: string;\n /** Specific channel instance ID (overrides platform) */\n channelId?: string;\n}\n\n/**\n * Notifications Module\n */\nexport class NotificationsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Send notification to users\n */\n public async send(options: SendNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.title || options.title.trim().length === 0) {\n throw new ValidationError('Notification title is required');\n }\n\n if (!options.message || options.message.trim().length === 0) {\n throw new ValidationError('Notification message is required');\n }\n\n if (!options.userIds || options.userIds.length === 0) {\n throw new ValidationError('At least one user ID is required');\n }\n\n logger.info('[Notifications] Sending notification', {\n title: options.title,\n userCount: options.userIds.length,\n type: options.type || NotificationType.INFO,\n });\n\n const mutation = `\n mutation CreateNotification($input: CreateNotificationInput!) {\n createNotification(input: $input) {\n successCount\n failureCount\n errors\n notifications {\n id\n }\n }\n }\n `;\n\n const variables = {\n input: {\n title: options.title,\n message: options.message,\n type: options.type || NotificationType.INFO,\n userIds: options.userIds,\n redirectUrl: options.redirectUrl || '',\n appName: options.appName,\n email: options.email || false,\n sms: options.sms || false,\n },\n };\n\n const response = await this.client.query<{\n createNotification: NotificationResponse & { notifications: Array<{ id: string }> };\n }>(mutation, variables, this.context);\n\n const result = {\n successCount: response.createNotification.successCount,\n failureCount: response.createNotification.failureCount,\n errors: response.createNotification.errors,\n notificationIds: response.createNotification.notifications.map((n) => n.id),\n };\n\n logger.info('[Notifications] Notification sent', {\n successCount: result.successCount,\n failureCount: result.failureCount,\n });\n\n return result;\n }\n\n /**\n * Send notification to a single user (convenience method)\n */\n public async sendToUser(\n userId: string,\n title: string,\n message: string,\n options?: Omit<SendNotificationOptions, 'userIds' | 'title' | 'message'>\n ): Promise<NotificationResponse> {\n return this.send({\n title,\n message,\n userIds: [userId],\n ...options,\n });\n }\n\n /**\n * Get notifications for a user\n */\n public async getNotifications(options: GetNotificationsOptions): Promise<{\n notifications: Notification[];\n total: number;\n unreadCount: number;\n }> {\n logger.debug('[Notifications] Getting notifications', { userId: options.userId });\n\n const query = `\n query GetNotifications(\n $userId: ID!\n $status: NotificationStatus\n $type: NotificationType\n $appName: String\n $search: String\n $limit: Int\n $offset: Int\n ) {\n getNotifications(\n userId: $userId\n status: $status\n type: $type\n appName: $appName\n search: $search\n limit: $limit\n offset: $offset\n ) {\n notifications {\n id\n userId\n title\n message\n type\n status\n redirectUrl\n appName\n createdAt\n updatedAt\n }\n total\n unreadCount\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n status: options.status,\n type: options.type,\n appName: options.appName,\n search: options.search,\n limit: options.limit || 20,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getNotifications: {\n notifications: Notification[];\n total: number;\n unreadCount: number;\n };\n }>(query, variables, this.context);\n\n return response.getNotifications;\n }\n\n /**\n * Mark notification as read\n */\n public async markAsRead(notificationId: string): Promise<boolean> {\n logger.debug('[Notifications] Marking notification as read', { notificationId });\n\n const mutation = `\n mutation MarkNotificationAsRead($notificationId: ID!) {\n markNotificationAsRead(notificationId: $notificationId) {\n id\n status\n }\n }\n `;\n\n await this.client.query(mutation, { notificationId }, this.context);\n\n logger.info('[Notifications] Notification marked as read', { notificationId });\n\n return true;\n }\n\n /**\n * Mark multiple notifications as read\n */\n public async markMultipleAsRead(notificationIds: string[]): Promise<number> {\n logger.debug('[Notifications] Marking multiple notifications as read', {\n count: notificationIds.length,\n });\n\n const mutation = `\n mutation MarkNotificationsAsRead($notificationIds: [ID!]!) {\n markNotificationsAsRead(notificationIds: $notificationIds) {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n markNotificationsAsRead: { count: number };\n }>(mutation, { notificationIds }, this.context);\n\n logger.info('[Notifications] Notifications marked as read', {\n count: response.markNotificationsAsRead.count,\n });\n\n return response.markNotificationsAsRead.count;\n }\n\n /**\n * Mark all notifications as read for the current user\n */\n public async markAllAsRead(): Promise<number> {\n logger.debug('[Notifications] Marking all notifications as read');\n\n const mutation = `\n mutation MarkAllMyNotificationsAsRead {\n markAllMyNotificationsAsRead {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n markAllMyNotificationsAsRead: { count: number };\n }>(mutation, {}, this.context);\n\n logger.info('[Notifications] All notifications marked as read', {\n count: response.markAllMyNotificationsAsRead.count,\n });\n\n return response.markAllMyNotificationsAsRead.count;\n }\n\n /**\n * Delete notification\n */\n public async deleteNotification(notificationId: string): Promise<boolean> {\n logger.debug('[Notifications] Deleting notification', { notificationId });\n\n const mutation = `\n mutation DeleteNotification($notificationId: ID!) {\n deleteNotification(notificationId: $notificationId) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { notificationId }, this.context);\n\n logger.info('[Notifications] Notification deleted', { notificationId });\n\n return true;\n }\n\n /**\n * Delete multiple notifications\n */\n public async deleteMultiple(notificationIds: string[]): Promise<number> {\n logger.debug('[Notifications] Deleting multiple notifications', {\n count: notificationIds.length,\n });\n\n const mutation = `\n mutation DeleteNotifications($notificationIds: [ID!]!) {\n deleteNotifications(notificationIds: $notificationIds) {\n count\n }\n }\n `;\n\n const response = await this.client.query<{\n deleteNotifications: { count: number };\n }>(mutation, { notificationIds }, this.context);\n\n logger.info('[Notifications] Notifications deleted', {\n count: response.deleteNotifications.count,\n });\n\n return response.deleteNotifications.count;\n }\n\n /**\n * Get unread notification count for a user\n */\n public async getUnreadCount(userId: string): Promise<number> {\n const result = await this.getNotifications({\n userId,\n status: 'unread',\n limit: 0,\n });\n\n return result.unreadCount;\n }\n\n /**\n * Send notification via specific channel (EMAIL, SMS, WHATSAPP, etc.)\n * with optional in-app notification\n */\n public async sendChannelNotification(options: SendChannelNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.body || options.body.trim().length === 0) {\n throw new ValidationError('Notification body is required');\n }\n\n if (!options.recipient && !options.recipients) {\n throw new ValidationError('At least one recipient is required');\n }\n\n if (options.includeInApp && (!options.userIds || options.userIds.length === 0)) {\n throw new ValidationError('User IDs are required when includeInApp is true');\n }\n\n logger.info('[Notifications] Sending channel notification', {\n platform: options.platform,\n recipientCount: options.recipients ? options.recipients.length : 1,\n includeInApp: options.includeInApp,\n inAppUserCount: options.userIds ? options.userIds.length : 0,\n });\n\n const mutation = `\n mutation TriggerNotification($input: TriggerNotificationInput!) {\n triggerNotification(input: $input) {\n id\n status\n deliveryStatus\n }\n }\n `;\n\n const variables = {\n input: {\n platform: options.platform,\n channelId: options.channelId,\n includeInApp: options.includeInApp || false,\n userIds: options.userIds || [],\n notification: {\n subject: options.subject || '',\n body: options.body,\n htmlBody: options.htmlBody || '',\n channel: options.platform,\n type: options.type || NotificationType.INFO,\n recipient: options.recipient,\n appName: options.appName,\n redirectUrl: options.redirectUrl || '',\n metadata: options.metadata || {},\n trackOpens: options.trackOpens || false,\n trackClicks: options.trackClicks || false,\n expiresAt: options.expiresAt?.toISOString(),\n },\n },\n };\n\n // Handle bulk recipients\n if (options.recipients && options.recipients.length > 1) {\n const results = await Promise.allSettled(\n options.recipients.map((recipient) =>\n this.client.query(\n mutation,\n {\n input: {\n ...variables.input,\n notification: {\n ...variables.input.notification,\n recipient,\n },\n },\n },\n this.context\n )\n )\n );\n\n let successCount = 0;\n let failureCount = 0;\n const errors: string[] = [];\n const notificationIds: string[] = [];\n\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n successCount++;\n const response = result.value as { triggerNotification: { id: string } };\n notificationIds.push(response.triggerNotification.id);\n } else {\n failureCount++;\n errors.push(\n `Recipient ${index + 1}: ${result.reason instanceof Error ? result.reason.message : 'Unknown error'}`\n );\n }\n });\n\n const response: NotificationResponse = {\n successCount,\n failureCount,\n errors,\n notificationIds,\n };\n\n logger.info('[Notifications] Channel notification sent (bulk)', {\n successCount,\n failureCount,\n });\n\n return response;\n } else {\n // Single recipient\n try {\n const response = await this.client.query<{\n triggerNotification: { id: string; status: string; deliveryStatus: string };\n }>(mutation, variables, this.context);\n\n const result: NotificationResponse = {\n successCount: 1,\n failureCount: 0,\n errors: [],\n notificationIds: [response.triggerNotification.id],\n };\n\n logger.info('[Notifications] Channel notification sent', {\n notificationId: response.triggerNotification.id,\n status: response.triggerNotification.status,\n });\n\n return result;\n } catch (error) {\n logger.error('[Notifications] Failed to send channel notification', { error });\n\n return {\n successCount: 0,\n failureCount: 1,\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n notificationIds: [],\n };\n }\n }\n }\n\n /**\n * Send notification using a template with optional in-app notification\n */\n public async sendTemplateNotification(options: SendTemplateNotificationOptions): Promise<NotificationResponse> {\n // Validate inputs\n if (!options.templateSlug || options.templateSlug.trim().length === 0) {\n throw new ValidationError('Template slug is required');\n }\n\n if (!options.variables || typeof options.variables !== 'object') {\n throw new ValidationError('Template variables are required');\n }\n\n if (!options.recipient && !options.recipients) {\n throw new ValidationError('At least one recipient is required');\n }\n\n if (options.includeInApp && (!options.userIds || options.userIds.length === 0)) {\n throw new ValidationError('User IDs are required when includeInApp is true');\n }\n\n logger.info('[Notifications] Sending template notification', {\n templateSlug: options.templateSlug,\n platform: options.platform,\n recipientCount: options.recipients ? options.recipients.length : 1,\n includeInApp: options.includeInApp,\n inAppUserCount: options.userIds ? options.userIds.length : 0,\n });\n\n const mutation = `\n mutation TriggerNotificationWithTemplate($input: TriggerNotificationWithTemplateInput!) {\n triggerNotificationWithTemplate(input: $input) {\n totalRequested\n totalTriggered\n totalFailed\n notifications {\n id\n status\n deliveryStatus\n }\n }\n }\n `;\n\n const variables = {\n input: {\n platform: options.platform,\n channelId: options.channelId,\n includeInApp: options.includeInApp || false,\n userIds: options.userIds || [],\n templateSlug: options.templateSlug,\n variables: options.variables,\n recipient: options.recipient,\n recipients: options.recipients,\n trackOpens: options.trackOpens || false,\n trackClicks: options.trackClicks || false,\n expiresAt: options.expiresAt?.toISOString(),\n scheduledFor: options.scheduledFor?.toISOString(),\n timezone: options.timezone,\n },\n };\n\n try {\n const response = await this.client.query<{\n triggerNotificationWithTemplate: {\n totalRequested: number;\n totalTriggered: number;\n totalFailed: number;\n notifications: Array<{ id: string; status: string; deliveryStatus?: string }>;\n };\n }>(mutation, variables, this.context);\n\n const data = response.triggerNotificationWithTemplate;\n\n const result: NotificationResponse = {\n successCount: data.totalTriggered,\n failureCount: data.totalFailed,\n errors: [],\n notificationIds: data.notifications.map((n) => n.id),\n };\n\n logger.info('[Notifications] Template notification sent', {\n templateSlug: options.templateSlug,\n totalTriggered: data.totalTriggered,\n totalFailed: data.totalFailed,\n notificationIds: result.notificationIds,\n });\n\n return result;\n } catch (error) {\n logger.error('[Notifications] Failed to send template notification', { error });\n\n return {\n successCount: 0,\n failureCount: 1,\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n notificationIds: [],\n };\n }\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { RBACModule } from './chunk-BNJFEOGH.js';
2
- import { NotificationsModule, NotificationType } from './chunk-RMDKB5O7.js';
3
- import { ValidationError, QuotaExceededError, PermissionDeniedError } from './chunk-O6RHB2YP.js';
1
+ import { RBACModule } from './chunk-FTDQ6NY5.js';
2
+ import { NotificationsModule, NotificationType } from './chunk-ZHQUXD6S.js';
3
+ import { ValidationError, QuotaExceededError, PermissionDeniedError } from './chunk-SMGTXYFR.js';
4
4
  import { logger } from './chunk-CBZNP6RF.js';
5
5
  import { __name } from './chunk-XE4OXN2W.js';
6
6
 
@@ -1547,5 +1547,5 @@ var TrackerModule = class {
1547
1547
  };
1548
1548
 
1549
1549
  export { ActivityModule, TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, UsageModule, createProductTracker, trackOperation, trackerStub };
1550
- //# sourceMappingURL=chunk-PPIDJP2W.js.map
1551
- //# sourceMappingURL=chunk-PPIDJP2W.js.map
1550
+ //# sourceMappingURL=chunk-ZPEDC5V3.js.map
1551
+ //# sourceMappingURL=chunk-ZPEDC5V3.js.map