@burdenoff/be-sdk 2026.518.2 → 2026.521.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/EventQueueFactory-PVXBZCT5.js +6 -0
  2. package/dist/{EventQueueFactory-6UJ3UIP4.js.map → EventQueueFactory-PVXBZCT5.js.map} +1 -1
  3. package/dist/auth/index.js +2 -2
  4. package/dist/cache/index.js +1 -1
  5. package/dist/{chunk-EZOXXSD4.js → chunk-2BG75H2K.js} +4 -4
  6. package/dist/{chunk-EZOXXSD4.js.map → chunk-2BG75H2K.js.map} +1 -1
  7. package/dist/{chunk-UNPJMENC.js → chunk-7NUQXGA7.js} +3 -3
  8. package/dist/{chunk-UNPJMENC.js.map → chunk-7NUQXGA7.js.map} +1 -1
  9. package/dist/{chunk-4XAEES25.js → chunk-ACYGOENW.js} +4 -850
  10. package/dist/chunk-ACYGOENW.js.map +1 -0
  11. package/dist/{chunk-MOCUBSTW.js → chunk-B7I4TABG.js} +2 -2
  12. package/dist/{chunk-MOCUBSTW.js.map → chunk-B7I4TABG.js.map} +1 -1
  13. package/dist/{chunk-O2MEBPDT.js → chunk-BNJFEOGH.js} +2 -2
  14. package/dist/chunk-BNJFEOGH.js.map +1 -0
  15. package/dist/{chunk-S5S6OBS6.js → chunk-BRYRHBAC.js} +3 -3
  16. package/dist/{chunk-S5S6OBS6.js.map → chunk-BRYRHBAC.js.map} +1 -1
  17. package/dist/{chunk-UBXFIIAW.js → chunk-BTQREMD4.js} +2 -2
  18. package/dist/{chunk-UBXFIIAW.js.map → chunk-BTQREMD4.js.map} +1 -1
  19. package/dist/{chunk-3F4SLVRL.js → chunk-DMPS4Y53.js} +3 -3
  20. package/dist/{chunk-3F4SLVRL.js.map → chunk-DMPS4Y53.js.map} +1 -1
  21. package/dist/{chunk-SNEOLWXT.js → chunk-E5USZ2MR.js} +2 -2
  22. package/dist/{chunk-SNEOLWXT.js.map → chunk-E5USZ2MR.js.map} +1 -1
  23. package/dist/{chunk-TM5RQ6P2.js → chunk-KGCISIBX.js} +22 -4
  24. package/dist/chunk-KGCISIBX.js.map +1 -0
  25. package/dist/{chunk-OJDXWHRJ.js → chunk-LD7ETTWG.js} +8 -7
  26. package/dist/chunk-LD7ETTWG.js.map +1 -0
  27. package/dist/{chunk-MVHOP4IG.js → chunk-MHNA7IS7.js} +2 -2
  28. package/dist/{chunk-MVHOP4IG.js.map → chunk-MHNA7IS7.js.map} +1 -1
  29. package/dist/{chunk-V2VEENJ2.js → chunk-PDSV3TFO.js} +3 -3
  30. package/dist/chunk-PDSV3TFO.js.map +1 -0
  31. package/dist/{chunk-CFUKZDDU.js → chunk-PPIDJP2W.js} +3 -3
  32. package/dist/chunk-PPIDJP2W.js.map +1 -0
  33. package/dist/{chunk-SO57HNXV.js → chunk-QRWTLPW5.js} +13 -7
  34. package/dist/chunk-QRWTLPW5.js.map +1 -0
  35. package/dist/chunk-REF7PANB.js +852 -0
  36. package/dist/chunk-REF7PANB.js.map +1 -0
  37. package/dist/{chunk-VLEOOG2L.js → chunk-SVONGBQR.js} +3 -3
  38. package/dist/{chunk-VLEOOG2L.js.map → chunk-SVONGBQR.js.map} +1 -1
  39. package/dist/{chunk-BESBOSX2.js → chunk-TGTJ653K.js} +4 -4
  40. package/dist/chunk-TGTJ653K.js.map +1 -0
  41. package/dist/{chunk-WCBKW3CL.js → chunk-X4GSV6NV.js} +5 -5
  42. package/dist/{chunk-WCBKW3CL.js.map → chunk-X4GSV6NV.js.map} +1 -1
  43. package/dist/{chunk-RRFNSBDZ.js → chunk-X4NELQLV.js} +3 -3
  44. package/dist/chunk-X4NELQLV.js.map +1 -0
  45. package/dist/event-queue/index.js +4 -4
  46. package/dist/export/index.js +3 -3
  47. package/dist/gateway/index.js +2 -2
  48. package/dist/gateway/security/index.js +1 -1
  49. package/dist/graph/index.d.ts +1 -1
  50. package/dist/graph/index.js +5 -5
  51. package/dist/graphql/index.js +2 -2
  52. package/dist/{index-CygU_fXS.d.ts → index-Cz9_vPi7.d.ts} +1 -0
  53. package/dist/index.d.ts +2 -2
  54. package/dist/index.js +23 -22
  55. package/dist/index.js.map +1 -1
  56. package/dist/init/index.js +3 -3
  57. package/dist/instrumentation/index.js +2 -1
  58. package/dist/metrics/index.d.ts +17 -0
  59. package/dist/metrics/index.js +53 -0
  60. package/dist/metrics/index.js.map +1 -0
  61. package/dist/pino-logger-NVZXQPWO.js +5 -0
  62. package/dist/{pino-logger-RYLGXPHZ.js.map → pino-logger-NVZXQPWO.js.map} +1 -1
  63. package/dist/prisma/index.js +4 -4
  64. package/dist/rbac/index.js +1 -1
  65. package/dist/{sdk-THO3IWEE.js → sdk-UWFH5PY7.js} +2 -2
  66. package/dist/{sdk-THO3IWEE.js.map → sdk-UWFH5PY7.js.map} +1 -1
  67. package/dist/server/index.js +3 -3
  68. package/dist/server/index.js.map +1 -1
  69. package/dist/telemetry/index.js +6 -5
  70. package/dist/telemetry/index.js.map +1 -1
  71. package/dist/tracker/index.js +2 -2
  72. package/dist/utils/index.js +1 -1
  73. package/dist/workspace-guard-524GBJQ6.js +5 -0
  74. package/dist/{workspace-guard-LHBNK4TG.js.map → workspace-guard-524GBJQ6.js.map} +1 -1
  75. package/package.json +3 -3
  76. package/dist/EventQueueFactory-6UJ3UIP4.js +0 -6
  77. package/dist/chunk-4XAEES25.js.map +0 -1
  78. package/dist/chunk-BESBOSX2.js.map +0 -1
  79. package/dist/chunk-CFUKZDDU.js.map +0 -1
  80. package/dist/chunk-O2MEBPDT.js.map +0 -1
  81. package/dist/chunk-OJDXWHRJ.js.map +0 -1
  82. package/dist/chunk-RRFNSBDZ.js.map +0 -1
  83. package/dist/chunk-SO57HNXV.js.map +0 -1
  84. package/dist/chunk-TM5RQ6P2.js.map +0 -1
  85. package/dist/chunk-V2VEENJ2.js.map +0 -1
  86. package/dist/pino-logger-RYLGXPHZ.js +0 -5
  87. package/dist/workspace-guard-LHBNK4TG.js +0 -5
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/activity/index.ts","../src/usage/index.ts","../src/tracker/stub.ts","../src/tracker/index.ts"],"names":["ActivityType","ActivityStatus","ActivitySeverity","ActivityModule","client","context","log","options","userId","ValidationError","activityType","resourceType","action","status","logger","debug","recordActivityMutation","legacyLogActivityMutation","variables","input","resourceId","workspaceId","organizationId","projectId","ipAddress","userAgent","metadata","severity","errorMessage","duration","response","query","info","activityId","recordActivity","id","error","message","Error","String","isRecordActivityUnavailable","includes","warn","reason","legacyResponse","logActivity","logSuccess","inferActivityType","logFailure","getActivities","startDate","endDate","search","limit","offset","sortBy","sortOrder","getActivity","getStats","getActivityStats","cleanup","olderThanDays","mutation","deletedCount","cleanupActivities","actionLower","toLowerCase","exportToCSV","exportActivities","csvData","UsageMetricType","UsageModule","track","entityId","entityType","metricType","amount","recordId","trackUsage","checkQuota","requestedAmount","allowed","requireQuota","result","QuotaExceededError","currentUsage","quotaLimit","resetAt","trackAndCheck","quotaCheck","usage","getUsage","getSummary","period","getUsageSummary","setQuota","quotaId","getQuota","getQuotas","resetQuota","deleteQuota","trackBulk","records","count","length","trackUsageBulk","_gatewayUrl","_gatewayUrlResolved","getGatewayUrl","process","env","undefined","LOG_ACTIVITY_MUTATION","fireActivityLog","gatewayUrl","actOpts","activityOptions","operationName","description","success","key","Object","keys","headers","fetch","method","body","JSON","stringify","signal","AbortSignal","timeout","ok","err","UnifiedTrackerStub","instance","getInstance","event","eventType","enabled","trackBatch","events","trackerStub","trackOperation","activityEnabled","createProductTracker","productId","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","map","op","total","successful","filter","r","failed"],"mappings":"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","file":"chunk-CFUKZDDU.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 as unknown as Record<string, unknown>);\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 _gatewayUrlResolved = false;\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 _gatewayUrl = process.env['WSPACE_INT_GATEWAY_URL'] ?? process.env['GLOBAL_INT_GATEWAY_URL'] ?? undefined;\n _gatewayUrlResolved = true;\n\n if (_gatewayUrl) {\n logger.info(`[trackOperation] Real tracking enabled via 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// 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 * Fire-and-forget activity log via GraphQL.\n * Never throws — logs errors at warn level and continues.\n */\nasync function fireActivityLog(gatewayUrl: string, options: UnifiedTrackingOptions): Promise<void> {\n try {\n const actOpts = options.activityOptions;\n const input: Record<string, unknown> = {\n activityType: actOpts?.activityType ?? options.operationName ?? 'unknown',\n description: actOpts?.description ?? `${options.operationName ?? 'operation'} executed`,\n workspaceId: actOpts?.workspaceId ?? options.workspaceId,\n resourceType: actOpts?.resourceType ?? options.resourceType,\n resourceId: actOpts?.resourceId ?? options.resourceId,\n metadata: {\n ...actOpts?.metadata,\n userId: options.userId,\n success: options.success ?? true,\n ...(options.errorMessage ? { errorMessage: options.errorMessage } : {}),\n },\n };\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 }\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(gatewayUrl, {\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 } 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);\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 +0,0 @@
1
- {"version":3,"sources":["../src/rbac/directive.ts","../src/rbac/index.ts"],"names":["LRUCache","cache","Map","maxSize","ttl","get","key","entry","undefined","Date","now","expiry","delete","set","value","size","firstKey","keys","next","clear","invalidateByPrefix","prefix","count","startsWith","RBACClient","client","config","GraphQLClient","rbacServiceUrl","failClosed","layer","enableCaching","cacheMaxSize","cacheTTL","parsePermission","permission","colonIndex","indexOf","resourceType","action","substring","checkPermission","actorId","actorType","scopeId","resourceId","cacheKey","cached","logger","debug","hasPermission","reason","CHECK_PERMISSION_QUERY","input","result","request","allowed","decisionPath","error","warn","clearCache","invalidateForActor","info","entriesRemoved","getLayer","getValueAtPath","obj","path","parts","split","current","part","getDirectiveArgument","directive","name","arg","arguments","find","a","kind","parseFieldArguments","field","variableValues","args","argName","argValue","parseObjectValue","fields","fieldName","fieldValue","toActorId","userId","sanitizeHeadersForLogging","headers","sanitized","Object","entries","lowerKey","toLowerCase","includes","getHeader","context","requestHeaders","contextHeaders","validateBypassTimestamp","timestamp","timestampMs","parseInt","isNaN","age","MAX_AGE","errorMessage","Error","message","checkBypassHeaders","shouldBypass","hasRequest","hasRequestHeaders","hasContextHeaders","requestHeadersType","contextHeadersType","allHeaders","forEach","sanitizedHeaders","contextHeadersObj","bypassHeader","bypassSource","bypassTimestamp","bypassAttempted","hasRbacBypass","hasBypassSource","hasBypassTimestamp","bypassContext","bypassFailureReason","source","verifyAuthentication","contextValue","ctx","user","actor","id","email","workspace_id","workspace","hasUser","GraphQLError","extensions","code","resolveResourceId","resourceIdField","selection","_rbacClient","_ctx","fieldArgs","availableArgs","hint","defaultPaths","contextWorkspaceId","triedPaths","join","resourceResolver","resolved","originalResourceId","resolvedResourceId","extractScopeId","workspaceId","tenantId","tenant","extractActorType","actorTypeHeader","upperType","toUpperCase","checkAndEnforcePermission","rbacClient","reasonSuffix","createRBACDirective","skipRbac","process","env","isProduction","onExecute","document","operation","definitions","def","operationName","schema","typeName","type","getType","getFields","selectionSet","selections","fieldDef","astNode","directives","d","bypassCheckResult","resource","operationType","buildRBACServiceUrl","routing","DEFAULT_GATEWAY_ROUTING","gateway","internalGateway","crossLayerGateway","host","port","graphqlPath","createRBACDirectiveForLayer","envPrefix","rbacLayer","timeout","createRBACDirectiveFromEnv","serviceName","createRBACClientFromEnv","options","DEFAULT_LAYER_RESOURCES","rbacGatewayUrl","RBACModule","requirePermission","ValidationError","query","variables","response","tenantQuery","PermissionDeniedError","getUserRoles","contextWithWorkspace","actorRoleAssignments","map","assignment","role","description","defaultPermissions","assignRoleToUser","roleId","mutation","removeRoleFromUser","findQuery","findResponse","assignmentId","createRole","permissionCount","length","createRoleMutation","createRoleVariables","scopeType","createResponse","normalizedPermissions","perm","level","permMap","levelPriority","ADMIN","EDITOR","VIEWER","NONE","existing","setPermissionMutation","failedPermissions","errorMsg","String","push","failedTypes","p","roleQuery","roleResponse","getAvailablePermissions","resourceTypesQuery","hasWorkspace","resourceTypesResponse","permissions","actionsQuery","resourceTypes","actionsResponse","actionDefinitions","checkMultiplePermissions","checks","inputs","check","some","c","checkPermissions","getEffectivePermissions","effectivePermissions","initializeWorkspaceRoles","ownerId","updateRole","updates","deleteRole","reassignToRoleId","success","listRoles","filter","includeSystem","pagination","limit","offset","roles","getRole"],"mappings":"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","file":"chunk-O2MEBPDT.js","sourcesContent":["/**\n * RBAC Directive Plugin\n *\n * Centralized GraphQL directive enforcement for @requiresPermission\n * This plugin is shared across all microservices for consistent RBAC implementation.\n *\n * @module rbac/directive\n * @example\n * ```typescript\n * import { createRBACDirective } from '@burdenoff/be-sdk/rbac/directive';\n *\n * const server = await createServer({\n * yogaPlugins: [\n * createRBACDirective({\n * // Use Workspaces Gateway (RBAC is part of workspaces supergraph)\n * rbacServiceUrl: process.env.RBAC_GATEWAY_URL || 'http://localhost:4001/graphql',\n * enableCaching: true,\n * }),\n * ],\n * });\n * ```\n */\n\nimport type { Plugin } from '@envelop/core';\nimport {\n GraphQLError,\n type OperationDefinitionNode,\n type FieldNode,\n type ArgumentNode,\n type ObjectValueNode,\n type DirectiveNode,\n type DefinitionNode,\n} from 'graphql';\nimport { GraphQLClient } from 'graphql-request';\nimport { logger } from '../logger/index.js';\nimport type { ServiceLayer } from '../types/layer.js';\nimport { DEFAULT_GATEWAY_ROUTING } from '../types/layer.js';\n\n/**\n * User from context\n */\ninterface ContextUser {\n id: string;\n email?: string;\n workspace_id?: string;\n}\n\n/**\n * Actor type for PBAC\n */\ntype ActorType = 'USER' | 'BOT' | 'INTEGRATION' | 'DELEGATED_AGENT';\n\n/**\n * Expected context shape\n */\ninterface RBACContext {\n user?: ContextUser;\n actor?: { id?: string; email?: string } | null;\n actorId?: string;\n workspace?: { id: string };\n tenant?: { id: string };\n request?: {\n headers?: {\n get?: (name: string) => string | undefined;\n authorization?: string;\n 'x-rbac-bypass'?: string;\n 'x-bypass-source'?: string;\n 'x-bypass-timestamp'?: string;\n 'x-actor-id'?: string;\n 'x-actor-type'?: string;\n 'x-workspace-id'?: string;\n 'x-tenant-id'?: string;\n };\n };\n headers?: {\n authorization?: string;\n 'x-rbac-bypass'?: string;\n 'x-bypass-source'?: string;\n 'x-bypass-timestamp'?: string;\n 'x-actor-id'?: string;\n 'x-actor-type'?: string;\n 'x-workspace-id'?: string;\n 'x-tenant-id'?: string;\n };\n}\n\n/**\n * RBAC layer - determines which RBAC service to use\n */\nexport type RBACLayer = 'wspace' | 'global';\n\n/**\n * Configuration for RBAC directive plugin\n */\nexport interface RBACDirectiveConfig {\n /**\n * URL of the RBAC microservice GraphQL endpoint via Gateway\n * - wspace layer: Workspaces Gateway (wspace-rbac-svc)\n * - global layer: Global Gateway (global-rbac-svc)\n * @example 'http://localhost:4001/graphql' (Workspaces Gateway)\n * @example 'http://localhost:4000/graphql' (Global Gateway)\n */\n rbacServiceUrl: string;\n\n /**\n * RBAC layer - determines scope handling\n * - 'wspace': Uses workspaceId as scopeId (workspace-scoped permissions)\n * - 'global': Uses tenantId or 'global' as scopeId (global/billing-scoped permissions)\n * @default 'wspace'\n */\n layer?: RBACLayer;\n\n /**\n * Enable in-memory caching of permission checks\n * Caching reduces latency and load on RBAC service\n * @default true\n */\n enableCaching?: boolean;\n\n /**\n * Cache TTL in milliseconds\n * @default 60000 (1 minute)\n */\n cacheTTL?: number;\n\n /**\n * Maximum cache size (number of entries)\n * @default 10000\n */\n cacheMaxSize?: number;\n\n /**\n * Timeout for RBAC service requests in milliseconds\n * @default 5000 (5 seconds)\n */\n timeout?: number;\n\n /**\n * Fail-closed security: deny access on errors\n * When true, any error checking permissions results in denial\n * When false, errors are logged but access is allowed (NOT RECOMMENDED)\n * @default true\n */\n failClosed?: boolean;\n\n /**\n * Custom resource resolver function\n * Converts resource identifiers to RBAC resource UUIDs\n * If not provided, uses resource ID directly\n */\n resourceResolver?: (identifier: string, resourceType?: string) => Promise<string | null>;\n\n /**\n * Skip RBAC checks entirely (DEVELOPMENT ONLY)\n * When true, all RBAC checks are bypassed and requests are allowed.\n * ⚠️ WARNING: This should NEVER be enabled in production!\n *\n * Can also be set via SKIP_RBAC=true environment variable.\n * Environment variable takes precedence if set.\n *\n * Use cases:\n * - Local development before RBAC is fully configured\n * - Testing without RBAC service running\n * - Debugging permission issues\n *\n * @default false\n */\n skipRbac?: boolean;\n}\n\n/**\n * Permission check result from RBAC service\n */\ninterface CheckPermissionResult {\n hasPermission: boolean;\n reason?: string;\n}\n\n/**\n * Simple LRU cache for permission checks\n */\nclass LRUCache<K, V> {\n private cache = new Map<K, { value: V; expiry: number }>();\n private maxSize: number;\n private ttl: number;\n\n constructor(maxSize: number, ttl: number) {\n this.maxSize = maxSize;\n this.ttl = ttl;\n }\n\n get(key: K): V | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n if (Date.now() > entry.expiry) {\n this.cache.delete(key);\n return undefined;\n }\n\n // Move to end (LRU)\n this.cache.delete(key);\n this.cache.set(key, entry);\n\n return entry.value;\n }\n\n set(key: K, value: V): void {\n // Remove oldest if at capacity\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, {\n value,\n expiry: Date.now() + this.ttl,\n });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Invalidate all entries whose key starts with the given prefix.\n * Used to evict all cached permissions for a specific actor.\n */\n invalidateByPrefix(prefix: string): number {\n let count = 0;\n for (const key of [...this.cache.keys()]) {\n if (typeof key === 'string' && key.startsWith(prefix)) {\n this.cache.delete(key);\n count++;\n }\n }\n return count;\n }\n}\n\n/**\n * Input for PBAC permission check\n */\ninterface PermissionCheckInput {\n actorId: string;\n actorType: ActorType;\n scopeId: string;\n resourceType: string;\n action: string;\n resourceId?: string;\n}\n\n/**\n * RBAC service client for permission checks\n */\nclass RBACClient {\n private client: GraphQLClient;\n private cache?: LRUCache<string, boolean>;\n private config: Required<Pick<RBACDirectiveConfig, 'failClosed'>> & { layer: RBACLayer };\n\n constructor(config: RBACDirectiveConfig) {\n this.client = new GraphQLClient(config.rbacServiceUrl);\n\n this.config = {\n failClosed: config.failClosed !== false,\n layer: config.layer || 'wspace',\n };\n\n if (config.enableCaching !== false) {\n this.cache = new LRUCache<string, boolean>(\n config.cacheMaxSize || 10000,\n config.cacheTTL || 60000 // 1 minute\n );\n }\n }\n\n /**\n * Parse permission string into resourceType and action\n * @example \"project:read\" => { resourceType: \"project\", action: \"read\" }\n * @example \"rbac:role:create\" => { resourceType: \"rbac\", action: \"role:create\" }\n */\n private parsePermission(permission: string): { resourceType: string; action: string } {\n const colonIndex = permission.indexOf(':');\n if (colonIndex === -1) {\n // No colon - treat entire string as resourceType with \"read\" action\n return { resourceType: permission, action: 'read' };\n }\n return {\n resourceType: permission.substring(0, colonIndex),\n action: permission.substring(colonIndex + 1),\n };\n }\n\n /**\n * Check if actor has permission using the new PBAC checkPermission query\n */\n async checkPermission(\n actorId: string,\n actorType: ActorType,\n scopeId: string,\n permission: string,\n resourceId?: string\n ): Promise<CheckPermissionResult> {\n const { resourceType, action } = this.parsePermission(permission);\n const cacheKey = `${actorId}:${actorType}:${scopeId}:${resourceType}:${action}:${resourceId || ''}`;\n\n // Check cache\n if (this.cache) {\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n logger.debug('[RBAC Directive] Cache hit', {\n actorId,\n actorType,\n scopeId,\n resourceType,\n action,\n resourceId,\n hasPermission: cached,\n });\n return {\n hasPermission: cached,\n reason: cached ? 'Cached: Permission granted' : 'Cached: Permission denied',\n };\n }\n }\n\n // Query RBAC service using new PBAC format\n const CHECK_PERMISSION_QUERY = `\n query CheckPermission($input: PermissionCheckInput!) {\n checkPermission(input: $input) {\n allowed\n decisionPath\n roleName\n roleLevel\n overrideType\n }\n }\n `;\n\n const input: PermissionCheckInput = {\n actorId,\n actorType,\n scopeId,\n resourceType,\n action,\n resourceId,\n };\n\n try {\n logger.debug('[RBAC Directive] Checking permission via RBAC service (PBAC)', {\n input,\n layer: this.config.layer,\n });\n\n const result = await this.client.request<{\n checkPermission: {\n allowed: boolean;\n decisionPath: string;\n roleName?: string;\n roleLevel?: string;\n overrideType?: string;\n };\n }>(CHECK_PERMISSION_QUERY, { input });\n\n const hasPermission = result.checkPermission.allowed;\n const decisionPath = result.checkPermission.decisionPath;\n\n // Cache result\n if (this.cache) {\n this.cache.set(cacheKey, hasPermission);\n }\n\n logger.debug('[RBAC Directive] Permission check result', {\n actorId,\n resourceType,\n action,\n hasPermission,\n decisionPath,\n });\n\n return {\n hasPermission,\n reason: decisionPath,\n };\n } catch (error) {\n logger.error('[RBAC Directive] RBAC service error', {\n error,\n input,\n layer: this.config.layer,\n });\n\n // Fail closed or open based on config\n if (this.config.failClosed) {\n return {\n hasPermission: false,\n reason: 'RBAC service unavailable - access denied (fail-closed)',\n };\n } else {\n logger.warn('[RBAC Directive] Fail-open mode: allowing access despite RBAC error');\n return {\n hasPermission: true,\n reason: 'RBAC service unavailable - access allowed (fail-open)',\n };\n }\n }\n }\n\n /**\n * Clear permission cache (useful for testing or when permissions change)\n */\n clearCache(): void {\n this.cache?.clear();\n }\n\n /**\n * Invalidate cached permissions for a specific actor.\n * Call this when an actor's roles or permissions change to avoid stale cache hits.\n *\n * @param actorId - The actor whose cached permissions should be evicted\n * @returns Number of cache entries invalidated\n */\n invalidateForActor(actorId: string): number {\n if (!this.cache) return 0;\n const count = this.cache.invalidateByPrefix(`${actorId}:`);\n if (count > 0) {\n logger.info('[RBAC Directive] Invalidated cached permissions for actor', { actorId, entriesRemoved: count });\n }\n return count;\n }\n\n /**\n * Get the configured layer\n */\n getLayer(): RBACLayer {\n return this.config.layer;\n }\n}\n\n/**\n * Extract value from nested object path\n * @example getValueAtPath({ input: { id: '123' } }, 'input.id') => '123'\n */\nfunction getValueAtPath(obj: Record<string, unknown>, path: string): string | undefined {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n // Type guard: ensure current is an object before property access\n if (typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return typeof current === 'string' ? current : undefined;\n}\n\n/**\n * Extract directive argument value\n */\nfunction getDirectiveArgument(directive: { arguments?: readonly ArgumentNode[] }, name: string): string | undefined {\n const arg = directive.arguments?.find((a: ArgumentNode) => a.name.value === name);\n if (arg && arg.value.kind === 'StringValue') {\n return arg.value.value;\n }\n return undefined;\n}\n\n/**\n * Parse GraphQL arguments to plain object\n */\nfunction parseFieldArguments(field: FieldNode, variableValues: Record<string, unknown>): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n\n for (const arg of field.arguments || []) {\n const argName = arg.name.value;\n const argValue = arg.value;\n\n if (argValue.kind === 'Variable') {\n args[argName] = variableValues[argValue.name.value];\n } else if (argValue.kind === 'ObjectValue') {\n args[argName] = parseObjectValue(argValue, variableValues);\n } else if ('value' in argValue) {\n args[argName] = argValue.value;\n }\n }\n\n return args;\n}\n\n/**\n * Parse GraphQL object value to plain object\n */\nfunction parseObjectValue(obj: ObjectValueNode, variableValues: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const field of obj.fields || []) {\n const fieldName = field.name.value;\n const fieldValue = field.value;\n\n if (fieldValue.kind === 'Variable') {\n result[fieldName] = variableValues[fieldValue.name.value];\n } else if (fieldValue.kind === 'ObjectValue') {\n result[fieldName] = parseObjectValue(fieldValue, variableValues);\n } else if ('value' in fieldValue) {\n result[fieldName] = fieldValue.value;\n }\n }\n\n return result;\n}\n\n/**\n * Convert user ID to actor ID format\n *\n * NOTE: This function currently performs no transformation (identity function).\n * It was added as an extension point for future actor ID transformations if needed.\n *\n * Historically, actor IDs used a different format (e.g., \"actor:user-123\"),\n * but this was simplified to use user IDs directly for consistency.\n *\n * Keep this function in place to:\n * 1. Maintain API compatibility with existing code\n * 2. Provide a centralized point for future ID transformations\n * 3. Make the ID transformation intent explicit in the code\n *\n * @param userId - User ID from context\n * @returns Actor ID (currently identical to user ID)\n * @example abc-123 => abc-123\n */\nfunction toActorId(userId: string): string {\n return userId;\n}\n\n/**\n * Sanitize headers for logging (redact sensitive values)\n * @param headers - Headers object to sanitize\n * @returns Sanitized headers with sensitive values redacted\n */\nfunction sanitizeHeadersForLogging(headers: Record<string, string>): Record<string, string> {\n const sanitized: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(headers)) {\n const lowerKey = key.toLowerCase();\n\n // Redact sensitive headers\n if (\n lowerKey.includes('auth') ||\n lowerKey.includes('token') ||\n lowerKey.includes('password') ||\n lowerKey.includes('secret') ||\n lowerKey.includes('key') ||\n lowerKey.includes('credential')\n ) {\n sanitized[key] = '***REDACTED***';\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n}\n\n/**\n * Get header value from context (checks both request.headers and headers)\n */\nfunction getHeader(context: RBACContext, key: string): string | undefined {\n // Try request.headers first (if available)\n if (context.request?.headers) {\n // If it has a get method, use it\n if (typeof context.request.headers.get === 'function') {\n const value = context.request.headers.get(key);\n if (value) return value;\n }\n // Otherwise treat as object\n const requestHeaders = context.request.headers as Record<string, string | undefined>;\n const value = requestHeaders[key];\n if (value) return value;\n }\n\n // Fallback to context.headers\n if (context.headers) {\n const contextHeaders = context.headers as Record<string, string | undefined>;\n const value = contextHeaders[key];\n if (value) return value;\n }\n\n return undefined;\n}\n\n/**\n * Validate bypass timestamp to prevent replay attacks\n * @param timestamp - Timestamp string in milliseconds\n * @returns true if timestamp is fresh (< 1 minute old)\n */\nfunction validateBypassTimestamp(timestamp: string): boolean {\n try {\n const timestampMs = parseInt(timestamp, 10);\n if (isNaN(timestampMs)) {\n return false;\n }\n\n const now = Date.now();\n const age = now - timestampMs;\n const MAX_AGE = 60 * 1000; // 1 minute (sufficient for network latency, reduces replay attack window)\n\n if (age > MAX_AGE || age < 0) {\n logger.warn('[RBAC Directive] Stale bypass timestamp', {\n age,\n timestamp: timestampMs,\n now,\n });\n return false;\n }\n\n return true;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n logger.warn('[RBAC Directive] Invalid bypass timestamp format', {\n timestamp,\n error: errorMessage,\n });\n return false;\n }\n}\n\n/**\n * Bypass check result with context information\n */\ninterface BypassCheckResult {\n shouldBypass: boolean;\n bypassContext?: {\n bypassAttempted: boolean;\n bypassSource?: string;\n bypassTimestamp?: string;\n bypassFailureReason?: string;\n };\n}\n\n/**\n * Check if request should bypass RBAC based on headers\n * This is used for internal service-to-service communication\n *\n * ⚠️ ARCHITECTURE NOTE: Header Transformation Flow\n * ================================================\n * These headers are TRANSFORMED by the Internal API Gateway before reaching this directive.\n *\n * Flow:\n * 1. Service A (internal-client.ts) → Internal API Gateway\n * Headers sent: x-bypass-permission, x-service-identity, x-call-type\n *\n * 2. Internal API Gateway → Service B (this RBAC directive)\n * Headers transformed to: x-rbac-bypass, x-bypass-source, x-bypass-timestamp\n *\n * This directive validates the TRANSFORMED headers from the gateway, not the original\n * headers from the internal client. The mismatch between internal-client.ts:101-106\n * and this function is INTENTIONAL and part of the security architecture.\n *\n * DO NOT \"fix\" internal-client.ts to send these headers - the gateway handles transformation.\n *\n * Headers required (after gateway transformation):\n * - x-rbac-bypass: \"true\"\n * - x-bypass-source: Service identity (e.g., \"scheduler-service\")\n * - x-bypass-timestamp: Unix timestamp in milliseconds\n *\n * @param context - GraphQL context containing headers\n * @returns Bypass check result with context for error reporting\n */\nfunction checkBypassHeaders(context: RBACContext): BypassCheckResult {\n // First check for actor type bypass (service or super_admin bypasses RBAC)\n const actorType = getHeader(context, 'x-actor-type');\n const actorId = getHeader(context, 'x-actor-id');\n\n if (actorType === 'service' || actorType === 'super_admin') {\n logger.debug('[RBAC Directive] Actor type bypass - service/super_admin', {\n actorType,\n actorId,\n });\n return { shouldBypass: true };\n }\n\n // Debug: Log all available headers\n logger.debug('[RBAC Directive] Checking bypass headers - context structure', {\n hasRequest: !!context.request,\n hasRequestHeaders: !!context.request?.headers,\n hasContextHeaders: !!context.headers,\n requestHeadersType: context.request?.headers ? typeof context.request.headers : 'undefined',\n contextHeadersType: context.headers ? typeof context.headers : 'undefined',\n actorType,\n actorId,\n });\n\n // Debug: Try to extract and log all headers (sanitized)\n const allHeaders: Record<string, string> = {};\n if (context.request?.headers) {\n if (typeof context.request.headers.get === 'function') {\n // Headers object with get method\n logger.debug('[RBAC Directive] Headers object has get method');\n } else {\n // Plain object\n const headers = context.request.headers as Record<string, string | undefined>;\n Object.keys(headers).forEach((key) => {\n const value = headers[key];\n if (value) allHeaders[key] = value;\n });\n const sanitizedHeaders = sanitizeHeadersForLogging(allHeaders);\n logger.debug('[RBAC Directive] Request headers (plain object)', { headers: sanitizedHeaders });\n }\n }\n if (context.headers) {\n const headers = context.headers as Record<string, string | undefined>;\n const contextHeadersObj: Record<string, string> = {};\n Object.keys(headers).forEach((key) => {\n const value = headers[key];\n if (value) contextHeadersObj[key] = value;\n });\n const sanitizedHeaders = sanitizeHeadersForLogging(contextHeadersObj);\n logger.debug('[RBAC Directive] Context headers', { headers: sanitizedHeaders });\n }\n\n const bypassHeader = getHeader(context, 'x-rbac-bypass');\n const bypassSource = getHeader(context, 'x-bypass-source');\n const bypassTimestamp = getHeader(context, 'x-bypass-timestamp');\n\n logger.debug('[RBAC Directive] Extracted bypass headers', {\n bypassHeader,\n bypassSource,\n bypassTimestamp,\n });\n\n // Check if bypass headers are present\n const bypassAttempted = !!(bypassHeader || bypassSource || bypassTimestamp);\n\n // Must have all three headers\n if (!bypassHeader || !bypassSource || !bypassTimestamp) {\n logger.debug('[RBAC Directive] Missing bypass headers - bypass NOT granted', {\n hasRbacBypass: !!bypassHeader,\n hasBypassSource: !!bypassSource,\n hasBypassTimestamp: !!bypassTimestamp,\n });\n\n if (bypassAttempted) {\n return {\n shouldBypass: false,\n bypassContext: {\n bypassAttempted: true,\n bypassSource,\n bypassTimestamp,\n bypassFailureReason: 'Missing required bypass headers',\n },\n };\n }\n\n return { shouldBypass: false };\n }\n\n // Verify bypass is 'true'\n if (bypassHeader !== 'true') {\n logger.warn('[RBAC Directive] Invalid bypass header value', { value: bypassHeader });\n return {\n shouldBypass: false,\n bypassContext: {\n bypassAttempted: true,\n bypassSource,\n bypassTimestamp,\n bypassFailureReason: `Invalid bypass header value: ${bypassHeader}`,\n },\n };\n }\n\n // Validate timestamp freshness (prevent replay attacks)\n if (!validateBypassTimestamp(bypassTimestamp)) {\n logger.warn('[RBAC Directive] Bypass rejected: stale timestamp', {\n source: bypassSource,\n timestamp: bypassTimestamp,\n });\n return {\n shouldBypass: false,\n bypassContext: {\n bypassAttempted: true,\n bypassSource,\n bypassTimestamp,\n bypassFailureReason: 'Stale or invalid timestamp (replay attack prevention)',\n },\n };\n }\n\n // All checks passed\n logger.debug('[RBAC Directive] Valid bypass headers detected', {\n source: bypassSource,\n timestamp: bypassTimestamp,\n });\n\n return { shouldBypass: true };\n}\n\n/**\n * Verify user authentication from context\n */\nfunction verifyAuthentication(contextValue: unknown, fieldName: string, permission: string): ContextUser {\n const ctx = contextValue as RBACContext;\n const user =\n ctx.user ??\n (ctx.actor?.id\n ? {\n id: ctx.actor.id,\n email: ctx.actor.email,\n workspace_id: ctx.workspace?.id,\n }\n : ctx.actorId\n ? {\n id: ctx.actorId,\n workspace_id: ctx.workspace?.id,\n }\n : undefined);\n\n logger.debug('[RBAC Directive] Checking authentication', {\n hasUser: !!user,\n userId: user?.id,\n fieldName,\n });\n\n if (!user?.id) {\n logger.warn('[RBAC Directive] Authentication required but user not found', {\n fieldName,\n permission,\n });\n throw new GraphQLError('Authentication required', {\n extensions: {\n code: 'UNAUTHENTICATED',\n field: fieldName,\n permission,\n },\n });\n }\n\n return user;\n}\n\n/**\n * Resolve resource ID from field arguments and configuration\n */\nasync function resolveResourceId(\n resourceIdField: string | undefined,\n selection: FieldNode,\n variableValues: Record<string, unknown> | null | undefined,\n config: RBACDirectiveConfig,\n _rbacClient: RBACClient,\n _ctx: RBACContext,\n permission: string,\n fieldName: string\n): Promise<string> {\n let resourceId: string | undefined;\n\n // Parse GraphQL arguments\n const fieldArgs = parseFieldArguments(selection, variableValues || {});\n\n if (resourceIdField) {\n // Explicit resourceIdField specified - use that path\n resourceId = getValueAtPath(fieldArgs, resourceIdField);\n\n if (!resourceId) {\n logger.error('[RBAC Directive] Resource ID not found at specified path', {\n resourceIdField,\n fieldName,\n permission,\n availableArgs: Object.keys(fieldArgs),\n });\n\n throw new GraphQLError(\n `Resource ID not found at specified path \"${resourceIdField}\" for permission \"${permission}\"`,\n {\n extensions: {\n code: 'INVALID_RESOURCE_CONFIGURATION',\n field: fieldName,\n permission,\n resourceIdField,\n hint: `Check that the field path \"${resourceIdField}\" exists in your arguments`,\n },\n }\n );\n }\n\n logger.debug('[RBAC Directive] Using explicit resourceIdField', {\n resourceIdField,\n resourceId,\n fieldName,\n });\n } else {\n // No resourceIdField specified - try common conventions\n const defaultPaths = ['id', 'input.id'];\n\n for (const path of defaultPaths) {\n resourceId = getValueAtPath(fieldArgs, path);\n if (resourceId) {\n logger.debug('[RBAC Directive] Auto-resolved resource ID from convention', {\n path,\n resourceId,\n fieldName,\n permission,\n });\n break;\n }\n }\n\n if (!resourceId) {\n // Fall back to context-based resource ID from headers\n // This is useful for list operations where the resource isn't in arguments\n const contextWorkspaceId = _ctx.workspace?.id;\n\n if (contextWorkspaceId) {\n resourceId = contextWorkspaceId;\n logger.debug('[RBAC Directive] Using workspace ID from context headers', {\n resourceId,\n fieldName,\n permission,\n });\n } else {\n logger.error('[RBAC Directive] No resource ID available for permission check', {\n permission,\n fieldName,\n triedPaths: defaultPaths,\n availableArgs: Object.keys(fieldArgs),\n });\n\n throw new GraphQLError(\n `Cannot check permission \"${permission}\": No resource ID available. ` +\n `Tried default paths: ${defaultPaths.join(', ')}. ` +\n `Either provide one of these fields in your arguments, specify resourceIdField in the directive, or pass x-workspace-id header.`,\n {\n extensions: {\n code: 'INVALID_RESOURCE_CONFIGURATION',\n field: fieldName,\n permission,\n triedPaths: defaultPaths,\n hint: 'Add resourceIdField parameter to @requiresPermission directive (e.g., resourceIdField: \"input.workspaceId\") or pass x-workspace-id header',\n },\n }\n );\n }\n }\n }\n\n // Apply custom resource resolver if configured\n if (resourceId && config.resourceResolver) {\n const resolved = await config.resourceResolver(resourceId, permission.split(':')[0]);\n\n if (!resolved) {\n logger.warn('[RBAC Directive] Custom resource resolver returned null', {\n originalResourceId: resourceId,\n permission,\n fieldName,\n });\n\n throw new GraphQLError('Resource not found or invalid', {\n extensions: {\n code: 'FORBIDDEN',\n field: fieldName,\n permission,\n resourceId,\n hint: 'Resource resolver could not resolve the resource ID',\n },\n });\n }\n\n logger.debug('[RBAC Directive] Custom resource resolver applied', {\n originalResourceId: resourceId,\n resolvedResourceId: resolved,\n fieldName,\n });\n\n return resolved;\n }\n\n // Return the resource ID as-is (assume it's already a valid UUID/identifier)\n return resourceId;\n}\n\n/**\n * Extract scope ID from context based on layer\n */\nfunction extractScopeId(ctx: RBACContext, layer: RBACLayer): string {\n if (layer === 'wspace') {\n // Workspace layer: use workspaceId\n const workspaceId = getHeader(ctx, 'x-workspace-id') || ctx.workspace?.id;\n\n if (!workspaceId) {\n throw new GraphQLError('Workspace ID required for workspace-layer RBAC', {\n extensions: { code: 'BAD_REQUEST', hint: 'Pass x-workspace-id header or ensure workspace context is set' },\n });\n }\n return workspaceId;\n } else {\n // Global layer: use tenantId or 'global' for superadmin\n const tenantId = getHeader(ctx, 'x-tenant-id') || ctx.tenant?.id || 'global'; // Default to global scope for superadmin operations\n\n return tenantId;\n }\n}\n\n/**\n * Extract actor type from context\n */\nfunction extractActorType(ctx: RBACContext): ActorType {\n const actorTypeHeader = getHeader(ctx, 'x-actor-type');\n\n if (actorTypeHeader) {\n const upperType = actorTypeHeader.toUpperCase();\n if (['USER', 'BOT', 'INTEGRATION', 'DELEGATED_AGENT'].includes(upperType)) {\n return upperType as ActorType;\n }\n }\n\n // Default to USER\n return 'USER';\n}\n\n/**\n * Check permission and throw error if denied\n */\nasync function checkAndEnforcePermission(\n rbacClient: RBACClient,\n ctx: RBACContext,\n actorId: string,\n permission: string,\n resolvedResourceId: string | undefined,\n userId: string,\n fieldName: string,\n bypassContext?: {\n bypassAttempted: boolean;\n bypassSource?: string;\n bypassTimestamp?: string;\n bypassFailureReason?: string;\n }\n): Promise<void> {\n const layer = rbacClient.getLayer();\n const actorType = extractActorType(ctx);\n const scopeId = extractScopeId(ctx, layer);\n\n logger.info('[RBAC Directive] Checking permission', {\n userId,\n actorId,\n actorType,\n scopeId,\n permission,\n resourceId: resolvedResourceId,\n fieldName,\n layer,\n bypassAttempted: bypassContext?.bypassAttempted ?? false,\n });\n\n const { hasPermission, reason } = await rbacClient.checkPermission(\n actorId,\n actorType,\n scopeId,\n permission,\n resolvedResourceId\n );\n\n if (!hasPermission) {\n logger.warn('[RBAC Directive] Permission denied', {\n userId,\n actorType,\n scopeId,\n permission,\n reason,\n fieldName,\n bypassContext,\n });\n\n const reasonSuffix = reason ? ` - ${reason}` : '';\n const errorMessage = `Forbidden: Missing permission \"${permission}\"${reasonSuffix}`;\n\n // Include bypass context in error extensions for debugging\n const extensions: Record<string, unknown> = {\n code: 'FORBIDDEN',\n permission,\n reason,\n field: fieldName,\n resourceId: resolvedResourceId,\n scopeId,\n layer,\n };\n\n // Add bypass context if a bypass was attempted but failed\n if (bypassContext?.bypassAttempted) {\n extensions['bypassAttempted'] = true;\n extensions['bypassSource'] = bypassContext.bypassSource;\n extensions['bypassTimestamp'] = bypassContext.bypassTimestamp;\n extensions['bypassFailureReason'] = bypassContext.bypassFailureReason;\n }\n\n throw new GraphQLError(errorMessage, { extensions });\n }\n\n logger.info('[RBAC Directive] Permission granted', {\n userId,\n permission,\n fieldName,\n reason,\n });\n}\n\n/**\n * Create RBAC directive enforcement plugin\n *\n * This plugin:\n * 1. Intercepts GraphQL operations BEFORE execution\n * 2. Checks for @requiresPermission directive on fields\n * 3. Validates user authentication\n * 4. Extracts resource ID from field arguments\n * 5. Calls RBAC service to check permissions\n * 6. Allows or denies operation based on permission check\n *\n * @param config - RBAC directive configuration\n * @returns Envelop plugin instance\n *\n * @example\n * ```typescript\n * // In microservice server initialization\n * const server = await createServer({\n * yogaPlugins: [\n * createRBACDirective({\n * // Use Workspaces Gateway (RBAC is part of workspaces supergraph)\n * rbacServiceUrl: process.env.RBAC_GATEWAY_URL || 'http://localhost:4001/graphql',\n * enableCaching: true,\n * cacheTTL: 300000, // 5 minutes\n * failClosed: true, // Deny access on errors\n * }),\n * useGraphQLModules(application),\n * ],\n * });\n * ```\n */\nexport function createRBACDirective(config: RBACDirectiveConfig): Plugin {\n // Check for SKIP_RBAC - environment variable takes precedence over config\n const skipRbac = process.env['SKIP_RBAC'] === 'true' || config.skipRbac === true;\n\n if (skipRbac) {\n const isProduction = process.env['NODE_ENV'] === 'production';\n\n // CRITICAL: Prevent SKIP_RBAC in production environments\n if (isProduction) {\n throw new Error(\n '[RBAC Directive] FATAL: SKIP_RBAC cannot be enabled in production environments. ' +\n 'This would bypass all authorization checks and is a critical security vulnerability. ' +\n 'Remove SKIP_RBAC=true from your environment configuration.'\n );\n }\n\n logger.warn('[RBAC Directive] ⚠️ RBAC CHECKS ARE DISABLED (SKIP_RBAC=true) - DO NOT USE IN PRODUCTION!');\n return {\n async onExecute({ args }): Promise<void> {\n // Log which operation is being executed without RBAC checks for audit trail\n const { document } = args;\n const operation = document.definitions.find(\n (def: DefinitionNode): def is OperationDefinitionNode => def.kind === 'OperationDefinition'\n );\n const operationName = operation?.name?.value || 'anonymous';\n logger.warn('[RBAC Directive] RBAC check skipped for operation', { operationName });\n },\n };\n }\n\n const rbacClient = new RBACClient(config);\n\n return {\n // 🔒 CRITICAL: Use onExecute (not onExecuteDone) to block BEFORE execution\n async onExecute({ args }): Promise<void> {\n logger.debug('[RBAC Directive] onExecute called');\n const { schema, document, contextValue, variableValues } = args;\n\n // Find the operation definition\n const operation = document.definitions.find(\n (def: DefinitionNode): def is OperationDefinitionNode => def.kind === 'OperationDefinition'\n );\n\n if (!operation) {\n logger.debug('[RBAC Directive] No operation definition found, skipping');\n return;\n }\n\n // Get the type based on operation (Query or Mutation)\n const typeName = operation.operation === 'mutation' ? 'Mutation' : 'Query';\n const type = schema.getType(typeName);\n\n if (!type || !('getFields' in type)) {\n logger.debug(`[RBAC Directive] Type ${typeName} not found, skipping`);\n return;\n }\n\n const fields = type.getFields();\n\n // Check each selected field for @requiresPermission directive\n for (const selection of operation.selectionSet.selections) {\n if (selection.kind !== 'Field') {\n continue;\n }\n\n const fieldName = selection.name.value;\n const fieldDef = fields[fieldName];\n\n if (!fieldDef?.astNode) {\n continue;\n }\n\n // Find @requiresPermission directive\n const directive = fieldDef.astNode.directives?.find(\n (d: DirectiveNode) => d.name.value === 'requiresPermission'\n );\n\n if (!directive) {\n // No directive on this field, continue\n continue;\n }\n\n // Extract directive arguments\n const permission = getDirectiveArgument(directive, 'permission');\n const resourceIdField = getDirectiveArgument(directive, 'resourceIdField');\n\n if (!permission) {\n throw new GraphQLError(\n 'Invalid @requiresPermission directive: permission argument is required and must be a string',\n {\n extensions: { code: 'INTERNAL_SERVER_ERROR', field: fieldName },\n }\n );\n }\n\n // CHECK FOR BYPASS HEADERS FIRST (internal service-to-service calls)\n const ctx = contextValue as RBACContext;\n const bypassCheckResult = checkBypassHeaders(ctx);\n\n if (bypassCheckResult.shouldBypass) {\n // Log bypass for audit trail\n const bypassSource = getHeader(ctx, 'x-bypass-source');\n const bypassTimestamp = getHeader(ctx, 'x-bypass-timestamp');\n\n logger.info('[RBAC Directive] RBAC bypassed for internal service call', {\n field: fieldName,\n permission,\n resource: resourceIdField,\n bypassSource,\n bypassTimestamp,\n operationType: operation.operation,\n });\n\n // Skip RBAC check, continue to next field\n continue;\n }\n\n // REGULAR RBAC FLOW (user requests)\n // Check authentication\n // SECURITY: This directive REQUIRES authenticated context to be set by upstream middleware\n // We do NOT decode/verify JWT tokens here - that must be done by auth middleware\n const user = verifyAuthentication(contextValue, fieldName, permission);\n\n // Resolve resource ID (optional - not all permissions need a specific resource)\n let resolvedResourceId: string | undefined;\n try {\n resolvedResourceId = await resolveResourceId(\n resourceIdField,\n selection as FieldNode,\n variableValues,\n config,\n rbacClient,\n ctx,\n permission,\n fieldName\n );\n } catch (error) {\n // If resourceIdField was not specified and we couldn't resolve it,\n // that's OK for permission checks that don't need a specific resource\n if (!resourceIdField) {\n logger.debug('[RBAC Directive] No resource ID resolved, checking permission at scope level', {\n fieldName,\n permission,\n });\n } else {\n // If resourceIdField WAS specified but we couldn't resolve, that's an error\n throw error;\n }\n }\n\n // Convert user ID to actor ID and check permission\n const actorId = toActorId(user.id);\n await checkAndEnforcePermission(\n rbacClient,\n ctx,\n actorId,\n permission,\n resolvedResourceId,\n user.id,\n fieldName,\n bypassCheckResult.bypassContext\n );\n }\n\n // All checks passed - allow execution\n },\n };\n}\n\n/**\n * Export RBACClient for direct use if needed\n */\nexport { RBACClient };\n\n// ========================================================================\n// Layer-Aware Factory Functions\n// ========================================================================\n\n/**\n * Layer-aware RBAC configuration\n */\nexport interface LayerAwareRBACConfig extends Omit<RBACDirectiveConfig, 'rbacServiceUrl' | 'layer'> {\n /**\n * Override RBAC service URL (optional)\n * If not provided, will be resolved from layer defaults\n */\n rbacServiceUrl?: string;\n}\n\n/**\n * Build RBAC service URL for a layer\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @returns RBAC service URL\n */\nfunction buildRBACServiceUrl(layer: ServiceLayer): string {\n const routing = DEFAULT_GATEWAY_ROUTING[layer];\n\n // RBAC is accessed via the internal gateway for the current layer\n // wspace layer → wspace-int-gateway (RBAC is part of workspaces supergraph)\n // global layer → global-int-gateway (needs to call wspace layer for RBAC)\n const gateway = layer === 'wspace' ? routing.internalGateway : routing.crossLayerGateway;\n\n return `http://${gateway.host}:${gateway.port}${gateway.graphqlPath}`;\n}\n\n/**\n * Create RBAC directive plugin for a specific layer\n *\n * This factory function automatically configures the RBAC directive with\n * the correct internal gateway URL based on the service layer.\n *\n * @param layer - Service layer ('wspace' or 'global')\n * @param config - Optional configuration overrides\n * @returns RBAC directive plugin configured for the layer\n *\n * @example\n * ```typescript\n * // In a workspace layer service\n * const rbacPlugin = createRBACDirectiveForLayer('wspace', {\n * enableCaching: true,\n * cacheTTL: 300000,\n * });\n *\n * // In a global layer service\n * const rbacPlugin = createRBACDirectiveForLayer('global', {\n * enableCaching: true,\n * });\n * ```\n */\nexport function createRBACDirectiveForLayer(layer: ServiceLayer, config?: LayerAwareRBACConfig): Plugin {\n const envPrefix = layer.toUpperCase();\n\n // Resolve RBAC service URL with priority:\n // 1. Explicit config.rbacServiceUrl\n // 2. Layer-specific env var (WSPACE_RBAC_GATEWAY_URL or GLOBAL_RBAC_GATEWAY_URL)\n // 3. Generic env var (RBAC_GATEWAY_URL)\n // 4. Layer defaults\n const rbacServiceUrl =\n config?.rbacServiceUrl ||\n process.env[`${envPrefix}_RBAC_GATEWAY_URL`] ||\n process.env['RBAC_GATEWAY_URL'] ||\n buildRBACServiceUrl(layer);\n\n // Map ServiceLayer to RBACLayer (they're compatible but different types)\n const rbacLayer: RBACLayer = layer as RBACLayer;\n\n logger.info('[RBAC Directive] Creating layer-aware RBAC directive', {\n layer: rbacLayer,\n rbacServiceUrl,\n enableCaching: config?.enableCaching ?? true,\n });\n\n return createRBACDirective({\n rbacServiceUrl,\n layer: rbacLayer,\n enableCaching: config?.enableCaching ?? true,\n cacheTTL: config?.cacheTTL,\n cacheMaxSize: config?.cacheMaxSize,\n timeout: config?.timeout,\n failClosed: config?.failClosed,\n resourceResolver: config?.resourceResolver,\n skipRbac: config?.skipRbac,\n });\n}\n\n/**\n * Create RBAC directive from environment with automatic layer detection\n *\n * @param serviceName - Service name for layer detection\n * @param config - Optional configuration overrides\n * @returns RBAC directive plugin\n */\nexport function createRBACDirectiveFromEnv(serviceName: string, config?: LayerAwareRBACConfig): Plugin {\n // Detect layer from service name or environment\n const layer =\n (process.env['SERVICE_LAYER'] as ServiceLayer) || (serviceName.startsWith('global-') ? 'global' : 'wspace');\n\n return createRBACDirectiveForLayer(layer, config);\n}\n","/**\n * RBAC Module\n * Role-Based Access Control - Permission checking and resource management\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { PermissionDeniedError, ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\n// Export centralized RBAC directive plugin\nexport {\n createRBACDirective,\n createRBACDirectiveForLayer,\n createRBACDirectiveFromEnv,\n type RBACDirectiveConfig,\n type LayerAwareRBACConfig,\n RBACClient,\n} from './directive.js';\n\nimport { RBACClient } from './directive.js';\nimport type { ServiceLayer } from '../types/layer.js';\nimport { DEFAULT_LAYER_RESOURCES } from '../types/layer.js';\n\n/**\n * Build an `RBACClient` from env vars (mirrors `createRBACDirectiveFromEnv`).\n *\n * Resolution order for the gateway URL:\n * 1. explicit `rbacServiceUrl` option\n * 2. `<LAYER>_RBAC_GATEWAY_URL`\n * 3. `RBAC_GATEWAY_URL`\n * 4. layer default\n */\nexport function createRBACClientFromEnv(\n options: { rbacServiceUrl?: string; layer?: ServiceLayer; failClosed?: boolean } = {}\n): RBACClient {\n const layer: ServiceLayer =\n options.layer ?? ((process.env['SERVICE_LAYER'] as ServiceLayer) || 'wspace');\n const envPrefix = layer.toUpperCase();\n const rbacServiceUrl =\n options.rbacServiceUrl ||\n process.env[`${envPrefix}_RBAC_GATEWAY_URL`] ||\n process.env['RBAC_GATEWAY_URL'] ||\n DEFAULT_LAYER_RESOURCES[layer].rbacGatewayUrl;\n return new RBACClient({\n rbacServiceUrl,\n layer,\n failClosed: options.failClosed,\n });\n}\n\nexport type PBACActorType = 'USER' | 'BOT' | 'INTEGRATION' | 'DELEGATED_AGENT';\n\nexport type PBACPermissionLevel = 'ADMIN' | 'EDITOR' | 'VIEWER' | 'NONE';\n\nexport interface CheckPermissionOptions {\n userId: string;\n action: string;\n resourceType: string;\n resourceId?: string;\n workspaceId?: string;\n /** Actor type for the PBAC system. Defaults to 'USER' */\n actorType?: PBACActorType;\n}\n\nexport interface EffectivePermissionEntry {\n resourceType: string;\n level: PBACPermissionLevel;\n allowedActions: string[];\n source: string;\n}\n\nexport interface RoleDefaultPermission {\n resourceType: string;\n level: PBACPermissionLevel;\n}\n\nexport interface Role {\n id: string;\n name: string;\n description?: string;\n /** Default permission levels per resource type (PBAC) */\n defaultPermissions?: RoleDefaultPermission[];\n}\n\nexport interface Permission {\n id: string;\n action: string;\n resourceType: string;\n description?: string;\n}\n\n/**\n * RBAC Module\n */\nexport class RBACModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Check if user has permission (returns boolean)\n */\n public async checkPermission(options: CheckPermissionOptions): Promise<boolean> {\n try {\n await this.requirePermission(options);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Require permission (throws if denied)\n */\n public async requirePermission(options: CheckPermissionOptions): Promise<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 logger.debug('[RBAC] Checking permission', options as unknown as Record<string, unknown>);\n\n // Use the new PBAC PermissionCheckInput format\n // Note: The new unified RBAC uses actorId + actorType + scopeId instead of userId + workspaceId\n const query = `\n query CheckPermission($input: PermissionCheckInput!) {\n checkPermission(input: $input) {\n allowed\n decisionPath\n }\n }\n `;\n\n const variables = {\n input: {\n actorId: options.userId,\n actorType: options.actorType || 'USER',\n scopeId: options.workspaceId || this.context.workspaceId || this.context.tenantId || '',\n resourceType: options.resourceType,\n action: options.action,\n resourceId: options.resourceId,\n },\n };\n\n // RBAC operations should go to the workspace supergraph if we have a workspaceId,\n // otherwise fall back to tenant supergraph\n const response =\n options.workspaceId || this.context.workspaceId\n ? await this.client.query<{\n checkPermission: { allowed: boolean; decisionPath: string };\n }>(query, variables, this.context)\n : await this.client.tenantQuery<{\n checkPermission: { allowed: boolean; decisionPath: string };\n }>(query, variables, this.context);\n\n if (!response.checkPermission.allowed) {\n throw new PermissionDeniedError(`Permission denied: ${response.checkPermission.decisionPath}`, {\n action: options.action,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n userId: options.userId,\n });\n }\n\n logger.debug('[RBAC] Permission granted', {\n ...options,\n decisionPath: response.checkPermission.decisionPath,\n } as unknown as Record<string, unknown>);\n }\n\n /**\n * Get user roles in workspace\n * Uses the new PBAC actorRoleAssignments query\n */\n public async getUserRoles(userId: string, workspaceId: string): Promise<Role[]> {\n logger.debug('[RBAC] Getting user roles', { userId, workspaceId });\n\n // Use the new PBAC actorRoleAssignments query\n const query = `\n query GetActorRoleAssignments($actorId: String!, $scopeId: String!) {\n actorRoleAssignments(actorId: $actorId, scopeId: $scopeId) {\n id\n role {\n id\n name\n description\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n }\n `;\n\n const variables = {\n actorId: userId,\n scopeId: workspaceId,\n };\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n // Use workspace supergraph for workspace-scoped RBAC\n const response = await this.client.query<{\n actorRoleAssignments: Array<{\n id: string;\n role: {\n id: string;\n name: string;\n description?: string;\n defaultPermissions: RoleDefaultPermission[];\n };\n }>;\n }>(query, variables, contextWithWorkspace);\n\n // Map the roles to the expected format\n return response.actorRoleAssignments.map((assignment) => ({\n id: assignment.role.id,\n name: assignment.role.name,\n description: assignment.role.description,\n defaultPermissions: assignment.role.defaultPermissions,\n }));\n }\n\n /**\n * Assign role to user\n * Uses the new PBAC assignRoleToActor mutation\n */\n public async assignRoleToUser(\n userId: string,\n roleId: string,\n workspaceId: string,\n actorType: 'USER' | 'BOT' | 'INTEGRATION' | 'DELEGATED_AGENT' = 'USER'\n ): Promise<boolean> {\n logger.debug('[RBAC] Assigning role to user', { userId, roleId, workspaceId, actorType });\n\n // Use the new PBAC assignRoleToActor mutation\n const mutation = `\n mutation AssignRoleToActor($input: AssignRoleInput!) {\n assignRoleToActor(input: $input) {\n id\n actorId\n roleId\n scopeId\n }\n }\n `;\n\n const variables = {\n input: {\n actorId: userId,\n actorType,\n roleId,\n scopeId: workspaceId,\n },\n };\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n // Use workspace supergraph for workspace-scoped RBAC\n await this.client.query(mutation, variables, contextWithWorkspace);\n\n logger.info('[RBAC] Role assigned to actor', { userId, roleId, workspaceId });\n\n return true;\n }\n\n /**\n * Remove role from user\n * Uses the new PBAC removeRoleFromActor mutation\n * Note: This first finds the assignment ID, then removes it\n */\n public async removeRoleFromUser(userId: string, roleId: string, workspaceId: string): Promise<boolean> {\n logger.debug('[RBAC] Removing role from user', { userId, roleId, workspaceId });\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n // First, find the assignment to get its ID\n const findQuery = `\n query FindAssignment($actorId: String!, $scopeId: String!) {\n actorRoleAssignments(actorId: $actorId, scopeId: $scopeId) {\n id\n roleId\n }\n }\n `;\n\n const findResponse = await this.client.query<{\n actorRoleAssignments: Array<{ id: string; roleId: string }>;\n }>(findQuery, { actorId: userId, scopeId: workspaceId }, contextWithWorkspace);\n\n const assignment = findResponse.actorRoleAssignments.find((a) => a.roleId === roleId);\n\n if (!assignment) {\n logger.warn('[RBAC] No role assignment found to remove', { userId, roleId, workspaceId });\n return false;\n }\n\n // Use the new PBAC removeRoleFromActor mutation\n const mutation = `\n mutation RemoveRoleFromActor($assignmentId: ID!) {\n removeRoleFromActor(assignmentId: $assignmentId)\n }\n `;\n\n await this.client.query(mutation, { assignmentId: assignment.id }, contextWithWorkspace);\n\n logger.info('[RBAC] Role removed from actor', { userId, roleId, workspaceId, assignmentId: assignment.id });\n\n return true;\n }\n\n /**\n * Create custom role with default permissions\n *\n * Uses the new PBAC createRole mutation and setRoleDefaultPermission for permissions.\n *\n * @param name - Role name\n * @param description - Role description\n * @param defaultPermissions - Array of default permission configurations\n * (e.g., [{ resourceType: 'project', level: 'ADMIN' }])\n * OR legacy permission strings (converted to ADMIN level)\n * @param workspaceId - Workspace ID (scopeId)\n */\n public async createRole(\n name: string,\n description: string,\n defaultPermissions: RoleDefaultPermission[] | string[],\n workspaceId: string\n ): Promise<Role> {\n logger.debug('[RBAC] Creating role', { name, workspaceId, permissionCount: defaultPermissions.length });\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n // Step 1: Create the role using new PBAC mutation\n const createRoleMutation = `\n mutation CreateRole($input: CreateRoleInput!) {\n createRole(input: $input) {\n id\n name\n description\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n `;\n\n const createRoleVariables = {\n input: {\n name,\n description,\n scopeId: workspaceId,\n scopeType: 'workspace',\n },\n };\n\n // Use workspace supergraph for workspace-scoped RBAC\n const createResponse = await this.client.query<{\n createRole: {\n id: string;\n name: string;\n description?: string;\n defaultPermissions: Array<{ resourceType: string; level: string }>;\n };\n }>(createRoleMutation, createRoleVariables, contextWithWorkspace);\n\n const roleId = createResponse.createRole.id;\n logger.info('[RBAC] Role created', { name, roleId });\n\n // Step 2: Set default permissions if provided\n if (defaultPermissions.length > 0) {\n logger.debug('[RBAC] Setting default permissions for role', { roleId, count: defaultPermissions.length });\n\n // Convert legacy string permissions to new format\n const normalizedPermissions: RoleDefaultPermission[] = defaultPermissions.map((perm) => {\n if (typeof perm === 'string') {\n // Legacy format: \"resourceType:action\" - convert to ADMIN level\n const resourceType = perm.split(':')[0] || perm;\n return { resourceType, level: 'ADMIN' as PBACPermissionLevel };\n }\n return perm;\n });\n\n // Deduplicate by resourceType (keep the highest level)\n const permMap = new Map<string, PBACPermissionLevel>();\n const levelPriority: Record<PBACPermissionLevel, number> = { ADMIN: 4, EDITOR: 3, VIEWER: 2, NONE: 1 };\n\n for (const perm of normalizedPermissions) {\n const existing = permMap.get(perm.resourceType);\n if (!existing || levelPriority[perm.level] > levelPriority[existing]) {\n permMap.set(perm.resourceType, perm.level);\n }\n }\n\n // Set each default permission\n const setPermissionMutation = `\n mutation SetRoleDefaultPermission($input: SetRoleDefaultPermissionInput!) {\n setRoleDefaultPermission(input: $input) {\n id\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n `;\n\n // Track failed permissions to report at the end\n const failedPermissions: Array<{ resourceType: string; level: string; error: string }> = [];\n\n for (const [resourceType, level] of permMap) {\n try {\n await this.client.query(\n setPermissionMutation,\n {\n input: {\n roleId,\n resourceType,\n level,\n },\n },\n contextWithWorkspace\n );\n logger.debug('[RBAC] Set default permission', { roleId, resourceType, level });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error('[RBAC] Failed to set default permission', {\n roleId,\n resourceType,\n level,\n error: errorMsg,\n });\n failedPermissions.push({ resourceType, level, error: errorMsg });\n }\n }\n\n // If any permissions failed, throw an error with details\n if (failedPermissions.length > 0) {\n const failedTypes = failedPermissions.map((p) => p.resourceType).join(', ');\n throw new ValidationError(\n `Role created but failed to set ${failedPermissions.length} default permission(s): ${failedTypes}. ` +\n `Role ID: ${roleId}. Check logs for details.`\n );\n }\n\n logger.info('[RBAC] Default permissions set for role', { roleId, count: permMap.size });\n }\n\n // Fetch the updated role\n const roleQuery = `\n query GetRole($id: ID!) {\n role(id: $id) {\n id\n name\n description\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n `;\n\n const roleResponse = await this.client.query<{\n role: {\n id: string;\n name: string;\n description?: string;\n defaultPermissions: RoleDefaultPermission[];\n } | null;\n }>(roleQuery, { id: roleId }, contextWithWorkspace);\n\n const role = roleResponse.role || createResponse.createRole;\n\n // Return the role with mapped permissions (backward compatible format)\n return {\n id: role.id,\n name: role.name,\n description: role.description,\n defaultPermissions: role.defaultPermissions as RoleDefaultPermission[],\n };\n }\n\n /**\n * Get all available action definitions (replaces getAvailablePermissions)\n * Returns actions organized by resource type\n */\n public async getAvailablePermissions(): Promise<Permission[]> {\n logger.debug('[RBAC] Getting available action definitions');\n\n // Use the new PBAC resourceTypes and actionDefinitions queries\n const resourceTypesQuery = `\n query GetResourceTypes {\n resourceTypes\n }\n `;\n\n // Get from workspace supergraph if we have workspace context\n const hasWorkspace = !!this.context.workspaceId;\n\n const resourceTypesResponse = hasWorkspace\n ? await this.client.query<{ resourceTypes: string[] }>(resourceTypesQuery, {}, this.context)\n : await this.client.tenantQuery<{ resourceTypes: string[] }>(resourceTypesQuery, {}, this.context);\n\n const permissions: Permission[] = [];\n\n // Get action definitions for each resource type\n const actionsQuery = `\n query GetActionDefinitions($resourceType: String!) {\n actionDefinitions(resourceType: $resourceType) {\n id\n action\n resourceType\n description\n }\n }\n `;\n\n for (const resourceType of resourceTypesResponse.resourceTypes) {\n const actionsResponse = hasWorkspace\n ? await this.client.query<{\n actionDefinitions: Array<{ id: string; action: string; resourceType: string; description?: string }>;\n }>(actionsQuery, { resourceType }, this.context)\n : await this.client.tenantQuery<{\n actionDefinitions: Array<{ id: string; action: string; resourceType: string; description?: string }>;\n }>(actionsQuery, { resourceType }, this.context);\n\n for (const action of actionsResponse.actionDefinitions) {\n permissions.push({\n id: action.id,\n action: action.action,\n resourceType: action.resourceType,\n description: action.description,\n });\n }\n }\n\n return permissions;\n }\n\n /**\n * Check multiple permissions at once\n * Uses the new PBAC checkPermissions query\n */\n public async checkMultiplePermissions(\n checks: CheckPermissionOptions[]\n ): Promise<Array<{ allowed: boolean; reason?: string }>> {\n logger.debug('[RBAC] Checking multiple permissions', { count: checks.length });\n\n // Use the new PBAC checkPermissions query\n const query = `\n query CheckPermissions($inputs: [PermissionCheckInput!]!) {\n checkPermissions(inputs: $inputs) {\n allowed\n decisionPath\n }\n }\n `;\n\n // Convert to new PBAC input format\n const inputs = checks.map((check) => ({\n actorId: check.userId,\n actorType: check.actorType || 'USER',\n scopeId: check.workspaceId || this.context.workspaceId || this.context.tenantId || '',\n resourceType: check.resourceType,\n action: check.action,\n resourceId: check.resourceId,\n }));\n\n // Use workspace supergraph if any check has workspaceId\n const hasWorkspace = checks.some((c) => c.workspaceId) || !!this.context.workspaceId;\n\n const response = hasWorkspace\n ? await this.client.query<{\n checkPermissions: Array<{ allowed: boolean; decisionPath: string }>;\n }>(query, { inputs }, this.context)\n : await this.client.tenantQuery<{\n checkPermissions: Array<{ allowed: boolean; decisionPath: string }>;\n }>(query, { inputs }, this.context);\n\n // Map to backward-compatible format\n return response.checkPermissions.map((result) => ({\n allowed: result.allowed,\n reason: result.decisionPath,\n }));\n }\n\n /**\n * Get effective permissions for a user in a workspace\n * New method that uses the PBAC effectivePermissions query\n */\n public async getEffectivePermissions(\n userId: string,\n workspaceId: string,\n actorType: 'USER' | 'BOT' | 'INTEGRATION' | 'DELEGATED_AGENT' = 'USER'\n ): Promise<{\n actorId: string;\n scopeId: string;\n permissions: EffectivePermissionEntry[];\n }> {\n logger.debug('[RBAC] Getting effective permissions', { userId, workspaceId, actorType });\n\n const query = `\n query EffectivePermissions($actorId: String!, $actorType: ActorType!, $scopeId: String!) {\n effectivePermissions(actorId: $actorId, actorType: $actorType, scopeId: $scopeId) {\n actorId\n scopeId\n permissions {\n resourceType\n level\n allowedActions\n source\n }\n }\n }\n `;\n\n const variables = {\n actorId: userId,\n actorType,\n scopeId: workspaceId,\n };\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n const response = await this.client.query<{\n effectivePermissions: {\n actorId: string;\n scopeId: string;\n permissions: EffectivePermissionEntry[];\n };\n }>(query, variables, contextWithWorkspace);\n\n return response.effectivePermissions;\n }\n\n /**\n * Initialize workspace roles by cloning system roles\n * New method for workspace initialization\n */\n public async initializeWorkspaceRoles(\n workspaceId: string,\n ownerId: string\n ): Promise<{\n success: boolean;\n rolesCreated: number;\n roleNames: string[];\n ownerAssigned: boolean;\n message: string;\n }> {\n logger.debug('[RBAC] Initializing workspace roles', { workspaceId, ownerId });\n\n const mutation = `\n mutation InitializeWorkspaceRoles($workspaceId: String!, $ownerId: String!) {\n initializeWorkspaceRoles(workspaceId: $workspaceId, ownerId: $ownerId) {\n success\n rolesCreated\n roleNames\n ownerAssigned\n message\n }\n }\n `;\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n const response = await this.client.query<{\n initializeWorkspaceRoles: {\n success: boolean;\n rolesCreated: number;\n roleNames: string[];\n ownerAssigned: boolean;\n message: string;\n };\n }>(mutation, { workspaceId, ownerId }, contextWithWorkspace);\n\n logger.info('[RBAC] Workspace roles initialized', response.initializeWorkspaceRoles);\n\n return response.initializeWorkspaceRoles;\n }\n\n /**\n * Update an existing role\n * Uses the new PBAC updateRole mutation\n *\n * @param roleId - Role ID to update\n * @param updates - Fields to update (name, description, priority)\n * @param workspaceId - Workspace ID (scopeId)\n */\n public async updateRole(\n roleId: string,\n updates: {\n name?: string;\n description?: string;\n priority?: number;\n },\n workspaceId: string\n ): Promise<Role> {\n logger.debug('[RBAC] Updating role', { roleId, updates, workspaceId });\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n const mutation = `\n mutation UpdateRole($id: ID!, $input: UpdateRoleInput!) {\n updateRole(id: $id, input: $input) {\n id\n name\n description\n priority\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n `;\n\n const response = await this.client.query<{\n updateRole: {\n id: string;\n name: string;\n description?: string;\n priority: number;\n defaultPermissions: RoleDefaultPermission[];\n };\n }>(mutation, { id: roleId, input: updates }, contextWithWorkspace);\n\n logger.info('[RBAC] Role updated', { roleId, name: response.updateRole.name });\n\n // Return in backward-compatible format\n return {\n id: response.updateRole.id,\n name: response.updateRole.name,\n description: response.updateRole.description,\n defaultPermissions: response.updateRole.defaultPermissions,\n };\n }\n\n /**\n * Delete a role\n * Uses the new PBAC deleteRole mutation\n *\n * @param roleId - Role ID to delete\n * @param workspaceId - Workspace ID (scopeId)\n * @param reassignToRoleId - Optional role ID to reassign existing actors to\n */\n public async deleteRole(roleId: string, workspaceId: string, reassignToRoleId?: string): Promise<boolean> {\n logger.debug('[RBAC] Deleting role', { roleId, workspaceId, reassignToRoleId });\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n const mutation = `\n mutation DeleteRole($id: ID!, $reassignToRoleId: ID) {\n deleteRole(id: $id, reassignToRoleId: $reassignToRoleId)\n }\n `;\n\n const response = await this.client.query<{\n deleteRole: boolean;\n }>(mutation, { id: roleId, reassignToRoleId }, contextWithWorkspace);\n\n logger.info('[RBAC] Role deleted', { roleId, success: response.deleteRole });\n\n return response.deleteRole;\n }\n\n /**\n * List roles in a workspace\n * Uses the new PBAC roles query\n *\n * @param workspaceId - Workspace ID (scopeId)\n * @param options - Filter and pagination options\n */\n public async listRoles(\n workspaceId: string,\n options?: {\n includeSystem?: boolean;\n limit?: number;\n offset?: number;\n }\n ): Promise<Role[]> {\n logger.debug('[RBAC] Listing roles', { workspaceId, options });\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n const query = `\n query ListRoles($scopeId: String!, $filter: RoleFilterInput, $pagination: PaginationInput) {\n roles(scopeId: $scopeId, filter: $filter, pagination: $pagination) {\n id\n name\n description\n isSystem\n priority\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n `;\n\n const variables = {\n scopeId: workspaceId,\n filter: options?.includeSystem !== undefined ? { includeSystem: options.includeSystem } : undefined,\n pagination: {\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n },\n };\n\n const response = await this.client.query<{\n roles: Array<{\n id: string;\n name: string;\n description?: string;\n isSystem: boolean;\n priority: number;\n defaultPermissions: RoleDefaultPermission[];\n }>;\n }>(query, variables, contextWithWorkspace);\n\n logger.debug('[RBAC] Roles listed', { workspaceId, count: response.roles.length });\n\n return response.roles.map((role) => ({\n id: role.id,\n name: role.name,\n description: role.description,\n defaultPermissions: role.defaultPermissions,\n }));\n }\n\n /**\n * Get a specific role by ID\n * Uses the new PBAC role query\n *\n * @param roleId - Role ID\n * @param workspaceId - Workspace ID (scopeId)\n */\n public async getRole(roleId: string, workspaceId: string): Promise<Role | null> {\n logger.debug('[RBAC] Getting role', { roleId, workspaceId });\n\n const contextWithWorkspace = {\n ...this.context,\n workspaceId,\n };\n\n const query = `\n query GetRole($id: ID!) {\n role(id: $id) {\n id\n name\n description\n isSystem\n priority\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n `;\n\n const response = await this.client.query<{\n role: {\n id: string;\n name: string;\n description?: string;\n isSystem: boolean;\n priority: number;\n defaultPermissions: RoleDefaultPermission[];\n } | null;\n }>(query, { id: roleId }, contextWithWorkspace);\n\n if (!response.role) {\n logger.debug('[RBAC] Role not found', { roleId });\n return null;\n }\n\n // Return in backward-compatible format\n return {\n id: response.role.id,\n name: response.role.name,\n description: response.role.description,\n defaultPermissions: response.role.defaultPermissions,\n };\n }\n}\n"]}