@burdenoff/be-sdk 2026.927.5 → 2026.1002.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-KW55Q6TA.js → chunk-RDSYCRHC.js} +101 -23
- package/dist/chunk-RDSYCRHC.js.map +1 -0
- package/dist/{index-CDPSJW0O.d.ts → index-MsCFY9Ht.d.ts} +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/tracker/index.d.ts +1 -1
- package/dist/tracker/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-KW55Q6TA.js.map +0 -1
|
@@ -3,6 +3,7 @@ import { NotificationsModule, NotificationType } from './chunk-INAZ3PKF.js';
|
|
|
3
3
|
import { ValidationError, QuotaExceededError, PermissionDeniedError } from './chunk-QGBXVNRM.js';
|
|
4
4
|
import { logger } from './chunk-RU266375.js';
|
|
5
5
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
6
|
+
import { randomUUID } from 'crypto';
|
|
6
7
|
|
|
7
8
|
// src/activity/index.ts
|
|
8
9
|
var ActivityType = /* @__PURE__ */ (function(ActivityType2) {
|
|
@@ -945,8 +946,6 @@ var UsageModule = class {
|
|
|
945
946
|
return response.trackUsageBulk;
|
|
946
947
|
}
|
|
947
948
|
};
|
|
948
|
-
|
|
949
|
-
// src/tracker/stub.ts
|
|
950
949
|
var _gatewayUrl;
|
|
951
950
|
var _gatewayLayer;
|
|
952
951
|
var _gatewayUrlResolved = false;
|
|
@@ -1046,9 +1045,87 @@ function buildActivityInput(options, layer) {
|
|
|
1046
1045
|
userId: options.userId
|
|
1047
1046
|
}
|
|
1048
1047
|
};
|
|
1048
|
+
input["dedupeKey"] = actOpts?.dedupeKey ?? `sdk:${randomUUID()}`;
|
|
1049
1049
|
return input;
|
|
1050
1050
|
}
|
|
1051
1051
|
__name(buildActivityInput, "buildActivityInput");
|
|
1052
|
+
var ACTIVITY_ATTEMPT_TIMEOUT_MS = 5e3;
|
|
1053
|
+
var DEFAULT_ACTIVITY_RETRY_DELAYS_MS = [
|
|
1054
|
+
1e3,
|
|
1055
|
+
3e3,
|
|
1056
|
+
8e3
|
|
1057
|
+
];
|
|
1058
|
+
var activityRetryDelaysMs = DEFAULT_ACTIVITY_RETRY_DELAYS_MS;
|
|
1059
|
+
var RETRYABLE_HTTP_STATUSES = /* @__PURE__ */ new Set([
|
|
1060
|
+
408,
|
|
1061
|
+
425,
|
|
1062
|
+
429,
|
|
1063
|
+
500,
|
|
1064
|
+
502,
|
|
1065
|
+
503,
|
|
1066
|
+
504
|
|
1067
|
+
]);
|
|
1068
|
+
var RETRYABLE_GRAPHQL_CODES = /* @__PURE__ */ new Set([
|
|
1069
|
+
"INTERNAL_SERVER_ERROR",
|
|
1070
|
+
"SERVICE_UNAVAILABLE",
|
|
1071
|
+
"AUTH_SERVICE_UNAVAILABLE",
|
|
1072
|
+
"DOWNSTREAM_SERVICE_ERROR",
|
|
1073
|
+
"GATEWAY_TIMEOUT"
|
|
1074
|
+
]);
|
|
1075
|
+
function classifyGraphQLErrors(errors) {
|
|
1076
|
+
const detail = errors.map((e) => e?.message ?? "unknown error").join("; ").slice(0, 500);
|
|
1077
|
+
const transient = errors.every((e) => {
|
|
1078
|
+
const code = e?.extensions?.code;
|
|
1079
|
+
return typeof code === "string" && RETRYABLE_GRAPHQL_CODES.has(code);
|
|
1080
|
+
});
|
|
1081
|
+
return transient ? {
|
|
1082
|
+
kind: "transient",
|
|
1083
|
+
detail
|
|
1084
|
+
} : {
|
|
1085
|
+
kind: "rejected",
|
|
1086
|
+
detail
|
|
1087
|
+
};
|
|
1088
|
+
}
|
|
1089
|
+
__name(classifyGraphQLErrors, "classifyGraphQLErrors");
|
|
1090
|
+
async function attemptActivityDelivery(gatewayUrl, headers, input) {
|
|
1091
|
+
try {
|
|
1092
|
+
const response = await fetch(gatewayUrl, {
|
|
1093
|
+
method: "POST",
|
|
1094
|
+
headers,
|
|
1095
|
+
body: JSON.stringify({
|
|
1096
|
+
query: LOG_ACTIVITY_MUTATION,
|
|
1097
|
+
variables: {
|
|
1098
|
+
input
|
|
1099
|
+
}
|
|
1100
|
+
}),
|
|
1101
|
+
signal: AbortSignal.timeout(ACTIVITY_ATTEMPT_TIMEOUT_MS)
|
|
1102
|
+
});
|
|
1103
|
+
if (!response.ok) {
|
|
1104
|
+
const detail = `HTTP ${response.status}`;
|
|
1105
|
+
return RETRYABLE_HTTP_STATUSES.has(response.status) ? {
|
|
1106
|
+
kind: "transient",
|
|
1107
|
+
detail
|
|
1108
|
+
} : {
|
|
1109
|
+
kind: "rejected",
|
|
1110
|
+
detail
|
|
1111
|
+
};
|
|
1112
|
+
}
|
|
1113
|
+
const body = await response.json().catch(() => void 0);
|
|
1114
|
+
const errors = body?.errors;
|
|
1115
|
+
if (errors && errors.length > 0) {
|
|
1116
|
+
return classifyGraphQLErrors(errors);
|
|
1117
|
+
}
|
|
1118
|
+
return {
|
|
1119
|
+
kind: "delivered"
|
|
1120
|
+
};
|
|
1121
|
+
} catch (err) {
|
|
1122
|
+
return {
|
|
1123
|
+
kind: "transient",
|
|
1124
|
+
detail: err.message
|
|
1125
|
+
};
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
__name(attemptActivityDelivery, "attemptActivityDelivery");
|
|
1052
1129
|
async function fireActivityLog(gatewayUrl, options, layer) {
|
|
1053
1130
|
try {
|
|
1054
1131
|
const actOpts = options.activityOptions;
|
|
@@ -1066,26 +1143,27 @@ async function fireActivityLog(gatewayUrl, options, layer) {
|
|
|
1066
1143
|
if (options.workspaceId ?? actOpts?.workspaceId) {
|
|
1067
1144
|
headers["x-workspace-id"] = options.workspaceId ?? actOpts?.workspaceId;
|
|
1068
1145
|
}
|
|
1069
|
-
const
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1146
|
+
const operation = options.operationName ?? "operation";
|
|
1147
|
+
const maxAttempts = activityRetryDelaysMs.length + 1;
|
|
1148
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
1149
|
+
const outcome = await attemptActivityDelivery(gatewayUrl, headers, input);
|
|
1150
|
+
if (outcome.kind === "delivered") {
|
|
1151
|
+
if (attempt > 1) {
|
|
1152
|
+
logger.info(`[trackOperation] Activity log delivered on attempt ${attempt}: ${operation}`);
|
|
1076
1153
|
}
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
logger.
|
|
1154
|
+
return;
|
|
1155
|
+
}
|
|
1156
|
+
if (outcome.kind === "rejected") {
|
|
1157
|
+
logger.error(`[trackOperation] Activity log REJECTED by ${layer}-activity subgraph for "${operation}": ${outcome.detail}`);
|
|
1158
|
+
return;
|
|
1159
|
+
}
|
|
1160
|
+
const delay = activityRetryDelaysMs[attempt - 1];
|
|
1161
|
+
if (delay === void 0) {
|
|
1162
|
+
logger.error(`[trackOperation] Activity log failed after ${attempt} attempts for "${operation}": ${outcome.detail}`);
|
|
1163
|
+
return;
|
|
1164
|
+
}
|
|
1165
|
+
logger.warn(`[trackOperation] Activity log attempt ${attempt} failed for "${operation}" (${outcome.detail}); retrying in ${delay}ms`);
|
|
1166
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
1089
1167
|
}
|
|
1090
1168
|
} catch (err) {
|
|
1091
1169
|
logger.warn(`[trackOperation] Activity log failed: ${err.message}`);
|
|
@@ -1617,5 +1695,5 @@ var TrackerModule = class {
|
|
|
1617
1695
|
};
|
|
1618
1696
|
|
|
1619
1697
|
export { ActivityModule, TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, UsageModule, createProductTracker, trackOperation, trackerStub };
|
|
1620
|
-
//# sourceMappingURL=chunk-
|
|
1621
|
-
//# sourceMappingURL=chunk-
|
|
1698
|
+
//# sourceMappingURL=chunk-RDSYCRHC.js.map
|
|
1699
|
+
//# sourceMappingURL=chunk-RDSYCRHC.js.map
|
|
@@ -0,0 +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","dedupeKey","randomUUID","ACTIVITY_ATTEMPT_TIMEOUT_MS","DEFAULT_ACTIVITY_RETRY_DELAYS_MS","activityRetryDelaysMs","RETRYABLE_HTTP_STATUSES","Set","RETRYABLE_GRAPHQL_CODES","classifyGraphQLErrors","errors","detail","map","e","join","slice","transient","every","code","extensions","has","kind","attemptActivityDelivery","gatewayUrl","headers","fetch","method","body","JSON","stringify","signal","AbortSignal","timeout","ok","json","catch","err","fireActivityLog","key","Object","keys","operation","maxAttempts","attempt","outcome","delay","Promise","resolve","setTimeout","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","all","total","successful","filter","r","failed"],"mappings":"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","file":"chunk-RDSYCRHC.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 { randomUUID } from 'node:crypto';\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 * Idempotency key forwarded to the activity owner's `RecordActivityInput.dedupeKey`.\n * When omitted, a unique key is generated per tracked operation so that delivery retries of the\n * SAME operation converge to exactly one activity row. Supply a stable key only when the caller\n * itself may replay the same logical event (backfill/import).\n */\n dedupeKey?: string;\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 // Both activity owners accept `dedupeKey` and return the existing row when it is replayed, which\n // is what makes delivery retries safe (a timed-out attempt may still have committed).\n input['dedupeKey'] = actOpts?.dedupeKey ?? `sdk:${randomUUID()}`;\n\n return input;\n}\n\n/**\n * Delivery policy for activity writes.\n *\n * A single attempt silently lost audit records whenever the internal gateway or the activity\n * subgraph was briefly unavailable (e.g. during a single-replica rolling deploy): the write timed\n * out, was logged at warn level, and the attributed activity never existed. Writes now retry\n * transient failures with backoff. Retrying is idempotent because every input carries a\n * `dedupeKey` (see {@link buildActivityInput}).\n */\nconst ACTIVITY_ATTEMPT_TIMEOUT_MS = 5000;\nconst DEFAULT_ACTIVITY_RETRY_DELAYS_MS: readonly number[] = [1000, 3000, 8000];\nlet activityRetryDelaysMs: readonly number[] = DEFAULT_ACTIVITY_RETRY_DELAYS_MS;\n\n/** HTTP statuses that mean \"the request may not have been processed — try again\". */\nconst RETRYABLE_HTTP_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);\n\n/**\n * GraphQL error codes that describe an unavailable dependency rather than a rejected payload.\n * The internal gateways mask an unreachable subgraph as INTERNAL_SERVER_ERROR, and surface request\n * validation failures as BAD_USER_INPUT (or with no code at all from graphql-js), so a payload the\n * owner rejects is never retried.\n */\nconst RETRYABLE_GRAPHQL_CODES = new Set([\n 'INTERNAL_SERVER_ERROR',\n 'SERVICE_UNAVAILABLE',\n 'AUTH_SERVICE_UNAVAILABLE',\n 'DOWNSTREAM_SERVICE_ERROR',\n 'GATEWAY_TIMEOUT',\n]);\n\n/**\n * Override the retry backoff schedule. Test-only seam so retry behaviour can be exercised without\n * real sleeps; pass `undefined` to restore the default schedule.\n */\nexport function __setActivityRetryDelaysForTests(delaysMs: readonly number[] | undefined): void {\n activityRetryDelaysMs = delaysMs ?? DEFAULT_ACTIVITY_RETRY_DELAYS_MS;\n}\n\ntype GraphQLErrorBody = { errors?: Array<{ message?: string; extensions?: { code?: unknown } }> };\n\ntype AttemptOutcome =\n | { kind: 'delivered' }\n | { kind: 'rejected'; detail: string }\n | { kind: 'transient'; detail: string };\n\nfunction classifyGraphQLErrors(errors: NonNullable<GraphQLErrorBody['errors']>): AttemptOutcome {\n const detail = errors\n .map((e) => e?.message ?? 'unknown error')\n .join('; ')\n .slice(0, 500);\n const transient = errors.every((e) => {\n const code = e?.extensions?.code;\n return typeof code === 'string' && RETRYABLE_GRAPHQL_CODES.has(code);\n });\n return transient ? { kind: 'transient', detail } : { kind: 'rejected', detail };\n}\n\nasync function attemptActivityDelivery(\n gatewayUrl: string,\n headers: Record<string, string>,\n input: Record<string, unknown>\n): Promise<AttemptOutcome> {\n try {\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(ACTIVITY_ATTEMPT_TIMEOUT_MS), // never block the caller for long\n });\n\n if (!response.ok) {\n const detail = `HTTP ${response.status}`;\n return RETRYABLE_HTTP_STATUSES.has(response.status)\n ? { kind: 'transient', detail }\n : { kind: 'rejected', detail };\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 GraphQLErrorBody | undefined;\n const errors = body?.errors;\n if (errors && errors.length > 0) {\n return classifyGraphQLErrors(errors);\n }\n return { kind: 'delivered' };\n } catch (err) {\n // Network failure or per-attempt timeout: the write may or may not have landed; the dedupeKey\n // makes a retry safe either way.\n return { kind: 'transient', detail: (err as Error).message };\n }\n}\n\n/**\n * Fire-and-forget activity log via GraphQL, retrying transient failures.\n * Never throws — logs errors 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 operation = options.operationName ?? 'operation';\n const maxAttempts = activityRetryDelaysMs.length + 1;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const outcome = await attemptActivityDelivery(gatewayUrl, headers, input);\n if (outcome.kind === 'delivered') {\n if (attempt > 1) {\n logger.info(`[trackOperation] Activity log delivered on attempt ${attempt}: ${operation}`);\n }\n return;\n }\n if (outcome.kind === 'rejected') {\n logger.error(\n `[trackOperation] Activity log REJECTED by ${layer}-activity subgraph for \"${operation}\": ${outcome.detail}`\n );\n return;\n }\n const delay = activityRetryDelaysMs[attempt - 1];\n if (delay === undefined) {\n // An audit record is about to be lost: this must be visible at error level.\n logger.error(\n `[trackOperation] Activity log failed after ${attempt} attempts for \"${operation}\": ${outcome.detail}`\n );\n return;\n }\n logger.warn(\n `[trackOperation] Activity log attempt ${attempt} failed for \"${operation}\" (${outcome.detail}); retrying in ${delay}ms`\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\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.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { T as TenantNotificationsModule, a as NotificationsModule } from './inde
|
|
|
7
7
|
export { t as Notifications } from './index-Cpr38QiE.js';
|
|
8
8
|
import { RBACModule } from './rbac/index.js';
|
|
9
9
|
export { LayerAwareRBACConfig, RBACDirectiveConfig, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv } from './rbac/index.js';
|
|
10
|
-
import { A as ActivityModule, U as UsageModule, T as TrackerModule } from './index-
|
|
10
|
+
import { A as ActivityModule, U as UsageModule, T as TrackerModule } from './index-MsCFY9Ht.js';
|
|
11
11
|
import { DatabaseConfig, DatabaseModule } from './database/index.js';
|
|
12
12
|
import { E as EventsModule, I as IEventPublisher } from './index-CQGCVFmI.js';
|
|
13
13
|
export { i as EventQueue } from './index-CQGCVFmI.js';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { TemporalClient, TemporalClientFactory, TemporalModule, TemporalWorker, TemporalWorkerFactory, TemporalWorkerManager } from './chunk-YNDJQRI3.js';
|
|
2
|
-
import { ActivityModule, UsageModule, TrackerModule } from './chunk-
|
|
3
|
-
export { ActivityModule, TrackerModule, UsageModule } from './chunk-
|
|
2
|
+
import { ActivityModule, UsageModule, TrackerModule } from './chunk-RDSYCRHC.js';
|
|
3
|
+
export { ActivityModule, TrackerModule, UsageModule } from './chunk-RDSYCRHC.js';
|
|
4
4
|
export { NAME_MAX_LENGTH, NAME_MIN_LENGTH, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, validation_exports as Validation, lengthInCodePoints, validateName, validateUserFields, validateUsername } from './chunk-Z32KFAPT.js';
|
|
5
5
|
export { platform_exports as Platform } from './chunk-Z5BURBFZ.js';
|
|
6
6
|
export { prisma_exports as Prisma } from './chunk-LNFGZMDB.js';
|
package/dist/tracker/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import '../graphql-Dxxpbzr3.js';
|
|
2
2
|
import '../index-B8viwwDM.js';
|
|
3
|
-
export { a as ActivityTrackingOptions, P as ProductTracker, R as RbacCheckOptions, b as TrackOptions, c as TrackResult, T as TrackerModule, d as TrackingEvent, e as UNIFIED_TRACKER_CONSTANTS, f as UnifiedTrackerStub, g as UnifiedTrackingOptions, h as UsageMetricType, i as UsageTrackingOptions, j as createProductTracker, t as trackOperation, k as trackerStub } from '../index-
|
|
3
|
+
export { a as ActivityTrackingOptions, P as ProductTracker, R as RbacCheckOptions, b as TrackOptions, c as TrackResult, T as TrackerModule, d as TrackingEvent, e as UNIFIED_TRACKER_CONSTANTS, f as UnifiedTrackerStub, g as UnifiedTrackingOptions, h as UsageMetricType, i as UsageTrackingOptions, j as createProductTracker, t as trackOperation, k as trackerStub } from '../index-MsCFY9Ht.js';
|
|
4
4
|
import '../index-Cpr38QiE.js';
|
|
5
5
|
import 'graphql-request';
|
|
6
6
|
import '../layer-GNAVXBMf.js';
|
package/dist/tracker/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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-RDSYCRHC.js';
|
|
2
2
|
import '../chunk-5JNHVKHG.js';
|
|
3
3
|
import '../chunk-INAZ3PKF.js';
|
|
4
4
|
import '../chunk-QGBXVNRM.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/be-sdk",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.1002.1",
|
|
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/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-KW55Q6TA.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"]}
|