@burdenoff/be-sdk 2026.721.2 → 2026.722.2
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/auth/index.d.ts +2 -2
- package/dist/{chunk-VSPK4WB7.js → chunk-7E76FL2C.js} +3 -3
- package/dist/{chunk-VSPK4WB7.js.map → chunk-7E76FL2C.js.map} +1 -1
- package/dist/{chunk-EB2I22WV.js → chunk-OCYZEBOL.js} +5 -2
- package/dist/chunk-OCYZEBOL.js.map +1 -0
- package/dist/{chunk-XN3DNXXV.js → chunk-TSV4KAZT.js} +92 -22
- package/dist/chunk-TSV4KAZT.js.map +1 -0
- package/dist/{chunk-MGACVHM7.js → chunk-YQ6FYE37.js} +7 -3
- package/dist/chunk-YQ6FYE37.js.map +1 -0
- package/dist/{client-Dhi02YAf.d.ts → client-CCXpAZ2r.d.ts} +1 -0
- package/dist/graph/index.d.ts +2 -2
- package/dist/graph/index.js +2 -2
- package/dist/{index-BfvCLSmh.d.ts → index-42_fqdmi.d.ts} +2 -1
- package/dist/{index-CGTwU6CR.d.ts → index-CUeQCuE5.d.ts} +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +6 -6
- package/dist/prisma/index.d.ts +2 -2
- package/dist/prisma/index.js +2 -2
- package/dist/server/index.d.ts +3 -3
- package/dist/tracker/index.js +1 -1
- package/dist/{types-DYE90pls.d.ts → types-DVG_lcsL.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-EB2I22WV.js.map +0 -1
- package/dist/chunk-MGACVHM7.js.map +0 -1
- package/dist/chunk-XN3DNXXV.js.map +0 -1
|
@@ -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","fireActivityLog","gatewayUrl","key","Object","keys","headers","fetch","method","body","JSON","stringify","signal","AbortSignal","timeout","ok","json","catch","errors","detail","map","e","join","slice","err","UnifiedTrackerStub","instance","getInstance","event","eventType","enabled","trackBatch","events","trackerStub","trackOperation","activityEnabled","createProductTracker","billingAccountId","defaultContext","additionalOptions","freeUp","trackActivityOnly","usageOptions","trackUsageOnly","trackCustom","UNIFIED_TRACKER_CONSTANTS","DEFAULT_PRODUCT_ID","OPERATIONS","PRODUCTS","TrackerModule","rbac","activity","notifications","RBACModule","NotificationsModule","startTime","Date","now","permissionGranted","validateOptions","checkPermission","logFailedActivity","quotaAvailable","logSuccessActivity","notification","onSuccess","sendSuccessNotification","PermissionDeniedError","type","details","onFailure","sendFailureNotification","trackOrThrow","errorDetails","trackSimple","permissionOptions","permissionAction","hasPermission","quotaRemaining","remainingQuota","trackOptions","usageRecord","usageRecordId","activityRecord","SUCCESS","LOW","FAILURE","HIGH","userIds","additionalUserIds","send","title","NotificationType","notificationIds","ERROR","CREATE","UPDATE","DELETE","READ","LOGIN","LOGOUT","EXPORT","IMPORT","SHARE","DOWNLOAD","UPLOAD","CUSTOM","operations","results","Promise","all","total","successful","filter","r","failed"],"mappings":"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","file":"chunk-TSV4KAZT.js","sourcesContent":["/**\n * Activity Tracking Module\n * Comprehensive audit trail and activity logging for all operations\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum ActivityType {\n CREATE = 'create',\n READ = 'read',\n UPDATE = 'update',\n DELETE = 'delete',\n LOGIN = 'login',\n LOGOUT = 'logout',\n EXPORT = 'export',\n IMPORT = 'import',\n SHARE = 'share',\n DOWNLOAD = 'download',\n UPLOAD = 'upload',\n EXECUTE = 'execute',\n APPROVE = 'approve',\n REJECT = 'reject',\n CUSTOM = 'custom',\n}\n\nexport enum ActivityStatus {\n SUCCESS = 'success',\n FAILURE = 'failure',\n PENDING = 'pending',\n WARNING = 'warning',\n}\n\nexport enum ActivitySeverity {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface LogActivityOptions {\n /** User performing the action */\n userId: string;\n /** Type of activity */\n activityType: ActivityType;\n /** Resource type being acted upon */\n resourceType: string;\n /** Resource ID */\n resourceId?: string;\n /** Action performed */\n action: string;\n /** Activity status */\n status: ActivityStatus;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Severity level */\n severity?: ActivitySeverity;\n /** Error message if failed */\n errorMessage?: string;\n /** Duration in milliseconds */\n duration?: number;\n}\n\nexport interface Activity {\n id: string;\n userId: string;\n activityType: ActivityType;\n resourceType: string;\n resourceId?: string;\n action: string;\n status: ActivityStatus;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n ipAddress?: string;\n userAgent?: string;\n metadata?: Record<string, unknown>;\n severity: ActivitySeverity;\n errorMessage?: string;\n duration?: number;\n createdAt: string;\n}\n\nexport interface GetActivitiesOptions {\n /** Filter by user */\n userId?: string;\n /** Filter by workspace */\n workspaceId?: string;\n /** Filter by organization */\n organizationId?: string;\n /** Filter by project */\n projectId?: string;\n /** Filter by activity type */\n activityType?: ActivityType;\n /** Filter by resource type */\n resourceType?: string;\n /** Filter by resource ID */\n resourceId?: string;\n /** Filter by status */\n status?: ActivityStatus;\n /** Filter by severity */\n severity?: ActivitySeverity;\n /** Filter by date range */\n startDate?: string;\n endDate?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Sort by field */\n sortBy?: 'createdAt' | 'duration' | 'severity';\n /** Sort order */\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface ActivityStats {\n totalActivities: number;\n successCount: number;\n failureCount: number;\n pendingCount: number;\n warningCount: number;\n averageDuration?: number;\n activitiesByType: Record<string, number>;\n activitiesBySeverity: Record<string, number>;\n topUsers: Array<{ userId: string; count: number }>;\n topResources: Array<{ resourceType: string; count: number }>;\n}\n\n/**\n * Activity Tracking Module\n */\nexport class ActivityModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Log activity\n */\n public async log(options: LogActivityOptions): Promise<Activity> {\n // Validate required fields\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.activityType) {\n throw new ValidationError('Activity type is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.status) {\n throw new ValidationError('Status is required');\n }\n\n logger.debug('[Activity] Logging activity', {\n userId: options.userId,\n action: options.action,\n resourceType: options.resourceType,\n });\n\n const recordActivityMutation = `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const legacyLogActivityMutation = `\n mutation LogActivity($input: LogActivityInput!) {\n logActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const variables = {\n input: {\n userId: options.userId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: options.status,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.ipAddress,\n userAgent: options.userAgent,\n metadata: options.metadata,\n severity: options.severity || ActivitySeverity.LOW,\n errorMessage: options.errorMessage,\n duration: options.duration,\n },\n };\n\n try {\n const response = await this.client.query<{ recordActivity: Activity }>(\n recordActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged', { activityId: response.recordActivity.id });\n return response.recordActivity;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isRecordActivityUnavailable =\n message.includes('Cannot query field \"recordActivity\"') ||\n message.includes('Unknown type \"RecordActivityInput\"');\n\n if (!isRecordActivityUnavailable) {\n throw error;\n }\n\n logger.warn('[Activity] Falling back to legacy logActivity mutation', {\n reason: message,\n });\n\n const legacyResponse = await this.client.query<{ logActivity: Activity }>(\n legacyLogActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged (legacy)', { activityId: legacyResponse.logActivity.id });\n return legacyResponse.logActivity;\n }\n }\n\n /**\n * Log activity with automatic status detection\n */\n public async logSuccess(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.SUCCESS,\n severity: ActivitySeverity.LOW,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Log failed activity\n */\n public async logFailure(\n userId: string,\n action: string,\n resourceType: string,\n errorMessage: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.FAILURE,\n severity: ActivitySeverity.HIGH,\n errorMessage,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Get activities with filters\n */\n public async getActivities(options: GetActivitiesOptions): Promise<{\n activities: Activity[];\n total: number;\n }> {\n logger.debug('[Activity] Getting activities', options);\n\n const query = `\n query GetActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $resourceId: ID\n $status: ActivityStatus\n $severity: ActivitySeverity\n $startDate: DateTime\n $endDate: DateTime\n $search: String\n $limit: Int\n $offset: Int\n $sortBy: String\n $sortOrder: String\n ) {\n getActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n resourceId: $resourceId\n status: $status\n severity: $severity\n startDate: $startDate\n endDate: $endDate\n search: $search\n limit: $limit\n offset: $offset\n sortBy: $sortBy\n sortOrder: $sortOrder\n ) {\n activities {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n total\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n status: options.status,\n severity: options.severity,\n startDate: options.startDate,\n endDate: options.endDate,\n search: options.search,\n limit: options.limit || 50,\n offset: options.offset || 0,\n sortBy: options.sortBy || 'createdAt',\n sortOrder: options.sortOrder || 'desc',\n };\n\n const response = await this.client.query<{\n getActivities: { activities: Activity[]; total: number };\n }>(query, variables, this.context);\n\n return response.getActivities;\n }\n\n /**\n * Get activity by ID\n */\n public async getActivity(activityId: string): Promise<Activity> {\n logger.debug('[Activity] Getting activity', { activityId });\n\n const query = `\n query GetActivity($activityId: ID!) {\n getActivity(activityId: $activityId) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getActivity: Activity }>(query, { activityId }, this.context);\n\n return response.getActivity;\n }\n\n /**\n * Get activity statistics\n */\n public async getStats(options: Omit<GetActivitiesOptions, 'limit' | 'offset'>): Promise<ActivityStats> {\n logger.debug('[Activity] Getting activity stats', options);\n\n const query = `\n query GetActivityStats(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $startDate: DateTime\n $endDate: DateTime\n ) {\n getActivityStats(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n startDate: $startDate\n endDate: $endDate\n ) {\n totalActivities\n successCount\n failureCount\n pendingCount\n warningCount\n averageDuration\n activitiesByType\n activitiesBySeverity\n topUsers {\n userId\n count\n }\n topResources {\n resourceType\n count\n }\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n startDate: options.startDate,\n endDate: options.endDate,\n };\n\n const response = await this.client.query<{ getActivityStats: ActivityStats }>(query, variables, this.context);\n\n return response.getActivityStats;\n }\n\n /**\n * Delete old activities (cleanup)\n */\n public async cleanup(olderThanDays: number, workspaceId?: string): Promise<number> {\n logger.debug('[Activity] Cleaning up old activities', { olderThanDays, workspaceId });\n\n const mutation = `\n mutation CleanupActivities($olderThanDays: Int!, $workspaceId: ID) {\n cleanupActivities(olderThanDays: $olderThanDays, workspaceId: $workspaceId) {\n deletedCount\n }\n }\n `;\n\n const response = await this.client.query<{\n cleanupActivities: { deletedCount: number };\n }>(mutation, { olderThanDays, workspaceId }, this.context);\n\n logger.info('[Activity] Cleanup completed', {\n deletedCount: response.cleanupActivities.deletedCount,\n });\n\n return response.cleanupActivities.deletedCount;\n }\n\n /**\n * Infer activity type from action string\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) {\n return ActivityType.CREATE;\n }\n if (actionLower.includes('update') || actionLower.includes('edit') || actionLower.includes('modify')) {\n return ActivityType.UPDATE;\n }\n if (actionLower.includes('delete') || actionLower.includes('remove')) {\n return ActivityType.DELETE;\n }\n if (actionLower.includes('read') || actionLower.includes('view') || actionLower.includes('get')) {\n return ActivityType.READ;\n }\n if (actionLower.includes('login') || actionLower.includes('signin')) {\n return ActivityType.LOGIN;\n }\n if (actionLower.includes('logout') || actionLower.includes('signout')) {\n return ActivityType.LOGOUT;\n }\n if (actionLower.includes('export')) {\n return ActivityType.EXPORT;\n }\n if (actionLower.includes('import')) {\n return ActivityType.IMPORT;\n }\n if (actionLower.includes('share')) {\n return ActivityType.SHARE;\n }\n if (actionLower.includes('download')) {\n return ActivityType.DOWNLOAD;\n }\n if (actionLower.includes('upload')) {\n return ActivityType.UPLOAD;\n }\n if (actionLower.includes('execute') || actionLower.includes('run')) {\n return ActivityType.EXECUTE;\n }\n if (actionLower.includes('approve')) {\n return ActivityType.APPROVE;\n }\n if (actionLower.includes('reject')) {\n return ActivityType.REJECT;\n }\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Export activities to CSV\n */\n public async exportToCSV(options: GetActivitiesOptions): Promise<string> {\n logger.debug('[Activity] Exporting activities to CSV');\n\n const query = `\n query ExportActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $startDate: DateTime\n $endDate: DateTime\n ) {\n exportActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n startDate: $startDate\n endDate: $endDate\n ) {\n csvData\n }\n }\n `;\n\n const response = await this.client.query<{ exportActivities: { csvData: string } }>(\n query,\n {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n startDate: options.startDate,\n endDate: options.endDate,\n },\n this.context\n );\n\n logger.info('[Activity] Activities exported to CSV');\n\n return response.exportActivities.csvData;\n }\n}\n","/**\n * Usage & Quota Module\n * Track resource usage, enforce quotas, and manage billing\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError, QuotaExceededError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum UsageMetricType {\n API_CALLS = 'api_calls',\n STORAGE = 'storage',\n BANDWIDTH = 'bandwidth',\n USERS = 'users',\n PROJECTS = 'projects',\n WORKSPACES = 'workspaces',\n RECORDS = 'records',\n COMPUTE_TIME = 'compute_time',\n TRANSACTIONS = 'transactions',\n CUSTOM = 'custom',\n}\n\nexport enum QuotaPeriod {\n DAILY = 'daily',\n WEEKLY = 'weekly',\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n LIFETIME = 'lifetime',\n}\n\n/**\n * Entity type for usage tracking\n */\nexport type UsageEntityType = 'user' | 'workspace' | 'organization';\n\nexport interface TrackUsageOptions {\n /** User or workspace consuming the resource */\n entityId: string;\n /** Type of entity (user or workspace) */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to increment */\n amount: number;\n /** Optional resource identifier */\n resourceId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface CheckQuotaOptions {\n /** Entity to check quota for */\n entityId: string;\n /** Type of entity */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to check availability for */\n requestedAmount: number;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface QuotaCheckResult {\n allowed: boolean;\n currentUsage: number;\n quotaLimit: number;\n remainingQuota: number;\n resetAt?: string;\n period: QuotaPeriod;\n reason?: string;\n}\n\nexport interface UsageRecord {\n id: string;\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n amount: number;\n resourceId?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n recordedAt: string;\n}\n\nexport interface UsageSummary {\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n totalUsage: number;\n period: QuotaPeriod;\n periodStart: string;\n periodEnd: string;\n quotaLimit?: number;\n utilizationPercentage?: number;\n}\n\nexport interface SetQuotaOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n workspaceId?: string;\n organizationId?: string;\n}\n\nexport interface Quota {\n id: string;\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n currentUsage: number;\n resetAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface GetUsageOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType?: UsageMetricType;\n startDate?: string;\n endDate?: string;\n workspaceId?: string;\n organizationId?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Usage & Quota Module\n */\nexport class UsageModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Track usage\n */\n public async track(options: TrackUsageOptions): Promise<UsageRecord> {\n // Validate inputs\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.entityType) {\n throw new ValidationError('Entity type is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.amount !== 'number' || options.amount <= 0) {\n throw new ValidationError('Amount must be a positive number');\n }\n\n logger.debug('[Usage] Tracking usage', {\n entityId: options.entityId,\n metricType: options.metricType,\n amount: options.amount,\n });\n\n const mutation = `\n mutation TrackUsage($input: TrackUsageInput!) {\n trackUsage(input: $input) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n amount: options.amount,\n resourceId: options.resourceId,\n metadata: options.metadata,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ trackUsage: UsageRecord }>(mutation, variables, this.context);\n\n logger.info('[Usage] Usage tracked', { recordId: response.trackUsage.id });\n\n return response.trackUsage;\n }\n\n /**\n * Check quota availability\n */\n public async checkQuota(options: CheckQuotaOptions): Promise<QuotaCheckResult> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.requestedAmount !== 'number' || options.requestedAmount <= 0) {\n throw new ValidationError('Requested amount must be a positive number');\n }\n\n logger.debug('[Usage] Checking quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n });\n\n const query = `\n query CheckQuota($input: CheckQuotaInput!) {\n checkQuota(input: $input) {\n allowed\n currentUsage\n quotaLimit\n remainingQuota\n resetAt\n period\n reason\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ checkQuota: QuotaCheckResult }>(query, variables, this.context);\n\n logger.debug('[Usage] Quota check result', { allowed: response.checkQuota.allowed });\n\n return response.checkQuota;\n }\n\n /**\n * Require quota (throws if exceeded)\n */\n public async requireQuota(options: CheckQuotaOptions): Promise<void> {\n const result = await this.checkQuota(options);\n\n if (!result.allowed) {\n throw new QuotaExceededError(result.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: result.currentUsage,\n quotaLimit: result.quotaLimit,\n requestedAmount: options.requestedAmount,\n resetAt: result.resetAt,\n });\n }\n }\n\n /**\n * Track usage and check quota atomically\n */\n public async trackAndCheck(options: TrackUsageOptions): Promise<{\n usage: UsageRecord;\n quotaCheck: QuotaCheckResult;\n }> {\n // First check quota\n const quotaCheck = await this.checkQuota({\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.amount,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n if (!quotaCheck.allowed) {\n throw new QuotaExceededError(quotaCheck.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n });\n }\n\n // Track usage\n const usage = await this.track(options);\n\n return { usage, quotaCheck };\n }\n\n /**\n * Get usage records\n */\n public async getUsage(options: GetUsageOptions): Promise<{\n records: UsageRecord[];\n total: number;\n }> {\n logger.debug('[Usage] Getting usage records', { entityId: options.entityId });\n\n const query = `\n query GetUsage(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType\n $startDate: DateTime\n $endDate: DateTime\n $workspaceId: ID\n $organizationId: ID\n $limit: Int\n $offset: Int\n ) {\n getUsage(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n startDate: $startDate\n endDate: $endDate\n workspaceId: $workspaceId\n organizationId: $organizationId\n limit: $limit\n offset: $offset\n ) {\n records {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n total\n }\n }\n `;\n\n const variables = {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n startDate: options.startDate,\n endDate: options.endDate,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n limit: options.limit || 100,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getUsage: { records: UsageRecord[]; total: number };\n }>(query, variables, this.context);\n\n return response.getUsage;\n }\n\n /**\n * Get usage summary\n */\n public async getSummary(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType,\n period: QuotaPeriod\n ): Promise<UsageSummary> {\n logger.debug('[Usage] Getting usage summary', { entityId, metricType, period });\n\n const query = `\n query GetUsageSummary(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType!\n $period: QuotaPeriod!\n ) {\n getUsageSummary(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n period: $period\n ) {\n entityId\n entityType\n metricType\n totalUsage\n period\n periodStart\n periodEnd\n quotaLimit\n utilizationPercentage\n }\n }\n `;\n\n const response = await this.client.query<{ getUsageSummary: UsageSummary }>(\n query,\n { entityId, entityType, metricType, period },\n this.context\n );\n\n return response.getUsageSummary;\n }\n\n /**\n * Set quota limit\n */\n public async setQuota(options: SetQuotaOptions): Promise<Quota> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.limit !== 'number' || options.limit < 0) {\n throw new ValidationError('Limit must be a non-negative number');\n }\n\n logger.debug('[Usage] Setting quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n limit: options.limit,\n });\n\n const mutation = `\n mutation SetQuota($input: SetQuotaInput!) {\n setQuota(input: $input) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n limit: options.limit,\n period: options.period,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ setQuota: Quota }>(mutation, variables, this.context);\n\n logger.info('[Usage] Quota set', { quotaId: response.setQuota.id });\n\n return response.setQuota;\n }\n\n /**\n * Get quota\n */\n public async getQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<Quota | null> {\n logger.debug('[Usage] Getting quota', { entityId, metricType });\n\n const query = `\n query GetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n getQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuota: Quota | null }>(\n query,\n { entityId, entityType, metricType },\n this.context\n );\n\n return response.getQuota;\n }\n\n /**\n * Get all quotas for entity\n */\n public async getQuotas(entityId: string, entityType: UsageEntityType): Promise<Quota[]> {\n logger.debug('[Usage] Getting all quotas', { entityId, entityType });\n\n const query = `\n query GetQuotas($entityId: ID!, $entityType: String!) {\n getQuotas(entityId: $entityId, entityType: $entityType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuotas: Quota[] }>(query, { entityId, entityType }, this.context);\n\n return response.getQuotas;\n }\n\n /**\n * Reset quota usage\n */\n public async resetQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Resetting quota', { entityId, metricType });\n\n const mutation = `\n mutation ResetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n resetQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota reset', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Delete quota\n */\n public async deleteQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Deleting quota', { entityId, metricType });\n\n const mutation = `\n mutation DeleteQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n deleteQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota deleted', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Bulk track usage\n */\n public async trackBulk(records: TrackUsageOptions[]): Promise<UsageRecord[]> {\n logger.debug('[Usage] Bulk tracking usage', { count: records.length });\n\n const mutation = `\n mutation TrackUsageBulk($records: [TrackUsageInput!]!) {\n trackUsageBulk(records: $records) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const response = await this.client.query<{ trackUsageBulk: UsageRecord[] }>(mutation, { records }, this.context);\n\n logger.info('[Usage] Bulk usage tracked', { count: response.trackUsageBulk.length });\n\n return response.trackUsageBulk;\n }\n}\n","/**\n * Unified Tracking — Auto-Promoting Implementation\n *\n * Automatically promotes from stub to real tracking when gateway URLs are configured.\n * When WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL is set, this module will:\n * - Log activity events via GraphQL to the activity service\n * - Track usage via GraphQL to the usage service (if usage options provided)\n * - RBAC checks are NOT performed here (handled by gateway @rbac directives)\n *\n * When no gateway URL is configured, falls back to debug-level logging (stub mode).\n *\n * This is a backward-compatible drop-in replacement for the original stub. All 1,100+\n * existing call sites continue to work without modification.\n *\n * @module tracker/stub\n * @category Tracking\n */\nimport { logger } from '../logger/index.js';\n\n/**\n * Tracking event interface\n */\nexport interface TrackingEvent {\n eventType: string;\n entityType: string;\n entityId: string;\n userId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n timestamp?: Date;\n}\n\n/**\n * RBAC check options\n */\nexport interface RbacCheckOptions {\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n skipRbacCheck?: boolean;\n options?: {\n allowOwnerAccess?: boolean;\n allowWorkspaceAdmin?: boolean;\n scope?: string;\n };\n}\n\n/**\n * Usage tracking options\n */\nexport interface UsageTrackingOptions {\n billingAccountId?: string;\n addUsage?: boolean;\n description?: string;\n tags?: Record<string, unknown>;\n quotaName?: string;\n value?: number;\n}\n\n/**\n * Activity tracking options\n */\nexport interface ActivityTrackingOptions {\n activityType?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n teamId?: string;\n groupId?: string;\n projectId?: string;\n targetUserId?: string;\n resourceType?: string;\n resourceId?: string;\n enabled?: boolean;\n}\n\n/**\n * Unified tracking options\n */\nexport interface UnifiedTrackingOptions {\n operationName?: string;\n userId?: string;\n context?: unknown;\n rbacCheck?: RbacCheckOptions;\n activityOptions?: ActivityTrackingOptions;\n usageOptions?: UsageTrackingOptions & { enabled?: boolean };\n success?: boolean;\n errorMessage?: string;\n productId?: string;\n // Legacy properties for backward compatibility (can be at top level or in nested objects)\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n tenantId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Gateway URL resolution — cached at module level for performance\n// ---------------------------------------------------------------------------\n\nlet _gatewayUrl: string | undefined;\nlet _gatewayLayer: ActivityLayer | undefined;\nlet _gatewayUrlResolved = false;\n\n/**\n * Which activity subgraph the resolved gateway fronts.\n *\n * The two canonical activity owners accept DIFFERENT `RecordActivityInput` shapes, so the\n * payload must be built per layer:\n * - `wspace` → wspace-activity-svc: requires `action`; carries workspace-scoped fields\n * (workspaceId/teamId/targetUserId/productId/success).\n * - `global` → global-activity-svc: requires `action` AND `resource`; carries tenant-scoped\n * fields (tenantId/actorId/ipAddress/userAgent).\n * Sending one layer's shape to the other fails GraphQL validation.\n */\nexport type ActivityLayer = 'wspace' | 'global';\n\n/**\n * Resolve the internal gateway URL from environment.\n * Workspace services use WSPACE_INT_GATEWAY_URL, global services use GLOBAL_INT_GATEWAY_URL.\n * Falls back to undefined (stub mode) if neither is set.\n */\nfunction getGatewayUrl(): string | undefined {\n if (!_gatewayUrlResolved) {\n const wspaceUrl = process.env['WSPACE_INT_GATEWAY_URL'];\n const globalUrl = process.env['GLOBAL_INT_GATEWAY_URL'];\n\n if (wspaceUrl) {\n _gatewayUrl = wspaceUrl;\n _gatewayLayer = 'wspace';\n } else if (globalUrl) {\n _gatewayUrl = globalUrl;\n _gatewayLayer = 'global';\n } else {\n _gatewayUrl = undefined;\n _gatewayLayer = undefined;\n }\n _gatewayUrlResolved = true;\n\n if (_gatewayUrl) {\n logger.info(`[trackOperation] Real tracking enabled via ${_gatewayLayer} gateway: ${_gatewayUrl}`);\n } else {\n logger.debug('[trackOperation] No gateway URL configured — running in stub mode');\n }\n }\n return _gatewayUrl;\n}\n\n/**\n * Resolve which activity layer the configured gateway fronts.\n * Always call `getGatewayUrl()` first — it performs the resolution.\n */\nfunction getGatewayLayer(): ActivityLayer {\n // Default to 'wspace': the overwhelming majority of services are workspace-layer, and a wspace\n // payload omits only optional global fields, so a mis-detection degrades rather than fails.\n return _gatewayLayer ?? 'wspace';\n}\n\n/**\n * Reset the cached gateway resolution. Test-only seam — module-level caching would otherwise make\n * per-layer behaviour untestable within a single process.\n */\nexport function __resetGatewayCacheForTests(): void {\n _gatewayUrl = undefined;\n _gatewayLayer = undefined;\n _gatewayUrlResolved = false;\n}\n\n// ---------------------------------------------------------------------------\n// Fire-and-forget GraphQL helper\n// ---------------------------------------------------------------------------\n\nconst LOG_ACTIVITY_MUTATION = /* GraphQL */ `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n }\n }\n`;\n\n/**\n * Derive the `resource` value required by global-activity-svc.\n *\n * Prefers an explicit resourceType; otherwise falls back to the leading dotted segment of the\n * operation name (`auth.session.revoke` → `auth`), which matches the platform's\n * `<domain>.<resource>.<verb>` activity taxonomy. Never returns empty — `resource` is non-nullable\n * on global-activity-svc and an empty string would be silently useless in the audit trail.\n */\nfunction deriveResource(options: UnifiedTrackingOptions): string {\n const explicit = options.activityOptions?.resourceType ?? options.resourceType;\n if (explicit && explicit.trim().length > 0) return explicit;\n\n const op = options.operationName;\n if (op && op.trim().length > 0) {\n const [head] = op.split('.');\n if (head && head.trim().length > 0) return head;\n }\n return 'unknown';\n}\n\n/**\n * Build the layer-appropriate `RecordActivityInput`.\n *\n * Exported for unit testing: the whole class of defect this guards against is a payload that is\n * structurally plausible but rejected by the owning subgraph, which — because delivery is\n * fire-and-forget — is invisible at runtime.\n */\nexport function buildActivityInput(options: UnifiedTrackingOptions, layer: ActivityLayer): Record<string, unknown> {\n const actOpts = options.activityOptions;\n\n // `action` is REQUIRED by both layers. It is the field that was previously sent as the\n // (non-existent) `activityType`, which made every audit write fail validation.\n const action = actOpts?.activityType ?? options.action ?? options.operationName ?? 'unknown';\n\n const description = actOpts?.description ?? `${options.operationName ?? 'operation'} executed`;\n const resourceType = actOpts?.resourceType ?? options.resourceType;\n const resourceId = actOpts?.resourceId ?? options.resourceId;\n const workspaceId = actOpts?.workspaceId ?? options.workspaceId;\n\n const metadata: Record<string, unknown> = {\n ...actOpts?.metadata,\n success: options.success ?? true,\n ...(options.operationName ? { operationName: options.operationName } : {}),\n ...(options.errorMessage ? { errorMessage: options.errorMessage } : {}),\n };\n\n const input: Record<string, unknown> =\n layer === 'global'\n ? {\n action,\n // Required (non-nullable) on global-activity-svc.\n resource: deriveResource(options),\n description,\n resourceType,\n resourceId,\n userId: options.userId,\n actorId: options.userId,\n tenantId: options.tenantId,\n workspaceId,\n metadata,\n }\n : {\n action,\n description,\n resourceType,\n resourceId,\n workspaceId,\n targetUserId: actOpts?.targetUserId,\n teamId: actOpts?.teamId,\n productId: options.productId,\n success: options.success ?? true,\n ...(options.errorMessage ? { errorMessage: options.errorMessage } : {}),\n metadata: { ...metadata, userId: options.userId },\n };\n\n return input;\n}\n\n/**\n * Fire-and-forget activity log via GraphQL.\n * Never throws — logs errors at warn level and continues.\n */\nasync function fireActivityLog(\n gatewayUrl: string,\n options: UnifiedTrackingOptions,\n layer: ActivityLayer\n): Promise<void> {\n try {\n const actOpts = options.activityOptions;\n const input = buildActivityInput(options, layer);\n\n // Strip undefined values\n for (const key of Object.keys(input)) {\n if (input[key] === undefined) delete input[key];\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Forward actor context if available\n if (options.userId) {\n headers['x-actor-id'] = options.userId;\n headers['x-actor-type'] = 'service';\n }\n if (options.workspaceId ?? actOpts?.workspaceId) {\n headers['x-workspace-id'] = (options.workspaceId ?? actOpts?.workspaceId) as string;\n }\n\n const response = await fetch(gatewayUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n query: LOG_ACTIVITY_MUTATION,\n variables: { input },\n }),\n signal: AbortSignal.timeout(5000), // 5s timeout — never block the caller\n });\n\n if (!response.ok) {\n logger.warn(`[trackOperation] Activity log HTTP ${response.status}: ${options.operationName}`);\n return;\n }\n\n // A GraphQL validation/execution failure is returned as HTTP 200 with an `errors` array.\n // Without this check a malformed payload is indistinguishable from a successful write, which\n // is exactly how a fleet-wide audit outage stayed invisible: every call \"succeeded\" at the\n // HTTP layer while the subgraph rejected the input.\n const body = (await response.json().catch(() => undefined)) as { errors?: Array<{ message?: string }> } | undefined;\n\n const errors = body?.errors;\n if (errors && errors.length > 0) {\n const detail = errors\n .map((e) => e?.message ?? 'unknown error')\n .join('; ')\n .slice(0, 500);\n logger.error(\n `[trackOperation] Activity log REJECTED by ${layer}-activity subgraph for ` +\n `\"${options.operationName ?? 'operation'}\": ${detail}`\n );\n }\n } catch (err) {\n // Fire-and-forget: log but never throw\n logger.warn(`[trackOperation] Activity log failed: ${(err as Error).message}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main trackOperation function\n// ---------------------------------------------------------------------------\n\n/**\n * Simple tracker class with auto-promoting behavior\n */\nexport class UnifiedTrackerStub {\n private static instance: UnifiedTrackerStub;\n\n static getInstance(): UnifiedTrackerStub {\n if (!UnifiedTrackerStub.instance) {\n UnifiedTrackerStub.instance = new UnifiedTrackerStub();\n }\n return UnifiedTrackerStub.instance;\n }\n\n async track(event: TrackingEvent): Promise<void> {\n const gatewayUrl = getGatewayUrl();\n if (gatewayUrl) {\n await fireActivityLog(\n gatewayUrl,\n {\n operationName: event.eventType,\n userId: event.userId,\n workspaceId: event.workspaceId,\n resourceType: event.entityType,\n resourceId: event.entityId,\n activityOptions: {\n activityType: event.eventType,\n metadata: event.metadata,\n workspaceId: event.workspaceId,\n resourceType: event.entityType,\n resourceId: event.entityId,\n enabled: true,\n },\n },\n getGatewayLayer()\n );\n } else {\n logger.debug('[UnifiedTracker:Stub]', event.eventType, event.entityType, event.entityId);\n }\n }\n\n async trackBatch(events: TrackingEvent[]): Promise<void> {\n for (const event of events) {\n await this.track(event);\n }\n }\n}\n\nexport const trackerStub = UnifiedTrackerStub.getInstance();\n\n/**\n * Unified tracking function — auto-promoting\n *\n * When a gateway URL is configured (WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL),\n * this function makes real fire-and-forget GraphQL calls for activity logging.\n * When no gateway URL is configured, it falls back to debug-level logging (stub mode).\n *\n * RBAC checks are NOT performed here — they are handled by gateway @rbac directives.\n * The rbacCheck option is accepted for interface compatibility but not enforced.\n *\n * @param options - Tracking options\n * @returns Always returns true (never blocks the calling operation)\n */\nexport async function trackOperation(options: UnifiedTrackingOptions): Promise<boolean> {\n const { operationName, userId, success = true } = options;\n const gatewayUrl = getGatewayUrl();\n\n if (!gatewayUrl) {\n // Stub mode — debug log only\n logger.debug(`[trackOperation:Stub] ${operationName} for user ${userId} - success: ${success}`);\n return true;\n }\n\n // Real mode — fire-and-forget activity logging\n const activityEnabled = options.activityOptions?.enabled !== false;\n\n if (activityEnabled) {\n // Do NOT await — fire and forget so we never block the caller\n void fireActivityLog(gatewayUrl, options, getGatewayLayer());\n } else {\n logger.debug(`[trackOperation] ${operationName} for user ${userId} - activity disabled, skipping`);\n }\n\n return true;\n}\n\n/**\n * Product tracker type definition\n */\nexport type ProductTracker = {\n track: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n freeUp: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackActivityOnly: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackUsageOnly: (operationName: string, additionalOptions?: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n trackCustom: (operationName: string, additionalOptions: Partial<UnifiedTrackingOptions>) => Promise<boolean>;\n productId: string;\n userId: string;\n billingAccountId: string | undefined;\n defaultContext: Partial<UnifiedTrackingOptions> | undefined;\n};\n\n/**\n * Create a product-scoped tracker (auto-promoting implementation)\n *\n * @param productId - Product identifier\n * @param userId - User identifier\n * @param billingAccountId - Optional billing account ID\n * @param defaultContext - Optional default tracking context\n * @returns Product tracker instance\n */\nexport function createProductTracker(\n productId: string,\n userId: string,\n billingAccountId?: string,\n defaultContext?: Partial<UnifiedTrackingOptions>\n): ProductTracker {\n return {\n async track(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n });\n },\n async freeUp(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: {\n ...defaultContext?.activityOptions,\n ...additionalOptions?.activityOptions,\n activityType: 'free_up',\n },\n });\n },\n async trackActivityOnly(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: { ...defaultContext?.activityOptions, ...additionalOptions?.activityOptions, enabled: true },\n usageOptions: { enabled: false },\n });\n },\n async trackUsageOnly(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n activityOptions: { enabled: false },\n usageOptions: { ...defaultContext?.usageOptions, ...additionalOptions?.usageOptions, enabled: true },\n });\n },\n async trackCustom(operationName, additionalOptions): Promise<boolean> {\n return trackOperation({\n ...defaultContext,\n productId,\n operationName,\n userId,\n ...additionalOptions,\n });\n },\n productId,\n userId,\n billingAccountId,\n defaultContext,\n };\n}\n\n/**\n * Constants for tracking\n */\nexport const UNIFIED_TRACKER_CONSTANTS = {\n DEFAULT_PRODUCT_ID: 'module',\n OPERATIONS: {} as const,\n PRODUCTS: {} as const,\n} as const;\n","/**\n * Unified Tracker Module\n * Aggregates RBAC + Activity + Usage + Notifications in single function call\n * This is the MOST IMPORTANT module that products should use for most operations\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { PermissionDeniedError, QuotaExceededError, ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\nimport { RBACModule, type CheckPermissionOptions } from '../rbac/index.js';\nimport { ActivityModule, ActivityType, ActivityStatus, ActivitySeverity } from '../activity/index.js';\nimport { UsageModule, type UsageMetricType, type TrackUsageOptions } from '../usage/index.js';\nimport { NotificationsModule, NotificationType } from '../notifications/index.js';\n\nexport interface TrackOptions {\n /** User performing the action */\n userId: string;\n /** Action being performed */\n action: string;\n /** Resource type */\n resourceType: string;\n /** Optional resource ID */\n resourceId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n\n /** RBAC options */\n rbac?: {\n /** Check permission before executing (default: true) */\n enabled?: boolean;\n /** Custom permission action (defaults to action parameter) */\n permissionAction?: string;\n };\n\n /** Activity tracking options */\n activity?: {\n /** Enable activity tracking (default: true) */\n enabled?: boolean;\n /** Activity type (auto-inferred if not provided) */\n activityType?: ActivityType;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Severity level */\n severity?: ActivitySeverity;\n };\n\n /** Usage tracking options */\n usage?: {\n /** Enable usage tracking (default: true) */\n enabled?: boolean;\n /** Metric type to track */\n metricType: UsageMetricType;\n /** Amount to track */\n amount?: number;\n /** Check quota before executing (default: true) */\n checkQuota?: boolean;\n /** Entity type for quota check */\n entityType?: 'user' | 'workspace' | 'organization';\n };\n\n /** Notification options */\n notification?: {\n /** Send notification on success */\n onSuccess?: {\n title: string;\n message: string;\n type?: NotificationType;\n /** Additional user IDs to notify */\n additionalUserIds?: string[];\n };\n /** Send notification on failure */\n onFailure?: {\n title: string;\n message: string;\n type?: NotificationType;\n /** Additional user IDs to notify */\n additionalUserIds?: string[];\n };\n };\n}\n\nexport interface TrackResult {\n success: boolean;\n /** Permission check result */\n permissionGranted: boolean;\n /** Quota check result (if quota checking enabled) */\n quotaAvailable?: boolean;\n quotaRemaining?: number;\n /** Activity record ID */\n activityId?: string;\n /** Usage record ID */\n usageRecordId?: string;\n /** Notification IDs sent */\n notificationIds?: string[];\n /** Error if operation failed */\n error?: {\n type: 'permission' | 'quota' | 'validation' | 'unknown';\n message: string;\n details?: Record<string, unknown>;\n };\n /** Operation duration in milliseconds */\n duration: number;\n}\n\n/**\n * Unified Tracker Module\n *\n * The primary module products should use for tracking operations.\n * Automatically handles RBAC checks, activity logging, usage tracking, and notifications.\n *\n * @example\n * ```typescript\n * const result = await sdk.tracker.track({\n * userId: 'user123',\n * action: 'create_project',\n * resourceType: 'project',\n * workspaceId: 'ws123',\n * usage: {\n * metricType: UsageMetricType.PROJECTS,\n * amount: 1,\n * checkQuota: true,\n * },\n * notification: {\n * onSuccess: {\n * title: 'Project Created',\n * message: 'Your project has been created successfully',\n * },\n * },\n * });\n *\n * if (!result.success) {\n * // Handle error\n * }\n * ```\n */\nexport class TrackerModule {\n private rbac: RBACModule;\n private activity: ActivityModule;\n private usage: UsageModule;\n private notifications: NotificationsModule;\n\n constructor(\n client: BurdenoffGraphQLClient,\n private context: SDKContext = {}\n ) {\n this.rbac = new RBACModule(client, context);\n this.activity = new ActivityModule(client, context);\n this.usage = new UsageModule(client, context);\n this.notifications = new NotificationsModule(client, context);\n }\n\n /**\n * Track operation with RBAC, Activity, Usage, and Notifications\n * This is the primary method products should use\n */\n public async track(options: TrackOptions): Promise<TrackResult> {\n const startTime = Date.now();\n const result: TrackResult = {\n success: false,\n permissionGranted: false,\n duration: 0,\n };\n\n try {\n // Validate required fields\n this.validateOptions(options);\n\n // Step 1: Check RBAC permission (if enabled)\n if (options.rbac?.enabled !== false) {\n await this.checkPermission(options, result);\n if (!result.permissionGranted) {\n result.duration = Date.now() - startTime;\n await this.logFailedActivity(options, result, startTime);\n return result;\n }\n } else {\n result.permissionGranted = true;\n }\n\n // Step 2: Check quota (if usage tracking enabled and checkQuota is true)\n if (options.usage?.enabled !== false && options.usage?.checkQuota !== false) {\n await this.checkQuota(options, result);\n if (result.quotaAvailable === false) {\n result.duration = Date.now() - startTime;\n await this.logFailedActivity(options, result, startTime);\n return result;\n }\n }\n\n // Step 3: Track usage (if enabled)\n if (options.usage?.enabled !== false && options.usage?.metricType) {\n await this.trackUsage(options, result);\n }\n\n // Step 4: Log successful activity (if enabled)\n if (options.activity?.enabled !== false) {\n await this.logSuccessActivity(options, result, startTime);\n }\n\n // Step 5: Send success notification (if configured)\n if (options.notification?.onSuccess) {\n await this.sendSuccessNotification(options, result);\n }\n\n result.success = true;\n result.duration = Date.now() - startTime;\n\n logger.info('[Tracker] Operation tracked successfully', {\n action: options.action,\n duration: result.duration,\n });\n\n return result;\n } catch (error) {\n result.duration = Date.now() - startTime;\n result.success = false;\n\n // Categorize error\n if (error instanceof PermissionDeniedError) {\n result.error = {\n type: 'permission',\n message: error.message,\n details: error.details,\n };\n } else if (error instanceof QuotaExceededError) {\n result.error = {\n type: 'quota',\n message: error.message,\n details: error.details,\n };\n } else if (error instanceof ValidationError) {\n result.error = {\n type: 'validation',\n message: error.message,\n details: error.details,\n };\n } else {\n result.error = {\n type: 'unknown',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n\n // Log failed activity\n await this.logFailedActivity(options, result, startTime);\n\n // Send failure notification (if configured)\n if (options.notification?.onFailure) {\n await this.sendFailureNotification(options, result);\n }\n\n logger.error('[Tracker] Operation tracking failed', {\n action: options.action,\n error: result.error,\n duration: result.duration,\n });\n\n return result;\n }\n }\n\n /**\n * Track operation and throw on failure\n * Convenience method that throws errors instead of returning them in result\n */\n public async trackOrThrow(options: TrackOptions): Promise<TrackResult> {\n const result = await this.track(options);\n\n if (!result.success && result.error) {\n const errorMessage = result.error.message;\n const errorDetails = result.error.details;\n\n switch (result.error.type) {\n case 'permission':\n throw new PermissionDeniedError(errorMessage, errorDetails);\n case 'quota':\n throw new QuotaExceededError(errorMessage, errorDetails);\n case 'validation':\n throw new ValidationError(errorMessage, errorDetails);\n default:\n throw new Error(errorMessage);\n }\n }\n\n return result;\n }\n\n /**\n * Simplified track method for common operations\n */\n public async trackSimple(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metricType?: UsageMetricType\n ): Promise<boolean> {\n const result = await this.track({\n userId,\n action,\n resourceType,\n resourceId,\n workspaceId: this.context.workspaceId,\n usage: metricType\n ? {\n enabled: true,\n metricType,\n amount: 1,\n checkQuota: true,\n }\n : { enabled: false, metricType: 'api_calls' as UsageMetricType },\n });\n\n return result.success;\n }\n\n /**\n * Validate tracking options\n */\n private validateOptions(options: TrackOptions): void {\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n }\n\n /**\n * Check RBAC permission\n */\n private async checkPermission(options: TrackOptions, result: TrackResult): Promise<void> {\n const permissionOptions: CheckPermissionOptions = {\n userId: options.userId,\n action: options.rbac?.permissionAction || options.action,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n workspaceId: options.workspaceId,\n };\n\n const hasPermission = await this.rbac.checkPermission(permissionOptions);\n result.permissionGranted = hasPermission;\n\n if (!hasPermission) {\n result.error = {\n type: 'permission',\n message: 'Permission denied',\n details: permissionOptions as unknown as Record<string, unknown>,\n };\n }\n }\n\n /**\n * Check quota availability\n */\n private async checkQuota(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.usage?.metricType) {\n return;\n }\n\n const entityType = options.usage.entityType || 'user';\n let entityId: string;\n\n if (entityType === 'workspace') {\n entityId = options.workspaceId || options.userId;\n } else if (entityType === 'organization') {\n entityId = options.organizationId || options.userId;\n } else {\n entityId = options.userId;\n }\n\n const quotaCheck = await this.usage.checkQuota({\n entityId,\n entityType,\n metricType: options.usage.metricType,\n requestedAmount: options.usage.amount || 1,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n result.quotaAvailable = quotaCheck.allowed;\n result.quotaRemaining = quotaCheck.remainingQuota;\n\n if (!quotaCheck.allowed) {\n result.error = {\n type: 'quota',\n message: quotaCheck.reason || 'Quota exceeded',\n details: {\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n requestedAmount: options.usage.amount || 1,\n },\n };\n }\n }\n\n /**\n * Track usage\n */\n private async trackUsage(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.usage?.metricType) {\n return;\n }\n\n const entityType = options.usage.entityType || 'user';\n let entityId: string;\n\n if (entityType === 'workspace') {\n entityId = options.workspaceId || options.userId;\n } else if (entityType === 'organization') {\n entityId = options.organizationId || options.userId;\n } else {\n entityId = options.userId;\n }\n\n const trackOptions: TrackUsageOptions = {\n entityId,\n entityType,\n metricType: options.usage.metricType,\n amount: options.usage.amount || 1,\n resourceId: options.resourceId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n };\n\n const usageRecord = await this.usage.track(trackOptions);\n result.usageRecordId = usageRecord.id;\n }\n\n /**\n * Log successful activity\n */\n private async logSuccessActivity(options: TrackOptions, result: TrackResult, startTime: number): Promise<void> {\n const activityRecord = await this.activity.log({\n userId: options.userId,\n activityType: options.activity?.activityType || this.inferActivityType(options.action),\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: ActivityStatus.SUCCESS,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.activity?.ipAddress,\n userAgent: options.activity?.userAgent,\n metadata: options.activity?.metadata,\n severity: options.activity?.severity || ActivitySeverity.LOW,\n duration: Date.now() - startTime,\n });\n\n result.activityId = activityRecord.id;\n }\n\n /**\n * Log failed activity\n */\n private async logFailedActivity(options: TrackOptions, result: TrackResult, startTime: number): Promise<void> {\n if (options.activity?.enabled === false) {\n return;\n }\n\n try {\n const activityRecord = await this.activity.log({\n userId: options.userId,\n activityType: options.activity?.activityType || this.inferActivityType(options.action),\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: ActivityStatus.FAILURE,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.activity?.ipAddress,\n userAgent: options.activity?.userAgent,\n metadata: options.activity?.metadata,\n severity: ActivitySeverity.HIGH,\n errorMessage: result.error?.message,\n duration: Date.now() - startTime,\n });\n\n result.activityId = activityRecord.id;\n } catch (error) {\n logger.error('[Tracker] Failed to log activity', { error });\n }\n }\n\n /**\n * Send success notification\n */\n private async sendSuccessNotification(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.notification?.onSuccess) {\n return;\n }\n\n try {\n const userIds = [options.userId, ...(options.notification.onSuccess.additionalUserIds || [])];\n\n const response = await this.notifications.send({\n title: options.notification.onSuccess.title,\n message: options.notification.onSuccess.message,\n type: options.notification.onSuccess.type || NotificationType.SUCCESS,\n userIds,\n });\n\n result.notificationIds = response.notificationIds;\n } catch (error) {\n logger.error('[Tracker] Failed to send success notification', { error });\n }\n }\n\n /**\n * Send failure notification\n */\n private async sendFailureNotification(options: TrackOptions, result: TrackResult): Promise<void> {\n if (!options.notification?.onFailure) {\n return;\n }\n\n try {\n const userIds = [options.userId, ...(options.notification.onFailure.additionalUserIds || [])];\n\n const response = await this.notifications.send({\n title: options.notification.onFailure.title,\n message: options.notification.onFailure.message,\n type: options.notification.onFailure.type || NotificationType.ERROR,\n userIds,\n });\n\n result.notificationIds = response.notificationIds;\n } catch (error) {\n logger.error('[Tracker] Failed to send failure notification', { error });\n }\n }\n\n /**\n * Infer activity type from action\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) return ActivityType.CREATE;\n if (actionLower.includes('update') || actionLower.includes('edit')) return ActivityType.UPDATE;\n if (actionLower.includes('delete') || actionLower.includes('remove')) return ActivityType.DELETE;\n if (actionLower.includes('read') || actionLower.includes('view')) return ActivityType.READ;\n if (actionLower.includes('login')) return ActivityType.LOGIN;\n if (actionLower.includes('logout')) return ActivityType.LOGOUT;\n if (actionLower.includes('export')) return ActivityType.EXPORT;\n if (actionLower.includes('import')) return ActivityType.IMPORT;\n if (actionLower.includes('share')) return ActivityType.SHARE;\n if (actionLower.includes('download')) return ActivityType.DOWNLOAD;\n if (actionLower.includes('upload')) return ActivityType.UPLOAD;\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Batch track multiple operations\n */\n public async trackBatch(operations: TrackOptions[]): Promise<TrackResult[]> {\n logger.debug('[Tracker] Batch tracking operations', { count: operations.length });\n\n const results = await Promise.all(operations.map((op) => this.track(op)));\n\n logger.info('[Tracker] Batch tracking completed', {\n total: results.length,\n successful: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n });\n\n return results;\n }\n}\n\n// Export stub implementation for services that don't need full tracking\nexport {\n trackOperation,\n createProductTracker,\n UnifiedTrackerStub,\n trackerStub,\n UNIFIED_TRACKER_CONSTANTS,\n} from './stub.js';\nexport type {\n TrackingEvent,\n RbacCheckOptions,\n UsageTrackingOptions,\n ActivityTrackingOptions,\n UnifiedTrackingOptions,\n ProductTracker,\n} from './stub.js';\n\n// Re-export UsageMetricType from usage module for convenience\nexport { UsageMetricType } from '../usage/index.js';\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { withWorkspaceContextSync, withWorkspaceContext, setWorkspaceContext, maybeTagConnection, maybeSetRlsGuc, injectWhereWorkspaceId, getWorkspaceContext, addWorkspaceExtension } from './chunk-MXLCLLCI.js';
|
|
2
|
-
import { isTransientAcquireError, installAcquireRetry, ensureServiceApplicationName, createPrismaClient, createPrismaAdapter, createConnectionPool, configurePrismaLogging, PrismaClientWrapper, addGraphExtension } from './chunk-
|
|
2
|
+
import { isTransientAcquireError, installAcquireRetry, ensureServiceApplicationName, createPrismaClient, createPrismaAdapter, createConnectionPool, configurePrismaLogging, PrismaClientWrapper, addGraphExtension } from './chunk-OCYZEBOL.js';
|
|
3
3
|
import { getGraphEventEmitter } from './chunk-URDYOM2L.js';
|
|
4
4
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
5
5
|
import { __export, __name } from './chunk-XE4OXN2W.js';
|
|
@@ -125,6 +125,10 @@ function resolvePoolTuningFromEnv(productName) {
|
|
|
125
125
|
const tuning = {
|
|
126
126
|
applicationName: process.env["DATABASE_APPLICATION_NAME"]?.trim() || `svc=${productName}`
|
|
127
127
|
};
|
|
128
|
+
const queryTimeout = parsePositiveIntEnv("DATABASE_QUERY_TIMEOUT");
|
|
129
|
+
if (queryTimeout !== void 0) {
|
|
130
|
+
tuning.queryTimeoutMillis = queryTimeout;
|
|
131
|
+
}
|
|
128
132
|
const statementTimeout = parsePositiveIntEnv("DATABASE_STATEMENT_TIMEOUT");
|
|
129
133
|
if (statementTimeout !== void 0) {
|
|
130
134
|
tuning.statementTimeoutMillis = statementTimeout;
|
|
@@ -659,5 +663,5 @@ function createContextFromSDK(sdkContext) {
|
|
|
659
663
|
__name(createContextFromSDK, "createContextFromSDK");
|
|
660
664
|
|
|
661
665
|
export { buildContextWhereClause, buildContextWhereConditions, checkDatabaseHealth, contextMatches, createContextFromSDK, createDatabaseClient, createDatabaseClientFromEnv, extractFieldsFromModel, getAllModelNames, getDatabaseManager, getDatabaseProductName, getDatabaseStats, getDatabaseVersion, getDb, getModelFields, hasModel, initializeDatabase, initializeDatabaseWithConfig, isDatabaseInitialized, loadGeneratedFields, mergeContext, parseContext, prisma_exports, resetDatabaseManager, resolvePoolTuningFromEnv, testConnection, toContextJson };
|
|
662
|
-
//# sourceMappingURL=chunk-
|
|
663
|
-
//# sourceMappingURL=chunk-
|
|
666
|
+
//# sourceMappingURL=chunk-YQ6FYE37.js.map
|
|
667
|
+
//# sourceMappingURL=chunk-YQ6FYE37.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/prisma/index.ts","../src/prisma/factory.ts","../src/prisma/manager.ts","../src/prisma/health.ts","../src/prisma/fields.ts","../src/prisma/context.ts"],"names":["resolveWorkspaceExtensionDefault","productName","explicit","process","env","layer","toLowerCase","name","startsWith","createDatabaseClient","PrismaClientConstructor","config","enableGraphExtension","graphEventEmitter","enableWorkspaceExtension","workspaceExtensionConfig","registerShutdownHandlers","prismaConfig","prismaConfigWithDefaults","applicationName","ensureServiceApplicationName","wrapper","createPrismaClient","baseClient","getClient","extendedClient","eventEmitter","getGraphEventEmitter","graphConfig","enabled","addGraphExtension","logger","info","addWorkspaceExtension","db","debug","connect","retries","delay","disconnect","parsePositiveIntEnv","raw","trim","undefined","parsed","Number","parseInt","isFinite","resolvePoolTuningFromEnv","tuning","queryTimeout","queryTimeoutMillis","statementTimeout","statementTimeoutMillis","idleInTransactionTimeout","idleInTransactionTimeoutMillis","lockTimeout","lockTimeoutMillis","createDatabaseClientFromEnv","overrides","databaseUrl","Error","isDevelopment","maxConnections","idleTimeoutMillis","connectionTimeoutMillis","enableQueryLogging","slowQueryThreshold","acquireRetriesRaw","acquireRetries","acquireRetryDelay","acquireRetryDelayMillis","state","initialized","client","initializeDatabase","initializeDatabaseWithConfig","getDb","getDatabaseManager","isDatabaseInitialized","getDatabaseProductName","resetDatabaseManager","error","warn","checkDatabaseHealth","start","Date","now","$queryRaw","latency","healthy","errorMessage","message","String","testConnection","getDatabaseVersion","result","version","getDatabaseStats","health","Promise","all","timestamp","requireFn","createRequire","url","loadGeneratedFields","generatedFieldsPath","generated","default","path","extractFieldsFromModel","modelName","modelFieldsMap","options","modelFields","Object","keys","join","excludeFields","includeRelations","customFilter","fields","relations","excluded","length","filter","field","includes","push","fieldName","isRelation","shouldInclude","type","metadata","totalFields","excludedCount","excludedFields","relationFields","getModelFields","hasModel","getAllModelNames","buildContextWhereClause","contextFilter","conditions","workspaceId","equals","userId","projectId","appId","productId","organizationId","buildContextWhereConditions","context","toContextJson","contextInput","custom","filterNullValues","obj","filtered","key","value","entries","mergeContextField","merged","fieldValue","mergeContext","existingContext","newContext","Array","isArray","parseContext","contextJson","ctx","contextMatches","createContextFromSDK","sdkContext"],"mappings":"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","file":"chunk-YQ6FYE37.js","sourcesContent":["/**\n * Prisma Module for Burdenoff Backend SDK\n *\n * Provides Prisma 7 utilities including:\n * - Singleton database manager for microservices\n * - Unified database client factory with graph extension\n * - Prisma client configuration with PostgreSQL adapter\n * - Connection pooling and management\n * - Health checks and monitoring\n * - Graceful shutdown handling\n * - Field extraction utilities for graph sync\n * - Context filtering utilities for multi-tenant queries\n * - Workspace extension for automatic workspaceId injection\n *\n * @module prisma\n * @category Database\n */\n\nexport * from './manager.js';\nexport * from './factory.js';\nexport * from './client.js';\nexport type * from './types.js';\nexport * from './health.js';\nexport * from './fields.js';\nexport * from './context.js';\nexport * from './workspace-extension.js';\n","/**\n * Database Client Factory\n *\n * Provides a unified factory for creating fully-configured database clients\n * with Prisma 7, PostgreSQL adapter, graph extension, and graceful shutdown.\n *\n * This module consolidates all database setup into a single call, reducing\n * boilerplate across all backend services.\n *\n * @module prisma/factory\n * @category Database\n */\n\nimport { logger } from '../logger/index.js';\nimport {\n createPrismaClient,\n ensureServiceApplicationName,\n type PrismaClientBase,\n type PrismaClientWrapper,\n type PrismaClientConstructorOptions,\n} from './client.js';\nimport type { PrismaClientConfig } from './types.js';\nimport { addGraphExtension, type GraphMiddlewareConfig, type GraphEventEmitter } from '../graph/middleware/index.js';\nimport { getGraphEventEmitter } from '../event-queue/graph-emitter.js';\nimport { addWorkspaceExtension, type WorkspaceExtensionConfig } from './workspace-extension.js';\n\n/**\n * Configuration for creating a database client\n */\nexport interface DatabaseClientConfig extends PrismaClientConfig {\n /**\n * Product name for graph events (e.g., 'module-tags', 'workspaces')\n */\n productName: string;\n\n /**\n * Enable graph extension for entity sync\n * @default true (reads from GRAPH_MIDDLEWARE_ENABLED env var)\n */\n enableGraphExtension?: boolean;\n\n /**\n * Custom graph event emitter (defaults to NATS-based emitter)\n */\n graphEventEmitter?: GraphEventEmitter;\n\n /**\n * Enable workspace extension for automatic workspaceId injection.\n *\n * Default is layer-aware:\n * - Global-layer services (`productName` starting with `global-` or `global_`,\n * or `WORKSPACE_LAYER=global`) default to `false`. Global-layer tables\n * (Tenant, Organization, Workspace, PlatformProduct, etc.) are intentionally\n * not workspace-scoped — enforcing workspaceId on them would block legitimate\n * queries like `myOrganizations`, `myWorkspaces`, `myAccessibleProducts`.\n * - All other services (wspace layer, product backends) default to `true`.\n *\n * `WORKSPACE_EXTENSION_ENABLED` env var always wins when explicitly set\n * (`true` or `false`). Pass the field on `config` for code-level override.\n */\n enableWorkspaceExtension?: boolean;\n\n /**\n * Configuration for the workspace extension\n */\n workspaceExtensionConfig?: WorkspaceExtensionConfig;\n\n /**\n * Register process shutdown handlers for graceful shutdown\n * @default true\n */\n registerShutdownHandlers?: boolean;\n}\n\n/**\n * Result of creating a database client\n */\nexport interface DatabaseClient<T extends PrismaClientBase> {\n /**\n * The extended Prisma client for database operations\n * Use this for all queries: db.model.operation()\n */\n db: T & { client: T };\n\n /**\n * The Prisma client wrapper with connection management utilities\n */\n wrapper: PrismaClientWrapper<T>;\n\n /**\n * Connect to the database with retry logic\n */\n connect: (retries?: number, delay?: number) => Promise<void>;\n\n /**\n * Disconnect from the database\n */\n disconnect: () => Promise<void>;\n}\n\n/**\n * Layer-aware default for the workspace extension.\n *\n * Global-layer services (productName starting with `global-`/`global_`, or\n * `WORKSPACE_LAYER=global`) opt out by default because their tables don't carry\n * a workspaceId column — enforcement would break queries like `myOrganizations`,\n * `myAccessibleProducts`, `contentPages`.\n *\n * `WORKSPACE_EXTENSION_ENABLED` is respected as an explicit override.\n */\nfunction resolveWorkspaceExtensionDefault(productName: string): boolean {\n const explicit = process.env['WORKSPACE_EXTENSION_ENABLED'];\n if (explicit === 'true') return true;\n if (explicit === 'false') return false;\n\n const layer = process.env['WORKSPACE_LAYER']?.toLowerCase();\n if (layer === 'global') return false;\n if (layer === 'wspace') return true;\n\n const name = productName.toLowerCase();\n if (name.startsWith('global-') || name.startsWith('global_')) return false;\n return true;\n}\n\n/**\n * Create a fully-configured database client with graph extension\n *\n * This is the recommended way to create a database connection in all backend services.\n * It handles:\n * - Prisma client creation with PostgreSQL adapter\n * - Connection pooling configuration\n * - Query logging (in development)\n * - Graph extension for entity sync (via NATS or in-memory)\n * - Graceful shutdown handlers\n *\n * @example\n * ```typescript\n * // In your service's db.ts\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createDatabaseClient } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, wrapper, connect, disconnect } = createDatabaseClient(PrismaClient, {\n * productName: 'my-service',\n * databaseUrl: process.env.DATABASE_URL!,\n * });\n *\n * export { db, wrapper, connect, disconnect };\n * export type ExtendedPrismaClient = typeof db;\n * ```\n *\n * @example\n * ```typescript\n * // With custom configuration\n * const { db } = createDatabaseClient(PrismaClient, {\n * productName: 'workspaces',\n * databaseUrl: process.env.DATABASE_URL!,\n * maxConnections: 50,\n * enableQueryLogging: true,\n * slowQueryThreshold: 200,\n * enableGraphExtension: true,\n * registerShutdownHandlers: true,\n * });\n * ```\n */\nexport function createDatabaseClient<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: DatabaseClientConfig\n): DatabaseClient<T> {\n const {\n productName,\n enableGraphExtension = process.env['GRAPH_MIDDLEWARE_ENABLED'] !== 'false',\n graphEventEmitter,\n enableWorkspaceExtension = resolveWorkspaceExtensionDefault(productName),\n workspaceExtensionConfig,\n registerShutdownHandlers = true,\n ...prismaConfig\n } = config;\n\n // Tag every service's pool with `svc=<productName>` by default so its\n // connections are attributable in pg_stat_activity / pg_stat_statements\n // (the on-ramp to per-workspace observability and shard routing). This is\n // pure diagnostic metadata with no effect on behavior; explicit\n // `applicationName` on the config always wins.\n const prismaConfigWithDefaults: PrismaClientConfig = {\n ...prismaConfig,\n applicationName: prismaConfig.applicationName ?? `svc=${productName}`,\n };\n\n // Belt-and-suspenders: also set the PGAPPNAME env fallback so any additional\n // pools this service opens outside be-sdk still carry the per-service tag.\n ensureServiceApplicationName(productName);\n\n // Create Prisma client wrapper\n const wrapper = createPrismaClient(PrismaClientConstructor, prismaConfigWithDefaults);\n\n // Get the base client\n const baseClient = wrapper.getClient();\n\n // Extension chaining order:\n // 1. Graph extension (event emission on CRUD) - runs first\n // 2. Workspace extension (auto-inject workspaceId) - runs second\n //\n // The workspace extension should run BEFORE graph extension in the\n // interception chain so that graph events include the injected workspaceId.\n // In Prisma $extends, the LAST extension added runs FIRST (outermost wrapper).\n // So we add graph first, then workspace on top.\n\n let extendedClient: T;\n\n // Step 1: Add graph extension\n if (enableGraphExtension) {\n const eventEmitter = graphEventEmitter ?? getGraphEventEmitter();\n\n const graphConfig: GraphMiddlewareConfig = {\n enabled: true,\n productName,\n eventEmitter,\n };\n\n extendedClient = addGraphExtension(baseClient, graphConfig);\n\n logger.info('[Database] Graph extension enabled', { productName });\n } else {\n extendedClient = baseClient;\n logger.info('[Database] Graph extension disabled');\n }\n\n // Step 2: Add workspace extension (wraps on top of graph)\n if (enableWorkspaceExtension) {\n extendedClient = addWorkspaceExtension(extendedClient, workspaceExtensionConfig);\n\n logger.info('[Database] Workspace extension enabled', { productName });\n } else {\n logger.info('[Database] Workspace extension disabled');\n }\n\n // Add backwards compatibility alias\n const db = extendedClient as T & { client: T };\n (db as unknown as Record<string, unknown>)['client'] = db;\n\n // Register shutdown handlers if requested\n if (registerShutdownHandlers) {\n wrapper.registerShutdownHandlers();\n logger.debug('[Database] Shutdown handlers registered');\n }\n\n return {\n db,\n wrapper,\n connect: (retries?: number, delay?: number) => wrapper.connect(retries, delay),\n disconnect: () => wrapper.disconnect(),\n };\n}\n\n/**\n * Pool-tuning options resolved from environment variables.\n */\nexport interface PoolTuningEnv {\n /** Postgres application_name (defaults to `svc=<productName>`). */\n applicationName: string;\n /** Client-side node-postgres query_timeout in ms, if opted in (pooler-safe). */\n queryTimeoutMillis?: number;\n /** Server-side statement_timeout in ms, if opted in. */\n statementTimeoutMillis?: number;\n /** Server-side idle_in_transaction_session_timeout in ms, if opted in. */\n idleInTransactionTimeoutMillis?: number;\n /** Server-side lock_timeout in ms, if opted in. */\n lockTimeoutMillis?: number;\n}\n\n/**\n * Parse a strictly-positive integer environment variable.\n *\n * Returns `undefined` for unset, empty, non-numeric, zero, or negative values —\n * so a misconfigured or absent env var can never silently enable an aggressive\n * (or nonsensical) timeout. This is what keeps the DB-enforced timeouts OFF by\n * default and therefore behavior-preserving.\n */\nfunction parsePositiveIntEnv(name: string): number | undefined {\n const raw = process.env[name];\n if (raw == null || raw.trim() === '') {\n return undefined;\n }\n const parsed = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\n/**\n * Resolve pool tuning (application_name + opt-in DB timeouts) from env vars:\n * - DATABASE_APPLICATION_NAME: overrides the default `svc=<productName>` tag\n * - DATABASE_QUERY_TIMEOUT: client-side node-postgres query_timeout in ms (opt-in, pooler-safe)\n * - DATABASE_STATEMENT_TIMEOUT: server-side statement_timeout in ms (opt-in; DIRECT :5432 only — see note)\n * - DATABASE_IDLE_IN_TRANSACTION_TIMEOUT: idle_in_transaction_session_timeout in ms (opt-in)\n * - DATABASE_LOCK_TIMEOUT: lock_timeout in ms (opt-in)\n *\n * Timeouts are omitted entirely unless explicitly set to a positive integer, so\n * the default is exactly today's behavior (no timeouts).\n *\n * NOTE: prefer `DATABASE_QUERY_TIMEOUT` for services whose `DATABASE_URL` points\n * at the built-in PgBouncer (`:6432`). `DATABASE_STATEMENT_TIMEOUT` and friends\n * are Postgres startup parameters that Azure PgBouncer does not pass through, so\n * they silently have no effect (or fail the connection) on the pooled path.\n */\nexport function resolvePoolTuningFromEnv(productName: string): PoolTuningEnv {\n const tuning: PoolTuningEnv = {\n applicationName: process.env['DATABASE_APPLICATION_NAME']?.trim() || `svc=${productName}`,\n };\n\n const queryTimeout = parsePositiveIntEnv('DATABASE_QUERY_TIMEOUT');\n if (queryTimeout !== undefined) {\n tuning.queryTimeoutMillis = queryTimeout;\n }\n\n const statementTimeout = parsePositiveIntEnv('DATABASE_STATEMENT_TIMEOUT');\n if (statementTimeout !== undefined) {\n tuning.statementTimeoutMillis = statementTimeout;\n }\n\n const idleInTransactionTimeout = parsePositiveIntEnv('DATABASE_IDLE_IN_TRANSACTION_TIMEOUT');\n if (idleInTransactionTimeout !== undefined) {\n tuning.idleInTransactionTimeoutMillis = idleInTransactionTimeout;\n }\n\n const lockTimeout = parsePositiveIntEnv('DATABASE_LOCK_TIMEOUT');\n if (lockTimeout !== undefined) {\n tuning.lockTimeoutMillis = lockTimeout;\n }\n\n return tuning;\n}\n\n/**\n * Create a database client from environment variables\n *\n * Convenience function that reads configuration from standard environment variables:\n * - DATABASE_URL: Connection string (required)\n * - DATABASE_MAX_CONNECTIONS: Max pool connections (default: 20)\n * - DATABASE_APPLICATION_NAME: Postgres application_name (default: `svc=<productName>`)\n * - DATABASE_QUERY_TIMEOUT: opt-in client-side query timeout in ms — the\n * PgBouncer-safe query bound (default: OFF, preserving current behavior)\n * - DATABASE_STATEMENT_TIMEOUT / DATABASE_IDLE_IN_TRANSACTION_TIMEOUT / DATABASE_LOCK_TIMEOUT:\n * opt-in server-side timeouts in ms (default: OFF; DIRECT :5432 only — not\n * honored through the built-in PgBouncer :6432 runtime path)\n * - NODE_ENV: Environment for logging settings\n * - GRAPH_MIDDLEWARE_ENABLED: Enable graph sync (default: true)\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createDatabaseClientFromEnv } from '@burdenoff/be-sdk/prisma';\n *\n * const { db } = createDatabaseClientFromEnv(PrismaClient, 'module-tags');\n * export { db };\n * ```\n */\nexport function createDatabaseClientFromEnv<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n productName: string,\n overrides?: Partial<DatabaseClientConfig>\n): DatabaseClient<T> {\n const databaseUrl = process.env['DATABASE_URL'];\n if (!databaseUrl) {\n throw new Error('DATABASE_URL environment variable is required');\n }\n\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n\n const config: DatabaseClientConfig = {\n productName,\n databaseUrl,\n maxConnections: parseInt(process.env['DATABASE_MAX_CONNECTIONS'] || '20', 10),\n idleTimeoutMillis: parseInt(process.env['DATABASE_IDLE_TIMEOUT'] || '30000', 10),\n connectionTimeoutMillis: parseInt(process.env['DATABASE_CONNECTION_TIMEOUT'] || '10000', 10),\n ...resolvePoolTuningFromEnv(productName),\n enableQueryLogging: isDevelopment,\n slowQueryThreshold: isDevelopment ? 100 : 500,\n ...overrides,\n };\n\n // Transient acquire retry — env-tunable, and unlike the fields above zero is\n // meaningful (DATABASE_ACQUIRE_RETRIES=0 disables the retry entirely).\n const acquireRetriesRaw = process.env['DATABASE_ACQUIRE_RETRIES']?.trim();\n if (acquireRetriesRaw !== undefined && acquireRetriesRaw !== '' && config.acquireRetries === undefined) {\n const parsed = Number.parseInt(acquireRetriesRaw, 10);\n if (Number.isFinite(parsed) && parsed >= 0) {\n config.acquireRetries = parsed;\n }\n }\n const acquireRetryDelay = parsePositiveIntEnv('DATABASE_ACQUIRE_RETRY_DELAY');\n if (acquireRetryDelay !== undefined && config.acquireRetryDelayMillis === undefined) {\n config.acquireRetryDelayMillis = acquireRetryDelay;\n }\n\n return createDatabaseClient(PrismaClientConstructor, config);\n}\n","/**\n * Database Singleton Manager\n *\n * Provides a singleton pattern for database connections across microservices.\n * Services initialize once at startup and access the db instance globally.\n *\n * This eliminates the need for individual db.ts files in each microservice.\n *\n * @module prisma/manager\n * @category Database\n *\n * @example\n * ```typescript\n * // In your service's index.ts (startup)\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { initializeDatabase } from '@burdenoff/be-sdk/prisma';\n *\n * // Initialize once at startup\n * const { db, connect } = initializeDatabase(PrismaClient, 'module-tags');\n * await connect();\n *\n * // In any other file\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n * const db = getDb();\n * await db.client.user.findMany();\n * ```\n */\n\nimport { logger } from '../logger/index.js';\nimport {\n createDatabaseClient,\n createDatabaseClientFromEnv,\n type DatabaseClient,\n type DatabaseClientConfig,\n} from './factory.js';\nimport type { PrismaClientBase, PrismaClientConstructorOptions, DatabaseReturnType } from './client.js';\n\n/**\n * Global database manager state\n */\ninterface DatabaseManagerState {\n initialized: boolean;\n productName: string | null;\n client: DatabaseClient<PrismaClientBase> | null;\n}\n\n/**\n * Singleton state for the database manager\n */\nconst state: DatabaseManagerState = {\n initialized: false,\n productName: null,\n client: null,\n};\n\n/**\n * Initialize the database singleton\n *\n * Call this once at application startup with your service's PrismaClient.\n * After initialization, use `getDb()` to access the database anywhere.\n *\n * @param PrismaClientConstructor - The generated PrismaClient class from your service\n * @param productName - Product name for graph events (e.g., 'module-tags', 'workspaces')\n * @param config - Optional configuration overrides\n * @returns The database client with db, wrapper, connect, disconnect\n *\n * @throws Error if already initialized with a different product\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { initializeDatabase } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, connect, disconnect } = initializeDatabase(PrismaClient, 'module-tags');\n * await connect();\n * ```\n */\nexport function initializeDatabase<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n productName: string,\n config?: Partial<DatabaseClientConfig>\n): DatabaseClient<T> {\n // Check if already initialized\n if (state.initialized) {\n if (state.productName !== productName) {\n throw new Error(\n `Database already initialized for product \"${state.productName}\". ` +\n `Cannot reinitialize for \"${productName}\".`\n );\n }\n logger.debug('[DatabaseManager] Already initialized, returning existing client', { productName });\n return state.client as DatabaseClient<T>;\n }\n\n // Create the database client using env-based factory\n const client = createDatabaseClientFromEnv(PrismaClientConstructor, productName, config);\n\n // Store in singleton state\n state.initialized = true;\n state.productName = productName;\n state.client = client;\n\n logger.info('[DatabaseManager] Database initialized', { productName });\n\n return client;\n}\n\n/**\n * Initialize the database with explicit configuration\n *\n * Use this when you need full control over database configuration\n * rather than reading from environment variables.\n *\n * @param PrismaClientConstructor - The generated PrismaClient class\n * @param config - Full database configuration\n * @returns The database client\n *\n * @example\n * ```typescript\n * const { db } = initializeDatabaseWithConfig(PrismaClient, {\n * productName: 'module-tags',\n * databaseUrl: 'postgresql://...',\n * maxConnections: 50,\n * enableGraphExtension: false,\n * });\n * ```\n */\nexport function initializeDatabaseWithConfig<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: DatabaseClientConfig\n): DatabaseClient<T> {\n const { productName } = config;\n\n // Check if already initialized\n if (state.initialized) {\n if (state.productName !== productName) {\n throw new Error(\n `Database already initialized for product \"${state.productName}\". ` +\n `Cannot reinitialize for \"${productName}\".`\n );\n }\n logger.debug('[DatabaseManager] Already initialized, returning existing client', { productName });\n return state.client as DatabaseClient<T>;\n }\n\n // Create the database client\n const client = createDatabaseClient(PrismaClientConstructor, config);\n\n // Store in singleton state\n state.initialized = true;\n state.productName = productName;\n state.client = client;\n\n logger.info('[DatabaseManager] Database initialized with custom config', { productName });\n\n return client;\n}\n\n/**\n * Get the initialized database client\n *\n * Use this anywhere in your application to access the database.\n * Must call `initializeDatabase()` first at application startup.\n *\n * The returned client provides dynamic model access - you can access any\n * model property (e.g., `db.client.user`, `db.client.universalTag`) and\n * TypeScript will allow common Prisma operations (findMany, create, etc.).\n *\n * @returns The extended Prisma client (db) with dynamic model access\n * @throws Error if database not initialized\n *\n * @example\n * ```typescript\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n *\n * const db = getDb();\n * // Dynamic model access works without importing service-specific types\n * const tags = await db.client.universalTag.findMany();\n * const users = await db.client.user.findMany({ where: { active: true } });\n * ```\n */\nexport function getDb<T extends PrismaClientBase = PrismaClientBase>(): DatabaseReturnType<T> {\n if (!state.initialized || !state.client) {\n throw new Error('Database not initialized. Call initializeDatabase() at application startup before using getDb().');\n }\n return state.client.db as unknown as DatabaseReturnType<T>;\n}\n\n/**\n * Get the full database manager\n *\n * Returns the complete database client including wrapper, connect, and disconnect functions.\n * Useful when you need access to connection management utilities.\n *\n * @returns The full database client\n * @throws Error if database not initialized\n *\n * @example\n * ```typescript\n * import { getDatabaseManager } from '@burdenoff/be-sdk/prisma';\n *\n * const { db, wrapper, connect, disconnect } = getDatabaseManager();\n * await connect();\n * ```\n */\nexport function getDatabaseManager<T extends PrismaClientBase = PrismaClientBase>(): DatabaseClient<T> {\n if (!state.initialized || !state.client) {\n throw new Error(\n 'Database not initialized. Call initializeDatabase() at application startup before using getDatabaseManager().'\n );\n }\n return state.client as DatabaseClient<T>;\n}\n\n/**\n * Check if database is initialized\n *\n * @returns True if database has been initialized\n *\n * @example\n * ```typescript\n * if (!isDatabaseInitialized()) {\n * await initializeDatabase(PrismaClient, 'my-service');\n * }\n * ```\n */\nexport function isDatabaseInitialized(): boolean {\n return state.initialized;\n}\n\n/**\n * Get the product name of the initialized database\n *\n * @returns The product name or null if not initialized\n */\nexport function getDatabaseProductName(): string | null {\n return state.productName;\n}\n\n/**\n * Reset the database manager (for testing purposes only)\n *\n * WARNING: This disconnects and resets the database manager.\n * Only use this in test environments for cleanup between tests.\n *\n * @internal\n */\nexport async function resetDatabaseManager(): Promise<void> {\n if (state.client) {\n try {\n await state.client.disconnect();\n } catch (error) {\n logger.warn('[DatabaseManager] Error during disconnect on reset', { error });\n }\n }\n\n state.initialized = false;\n state.productName = null;\n state.client = null;\n\n logger.debug('[DatabaseManager] Database manager reset');\n}\n","/**\n * Prisma Health Check Utilities\n */\n\nimport { logger } from '../logger/index.js';\nimport type { DatabaseHealth } from './types.js';\nimport type { PrismaClientBase } from './client.js';\n\n/**\n * Check database health\n */\nexport async function checkDatabaseHealth<T extends PrismaClientBase>(client: T): Promise<DatabaseHealth> {\n try {\n const start = Date.now();\n await client.$queryRaw`SELECT 1`;\n const latency = Date.now() - start;\n\n return { healthy: true, latency };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('[Prisma] Health check failed', { error: errorMessage });\n\n return {\n healthy: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Test database connection\n */\nexport async function testConnection<T extends PrismaClientBase>(client: T): Promise<boolean> {\n try {\n await client.$queryRaw`SELECT 1`;\n return true;\n } catch (error) {\n logger.error('[Prisma] Connection test failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n}\n\n/**\n * Get database version\n */\nexport async function getDatabaseVersion<T extends PrismaClientBase>(client: T): Promise<string | null> {\n try {\n const result = await client.$queryRaw<Array<{ version?: string }>>`SELECT version()`;\n return result[0]?.version ?? null;\n } catch (error) {\n logger.error('[Prisma] Failed to get database version', {\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n}\n\n/**\n * Get database stats\n */\nexport async function getDatabaseStats<T extends PrismaClientBase>(\n client: T\n): Promise<{\n health: DatabaseHealth;\n version: string | null;\n timestamp: Date;\n}> {\n const [health, version] = await Promise.all([checkDatabaseHealth(client), getDatabaseVersion(client)]);\n\n return {\n health,\n version,\n timestamp: new Date(),\n };\n}\n","/**\n * Prisma Field Extraction Utilities\n *\n * Provides utilities for extracting model fields from Prisma schema.\n * In Prisma 7, DMMF is not available at runtime, so this module provides\n * build-time field extraction through a generator.\n *\n * @module prisma/fields\n */\n\nimport { createRequire } from 'node:module';\nimport { logger } from '../logger/index.js';\n\nconst requireFn = createRequire(import.meta.url);\n\n/**\n * Field extraction options\n */\nexport interface FieldExtractionOptions {\n /** Fields to exclude from extraction */\n excludeFields?: string[];\n /** Whether to include relation fields */\n includeRelations?: boolean;\n /** Custom filter function */\n customFilter?: (field: { name: string; type: string; isRelation: boolean }) => boolean;\n}\n\n/**\n * Field extraction result\n */\nexport interface FieldExtractionResult {\n /** Extracted field names */\n fields: string[];\n /** Metadata about the extraction */\n metadata: {\n /** Total number of fields found */\n totalFields: number;\n /** Number of fields excluded */\n excludedCount: number;\n /** Names of excluded fields */\n excludedFields: string[];\n /** Number of relation fields */\n relationFields: number;\n };\n}\n\n/**\n * Model fields mapping\n * This will be generated at build time by the Prisma generator\n */\nexport type ModelFieldsMap = Record<\n string,\n {\n fields: string[];\n relations: string[];\n }\n>;\n\n/**\n * Import generated fields from the consuming package\n * This function should be used by backends to load their generated fields\n */\nexport function loadGeneratedFields(generatedFieldsPath: string): ModelFieldsMap {\n try {\n // Dynamic import of generated fields using createRequire\n const generated = requireFn(generatedFieldsPath) as { default: ModelFieldsMap };\n return generated.default || generated;\n } catch (error) {\n logger.error('[Prisma] Failed to load generated fields', {\n error: error instanceof Error ? error.message : String(error),\n path: generatedFieldsPath,\n });\n throw new Error(`Failed to load generated fields from ${generatedFieldsPath}`);\n }\n}\n\n/**\n * Extract fields from generated model fields with options\n */\nexport function extractFieldsFromModel(\n modelName: string,\n modelFieldsMap: ModelFieldsMap,\n options: FieldExtractionOptions = {}\n): FieldExtractionResult {\n const modelFields = modelFieldsMap[modelName];\n\n if (!modelFields) {\n throw new Error(\n `Model \"${modelName}\" not found in generated fields. ` +\n `Available models: ${Object.keys(modelFieldsMap).join(', ')}`\n );\n }\n\n const { excludeFields = [], includeRelations = false, customFilter } = options;\n\n // Start with scalar fields\n let fields = [...modelFields.fields];\n\n // Add relations if requested\n if (includeRelations) {\n fields = [...fields, ...modelFields.relations];\n }\n\n // Track excluded fields\n const excluded: string[] = [];\n\n // Apply exclusions\n if (excludeFields.length > 0) {\n fields = fields.filter((field) => {\n if (excludeFields.includes(field)) {\n excluded.push(field);\n return false;\n }\n return true;\n });\n }\n\n // Apply custom filter\n if (customFilter) {\n fields = fields.filter((fieldName) => {\n const isRelation = modelFields.relations.includes(fieldName);\n const shouldInclude = customFilter({\n name: fieldName,\n type: 'unknown', // Type information not available without full DMMF\n isRelation,\n });\n\n if (!shouldInclude) {\n excluded.push(fieldName);\n }\n\n return shouldInclude;\n });\n }\n\n return {\n fields,\n metadata: {\n totalFields: modelFields.fields.length + modelFields.relations.length,\n excludedCount: excluded.length,\n excludedFields: excluded,\n relationFields: modelFields.relations.length,\n },\n };\n}\n\n/**\n * Get all field names for a model (without options)\n */\nexport function getModelFields(modelName: string, modelFieldsMap: ModelFieldsMap, includeRelations = false): string[] {\n const result = extractFieldsFromModel(modelName, modelFieldsMap, { includeRelations });\n return result.fields;\n}\n\n/**\n * Check if a model exists in the generated fields\n */\nexport function hasModel(modelName: string, modelFieldsMap: ModelFieldsMap): boolean {\n return modelName in modelFieldsMap;\n}\n\n/**\n * Get all available model names\n */\nexport function getAllModelNames(modelFieldsMap: ModelFieldsMap): string[] {\n return Object.keys(modelFieldsMap);\n}\n","/**\n * Prisma Context Filtering Utilities\n *\n * Utilities for handling operation context in queries, mutations, and filtering.\n * Context JSON enables multi-dimensional data isolation across workspaces, users, projects, etc.\n *\n * @module prisma/context\n * @category Database\n */\n\n/**\n * Context filter input for querying entities by context\n */\nexport interface ContextFilterInput {\n workspaceId?: string | null;\n userId?: string | null;\n projectId?: string | null;\n appId?: string | null;\n /** Product identifier (e.g. \"vibecontrols\", \"workspaces\"). Stamped on cross-product\n * records so admin filters can scope by originating product. */\n productId?: string | null;\n /** Organization identifier within the tenant. */\n organizationId?: string | null;\n}\n\n/**\n * Operation context for create/update operations\n */\nexport interface OperationContext extends ContextFilterInput {\n custom?: Record<string, unknown> | null;\n}\n\n/**\n * Prisma JSON filter type (simplified for context filtering)\n * This type is designed to be compatible with Prisma's JsonNullableFilter\n * Uses Record<string, unknown> for maximum compatibility with various Prisma versions\n */\nexport type PrismaJsonFilter = Record<string, unknown>;\n\n/**\n * JSON value type for Prisma (includes null for reading from DB)\n */\nexport type JsonValue = string | number | boolean | null | { [key: string]: JsonValue } | JsonValue[];\n\n/**\n * Input JSON value type for Prisma (excludes null for writing to DB)\n * Compatible with Prisma's InputJsonValue type\n */\nexport type InputJsonValue = string | number | boolean | { [key: string]: InputJsonValue } | InputJsonValue[];\n\n/**\n * Build Prisma where condition for context filtering.\n * Uses PostgreSQL JSONB containment operators for efficient queries.\n *\n * @param contextFilter - The context filter input\n * @returns Prisma where clause for context field, or undefined if no filter provided\n *\n * @example\n * ```typescript\n * const contextWhere = buildContextWhereClause({\n * workspaceId: '123',\n * projectId: '456'\n * });\n * // Returns: { path: ['workspaceId'], equals: '123' }\n * ```\n */\nexport function buildContextWhereClause(\n contextFilter: ContextFilterInput | null | undefined\n): PrismaJsonFilter | undefined {\n if (!contextFilter) {\n return undefined;\n }\n\n // Build array of path conditions for each non-null field\n const conditions: PrismaJsonFilter[] = [];\n\n if (contextFilter.workspaceId != null) {\n conditions.push({\n path: ['workspaceId'],\n equals: contextFilter.workspaceId,\n });\n }\n\n if (contextFilter.userId != null) {\n conditions.push({\n path: ['userId'],\n equals: contextFilter.userId,\n });\n }\n\n if (contextFilter.projectId != null) {\n conditions.push({\n path: ['projectId'],\n equals: contextFilter.projectId,\n });\n }\n\n if (contextFilter.appId != null) {\n conditions.push({\n path: ['appId'],\n equals: contextFilter.appId,\n });\n }\n\n if (contextFilter.productId != null) {\n conditions.push({\n path: ['productId'],\n equals: contextFilter.productId,\n });\n }\n\n if (contextFilter.organizationId != null) {\n conditions.push({\n path: ['organizationId'],\n equals: contextFilter.organizationId,\n });\n }\n\n // If no conditions, return undefined\n if (conditions.length === 0) {\n return undefined;\n }\n\n // If single condition, return it directly\n if (conditions.length === 1) {\n return conditions[0];\n }\n\n // For multiple conditions, return the first one\n // Caller should use buildContextWhereConditions for multiple AND conditions\n return conditions[0];\n}\n\n/**\n * Build context where conditions as an array for use in AND clause.\n * This is useful when you need to filter by multiple context fields.\n *\n * @param contextFilter - The context filter input\n * @returns Array of Prisma where conditions, each targeting the context field\n *\n * @example\n * ```typescript\n * const conditions = buildContextWhereConditions({\n * workspaceId: '123',\n * projectId: '456'\n * });\n * // Use in Prisma query:\n * prisma.entity.findMany({\n * where: { AND: conditions }\n * });\n * ```\n */\nexport function buildContextWhereConditions(\n contextFilter: ContextFilterInput | null | undefined\n): Array<{ context: PrismaJsonFilter }> {\n if (!contextFilter) {\n return [];\n }\n\n const conditions: Array<{ context: PrismaJsonFilter }> = [];\n\n if (contextFilter.workspaceId != null) {\n conditions.push({\n context: {\n path: ['workspaceId'],\n equals: contextFilter.workspaceId,\n },\n });\n }\n\n if (contextFilter.userId != null) {\n conditions.push({\n context: {\n path: ['userId'],\n equals: contextFilter.userId,\n },\n });\n }\n\n if (contextFilter.projectId != null) {\n conditions.push({\n context: {\n path: ['projectId'],\n equals: contextFilter.projectId,\n },\n });\n }\n\n if (contextFilter.appId != null) {\n conditions.push({\n context: {\n path: ['appId'],\n equals: contextFilter.appId,\n },\n });\n }\n\n if (contextFilter.productId != null) {\n conditions.push({\n context: {\n path: ['productId'],\n equals: contextFilter.productId,\n },\n });\n }\n\n if (contextFilter.organizationId != null) {\n conditions.push({\n context: {\n path: ['organizationId'],\n equals: contextFilter.organizationId,\n },\n });\n }\n\n return conditions;\n}\n\n/**\n * Convert context input to Prisma JSON format for create/update operations.\n *\n * @param contextInput - The context input\n * @returns JSON value for the context field, or undefined if empty\n *\n * @example\n * ```typescript\n * const contextJson = toContextJson({\n * workspaceId: '123',\n * userId: '456'\n * });\n * // Use in Prisma create:\n * prisma.entity.create({\n * data: { context: contextJson }\n * });\n * ```\n */\nexport function toContextJson(contextInput: OperationContext | null | undefined): InputJsonValue | undefined {\n if (!contextInput) {\n return undefined;\n }\n\n // Remove null values and build clean context object\n const context: Record<string, InputJsonValue> = {};\n\n if (contextInput.workspaceId != null) {\n context['workspaceId'] = contextInput.workspaceId;\n }\n if (contextInput.userId != null) {\n context['userId'] = contextInput.userId;\n }\n if (contextInput.projectId != null) {\n context['projectId'] = contextInput.projectId;\n }\n if (contextInput.appId != null) {\n context['appId'] = contextInput.appId;\n }\n if (contextInput.productId != null) {\n context['productId'] = contextInput.productId;\n }\n if (contextInput.organizationId != null) {\n context['organizationId'] = contextInput.organizationId;\n }\n if (contextInput.custom != null) {\n context['custom'] = contextInput.custom as InputJsonValue;\n }\n\n // Return undefined if no fields set\n if (Object.keys(context).length === 0) {\n return undefined;\n }\n\n return context;\n}\n\n/**\n * Filter out null values from an object for Prisma compatibility\n */\nfunction filterNullValues(obj: Record<string, unknown>): Record<string, InputJsonValue> {\n const filtered: Record<string, InputJsonValue> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== null) {\n filtered[key] = value as InputJsonValue;\n }\n }\n return filtered;\n}\n\n/**\n * Merge a single field into the merged context object\n */\nfunction mergeContextField(\n merged: Record<string, InputJsonValue>,\n fieldName: string,\n fieldValue: string | Record<string, unknown> | null | undefined\n): void {\n if (fieldValue === undefined) {\n return; // Don't touch this field\n }\n\n if (fieldValue === null) {\n delete merged[fieldName]; // Explicitly remove\n } else {\n merged[fieldName] = fieldValue as InputJsonValue; // Set new value\n }\n}\n\n/**\n * Merge existing context with new context input.\n * New values override existing ones, but undefined values are preserved from existing.\n *\n * @param existingContext - The existing context JSON from database\n * @param newContext - The new context input\n * @returns Merged context as InputJsonValue (suitable for Prisma writes)\n *\n * @example\n * ```typescript\n * const merged = mergeContext(\n * { workspaceId: '123', userId: 'old' },\n * { userId: 'new', projectId: '456' }\n * );\n * // Result: { workspaceId: '123', userId: 'new', projectId: '456' }\n * ```\n */\nexport function mergeContext(\n existingContext: JsonValue | null | undefined,\n newContext: OperationContext | null | undefined\n): InputJsonValue | undefined {\n // If no new context, return existing (excluding null values)\n if (!newContext) {\n if (!existingContext) {\n return undefined;\n }\n // Filter out null values from existing context for Prisma compatibility\n if (typeof existingContext === 'object' && !Array.isArray(existingContext)) {\n const filtered = filterNullValues(existingContext);\n return Object.keys(filtered).length > 0 ? filtered : undefined;\n }\n return existingContext as InputJsonValue;\n }\n\n // If no existing context, convert new to JSON\n if (!existingContext || typeof existingContext !== 'object' || Array.isArray(existingContext)) {\n return toContextJson(newContext);\n }\n\n // Merge existing with new\n const merged = filterNullValues(existingContext);\n\n // Merge each field from new context\n mergeContextField(merged, 'workspaceId', newContext.workspaceId);\n mergeContextField(merged, 'userId', newContext.userId);\n mergeContextField(merged, 'projectId', newContext.projectId);\n mergeContextField(merged, 'appId', newContext.appId);\n mergeContextField(merged, 'productId', newContext.productId);\n mergeContextField(merged, 'organizationId', newContext.organizationId);\n mergeContextField(merged, 'custom', newContext.custom);\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * Parse context JSON from database to OperationContext interface.\n *\n * @param contextJson - The context JSON from database\n * @returns Parsed OperationContext or null\n *\n * @example\n * ```typescript\n * const context = parseContext(entity.context);\n * if (context?.workspaceId) {\n * // Use workspace-specific logic\n * }\n * ```\n */\nexport function parseContext(contextJson: JsonValue | null | undefined): OperationContext | null {\n if (!contextJson || typeof contextJson !== 'object' || Array.isArray(contextJson)) {\n return null;\n }\n\n const ctx = contextJson as Record<string, unknown>;\n\n return {\n workspaceId: typeof ctx['workspaceId'] === 'string' ? ctx['workspaceId'] : null,\n userId: typeof ctx['userId'] === 'string' ? ctx['userId'] : null,\n projectId: typeof ctx['projectId'] === 'string' ? ctx['projectId'] : null,\n appId: typeof ctx['appId'] === 'string' ? ctx['appId'] : null,\n productId: typeof ctx['productId'] === 'string' ? ctx['productId'] : null,\n organizationId: typeof ctx['organizationId'] === 'string' ? ctx['organizationId'] : null,\n custom: typeof ctx['custom'] === 'object' ? (ctx['custom'] as Record<string, unknown>) : null,\n };\n}\n\n/**\n * Check if context matches filter criteria\n *\n * @param context - The context to check\n * @param filter - The filter criteria\n * @returns True if context matches all filter criteria\n */\nexport function contextMatches(context: OperationContext | null | undefined, filter: ContextFilterInput): boolean {\n if (!context) {\n return false;\n }\n\n if (filter.workspaceId != null && context.workspaceId !== filter.workspaceId) {\n return false;\n }\n if (filter.userId != null && context.userId !== filter.userId) {\n return false;\n }\n if (filter.projectId != null && context.projectId !== filter.projectId) {\n return false;\n }\n if (filter.appId != null && context.appId !== filter.appId) {\n return false;\n }\n if (filter.productId != null && context.productId !== filter.productId) {\n return false;\n }\n if (filter.organizationId != null && context.organizationId !== filter.organizationId) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Create a default context from SDK context\n *\n * @param sdkContext - The SDK context (from AsyncLocalStorage)\n * @returns Operation context with workspace and user info\n */\nexport function createContextFromSDK(sdkContext: {\n workspaceId?: string;\n userId?: string;\n projectId?: string;\n appId?: string;\n productId?: string;\n organizationId?: string;\n}): OperationContext {\n return {\n workspaceId: sdkContext.workspaceId ?? null,\n userId: sdkContext.userId ?? null,\n projectId: sdkContext.projectId ?? null,\n appId: sdkContext.appId ?? null,\n productId: sdkContext.productId ?? null,\n organizationId: sdkContext.organizationId ?? null,\n };\n}\n"]}
|
|
@@ -7,6 +7,7 @@ interface PrismaClientConfig {
|
|
|
7
7
|
idleTimeoutMillis?: number;
|
|
8
8
|
connectionTimeoutMillis?: number;
|
|
9
9
|
applicationName?: string;
|
|
10
|
+
queryTimeoutMillis?: number;
|
|
10
11
|
statementTimeoutMillis?: number;
|
|
11
12
|
idleInTransactionTimeoutMillis?: number;
|
|
12
13
|
lockTimeoutMillis?: number;
|
package/dist/graph/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import '../graphql-Dxxpbzr3.js';
|
|
2
2
|
import '../index-B8viwwDM.js';
|
|
3
|
-
export { A as AUDIT_FIELDS, C as CreateEdgeOptions, a as CreateNodeOptions, D as DefineEntityConfigOptions, b as DefineGraphConfigOptions, c as DefineRelationshipConfigOptions, E as EdgeDocument, d as EntityDefinition, e as EntityEventContext, f as EntityEventData, g as EntityEventHook, h as EntityFetcher, j as EntityGraphConfig, k as EntityRbacConfig, l as EntityVertex, m as ExtractedEntityData, n as ExtractedRelationshipData, F as FieldMapper, o as GenericEntityConfig, p as GenericEntityRbacConfig, q as GenericGraphConfig, r as GenericRelationshipConfig, s as GraphEdge, t as GraphEntityConfig, u as GraphEntityExport, v as GraphEvent, w as GraphEventOptions, x as GraphEventPublishOptions, y as GraphEventType, z as GraphEventsHelper, B as GraphEventsHelperConfig, H as GraphEventsPublisher, I as GraphExportResponse, J as GraphExportService, K as GraphExportServiceConfig, G as GraphModule, L as GraphNode, M as GraphRegistry, N as GraphRelationshipData, O as GraphRelationshipExport, P as GraphSchema, Q as GraphValidationError, R as GraphValidationResult, S as InitializeGraphOptions, T as ModuleGraph, U as ModuleGraphConfig, V as ModuleGraphDefinition, W as PrismaGraphIntegration, X as PrismaGraphIntegrationOptions, Y as ProductFacet, Z as QueryGraphOptions, _ as RelationshipDefinition, $ as RelationshipEventData, a0 as RelationshipExportData, a1 as RelationshipFetcher, a2 as RelationshipGraphConfig, a3 as SOFT_DELETE_FIELDS, a4 as STANDARD_FIELDS, a5 as SearchFacets, a6 as SearchFilters, a7 as SearchResponse, a8 as SearchResult, a9 as TENANT_FIELDS, aa as TraverseDirection, ab as TraverseOptions, ac as TraverseResult, ad as TypeFacet, ae as ValidationErrorType, af as createEntityEvent, ag as createGraphEventsHelper, ah as createGraphExportService, ai as createPrismaGraphIntegration, aj as createRelationshipEvent, ak as createRelationshipFromEntity, al as defineEntity, am as defineGraphConfig, an as defineModuleGraph, ao as defineRelationship, ap as extractEntityTitle, aq as extractMinimalFields, ar as getCollectionForEntity, as as getGraphEventsPublisher, at as getGraphStats, au as initializeGraph, av as isGraphInitialized, aw as parseRelationship, ax as shouldSyncEntity, ay as shouldSyncRelationship } from '../index-
|
|
3
|
+
export { A as AUDIT_FIELDS, C as CreateEdgeOptions, a as CreateNodeOptions, D as DefineEntityConfigOptions, b as DefineGraphConfigOptions, c as DefineRelationshipConfigOptions, E as EdgeDocument, d as EntityDefinition, e as EntityEventContext, f as EntityEventData, g as EntityEventHook, h as EntityFetcher, j as EntityGraphConfig, k as EntityRbacConfig, l as EntityVertex, m as ExtractedEntityData, n as ExtractedRelationshipData, F as FieldMapper, o as GenericEntityConfig, p as GenericEntityRbacConfig, q as GenericGraphConfig, r as GenericRelationshipConfig, s as GraphEdge, t as GraphEntityConfig, u as GraphEntityExport, v as GraphEvent, w as GraphEventOptions, x as GraphEventPublishOptions, y as GraphEventType, z as GraphEventsHelper, B as GraphEventsHelperConfig, H as GraphEventsPublisher, I as GraphExportResponse, J as GraphExportService, K as GraphExportServiceConfig, G as GraphModule, L as GraphNode, M as GraphRegistry, N as GraphRelationshipData, O as GraphRelationshipExport, P as GraphSchema, Q as GraphValidationError, R as GraphValidationResult, S as InitializeGraphOptions, T as ModuleGraph, U as ModuleGraphConfig, V as ModuleGraphDefinition, W as PrismaGraphIntegration, X as PrismaGraphIntegrationOptions, Y as ProductFacet, Z as QueryGraphOptions, _ as RelationshipDefinition, $ as RelationshipEventData, a0 as RelationshipExportData, a1 as RelationshipFetcher, a2 as RelationshipGraphConfig, a3 as SOFT_DELETE_FIELDS, a4 as STANDARD_FIELDS, a5 as SearchFacets, a6 as SearchFilters, a7 as SearchResponse, a8 as SearchResult, a9 as TENANT_FIELDS, aa as TraverseDirection, ab as TraverseOptions, ac as TraverseResult, ad as TypeFacet, ae as ValidationErrorType, af as createEntityEvent, ag as createGraphEventsHelper, ah as createGraphExportService, ai as createPrismaGraphIntegration, aj as createRelationshipEvent, ak as createRelationshipFromEntity, al as defineEntity, am as defineGraphConfig, an as defineModuleGraph, ao as defineRelationship, ap as extractEntityTitle, aq as extractMinimalFields, ar as getCollectionForEntity, as as getGraphEventsPublisher, at as getGraphStats, au as initializeGraph, av as isGraphInitialized, aw as parseRelationship, ax as shouldSyncEntity, ay as shouldSyncRelationship } from '../index-CUeQCuE5.js';
|
|
4
4
|
export { E as EntityEventType, G as GraphEventEmitter, a as GraphMiddlewareConfig, b as addGraphExtension } from '../prisma-extension-krXnYnrN.js';
|
|
5
5
|
import 'graphql-request';
|
|
6
6
|
import '../layer-GNAVXBMf.js';
|
|
7
|
-
import '../client-
|
|
7
|
+
import '../client-CCXpAZ2r.js';
|
|
8
8
|
import '@prisma/adapter-pg';
|
|
9
9
|
import 'pg';
|
|
10
10
|
import '../graph-emitter-r5TylDBm.js';
|
package/dist/graph/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { AUDIT_FIELDS, GraphEventsPublisher, GraphExportService, GraphModule, SOFT_DELETE_FIELDS, STANDARD_FIELDS, TENANT_FIELDS, createGraphEventsHelper, createGraphExportService, createPrismaGraphIntegration, createRelationshipFromEntity, defineEntity, defineGraphConfig, defineModuleGraph, defineRelationship, getGraphEventsPublisher, getGraphStats, initializeGraph, isGraphInitialized } from '../chunk-
|
|
2
|
-
export { GraphRegistry, addGraphExtension, createEntityEvent, createRelationshipEvent, extractEntityTitle, extractMinimalFields, getCollectionForEntity, parseRelationship, shouldSyncEntity, shouldSyncRelationship } from '../chunk-
|
|
1
|
+
export { AUDIT_FIELDS, GraphEventsPublisher, GraphExportService, GraphModule, SOFT_DELETE_FIELDS, STANDARD_FIELDS, TENANT_FIELDS, createGraphEventsHelper, createGraphExportService, createPrismaGraphIntegration, createRelationshipFromEntity, defineEntity, defineGraphConfig, defineModuleGraph, defineRelationship, getGraphEventsPublisher, getGraphStats, initializeGraph, isGraphInitialized } from '../chunk-7E76FL2C.js';
|
|
2
|
+
export { GraphRegistry, addGraphExtension, createEntityEvent, createRelationshipEvent, extractEntityTitle, extractMinimalFields, getCollectionForEntity, parseRelationship, shouldSyncEntity, shouldSyncRelationship } from '../chunk-OCYZEBOL.js';
|
|
3
3
|
import '../chunk-WFVLQELZ.js';
|
|
4
4
|
import '../chunk-URDYOM2L.js';
|
|
5
5
|
import '../chunk-JNJSSBKO.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as PrismaClientBase, b as PrismaClientWrapper, c as PrismaClientConfig, a as PrismaClientConstructorOptions, D as DatabaseReturnType, d as DatabaseHealth, C as ConnectionState, e as PrismaEvent, f as PrismaLogDefinition, g as PrismaLogEvent, h as PrismaLogLevel, i as PrismaQueryEvent, j as PrismaTransactionOptions, k as configurePrismaLogging, l as createConnectionPool, m as createPrismaAdapter, n as createPrismaClient, o as ensureServiceApplicationName, p as installAcquireRetry, q as isTransientAcquireError } from './client-
|
|
1
|
+
import { P as PrismaClientBase, b as PrismaClientWrapper, c as PrismaClientConfig, a as PrismaClientConstructorOptions, D as DatabaseReturnType, d as DatabaseHealth, C as ConnectionState, e as PrismaEvent, f as PrismaLogDefinition, g as PrismaLogEvent, h as PrismaLogLevel, i as PrismaQueryEvent, j as PrismaTransactionOptions, k as configurePrismaLogging, l as createConnectionPool, m as createPrismaAdapter, n as createPrismaClient, o as ensureServiceApplicationName, p as installAcquireRetry, q as isTransientAcquireError } from './client-CCXpAZ2r.js';
|
|
2
2
|
import { G as GraphEventEmitter } from './prisma-extension-krXnYnrN.js';
|
|
3
3
|
import { W as WorkspaceExtensionConfig, a as WorkspaceContext, b as addWorkspaceExtension, g as getWorkspaceContext, i as injectWhereWorkspaceId, m as maybeSetRlsGuc, c as maybeTagConnection, s as setWorkspaceContext, w as withWorkspaceContext, d as withWorkspaceContextSync } from './workspace-extension-TquhDEKU.js';
|
|
4
4
|
|
|
@@ -21,6 +21,7 @@ interface DatabaseClient<T extends PrismaClientBase> {
|
|
|
21
21
|
declare function createDatabaseClient<T extends PrismaClientBase>(PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T, config: DatabaseClientConfig): DatabaseClient<T>;
|
|
22
22
|
interface PoolTuningEnv {
|
|
23
23
|
applicationName: string;
|
|
24
|
+
queryTimeoutMillis?: number;
|
|
24
25
|
statementTimeoutMillis?: number;
|
|
25
26
|
idleInTransactionTimeoutMillis?: number;
|
|
26
27
|
lockTimeoutMillis?: number;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { B as BurdenoffGraphQLClient } from './graphql-Dxxpbzr3.js';
|
|
2
2
|
import { S as SDKContext } from './index-B8viwwDM.js';
|
|
3
|
-
import { P as PrismaClientBase } from './client-
|
|
3
|
+
import { P as PrismaClientBase } from './client-CCXpAZ2r.js';
|
|
4
4
|
import { G as GraphEventEmitterImpl, E as EntityEventRbacMetadata } from './graph-emitter-r5TylDBm.js';
|
|
5
5
|
import { G as GraphEventEmitter, E as EntityEventType, a as GraphMiddlewareConfig, b as addGraphExtension } from './prisma-extension-krXnYnrN.js';
|
|
6
6
|
|
package/dist/index.d.ts
CHANGED
|
@@ -11,8 +11,8 @@ import { A as ActivityModule, U as UsageModule, T as TrackerModule } from './ind
|
|
|
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';
|
|
14
|
-
import { G as GraphModule } from './index-
|
|
15
|
-
export { i as Graph } from './index-
|
|
14
|
+
import { G as GraphModule } from './index-CUeQCuE5.js';
|
|
15
|
+
export { i as Graph } from './index-CUeQCuE5.js';
|
|
16
16
|
import { B as BurdenoffGraphQLClient } from './graphql-Dxxpbzr3.js';
|
|
17
17
|
import { TemporalModule } from './temporal/index.js';
|
|
18
18
|
export { TemporalClient, TemporalClientConfig, TemporalClientFactory, TemporalWorker, TemporalWorkerConfig, TemporalWorkerFactory, TemporalWorkerManager, WorkflowStartOptions } from './temporal/index.js';
|
|
@@ -24,7 +24,7 @@ export { i as Cache } from './index-CgTMsars.js';
|
|
|
24
24
|
export { i as Middleware } from './index-DSOpj8DI.js';
|
|
25
25
|
export { i as Observability } from './index-4gKQKZ2B.js';
|
|
26
26
|
export { i as GraphQL } from './index-joONjwLt.js';
|
|
27
|
-
export { i as Prisma } from './index-
|
|
27
|
+
export { i as Prisma } from './index-42_fqdmi.js';
|
|
28
28
|
export { i as Utils } from './index-PaojfSdd.js';
|
|
29
29
|
export { i as I18n, I as I18nCapableContext, T as Translator, c as createTranslator, g as getLanguage, a as getLocale, h as hasI18n, t } from './index-D4l1u8VR.js';
|
|
30
30
|
export { i as Export } from './index-B4ciT3OZ.js';
|
|
@@ -39,10 +39,10 @@ export { i as Captcha, R as RecaptchaVerifyOptions, a as RecaptchaVerifyResult,
|
|
|
39
39
|
export { i as Platform } from './index-lcW5eSTp.js';
|
|
40
40
|
export { C as CircuitBreakerConfig, h as DEFAULT_CIRCUIT_BREAKER_CONFIG, i as DEFAULT_GATEWAY_RETRY_CONFIG, D as DEFAULT_GATEWAY_ROUTING, b as DEFAULT_LAYER_RESOURCES, c as DEFAULT_LAYER_STREAMS, f as GatewayRequestHeaders, g as GatewayRetryConfig, G as GatewayRoutingConfig, L as LayerConfig, a as LayerFullConfig, d as LayerGatewayConfig, e as LayerResourceUrls, S as ServiceLayer } from './layer-GNAVXBMf.js';
|
|
41
41
|
export { S as ShutdownDisposable, d as disposeAll, g as getRegisteredDisposableCount, r as registerDisposable, u as unregisterDisposable } from './shutdown-registry-CW9LryO8.js';
|
|
42
|
-
import './types-
|
|
42
|
+
import './types-DVG_lcsL.js';
|
|
43
43
|
import 'graphql';
|
|
44
44
|
import 'graphql-yoga';
|
|
45
|
-
import './client-
|
|
45
|
+
import './client-CCXpAZ2r.js';
|
|
46
46
|
import '@prisma/adapter-pg';
|
|
47
47
|
import 'pg';
|
|
48
48
|
import './workspace-extension-TquhDEKU.js';
|