@burdenoff/be-sdk 2026.722.2 → 2026.722.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ZMCD5XAK.js → chunk-TORD32GS.js} +64 -29
- package/dist/chunk-TORD32GS.js.map +1 -0
- package/dist/{chunk-TSV4KAZT.js → chunk-VOJROV6C.js} +3 -3
- package/dist/{chunk-TSV4KAZT.js.map → chunk-VOJROV6C.js.map} +1 -1
- package/dist/index.js +4 -4
- package/dist/notifications/index.js +1 -1
- package/dist/tracker/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-ZMCD5XAK.js.map +0 -1
|
@@ -472,6 +472,16 @@ var NotificationChannel2 = /* @__PURE__ */ (function(NotificationChannel3) {
|
|
|
472
472
|
NotificationChannel3["WEBHOOK"] = "WEBHOOK";
|
|
473
473
|
return NotificationChannel3;
|
|
474
474
|
})({});
|
|
475
|
+
function mapNotificationType(type) {
|
|
476
|
+
return type === "warning" || type === "error" ? "ALERT" : "TRANSACTIONAL";
|
|
477
|
+
}
|
|
478
|
+
__name(mapNotificationType, "mapNotificationType");
|
|
479
|
+
function resolveChannel(options) {
|
|
480
|
+
if (options.email) return "EMAIL";
|
|
481
|
+
if (options.sms) return "SMS";
|
|
482
|
+
return "IN_APP";
|
|
483
|
+
}
|
|
484
|
+
__name(resolveChannel, "resolveChannel");
|
|
475
485
|
var NotificationsModule = class {
|
|
476
486
|
static {
|
|
477
487
|
__name(this, "NotificationsModule");
|
|
@@ -501,35 +511,60 @@ var NotificationsModule = class {
|
|
|
501
511
|
type: options.type || "info"
|
|
502
512
|
});
|
|
503
513
|
const mutation = `
|
|
504
|
-
mutation
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
errors
|
|
509
|
-
notifications {
|
|
510
|
-
id
|
|
511
|
-
}
|
|
514
|
+
mutation TriggerNotification($input: TriggerNotificationInput!) {
|
|
515
|
+
triggerNotification(input: $input) {
|
|
516
|
+
id
|
|
517
|
+
status
|
|
512
518
|
}
|
|
513
519
|
}
|
|
514
520
|
`;
|
|
515
|
-
const
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
521
|
+
const channel = resolveChannel(options);
|
|
522
|
+
const notificationIds = [];
|
|
523
|
+
const errors = [];
|
|
524
|
+
const results = await Promise.allSettled(options.userIds.map(async (userId) => {
|
|
525
|
+
const variables = {
|
|
526
|
+
input: {
|
|
527
|
+
notification: {
|
|
528
|
+
recipient: {
|
|
529
|
+
userId
|
|
530
|
+
},
|
|
531
|
+
channel,
|
|
532
|
+
type: mapNotificationType(options.type),
|
|
533
|
+
subject: options.title,
|
|
534
|
+
body: options.message,
|
|
535
|
+
...options.redirectUrl ? {
|
|
536
|
+
redirectUrl: options.redirectUrl
|
|
537
|
+
} : {},
|
|
538
|
+
...options.appName ? {
|
|
539
|
+
appName: options.appName
|
|
540
|
+
} : {}
|
|
541
|
+
},
|
|
542
|
+
platform: channel,
|
|
543
|
+
// Always leave an in-app trace when the primary channel is external, so the
|
|
544
|
+
// notification is visible in the product even if email/SMS delivery fails.
|
|
545
|
+
includeInApp: channel !== "IN_APP"
|
|
546
|
+
}
|
|
547
|
+
};
|
|
548
|
+
const response = await this.client.tenantQuery(mutation, variables, this.context);
|
|
549
|
+
const id = response.triggerNotification?.id;
|
|
550
|
+
if (!id) {
|
|
551
|
+
throw new Error(`notification service returned no id for user ${userId}`);
|
|
525
552
|
}
|
|
526
|
-
|
|
527
|
-
|
|
553
|
+
return id;
|
|
554
|
+
}));
|
|
555
|
+
for (const [index, settled] of results.entries()) {
|
|
556
|
+
if (settled.status === "fulfilled") {
|
|
557
|
+
notificationIds.push(settled.value);
|
|
558
|
+
} else {
|
|
559
|
+
const reason = settled.reason instanceof Error ? settled.reason.message : String(settled.reason);
|
|
560
|
+
errors.push(`${options.userIds[index] ?? "unknown user"}: ${reason}`);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
528
563
|
const result = {
|
|
529
|
-
successCount:
|
|
530
|
-
failureCount:
|
|
531
|
-
errors
|
|
532
|
-
notificationIds
|
|
564
|
+
successCount: notificationIds.length,
|
|
565
|
+
failureCount: errors.length,
|
|
566
|
+
errors,
|
|
567
|
+
notificationIds
|
|
533
568
|
};
|
|
534
569
|
logger.info("[Notifications] Notification sent", {
|
|
535
570
|
successCount: result.successCount,
|
|
@@ -620,7 +655,7 @@ var NotificationsModule = class {
|
|
|
620
655
|
}
|
|
621
656
|
}
|
|
622
657
|
`;
|
|
623
|
-
await this.client.
|
|
658
|
+
await this.client.tenantQuery(mutation, {
|
|
624
659
|
notificationId
|
|
625
660
|
}, this.context);
|
|
626
661
|
logger.info("[Notifications] Notification marked as read", {
|
|
@@ -682,7 +717,7 @@ var NotificationsModule = class {
|
|
|
682
717
|
}
|
|
683
718
|
}
|
|
684
719
|
`;
|
|
685
|
-
await this.client.
|
|
720
|
+
await this.client.tenantQuery(mutation, {
|
|
686
721
|
notificationId
|
|
687
722
|
}, this.context);
|
|
688
723
|
logger.info("[Notifications] Notification deleted", {
|
|
@@ -775,7 +810,7 @@ var NotificationsModule = class {
|
|
|
775
810
|
}
|
|
776
811
|
};
|
|
777
812
|
if (options.recipients && options.recipients.length > 1) {
|
|
778
|
-
const results = await Promise.allSettled(options.recipients.map((recipient) => this.client.
|
|
813
|
+
const results = await Promise.allSettled(options.recipients.map((recipient) => this.client.tenantQuery(mutation, {
|
|
779
814
|
input: {
|
|
780
815
|
...variables.input,
|
|
781
816
|
notification: {
|
|
@@ -927,5 +962,5 @@ var NotificationsModule = class {
|
|
|
927
962
|
};
|
|
928
963
|
|
|
929
964
|
export { NotificationChannel2 as NotificationChannel, NotificationPriority, NotificationType2 as NotificationType, NotificationsModule, TenantNotificationsModule, tenant_notifications_exports };
|
|
930
|
-
//# sourceMappingURL=chunk-
|
|
931
|
-
//# sourceMappingURL=chunk-
|
|
965
|
+
//# sourceMappingURL=chunk-TORD32GS.js.map
|
|
966
|
+
//# sourceMappingURL=chunk-TORD32GS.js.map
|
|
@@ -0,0 +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","mapNotificationType","resolveChannel","options","sms","NotificationsModule","title","message","userIds","userCount","errors","results","Promise","allSettled","redirectUrl","appName","includeInApp","triggerNotification","Error","index","settled","entries","push","value","reason","String","successCount","failureCount","sendToUser","debug","search","markMultipleAsRead","markNotificationsAsRead","markAllMyNotificationsAsRead","deleteNotification","deleteMultiple","getUnreadCount","unreadCount","sendChannelNotification","recipients","recipientCount","inAppUserCount","forEach","error","sendTemplateNotification"],"mappings":"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","file":"chunk-TORD32GS.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 * Map the SDK's severity-flavoured `NotificationType` (info/success/warning/error) onto\n * global-notification-svc's delivery-intent `NotificationType`\n * (ALERT | MARKETING | SYSTEM | TRANSACTIONAL).\n *\n * The two enums describe different things and share no values, so an unmapped value would be\n * rejected by the owner. Warnings and errors are alerts; everything else is transactional.\n */\nfunction mapNotificationType(type?: NotificationType): 'ALERT' | 'TRANSACTIONAL' {\n return type === NotificationType.WARNING || type === NotificationType.ERROR ? 'ALERT' : 'TRANSACTIONAL';\n}\n\n/**\n * Choose the delivery channel required by `CreateNotificationInput.channel` (non-nullable).\n *\n * `SendNotificationOptions` expresses channel intent as the legacy `email`/`sms` booleans; the\n * owner expects a single `NotificationChannel`. In-app is the default so a caller that sets\n * neither flag still gets a delivered, visible notification.\n */\nfunction resolveChannel(options: SendNotificationOptions): 'EMAIL' | 'SMS' | 'IN_APP' {\n if (options.email) return 'EMAIL';\n if (options.sms) return 'SMS';\n return 'IN_APP';\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 // `triggerNotification` both creates AND delivers. `createNotification` only persists —\n // its own schema doc says \"without triggering - use triggerNotification to send\" — so sending\n // through it would silently never deliver.\n const mutation = `\n mutation TriggerNotification($input: TriggerNotificationInput!) {\n triggerNotification(input: $input) {\n id\n status\n }\n }\n `;\n\n // global-notification-svc addresses ONE recipient per notification, so a multi-user send fans\n // out into one mutation per user rather than passing a `userIds` array (which the input does\n // not have). Failures are collected per recipient instead of rejecting the whole batch.\n const channel = resolveChannel(options);\n const notificationIds: string[] = [];\n const errors: string[] = [];\n\n const results = await Promise.allSettled(\n options.userIds.map(async (userId) => {\n const variables = {\n input: {\n notification: {\n recipient: { userId },\n channel,\n type: mapNotificationType(options.type),\n subject: options.title,\n body: options.message,\n ...(options.redirectUrl ? { redirectUrl: options.redirectUrl } : {}),\n ...(options.appName ? { appName: options.appName } : {}),\n },\n platform: channel,\n // Always leave an in-app trace when the primary channel is external, so the\n // notification is visible in the product even if email/SMS delivery fails.\n includeInApp: channel !== 'IN_APP',\n },\n };\n\n const response = await this.client.tenantQuery<{\n triggerNotification: { id: string; status?: string };\n }>(mutation, variables, this.context);\n\n const id = response.triggerNotification?.id;\n if (!id) {\n throw new Error(`notification service returned no id for user ${userId}`);\n }\n return id;\n })\n );\n\n for (const [index, settled] of results.entries()) {\n if (settled.status === 'fulfilled') {\n notificationIds.push(settled.value);\n } else {\n const reason = settled.reason instanceof Error ? settled.reason.message : String(settled.reason);\n errors.push(`${options.userIds[index] ?? 'unknown user'}: ${reason}`);\n }\n }\n\n const result: NotificationResponse = {\n successCount: notificationIds.length,\n failureCount: errors.length,\n errors,\n notificationIds,\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.tenantQuery(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.tenantQuery(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.tenantQuery(\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,5 +1,5 @@
|
|
|
1
1
|
import { RBACModule } from './chunk-S32JOMMW.js';
|
|
2
|
-
import { NotificationsModule, NotificationType } from './chunk-
|
|
2
|
+
import { NotificationsModule, NotificationType } from './chunk-TORD32GS.js';
|
|
3
3
|
import { ValidationError, QuotaExceededError, PermissionDeniedError } from './chunk-QGBXVNRM.js';
|
|
4
4
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
5
5
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
@@ -1617,5 +1617,5 @@ var TrackerModule = class {
|
|
|
1617
1617
|
};
|
|
1618
1618
|
|
|
1619
1619
|
export { ActivityModule, TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, UsageModule, createProductTracker, trackOperation, trackerStub };
|
|
1620
|
-
//# sourceMappingURL=chunk-
|
|
1621
|
-
//# sourceMappingURL=chunk-
|
|
1620
|
+
//# sourceMappingURL=chunk-VOJROV6C.js.map
|
|
1621
|
+
//# sourceMappingURL=chunk-VOJROV6C.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/activity/index.ts","../src/usage/index.ts","../src/tracker/stub.ts","../src/tracker/index.ts"],"names":["ActivityType","ActivityStatus","ActivitySeverity","ActivityModule","client","context","log","options","userId","ValidationError","activityType","resourceType","action","status","logger","debug","recordActivityMutation","legacyLogActivityMutation","variables","input","resourceId","workspaceId","organizationId","projectId","ipAddress","userAgent","metadata","severity","errorMessage","duration","response","query","info","activityId","recordActivity","id","error","message","Error","String","isRecordActivityUnavailable","includes","warn","reason","legacyResponse","logActivity","logSuccess","inferActivityType","logFailure","getActivities","startDate","endDate","search","limit","offset","sortBy","sortOrder","getActivity","getStats","getActivityStats","cleanup","olderThanDays","mutation","deletedCount","cleanupActivities","actionLower","toLowerCase","exportToCSV","exportActivities","csvData","UsageMetricType","UsageModule","track","entityId","entityType","metricType","amount","recordId","trackUsage","checkQuota","requestedAmount","allowed","requireQuota","result","QuotaExceededError","currentUsage","quotaLimit","resetAt","trackAndCheck","quotaCheck","usage","getUsage","getSummary","period","getUsageSummary","setQuota","quotaId","getQuota","getQuotas","resetQuota","deleteQuota","trackBulk","records","count","length","trackUsageBulk","_gatewayUrl","_gatewayLayer","_gatewayUrlResolved","getGatewayUrl","wspaceUrl","process","env","globalUrl","undefined","getGatewayLayer","LOG_ACTIVITY_MUTATION","deriveResource","explicit","activityOptions","trim","op","operationName","head","split","buildActivityInput","layer","actOpts","description","success","resource","actorId","tenantId","targetUserId","teamId","productId","fireActivityLog","gatewayUrl","key","Object","keys","headers","fetch","method","body","JSON","stringify","signal","AbortSignal","timeout","ok","json","catch","errors","detail","map","e","join","slice","err","UnifiedTrackerStub","instance","getInstance","event","eventType","enabled","trackBatch","events","trackerStub","trackOperation","activityEnabled","createProductTracker","billingAccountId","defaultContext","additionalOptions","freeUp","trackActivityOnly","usageOptions","trackUsageOnly","trackCustom","UNIFIED_TRACKER_CONSTANTS","DEFAULT_PRODUCT_ID","OPERATIONS","PRODUCTS","TrackerModule","rbac","activity","notifications","RBACModule","NotificationsModule","startTime","Date","now","permissionGranted","validateOptions","checkPermission","logFailedActivity","quotaAvailable","logSuccessActivity","notification","onSuccess","sendSuccessNotification","PermissionDeniedError","type","details","onFailure","sendFailureNotification","trackOrThrow","errorDetails","trackSimple","permissionOptions","permissionAction","hasPermission","quotaRemaining","remainingQuota","trackOptions","usageRecord","usageRecordId","activityRecord","SUCCESS","LOW","FAILURE","HIGH","userIds","additionalUserIds","send","title","NotificationType","notificationIds","ERROR","CREATE","UPDATE","DELETE","READ","LOGIN","LOGOUT","EXPORT","IMPORT","SHARE","DOWNLOAD","UPLOAD","CUSTOM","operations","results","Promise","all","total","successful","filter","r","failed"],"mappings":"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","file":"chunk-TSV4KAZT.js","sourcesContent":["/**\n * Activity Tracking Module\n * Comprehensive audit trail and activity logging for all operations\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 ActivityType {\n CREATE = 'create',\n READ = 'read',\n UPDATE = 'update',\n DELETE = 'delete',\n LOGIN = 'login',\n LOGOUT = 'logout',\n EXPORT = 'export',\n IMPORT = 'import',\n SHARE = 'share',\n DOWNLOAD = 'download',\n UPLOAD = 'upload',\n EXECUTE = 'execute',\n APPROVE = 'approve',\n REJECT = 'reject',\n CUSTOM = 'custom',\n}\n\nexport enum ActivityStatus {\n SUCCESS = 'success',\n FAILURE = 'failure',\n PENDING = 'pending',\n WARNING = 'warning',\n}\n\nexport enum ActivitySeverity {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface LogActivityOptions {\n /** User performing the action */\n userId: string;\n /** Type of activity */\n activityType: ActivityType;\n /** Resource type being acted upon */\n resourceType: string;\n /** Resource ID */\n resourceId?: string;\n /** Action performed */\n action: string;\n /** Activity status */\n status: ActivityStatus;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Severity level */\n severity?: ActivitySeverity;\n /** Error message if failed */\n errorMessage?: string;\n /** Duration in milliseconds */\n duration?: number;\n}\n\nexport interface Activity {\n id: string;\n userId: string;\n activityType: ActivityType;\n resourceType: string;\n resourceId?: string;\n action: string;\n status: ActivityStatus;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n ipAddress?: string;\n userAgent?: string;\n metadata?: Record<string, unknown>;\n severity: ActivitySeverity;\n errorMessage?: string;\n duration?: number;\n createdAt: string;\n}\n\nexport interface GetActivitiesOptions {\n /** Filter by user */\n userId?: string;\n /** Filter by workspace */\n workspaceId?: string;\n /** Filter by organization */\n organizationId?: string;\n /** Filter by project */\n projectId?: string;\n /** Filter by activity type */\n activityType?: ActivityType;\n /** Filter by resource type */\n resourceType?: string;\n /** Filter by resource ID */\n resourceId?: string;\n /** Filter by status */\n status?: ActivityStatus;\n /** Filter by severity */\n severity?: ActivitySeverity;\n /** Filter by date range */\n startDate?: string;\n endDate?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Sort by field */\n sortBy?: 'createdAt' | 'duration' | 'severity';\n /** Sort order */\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface ActivityStats {\n totalActivities: number;\n successCount: number;\n failureCount: number;\n pendingCount: number;\n warningCount: number;\n averageDuration?: number;\n activitiesByType: Record<string, number>;\n activitiesBySeverity: Record<string, number>;\n topUsers: Array<{ userId: string; count: number }>;\n topResources: Array<{ resourceType: string; count: number }>;\n}\n\n/**\n * Activity Tracking Module\n */\nexport class ActivityModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Log activity\n */\n public async log(options: LogActivityOptions): Promise<Activity> {\n // Validate required fields\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.activityType) {\n throw new ValidationError('Activity type is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.status) {\n throw new ValidationError('Status is required');\n }\n\n logger.debug('[Activity] Logging activity', {\n userId: options.userId,\n action: options.action,\n resourceType: options.resourceType,\n });\n\n const recordActivityMutation = `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const legacyLogActivityMutation = `\n mutation LogActivity($input: LogActivityInput!) {\n logActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const variables = {\n input: {\n userId: options.userId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: options.status,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.ipAddress,\n userAgent: options.userAgent,\n metadata: options.metadata,\n severity: options.severity || ActivitySeverity.LOW,\n errorMessage: options.errorMessage,\n duration: options.duration,\n },\n };\n\n try {\n const response = await this.client.query<{ recordActivity: Activity }>(\n recordActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged', { activityId: response.recordActivity.id });\n return response.recordActivity;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isRecordActivityUnavailable =\n message.includes('Cannot query field \"recordActivity\"') ||\n message.includes('Unknown type \"RecordActivityInput\"');\n\n if (!isRecordActivityUnavailable) {\n throw error;\n }\n\n logger.warn('[Activity] Falling back to legacy logActivity mutation', {\n reason: message,\n });\n\n const legacyResponse = await this.client.query<{ logActivity: Activity }>(\n legacyLogActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged (legacy)', { activityId: legacyResponse.logActivity.id });\n return legacyResponse.logActivity;\n }\n }\n\n /**\n * Log activity with automatic status detection\n */\n public async logSuccess(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.SUCCESS,\n severity: ActivitySeverity.LOW,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Log failed activity\n */\n public async logFailure(\n userId: string,\n action: string,\n resourceType: string,\n errorMessage: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.FAILURE,\n severity: ActivitySeverity.HIGH,\n errorMessage,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Get activities with filters\n */\n public async getActivities(options: GetActivitiesOptions): Promise<{\n activities: Activity[];\n total: number;\n }> {\n logger.debug('[Activity] Getting activities', options);\n\n const query = `\n query GetActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $resourceId: ID\n $status: ActivityStatus\n $severity: ActivitySeverity\n $startDate: DateTime\n $endDate: DateTime\n $search: String\n $limit: Int\n $offset: Int\n $sortBy: String\n $sortOrder: String\n ) {\n getActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n resourceId: $resourceId\n status: $status\n severity: $severity\n startDate: $startDate\n endDate: $endDate\n search: $search\n limit: $limit\n offset: $offset\n sortBy: $sortBy\n sortOrder: $sortOrder\n ) {\n activities {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n total\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n status: options.status,\n severity: options.severity,\n startDate: options.startDate,\n endDate: options.endDate,\n search: options.search,\n limit: options.limit || 50,\n offset: options.offset || 0,\n sortBy: options.sortBy || 'createdAt',\n sortOrder: options.sortOrder || 'desc',\n };\n\n const response = await this.client.query<{\n getActivities: { activities: Activity[]; total: number };\n }>(query, variables, this.context);\n\n return response.getActivities;\n }\n\n /**\n * Get activity by ID\n */\n public async getActivity(activityId: string): Promise<Activity> {\n logger.debug('[Activity] Getting activity', { activityId });\n\n const query = `\n query GetActivity($activityId: ID!) {\n getActivity(activityId: $activityId) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getActivity: Activity }>(query, { activityId }, this.context);\n\n return response.getActivity;\n }\n\n /**\n * Get activity statistics\n */\n public async getStats(options: Omit<GetActivitiesOptions, 'limit' | 'offset'>): Promise<ActivityStats> {\n logger.debug('[Activity] Getting activity stats', options);\n\n const query = `\n query GetActivityStats(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $startDate: DateTime\n $endDate: DateTime\n ) {\n getActivityStats(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n startDate: $startDate\n endDate: $endDate\n ) {\n totalActivities\n successCount\n failureCount\n pendingCount\n warningCount\n averageDuration\n activitiesByType\n activitiesBySeverity\n topUsers {\n userId\n count\n }\n topResources {\n resourceType\n count\n }\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n startDate: options.startDate,\n endDate: options.endDate,\n };\n\n const response = await this.client.query<{ getActivityStats: ActivityStats }>(query, variables, this.context);\n\n return response.getActivityStats;\n }\n\n /**\n * Delete old activities (cleanup)\n */\n public async cleanup(olderThanDays: number, workspaceId?: string): Promise<number> {\n logger.debug('[Activity] Cleaning up old activities', { olderThanDays, workspaceId });\n\n const mutation = `\n mutation CleanupActivities($olderThanDays: Int!, $workspaceId: ID) {\n cleanupActivities(olderThanDays: $olderThanDays, workspaceId: $workspaceId) {\n deletedCount\n }\n }\n `;\n\n const response = await this.client.query<{\n cleanupActivities: { deletedCount: number };\n }>(mutation, { olderThanDays, workspaceId }, this.context);\n\n logger.info('[Activity] Cleanup completed', {\n deletedCount: response.cleanupActivities.deletedCount,\n });\n\n return response.cleanupActivities.deletedCount;\n }\n\n /**\n * Infer activity type from action string\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) {\n return ActivityType.CREATE;\n }\n if (actionLower.includes('update') || actionLower.includes('edit') || actionLower.includes('modify')) {\n return ActivityType.UPDATE;\n }\n if (actionLower.includes('delete') || actionLower.includes('remove')) {\n return ActivityType.DELETE;\n }\n if (actionLower.includes('read') || actionLower.includes('view') || actionLower.includes('get')) {\n return ActivityType.READ;\n }\n if (actionLower.includes('login') || actionLower.includes('signin')) {\n return ActivityType.LOGIN;\n }\n if (actionLower.includes('logout') || actionLower.includes('signout')) {\n return ActivityType.LOGOUT;\n }\n if (actionLower.includes('export')) {\n return ActivityType.EXPORT;\n }\n if (actionLower.includes('import')) {\n return ActivityType.IMPORT;\n }\n if (actionLower.includes('share')) {\n return ActivityType.SHARE;\n }\n if (actionLower.includes('download')) {\n return ActivityType.DOWNLOAD;\n }\n if (actionLower.includes('upload')) {\n return ActivityType.UPLOAD;\n }\n if (actionLower.includes('execute') || actionLower.includes('run')) {\n return ActivityType.EXECUTE;\n }\n if (actionLower.includes('approve')) {\n return ActivityType.APPROVE;\n }\n if (actionLower.includes('reject')) {\n return ActivityType.REJECT;\n }\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Export activities to CSV\n */\n public async exportToCSV(options: GetActivitiesOptions): Promise<string> {\n logger.debug('[Activity] Exporting activities to CSV');\n\n const query = `\n query ExportActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $startDate: DateTime\n $endDate: DateTime\n ) {\n exportActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n startDate: $startDate\n endDate: $endDate\n ) {\n csvData\n }\n }\n `;\n\n const response = await this.client.query<{ exportActivities: { csvData: string } }>(\n query,\n {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n startDate: options.startDate,\n endDate: options.endDate,\n },\n this.context\n );\n\n logger.info('[Activity] Activities exported to CSV');\n\n return response.exportActivities.csvData;\n }\n}\n","/**\n * Usage & Quota Module\n * Track resource usage, enforce quotas, and manage billing\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError, QuotaExceededError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum UsageMetricType {\n API_CALLS = 'api_calls',\n STORAGE = 'storage',\n BANDWIDTH = 'bandwidth',\n USERS = 'users',\n PROJECTS = 'projects',\n WORKSPACES = 'workspaces',\n RECORDS = 'records',\n COMPUTE_TIME = 'compute_time',\n TRANSACTIONS = 'transactions',\n CUSTOM = 'custom',\n}\n\nexport enum QuotaPeriod {\n DAILY = 'daily',\n WEEKLY = 'weekly',\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n LIFETIME = 'lifetime',\n}\n\n/**\n * Entity type for usage tracking\n */\nexport type UsageEntityType = 'user' | 'workspace' | 'organization';\n\nexport interface TrackUsageOptions {\n /** User or workspace consuming the resource */\n entityId: string;\n /** Type of entity (user or workspace) */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to increment */\n amount: number;\n /** Optional resource identifier */\n resourceId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface CheckQuotaOptions {\n /** Entity to check quota for */\n entityId: string;\n /** Type of entity */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to check availability for */\n requestedAmount: number;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface QuotaCheckResult {\n allowed: boolean;\n currentUsage: number;\n quotaLimit: number;\n remainingQuota: number;\n resetAt?: string;\n period: QuotaPeriod;\n reason?: string;\n}\n\nexport interface UsageRecord {\n id: string;\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n amount: number;\n resourceId?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n recordedAt: string;\n}\n\nexport interface UsageSummary {\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n totalUsage: number;\n period: QuotaPeriod;\n periodStart: string;\n periodEnd: string;\n quotaLimit?: number;\n utilizationPercentage?: number;\n}\n\nexport interface SetQuotaOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n workspaceId?: string;\n organizationId?: string;\n}\n\nexport interface Quota {\n id: string;\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n currentUsage: number;\n resetAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface GetUsageOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType?: UsageMetricType;\n startDate?: string;\n endDate?: string;\n workspaceId?: string;\n organizationId?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Usage & Quota Module\n */\nexport class UsageModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Track usage\n */\n public async track(options: TrackUsageOptions): Promise<UsageRecord> {\n // Validate inputs\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.entityType) {\n throw new ValidationError('Entity type is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.amount !== 'number' || options.amount <= 0) {\n throw new ValidationError('Amount must be a positive number');\n }\n\n logger.debug('[Usage] Tracking usage', {\n entityId: options.entityId,\n metricType: options.metricType,\n amount: options.amount,\n });\n\n const mutation = `\n mutation TrackUsage($input: TrackUsageInput!) {\n trackUsage(input: $input) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n amount: options.amount,\n resourceId: options.resourceId,\n metadata: options.metadata,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ trackUsage: UsageRecord }>(mutation, variables, this.context);\n\n logger.info('[Usage] Usage tracked', { recordId: response.trackUsage.id });\n\n return response.trackUsage;\n }\n\n /**\n * Check quota availability\n */\n public async checkQuota(options: CheckQuotaOptions): Promise<QuotaCheckResult> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.requestedAmount !== 'number' || options.requestedAmount <= 0) {\n throw new ValidationError('Requested amount must be a positive number');\n }\n\n logger.debug('[Usage] Checking quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n });\n\n const query = `\n query CheckQuota($input: CheckQuotaInput!) {\n checkQuota(input: $input) {\n allowed\n currentUsage\n quotaLimit\n remainingQuota\n resetAt\n period\n reason\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ checkQuota: QuotaCheckResult }>(query, variables, this.context);\n\n logger.debug('[Usage] Quota check result', { allowed: response.checkQuota.allowed });\n\n return response.checkQuota;\n }\n\n /**\n * Require quota (throws if exceeded)\n */\n public async requireQuota(options: CheckQuotaOptions): Promise<void> {\n const result = await this.checkQuota(options);\n\n if (!result.allowed) {\n throw new QuotaExceededError(result.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: result.currentUsage,\n quotaLimit: result.quotaLimit,\n requestedAmount: options.requestedAmount,\n resetAt: result.resetAt,\n });\n }\n }\n\n /**\n * Track usage and check quota atomically\n */\n public async trackAndCheck(options: TrackUsageOptions): Promise<{\n usage: UsageRecord;\n quotaCheck: QuotaCheckResult;\n }> {\n // First check quota\n const quotaCheck = await this.checkQuota({\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.amount,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n if (!quotaCheck.allowed) {\n throw new QuotaExceededError(quotaCheck.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n });\n }\n\n // Track usage\n const usage = await this.track(options);\n\n return { usage, quotaCheck };\n }\n\n /**\n * Get usage records\n */\n public async getUsage(options: GetUsageOptions): Promise<{\n records: UsageRecord[];\n total: number;\n }> {\n logger.debug('[Usage] Getting usage records', { entityId: options.entityId });\n\n const query = `\n query GetUsage(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType\n $startDate: DateTime\n $endDate: DateTime\n $workspaceId: ID\n $organizationId: ID\n $limit: Int\n $offset: Int\n ) {\n getUsage(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n startDate: $startDate\n endDate: $endDate\n workspaceId: $workspaceId\n organizationId: $organizationId\n limit: $limit\n offset: $offset\n ) {\n records {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n total\n }\n }\n `;\n\n const variables = {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n startDate: options.startDate,\n endDate: options.endDate,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n limit: options.limit || 100,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getUsage: { records: UsageRecord[]; total: number };\n }>(query, variables, this.context);\n\n return response.getUsage;\n }\n\n /**\n * Get usage summary\n */\n public async getSummary(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType,\n period: QuotaPeriod\n ): Promise<UsageSummary> {\n logger.debug('[Usage] Getting usage summary', { entityId, metricType, period });\n\n const query = `\n query GetUsageSummary(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType!\n $period: QuotaPeriod!\n ) {\n getUsageSummary(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n period: $period\n ) {\n entityId\n entityType\n metricType\n totalUsage\n period\n periodStart\n periodEnd\n quotaLimit\n utilizationPercentage\n }\n }\n `;\n\n const response = await this.client.query<{ getUsageSummary: UsageSummary }>(\n query,\n { entityId, entityType, metricType, period },\n this.context\n );\n\n return response.getUsageSummary;\n }\n\n /**\n * Set quota limit\n */\n public async setQuota(options: SetQuotaOptions): Promise<Quota> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.limit !== 'number' || options.limit < 0) {\n throw new ValidationError('Limit must be a non-negative number');\n }\n\n logger.debug('[Usage] Setting quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n limit: options.limit,\n });\n\n const mutation = `\n mutation SetQuota($input: SetQuotaInput!) {\n setQuota(input: $input) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n limit: options.limit,\n period: options.period,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ setQuota: Quota }>(mutation, variables, this.context);\n\n logger.info('[Usage] Quota set', { quotaId: response.setQuota.id });\n\n return response.setQuota;\n }\n\n /**\n * Get quota\n */\n public async getQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<Quota | null> {\n logger.debug('[Usage] Getting quota', { entityId, metricType });\n\n const query = `\n query GetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n getQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuota: Quota | null }>(\n query,\n { entityId, entityType, metricType },\n this.context\n );\n\n return response.getQuota;\n }\n\n /**\n * Get all quotas for entity\n */\n public async getQuotas(entityId: string, entityType: UsageEntityType): Promise<Quota[]> {\n logger.debug('[Usage] Getting all quotas', { entityId, entityType });\n\n const query = `\n query GetQuotas($entityId: ID!, $entityType: String!) {\n getQuotas(entityId: $entityId, entityType: $entityType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuotas: Quota[] }>(query, { entityId, entityType }, this.context);\n\n return response.getQuotas;\n }\n\n /**\n * Reset quota usage\n */\n public async resetQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Resetting quota', { entityId, metricType });\n\n const mutation = `\n mutation ResetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n resetQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota reset', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Delete quota\n */\n public async deleteQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Deleting quota', { entityId, metricType });\n\n const mutation = `\n mutation DeleteQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n deleteQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota deleted', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Bulk track usage\n */\n public async trackBulk(records: TrackUsageOptions[]): Promise<UsageRecord[]> {\n logger.debug('[Usage] Bulk tracking usage', { count: records.length });\n\n const mutation = `\n mutation TrackUsageBulk($records: [TrackUsageInput!]!) {\n trackUsageBulk(records: $records) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const response = await this.client.query<{ trackUsageBulk: UsageRecord[] }>(mutation, { records }, this.context);\n\n logger.info('[Usage] Bulk usage tracked', { count: response.trackUsageBulk.length });\n\n return response.trackUsageBulk;\n }\n}\n","/**\n * Unified Tracking — Auto-Promoting Implementation\n *\n * Automatically promotes from stub to real tracking when gateway URLs are configured.\n * When WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL is set, this module will:\n * - Log activity events via GraphQL to the activity service\n * - Track usage via GraphQL to the usage service (if usage options provided)\n * - RBAC checks are NOT performed here (handled by gateway @rbac directives)\n *\n * When no gateway URL is configured, falls back to debug-level logging (stub mode).\n *\n * This is a backward-compatible drop-in replacement for the original stub. All 1,100+\n * existing call sites continue to work without modification.\n *\n * @module tracker/stub\n * @category Tracking\n */\nimport { logger } from '../logger/index.js';\n\n/**\n * Tracking event interface\n */\nexport interface TrackingEvent {\n eventType: string;\n entityType: string;\n entityId: string;\n userId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n timestamp?: Date;\n}\n\n/**\n * RBAC check options\n */\nexport interface RbacCheckOptions {\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n skipRbacCheck?: boolean;\n options?: {\n allowOwnerAccess?: boolean;\n allowWorkspaceAdmin?: boolean;\n scope?: string;\n };\n}\n\n/**\n * Usage tracking options\n */\nexport interface UsageTrackingOptions {\n billingAccountId?: string;\n addUsage?: boolean;\n description?: string;\n tags?: Record<string, unknown>;\n quotaName?: string;\n value?: number;\n}\n\n/**\n * Activity tracking options\n */\nexport interface ActivityTrackingOptions {\n activityType?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n teamId?: string;\n groupId?: string;\n projectId?: string;\n targetUserId?: string;\n resourceType?: string;\n resourceId?: string;\n enabled?: boolean;\n}\n\n/**\n * Unified tracking options\n */\nexport interface UnifiedTrackingOptions {\n operationName?: string;\n userId?: string;\n context?: unknown;\n rbacCheck?: RbacCheckOptions;\n activityOptions?: ActivityTrackingOptions;\n usageOptions?: UsageTrackingOptions & { enabled?: boolean };\n success?: boolean;\n errorMessage?: string;\n productId?: string;\n // Legacy properties for backward compatibility (can be at top level or in nested objects)\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n tenantId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Gateway URL resolution — cached at module level for performance\n// ---------------------------------------------------------------------------\n\nlet _gatewayUrl: string | undefined;\nlet _gatewayLayer: ActivityLayer | undefined;\nlet _gatewayUrlResolved = false;\n\n/**\n * Which activity subgraph the resolved gateway fronts.\n *\n * The two canonical activity owners accept DIFFERENT `RecordActivityInput` shapes, so the\n * payload must be built per layer:\n * - `wspace` → wspace-activity-svc: requires `action`; carries workspace-scoped fields\n * (workspaceId/teamId/targetUserId/productId/success).\n * - `global` → global-activity-svc: requires `action` AND `resource`; carries tenant-scoped\n * fields (tenantId/actorId/ipAddress/userAgent).\n * Sending one layer's shape to the other fails GraphQL validation.\n */\nexport type ActivityLayer = 'wspace' | 'global';\n\n/**\n * Resolve the internal gateway URL from environment.\n * Workspace services use WSPACE_INT_GATEWAY_URL, global services use GLOBAL_INT_GATEWAY_URL.\n * Falls back to undefined (stub mode) if neither is set.\n */\nfunction getGatewayUrl(): string | undefined {\n if (!_gatewayUrlResolved) {\n const wspaceUrl = process.env['WSPACE_INT_GATEWAY_URL'];\n const globalUrl = process.env['GLOBAL_INT_GATEWAY_URL'];\n\n if (wspaceUrl) {\n _gatewayUrl = wspaceUrl;\n _gatewayLayer = 'wspace';\n } else if (globalUrl) {\n _gatewayUrl = globalUrl;\n _gatewayLayer = 'global';\n } else {\n _gatewayUrl = undefined;\n _gatewayLayer = undefined;\n }\n _gatewayUrlResolved = true;\n\n if (_gatewayUrl) {\n logger.info(`[trackOperation] Real tracking enabled via ${_gatewayLayer} gateway: ${_gatewayUrl}`);\n } else {\n logger.debug('[trackOperation] No gateway URL configured — running in stub mode');\n }\n }\n return _gatewayUrl;\n}\n\n/**\n * Resolve which activity layer the configured gateway fronts.\n * Always call `getGatewayUrl()` first — it performs the resolution.\n */\nfunction getGatewayLayer(): ActivityLayer {\n // Default to 'wspace': the overwhelming majority of services are workspace-layer, and a wspace\n // payload omits only optional global fields, so a mis-detection degrades rather than fails.\n return _gatewayLayer ?? 'wspace';\n}\n\n/**\n * Reset the cached gateway resolution. Test-only seam — module-level caching would otherwise make\n * per-layer behaviour untestable within a single process.\n */\nexport function __resetGatewayCacheForTests(): void {\n _gatewayUrl = undefined;\n _gatewayLayer = undefined;\n _gatewayUrlResolved = false;\n}\n\n// ---------------------------------------------------------------------------\n// Fire-and-forget GraphQL helper\n// ---------------------------------------------------------------------------\n\nconst LOG_ACTIVITY_MUTATION = /* GraphQL */ `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n }\n }\n`;\n\n/**\n * Derive the `resource` value required by global-activity-svc.\n *\n * Prefers an explicit resourceType; otherwise falls back to the leading dotted segment of the\n * operation name (`auth.session.revoke` → `auth`), which matches the platform's\n * `<domain>.<resource>.<verb>` activity taxonomy. Never returns empty — `resource` is non-nullable\n * on global-activity-svc and an empty string would be silently useless in the audit trail.\n */\nfunction deriveResource(options: UnifiedTrackingOptions): string {\n const explicit = options.activityOptions?.resourceType ?? options.resourceType;\n if (explicit && explicit.trim().length > 0) return explicit;\n\n const op = options.operationName;\n if (op && op.trim().length > 0) {\n const [head] = op.split('.');\n if (head && head.trim().length > 0) return head;\n }\n return 'unknown';\n}\n\n/**\n * Build the layer-appropriate `RecordActivityInput`.\n *\n * Exported for unit testing: the whole class of defect this guards against is a payload that is\n * structurally plausible but rejected by the owning subgraph, which — because delivery is\n * fire-and-forget — is invisible at runtime.\n */\nexport function buildActivityInput(options: UnifiedTrackingOptions, layer: ActivityLayer): Record<string, unknown> {\n const actOpts = options.activityOptions;\n\n // `action` is REQUIRED by both layers. It is the field that was previously sent as the\n // (non-existent) `activityType`, which made every audit write fail validation.\n const action = actOpts?.activityType ?? options.action ?? options.operationName ?? 'unknown';\n\n const description = actOpts?.description ?? `${options.operationName ?? 'operation'} executed`;\n const resourceType = actOpts?.resourceType ?? options.resourceType;\n const resourceId = actOpts?.resourceId ?? options.resourceId;\n const workspaceId = actOpts?.workspaceId ?? options.workspaceId;\n\n const metadata: Record<string, unknown> = {\n ...actOpts?.metadata,\n success: options.success ?? true,\n ...(options.operationName ? { operationName: options.operationName } : {}),\n ...(options.errorMessage ? { errorMessage: options.errorMessage } : {}),\n };\n\n const input: Record<string, unknown> =\n layer === 'global'\n ? {\n action,\n // Required (non-nullable) on global-activity-svc.\n resource: deriveResource(options),\n description,\n resourceType,\n resourceId,\n userId: options.userId,\n actorId: options.userId,\n tenantId: options.tenantId,\n workspaceId,\n metadata,\n }\n : {\n action,\n description,\n resourceType,\n resourceId,\n workspaceId,\n targetUserId: actOpts?.targetUserId,\n teamId: actOpts?.teamId,\n productId: options.productId,\n success: options.success ?? true,\n ...(options.errorMessage ? { errorMessage: options.errorMessage } : {}),\n metadata: { ...metadata, userId: options.userId },\n };\n\n return input;\n}\n\n/**\n * Fire-and-forget activity log via GraphQL.\n * Never throws — logs errors at warn level and continues.\n */\nasync function fireActivityLog(\n gatewayUrl: string,\n options: UnifiedTrackingOptions,\n layer: ActivityLayer\n): Promise<void> {\n try {\n const actOpts = options.activityOptions;\n const input = buildActivityInput(options, layer);\n\n // Strip undefined values\n for (const key of Object.keys(input)) {\n if (input[key] === undefined) delete input[key];\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Forward actor context if available\n if (options.userId) {\n headers['x-actor-id'] = options.userId;\n headers['x-actor-type'] = 'service';\n }\n if (options.workspaceId ?? actOpts?.workspaceId) {\n headers['x-workspace-id'] = (options.workspaceId ?? actOpts?.workspaceId) as string;\n }\n\n const response = await fetch(gatewayUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n query: LOG_ACTIVITY_MUTATION,\n variables: { input },\n }),\n signal: AbortSignal.timeout(5000), // 5s timeout — never block the caller\n });\n\n if (!response.ok) {\n logger.warn(`[trackOperation] Activity log HTTP ${response.status}: ${options.operationName}`);\n return;\n }\n\n // A GraphQL validation/execution failure is returned as HTTP 200 with an `errors` array.\n // Without this check a malformed payload is indistinguishable from a successful write, which\n // is exactly how a fleet-wide audit outage stayed invisible: every call \"succeeded\" at the\n // HTTP layer while the subgraph rejected the input.\n const body = (await response.json().catch(() => undefined)) as { errors?: Array<{ message?: string }> } | undefined;\n\n const errors = body?.errors;\n if (errors && errors.length > 0) {\n const detail = errors\n .map((e) => e?.message ?? 'unknown error')\n .join('; ')\n .slice(0, 500);\n logger.error(\n `[trackOperation] Activity log REJECTED by ${layer}-activity subgraph for ` +\n `\"${options.operationName ?? 'operation'}\": ${detail}`\n );\n }\n } catch (err) {\n // Fire-and-forget: log but never throw\n logger.warn(`[trackOperation] Activity log failed: ${(err as Error).message}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main trackOperation function\n// ---------------------------------------------------------------------------\n\n/**\n * Simple tracker class with auto-promoting behavior\n */\nexport class UnifiedTrackerStub {\n private static instance: UnifiedTrackerStub;\n\n static getInstance(): UnifiedTrackerStub {\n if (!UnifiedTrackerStub.instance) {\n UnifiedTrackerStub.instance = new UnifiedTrackerStub();\n }\n return UnifiedTrackerStub.instance;\n }\n\n async track(event: TrackingEvent): Promise<void> {\n const gatewayUrl = getGatewayUrl();\n if (gatewayUrl) {\n await fireActivityLog(\n gatewayUrl,\n {\n operationName: event.eventType,\n userId: event.userId,\n workspaceId: event.workspaceId,\n resourceType: event.entityType,\n resourceId: event.entityId,\n activityOptions: {\n activityType: event.eventType,\n metadata: event.metadata,\n workspaceId: event.workspaceId,\n resourceType: event.entityType,\n resourceId: event.entityId,\n enabled: true,\n },\n },\n getGatewayLayer()\n );\n } else {\n logger.debug('[UnifiedTracker:Stub]', event.eventType, event.entityType, event.entityId);\n }\n }\n\n async trackBatch(events: TrackingEvent[]): Promise<void> {\n for (const event of events) {\n await this.track(event);\n }\n }\n}\n\nexport const trackerStub = UnifiedTrackerStub.getInstance();\n\n/**\n * Unified tracking function — auto-promoting\n *\n * When a gateway URL is configured (WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL),\n * this function makes real fire-and-forget GraphQL calls for activity logging.\n * When no gateway URL is configured, it falls back to debug-level logging (stub mode).\n *\n * RBAC checks are NOT performed here — they are handled by gateway @rbac directives.\n * The rbacCheck option is accepted for interface compatibility but not enforced.\n *\n * @param options - Tracking options\n * @returns Always returns true (never blocks the calling operation)\n */\nexport async function trackOperation(options: UnifiedTrackingOptions): Promise<boolean> {\n const { operationName, userId, success = true } = options;\n const gatewayUrl = getGatewayUrl();\n\n if (!gatewayUrl) {\n // Stub mode — debug log only\n logger.debug(`[trackOperation:Stub] ${operationName} for user ${userId} - success: ${success}`);\n return true;\n }\n\n // Real mode — fire-and-forget activity logging\n const activityEnabled = options.activityOptions?.enabled !== false;\n\n if (activityEnabled) {\n // Do NOT await — fire and forget so we never block the caller\n void fireActivityLog(gatewayUrl, options, getGatewayLayer());\n } else {\n logger.debug(`[trackOperation] ${operationName} for user ${userId} - activity disabled, skipping`);\n }\n\n return true;\n}\n\n/**\n * Product tracker type definition\n */\nexport type ProductTracker = {\n track: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n freeUp: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackActivityOnly: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackUsageOnly: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackCustom: (operationName: string, additionalOptions: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n productId: string;\n userId: string;\n billingAccountId: string | undefined;\n defaultContext: Partial<UnifiedTrackingOptions> | undefined;\n};\n\n/**\n * Create a product-scoped tracker (auto-promoting implementation)\n *\n * @param productId - Product identifier\n * @param userId - User identifier\n * @param billingAccountId - Optional billing account ID\n * @param defaultContext - Optional default tracking context\n * @returns Product tracker instance\n */\nexport function createProductTracker(\n productId: string,\n userId: string,\n billingAccountId?: string,\n defaultContext?: Partial<UnifiedTrackingOptions>\n): ProductTracker {\n return {\n async track(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n });\n },\n async freeUp(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: {\n ...defaultContext?.activityOptions,\n ...additionalOptions?.activityOptions,\n activityType: 'free_up',\n },\n });\n },\n async trackActivityOnly(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: { ...defaultContext?.activityOptions, ...additionalOptions?.activityOptions, enabled: true },\n usageOptions: { enabled: false },\n });\n },\n async trackUsageOnly(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: { enabled: false },\n usageOptions: { ...defaultContext?.usageOptions, ...additionalOptions?.usageOptions, enabled: true },\n });\n },\n async trackCustom(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n });\n },\n productId,\n userId,\n billingAccountId,\n defaultContext,\n };\n}\n\n/**\n * Constants for tracking\n */\nexport const UNIFIED_TRACKER_CONSTANTS = {\n DEFAULT_PRODUCT_ID: 'module',\n OPERATIONS: {} as const,\n PRODUCTS: {} as const,\n} as const;\n","/**\n * Unified Tracker Module\n * Aggregates RBAC + Activity + Usage + Notifications in single function call\n * This is the MOST IMPORTANT module that products should use for most operations\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { PermissionDeniedError, QuotaExceededError, ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\nimport { RBACModule, type CheckPermissionOptions } from '../rbac/index.js';\nimport { ActivityModule, ActivityType, ActivityStatus, ActivitySeverity } from '../activity/index.js';\nimport { UsageModule, type UsageMetricType, type TrackUsageOptions } from '../usage/index.js';\nimport { NotificationsModule, NotificationType } from '../notifications/index.js';\n\nexport interface TrackOptions {\n /** User performing the action */\n userId: string;\n /** Action being performed */\n action: string;\n /** Resource type */\n resourceType: string;\n /** Optional resource ID */\n resourceId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n\n /** RBAC options */\n rbac?: {\n /** Check permission before executing (default: true) */\n enabled?: boolean;\n /** Custom permission action (defaults to action parameter) */\n permissionAction?: string;\n };\n\n /** Activity tracking options */\n activity?: {\n /** Enable activity tracking (default: true) */\n enabled?: boolean;\n /** Activity type (auto-inferred if not provided) */\n activityType?: ActivityType;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Severity level */\n severity?: ActivitySeverity;\n };\n\n /** Usage tracking options */\n usage?: {\n /** Enable usage tracking (default: true) */\n enabled?: boolean;\n /** Metric type to track */\n metricType: UsageMetricType;\n /** Amount to track */\n amount?: number;\n /** Check quota before executing (default: true) */\n checkQuota?: boolean;\n /** Entity type for quota check */\n entityType?: 'user' | 'workspace' | 'organization';\n };\n\n /** Notification options */\n notification?: {\n /** Send notification on success */\n onSuccess?: {\n title: string;\n message: string;\n type?: NotificationType;\n /** Additional user IDs to notify */\n additionalUserIds?: string[];\n };\n /** Send notification on failure */\n onFailure?: {\n title: string;\n message: string;\n type?: NotificationType;\n /** Additional user IDs to notify */\n additionalUserIds?: string[];\n };\n };\n}\n\nexport interface TrackResult {\n success: boolean;\n /** Permission check result */\n permissionGranted: boolean;\n /** Quota check result (if quota checking enabled) */\n quotaAvailable?: boolean;\n quotaRemaining?: number;\n /** Activity record ID */\n activityId?: string;\n /** Usage record ID */\n usageRecordId?: string;\n /** Notification IDs sent */\n notificationIds?: string[];\n /** Error if operation failed */\n error?: {\n type: 'permission' | 'quota' | 'validation' | 'unknown';\n message: string;\n details?: Record<string, unknown>;\n };\n /** Operation duration in milliseconds */\n duration: number;\n}\n\n/**\n * Unified Tracker Module\n *\n * The primary module products should use for tracking operations.\n * Automatically handles RBAC checks, activity logging, usage tracking, and notifications.\n *\n * @example\n * ```typescript\n * const result = await sdk.tracker.track({\n * userId: 'user123',\n * action: 'create_project',\n * resourceType: 'project',\n * workspaceId: 'ws123',\n * usage: {\n * metricType: UsageMetricType.PROJECTS,\n * amount: 1,\n * checkQuota: true,\n * },\n * notification: {\n * onSuccess: {\n * title: 'Project Created',\n * message: 'Your project has been created successfully',\n * },\n * },\n * });\n *\n * if (!result.success) {\n * // Handle error\n * }\n * ```\n */\nexport class TrackerModule {\n private rbac: RBACModule;\n private activity: ActivityModule;\n private usage: UsageModule;\n private notifications: NotificationsModule;\n\n constructor(\n client: BurdenoffGraphQLClient,\n private context: SDKContext = {}\n ) {\n this.rbac = new RBACModule(client, context);\n this.activity = new ActivityModule(client, context);\n this.usage = new UsageModule(client, context);\n this.notifications = new NotificationsModule(client, context);\n }\n\n /**\n * Track operation with RBAC, Activity, Usage, and Notifications\n * This is the primary method products should use\n */\n public async track(options: TrackOptions): Promise<TrackResult> {\n const startTime = Date.now();\n const result: TrackResult = {\n success: false,\n permissionGranted: false,\n duration: 0,\n };\n\n try {\n // Validate required fields\n this.validateOptions(options);\n\n // Step 1: Check RBAC permission (if enabled)\n if (options.rbac?.enabled !== false) {\n await this.checkPermission(options, result);\n if (!result.permissionGranted) {\n result.duration = Date.now() - startTime;\n await this.logFailedActivity(options, result, startTime);\n return result;\n }\n } else {\n result.permissionGranted = true;\n }\n\n // Step 2: Check quota (if usage tracking enabled and checkQuota is true)\n if (options.usage?.enabled !== false && options.usage?.checkQuota !== false) {\n await this.checkQuota(options, result);\n if (result.quotaAvailable === false) {\n result.duration = Date.now() - startTime;\n await this.logFailedActivity(options, result, startTime);\n return result;\n }\n }\n\n // Step 3: Track usage (if enabled)\n if (options.usage?.enabled !== false && options.usage?.metricType) {\n await this.trackUsage(options, result);\n }\n\n // Step 4: Log successful activity (if enabled)\n if (options.activity?.enabled !== false) {\n await this.logSuccessActivity(options, result, startTime);\n }\n\n // Step 5: Send success notification (if configured)\n if (options.notification?.onSuccess) {\n await this.sendSuccessNotification(options, result);\n }\n\n result.success = true;\n result.duration = Date.now() - startTime;\n\n logger.info('[Tracker] Operation tracked successfully', {\n action: options.action,\n duration: result.duration,\n });\n\n return result;\n } catch (error) {\n result.duration = Date.now() - startTime;\n result.success = false;\n\n // Categorize error\n if (error instanceof PermissionDeniedError) {\n result.error = {\n type: 'permission',\n message: error.message,\n details: error.details,\n };\n } else if (error instanceof QuotaExceededError) {\n result.error = {\n type: 'quota',\n message: error.message,\n details: error.details,\n };\n } else if (error instanceof ValidationError) {\n result.error = {\n type: 'validation',\n message: error.message,\n details: error.details,\n };\n } else {\n result.error = {\n type: 'unknown',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n\n // Log failed activity\n await this.logFailedActivity(options, result, startTime);\n\n // Send failure notification (if configured)\n if (options.notification?.onFailure) {\n await this.sendFailureNotification(options, result);\n }\n\n logger.error('[Tracker] Operation tracking failed', {\n action: options.action,\n error: result.error,\n duration: result.duration,\n });\n\n return result;\n }\n }\n\n /**\n * Track operation and throw on failure\n * Convenience method that throws errors instead of returning them in result\n */\n public async trackOrThrow(options: TrackOptions): Promise<TrackResult> {\n const result = await this.track(options);\n\n if (!result.success && result.error) {\n const errorMessage = result.error.message;\n const errorDetails = result.error.details;\n\n switch (result.error.type) {\n case 'permission':\n throw new PermissionDeniedError(errorMessage, errorDetails);\n case 'quota':\n throw new QuotaExceededError(errorMessage, errorDetails);\n case 'validation':\n throw new ValidationError(errorMessage, errorDetails);\n default:\n throw new Error(errorMessage);\n }\n }\n\n return result;\n }\n\n /**\n * Simplified track method for common operations\n */\n public async trackSimple(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metricType?: UsageMetricType\n ): Promise<boolean> {\n const result = await this.track({\n userId,\n action,\n resourceType,\n resourceId,\n workspaceId: this.context.workspaceId,\n usage: metricType\n ? {\n enabled: true,\n metricType,\n amount: 1,\n checkQuota: true,\n }\n : { enabled: false, metricType: 'api_calls' as UsageMetricType },\n });\n\n return result.success;\n }\n\n /**\n * Validate tracking options\n */\n private validateOptions(options: TrackOptions): void {\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n }\n\n /**\n * Check RBAC permission\n */\n private async checkPermission(options: TrackOptions, result: TrackResult): Promise<void> {\n const permissionOptions: CheckPermissionOptions = {\n userId: options.userId,\n action: options.rbac?.permissionAction || options.action,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n workspaceId: options.workspaceId,\n };\n\n const hasPermission = await this.rbac.checkPermission(permissionOptions);\n result.permissionGranted = hasPermission;\n\n if (!hasPermission) {\n result.error = {\n type: 'permission',\n message: 'Permission denied',\n details: permissionOptions as unknown as Record<string, unknown>,\n };\n }\n }\n\n /**\n * Check quota availability\n */\n private async checkQuota(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.usage?.metricType) {\n return;\n }\n\n const entityType = options.usage.entityType || 'user';\n let entityId: string;\n\n if (entityType === 'workspace') {\n entityId = options.workspaceId || options.userId;\n } else if (entityType === 'organization') {\n entityId = options.organizationId || options.userId;\n } else {\n entityId = options.userId;\n }\n\n const quotaCheck = await this.usage.checkQuota({\n entityId,\n entityType,\n metricType: options.usage.metricType,\n requestedAmount: options.usage.amount || 1,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n result.quotaAvailable = quotaCheck.allowed;\n result.quotaRemaining = quotaCheck.remainingQuota;\n\n if (!quotaCheck.allowed) {\n result.error = {\n type: 'quota',\n message: quotaCheck.reason || 'Quota exceeded',\n details: {\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n requestedAmount: options.usage.amount || 1,\n },\n };\n }\n }\n\n /**\n * Track usage\n */\n private async trackUsage(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.usage?.metricType) {\n return;\n }\n\n const entityType = options.usage.entityType || 'user';\n let entityId: string;\n\n if (entityType === 'workspace') {\n entityId = options.workspaceId || options.userId;\n } else if (entityType === 'organization') {\n entityId = options.organizationId || options.userId;\n } else {\n entityId = options.userId;\n }\n\n const trackOptions: TrackUsageOptions = {\n entityId,\n entityType,\n metricType: options.usage.metricType,\n amount: options.usage.amount || 1,\n resourceId: options.resourceId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n };\n\n const usageRecord = await this.usage.track(trackOptions);\n result.usageRecordId = usageRecord.id;\n }\n\n /**\n * Log successful activity\n */\n private async logSuccessActivity(options: TrackOptions, result: TrackResult, startTime: number): Promise<void> {\n const activityRecord = await this.activity.log({\n userId: options.userId,\n activityType: options.activity?.activityType || this.inferActivityType(options.action),\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: ActivityStatus.SUCCESS,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.activity?.ipAddress,\n userAgent: options.activity?.userAgent,\n metadata: options.activity?.metadata,\n severity: options.activity?.severity || ActivitySeverity.LOW,\n duration: Date.now() - startTime,\n });\n\n result.activityId = activityRecord.id;\n }\n\n /**\n * Log failed activity\n */\n private async logFailedActivity(options: TrackOptions, result: TrackResult, startTime: number): Promise<void> {\n if (options.activity?.enabled === false) {\n return;\n }\n\n try {\n const activityRecord = await this.activity.log({\n userId: options.userId,\n activityType: options.activity?.activityType || this.inferActivityType(options.action),\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: ActivityStatus.FAILURE,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.activity?.ipAddress,\n userAgent: options.activity?.userAgent,\n metadata: options.activity?.metadata,\n severity: ActivitySeverity.HIGH,\n errorMessage: result.error?.message,\n duration: Date.now() - startTime,\n });\n\n result.activityId = activityRecord.id;\n } catch (error) {\n logger.error('[Tracker] Failed to log activity', { error });\n }\n }\n\n /**\n * Send success notification\n */\n private async sendSuccessNotification(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.notification?.onSuccess) {\n return;\n }\n\n try {\n const userIds = [options.userId, ...(options.notification.onSuccess.additionalUserIds || [])];\n\n const response = await this.notifications.send({\n title: options.notification.onSuccess.title,\n message: options.notification.onSuccess.message,\n type: options.notification.onSuccess.type || NotificationType.SUCCESS,\n userIds,\n });\n\n result.notificationIds = response.notificationIds;\n } catch (error) {\n logger.error('[Tracker] Failed to send success notification', { error });\n }\n }\n\n /**\n * Send failure notification\n */\n private async sendFailureNotification(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.notification?.onFailure) {\n return;\n }\n\n try {\n const userIds = [options.userId, ...(options.notification.onFailure.additionalUserIds || [])];\n\n const response = await this.notifications.send({\n title: options.notification.onFailure.title,\n message: options.notification.onFailure.message,\n type: options.notification.onFailure.type || NotificationType.ERROR,\n userIds,\n });\n\n result.notificationIds = response.notificationIds;\n } catch (error) {\n logger.error('[Tracker] Failed to send failure notification', { error });\n }\n }\n\n /**\n * Infer activity type from action\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) return ActivityType.CREATE;\n if (actionLower.includes('update') || actionLower.includes('edit')) return ActivityType.UPDATE;\n if (actionLower.includes('delete') || actionLower.includes('remove')) return ActivityType.DELETE;\n if (actionLower.includes('read') || actionLower.includes('view')) return ActivityType.READ;\n if (actionLower.includes('login')) return ActivityType.LOGIN;\n if (actionLower.includes('logout')) return ActivityType.LOGOUT;\n if (actionLower.includes('export')) return ActivityType.EXPORT;\n if (actionLower.includes('import')) return ActivityType.IMPORT;\n if (actionLower.includes('share')) return ActivityType.SHARE;\n if (actionLower.includes('download')) return ActivityType.DOWNLOAD;\n if (actionLower.includes('upload')) return ActivityType.UPLOAD;\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Batch track multiple operations\n */\n public async trackBatch(operations: TrackOptions[]): Promise<TrackResult[]> {\n logger.debug('[Tracker] Batch tracking operations', { count: operations.length });\n\n const results = await Promise.all(operations.map((op) => this.track(op)));\n\n logger.info('[Tracker] Batch tracking completed', {\n total: results.length,\n successful: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n });\n\n return results;\n }\n}\n\n// Export stub implementation for services that don't need full tracking\nexport {\n trackOperation,\n createProductTracker,\n UnifiedTrackerStub,\n trackerStub,\n UNIFIED_TRACKER_CONSTANTS,\n} from './stub.js';\nexport type {\n TrackingEvent,\n RbacCheckOptions,\n UsageTrackingOptions,\n ActivityTrackingOptions,\n UnifiedTrackingOptions,\n ProductTracker,\n} from './stub.js';\n\n// Re-export UsageMetricType from usage module for convenience\nexport { UsageMetricType } from '../usage/index.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/activity/index.ts","../src/usage/index.ts","../src/tracker/stub.ts","../src/tracker/index.ts"],"names":["ActivityType","ActivityStatus","ActivitySeverity","ActivityModule","client","context","log","options","userId","ValidationError","activityType","resourceType","action","status","logger","debug","recordActivityMutation","legacyLogActivityMutation","variables","input","resourceId","workspaceId","organizationId","projectId","ipAddress","userAgent","metadata","severity","errorMessage","duration","response","query","info","activityId","recordActivity","id","error","message","Error","String","isRecordActivityUnavailable","includes","warn","reason","legacyResponse","logActivity","logSuccess","inferActivityType","logFailure","getActivities","startDate","endDate","search","limit","offset","sortBy","sortOrder","getActivity","getStats","getActivityStats","cleanup","olderThanDays","mutation","deletedCount","cleanupActivities","actionLower","toLowerCase","exportToCSV","exportActivities","csvData","UsageMetricType","UsageModule","track","entityId","entityType","metricType","amount","recordId","trackUsage","checkQuota","requestedAmount","allowed","requireQuota","result","QuotaExceededError","currentUsage","quotaLimit","resetAt","trackAndCheck","quotaCheck","usage","getUsage","getSummary","period","getUsageSummary","setQuota","quotaId","getQuota","getQuotas","resetQuota","deleteQuota","trackBulk","records","count","length","trackUsageBulk","_gatewayUrl","_gatewayLayer","_gatewayUrlResolved","getGatewayUrl","wspaceUrl","process","env","globalUrl","undefined","getGatewayLayer","LOG_ACTIVITY_MUTATION","deriveResource","explicit","activityOptions","trim","op","operationName","head","split","buildActivityInput","layer","actOpts","description","success","resource","actorId","tenantId","targetUserId","teamId","productId","fireActivityLog","gatewayUrl","key","Object","keys","headers","fetch","method","body","JSON","stringify","signal","AbortSignal","timeout","ok","json","catch","errors","detail","map","e","join","slice","err","UnifiedTrackerStub","instance","getInstance","event","eventType","enabled","trackBatch","events","trackerStub","trackOperation","activityEnabled","createProductTracker","billingAccountId","defaultContext","additionalOptions","freeUp","trackActivityOnly","usageOptions","trackUsageOnly","trackCustom","UNIFIED_TRACKER_CONSTANTS","DEFAULT_PRODUCT_ID","OPERATIONS","PRODUCTS","TrackerModule","rbac","activity","notifications","RBACModule","NotificationsModule","startTime","Date","now","permissionGranted","validateOptions","checkPermission","logFailedActivity","quotaAvailable","logSuccessActivity","notification","onSuccess","sendSuccessNotification","PermissionDeniedError","type","details","onFailure","sendFailureNotification","trackOrThrow","errorDetails","trackSimple","permissionOptions","permissionAction","hasPermission","quotaRemaining","remainingQuota","trackOptions","usageRecord","usageRecordId","activityRecord","SUCCESS","LOW","FAILURE","HIGH","userIds","additionalUserIds","send","title","NotificationType","notificationIds","ERROR","CREATE","UPDATE","DELETE","READ","LOGIN","LOGOUT","EXPORT","IMPORT","SHARE","DOWNLOAD","UPLOAD","CUSTOM","operations","results","Promise","all","total","successful","filter","r","failed"],"mappings":"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","file":"chunk-VOJROV6C.js","sourcesContent":["/**\n * Activity Tracking Module\n * Comprehensive audit trail and activity logging for all operations\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 ActivityType {\n CREATE = 'create',\n READ = 'read',\n UPDATE = 'update',\n DELETE = 'delete',\n LOGIN = 'login',\n LOGOUT = 'logout',\n EXPORT = 'export',\n IMPORT = 'import',\n SHARE = 'share',\n DOWNLOAD = 'download',\n UPLOAD = 'upload',\n EXECUTE = 'execute',\n APPROVE = 'approve',\n REJECT = 'reject',\n CUSTOM = 'custom',\n}\n\nexport enum ActivityStatus {\n SUCCESS = 'success',\n FAILURE = 'failure',\n PENDING = 'pending',\n WARNING = 'warning',\n}\n\nexport enum ActivitySeverity {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface LogActivityOptions {\n /** User performing the action */\n userId: string;\n /** Type of activity */\n activityType: ActivityType;\n /** Resource type being acted upon */\n resourceType: string;\n /** Resource ID */\n resourceId?: string;\n /** Action performed */\n action: string;\n /** Activity status */\n status: ActivityStatus;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Severity level */\n severity?: ActivitySeverity;\n /** Error message if failed */\n errorMessage?: string;\n /** Duration in milliseconds */\n duration?: number;\n}\n\nexport interface Activity {\n id: string;\n userId: string;\n activityType: ActivityType;\n resourceType: string;\n resourceId?: string;\n action: string;\n status: ActivityStatus;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n ipAddress?: string;\n userAgent?: string;\n metadata?: Record<string, unknown>;\n severity: ActivitySeverity;\n errorMessage?: string;\n duration?: number;\n createdAt: string;\n}\n\nexport interface GetActivitiesOptions {\n /** Filter by user */\n userId?: string;\n /** Filter by workspace */\n workspaceId?: string;\n /** Filter by organization */\n organizationId?: string;\n /** Filter by project */\n projectId?: string;\n /** Filter by activity type */\n activityType?: ActivityType;\n /** Filter by resource type */\n resourceType?: string;\n /** Filter by resource ID */\n resourceId?: string;\n /** Filter by status */\n status?: ActivityStatus;\n /** Filter by severity */\n severity?: ActivitySeverity;\n /** Filter by date range */\n startDate?: string;\n endDate?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Sort by field */\n sortBy?: 'createdAt' | 'duration' | 'severity';\n /** Sort order */\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface ActivityStats {\n totalActivities: number;\n successCount: number;\n failureCount: number;\n pendingCount: number;\n warningCount: number;\n averageDuration?: number;\n activitiesByType: Record<string, number>;\n activitiesBySeverity: Record<string, number>;\n topUsers: Array<{ userId: string; count: number }>;\n topResources: Array<{ resourceType: string; count: number }>;\n}\n\n/**\n * Activity Tracking Module\n */\nexport class ActivityModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Log activity\n */\n public async log(options: LogActivityOptions): Promise<Activity> {\n // Validate required fields\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.activityType) {\n throw new ValidationError('Activity type is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.status) {\n throw new ValidationError('Status is required');\n }\n\n logger.debug('[Activity] Logging activity', {\n userId: options.userId,\n action: options.action,\n resourceType: options.resourceType,\n });\n\n const recordActivityMutation = `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const legacyLogActivityMutation = `\n mutation LogActivity($input: LogActivityInput!) {\n logActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const variables = {\n input: {\n userId: options.userId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: options.status,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.ipAddress,\n userAgent: options.userAgent,\n metadata: options.metadata,\n severity: options.severity || ActivitySeverity.LOW,\n errorMessage: options.errorMessage,\n duration: options.duration,\n },\n };\n\n try {\n const response = await this.client.query<{ recordActivity: Activity }>(\n recordActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged', { activityId: response.recordActivity.id });\n return response.recordActivity;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isRecordActivityUnavailable =\n message.includes('Cannot query field \"recordActivity\"') ||\n message.includes('Unknown type \"RecordActivityInput\"');\n\n if (!isRecordActivityUnavailable) {\n throw error;\n }\n\n logger.warn('[Activity] Falling back to legacy logActivity mutation', {\n reason: message,\n });\n\n const legacyResponse = await this.client.query<{ logActivity: Activity }>(\n legacyLogActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged (legacy)', { activityId: legacyResponse.logActivity.id });\n return legacyResponse.logActivity;\n }\n }\n\n /**\n * Log activity with automatic status detection\n */\n public async logSuccess(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.SUCCESS,\n severity: ActivitySeverity.LOW,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Log failed activity\n */\n public async logFailure(\n userId: string,\n action: string,\n resourceType: string,\n errorMessage: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.FAILURE,\n severity: ActivitySeverity.HIGH,\n errorMessage,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Get activities with filters\n */\n public async getActivities(options: GetActivitiesOptions): Promise<{\n activities: Activity[];\n total: number;\n }> {\n logger.debug('[Activity] Getting activities', options);\n\n const query = `\n query GetActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $resourceId: ID\n $status: ActivityStatus\n $severity: ActivitySeverity\n $startDate: DateTime\n $endDate: DateTime\n $search: String\n $limit: Int\n $offset: Int\n $sortBy: String\n $sortOrder: String\n ) {\n getActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n resourceId: $resourceId\n status: $status\n severity: $severity\n startDate: $startDate\n endDate: $endDate\n search: $search\n limit: $limit\n offset: $offset\n sortBy: $sortBy\n sortOrder: $sortOrder\n ) {\n activities {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n total\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n status: options.status,\n severity: options.severity,\n startDate: options.startDate,\n endDate: options.endDate,\n search: options.search,\n limit: options.limit || 50,\n offset: options.offset || 0,\n sortBy: options.sortBy || 'createdAt',\n sortOrder: options.sortOrder || 'desc',\n };\n\n const response = await this.client.query<{\n getActivities: { activities: Activity[]; total: number };\n }>(query, variables, this.context);\n\n return response.getActivities;\n }\n\n /**\n * Get activity by ID\n */\n public async getActivity(activityId: string): Promise<Activity> {\n logger.debug('[Activity] Getting activity', { activityId });\n\n const query = `\n query GetActivity($activityId: ID!) {\n getActivity(activityId: $activityId) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getActivity: Activity }>(query, { activityId }, this.context);\n\n return response.getActivity;\n }\n\n /**\n * Get activity statistics\n */\n public async getStats(options: Omit<GetActivitiesOptions, 'limit' | 'offset'>): Promise<ActivityStats> {\n logger.debug('[Activity] Getting activity stats', options);\n\n const query = `\n query GetActivityStats(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $startDate: DateTime\n $endDate: DateTime\n ) {\n getActivityStats(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n startDate: $startDate\n endDate: $endDate\n ) {\n totalActivities\n successCount\n failureCount\n pendingCount\n warningCount\n averageDuration\n activitiesByType\n activitiesBySeverity\n topUsers {\n userId\n count\n }\n topResources {\n resourceType\n count\n }\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n startDate: options.startDate,\n endDate: options.endDate,\n };\n\n const response = await this.client.query<{ getActivityStats: ActivityStats }>(query, variables, this.context);\n\n return response.getActivityStats;\n }\n\n /**\n * Delete old activities (cleanup)\n */\n public async cleanup(olderThanDays: number, workspaceId?: string): Promise<number> {\n logger.debug('[Activity] Cleaning up old activities', { olderThanDays, workspaceId });\n\n const mutation = `\n mutation CleanupActivities($olderThanDays: Int!, $workspaceId: ID) {\n cleanupActivities(olderThanDays: $olderThanDays, workspaceId: $workspaceId) {\n deletedCount\n }\n }\n `;\n\n const response = await this.client.query<{\n cleanupActivities: { deletedCount: number };\n }>(mutation, { olderThanDays, workspaceId }, this.context);\n\n logger.info('[Activity] Cleanup completed', {\n deletedCount: response.cleanupActivities.deletedCount,\n });\n\n return response.cleanupActivities.deletedCount;\n }\n\n /**\n * Infer activity type from action string\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) {\n return ActivityType.CREATE;\n }\n if (actionLower.includes('update') || actionLower.includes('edit') || actionLower.includes('modify')) {\n return ActivityType.UPDATE;\n }\n if (actionLower.includes('delete') || actionLower.includes('remove')) {\n return ActivityType.DELETE;\n }\n if (actionLower.includes('read') || actionLower.includes('view') || actionLower.includes('get')) {\n return ActivityType.READ;\n }\n if (actionLower.includes('login') || actionLower.includes('signin')) {\n return ActivityType.LOGIN;\n }\n if (actionLower.includes('logout') || actionLower.includes('signout')) {\n return ActivityType.LOGOUT;\n }\n if (actionLower.includes('export')) {\n return ActivityType.EXPORT;\n }\n if (actionLower.includes('import')) {\n return ActivityType.IMPORT;\n }\n if (actionLower.includes('share')) {\n return ActivityType.SHARE;\n }\n if (actionLower.includes('download')) {\n return ActivityType.DOWNLOAD;\n }\n if (actionLower.includes('upload')) {\n return ActivityType.UPLOAD;\n }\n if (actionLower.includes('execute') || actionLower.includes('run')) {\n return ActivityType.EXECUTE;\n }\n if (actionLower.includes('approve')) {\n return ActivityType.APPROVE;\n }\n if (actionLower.includes('reject')) {\n return ActivityType.REJECT;\n }\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Export activities to CSV\n */\n public async exportToCSV(options: GetActivitiesOptions): Promise<string> {\n logger.debug('[Activity] Exporting activities to CSV');\n\n const query = `\n query ExportActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $startDate: DateTime\n $endDate: DateTime\n ) {\n exportActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n startDate: $startDate\n endDate: $endDate\n ) {\n csvData\n }\n }\n `;\n\n const response = await this.client.query<{ exportActivities: { csvData: string } }>(\n query,\n {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n startDate: options.startDate,\n endDate: options.endDate,\n },\n this.context\n );\n\n logger.info('[Activity] Activities exported to CSV');\n\n return response.exportActivities.csvData;\n }\n}\n","/**\n * Usage & Quota Module\n * Track resource usage, enforce quotas, and manage billing\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError, QuotaExceededError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum UsageMetricType {\n API_CALLS = 'api_calls',\n STORAGE = 'storage',\n BANDWIDTH = 'bandwidth',\n USERS = 'users',\n PROJECTS = 'projects',\n WORKSPACES = 'workspaces',\n RECORDS = 'records',\n COMPUTE_TIME = 'compute_time',\n TRANSACTIONS = 'transactions',\n CUSTOM = 'custom',\n}\n\nexport enum QuotaPeriod {\n DAILY = 'daily',\n WEEKLY = 'weekly',\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n LIFETIME = 'lifetime',\n}\n\n/**\n * Entity type for usage tracking\n */\nexport type UsageEntityType = 'user' | 'workspace' | 'organization';\n\nexport interface TrackUsageOptions {\n /** User or workspace consuming the resource */\n entityId: string;\n /** Type of entity (user or workspace) */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to increment */\n amount: number;\n /** Optional resource identifier */\n resourceId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface CheckQuotaOptions {\n /** Entity to check quota for */\n entityId: string;\n /** Type of entity */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to check availability for */\n requestedAmount: number;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface QuotaCheckResult {\n allowed: boolean;\n currentUsage: number;\n quotaLimit: number;\n remainingQuota: number;\n resetAt?: string;\n period: QuotaPeriod;\n reason?: string;\n}\n\nexport interface UsageRecord {\n id: string;\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n amount: number;\n resourceId?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n recordedAt: string;\n}\n\nexport interface UsageSummary {\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n totalUsage: number;\n period: QuotaPeriod;\n periodStart: string;\n periodEnd: string;\n quotaLimit?: number;\n utilizationPercentage?: number;\n}\n\nexport interface SetQuotaOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n workspaceId?: string;\n organizationId?: string;\n}\n\nexport interface Quota {\n id: string;\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n currentUsage: number;\n resetAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface GetUsageOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType?: UsageMetricType;\n startDate?: string;\n endDate?: string;\n workspaceId?: string;\n organizationId?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Usage & Quota Module\n */\nexport class UsageModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Track usage\n */\n public async track(options: TrackUsageOptions): Promise<UsageRecord> {\n // Validate inputs\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.entityType) {\n throw new ValidationError('Entity type is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.amount !== 'number' || options.amount <= 0) {\n throw new ValidationError('Amount must be a positive number');\n }\n\n logger.debug('[Usage] Tracking usage', {\n entityId: options.entityId,\n metricType: options.metricType,\n amount: options.amount,\n });\n\n const mutation = `\n mutation TrackUsage($input: TrackUsageInput!) {\n trackUsage(input: $input) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n amount: options.amount,\n resourceId: options.resourceId,\n metadata: options.metadata,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ trackUsage: UsageRecord }>(mutation, variables, this.context);\n\n logger.info('[Usage] Usage tracked', { recordId: response.trackUsage.id });\n\n return response.trackUsage;\n }\n\n /**\n * Check quota availability\n */\n public async checkQuota(options: CheckQuotaOptions): Promise<QuotaCheckResult> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.requestedAmount !== 'number' || options.requestedAmount <= 0) {\n throw new ValidationError('Requested amount must be a positive number');\n }\n\n logger.debug('[Usage] Checking quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n });\n\n const query = `\n query CheckQuota($input: CheckQuotaInput!) {\n checkQuota(input: $input) {\n allowed\n currentUsage\n quotaLimit\n remainingQuota\n resetAt\n period\n reason\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ checkQuota: QuotaCheckResult }>(query, variables, this.context);\n\n logger.debug('[Usage] Quota check result', { allowed: response.checkQuota.allowed });\n\n return response.checkQuota;\n }\n\n /**\n * Require quota (throws if exceeded)\n */\n public async requireQuota(options: CheckQuotaOptions): Promise<void> {\n const result = await this.checkQuota(options);\n\n if (!result.allowed) {\n throw new QuotaExceededError(result.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: result.currentUsage,\n quotaLimit: result.quotaLimit,\n requestedAmount: options.requestedAmount,\n resetAt: result.resetAt,\n });\n }\n }\n\n /**\n * Track usage and check quota atomically\n */\n public async trackAndCheck(options: TrackUsageOptions): Promise<{\n usage: UsageRecord;\n quotaCheck: QuotaCheckResult;\n }> {\n // First check quota\n const quotaCheck = await this.checkQuota({\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.amount,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n if (!quotaCheck.allowed) {\n throw new QuotaExceededError(quotaCheck.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n });\n }\n\n // Track usage\n const usage = await this.track(options);\n\n return { usage, quotaCheck };\n }\n\n /**\n * Get usage records\n */\n public async getUsage(options: GetUsageOptions): Promise<{\n records: UsageRecord[];\n total: number;\n }> {\n logger.debug('[Usage] Getting usage records', { entityId: options.entityId });\n\n const query = `\n query GetUsage(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType\n $startDate: DateTime\n $endDate: DateTime\n $workspaceId: ID\n $organizationId: ID\n $limit: Int\n $offset: Int\n ) {\n getUsage(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n startDate: $startDate\n endDate: $endDate\n workspaceId: $workspaceId\n organizationId: $organizationId\n limit: $limit\n offset: $offset\n ) {\n records {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n total\n }\n }\n `;\n\n const variables = {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n startDate: options.startDate,\n endDate: options.endDate,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n limit: options.limit || 100,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getUsage: { records: UsageRecord[]; total: number };\n }>(query, variables, this.context);\n\n return response.getUsage;\n }\n\n /**\n * Get usage summary\n */\n public async getSummary(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType,\n period: QuotaPeriod\n ): Promise<UsageSummary> {\n logger.debug('[Usage] Getting usage summary', { entityId, metricType, period });\n\n const query = `\n query GetUsageSummary(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType!\n $period: QuotaPeriod!\n ) {\n getUsageSummary(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n period: $period\n ) {\n entityId\n entityType\n metricType\n totalUsage\n period\n periodStart\n periodEnd\n quotaLimit\n utilizationPercentage\n }\n }\n `;\n\n const response = await this.client.query<{ getUsageSummary: UsageSummary }>(\n query,\n { entityId, entityType, metricType, period },\n this.context\n );\n\n return response.getUsageSummary;\n }\n\n /**\n * Set quota limit\n */\n public async setQuota(options: SetQuotaOptions): Promise<Quota> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.limit !== 'number' || options.limit < 0) {\n throw new ValidationError('Limit must be a non-negative number');\n }\n\n logger.debug('[Usage] Setting quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n limit: options.limit,\n });\n\n const mutation = `\n mutation SetQuota($input: SetQuotaInput!) {\n setQuota(input: $input) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n limit: options.limit,\n period: options.period,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ setQuota: Quota }>(mutation, variables, this.context);\n\n logger.info('[Usage] Quota set', { quotaId: response.setQuota.id });\n\n return response.setQuota;\n }\n\n /**\n * Get quota\n */\n public async getQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<Quota | null> {\n logger.debug('[Usage] Getting quota', { entityId, metricType });\n\n const query = `\n query GetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n getQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuota: Quota | null }>(\n query,\n { entityId, entityType, metricType },\n this.context\n );\n\n return response.getQuota;\n }\n\n /**\n * Get all quotas for entity\n */\n public async getQuotas(entityId: string, entityType: UsageEntityType): Promise<Quota[]> {\n logger.debug('[Usage] Getting all quotas', { entityId, entityType });\n\n const query = `\n query GetQuotas($entityId: ID!, $entityType: String!) {\n getQuotas(entityId: $entityId, entityType: $entityType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuotas: Quota[] }>(query, { entityId, entityType }, this.context);\n\n return response.getQuotas;\n }\n\n /**\n * Reset quota usage\n */\n public async resetQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Resetting quota', { entityId, metricType });\n\n const mutation = `\n mutation ResetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n resetQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota reset', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Delete quota\n */\n public async deleteQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Deleting quota', { entityId, metricType });\n\n const mutation = `\n mutation DeleteQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n deleteQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota deleted', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Bulk track usage\n */\n public async trackBulk(records: TrackUsageOptions[]): Promise<UsageRecord[]> {\n logger.debug('[Usage] Bulk tracking usage', { count: records.length });\n\n const mutation = `\n mutation TrackUsageBulk($records: [TrackUsageInput!]!) {\n trackUsageBulk(records: $records) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const response = await this.client.query<{ trackUsageBulk: UsageRecord[] }>(mutation, { records }, this.context);\n\n logger.info('[Usage] Bulk usage tracked', { count: response.trackUsageBulk.length });\n\n return response.trackUsageBulk;\n }\n}\n","/**\n * Unified Tracking — Auto-Promoting Implementation\n *\n * Automatically promotes from stub to real tracking when gateway URLs are configured.\n * When WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL is set, this module will:\n * - Log activity events via GraphQL to the activity service\n * - Track usage via GraphQL to the usage service (if usage options provided)\n * - RBAC checks are NOT performed here (handled by gateway @rbac directives)\n *\n * When no gateway URL is configured, falls back to debug-level logging (stub mode).\n *\n * This is a backward-compatible drop-in replacement for the original stub. All 1,100+\n * existing call sites continue to work without modification.\n *\n * @module tracker/stub\n * @category Tracking\n */\nimport { logger } from '../logger/index.js';\n\n/**\n * Tracking event interface\n */\nexport interface TrackingEvent {\n eventType: string;\n entityType: string;\n entityId: string;\n userId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n timestamp?: Date;\n}\n\n/**\n * RBAC check options\n */\nexport interface RbacCheckOptions {\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n skipRbacCheck?: boolean;\n options?: {\n allowOwnerAccess?: boolean;\n allowWorkspaceAdmin?: boolean;\n scope?: string;\n };\n}\n\n/**\n * Usage tracking options\n */\nexport interface UsageTrackingOptions {\n billingAccountId?: string;\n addUsage?: boolean;\n description?: string;\n tags?: Record<string, unknown>;\n quotaName?: string;\n value?: number;\n}\n\n/**\n * Activity tracking options\n */\nexport interface ActivityTrackingOptions {\n activityType?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n teamId?: string;\n groupId?: string;\n projectId?: string;\n targetUserId?: string;\n resourceType?: string;\n resourceId?: string;\n enabled?: boolean;\n}\n\n/**\n * Unified tracking options\n */\nexport interface UnifiedTrackingOptions {\n operationName?: string;\n userId?: string;\n context?: unknown;\n rbacCheck?: RbacCheckOptions;\n activityOptions?: ActivityTrackingOptions;\n usageOptions?: UsageTrackingOptions & { enabled?: boolean };\n success?: boolean;\n errorMessage?: string;\n productId?: string;\n // Legacy properties for backward compatibility (can be at top level or in nested objects)\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n tenantId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Gateway URL resolution — cached at module level for performance\n// ---------------------------------------------------------------------------\n\nlet _gatewayUrl: string | undefined;\nlet _gatewayLayer: ActivityLayer | undefined;\nlet _gatewayUrlResolved = false;\n\n/**\n * Which activity subgraph the resolved gateway fronts.\n *\n * The two canonical activity owners accept DIFFERENT `RecordActivityInput` shapes, so the\n * payload must be built per layer:\n * - `wspace` → wspace-activity-svc: requires `action`; carries workspace-scoped fields\n * (workspaceId/teamId/targetUserId/productId/success).\n * - `global` → global-activity-svc: requires `action` AND `resource`; carries tenant-scoped\n * fields (tenantId/actorId/ipAddress/userAgent).\n * Sending one layer's shape to the other fails GraphQL validation.\n */\nexport type ActivityLayer = 'wspace' | 'global';\n\n/**\n * Resolve the internal gateway URL from environment.\n * Workspace services use WSPACE_INT_GATEWAY_URL, global services use GLOBAL_INT_GATEWAY_URL.\n * Falls back to undefined (stub mode) if neither is set.\n */\nfunction getGatewayUrl(): string | undefined {\n if (!_gatewayUrlResolved) {\n const wspaceUrl = process.env['WSPACE_INT_GATEWAY_URL'];\n const globalUrl = process.env['GLOBAL_INT_GATEWAY_URL'];\n\n if (wspaceUrl) {\n _gatewayUrl = wspaceUrl;\n _gatewayLayer = 'wspace';\n } else if (globalUrl) {\n _gatewayUrl = globalUrl;\n _gatewayLayer = 'global';\n } else {\n _gatewayUrl = undefined;\n _gatewayLayer = undefined;\n }\n _gatewayUrlResolved = true;\n\n if (_gatewayUrl) {\n logger.info(`[trackOperation] Real tracking enabled via ${_gatewayLayer} gateway: ${_gatewayUrl}`);\n } else {\n logger.debug('[trackOperation] No gateway URL configured — running in stub mode');\n }\n }\n return _gatewayUrl;\n}\n\n/**\n * Resolve which activity layer the configured gateway fronts.\n * Always call `getGatewayUrl()` first — it performs the resolution.\n */\nfunction getGatewayLayer(): ActivityLayer {\n // Default to 'wspace': the overwhelming majority of services are workspace-layer, and a wspace\n // payload omits only optional global fields, so a mis-detection degrades rather than fails.\n return _gatewayLayer ?? 'wspace';\n}\n\n/**\n * Reset the cached gateway resolution. Test-only seam — module-level caching would otherwise make\n * per-layer behaviour untestable within a single process.\n */\nexport function __resetGatewayCacheForTests(): void {\n _gatewayUrl = undefined;\n _gatewayLayer = undefined;\n _gatewayUrlResolved = false;\n}\n\n// ---------------------------------------------------------------------------\n// Fire-and-forget GraphQL helper\n// ---------------------------------------------------------------------------\n\nconst LOG_ACTIVITY_MUTATION = /* GraphQL */ `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n }\n }\n`;\n\n/**\n * Derive the `resource` value required by global-activity-svc.\n *\n * Prefers an explicit resourceType; otherwise falls back to the leading dotted segment of the\n * operation name (`auth.session.revoke` → `auth`), which matches the platform's\n * `<domain>.<resource>.<verb>` activity taxonomy. Never returns empty — `resource` is non-nullable\n * on global-activity-svc and an empty string would be silently useless in the audit trail.\n */\nfunction deriveResource(options: UnifiedTrackingOptions): string {\n const explicit = options.activityOptions?.resourceType ?? options.resourceType;\n if (explicit && explicit.trim().length > 0) return explicit;\n\n const op = options.operationName;\n if (op && op.trim().length > 0) {\n const [head] = op.split('.');\n if (head && head.trim().length > 0) return head;\n }\n return 'unknown';\n}\n\n/**\n * Build the layer-appropriate `RecordActivityInput`.\n *\n * Exported for unit testing: the whole class of defect this guards against is a payload that is\n * structurally plausible but rejected by the owning subgraph, which — because delivery is\n * fire-and-forget — is invisible at runtime.\n */\nexport function buildActivityInput(options: UnifiedTrackingOptions, layer: ActivityLayer): Record<string, unknown> {\n const actOpts = options.activityOptions;\n\n // `action` is REQUIRED by both layers. It is the field that was previously sent as the\n // (non-existent) `activityType`, which made every audit write fail validation.\n const action = actOpts?.activityType ?? options.action ?? options.operationName ?? 'unknown';\n\n const description = actOpts?.description ?? `${options.operationName ?? 'operation'} executed`;\n const resourceType = actOpts?.resourceType ?? options.resourceType;\n const resourceId = actOpts?.resourceId ?? options.resourceId;\n const workspaceId = actOpts?.workspaceId ?? options.workspaceId;\n\n const metadata: Record<string, unknown> = {\n ...actOpts?.metadata,\n success: options.success ?? true,\n ...(options.operationName ? { operationName: options.operationName } : {}),\n ...(options.errorMessage ? { errorMessage: options.errorMessage } : {}),\n };\n\n const input: Record<string, unknown> =\n layer === 'global'\n ? {\n action,\n // Required (non-nullable) on global-activity-svc.\n resource: deriveResource(options),\n description,\n resourceType,\n resourceId,\n userId: options.userId,\n actorId: options.userId,\n tenantId: options.tenantId,\n workspaceId,\n metadata,\n }\n : {\n action,\n description,\n resourceType,\n resourceId,\n workspaceId,\n targetUserId: actOpts?.targetUserId,\n teamId: actOpts?.teamId,\n productId: options.productId,\n success: options.success ?? true,\n ...(options.errorMessage ? { errorMessage: options.errorMessage } : {}),\n metadata: { ...metadata, userId: options.userId },\n };\n\n return input;\n}\n\n/**\n * Fire-and-forget activity log via GraphQL.\n * Never throws — logs errors at warn level and continues.\n */\nasync function fireActivityLog(\n gatewayUrl: string,\n options: UnifiedTrackingOptions,\n layer: ActivityLayer\n): Promise<void> {\n try {\n const actOpts = options.activityOptions;\n const input = buildActivityInput(options, layer);\n\n // Strip undefined values\n for (const key of Object.keys(input)) {\n if (input[key] === undefined) delete input[key];\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Forward actor context if available\n if (options.userId) {\n headers['x-actor-id'] = options.userId;\n headers['x-actor-type'] = 'service';\n }\n if (options.workspaceId ?? actOpts?.workspaceId) {\n headers['x-workspace-id'] = (options.workspaceId ?? actOpts?.workspaceId) as string;\n }\n\n const response = await fetch(gatewayUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n query: LOG_ACTIVITY_MUTATION,\n variables: { input },\n }),\n signal: AbortSignal.timeout(5000), // 5s timeout — never block the caller\n });\n\n if (!response.ok) {\n logger.warn(`[trackOperation] Activity log HTTP ${response.status}: ${options.operationName}`);\n return;\n }\n\n // A GraphQL validation/execution failure is returned as HTTP 200 with an `errors` array.\n // Without this check a malformed payload is indistinguishable from a successful write, which\n // is exactly how a fleet-wide audit outage stayed invisible: every call \"succeeded\" at the\n // HTTP layer while the subgraph rejected the input.\n const body = (await response.json().catch(() => undefined)) as { errors?: Array<{ message?: string }> } | undefined;\n\n const errors = body?.errors;\n if (errors && errors.length > 0) {\n const detail = errors\n .map((e) => e?.message ?? 'unknown error')\n .join('; ')\n .slice(0, 500);\n logger.error(\n `[trackOperation] Activity log REJECTED by ${layer}-activity subgraph for ` +\n `\"${options.operationName ?? 'operation'}\": ${detail}`\n );\n }\n } catch (err) {\n // Fire-and-forget: log but never throw\n logger.warn(`[trackOperation] Activity log failed: ${(err as Error).message}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main trackOperation function\n// ---------------------------------------------------------------------------\n\n/**\n * Simple tracker class with auto-promoting behavior\n */\nexport class UnifiedTrackerStub {\n private static instance: UnifiedTrackerStub;\n\n static getInstance(): UnifiedTrackerStub {\n if (!UnifiedTrackerStub.instance) {\n UnifiedTrackerStub.instance = new UnifiedTrackerStub();\n }\n return UnifiedTrackerStub.instance;\n }\n\n async track(event: TrackingEvent): Promise<void> {\n const gatewayUrl = getGatewayUrl();\n if (gatewayUrl) {\n await fireActivityLog(\n gatewayUrl,\n {\n operationName: event.eventType,\n userId: event.userId,\n workspaceId: event.workspaceId,\n resourceType: event.entityType,\n resourceId: event.entityId,\n activityOptions: {\n activityType: event.eventType,\n metadata: event.metadata,\n workspaceId: event.workspaceId,\n resourceType: event.entityType,\n resourceId: event.entityId,\n enabled: true,\n },\n },\n getGatewayLayer()\n );\n } else {\n logger.debug('[UnifiedTracker:Stub]', event.eventType, event.entityType, event.entityId);\n }\n }\n\n async trackBatch(events: TrackingEvent[]): Promise<void> {\n for (const event of events) {\n await this.track(event);\n }\n }\n}\n\nexport const trackerStub = UnifiedTrackerStub.getInstance();\n\n/**\n * Unified tracking function — auto-promoting\n *\n * When a gateway URL is configured (WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL),\n * this function makes real fire-and-forget GraphQL calls for activity logging.\n * When no gateway URL is configured, it falls back to debug-level logging (stub mode).\n *\n * RBAC checks are NOT performed here — they are handled by gateway @rbac directives.\n * The rbacCheck option is accepted for interface compatibility but not enforced.\n *\n * @param options - Tracking options\n * @returns Always returns true (never blocks the calling operation)\n */\nexport async function trackOperation(options: UnifiedTrackingOptions): Promise<boolean> {\n const { operationName, userId, success = true } = options;\n const gatewayUrl = getGatewayUrl();\n\n if (!gatewayUrl) {\n // Stub mode — debug log only\n logger.debug(`[trackOperation:Stub] ${operationName} for user ${userId} - success: ${success}`);\n return true;\n }\n\n // Real mode — fire-and-forget activity logging\n const activityEnabled = options.activityOptions?.enabled !== false;\n\n if (activityEnabled) {\n // Do NOT await — fire and forget so we never block the caller\n void fireActivityLog(gatewayUrl, options, getGatewayLayer());\n } else {\n logger.debug(`[trackOperation] ${operationName} for user ${userId} - activity disabled, skipping`);\n }\n\n return true;\n}\n\n/**\n * Product tracker type definition\n */\nexport type ProductTracker = {\n track: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n freeUp: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackActivityOnly: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackUsageOnly: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackCustom: (operationName: string, additionalOptions: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n productId: string;\n userId: string;\n billingAccountId: string | undefined;\n defaultContext: Partial<UnifiedTrackingOptions> | undefined;\n};\n\n/**\n * Create a product-scoped tracker (auto-promoting implementation)\n *\n * @param productId - Product identifier\n * @param userId - User identifier\n * @param billingAccountId - Optional billing account ID\n * @param defaultContext - Optional default tracking context\n * @returns Product tracker instance\n */\nexport function createProductTracker(\n productId: string,\n userId: string,\n billingAccountId?: string,\n defaultContext?: Partial<UnifiedTrackingOptions>\n): ProductTracker {\n return {\n async track(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n });\n },\n async freeUp(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: {\n ...defaultContext?.activityOptions,\n ...additionalOptions?.activityOptions,\n activityType: 'free_up',\n },\n });\n },\n async trackActivityOnly(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: { ...defaultContext?.activityOptions, ...additionalOptions?.activityOptions, enabled: true },\n usageOptions: { enabled: false },\n });\n },\n async trackUsageOnly(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: { enabled: false },\n usageOptions: { ...defaultContext?.usageOptions, ...additionalOptions?.usageOptions, enabled: true },\n });\n },\n async trackCustom(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n });\n },\n productId,\n userId,\n billingAccountId,\n defaultContext,\n };\n}\n\n/**\n * Constants for tracking\n */\nexport const UNIFIED_TRACKER_CONSTANTS = {\n DEFAULT_PRODUCT_ID: 'module',\n OPERATIONS: {} as const,\n PRODUCTS: {} as const,\n} as const;\n","/**\n * Unified Tracker Module\n * Aggregates RBAC + Activity + Usage + Notifications in single function call\n * This is the MOST IMPORTANT module that products should use for most operations\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { PermissionDeniedError, QuotaExceededError, ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\nimport { RBACModule, type CheckPermissionOptions } from '../rbac/index.js';\nimport { ActivityModule, ActivityType, ActivityStatus, ActivitySeverity } from '../activity/index.js';\nimport { UsageModule, type UsageMetricType, type TrackUsageOptions } from '../usage/index.js';\nimport { NotificationsModule, NotificationType } from '../notifications/index.js';\n\nexport interface TrackOptions {\n /** User performing the action */\n userId: string;\n /** Action being performed */\n action: string;\n /** Resource type */\n resourceType: string;\n /** Optional resource ID */\n resourceId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n\n /** RBAC options */\n rbac?: {\n /** Check permission before executing (default: true) */\n enabled?: boolean;\n /** Custom permission action (defaults to action parameter) */\n permissionAction?: string;\n };\n\n /** Activity tracking options */\n activity?: {\n /** Enable activity tracking (default: true) */\n enabled?: boolean;\n /** Activity type (auto-inferred if not provided) */\n activityType?: ActivityType;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Severity level */\n severity?: ActivitySeverity;\n };\n\n /** Usage tracking options */\n usage?: {\n /** Enable usage tracking (default: true) */\n enabled?: boolean;\n /** Metric type to track */\n metricType: UsageMetricType;\n /** Amount to track */\n amount?: number;\n /** Check quota before executing (default: true) */\n checkQuota?: boolean;\n /** Entity type for quota check */\n entityType?: 'user' | 'workspace' | 'organization';\n };\n\n /** Notification options */\n notification?: {\n /** Send notification on success */\n onSuccess?: {\n title: string;\n message: string;\n type?: NotificationType;\n /** Additional user IDs to notify */\n additionalUserIds?: string[];\n };\n /** Send notification on failure */\n onFailure?: {\n title: string;\n message: string;\n type?: NotificationType;\n /** Additional user IDs to notify */\n additionalUserIds?: string[];\n };\n };\n}\n\nexport interface TrackResult {\n success: boolean;\n /** Permission check result */\n permissionGranted: boolean;\n /** Quota check result (if quota checking enabled) */\n quotaAvailable?: boolean;\n quotaRemaining?: number;\n /** Activity record ID */\n activityId?: string;\n /** Usage record ID */\n usageRecordId?: string;\n /** Notification IDs sent */\n notificationIds?: string[];\n /** Error if operation failed */\n error?: {\n type: 'permission' | 'quota' | 'validation' | 'unknown';\n message: string;\n details?: Record<string, unknown>;\n };\n /** Operation duration in milliseconds */\n duration: number;\n}\n\n/**\n * Unified Tracker Module\n *\n * The primary module products should use for tracking operations.\n * Automatically handles RBAC checks, activity logging, usage tracking, and notifications.\n *\n * @example\n * ```typescript\n * const result = await sdk.tracker.track({\n * userId: 'user123',\n * action: 'create_project',\n * resourceType: 'project',\n * workspaceId: 'ws123',\n * usage: {\n * metricType: UsageMetricType.PROJECTS,\n * amount: 1,\n * checkQuota: true,\n * },\n * notification: {\n * onSuccess: {\n * title: 'Project Created',\n * message: 'Your project has been created successfully',\n * },\n * },\n * });\n *\n * if (!result.success) {\n * // Handle error\n * }\n * ```\n */\nexport class TrackerModule {\n private rbac: RBACModule;\n private activity: ActivityModule;\n private usage: UsageModule;\n private notifications: NotificationsModule;\n\n constructor(\n client: BurdenoffGraphQLClient,\n private context: SDKContext = {}\n ) {\n this.rbac = new RBACModule(client, context);\n this.activity = new ActivityModule(client, context);\n this.usage = new UsageModule(client, context);\n this.notifications = new NotificationsModule(client, context);\n }\n\n /**\n * Track operation with RBAC, Activity, Usage, and Notifications\n * This is the primary method products should use\n */\n public async track(options: TrackOptions): Promise<TrackResult> {\n const startTime = Date.now();\n const result: TrackResult = {\n success: false,\n permissionGranted: false,\n duration: 0,\n };\n\n try {\n // Validate required fields\n this.validateOptions(options);\n\n // Step 1: Check RBAC permission (if enabled)\n if (options.rbac?.enabled !== false) {\n await this.checkPermission(options, result);\n if (!result.permissionGranted) {\n result.duration = Date.now() - startTime;\n await this.logFailedActivity(options, result, startTime);\n return result;\n }\n } else {\n result.permissionGranted = true;\n }\n\n // Step 2: Check quota (if usage tracking enabled and checkQuota is true)\n if (options.usage?.enabled !== false && options.usage?.checkQuota !== false) {\n await this.checkQuota(options, result);\n if (result.quotaAvailable === false) {\n result.duration = Date.now() - startTime;\n await this.logFailedActivity(options, result, startTime);\n return result;\n }\n }\n\n // Step 3: Track usage (if enabled)\n if (options.usage?.enabled !== false && options.usage?.metricType) {\n await this.trackUsage(options, result);\n }\n\n // Step 4: Log successful activity (if enabled)\n if (options.activity?.enabled !== false) {\n await this.logSuccessActivity(options, result, startTime);\n }\n\n // Step 5: Send success notification (if configured)\n if (options.notification?.onSuccess) {\n await this.sendSuccessNotification(options, result);\n }\n\n result.success = true;\n result.duration = Date.now() - startTime;\n\n logger.info('[Tracker] Operation tracked successfully', {\n action: options.action,\n duration: result.duration,\n });\n\n return result;\n } catch (error) {\n result.duration = Date.now() - startTime;\n result.success = false;\n\n // Categorize error\n if (error instanceof PermissionDeniedError) {\n result.error = {\n type: 'permission',\n message: error.message,\n details: error.details,\n };\n } else if (error instanceof QuotaExceededError) {\n result.error = {\n type: 'quota',\n message: error.message,\n details: error.details,\n };\n } else if (error instanceof ValidationError) {\n result.error = {\n type: 'validation',\n message: error.message,\n details: error.details,\n };\n } else {\n result.error = {\n type: 'unknown',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n\n // Log failed activity\n await this.logFailedActivity(options, result, startTime);\n\n // Send failure notification (if configured)\n if (options.notification?.onFailure) {\n await this.sendFailureNotification(options, result);\n }\n\n logger.error('[Tracker] Operation tracking failed', {\n action: options.action,\n error: result.error,\n duration: result.duration,\n });\n\n return result;\n }\n }\n\n /**\n * Track operation and throw on failure\n * Convenience method that throws errors instead of returning them in result\n */\n public async trackOrThrow(options: TrackOptions): Promise<TrackResult> {\n const result = await this.track(options);\n\n if (!result.success && result.error) {\n const errorMessage = result.error.message;\n const errorDetails = result.error.details;\n\n switch (result.error.type) {\n case 'permission':\n throw new PermissionDeniedError(errorMessage, errorDetails);\n case 'quota':\n throw new QuotaExceededError(errorMessage, errorDetails);\n case 'validation':\n throw new ValidationError(errorMessage, errorDetails);\n default:\n throw new Error(errorMessage);\n }\n }\n\n return result;\n }\n\n /**\n * Simplified track method for common operations\n */\n public async trackSimple(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metricType?: UsageMetricType\n ): Promise<boolean> {\n const result = await this.track({\n userId,\n action,\n resourceType,\n resourceId,\n workspaceId: this.context.workspaceId,\n usage: metricType\n ? {\n enabled: true,\n metricType,\n amount: 1,\n checkQuota: true,\n }\n : { enabled: false, metricType: 'api_calls' as UsageMetricType },\n });\n\n return result.success;\n }\n\n /**\n * Validate tracking options\n */\n private validateOptions(options: TrackOptions): void {\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n }\n\n /**\n * Check RBAC permission\n */\n private async checkPermission(options: TrackOptions, result: TrackResult): Promise<void> {\n const permissionOptions: CheckPermissionOptions = {\n userId: options.userId,\n action: options.rbac?.permissionAction || options.action,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n workspaceId: options.workspaceId,\n };\n\n const hasPermission = await this.rbac.checkPermission(permissionOptions);\n result.permissionGranted = hasPermission;\n\n if (!hasPermission) {\n result.error = {\n type: 'permission',\n message: 'Permission denied',\n details: permissionOptions as unknown as Record<string, unknown>,\n };\n }\n }\n\n /**\n * Check quota availability\n */\n private async checkQuota(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.usage?.metricType) {\n return;\n }\n\n const entityType = options.usage.entityType || 'user';\n let entityId: string;\n\n if (entityType === 'workspace') {\n entityId = options.workspaceId || options.userId;\n } else if (entityType === 'organization') {\n entityId = options.organizationId || options.userId;\n } else {\n entityId = options.userId;\n }\n\n const quotaCheck = await this.usage.checkQuota({\n entityId,\n entityType,\n metricType: options.usage.metricType,\n requestedAmount: options.usage.amount || 1,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n result.quotaAvailable = quotaCheck.allowed;\n result.quotaRemaining = quotaCheck.remainingQuota;\n\n if (!quotaCheck.allowed) {\n result.error = {\n type: 'quota',\n message: quotaCheck.reason || 'Quota exceeded',\n details: {\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n requestedAmount: options.usage.amount || 1,\n },\n };\n }\n }\n\n /**\n * Track usage\n */\n private async trackUsage(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.usage?.metricType) {\n return;\n }\n\n const entityType = options.usage.entityType || 'user';\n let entityId: string;\n\n if (entityType === 'workspace') {\n entityId = options.workspaceId || options.userId;\n } else if (entityType === 'organization') {\n entityId = options.organizationId || options.userId;\n } else {\n entityId = options.userId;\n }\n\n const trackOptions: TrackUsageOptions = {\n entityId,\n entityType,\n metricType: options.usage.metricType,\n amount: options.usage.amount || 1,\n resourceId: options.resourceId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n };\n\n const usageRecord = await this.usage.track(trackOptions);\n result.usageRecordId = usageRecord.id;\n }\n\n /**\n * Log successful activity\n */\n private async logSuccessActivity(options: TrackOptions, result: TrackResult, startTime: number): Promise<void> {\n const activityRecord = await this.activity.log({\n userId: options.userId,\n activityType: options.activity?.activityType || this.inferActivityType(options.action),\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: ActivityStatus.SUCCESS,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.activity?.ipAddress,\n userAgent: options.activity?.userAgent,\n metadata: options.activity?.metadata,\n severity: options.activity?.severity || ActivitySeverity.LOW,\n duration: Date.now() - startTime,\n });\n\n result.activityId = activityRecord.id;\n }\n\n /**\n * Log failed activity\n */\n private async logFailedActivity(options: TrackOptions, result: TrackResult, startTime: number): Promise<void> {\n if (options.activity?.enabled === false) {\n return;\n }\n\n try {\n const activityRecord = await this.activity.log({\n userId: options.userId,\n activityType: options.activity?.activityType || this.inferActivityType(options.action),\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: ActivityStatus.FAILURE,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.activity?.ipAddress,\n userAgent: options.activity?.userAgent,\n metadata: options.activity?.metadata,\n severity: ActivitySeverity.HIGH,\n errorMessage: result.error?.message,\n duration: Date.now() - startTime,\n });\n\n result.activityId = activityRecord.id;\n } catch (error) {\n logger.error('[Tracker] Failed to log activity', { error });\n }\n }\n\n /**\n * Send success notification\n */\n private async sendSuccessNotification(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.notification?.onSuccess) {\n return;\n }\n\n try {\n const userIds = [options.userId, ...(options.notification.onSuccess.additionalUserIds || [])];\n\n const response = await this.notifications.send({\n title: options.notification.onSuccess.title,\n message: options.notification.onSuccess.message,\n type: options.notification.onSuccess.type || NotificationType.SUCCESS,\n userIds,\n });\n\n result.notificationIds = response.notificationIds;\n } catch (error) {\n logger.error('[Tracker] Failed to send success notification', { error });\n }\n }\n\n /**\n * Send failure notification\n */\n private async sendFailureNotification(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.notification?.onFailure) {\n return;\n }\n\n try {\n const userIds = [options.userId, ...(options.notification.onFailure.additionalUserIds || [])];\n\n const response = await this.notifications.send({\n title: options.notification.onFailure.title,\n message: options.notification.onFailure.message,\n type: options.notification.onFailure.type || NotificationType.ERROR,\n userIds,\n });\n\n result.notificationIds = response.notificationIds;\n } catch (error) {\n logger.error('[Tracker] Failed to send failure notification', { error });\n }\n }\n\n /**\n * Infer activity type from action\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) return ActivityType.CREATE;\n if (actionLower.includes('update') || actionLower.includes('edit')) return ActivityType.UPDATE;\n if (actionLower.includes('delete') || actionLower.includes('remove')) return ActivityType.DELETE;\n if (actionLower.includes('read') || actionLower.includes('view')) return ActivityType.READ;\n if (actionLower.includes('login')) return ActivityType.LOGIN;\n if (actionLower.includes('logout')) return ActivityType.LOGOUT;\n if (actionLower.includes('export')) return ActivityType.EXPORT;\n if (actionLower.includes('import')) return ActivityType.IMPORT;\n if (actionLower.includes('share')) return ActivityType.SHARE;\n if (actionLower.includes('download')) return ActivityType.DOWNLOAD;\n if (actionLower.includes('upload')) return ActivityType.UPLOAD;\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Batch track multiple operations\n */\n public async trackBatch(operations: TrackOptions[]): Promise<TrackResult[]> {\n logger.debug('[Tracker] Batch tracking operations', { count: operations.length });\n\n const results = await Promise.all(operations.map((op) => this.track(op)));\n\n logger.info('[Tracker] Batch tracking completed', {\n total: results.length,\n successful: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n });\n\n return results;\n }\n}\n\n// Export stub implementation for services that don't need full tracking\nexport {\n trackOperation,\n createProductTracker,\n UnifiedTrackerStub,\n trackerStub,\n UNIFIED_TRACKER_CONSTANTS,\n} from './stub.js';\nexport type {\n TrackingEvent,\n RbacCheckOptions,\n UsageTrackingOptions,\n ActivityTrackingOptions,\n UnifiedTrackingOptions,\n ProductTracker,\n} from './stub.js';\n\n// Re-export UsageMetricType from usage module for convenience\nexport { UsageMetricType } from '../usage/index.js';\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { TemporalClient, TemporalClientFactory, TemporalModule, TemporalWorker, TemporalWorkerFactory, TemporalWorkerManager } from './chunk-IC7YDBGE.js';
|
|
2
|
-
import { ActivityModule, UsageModule, TrackerModule } from './chunk-
|
|
3
|
-
export { ActivityModule, TrackerModule, UsageModule } from './chunk-
|
|
2
|
+
import { ActivityModule, UsageModule, TrackerModule } from './chunk-VOJROV6C.js';
|
|
3
|
+
export { ActivityModule, TrackerModule, UsageModule } from './chunk-VOJROV6C.js';
|
|
4
4
|
export { platform_exports as Platform } from './chunk-YCKM7FS7.js';
|
|
5
5
|
export { prisma_exports as Prisma } from './chunk-YQ6FYE37.js';
|
|
6
6
|
import { RBACModule } from './chunk-S32JOMMW.js';
|
|
@@ -10,8 +10,8 @@ export { sharing_exports as Sharing } from './chunk-XD5ZK727.js';
|
|
|
10
10
|
export { instrumentation_exports as Instrumentation } from './chunk-ACYGOENW.js';
|
|
11
11
|
import './chunk-REF7PANB.js';
|
|
12
12
|
export { middleware_exports as Middleware } from './chunk-2HANKZZM.js';
|
|
13
|
-
import { TenantNotificationsModule, NotificationsModule } from './chunk-
|
|
14
|
-
export { tenant_notifications_exports as Notifications, NotificationsModule } from './chunk-
|
|
13
|
+
import { TenantNotificationsModule, NotificationsModule } from './chunk-TORD32GS.js';
|
|
14
|
+
export { tenant_notifications_exports as Notifications, NotificationsModule } from './chunk-TORD32GS.js';
|
|
15
15
|
export { observability_exports as Observability } from './chunk-5LXDPGDH.js';
|
|
16
16
|
export { export_exports as Export } from './chunk-PQJ6MN4U.js';
|
|
17
17
|
export { feature_flags_exports as FeatureFlags } from './chunk-WM5COTOD.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { NotificationChannel, NotificationPriority, NotificationType, NotificationsModule, TenantNotificationsModule } from '../chunk-
|
|
1
|
+
export { NotificationChannel, NotificationPriority, NotificationType, NotificationsModule, TenantNotificationsModule } from '../chunk-TORD32GS.js';
|
|
2
2
|
import '../chunk-QGBXVNRM.js';
|
|
3
3
|
import '../chunk-YFOHAHZE.js';
|
|
4
4
|
import '../chunk-CBZNP6RF.js';
|
package/dist/tracker/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, createProductTracker, trackOperation, trackerStub } from '../chunk-
|
|
1
|
+
export { TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, createProductTracker, trackOperation, trackerStub } from '../chunk-VOJROV6C.js';
|
|
2
2
|
import '../chunk-S32JOMMW.js';
|
|
3
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-TORD32GS.js';
|
|
4
4
|
import '../chunk-QGBXVNRM.js';
|
|
5
5
|
import '../chunk-YFOHAHZE.js';
|
|
6
6
|
import '../chunk-CBZNP6RF.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/be-sdk",
|
|
3
|
-
"version": "2026.722.
|
|
3
|
+
"version": "2026.722.3",
|
|
4
4
|
"description": "Backend SDK for Burdenoff products providing unified access to notifications, RBAC, activity tracking, usage monitoring, and more",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -1 +0,0 @@
|
|
|
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-ZMCD5XAK.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"]}
|