@burdenoff/be-sdk 2026.522.1 → 2026.525.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.
@@ -1,5 +1,5 @@
1
- import { NotificationsModule, NotificationType } from './chunk-RMDKB5O7.js';
2
1
  import { RBACModule } from './chunk-BNJFEOGH.js';
2
+ import { NotificationsModule, NotificationType } from './chunk-RMDKB5O7.js';
3
3
  import { ValidationError, QuotaExceededError, PermissionDeniedError } from './chunk-O6RHB2YP.js';
4
4
  import { logger } from './chunk-CBZNP6RF.js';
5
5
  import { __name } from './chunk-XE4OXN2W.js';
@@ -1547,5 +1547,5 @@ var TrackerModule = class {
1547
1547
  };
1548
1548
 
1549
1549
  export { ActivityModule, TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, UsageModule, createProductTracker, trackOperation, trackerStub };
1550
- //# sourceMappingURL=chunk-HNS7EHUX.js.map
1551
- //# sourceMappingURL=chunk-HNS7EHUX.js.map
1550
+ //# sourceMappingURL=chunk-PPIDJP2W.js.map
1551
+ //# sourceMappingURL=chunk-PPIDJP2W.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/activity/index.ts","../src/usage/index.ts","../src/tracker/stub.ts","../src/tracker/index.ts"],"names":["ActivityType","ActivityStatus","ActivitySeverity","ActivityModule","client","context","log","options","userId","ValidationError","activityType","resourceType","action","status","logger","debug","recordActivityMutation","legacyLogActivityMutation","variables","input","resourceId","workspaceId","organizationId","projectId","ipAddress","userAgent","metadata","severity","errorMessage","duration","response","query","info","activityId","recordActivity","id","error","message","Error","String","isRecordActivityUnavailable","includes","warn","reason","legacyResponse","logActivity","logSuccess","inferActivityType","logFailure","getActivities","startDate","endDate","search","limit","offset","sortBy","sortOrder","getActivity","getStats","getActivityStats","cleanup","olderThanDays","mutation","deletedCount","cleanupActivities","actionLower","toLowerCase","exportToCSV","exportActivities","csvData","UsageMetricType","UsageModule","track","entityId","entityType","metricType","amount","recordId","trackUsage","checkQuota","requestedAmount","allowed","requireQuota","result","QuotaExceededError","currentUsage","quotaLimit","resetAt","trackAndCheck","quotaCheck","usage","getUsage","getSummary","period","getUsageSummary","setQuota","quotaId","getQuota","getQuotas","resetQuota","deleteQuota","trackBulk","records","count","length","trackUsageBulk","_gatewayUrl","_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":";;;;;;;AAUO,IAAKA,YAAAA,6BAAAA,aAAAA,EAAAA;;;;;;;;;;;;;;;;AAAAA,EAAAA,OAAAA,aAAAA;;AAkBL,IAAKC,cAAAA,6BAAAA,eAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,eAAAA;;AAOL,IAAKC,gBAAAA,6BAAAA,iBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,iBAAAA;;AA8GL,IAAMC,iBAAN,MAAMA;EAjJb;;;;;AAkJE,EAAA,WAAA,CACUC,QACAC,OAAAA,EACR;SAFQD,MAAAA,GAAAA,MAAAA;SACAC,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAaC,IAAIC,OAAAA,EAAgD;AAE/D,IAAA,IAAI,CAACA,QAAQC,MAAAA,EAAQ;AACnB,MAAA,MAAM,IAAIC,gBAAgB,qBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQG,YAAAA,EAAc;AACzB,MAAA,MAAM,IAAID,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQI,YAAAA,EAAc;AACzB,MAAA,MAAM,IAAIF,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQK,MAAAA,EAAQ;AACnB,MAAA,MAAM,IAAIH,gBAAgB,oBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQM,MAAAA,EAAQ;AACnB,MAAA,MAAM,IAAIJ,gBAAgB,oBAAA,CAAA;AAC5B,IAAA;AAEAK,IAAAA,MAAAA,CAAOC,MAAM,6BAAA,EAA+B;AAC1CP,MAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChBI,MAAAA,MAAAA,EAAQL,OAAAA,CAAQK,MAAAA;AAChBD,MAAAA,YAAAA,EAAcJ,OAAAA,CAAQI;KACxB,CAAA;AAEA,IAAA,MAAMK,sBAAAA,GAAyB;;;;;;;;;;;;;;;;;;;;;;;AAwB/B,IAAA,MAAMC,yBAAAA,GAA4B;;;;;;;;;;;;;;;;;;;;;;;AAwBlC,IAAA,MAAMC,SAAAA,GAAY;MAChBC,KAAAA,EAAO;AACLX,QAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChBE,QAAAA,YAAAA,EAAcH,OAAAA,CAAQG,YAAAA;AACtBC,QAAAA,YAAAA,EAAcJ,OAAAA,CAAQI,YAAAA;AACtBS,QAAAA,UAAAA,EAAYb,OAAAA,CAAQa,UAAAA;AACpBR,QAAAA,MAAAA,EAAQL,OAAAA,CAAQK,MAAAA;AAChBC,QAAAA,MAAAA,EAAQN,OAAAA,CAAQM,MAAAA;AAChBQ,QAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,QAAAA,cAAAA,EAAgBf,OAAAA,CAAQe,cAAAA;AACxBC,QAAAA,SAAAA,EAAWhB,OAAAA,CAAQgB,SAAAA;AACnBC,QAAAA,SAAAA,EAAWjB,OAAAA,CAAQiB,SAAAA;AACnBC,QAAAA,SAAAA,EAAWlB,OAAAA,CAAQkB,SAAAA;AACnBC,QAAAA,QAAAA,EAAUnB,OAAAA,CAAQmB,QAAAA;AAClBC,QAAAA,QAAAA,EAAUpB,QAAQoB,QAAAA,IAAQ,KAAA;AAC1BC,QAAAA,YAAAA,EAAcrB,OAAAA,CAAQqB,YAAAA;AACtBC,QAAAA,QAAAA,EAAUtB,OAAAA,CAAQsB;AACpB;AACF,KAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MACjCf,sBAAAA,EACAE,SAAAA,EACA,KAAKb,OAAO,CAAA;AAGdS,MAAAA,MAAAA,CAAOkB,KAAK,4BAAA,EAA8B;AAAEC,QAAAA,UAAAA,EAAYH,SAASI,cAAAA,CAAeC;OAAG,CAAA;AACnF,MAAA,OAAOL,QAAAA,CAASI,cAAAA;AAClB,IAAA,CAAA,CAAA,OAASE,KAAAA,EAAO;AACd,MAAA,MAAMC,UAAUD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAAA,GAAUE,OAAOH,KAAAA,CAAAA;AAChE,MAAA,MAAMI,8BACJH,OAAAA,CAAQI,QAAAA,CAAS,qCAAA,CAAA,IACjBJ,OAAAA,CAAQI,SAAS,oCAAA,CAAA;AAEnB,MAAA,IAAI,CAACD,2BAAAA,EAA6B;AAChC,QAAA,MAAMJ,KAAAA;AACR,MAAA;AAEAtB,MAAAA,MAAAA,CAAO4B,KAAK,wDAAA,EAA0D;QACpEC,MAAAA,EAAQN;OACV,CAAA;AAEA,MAAA,MAAMO,cAAAA,GAAiB,MAAM,IAAA,CAAKxC,MAAAA,CAAO2B,MACvCd,yBAAAA,EACAC,SAAAA,EACA,KAAKb,OAAO,CAAA;AAGdS,MAAAA,MAAAA,CAAOkB,KAAK,qCAAA,EAAuC;AAAEC,QAAAA,UAAAA,EAAYW,eAAeC,WAAAA,CAAYV;OAAG,CAAA;AAC/F,MAAA,OAAOS,cAAAA,CAAeC,WAAAA;AACxB,IAAA;AACF,EAAA;;;;AAKA,EAAA,MAAaC,UAAAA,CACXtC,MAAAA,EACAI,MAAAA,EACAD,YAAAA,EACAS,YACAM,QAAAA,EACmB;AACnB,IAAA,OAAO,KAAKpB,GAAAA,CAAI;AACdE,MAAAA,MAAAA;AACAI,MAAAA,MAAAA;AACAD,MAAAA,YAAAA;AACAS,MAAAA,UAAAA;MACAV,YAAAA,EAAc,IAAA,CAAKqC,kBAAkBnC,MAAAA,CAAAA;MACrCC,MAAAA,EAAM,SAAA;MACNc,QAAAA,EAAQ,KAAA;AACRD,MAAAA,QAAAA;AACAL,MAAAA,WAAAA,EAAa,KAAKhB,OAAAA,CAAQgB;KAC5B,CAAA;AACF,EAAA;;;;AAKA,EAAA,MAAa2B,WACXxC,MAAAA,EACAI,MAAAA,EACAD,YAAAA,EACAiB,YAAAA,EACAR,YACAM,QAAAA,EACmB;AACnB,IAAA,OAAO,KAAKpB,GAAAA,CAAI;AACdE,MAAAA,MAAAA;AACAI,MAAAA,MAAAA;AACAD,MAAAA,YAAAA;AACAS,MAAAA,UAAAA;MACAV,YAAAA,EAAc,IAAA,CAAKqC,kBAAkBnC,MAAAA,CAAAA;MACrCC,MAAAA,EAAM,SAAA;MACNc,QAAAA,EAAQ,MAAA;AACRC,MAAAA,YAAAA;AACAF,MAAAA,QAAAA;AACAL,MAAAA,WAAAA,EAAa,KAAKhB,OAAAA,CAAQgB;KAC5B,CAAA;AACF,EAAA;;;;AAKA,EAAA,MAAa4B,cAAc1C,OAAAA,EAGxB;AACDO,IAAAA,MAAAA,CAAOC,KAAAA,CAAM,iCAAiCR,OAAAA,CAAAA;AAE9C,IAAA,MAAMwB,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6Dd,IAAA,MAAMb,SAAAA,GAAY;AAChBV,MAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChBa,MAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe,cAAAA;AACxBC,MAAAA,SAAAA,EAAWhB,OAAAA,CAAQgB,SAAAA;AACnBb,MAAAA,YAAAA,EAAcH,OAAAA,CAAQG,YAAAA;AACtBC,MAAAA,YAAAA,EAAcJ,OAAAA,CAAQI,YAAAA;AACtBS,MAAAA,UAAAA,EAAYb,OAAAA,CAAQa,UAAAA;AACpBP,MAAAA,MAAAA,EAAQN,OAAAA,CAAQM,MAAAA;AAChBc,MAAAA,QAAAA,EAAUpB,OAAAA,CAAQoB,QAAAA;AAClBuB,MAAAA,SAAAA,EAAW3C,OAAAA,CAAQ2C,SAAAA;AACnBC,MAAAA,OAAAA,EAAS5C,OAAAA,CAAQ4C,OAAAA;AACjBC,MAAAA,MAAAA,EAAQ7C,OAAAA,CAAQ6C,MAAAA;AAChBC,MAAAA,KAAAA,EAAO9C,QAAQ8C,KAAAA,IAAS,EAAA;AACxBC,MAAAA,MAAAA,EAAQ/C,QAAQ+C,MAAAA,IAAU,CAAA;AAC1BC,MAAAA,MAAAA,EAAQhD,QAAQgD,MAAAA,IAAU,WAAA;AAC1BC,MAAAA,SAAAA,EAAWjD,QAAQiD,SAAAA,IAAa;AAClC,KAAA;AAEA,IAAA,MAAM1B,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAEhCA,KAAAA,EAAOb,SAAAA,EAAW,KAAKb,OAAO,CAAA;AAEjC,IAAA,OAAOyB,QAAAA,CAASmB,aAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaQ,YAAYxB,UAAAA,EAAuC;AAC9DnB,IAAAA,MAAAA,CAAOC,MAAM,6BAAA,EAA+B;AAAEkB,MAAAA;KAAW,CAAA;AAEzD,IAAA,MAAMF,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;AAwBd,IAAA,MAAMD,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAAiCA,KAAAA,EAAO;AAAEE,MAAAA;AAAW,KAAA,EAAG,KAAK5B,OAAO,CAAA;AAEvG,IAAA,OAAOyB,QAAAA,CAAS2B,WAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,SAASnD,OAAAA,EAAiF;AACrGO,IAAAA,MAAAA,CAAOC,KAAAA,CAAM,qCAAqCR,OAAAA,CAAAA;AAElD,IAAA,MAAMwB,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCd,IAAA,MAAMb,SAAAA,GAAY;AAChBV,MAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChBa,MAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe,cAAAA;AACxBC,MAAAA,SAAAA,EAAWhB,OAAAA,CAAQgB,SAAAA;AACnBb,MAAAA,YAAAA,EAAcH,OAAAA,CAAQG,YAAAA;AACtBC,MAAAA,YAAAA,EAAcJ,OAAAA,CAAQI,YAAAA;AACtBuC,MAAAA,SAAAA,EAAW3C,OAAAA,CAAQ2C,SAAAA;AACnBC,MAAAA,OAAAA,EAAS5C,OAAAA,CAAQ4C;AACnB,KAAA;AAEA,IAAA,MAAMrB,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAA2CA,KAAAA,EAAOb,SAAAA,EAAW,KAAKb,OAAO,CAAA;AAE5G,IAAA,OAAOyB,QAAAA,CAAS6B,gBAAAA;AAClB,EAAA;;;;EAKA,MAAaC,OAAAA,CAAQC,eAAuBxC,WAAAA,EAAuC;AACjFP,IAAAA,MAAAA,CAAOC,MAAM,uCAAA,EAAyC;AAAE8C,MAAAA,aAAAA;AAAexC,MAAAA;KAAY,CAAA;AAEnF,IAAA,MAAMyC,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAMhC,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAEhC+B,QAAAA,EAAU;AAAED,MAAAA,aAAAA;AAAexC,MAAAA;AAAY,KAAA,EAAG,KAAKhB,OAAO,CAAA;AAEzDS,IAAAA,MAAAA,CAAOkB,KAAK,8BAAA,EAAgC;AAC1C+B,MAAAA,YAAAA,EAAcjC,SAASkC,iBAAAA,CAAkBD;KAC3C,CAAA;AAEA,IAAA,OAAOjC,SAASkC,iBAAAA,CAAkBD,YAAAA;AACpC,EAAA;;;;AAKQhB,EAAAA,iBAAAA,CAAkBnC,MAAAA,EAA8B;AACtD,IAAA,MAAMqD,WAAAA,GAAcrD,OAAOsD,WAAAA,EAAW;AAEtC,IAAA,IAAID,YAAYxB,QAAAA,CAAS,QAAA,KAAawB,WAAAA,CAAYxB,QAAAA,CAAS,KAAA,CAAA,EAAQ;AACjE,MAAA,OAAA,QAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,IAAawB,WAAAA,CAAYxB,QAAAA,CAAS,MAAA,CAAA,IAAWwB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW;AACpG,MAAA,OAAA,QAAA;AACF,IAAA;AACA,IAAA,IAAIwB,YAAYxB,QAAAA,CAAS,QAAA,KAAawB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW;AACpE,MAAA,OAAA,QAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,MAAA,CAAA,IAAWwB,WAAAA,CAAYxB,QAAAA,CAAS,MAAA,CAAA,IAAWwB,WAAAA,CAAYxB,QAAAA,CAAS,KAAA,CAAA,EAAQ;AAC/F,MAAA,OAAA,MAAA;AACF,IAAA;AACA,IAAA,IAAIwB,YAAYxB,QAAAA,CAAS,OAAA,KAAYwB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW;AACnE,MAAA,OAAA,OAAA;AACF,IAAA;AACA,IAAA,IAAIwB,YAAYxB,QAAAA,CAAS,QAAA,KAAawB,WAAAA,CAAYxB,QAAAA,CAAS,SAAA,CAAA,EAAY;AACrE,MAAA,OAAA,QAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW;AAClC,MAAA,OAAA,QAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW;AAClC,MAAA,OAAA,QAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,OAAA,CAAA,EAAU;AACjC,MAAA,OAAA,OAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,UAAA,CAAA,EAAa;AACpC,MAAA,OAAA,UAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW;AAClC,MAAA,OAAA,QAAA;AACF,IAAA;AACA,IAAA,IAAIwB,YAAYxB,QAAAA,CAAS,SAAA,KAAcwB,WAAAA,CAAYxB,QAAAA,CAAS,KAAA,CAAA,EAAQ;AAClE,MAAA,OAAA,SAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,SAAA,CAAA,EAAY;AACnC,MAAA,OAAA,SAAA;AACF,IAAA;AACA,IAAA,IAAIwB,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW;AAClC,MAAA,OAAA,QAAA;AACF,IAAA;AAEA,IAAA,OAAA,QAAA;AACF,EAAA;;;;AAKA,EAAA,MAAa0B,YAAY5D,OAAAA,EAAgD;AACvEO,IAAAA,MAAAA,CAAOC,MAAM,wCAAA,CAAA;AAEb,IAAA,MAAMgB,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;AAoBd,IAAA,MAAMD,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MACjCA,KAAAA,EACA;AACEvB,MAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChBa,MAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe,cAAAA;AACxB4B,MAAAA,SAAAA,EAAW3C,OAAAA,CAAQ2C,SAAAA;AACnBC,MAAAA,OAAAA,EAAS5C,OAAAA,CAAQ4C;AACnB,KAAA,EACA,KAAK9C,OAAO,CAAA;AAGdS,IAAAA,MAAAA,CAAOkB,KAAK,uCAAA,CAAA;AAEZ,IAAA,OAAOF,SAASsC,gBAAAA,CAAiBC,OAAAA;AACnC,EAAA;AACF;;;AC3nBO,IAAKC,eAAAA,6BAAAA,gBAAAA,EAAAA;;;;;;;;;;;AAAAA,EAAAA,OAAAA,gBAAAA;;AAqIL,IAAMC,cAAN,MAAMA;EA/Ib;;;;;AAgJE,EAAA,WAAA,CACUnE,QACAC,OAAAA,EACR;SAFQD,MAAAA,GAAAA,MAAAA;SACAC,OAAAA,GAAAA,OAAAA;AACP,EAAA;;;;AAKH,EAAA,MAAamE,MAAMjE,OAAAA,EAAkD;AAEnE,IAAA,IAAI,CAACA,QAAQkE,QAAAA,EAAU;AACrB,MAAA,MAAM,IAAIhE,gBAAgB,uBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQmE,UAAAA,EAAY;AACvB,MAAA,MAAM,IAAIjE,gBAAgB,yBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQoE,UAAAA,EAAY;AACvB,MAAA,MAAM,IAAIlE,gBAAgB,yBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,OAAOF,OAAAA,CAAQqE,MAAAA,KAAW,QAAA,IAAYrE,OAAAA,CAAQqE,UAAU,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAInE,gBAAgB,kCAAA,CAAA;AAC5B,IAAA;AAEAK,IAAAA,MAAAA,CAAOC,MAAM,wBAAA,EAA0B;AACrC0D,MAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBE,MAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBC,MAAAA,MAAAA,EAAQrE,OAAAA,CAAQqE;KAClB,CAAA;AAEA,IAAA,MAAMd,QAAAA,GAAW;;;;;;;;;;;;;;;;AAiBjB,IAAA,MAAM5C,SAAAA,GAAY;MAChBC,KAAAA,EAAO;AACLsD,QAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBC,QAAAA,UAAAA,EAAYnE,OAAAA,CAAQmE,UAAAA;AACpBC,QAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBC,QAAAA,MAAAA,EAAQrE,OAAAA,CAAQqE,MAAAA;AAChBxD,QAAAA,UAAAA,EAAYb,OAAAA,CAAQa,UAAAA;AACpBM,QAAAA,QAAAA,EAAUnB,OAAAA,CAAQmB,QAAAA;QAClBL,WAAAA,EAAad,OAAAA,CAAQc,WAAAA,IAAe,IAAA,CAAKhB,OAAAA,CAAQgB,WAAAA;AACjDC,QAAAA,cAAAA,EAAgBf,OAAAA,CAAQe;AAC1B;AACF,KAAA;AAEA,IAAA,MAAMQ,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAAmC+B,QAAAA,EAAU5C,SAAAA,EAAW,KAAKb,OAAO,CAAA;AAEvGS,IAAAA,MAAAA,CAAOkB,KAAK,uBAAA,EAAyB;AAAE6C,MAAAA,QAAAA,EAAU/C,SAASgD,UAAAA,CAAW3C;KAAG,CAAA;AAExE,IAAA,OAAOL,QAAAA,CAASgD,UAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,WAAWxE,OAAAA,EAAuD;AAC7E,IAAA,IAAI,CAACA,QAAQkE,QAAAA,EAAU;AACrB,MAAA,MAAM,IAAIhE,gBAAgB,uBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQoE,UAAAA,EAAY;AACvB,MAAA,MAAM,IAAIlE,gBAAgB,yBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,OAAOF,OAAAA,CAAQyE,eAAAA,KAAoB,QAAA,IAAYzE,OAAAA,CAAQyE,mBAAmB,CAAA,EAAG;AAC/E,MAAA,MAAM,IAAIvE,gBAAgB,4CAAA,CAAA;AAC5B,IAAA;AAEAK,IAAAA,MAAAA,CAAOC,MAAM,wBAAA,EAA0B;AACrC0D,MAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBE,MAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBK,MAAAA,eAAAA,EAAiBzE,OAAAA,CAAQyE;KAC3B,CAAA;AAEA,IAAA,MAAMjD,KAAAA,GAAQ;;;;;;;;;;;;;AAcd,IAAA,MAAMb,SAAAA,GAAY;MAChBC,KAAAA,EAAO;AACLsD,QAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBC,QAAAA,UAAAA,EAAYnE,OAAAA,CAAQmE,UAAAA;AACpBC,QAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBK,QAAAA,eAAAA,EAAiBzE,OAAAA,CAAQyE,eAAAA;QACzB3D,WAAAA,EAAad,OAAAA,CAAQc,WAAAA,IAAe,IAAA,CAAKhB,OAAAA,CAAQgB,WAAAA;AACjDC,QAAAA,cAAAA,EAAgBf,OAAAA,CAAQe;AAC1B;AACF,KAAA;AAEA,IAAA,MAAMQ,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAAwCA,KAAAA,EAAOb,SAAAA,EAAW,KAAKb,OAAO,CAAA;AAEzGS,IAAAA,MAAAA,CAAOC,MAAM,4BAAA,EAA8B;AAAEkE,MAAAA,OAAAA,EAASnD,SAASiD,UAAAA,CAAWE;KAAQ,CAAA;AAElF,IAAA,OAAOnD,QAAAA,CAASiD,UAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaG,aAAa3E,OAAAA,EAA2C;AACnE,IAAA,MAAM4E,MAAAA,GAAS,MAAM,IAAA,CAAKJ,UAAAA,CAAWxE,OAAAA,CAAAA;AAErC,IAAA,IAAI,CAAC4E,OAAOF,OAAAA,EAAS;AACnB,MAAA,MAAM,IAAIG,kBAAAA,CAAmBD,MAAAA,CAAOxC,MAAAA,IAAU,gBAAA,EAAkB;AAC9D8B,QAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBE,QAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBU,QAAAA,YAAAA,EAAcF,MAAAA,CAAOE,YAAAA;AACrBC,QAAAA,UAAAA,EAAYH,MAAAA,CAAOG,UAAAA;AACnBN,QAAAA,eAAAA,EAAiBzE,OAAAA,CAAQyE,eAAAA;AACzBO,QAAAA,OAAAA,EAASJ,MAAAA,CAAOI;OAClB,CAAA;AACF,IAAA;AACF,EAAA;;;;AAKA,EAAA,MAAaC,cAAcjF,OAAAA,EAGxB;AAED,IAAA,MAAMkF,UAAAA,GAAa,MAAM,IAAA,CAAKV,UAAAA,CAAW;AACvCN,MAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBC,MAAAA,UAAAA,EAAYnE,OAAAA,CAAQmE,UAAAA;AACpBC,MAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBK,MAAAA,eAAAA,EAAiBzE,OAAAA,CAAQqE,MAAAA;AACzBvD,MAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe;KAC1B,CAAA;AAEA,IAAA,IAAI,CAACmE,WAAWR,OAAAA,EAAS;AACvB,MAAA,MAAM,IAAIG,kBAAAA,CAAmBK,UAAAA,CAAW9C,MAAAA,IAAU,gBAAA,EAAkB;AAClE8B,QAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBE,QAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBU,QAAAA,YAAAA,EAAcI,UAAAA,CAAWJ,YAAAA;AACzBC,QAAAA,UAAAA,EAAYG,UAAAA,CAAWH;OACzB,CAAA;AACF,IAAA;AAGA,IAAA,MAAMI,KAAAA,GAAQ,MAAM,IAAA,CAAKlB,KAAAA,CAAMjE,OAAAA,CAAAA;AAE/B,IAAA,OAAO;AAAEmF,MAAAA,KAAAA;AAAOD,MAAAA;AAAW,KAAA;AAC7B,EAAA;;;;AAKA,EAAA,MAAaE,SAASpF,OAAAA,EAGnB;AACDO,IAAAA,MAAAA,CAAOC,MAAM,+BAAA,EAAiC;AAAE0D,MAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE;KAAS,CAAA;AAE3E,IAAA,MAAM1C,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCd,IAAA,MAAMb,SAAAA,GAAY;AAChBuD,MAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBC,MAAAA,UAAAA,EAAYnE,OAAAA,CAAQmE,UAAAA;AACpBC,MAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBzB,MAAAA,SAAAA,EAAW3C,OAAAA,CAAQ2C,SAAAA;AACnBC,MAAAA,OAAAA,EAAS5C,OAAAA,CAAQ4C,OAAAA;MACjB9B,WAAAA,EAAad,OAAAA,CAAQc,WAAAA,IAAe,IAAA,CAAKhB,OAAAA,CAAQgB,WAAAA;AACjDC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe,cAAAA;AACxB+B,MAAAA,KAAAA,EAAO9C,QAAQ8C,KAAAA,IAAS,GAAA;AACxBC,MAAAA,MAAAA,EAAQ/C,QAAQ+C,MAAAA,IAAU;AAC5B,KAAA;AAEA,IAAA,MAAMxB,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAEhCA,KAAAA,EAAOb,SAAAA,EAAW,KAAKb,OAAO,CAAA;AAEjC,IAAA,OAAOyB,QAAAA,CAAS6D,QAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,UAAAA,CACXnB,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAkB,MAAAA,EACuB;AACvB/E,IAAAA,MAAAA,CAAOC,MAAM,+BAAA,EAAiC;AAAE0D,MAAAA,QAAAA;AAAUE,MAAAA,UAAAA;AAAYkB,MAAAA;KAAO,CAAA;AAE7E,IAAA,MAAM9D,KAAAA,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0Bd,IAAA,MAAMD,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MACjCA,KAAAA,EACA;AAAE0C,MAAAA,QAAAA;AAAUC,MAAAA,UAAAA;AAAYC,MAAAA,UAAAA;AAAYkB,MAAAA;AAAO,KAAA,EAC3C,KAAKxF,OAAO,CAAA;AAGd,IAAA,OAAOyB,QAAAA,CAASgE,eAAAA;AAClB,EAAA;;;;AAKA,EAAA,MAAaC,SAASxF,OAAAA,EAA0C;AAC9D,IAAA,IAAI,CAACA,QAAQkE,QAAAA,EAAU;AACrB,MAAA,MAAM,IAAIhE,gBAAgB,uBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQoE,UAAAA,EAAY;AACvB,MAAA,MAAM,IAAIlE,gBAAgB,yBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,OAAOF,OAAAA,CAAQ8C,KAAAA,KAAU,QAAA,IAAY9C,OAAAA,CAAQ8C,QAAQ,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI5C,gBAAgB,qCAAA,CAAA;AAC5B,IAAA;AAEAK,IAAAA,MAAAA,CAAOC,MAAM,uBAAA,EAAyB;AACpC0D,MAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBE,MAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBtB,MAAAA,KAAAA,EAAO9C,OAAAA,CAAQ8C;KACjB,CAAA;AAEA,IAAA,MAAMS,QAAAA,GAAW;;;;;;;;;;;;;;;;AAiBjB,IAAA,MAAM5C,SAAAA,GAAY;MAChBC,KAAAA,EAAO;AACLsD,QAAAA,QAAAA,EAAUlE,OAAAA,CAAQkE,QAAAA;AAClBC,QAAAA,UAAAA,EAAYnE,OAAAA,CAAQmE,UAAAA;AACpBC,QAAAA,UAAAA,EAAYpE,OAAAA,CAAQoE,UAAAA;AACpBtB,QAAAA,KAAAA,EAAO9C,OAAAA,CAAQ8C,KAAAA;AACfwC,QAAAA,MAAAA,EAAQtF,OAAAA,CAAQsF,MAAAA;QAChBxE,WAAAA,EAAad,OAAAA,CAAQc,WAAAA,IAAe,IAAA,CAAKhB,OAAAA,CAAQgB,WAAAA;AACjDC,QAAAA,cAAAA,EAAgBf,OAAAA,CAAQe;AAC1B;AACF,KAAA;AAEA,IAAA,MAAMQ,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAA2B+B,QAAAA,EAAU5C,SAAAA,EAAW,KAAKb,OAAO,CAAA;AAE/FS,IAAAA,MAAAA,CAAOkB,KAAK,mBAAA,EAAqB;AAAEgE,MAAAA,OAAAA,EAASlE,SAASiE,QAAAA,CAAS5D;KAAG,CAAA;AAEjE,IAAA,OAAOL,QAAAA,CAASiE,QAAAA;AAClB,EAAA;;;;EAKA,MAAaE,QAAAA,CACXxB,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EACuB;AACvB7D,IAAAA,MAAAA,CAAOC,MAAM,uBAAA,EAAyB;AAAE0D,MAAAA,QAAAA;AAAUE,MAAAA;KAAW,CAAA;AAE7D,IAAA,MAAM5C,KAAAA,GAAQ;;;;;;;;;;;;;;;;AAiBd,IAAA,MAAMD,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MACjCA,KAAAA,EACA;AAAE0C,MAAAA,QAAAA;AAAUC,MAAAA,UAAAA;AAAYC,MAAAA;AAAW,KAAA,EACnC,KAAKtE,OAAO,CAAA;AAGd,IAAA,OAAOyB,QAAAA,CAASmE,QAAAA;AAClB,EAAA;;;;EAKA,MAAaC,SAAAA,CAAUzB,UAAkBC,UAAAA,EAA+C;AACtF5D,IAAAA,MAAAA,CAAOC,MAAM,4BAAA,EAA8B;AAAE0D,MAAAA,QAAAA;AAAUC,MAAAA;KAAW,CAAA;AAElE,IAAA,MAAM3C,KAAAA,GAAQ;;;;;;;;;;;;;;;;AAiBd,IAAA,MAAMD,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAA8BA,KAAAA,EAAO;AAAE0C,MAAAA,QAAAA;AAAUC,MAAAA;AAAW,KAAA,EAAG,KAAKrE,OAAO,CAAA;AAE9G,IAAA,OAAOyB,QAAAA,CAASoE,SAAAA;AAClB,EAAA;;;;EAKA,MAAaC,UAAAA,CACX1B,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EACkB;AAClB7D,IAAAA,MAAAA,CAAOC,MAAM,yBAAA,EAA2B;AAAE0D,MAAAA,QAAAA;AAAUE,MAAAA;KAAW,CAAA;AAE/D,IAAA,MAAMb,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAM,IAAA,CAAK1D,MAAAA,CAAO2B,KAAAA,CAAM+B,QAAAA,EAAU;AAAEW,MAAAA,QAAAA;AAAUC,MAAAA,UAAAA;AAAYC,MAAAA;AAAW,KAAA,EAAG,KAAKtE,OAAO,CAAA;AAEpFS,IAAAA,MAAAA,CAAOkB,KAAK,qBAAA,EAAuB;AAAEyC,MAAAA,QAAAA;AAAUE,MAAAA;KAAW,CAAA;AAE1D,IAAA,OAAO,IAAA;AACT,EAAA;;;;EAKA,MAAayB,WAAAA,CACX3B,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EACkB;AAClB7D,IAAAA,MAAAA,CAAOC,MAAM,wBAAA,EAA0B;AAAE0D,MAAAA,QAAAA;AAAUE,MAAAA;KAAW,CAAA;AAE9D,IAAA,MAAMb,QAAAA,GAAW;;;;;;;AAQjB,IAAA,MAAM,IAAA,CAAK1D,MAAAA,CAAO2B,KAAAA,CAAM+B,QAAAA,EAAU;AAAEW,MAAAA,QAAAA;AAAUC,MAAAA,UAAAA;AAAYC,MAAAA;AAAW,KAAA,EAAG,KAAKtE,OAAO,CAAA;AAEpFS,IAAAA,MAAAA,CAAOkB,KAAK,uBAAA,EAAyB;AAAEyC,MAAAA,QAAAA;AAAUE,MAAAA;KAAW,CAAA;AAE5D,IAAA,OAAO,IAAA;AACT,EAAA;;;;AAKA,EAAA,MAAa0B,UAAUC,OAAAA,EAAsD;AAC3ExF,IAAAA,MAAAA,CAAOC,MAAM,6BAAA,EAA+B;AAAEwF,MAAAA,KAAAA,EAAOD,OAAAA,CAAQE;KAAO,CAAA;AAEpE,IAAA,MAAM1C,QAAAA,GAAW;;;;;;;;;;;;;;;;AAiBjB,IAAA,MAAMhC,QAAAA,GAAW,MAAM,IAAA,CAAK1B,MAAAA,CAAO2B,MAAyC+B,QAAAA,EAAU;AAAEwC,MAAAA;AAAQ,KAAA,EAAG,KAAKjG,OAAO,CAAA;AAE/GS,IAAAA,MAAAA,CAAOkB,KAAK,4BAAA,EAA8B;AAAEuE,MAAAA,KAAAA,EAAOzE,SAAS2E,cAAAA,CAAeD;KAAO,CAAA;AAElF,IAAA,OAAO1E,QAAAA,CAAS2E,cAAAA;AAClB,EAAA;AACF;;;AClhBA,IAAIC,WAAAA;AACJ,IAAIC,mBAAAA,GAAsB,KAAA;AAO1B,SAASC,aAAAA,GAAAA;AACP,EAAA,IAAI,CAACD,mBAAAA,EAAqB;AACxBD,IAAAA,WAAAA,GAAcG,QAAQC,GAAAA,CAAI,wBAAA,KAA6BD,OAAAA,CAAQC,GAAAA,CAAI,wBAAA,CAAA,IAA6BC,MAAAA;AAChGJ,IAAAA,mBAAAA,GAAsB,IAAA;AAEtB,IAAA,IAAID,WAAAA,EAAa;AACf5F,MAAAA,MAAAA,CAAOkB,IAAAA,CAAK,CAAA,oDAAA,EAAuD0E,WAAAA,CAAAA,CAAa,CAAA;IAClF,CAAA,MAAO;AACL5F,MAAAA,MAAAA,CAAOC,MAAM,wEAAA,CAAA;AACf,IAAA;AACF,EAAA;AACA,EAAA,OAAO2F,WAAAA;AACT;AAZSE,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAkBT,IAAMI,qBAAAA;;AAAsC,EAAA;;;;;;;;AAY5C,eAAeC,eAAAA,CAAgBC,YAAoB3G,OAAAA,EAA+B;AAChF,EAAA,IAAI;AACF,IAAA,MAAM4G,UAAU5G,OAAAA,CAAQ6G,eAAAA;AACxB,IAAA,MAAMjG,KAAAA,GAAiC;MACrCT,YAAAA,EAAcyG,OAAAA,EAASzG,YAAAA,IAAgBH,OAAAA,CAAQ8G,aAAAA,IAAiB,SAAA;AAChEC,MAAAA,WAAAA,EAAaH,OAAAA,EAASG,WAAAA,IAAe,CAAA,EAAG/G,OAAAA,CAAQ8G,iBAAiB,WAAA,CAAA,SAAA,CAAA;MACjEhG,WAAAA,EAAa8F,OAAAA,EAAS9F,eAAed,OAAAA,CAAQc,WAAAA;MAC7CV,YAAAA,EAAcwG,OAAAA,EAASxG,gBAAgBJ,OAAAA,CAAQI,YAAAA;MAC/CS,UAAAA,EAAY+F,OAAAA,EAAS/F,cAAcb,OAAAA,CAAQa,UAAAA;MAC3CM,QAAAA,EAAU;AACR,QAAA,GAAGyF,OAAAA,EAASzF,QAAAA;AACZlB,QAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChB+G,QAAAA,OAAAA,EAAShH,QAAQgH,OAAAA,IAAW,IAAA;AAC5B,QAAA,GAAIhH,QAAQqB,YAAAA,GAAe;AAAEA,UAAAA,YAAAA,EAAcrB,OAAAA,CAAQqB;AAAa,SAAA,GAAI;AACtE;AACF,KAAA;AAGA,IAAA,KAAA,MAAW4F,GAAAA,IAAOC,MAAAA,CAAOC,IAAAA,CAAKvG,KAAAA,CAAAA,EAAQ;AACpC,MAAA,IAAIA,MAAMqG,GAAAA,CAAAA,KAAST,KAAAA,CAAAA,EAAW,OAAO5F,MAAMqG,GAAAA,CAAAA;AAC7C,IAAA;AAEA,IAAA,MAAMG,OAAAA,GAAkC;MACtC,cAAA,EAAgB;AAClB,KAAA;AAGA,IAAA,IAAIpH,QAAQC,MAAAA,EAAQ;AAClBmH,MAAAA,OAAAA,CAAQ,YAAA,IAAgBpH,OAAAA,CAAQC,MAAAA;AAChCmH,MAAAA,OAAAA,CAAQ,cAAA,CAAA,GAAkB,SAAA;AAC5B,IAAA;AACA,IAAA,IAAIpH,OAAAA,CAAQc,WAAAA,IAAe8F,OAAAA,EAAS9F,WAAAA,EAAa;AAC/CsG,MAAAA,OAAAA,CAAQ,gBAAA,CAAA,GAAqBpH,OAAAA,CAAQc,WAAAA,IAAe8F,OAAAA,EAAS9F,WAAAA;AAC/D,IAAA;AAEA,IAAA,MAAMS,QAAAA,GAAW,MAAM8F,KAAAA,CAAMV,UAAAA,EAAY;MACvCW,MAAAA,EAAQ,MAAA;AACRF,MAAAA,OAAAA;AACAG,MAAAA,IAAAA,EAAMC,KAAKC,SAAAA,CAAU;QACnBjG,KAAAA,EAAOiF,qBAAAA;QACP9F,SAAAA,EAAW;AAAEC,UAAAA;AAAM;OACrB,CAAA;MACA8G,MAAAA,EAAQC,WAAAA,CAAYC,QAAQ,GAAA;KAC9B,CAAA;AAEA,IAAA,IAAI,CAACrG,SAASsG,EAAAA,EAAI;AAChBtH,MAAAA,MAAAA,CAAO4B,KAAK,CAAA,mCAAA,EAAsCZ,QAAAA,CAASjB,MAAM,CAAA,EAAA,EAAKN,OAAAA,CAAQ8G,aAAa,CAAA,CAAE,CAAA;AAC/F,IAAA;AACF,EAAA,CAAA,CAAA,OAASgB,GAAAA,EAAK;AAEZvH,IAAAA,MAAAA,CAAO4B,IAAAA,CAAK,CAAA,sCAAA,EAA0C2F,GAAAA,CAAchG,OAAO,CAAA,CAAE,CAAA;AAC/E,EAAA;AACF;AApDe4E,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AA6DR,IAAMqB,kBAAAA,GAAN,MAAMA,mBAAAA,CAAAA;EAzMb;;;EA0ME,OAAeC,QAAAA;AAEf,EAAA,OAAOC,WAAAA,GAAkC;AACvC,IAAA,IAAI,CAACF,oBAAmBC,QAAAA,EAAU;AAChCD,MAAAA,mBAAAA,CAAmBC,QAAAA,GAAW,IAAID,mBAAAA,EAAAA;AACpC,IAAA;AACA,IAAA,OAAOA,mBAAAA,CAAmBC,QAAAA;AAC5B,EAAA;AAEA,EAAA,MAAM/D,MAAMiE,KAAAA,EAAqC;AAC/C,IAAA,MAAMvB,aAAaN,aAAAA,EAAAA;AACnB,IAAA,IAAIM,UAAAA,EAAY;AACd,MAAA,MAAMD,gBAAgBC,UAAAA,EAAY;AAChCG,QAAAA,aAAAA,EAAeoB,KAAAA,CAAMC,SAAAA;AACrBlI,QAAAA,MAAAA,EAAQiI,KAAAA,CAAMjI,MAAAA;AACda,QAAAA,WAAAA,EAAaoH,KAAAA,CAAMpH,WAAAA;AACnBV,QAAAA,YAAAA,EAAc8H,KAAAA,CAAM/D,UAAAA;AACpBtD,QAAAA,UAAAA,EAAYqH,KAAAA,CAAMhE,QAAAA;QAClB2C,eAAAA,EAAiB;AACf1G,UAAAA,YAAAA,EAAc+H,KAAAA,CAAMC,SAAAA;AACpBhH,UAAAA,QAAAA,EAAU+G,KAAAA,CAAM/G,QAAAA;AAChBL,UAAAA,WAAAA,EAAaoH,KAAAA,CAAMpH,WAAAA;AACnBV,UAAAA,YAAAA,EAAc8H,KAAAA,CAAM/D,UAAAA;AACpBtD,UAAAA,UAAAA,EAAYqH,KAAAA,CAAMhE,QAAAA;UAClBkE,OAAAA,EAAS;AACX;OACF,CAAA;IACF,CAAA,MAAO;AACL7H,MAAAA,MAAAA,CAAOC,MAAM,uBAAA,EAAyB0H,KAAAA,CAAMC,WAAWD,KAAAA,CAAM/D,UAAAA,EAAY+D,MAAMhE,QAAQ,CAAA;AACzF,IAAA;AACF,EAAA;AAEA,EAAA,MAAMmE,WAAWC,MAAAA,EAAwC;AACvD,IAAA,KAAA,MAAWJ,SAASI,MAAAA,EAAQ;AAC1B,MAAA,MAAM,IAAA,CAAKrE,MAAMiE,KAAAA,CAAAA;AACnB,IAAA;AACF,EAAA;AACF;AAEO,IAAMK,WAAAA,GAAcR,mBAAmBE,WAAAA;AAe9C,eAAsBO,eAAexI,OAAAA,EAA+B;AAClE,EAAA,MAAM,EAAE8G,aAAAA,EAAe7G,MAAAA,EAAQ+G,OAAAA,GAAU,MAAI,GAAKhH,OAAAA;AAClD,EAAA,MAAM2G,aAAaN,aAAAA,EAAAA;AAEnB,EAAA,IAAI,CAACM,UAAAA,EAAY;AAEfpG,IAAAA,MAAAA,CAAOC,MAAM,CAAA,sBAAA,EAAyBsG,aAAAA,aAA0B7G,MAAAA,CAAAA,YAAAA,EAAqB+G,OAAAA,CAAAA,CAAS,CAAA;AAC9F,IAAA,OAAO,IAAA;AACT,EAAA;AAGA,EAAA,MAAMyB,eAAAA,GAAkBzI,OAAAA,CAAQ6G,eAAAA,EAAiBuB,OAAAA,KAAY,KAAA;AAE7D,EAAA,IAAIK,eAAAA,EAAiB;AAEnB,IAAA,KAAK/B,eAAAA,CAAgBC,YAAY3G,OAAAA,CAAAA;EACnC,CAAA,MAAO;AACLO,IAAAA,MAAAA,CAAOC,KAAAA,CAAM,CAAA,iBAAA,EAAoBsG,aAAAA,CAAAA,UAAAA,EAA0B7G,MAAAA,CAAAA,8BAAAA,CAAsC,CAAA;AACnG,EAAA;AAEA,EAAA,OAAO,IAAA;AACT;AArBsBuI,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AA+Cf,SAASE,oBAAAA,CACdC,SAAAA,EACA1I,MAAAA,EACA2I,gBAAAA,EACAC,cAAAA,EAAgD;AAEhD,EAAA,OAAO;IACL,MAAM5E,KAAAA,CAAM6C,eAAegC,iBAAAA,EAAiB;AAC1C,MAAA,OAAON,cAAAA,CAAe;QACpB,GAAGK,cAAAA;AACHF,QAAAA,SAAAA;AACA7B,QAAAA,aAAAA;AACA7G,QAAAA,MAAAA;QACA,GAAG6I;OACL,CAAA;AACF,IAAA,CAAA;IACA,MAAMC,MAAAA,CAAOjC,eAAegC,iBAAAA,EAAiB;AAC3C,MAAA,OAAON,cAAAA,CAAe;QACpB,GAAGK,cAAAA;AACHF,QAAAA,SAAAA;AACA7B,QAAAA,aAAAA;AACA7G,QAAAA,MAAAA;QACA,GAAG6I,iBAAAA;QACHjC,eAAAA,EAAiB;AACf,UAAA,GAAGgC,cAAAA,EAAgBhC,eAAAA;AACnB,UAAA,GAAGiC,iBAAAA,EAAmBjC,eAAAA;UACtB1G,YAAAA,EAAc;AAChB;OACF,CAAA;AACF,IAAA,CAAA;IACA,MAAM6I,iBAAAA,CAAkBlC,eAAegC,iBAAAA,EAAiB;AACtD,MAAA,OAAON,cAAAA,CAAe;QACpB,GAAGK,cAAAA;AACHF,QAAAA,SAAAA;AACA7B,QAAAA,aAAAA;AACA7G,QAAAA,MAAAA;QACA,GAAG6I,iBAAAA;QACHjC,eAAAA,EAAiB;AAAE,UAAA,GAAGgC,cAAAA,EAAgBhC,eAAAA;AAAiB,UAAA,GAAGiC,iBAAAA,EAAmBjC,eAAAA;UAAiBuB,OAAAA,EAAS;AAAK,SAAA;QAC5Ga,YAAAA,EAAc;UAAEb,OAAAA,EAAS;AAAM;OACjC,CAAA;AACF,IAAA,CAAA;IACA,MAAMc,cAAAA,CAAepC,eAAegC,iBAAAA,EAAiB;AACnD,MAAA,OAAON,cAAAA,CAAe;QACpB,GAAGK,cAAAA;AACHF,QAAAA,SAAAA;AACA7B,QAAAA,aAAAA;AACA7G,QAAAA,MAAAA;QACA,GAAG6I,iBAAAA;QACHjC,eAAAA,EAAiB;UAAEuB,OAAAA,EAAS;AAAM,SAAA;QAClCa,YAAAA,EAAc;AAAE,UAAA,GAAGJ,cAAAA,EAAgBI,YAAAA;AAAc,UAAA,GAAGH,iBAAAA,EAAmBG,YAAAA;UAAcb,OAAAA,EAAS;AAAK;OACrG,CAAA;AACF,IAAA,CAAA;IACA,MAAMe,WAAAA,CAAYrC,eAAegC,iBAAAA,EAAiB;AAChD,MAAA,OAAON,cAAAA,CAAe;QACpB,GAAGK,cAAAA;AACHF,QAAAA,SAAAA;AACA7B,QAAAA,aAAAA;AACA7G,QAAAA,MAAAA;QACA,GAAG6I;OACL,CAAA;AACF,IAAA,CAAA;AACAH,IAAAA,SAAAA;AACA1I,IAAAA,MAAAA;AACA2I,IAAAA,gBAAAA;AACAC,IAAAA;AACF,GAAA;AACF;AAlEgBH,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAuET,IAAMU,yBAAAA,GAA4B;EACvCC,kBAAAA,EAAoB,QAAA;AACpBC,EAAAA,UAAAA,EAAY,EAAC;AACbC,EAAAA,QAAAA,EAAU;AACZ;;;AC1OO,IAAMC,gBAAN,MAAMA;EAhJb;;;;AAiJUC,EAAAA,IAAAA;AACAC,EAAAA,QAAAA;AACAvE,EAAAA,KAAAA;AACAwE,EAAAA,aAAAA;EAER,WAAA,CACE9J,MAAAA,EACQC,OAAAA,GAAsB,EAAC,EAC/B;SADQA,OAAAA,GAAAA,OAAAA;AAER,IAAA,IAAA,CAAK2J,IAAAA,GAAO,IAAIG,UAAAA,CAAW/J,MAAAA,EAAQC,OAAAA,CAAAA;AACnC,IAAA,IAAA,CAAK4J,QAAAA,GAAW,IAAI9J,cAAAA,CAAeC,MAAAA,EAAQC,OAAAA,CAAAA;AAC3C,IAAA,IAAA,CAAKqF,KAAAA,GAAQ,IAAInB,WAAAA,CAAYnE,MAAAA,EAAQC,OAAAA,CAAAA;AACrC,IAAA,IAAA,CAAK6J,aAAAA,GAAgB,IAAIE,mBAAAA,CAAoBhK,MAAAA,EAAQC,OAAAA,CAAAA;AACvD,EAAA;;;;;AAMA,EAAA,MAAamE,MAAMjE,OAAAA,EAA6C;AAC9D,IAAA,MAAM8J,SAAAA,GAAYC,KAAKC,GAAAA,EAAG;AAC1B,IAAA,MAAMpF,MAAAA,GAAsB;MAC1BoC,OAAAA,EAAS,KAAA;MACTiD,iBAAAA,EAAmB,KAAA;MACnB3I,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK4I,gBAAgBlK,OAAAA,CAAAA;AAGrB,MAAA,IAAIA,OAAAA,CAAQyJ,IAAAA,EAAMrB,OAAAA,KAAY,KAAA,EAAO;AACnC,QAAA,MAAM,IAAA,CAAK+B,eAAAA,CAAgBnK,OAAAA,EAAS4E,MAAAA,CAAAA;AACpC,QAAA,IAAI,CAACA,OAAOqF,iBAAAA,EAAmB;AAC7BrF,UAAAA,MAAAA,CAAOtD,QAAAA,GAAWyI,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA;AAC/B,UAAA,MAAM,IAAA,CAAKM,iBAAAA,CAAkBpK,OAAAA,EAAS4E,MAAAA,EAAQkF,SAAAA,CAAAA;AAC9C,UAAA,OAAOlF,MAAAA;AACT,QAAA;MACF,CAAA,MAAO;AACLA,QAAAA,MAAAA,CAAOqF,iBAAAA,GAAoB,IAAA;AAC7B,MAAA;AAGA,MAAA,IAAIjK,QAAQmF,KAAAA,EAAOiD,OAAAA,KAAY,SAASpI,OAAAA,CAAQmF,KAAAA,EAAOX,eAAe,KAAA,EAAO;AAC3E,QAAA,MAAM,IAAA,CAAKA,UAAAA,CAAWxE,OAAAA,EAAS4E,MAAAA,CAAAA;AAC/B,QAAA,IAAIA,MAAAA,CAAOyF,mBAAmB,KAAA,EAAO;AACnCzF,UAAAA,MAAAA,CAAOtD,QAAAA,GAAWyI,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA;AAC/B,UAAA,MAAM,IAAA,CAAKM,iBAAAA,CAAkBpK,OAAAA,EAAS4E,MAAAA,EAAQkF,SAAAA,CAAAA;AAC9C,UAAA,OAAOlF,MAAAA;AACT,QAAA;AACF,MAAA;AAGA,MAAA,IAAI5E,QAAQmF,KAAAA,EAAOiD,OAAAA,KAAY,KAAA,IAASpI,OAAAA,CAAQmF,OAAOf,UAAAA,EAAY;AACjE,QAAA,MAAM,IAAA,CAAKG,UAAAA,CAAWvE,OAAAA,EAAS4E,MAAAA,CAAAA;AACjC,MAAA;AAGA,MAAA,IAAI5E,OAAAA,CAAQ0J,QAAAA,EAAUtB,OAAAA,KAAY,KAAA,EAAO;AACvC,QAAA,MAAM,IAAA,CAAKkC,kBAAAA,CAAmBtK,OAAAA,EAAS4E,MAAAA,EAAQkF,SAAAA,CAAAA;AACjD,MAAA;AAGA,MAAA,IAAI9J,OAAAA,CAAQuK,cAAcC,SAAAA,EAAW;AACnC,QAAA,MAAM,IAAA,CAAKC,uBAAAA,CAAwBzK,OAAAA,EAAS4E,MAAAA,CAAAA;AAC9C,MAAA;AAEAA,MAAAA,MAAAA,CAAOoC,OAAAA,GAAU,IAAA;AACjBpC,MAAAA,MAAAA,CAAOtD,QAAAA,GAAWyI,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA;AAE/BvJ,MAAAA,MAAAA,CAAOkB,KAAK,0CAAA,EAA4C;AACtDpB,QAAAA,MAAAA,EAAQL,OAAAA,CAAQK,MAAAA;AAChBiB,QAAAA,QAAAA,EAAUsD,MAAAA,CAAOtD;OACnB,CAAA;AAEA,MAAA,OAAOsD,MAAAA;AACT,IAAA,CAAA,CAAA,OAAS/C,KAAAA,EAAO;AACd+C,MAAAA,MAAAA,CAAOtD,QAAAA,GAAWyI,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA;AAC/BlF,MAAAA,MAAAA,CAAOoC,OAAAA,GAAU,KAAA;AAGjB,MAAA,IAAInF,iBAAiB6I,qBAAAA,EAAuB;AAC1C9F,QAAAA,MAAAA,CAAO/C,KAAAA,GAAQ;UACb8I,IAAAA,EAAM,YAAA;AACN7I,UAAAA,OAAAA,EAASD,KAAAA,CAAMC,OAAAA;AACf8I,UAAAA,OAAAA,EAAS/I,KAAAA,CAAM+I;AACjB,SAAA;AACF,MAAA,CAAA,MAAA,IAAW/I,iBAAiBgD,kBAAAA,EAAoB;AAC9CD,QAAAA,MAAAA,CAAO/C,KAAAA,GAAQ;UACb8I,IAAAA,EAAM,OAAA;AACN7I,UAAAA,OAAAA,EAASD,KAAAA,CAAMC,OAAAA;AACf8I,UAAAA,OAAAA,EAAS/I,KAAAA,CAAM+I;AACjB,SAAA;AACF,MAAA,CAAA,MAAA,IAAW/I,iBAAiB3B,eAAAA,EAAiB;AAC3C0E,QAAAA,MAAAA,CAAO/C,KAAAA,GAAQ;UACb8I,IAAAA,EAAM,YAAA;AACN7I,UAAAA,OAAAA,EAASD,KAAAA,CAAMC,OAAAA;AACf8I,UAAAA,OAAAA,EAAS/I,KAAAA,CAAM+I;AACjB,SAAA;MACF,CAAA,MAAO;AACLhG,QAAAA,MAAAA,CAAO/C,KAAAA,GAAQ;UACb8I,IAAAA,EAAM,SAAA;UACN7I,OAAAA,EAASD,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAMC,OAAAA,GAAU;AACpD,SAAA;AACF,MAAA;AAGA,MAAA,MAAM,IAAA,CAAKsI,iBAAAA,CAAkBpK,OAAAA,EAAS4E,MAAAA,EAAQkF,SAAAA,CAAAA;AAG9C,MAAA,IAAI9J,OAAAA,CAAQuK,cAAcM,SAAAA,EAAW;AACnC,QAAA,MAAM,IAAA,CAAKC,uBAAAA,CAAwB9K,OAAAA,EAAS4E,MAAAA,CAAAA;AAC9C,MAAA;AAEArE,MAAAA,MAAAA,CAAOsB,MAAM,qCAAA,EAAuC;AAClDxB,QAAAA,MAAAA,EAAQL,OAAAA,CAAQK,MAAAA;AAChBwB,QAAAA,KAAAA,EAAO+C,MAAAA,CAAO/C,KAAAA;AACdP,QAAAA,QAAAA,EAAUsD,MAAAA,CAAOtD;OACnB,CAAA;AAEA,MAAA,OAAOsD,MAAAA;AACT,IAAA;AACF,EAAA;;;;;AAMA,EAAA,MAAamG,aAAa/K,OAAAA,EAA6C;AACrE,IAAA,MAAM4E,MAAAA,GAAS,MAAM,IAAA,CAAKX,KAAAA,CAAMjE,OAAAA,CAAAA;AAEhC,IAAA,IAAI,CAAC4E,MAAAA,CAAOoC,OAAAA,IAAWpC,MAAAA,CAAO/C,KAAAA,EAAO;AACnC,MAAA,MAAMR,YAAAA,GAAeuD,OAAO/C,KAAAA,CAAMC,OAAAA;AAClC,MAAA,MAAMkJ,YAAAA,GAAepG,OAAO/C,KAAAA,CAAM+I,OAAAA;AAElC,MAAA,QAAQhG,MAAAA,CAAO/C,MAAM8I,IAAAA;QACnB,KAAK,YAAA;AACH,UAAA,MAAM,IAAID,qBAAAA,CAAsBrJ,YAAAA,EAAc2J,YAAAA,CAAAA;QAChD,KAAK,OAAA;AACH,UAAA,MAAM,IAAInG,kBAAAA,CAAmBxD,YAAAA,EAAc2J,YAAAA,CAAAA;QAC7C,KAAK,YAAA;AACH,UAAA,MAAM,IAAI9K,eAAAA,CAAgBmB,YAAAA,EAAc2J,YAAAA,CAAAA;AAC1C,QAAA;AACE,UAAA,MAAM,IAAIjJ,MAAMV,YAAAA,CAAAA;AACpB;AACF,IAAA;AAEA,IAAA,OAAOuD,MAAAA;AACT,EAAA;;;;AAKA,EAAA,MAAaqG,WAAAA,CACXhL,MAAAA,EACAI,MAAAA,EACAD,YAAAA,EACAS,YACAuD,UAAAA,EACkB;AAClB,IAAA,MAAMQ,MAAAA,GAAS,MAAM,IAAA,CAAKX,KAAAA,CAAM;AAC9BhE,MAAAA,MAAAA;AACAI,MAAAA,MAAAA;AACAD,MAAAA,YAAAA;AACAS,MAAAA,UAAAA;AACAC,MAAAA,WAAAA,EAAa,KAAKhB,OAAAA,CAAQgB,WAAAA;AAC1BqE,MAAAA,KAAAA,EAAOf,UAAAA,GACH;QACEgE,OAAAA,EAAS,IAAA;AACThE,QAAAA,UAAAA;QACAC,MAAAA,EAAQ,CAAA;QACRG,UAAAA,EAAY;OACd,GACA;QAAE4D,OAAAA,EAAS,KAAA;QAAOhE,UAAAA,EAAY;AAA+B;KACnE,CAAA;AAEA,IAAA,OAAOQ,MAAAA,CAAOoC,OAAAA;AAChB,EAAA;;;;AAKQkD,EAAAA,eAAAA,CAAgBlK,OAAAA,EAA6B;AACnD,IAAA,IAAI,CAACA,QAAQC,MAAAA,EAAQ;AACnB,MAAA,MAAM,IAAIC,gBAAgB,qBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQK,MAAAA,EAAQ;AACnB,MAAA,MAAM,IAAIH,gBAAgB,oBAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,QAAQI,YAAAA,EAAc;AACzB,MAAA,MAAM,IAAIF,gBAAgB,2BAAA,CAAA;AAC5B,IAAA;AACF,EAAA;;;;EAKA,MAAciK,eAAAA,CAAgBnK,SAAuB4E,MAAAA,EAAoC;AACvF,IAAA,MAAMsG,iBAAAA,GAA4C;AAChDjL,MAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;MAChBI,MAAAA,EAAQL,OAAAA,CAAQyJ,IAAAA,EAAM0B,gBAAAA,IAAoBnL,OAAAA,CAAQK,MAAAA;AAClDD,MAAAA,YAAAA,EAAcJ,OAAAA,CAAQI,YAAAA;AACtBS,MAAAA,UAAAA,EAAYb,OAAAA,CAAQa,UAAAA;AACpBC,MAAAA,WAAAA,EAAad,OAAAA,CAAQc;AACvB,KAAA;AAEA,IAAA,MAAMsK,aAAAA,GAAgB,MAAM,IAAA,CAAK3B,IAAAA,CAAKU,gBAAgBe,iBAAAA,CAAAA;AACtDtG,IAAAA,MAAAA,CAAOqF,iBAAAA,GAAoBmB,aAAAA;AAE3B,IAAA,IAAI,CAACA,aAAAA,EAAe;AAClBxG,MAAAA,MAAAA,CAAO/C,KAAAA,GAAQ;QACb8I,IAAAA,EAAM,YAAA;QACN7I,OAAAA,EAAS,mBAAA;QACT8I,OAAAA,EAASM;AACX,OAAA;AACF,IAAA;AACF,EAAA;;;;EAKA,MAAc1G,UAAAA,CAAWxE,SAAuB4E,MAAAA,EAAoC;AAClF,IAAA,IAAI,CAAC5E,OAAAA,CAAQmF,KAAAA,EAAOf,UAAAA,EAAY;AAC9B,MAAA;AACF,IAAA;AAEA,IAAA,MAAMD,UAAAA,GAAanE,OAAAA,CAAQmF,KAAAA,CAAMhB,UAAAA,IAAc,MAAA;AAC/C,IAAA,IAAID,QAAAA;AAEJ,IAAA,IAAIC,eAAe,WAAA,EAAa;AAC9BD,MAAAA,QAAAA,GAAWlE,OAAAA,CAAQc,eAAed,OAAAA,CAAQC,MAAAA;AAC5C,IAAA,CAAA,MAAA,IAAWkE,eAAe,cAAA,EAAgB;AACxCD,MAAAA,QAAAA,GAAWlE,OAAAA,CAAQe,kBAAkBf,OAAAA,CAAQC,MAAAA;IAC/C,CAAA,MAAO;AACLiE,MAAAA,QAAAA,GAAWlE,OAAAA,CAAQC,MAAAA;AACrB,IAAA;AAEA,IAAA,MAAMiF,UAAAA,GAAa,MAAM,IAAA,CAAKC,KAAAA,CAAMX,UAAAA,CAAW;AAC7CN,MAAAA,QAAAA;AACAC,MAAAA,UAAAA;AACAC,MAAAA,UAAAA,EAAYpE,QAAQmF,KAAAA,CAAMf,UAAAA;MAC1BK,eAAAA,EAAiBzE,OAAAA,CAAQmF,MAAMd,MAAAA,IAAU,CAAA;AACzCvD,MAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe;KAC1B,CAAA;AAEA6D,IAAAA,MAAAA,CAAOyF,iBAAiBnF,UAAAA,CAAWR,OAAAA;AACnCE,IAAAA,MAAAA,CAAOyG,iBAAiBnG,UAAAA,CAAWoG,cAAAA;AAEnC,IAAA,IAAI,CAACpG,WAAWR,OAAAA,EAAS;AACvBE,MAAAA,MAAAA,CAAO/C,KAAAA,GAAQ;QACb8I,IAAAA,EAAM,OAAA;AACN7I,QAAAA,OAAAA,EAASoD,WAAW9C,MAAAA,IAAU,gBAAA;QAC9BwI,OAAAA,EAAS;AACP9F,UAAAA,YAAAA,EAAcI,UAAAA,CAAWJ,YAAAA;AACzBC,UAAAA,UAAAA,EAAYG,UAAAA,CAAWH,UAAAA;UACvBN,eAAAA,EAAiBzE,OAAAA,CAAQmF,MAAMd,MAAAA,IAAU;AAC3C;AACF,OAAA;AACF,IAAA;AACF,EAAA;;;;EAKA,MAAcE,UAAAA,CAAWvE,SAAuB4E,MAAAA,EAAoC;AAClF,IAAA,IAAI,CAAC5E,OAAAA,CAAQmF,KAAAA,EAAOf,UAAAA,EAAY;AAC9B,MAAA;AACF,IAAA;AAEA,IAAA,MAAMD,UAAAA,GAAanE,OAAAA,CAAQmF,KAAAA,CAAMhB,UAAAA,IAAc,MAAA;AAC/C,IAAA,IAAID,QAAAA;AAEJ,IAAA,IAAIC,eAAe,WAAA,EAAa;AAC9BD,MAAAA,QAAAA,GAAWlE,OAAAA,CAAQc,eAAed,OAAAA,CAAQC,MAAAA;AAC5C,IAAA,CAAA,MAAA,IAAWkE,eAAe,cAAA,EAAgB;AACxCD,MAAAA,QAAAA,GAAWlE,OAAAA,CAAQe,kBAAkBf,OAAAA,CAAQC,MAAAA;IAC/C,CAAA,MAAO;AACLiE,MAAAA,QAAAA,GAAWlE,OAAAA,CAAQC,MAAAA;AACrB,IAAA;AAEA,IAAA,MAAMsL,YAAAA,GAAkC;AACtCrH,MAAAA,QAAAA;AACAC,MAAAA,UAAAA;AACAC,MAAAA,UAAAA,EAAYpE,QAAQmF,KAAAA,CAAMf,UAAAA;MAC1BC,MAAAA,EAAQrE,OAAAA,CAAQmF,MAAMd,MAAAA,IAAU,CAAA;AAChCxD,MAAAA,UAAAA,EAAYb,OAAAA,CAAQa,UAAAA;AACpBC,MAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe;AAC1B,KAAA;AAEA,IAAA,MAAMyK,WAAAA,GAAc,MAAM,IAAA,CAAKrG,KAAAA,CAAMlB,MAAMsH,YAAAA,CAAAA;AAC3C3G,IAAAA,MAAAA,CAAO6G,gBAAgBD,WAAAA,CAAY5J,EAAAA;AACrC,EAAA;;;;EAKA,MAAc0I,kBAAAA,CAAmBtK,OAAAA,EAAuB4E,MAAAA,EAAqBkF,SAAAA,EAAkC;AAC7G,IAAA,MAAM4B,cAAAA,GAAiB,MAAM,IAAA,CAAKhC,QAAAA,CAAS3J,GAAAA,CAAI;AAC7CE,MAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChBE,MAAAA,YAAAA,EAAcH,QAAQ0J,QAAAA,EAAUvJ,YAAAA,IAAgB,IAAA,CAAKqC,iBAAAA,CAAkBxC,QAAQK,MAAM,CAAA;AACrFD,MAAAA,YAAAA,EAAcJ,OAAAA,CAAQI,YAAAA;AACtBS,MAAAA,UAAAA,EAAYb,OAAAA,CAAQa,UAAAA;AACpBR,MAAAA,MAAAA,EAAQL,OAAAA,CAAQK,MAAAA;AAChBC,MAAAA,MAAAA,EAAQZ,cAAAA,CAAeiM,OAAAA;AACvB7K,MAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,MAAAA,cAAAA,EAAgBf,OAAAA,CAAQe,cAAAA;AACxBC,MAAAA,SAAAA,EAAWhB,OAAAA,CAAQgB,SAAAA;AACnBC,MAAAA,SAAAA,EAAWjB,QAAQ0J,QAAAA,EAAUzI,SAAAA;AAC7BC,MAAAA,SAAAA,EAAWlB,QAAQ0J,QAAAA,EAAUxI,SAAAA;AAC7BC,MAAAA,QAAAA,EAAUnB,QAAQ0J,QAAAA,EAAUvI,QAAAA;MAC5BC,QAAAA,EAAUpB,OAAAA,CAAQ0J,QAAAA,EAAUtI,QAAAA,IAAYzB,gBAAAA,CAAiBiM,GAAAA;MACzDtK,QAAAA,EAAUyI,IAAAA,CAAKC,KAAG,GAAKF;KACzB,CAAA;AAEAlF,IAAAA,MAAAA,CAAOlD,aAAagK,cAAAA,CAAe9J,EAAAA;AACrC,EAAA;;;;EAKA,MAAcwI,iBAAAA,CAAkBpK,OAAAA,EAAuB4E,MAAAA,EAAqBkF,SAAAA,EAAkC;AAC5G,IAAA,IAAI9J,OAAAA,CAAQ0J,QAAAA,EAAUtB,OAAAA,KAAY,KAAA,EAAO;AACvC,MAAA;AACF,IAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAMsD,cAAAA,GAAiB,MAAM,IAAA,CAAKhC,QAAAA,CAAS3J,GAAAA,CAAI;AAC7CE,QAAAA,MAAAA,EAAQD,OAAAA,CAAQC,MAAAA;AAChBE,QAAAA,YAAAA,EAAcH,QAAQ0J,QAAAA,EAAUvJ,YAAAA,IAAgB,IAAA,CAAKqC,iBAAAA,CAAkBxC,QAAQK,MAAM,CAAA;AACrFD,QAAAA,YAAAA,EAAcJ,OAAAA,CAAQI,YAAAA;AACtBS,QAAAA,UAAAA,EAAYb,OAAAA,CAAQa,UAAAA;AACpBR,QAAAA,MAAAA,EAAQL,OAAAA,CAAQK,MAAAA;AAChBC,QAAAA,MAAAA,EAAQZ,cAAAA,CAAemM,OAAAA;AACvB/K,QAAAA,WAAAA,EAAad,OAAAA,CAAQc,WAAAA;AACrBC,QAAAA,cAAAA,EAAgBf,OAAAA,CAAQe,cAAAA;AACxBC,QAAAA,SAAAA,EAAWhB,OAAAA,CAAQgB,SAAAA;AACnBC,QAAAA,SAAAA,EAAWjB,QAAQ0J,QAAAA,EAAUzI,SAAAA;AAC7BC,QAAAA,SAAAA,EAAWlB,QAAQ0J,QAAAA,EAAUxI,SAAAA;AAC7BC,QAAAA,QAAAA,EAAUnB,QAAQ0J,QAAAA,EAAUvI,QAAAA;AAC5BC,QAAAA,QAAAA,EAAUzB,gBAAAA,CAAiBmM,IAAAA;AAC3BzK,QAAAA,YAAAA,EAAcuD,OAAO/C,KAAAA,EAAOC,OAAAA;QAC5BR,QAAAA,EAAUyI,IAAAA,CAAKC,KAAG,GAAKF;OACzB,CAAA;AAEAlF,MAAAA,MAAAA,CAAOlD,aAAagK,cAAAA,CAAe9J,EAAAA;AACrC,IAAA,CAAA,CAAA,OAASC,KAAAA,EAAO;AACdtB,MAAAA,MAAAA,CAAOsB,MAAM,kCAAA,EAAoC;AAAEA,QAAAA;OAAM,CAAA;AAC3D,IAAA;AACF,EAAA;;;;EAKA,MAAc4I,uBAAAA,CAAwBzK,SAAuB4E,MAAAA,EAAoC;AAC/F,IAAA,IAAI,CAAC5E,OAAAA,CAAQuK,YAAAA,EAAcC,SAAAA,EAAW;AACpC,MAAA;AACF,IAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAMuB,OAAAA,GAAU;QAAC/L,OAAAA,CAAQC,MAAAA;WAAYD,OAAAA,CAAQuK,YAAAA,CAAaC,SAAAA,CAAUwB,iBAAAA,IAAqB;;AAEzF,MAAA,MAAMzK,QAAAA,GAAW,MAAM,IAAA,CAAKoI,aAAAA,CAAcsC,IAAAA,CAAK;QAC7CC,KAAAA,EAAOlM,OAAAA,CAAQuK,aAAaC,SAAAA,CAAU0B,KAAAA;QACtCpK,OAAAA,EAAS9B,OAAAA,CAAQuK,aAAaC,SAAAA,CAAU1I,OAAAA;AACxC6I,QAAAA,IAAAA,EAAM3K,OAAAA,CAAQuK,YAAAA,CAAaC,SAAAA,CAAUG,IAAAA,IAAQwB,gBAAAA,CAAiBR,OAAAA;AAC9DI,QAAAA;OACF,CAAA;AAEAnH,MAAAA,MAAAA,CAAOwH,kBAAkB7K,QAAAA,CAAS6K,eAAAA;AACpC,IAAA,CAAA,CAAA,OAASvK,KAAAA,EAAO;AACdtB,MAAAA,MAAAA,CAAOsB,MAAM,+CAAA,EAAiD;AAAEA,QAAAA;OAAM,CAAA;AACxE,IAAA;AACF,EAAA;;;;EAKA,MAAciJ,uBAAAA,CAAwB9K,SAAuB4E,MAAAA,EAAoC;AAC/F,IAAA,IAAI,CAAC5E,OAAAA,CAAQuK,YAAAA,EAAcM,SAAAA,EAAW;AACpC,MAAA;AACF,IAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAMkB,OAAAA,GAAU;QAAC/L,OAAAA,CAAQC,MAAAA;WAAYD,OAAAA,CAAQuK,YAAAA,CAAaM,SAAAA,CAAUmB,iBAAAA,IAAqB;;AAEzF,MAAA,MAAMzK,QAAAA,GAAW,MAAM,IAAA,CAAKoI,aAAAA,CAAcsC,IAAAA,CAAK;QAC7CC,KAAAA,EAAOlM,OAAAA,CAAQuK,aAAaM,SAAAA,CAAUqB,KAAAA;QACtCpK,OAAAA,EAAS9B,OAAAA,CAAQuK,aAAaM,SAAAA,CAAU/I,OAAAA;AACxC6I,QAAAA,IAAAA,EAAM3K,OAAAA,CAAQuK,YAAAA,CAAaM,SAAAA,CAAUF,IAAAA,IAAQwB,gBAAAA,CAAiBE,KAAAA;AAC9DN,QAAAA;OACF,CAAA;AAEAnH,MAAAA,MAAAA,CAAOwH,kBAAkB7K,QAAAA,CAAS6K,eAAAA;AACpC,IAAA,CAAA,CAAA,OAASvK,KAAAA,EAAO;AACdtB,MAAAA,MAAAA,CAAOsB,MAAM,+CAAA,EAAiD;AAAEA,QAAAA;OAAM,CAAA;AACxE,IAAA;AACF,EAAA;;;;AAKQW,EAAAA,iBAAAA,CAAkBnC,MAAAA,EAA8B;AACtD,IAAA,MAAMqD,WAAAA,GAAcrD,OAAOsD,WAAAA,EAAW;AAEtC,IAAA,IAAID,WAAAA,CAAYxB,SAAS,QAAA,CAAA,IAAawB,YAAYxB,QAAAA,CAAS,KAAA,CAAA,EAAQ,OAAOzC,YAAAA,CAAa6M,MAAAA;AACvF,IAAA,IAAI5I,WAAAA,CAAYxB,SAAS,QAAA,CAAA,IAAawB,YAAYxB,QAAAA,CAAS,MAAA,CAAA,EAAS,OAAOzC,YAAAA,CAAa8M,MAAAA;AACxF,IAAA,IAAI7I,WAAAA,CAAYxB,SAAS,QAAA,CAAA,IAAawB,YAAYxB,QAAAA,CAAS,QAAA,CAAA,EAAW,OAAOzC,YAAAA,CAAa+M,MAAAA;AAC1F,IAAA,IAAI9I,WAAAA,CAAYxB,SAAS,MAAA,CAAA,IAAWwB,YAAYxB,QAAAA,CAAS,MAAA,CAAA,EAAS,OAAOzC,YAAAA,CAAagN,IAAAA;AACtF,IAAA,IAAI/I,WAAAA,CAAYxB,QAAAA,CAAS,OAAA,CAAA,SAAiBzC,YAAAA,CAAaiN,KAAAA;AACvD,IAAA,IAAIhJ,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,SAAkBzC,YAAAA,CAAakN,MAAAA;AACxD,IAAA,IAAIjJ,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,SAAkBzC,YAAAA,CAAamN,MAAAA;AACxD,IAAA,IAAIlJ,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,SAAkBzC,YAAAA,CAAaoN,MAAAA;AACxD,IAAA,IAAInJ,WAAAA,CAAYxB,QAAAA,CAAS,OAAA,CAAA,SAAiBzC,YAAAA,CAAaqN,KAAAA;AACvD,IAAA,IAAIpJ,WAAAA,CAAYxB,QAAAA,CAAS,UAAA,CAAA,SAAoBzC,YAAAA,CAAasN,QAAAA;AAC1D,IAAA,IAAIrJ,WAAAA,CAAYxB,QAAAA,CAAS,QAAA,CAAA,SAAkBzC,YAAAA,CAAauN,MAAAA;AAExD,IAAA,OAAOvN,YAAAA,CAAawN,MAAAA;AACtB,EAAA;;;;AAKA,EAAA,MAAa5E,WAAW6E,UAAAA,EAAoD;AAC1E3M,IAAAA,MAAAA,CAAOC,MAAM,qCAAA,EAAuC;AAAEwF,MAAAA,KAAAA,EAAOkH,UAAAA,CAAWjH;KAAO,CAAA;AAE/E,IAAA,MAAMkH,OAAAA,GAAU,MAAMC,OAAAA,CAAQC,GAAAA,CAAIH,UAAAA,CAAWI,GAAAA,CAAI,CAACC,EAAAA,KAAO,IAAA,CAAKtJ,KAAAA,CAAMsJ,EAAAA,CAAAA,CAAAA,CAAAA;AAEpEhN,IAAAA,MAAAA,CAAOkB,KAAK,oCAAA,EAAsC;AAChD+L,MAAAA,KAAAA,EAAOL,OAAAA,CAAQlH,MAAAA;AACfwH,MAAAA,UAAAA,EAAYN,QAAQO,MAAAA,CAAO,CAACC,CAAAA,KAAMA,CAAAA,CAAE3G,OAAO,CAAA,CAAEf,MAAAA;AAC7C2H,MAAAA,MAAAA,EAAQT,QAAQO,MAAAA,CAAO,CAACC,MAAM,CAACA,CAAAA,CAAE3G,OAAO,CAAA,CAAEf;KAC5C,CAAA;AAEA,IAAA,OAAOkH,OAAAA;AACT,EAAA;AACF","file":"chunk-HNS7EHUX.js","sourcesContent":["/**\n * Activity Tracking Module\n * Comprehensive audit trail and activity logging for all operations\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum ActivityType {\n CREATE = 'create',\n READ = 'read',\n UPDATE = 'update',\n DELETE = 'delete',\n LOGIN = 'login',\n LOGOUT = 'logout',\n EXPORT = 'export',\n IMPORT = 'import',\n SHARE = 'share',\n DOWNLOAD = 'download',\n UPLOAD = 'upload',\n EXECUTE = 'execute',\n APPROVE = 'approve',\n REJECT = 'reject',\n CUSTOM = 'custom',\n}\n\nexport enum ActivityStatus {\n SUCCESS = 'success',\n FAILURE = 'failure',\n PENDING = 'pending',\n WARNING = 'warning',\n}\n\nexport enum ActivitySeverity {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface LogActivityOptions {\n /** User performing the action */\n userId: string;\n /** Type of activity */\n activityType: ActivityType;\n /** Resource type being acted upon */\n resourceType: string;\n /** Resource ID */\n resourceId?: string;\n /** Action performed */\n action: string;\n /** Activity status */\n status: ActivityStatus;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Severity level */\n severity?: ActivitySeverity;\n /** Error message if failed */\n errorMessage?: string;\n /** Duration in milliseconds */\n duration?: number;\n}\n\nexport interface Activity {\n id: string;\n userId: string;\n activityType: ActivityType;\n resourceType: string;\n resourceId?: string;\n action: string;\n status: ActivityStatus;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n ipAddress?: string;\n userAgent?: string;\n metadata?: Record<string, unknown>;\n severity: ActivitySeverity;\n errorMessage?: string;\n duration?: number;\n createdAt: string;\n}\n\nexport interface GetActivitiesOptions {\n /** Filter by user */\n userId?: string;\n /** Filter by workspace */\n workspaceId?: string;\n /** Filter by organization */\n organizationId?: string;\n /** Filter by project */\n projectId?: string;\n /** Filter by activity type */\n activityType?: ActivityType;\n /** Filter by resource type */\n resourceType?: string;\n /** Filter by resource ID */\n resourceId?: string;\n /** Filter by status */\n status?: ActivityStatus;\n /** Filter by severity */\n severity?: ActivitySeverity;\n /** Filter by date range */\n startDate?: string;\n endDate?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Sort by field */\n sortBy?: 'createdAt' | 'duration' | 'severity';\n /** Sort order */\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface ActivityStats {\n totalActivities: number;\n successCount: number;\n failureCount: number;\n pendingCount: number;\n warningCount: number;\n averageDuration?: number;\n activitiesByType: Record<string, number>;\n activitiesBySeverity: Record<string, number>;\n topUsers: Array<{ userId: string; count: number }>;\n topResources: Array<{ resourceType: string; count: number }>;\n}\n\n/**\n * Activity Tracking Module\n */\nexport class ActivityModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Log activity\n */\n public async log(options: LogActivityOptions): Promise<Activity> {\n // Validate required fields\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.activityType) {\n throw new ValidationError('Activity type is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.status) {\n throw new ValidationError('Status is required');\n }\n\n logger.debug('[Activity] Logging activity', {\n userId: options.userId,\n action: options.action,\n resourceType: options.resourceType,\n });\n\n const recordActivityMutation = `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const legacyLogActivityMutation = `\n mutation LogActivity($input: LogActivityInput!) {\n logActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const variables = {\n input: {\n userId: options.userId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: options.status,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.ipAddress,\n userAgent: options.userAgent,\n metadata: options.metadata,\n severity: options.severity || ActivitySeverity.LOW,\n errorMessage: options.errorMessage,\n duration: options.duration,\n },\n };\n\n try {\n const response = await this.client.query<{ recordActivity: Activity }>(\n recordActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged', { activityId: response.recordActivity.id });\n return response.recordActivity;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isRecordActivityUnavailable =\n message.includes('Cannot query field \"recordActivity\"') ||\n message.includes('Unknown type \"RecordActivityInput\"');\n\n if (!isRecordActivityUnavailable) {\n throw error;\n }\n\n logger.warn('[Activity] Falling back to legacy logActivity mutation', {\n reason: message,\n });\n\n const legacyResponse = await this.client.query<{ logActivity: Activity }>(\n legacyLogActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged (legacy)', { activityId: legacyResponse.logActivity.id });\n return legacyResponse.logActivity;\n }\n }\n\n /**\n * Log activity with automatic status detection\n */\n public async logSuccess(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.SUCCESS,\n severity: ActivitySeverity.LOW,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Log failed activity\n */\n public async logFailure(\n userId: string,\n action: string,\n resourceType: string,\n errorMessage: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.FAILURE,\n severity: ActivitySeverity.HIGH,\n errorMessage,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Get activities with filters\n */\n public async getActivities(options: GetActivitiesOptions): Promise<{\n activities: Activity[];\n total: number;\n }> {\n logger.debug('[Activity] Getting activities', options);\n\n const query = `\n query GetActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $resourceId: ID\n $status: ActivityStatus\n $severity: ActivitySeverity\n $startDate: DateTime\n $endDate: DateTime\n $search: String\n $limit: Int\n $offset: Int\n $sortBy: String\n $sortOrder: String\n ) {\n getActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n resourceId: $resourceId\n status: $status\n severity: $severity\n startDate: $startDate\n endDate: $endDate\n search: $search\n limit: $limit\n offset: $offset\n sortBy: $sortBy\n sortOrder: $sortOrder\n ) {\n activities {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n total\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n status: options.status,\n severity: options.severity,\n startDate: options.startDate,\n endDate: options.endDate,\n search: options.search,\n limit: options.limit || 50,\n offset: options.offset || 0,\n sortBy: options.sortBy || 'createdAt',\n sortOrder: options.sortOrder || 'desc',\n };\n\n const response = await this.client.query<{\n getActivities: { activities: Activity[]; total: number };\n }>(query, variables, this.context);\n\n return response.getActivities;\n }\n\n /**\n * Get activity by ID\n */\n public async getActivity(activityId: string): Promise<Activity> {\n logger.debug('[Activity] Getting activity', { activityId });\n\n const query = `\n query GetActivity($activityId: ID!) {\n getActivity(activityId: $activityId) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getActivity: Activity }>(query, { activityId }, this.context);\n\n return response.getActivity;\n }\n\n /**\n * Get activity statistics\n */\n public async getStats(options: Omit<GetActivitiesOptions, 'limit' | 'offset'>): Promise<ActivityStats> {\n logger.debug('[Activity] Getting activity stats', options);\n\n const query = `\n query GetActivityStats(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $startDate: DateTime\n $endDate: DateTime\n ) {\n getActivityStats(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n startDate: $startDate\n endDate: $endDate\n ) {\n totalActivities\n successCount\n failureCount\n pendingCount\n warningCount\n averageDuration\n activitiesByType\n activitiesBySeverity\n topUsers {\n userId\n count\n }\n topResources {\n resourceType\n count\n }\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n startDate: options.startDate,\n endDate: options.endDate,\n };\n\n const response = await this.client.query<{ getActivityStats: ActivityStats }>(query, variables, this.context);\n\n return response.getActivityStats;\n }\n\n /**\n * Delete old activities (cleanup)\n */\n public async cleanup(olderThanDays: number, workspaceId?: string): Promise<number> {\n logger.debug('[Activity] Cleaning up old activities', { olderThanDays, workspaceId });\n\n const mutation = `\n mutation CleanupActivities($olderThanDays: Int!, $workspaceId: ID) {\n cleanupActivities(olderThanDays: $olderThanDays, workspaceId: $workspaceId) {\n deletedCount\n }\n }\n `;\n\n const response = await this.client.query<{\n cleanupActivities: { deletedCount: number };\n }>(mutation, { olderThanDays, workspaceId }, this.context);\n\n logger.info('[Activity] Cleanup completed', {\n deletedCount: response.cleanupActivities.deletedCount,\n });\n\n return response.cleanupActivities.deletedCount;\n }\n\n /**\n * Infer activity type from action string\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) {\n return ActivityType.CREATE;\n }\n if (actionLower.includes('update') || actionLower.includes('edit') || actionLower.includes('modify')) {\n return ActivityType.UPDATE;\n }\n if (actionLower.includes('delete') || actionLower.includes('remove')) {\n return ActivityType.DELETE;\n }\n if (actionLower.includes('read') || actionLower.includes('view') || actionLower.includes('get')) {\n return ActivityType.READ;\n }\n if (actionLower.includes('login') || actionLower.includes('signin')) {\n return ActivityType.LOGIN;\n }\n if (actionLower.includes('logout') || actionLower.includes('signout')) {\n return ActivityType.LOGOUT;\n }\n if (actionLower.includes('export')) {\n return ActivityType.EXPORT;\n }\n if (actionLower.includes('import')) {\n return ActivityType.IMPORT;\n }\n if (actionLower.includes('share')) {\n return ActivityType.SHARE;\n }\n if (actionLower.includes('download')) {\n return ActivityType.DOWNLOAD;\n }\n if (actionLower.includes('upload')) {\n return ActivityType.UPLOAD;\n }\n if (actionLower.includes('execute') || actionLower.includes('run')) {\n return ActivityType.EXECUTE;\n }\n if (actionLower.includes('approve')) {\n return ActivityType.APPROVE;\n }\n if (actionLower.includes('reject')) {\n return ActivityType.REJECT;\n }\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Export activities to CSV\n */\n public async exportToCSV(options: GetActivitiesOptions): Promise<string> {\n logger.debug('[Activity] Exporting activities to CSV');\n\n const query = `\n query ExportActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $startDate: DateTime\n $endDate: DateTime\n ) {\n exportActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n startDate: $startDate\n endDate: $endDate\n ) {\n csvData\n }\n }\n `;\n\n const response = await this.client.query<{ exportActivities: { csvData: string } }>(\n query,\n {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n startDate: options.startDate,\n endDate: options.endDate,\n },\n this.context\n );\n\n logger.info('[Activity] Activities exported to CSV');\n\n return response.exportActivities.csvData;\n }\n}\n","/**\n * Usage & Quota Module\n * Track resource usage, enforce quotas, and manage billing\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError, QuotaExceededError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum UsageMetricType {\n API_CALLS = 'api_calls',\n STORAGE = 'storage',\n BANDWIDTH = 'bandwidth',\n USERS = 'users',\n PROJECTS = 'projects',\n WORKSPACES = 'workspaces',\n RECORDS = 'records',\n COMPUTE_TIME = 'compute_time',\n TRANSACTIONS = 'transactions',\n CUSTOM = 'custom',\n}\n\nexport enum QuotaPeriod {\n DAILY = 'daily',\n WEEKLY = 'weekly',\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n LIFETIME = 'lifetime',\n}\n\n/**\n * Entity type for usage tracking\n */\nexport type UsageEntityType = 'user' | 'workspace' | 'organization';\n\nexport interface TrackUsageOptions {\n /** User or workspace consuming the resource */\n entityId: string;\n /** Type of entity (user or workspace) */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to increment */\n amount: number;\n /** Optional resource identifier */\n resourceId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface CheckQuotaOptions {\n /** Entity to check quota for */\n entityId: string;\n /** Type of entity */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to check availability for */\n requestedAmount: number;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface QuotaCheckResult {\n allowed: boolean;\n currentUsage: number;\n quotaLimit: number;\n remainingQuota: number;\n resetAt?: string;\n period: QuotaPeriod;\n reason?: string;\n}\n\nexport interface UsageRecord {\n id: string;\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n amount: number;\n resourceId?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n recordedAt: string;\n}\n\nexport interface UsageSummary {\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n totalUsage: number;\n period: QuotaPeriod;\n periodStart: string;\n periodEnd: string;\n quotaLimit?: number;\n utilizationPercentage?: number;\n}\n\nexport interface SetQuotaOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n workspaceId?: string;\n organizationId?: string;\n}\n\nexport interface Quota {\n id: string;\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n currentUsage: number;\n resetAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface GetUsageOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType?: UsageMetricType;\n startDate?: string;\n endDate?: string;\n workspaceId?: string;\n organizationId?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Usage & Quota Module\n */\nexport class UsageModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Track usage\n */\n public async track(options: TrackUsageOptions): Promise<UsageRecord> {\n // Validate inputs\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.entityType) {\n throw new ValidationError('Entity type is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.amount !== 'number' || options.amount <= 0) {\n throw new ValidationError('Amount must be a positive number');\n }\n\n logger.debug('[Usage] Tracking usage', {\n entityId: options.entityId,\n metricType: options.metricType,\n amount: options.amount,\n });\n\n const mutation = `\n mutation TrackUsage($input: TrackUsageInput!) {\n trackUsage(input: $input) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n amount: options.amount,\n resourceId: options.resourceId,\n metadata: options.metadata,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ trackUsage: UsageRecord }>(mutation, variables, this.context);\n\n logger.info('[Usage] Usage tracked', { recordId: response.trackUsage.id });\n\n return response.trackUsage;\n }\n\n /**\n * Check quota availability\n */\n public async checkQuota(options: CheckQuotaOptions): Promise<QuotaCheckResult> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.requestedAmount !== 'number' || options.requestedAmount <= 0) {\n throw new ValidationError('Requested amount must be a positive number');\n }\n\n logger.debug('[Usage] Checking quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n });\n\n const query = `\n query CheckQuota($input: CheckQuotaInput!) {\n checkQuota(input: $input) {\n allowed\n currentUsage\n quotaLimit\n remainingQuota\n resetAt\n period\n reason\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ checkQuota: QuotaCheckResult }>(query, variables, this.context);\n\n logger.debug('[Usage] Quota check result', { allowed: response.checkQuota.allowed });\n\n return response.checkQuota;\n }\n\n /**\n * Require quota (throws if exceeded)\n */\n public async requireQuota(options: CheckQuotaOptions): Promise<void> {\n const result = await this.checkQuota(options);\n\n if (!result.allowed) {\n throw new QuotaExceededError(result.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: result.currentUsage,\n quotaLimit: result.quotaLimit,\n requestedAmount: options.requestedAmount,\n resetAt: result.resetAt,\n });\n }\n }\n\n /**\n * Track usage and check quota atomically\n */\n public async trackAndCheck(options: TrackUsageOptions): Promise<{\n usage: UsageRecord;\n quotaCheck: QuotaCheckResult;\n }> {\n // First check quota\n const quotaCheck = await this.checkQuota({\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.amount,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n if (!quotaCheck.allowed) {\n throw new QuotaExceededError(quotaCheck.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n });\n }\n\n // Track usage\n const usage = await this.track(options);\n\n return { usage, quotaCheck };\n }\n\n /**\n * Get usage records\n */\n public async getUsage(options: GetUsageOptions): Promise<{\n records: UsageRecord[];\n total: number;\n }> {\n logger.debug('[Usage] Getting usage records', { entityId: options.entityId });\n\n const query = `\n query GetUsage(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType\n $startDate: DateTime\n $endDate: DateTime\n $workspaceId: ID\n $organizationId: ID\n $limit: Int\n $offset: Int\n ) {\n getUsage(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n startDate: $startDate\n endDate: $endDate\n workspaceId: $workspaceId\n organizationId: $organizationId\n limit: $limit\n offset: $offset\n ) {\n records {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n total\n }\n }\n `;\n\n const variables = {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n startDate: options.startDate,\n endDate: options.endDate,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n limit: options.limit || 100,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getUsage: { records: UsageRecord[]; total: number };\n }>(query, variables, this.context);\n\n return response.getUsage;\n }\n\n /**\n * Get usage summary\n */\n public async getSummary(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType,\n period: QuotaPeriod\n ): Promise<UsageSummary> {\n logger.debug('[Usage] Getting usage summary', { entityId, metricType, period });\n\n const query = `\n query GetUsageSummary(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType!\n $period: QuotaPeriod!\n ) {\n getUsageSummary(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n period: $period\n ) {\n entityId\n entityType\n metricType\n totalUsage\n period\n periodStart\n periodEnd\n quotaLimit\n utilizationPercentage\n }\n }\n `;\n\n const response = await this.client.query<{ getUsageSummary: UsageSummary }>(\n query,\n { entityId, entityType, metricType, period },\n this.context\n );\n\n return response.getUsageSummary;\n }\n\n /**\n * Set quota limit\n */\n public async setQuota(options: SetQuotaOptions): Promise<Quota> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.limit !== 'number' || options.limit < 0) {\n throw new ValidationError('Limit must be a non-negative number');\n }\n\n logger.debug('[Usage] Setting quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n limit: options.limit,\n });\n\n const mutation = `\n mutation SetQuota($input: SetQuotaInput!) {\n setQuota(input: $input) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n limit: options.limit,\n period: options.period,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ setQuota: Quota }>(mutation, variables, this.context);\n\n logger.info('[Usage] Quota set', { quotaId: response.setQuota.id });\n\n return response.setQuota;\n }\n\n /**\n * Get quota\n */\n public async getQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<Quota | null> {\n logger.debug('[Usage] Getting quota', { entityId, metricType });\n\n const query = `\n query GetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n getQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuota: Quota | null }>(\n query,\n { entityId, entityType, metricType },\n this.context\n );\n\n return response.getQuota;\n }\n\n /**\n * Get all quotas for entity\n */\n public async getQuotas(entityId: string, entityType: UsageEntityType): Promise<Quota[]> {\n logger.debug('[Usage] Getting all quotas', { entityId, entityType });\n\n const query = `\n query GetQuotas($entityId: ID!, $entityType: String!) {\n getQuotas(entityId: $entityId, entityType: $entityType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuotas: Quota[] }>(query, { entityId, entityType }, this.context);\n\n return response.getQuotas;\n }\n\n /**\n * Reset quota usage\n */\n public async resetQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Resetting quota', { entityId, metricType });\n\n const mutation = `\n mutation ResetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n resetQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota reset', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Delete quota\n */\n public async deleteQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Deleting quota', { entityId, metricType });\n\n const mutation = `\n mutation DeleteQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n deleteQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota deleted', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Bulk track usage\n */\n public async trackBulk(records: TrackUsageOptions[]): Promise<UsageRecord[]> {\n logger.debug('[Usage] Bulk tracking usage', { count: records.length });\n\n const mutation = `\n mutation TrackUsageBulk($records: [TrackUsageInput!]!) {\n trackUsageBulk(records: $records) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const response = await this.client.query<{ trackUsageBulk: UsageRecord[] }>(mutation, { records }, this.context);\n\n logger.info('[Usage] Bulk usage tracked', { count: response.trackUsageBulk.length });\n\n return response.trackUsageBulk;\n }\n}\n","/**\n * Unified Tracking — Auto-Promoting Implementation\n *\n * Automatically promotes from stub to real tracking when gateway URLs are configured.\n * When WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL is set, this module will:\n * - Log activity events via GraphQL to the activity service\n * - Track usage via GraphQL to the usage service (if usage options provided)\n * - RBAC checks are NOT performed here (handled by gateway @rbac directives)\n *\n * When no gateway URL is configured, falls back to debug-level logging (stub mode).\n *\n * This is a backward-compatible drop-in replacement for the original stub. All 1,100+\n * existing call sites continue to work without modification.\n *\n * @module tracker/stub\n * @category Tracking\n */\nimport { logger } from '../logger/index.js';\n\n/**\n * Tracking event interface\n */\nexport interface TrackingEvent {\n eventType: string;\n entityType: string;\n entityId: string;\n userId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n timestamp?: Date;\n}\n\n/**\n * RBAC check options\n */\nexport interface RbacCheckOptions {\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n skipRbacCheck?: boolean;\n options?: {\n allowOwnerAccess?: boolean;\n allowWorkspaceAdmin?: boolean;\n scope?: string;\n };\n}\n\n/**\n * Usage tracking options\n */\nexport interface UsageTrackingOptions {\n billingAccountId?: string;\n addUsage?: boolean;\n description?: string;\n tags?: Record<string, unknown>;\n quotaName?: string;\n value?: number;\n}\n\n/**\n * Activity tracking options\n */\nexport interface ActivityTrackingOptions {\n activityType?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n teamId?: string;\n groupId?: string;\n projectId?: string;\n targetUserId?: string;\n resourceType?: string;\n resourceId?: string;\n enabled?: boolean;\n}\n\n/**\n * Unified tracking options\n */\nexport interface UnifiedTrackingOptions {\n operationName?: string;\n userId?: string;\n context?: unknown;\n rbacCheck?: RbacCheckOptions;\n activityOptions?: ActivityTrackingOptions;\n usageOptions?: UsageTrackingOptions & { enabled?: boolean };\n success?: boolean;\n errorMessage?: string;\n productId?: string;\n // Legacy properties for backward compatibility (can be at top level or in nested objects)\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n tenantId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Gateway URL resolution — cached at module level for performance\n// ---------------------------------------------------------------------------\n\nlet _gatewayUrl: string | undefined;\nlet _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
+ {"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-PPIDJP2W.js","sourcesContent":["/**\n * Activity Tracking Module\n * Comprehensive audit trail and activity logging for all operations\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum ActivityType {\n CREATE = 'create',\n READ = 'read',\n UPDATE = 'update',\n DELETE = 'delete',\n LOGIN = 'login',\n LOGOUT = 'logout',\n EXPORT = 'export',\n IMPORT = 'import',\n SHARE = 'share',\n DOWNLOAD = 'download',\n UPLOAD = 'upload',\n EXECUTE = 'execute',\n APPROVE = 'approve',\n REJECT = 'reject',\n CUSTOM = 'custom',\n}\n\nexport enum ActivityStatus {\n SUCCESS = 'success',\n FAILURE = 'failure',\n PENDING = 'pending',\n WARNING = 'warning',\n}\n\nexport enum ActivitySeverity {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface LogActivityOptions {\n /** User performing the action */\n userId: string;\n /** Type of activity */\n activityType: ActivityType;\n /** Resource type being acted upon */\n resourceType: string;\n /** Resource ID */\n resourceId?: string;\n /** Action performed */\n action: string;\n /** Activity status */\n status: ActivityStatus;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Severity level */\n severity?: ActivitySeverity;\n /** Error message if failed */\n errorMessage?: string;\n /** Duration in milliseconds */\n duration?: number;\n}\n\nexport interface Activity {\n id: string;\n userId: string;\n activityType: ActivityType;\n resourceType: string;\n resourceId?: string;\n action: string;\n status: ActivityStatus;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n ipAddress?: string;\n userAgent?: string;\n metadata?: Record<string, unknown>;\n severity: ActivitySeverity;\n errorMessage?: string;\n duration?: number;\n createdAt: string;\n}\n\nexport interface GetActivitiesOptions {\n /** Filter by user */\n userId?: string;\n /** Filter by workspace */\n workspaceId?: string;\n /** Filter by organization */\n organizationId?: string;\n /** Filter by project */\n projectId?: string;\n /** Filter by activity type */\n activityType?: ActivityType;\n /** Filter by resource type */\n resourceType?: string;\n /** Filter by resource ID */\n resourceId?: string;\n /** Filter by status */\n status?: ActivityStatus;\n /** Filter by severity */\n severity?: ActivitySeverity;\n /** Filter by date range */\n startDate?: string;\n endDate?: string;\n /** Search term */\n search?: string;\n /** Limit number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Sort by field */\n sortBy?: 'createdAt' | 'duration' | 'severity';\n /** Sort order */\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface ActivityStats {\n totalActivities: number;\n successCount: number;\n failureCount: number;\n pendingCount: number;\n warningCount: number;\n averageDuration?: number;\n activitiesByType: Record<string, number>;\n activitiesBySeverity: Record<string, number>;\n topUsers: Array<{ userId: string; count: number }>;\n topResources: Array<{ resourceType: string; count: number }>;\n}\n\n/**\n * Activity Tracking Module\n */\nexport class ActivityModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Log activity\n */\n public async log(options: LogActivityOptions): Promise<Activity> {\n // Validate required fields\n if (!options.userId) {\n throw new ValidationError('User ID is required');\n }\n\n if (!options.activityType) {\n throw new ValidationError('Activity type is required');\n }\n\n if (!options.resourceType) {\n throw new ValidationError('Resource type is required');\n }\n\n if (!options.action) {\n throw new ValidationError('Action is required');\n }\n\n if (!options.status) {\n throw new ValidationError('Status is required');\n }\n\n logger.debug('[Activity] Logging activity', {\n userId: options.userId,\n action: options.action,\n resourceType: options.resourceType,\n });\n\n const recordActivityMutation = `\n mutation RecordActivity($input: RecordActivityInput!) {\n recordActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const legacyLogActivityMutation = `\n mutation LogActivity($input: LogActivityInput!) {\n logActivity(input: $input) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const variables = {\n input: {\n userId: options.userId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n action: options.action,\n status: options.status,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n ipAddress: options.ipAddress,\n userAgent: options.userAgent,\n metadata: options.metadata,\n severity: options.severity || ActivitySeverity.LOW,\n errorMessage: options.errorMessage,\n duration: options.duration,\n },\n };\n\n try {\n const response = await this.client.query<{ recordActivity: Activity }>(\n recordActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged', { activityId: response.recordActivity.id });\n return response.recordActivity;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isRecordActivityUnavailable =\n message.includes('Cannot query field \"recordActivity\"') ||\n message.includes('Unknown type \"RecordActivityInput\"');\n\n if (!isRecordActivityUnavailable) {\n throw error;\n }\n\n logger.warn('[Activity] Falling back to legacy logActivity mutation', {\n reason: message,\n });\n\n const legacyResponse = await this.client.query<{ logActivity: Activity }>(\n legacyLogActivityMutation,\n variables,\n this.context\n );\n\n logger.info('[Activity] Activity logged (legacy)', { activityId: legacyResponse.logActivity.id });\n return legacyResponse.logActivity;\n }\n }\n\n /**\n * Log activity with automatic status detection\n */\n public async logSuccess(\n userId: string,\n action: string,\n resourceType: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.SUCCESS,\n severity: ActivitySeverity.LOW,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Log failed activity\n */\n public async logFailure(\n userId: string,\n action: string,\n resourceType: string,\n errorMessage: string,\n resourceId?: string,\n metadata?: Record<string, unknown>\n ): Promise<Activity> {\n return this.log({\n userId,\n action,\n resourceType,\n resourceId,\n activityType: this.inferActivityType(action),\n status: ActivityStatus.FAILURE,\n severity: ActivitySeverity.HIGH,\n errorMessage,\n metadata,\n workspaceId: this.context.workspaceId,\n });\n }\n\n /**\n * Get activities with filters\n */\n public async getActivities(options: GetActivitiesOptions): Promise<{\n activities: Activity[];\n total: number;\n }> {\n logger.debug('[Activity] Getting activities', options);\n\n const query = `\n query GetActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $resourceId: ID\n $status: ActivityStatus\n $severity: ActivitySeverity\n $startDate: DateTime\n $endDate: DateTime\n $search: String\n $limit: Int\n $offset: Int\n $sortBy: String\n $sortOrder: String\n ) {\n getActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n resourceId: $resourceId\n status: $status\n severity: $severity\n startDate: $startDate\n endDate: $endDate\n search: $search\n limit: $limit\n offset: $offset\n sortBy: $sortBy\n sortOrder: $sortOrder\n ) {\n activities {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n total\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n resourceId: options.resourceId,\n status: options.status,\n severity: options.severity,\n startDate: options.startDate,\n endDate: options.endDate,\n search: options.search,\n limit: options.limit || 50,\n offset: options.offset || 0,\n sortBy: options.sortBy || 'createdAt',\n sortOrder: options.sortOrder || 'desc',\n };\n\n const response = await this.client.query<{\n getActivities: { activities: Activity[]; total: number };\n }>(query, variables, this.context);\n\n return response.getActivities;\n }\n\n /**\n * Get activity by ID\n */\n public async getActivity(activityId: string): Promise<Activity> {\n logger.debug('[Activity] Getting activity', { activityId });\n\n const query = `\n query GetActivity($activityId: ID!) {\n getActivity(activityId: $activityId) {\n id\n userId\n activityType\n resourceType\n resourceId\n action\n status\n workspaceId\n organizationId\n projectId\n ipAddress\n userAgent\n metadata\n severity\n errorMessage\n duration\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getActivity: Activity }>(query, { activityId }, this.context);\n\n return response.getActivity;\n }\n\n /**\n * Get activity statistics\n */\n public async getStats(options: Omit<GetActivitiesOptions, 'limit' | 'offset'>): Promise<ActivityStats> {\n logger.debug('[Activity] Getting activity stats', options);\n\n const query = `\n query GetActivityStats(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $projectId: ID\n $activityType: ActivityType\n $resourceType: String\n $startDate: DateTime\n $endDate: DateTime\n ) {\n getActivityStats(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n projectId: $projectId\n activityType: $activityType\n resourceType: $resourceType\n startDate: $startDate\n endDate: $endDate\n ) {\n totalActivities\n successCount\n failureCount\n pendingCount\n warningCount\n averageDuration\n activitiesByType\n activitiesBySeverity\n topUsers {\n userId\n count\n }\n topResources {\n resourceType\n count\n }\n }\n }\n `;\n\n const variables = {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId,\n activityType: options.activityType,\n resourceType: options.resourceType,\n startDate: options.startDate,\n endDate: options.endDate,\n };\n\n const response = await this.client.query<{ getActivityStats: ActivityStats }>(query, variables, this.context);\n\n return response.getActivityStats;\n }\n\n /**\n * Delete old activities (cleanup)\n */\n public async cleanup(olderThanDays: number, workspaceId?: string): Promise<number> {\n logger.debug('[Activity] Cleaning up old activities', { olderThanDays, workspaceId });\n\n const mutation = `\n mutation CleanupActivities($olderThanDays: Int!, $workspaceId: ID) {\n cleanupActivities(olderThanDays: $olderThanDays, workspaceId: $workspaceId) {\n deletedCount\n }\n }\n `;\n\n const response = await this.client.query<{\n cleanupActivities: { deletedCount: number };\n }>(mutation, { olderThanDays, workspaceId }, this.context);\n\n logger.info('[Activity] Cleanup completed', {\n deletedCount: response.cleanupActivities.deletedCount,\n });\n\n return response.cleanupActivities.deletedCount;\n }\n\n /**\n * Infer activity type from action string\n */\n private inferActivityType(action: string): ActivityType {\n const actionLower = action.toLowerCase();\n\n if (actionLower.includes('create') || actionLower.includes('add')) {\n return ActivityType.CREATE;\n }\n if (actionLower.includes('update') || actionLower.includes('edit') || actionLower.includes('modify')) {\n return ActivityType.UPDATE;\n }\n if (actionLower.includes('delete') || actionLower.includes('remove')) {\n return ActivityType.DELETE;\n }\n if (actionLower.includes('read') || actionLower.includes('view') || actionLower.includes('get')) {\n return ActivityType.READ;\n }\n if (actionLower.includes('login') || actionLower.includes('signin')) {\n return ActivityType.LOGIN;\n }\n if (actionLower.includes('logout') || actionLower.includes('signout')) {\n return ActivityType.LOGOUT;\n }\n if (actionLower.includes('export')) {\n return ActivityType.EXPORT;\n }\n if (actionLower.includes('import')) {\n return ActivityType.IMPORT;\n }\n if (actionLower.includes('share')) {\n return ActivityType.SHARE;\n }\n if (actionLower.includes('download')) {\n return ActivityType.DOWNLOAD;\n }\n if (actionLower.includes('upload')) {\n return ActivityType.UPLOAD;\n }\n if (actionLower.includes('execute') || actionLower.includes('run')) {\n return ActivityType.EXECUTE;\n }\n if (actionLower.includes('approve')) {\n return ActivityType.APPROVE;\n }\n if (actionLower.includes('reject')) {\n return ActivityType.REJECT;\n }\n\n return ActivityType.CUSTOM;\n }\n\n /**\n * Export activities to CSV\n */\n public async exportToCSV(options: GetActivitiesOptions): Promise<string> {\n logger.debug('[Activity] Exporting activities to CSV');\n\n const query = `\n query ExportActivities(\n $userId: ID\n $workspaceId: ID\n $organizationId: ID\n $startDate: DateTime\n $endDate: DateTime\n ) {\n exportActivities(\n userId: $userId\n workspaceId: $workspaceId\n organizationId: $organizationId\n startDate: $startDate\n endDate: $endDate\n ) {\n csvData\n }\n }\n `;\n\n const response = await this.client.query<{ exportActivities: { csvData: string } }>(\n query,\n {\n userId: options.userId,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n startDate: options.startDate,\n endDate: options.endDate,\n },\n this.context\n );\n\n logger.info('[Activity] Activities exported to CSV');\n\n return response.exportActivities.csvData;\n }\n}\n","/**\n * Usage & Quota Module\n * Track resource usage, enforce quotas, and manage billing\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError, QuotaExceededError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum UsageMetricType {\n API_CALLS = 'api_calls',\n STORAGE = 'storage',\n BANDWIDTH = 'bandwidth',\n USERS = 'users',\n PROJECTS = 'projects',\n WORKSPACES = 'workspaces',\n RECORDS = 'records',\n COMPUTE_TIME = 'compute_time',\n TRANSACTIONS = 'transactions',\n CUSTOM = 'custom',\n}\n\nexport enum QuotaPeriod {\n DAILY = 'daily',\n WEEKLY = 'weekly',\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n LIFETIME = 'lifetime',\n}\n\n/**\n * Entity type for usage tracking\n */\nexport type UsageEntityType = 'user' | 'workspace' | 'organization';\n\nexport interface TrackUsageOptions {\n /** User or workspace consuming the resource */\n entityId: string;\n /** Type of entity (user or workspace) */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to increment */\n amount: number;\n /** Optional resource identifier */\n resourceId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface CheckQuotaOptions {\n /** Entity to check quota for */\n entityId: string;\n /** Type of entity */\n entityType: UsageEntityType;\n /** Metric type */\n metricType: UsageMetricType;\n /** Amount to check availability for */\n requestedAmount: number;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface QuotaCheckResult {\n allowed: boolean;\n currentUsage: number;\n quotaLimit: number;\n remainingQuota: number;\n resetAt?: string;\n period: QuotaPeriod;\n reason?: string;\n}\n\nexport interface UsageRecord {\n id: string;\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n amount: number;\n resourceId?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n recordedAt: string;\n}\n\nexport interface UsageSummary {\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n totalUsage: number;\n period: QuotaPeriod;\n periodStart: string;\n periodEnd: string;\n quotaLimit?: number;\n utilizationPercentage?: number;\n}\n\nexport interface SetQuotaOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n workspaceId?: string;\n organizationId?: string;\n}\n\nexport interface Quota {\n id: string;\n entityId: string;\n entityType: string;\n metricType: UsageMetricType;\n limit: number;\n period: QuotaPeriod;\n currentUsage: number;\n resetAt: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface GetUsageOptions {\n entityId: string;\n entityType: UsageEntityType;\n metricType?: UsageMetricType;\n startDate?: string;\n endDate?: string;\n workspaceId?: string;\n organizationId?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Usage & Quota Module\n */\nexport class UsageModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Track usage\n */\n public async track(options: TrackUsageOptions): Promise<UsageRecord> {\n // Validate inputs\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.entityType) {\n throw new ValidationError('Entity type is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.amount !== 'number' || options.amount <= 0) {\n throw new ValidationError('Amount must be a positive number');\n }\n\n logger.debug('[Usage] Tracking usage', {\n entityId: options.entityId,\n metricType: options.metricType,\n amount: options.amount,\n });\n\n const mutation = `\n mutation TrackUsage($input: TrackUsageInput!) {\n trackUsage(input: $input) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n amount: options.amount,\n resourceId: options.resourceId,\n metadata: options.metadata,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ trackUsage: UsageRecord }>(mutation, variables, this.context);\n\n logger.info('[Usage] Usage tracked', { recordId: response.trackUsage.id });\n\n return response.trackUsage;\n }\n\n /**\n * Check quota availability\n */\n public async checkQuota(options: CheckQuotaOptions): Promise<QuotaCheckResult> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.requestedAmount !== 'number' || options.requestedAmount <= 0) {\n throw new ValidationError('Requested amount must be a positive number');\n }\n\n logger.debug('[Usage] Checking quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n });\n\n const query = `\n query CheckQuota($input: CheckQuotaInput!) {\n checkQuota(input: $input) {\n allowed\n currentUsage\n quotaLimit\n remainingQuota\n resetAt\n period\n reason\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.requestedAmount,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ checkQuota: QuotaCheckResult }>(query, variables, this.context);\n\n logger.debug('[Usage] Quota check result', { allowed: response.checkQuota.allowed });\n\n return response.checkQuota;\n }\n\n /**\n * Require quota (throws if exceeded)\n */\n public async requireQuota(options: CheckQuotaOptions): Promise<void> {\n const result = await this.checkQuota(options);\n\n if (!result.allowed) {\n throw new QuotaExceededError(result.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: result.currentUsage,\n quotaLimit: result.quotaLimit,\n requestedAmount: options.requestedAmount,\n resetAt: result.resetAt,\n });\n }\n }\n\n /**\n * Track usage and check quota atomically\n */\n public async trackAndCheck(options: TrackUsageOptions): Promise<{\n usage: UsageRecord;\n quotaCheck: QuotaCheckResult;\n }> {\n // First check quota\n const quotaCheck = await this.checkQuota({\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n requestedAmount: options.amount,\n workspaceId: options.workspaceId,\n organizationId: options.organizationId,\n });\n\n if (!quotaCheck.allowed) {\n throw new QuotaExceededError(quotaCheck.reason || 'Quota exceeded', {\n entityId: options.entityId,\n metricType: options.metricType,\n currentUsage: quotaCheck.currentUsage,\n quotaLimit: quotaCheck.quotaLimit,\n });\n }\n\n // Track usage\n const usage = await this.track(options);\n\n return { usage, quotaCheck };\n }\n\n /**\n * Get usage records\n */\n public async getUsage(options: GetUsageOptions): Promise<{\n records: UsageRecord[];\n total: number;\n }> {\n logger.debug('[Usage] Getting usage records', { entityId: options.entityId });\n\n const query = `\n query GetUsage(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType\n $startDate: DateTime\n $endDate: DateTime\n $workspaceId: ID\n $organizationId: ID\n $limit: Int\n $offset: Int\n ) {\n getUsage(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n startDate: $startDate\n endDate: $endDate\n workspaceId: $workspaceId\n organizationId: $organizationId\n limit: $limit\n offset: $offset\n ) {\n records {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n total\n }\n }\n `;\n\n const variables = {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n startDate: options.startDate,\n endDate: options.endDate,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n limit: options.limit || 100,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getUsage: { records: UsageRecord[]; total: number };\n }>(query, variables, this.context);\n\n return response.getUsage;\n }\n\n /**\n * Get usage summary\n */\n public async getSummary(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType,\n period: QuotaPeriod\n ): Promise<UsageSummary> {\n logger.debug('[Usage] Getting usage summary', { entityId, metricType, period });\n\n const query = `\n query GetUsageSummary(\n $entityId: ID!\n $entityType: String!\n $metricType: UsageMetricType!\n $period: QuotaPeriod!\n ) {\n getUsageSummary(\n entityId: $entityId\n entityType: $entityType\n metricType: $metricType\n period: $period\n ) {\n entityId\n entityType\n metricType\n totalUsage\n period\n periodStart\n periodEnd\n quotaLimit\n utilizationPercentage\n }\n }\n `;\n\n const response = await this.client.query<{ getUsageSummary: UsageSummary }>(\n query,\n { entityId, entityType, metricType, period },\n this.context\n );\n\n return response.getUsageSummary;\n }\n\n /**\n * Set quota limit\n */\n public async setQuota(options: SetQuotaOptions): Promise<Quota> {\n if (!options.entityId) {\n throw new ValidationError('Entity ID is required');\n }\n\n if (!options.metricType) {\n throw new ValidationError('Metric type is required');\n }\n\n if (typeof options.limit !== 'number' || options.limit < 0) {\n throw new ValidationError('Limit must be a non-negative number');\n }\n\n logger.debug('[Usage] Setting quota', {\n entityId: options.entityId,\n metricType: options.metricType,\n limit: options.limit,\n });\n\n const mutation = `\n mutation SetQuota($input: SetQuotaInput!) {\n setQuota(input: $input) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n entityId: options.entityId,\n entityType: options.entityType,\n metricType: options.metricType,\n limit: options.limit,\n period: options.period,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n },\n };\n\n const response = await this.client.query<{ setQuota: Quota }>(mutation, variables, this.context);\n\n logger.info('[Usage] Quota set', { quotaId: response.setQuota.id });\n\n return response.setQuota;\n }\n\n /**\n * Get quota\n */\n public async getQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<Quota | null> {\n logger.debug('[Usage] Getting quota', { entityId, metricType });\n\n const query = `\n query GetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n getQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuota: Quota | null }>(\n query,\n { entityId, entityType, metricType },\n this.context\n );\n\n return response.getQuota;\n }\n\n /**\n * Get all quotas for entity\n */\n public async getQuotas(entityId: string, entityType: UsageEntityType): Promise<Quota[]> {\n logger.debug('[Usage] Getting all quotas', { entityId, entityType });\n\n const query = `\n query GetQuotas($entityId: ID!, $entityType: String!) {\n getQuotas(entityId: $entityId, entityType: $entityType) {\n id\n entityId\n entityType\n metricType\n limit\n period\n currentUsage\n resetAt\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getQuotas: Quota[] }>(query, { entityId, entityType }, this.context);\n\n return response.getQuotas;\n }\n\n /**\n * Reset quota usage\n */\n public async resetQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Resetting quota', { entityId, metricType });\n\n const mutation = `\n mutation ResetQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n resetQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota reset', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Delete quota\n */\n public async deleteQuota(\n entityId: string,\n entityType: UsageEntityType,\n metricType: UsageMetricType\n ): Promise<boolean> {\n logger.debug('[Usage] Deleting quota', { entityId, metricType });\n\n const mutation = `\n mutation DeleteQuota($entityId: ID!, $entityType: String!, $metricType: UsageMetricType!) {\n deleteQuota(entityId: $entityId, entityType: $entityType, metricType: $metricType) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { entityId, entityType, metricType }, this.context);\n\n logger.info('[Usage] Quota deleted', { entityId, metricType });\n\n return true;\n }\n\n /**\n * Bulk track usage\n */\n public async trackBulk(records: TrackUsageOptions[]): Promise<UsageRecord[]> {\n logger.debug('[Usage] Bulk tracking usage', { count: records.length });\n\n const mutation = `\n mutation TrackUsageBulk($records: [TrackUsageInput!]!) {\n trackUsageBulk(records: $records) {\n id\n entityId\n entityType\n metricType\n amount\n resourceId\n metadata\n workspaceId\n organizationId\n recordedAt\n }\n }\n `;\n\n const response = await this.client.query<{ trackUsageBulk: UsageRecord[] }>(mutation, { records }, this.context);\n\n logger.info('[Usage] Bulk usage tracked', { count: response.trackUsageBulk.length });\n\n return response.trackUsageBulk;\n }\n}\n","/**\n * Unified Tracking — Auto-Promoting Implementation\n *\n * Automatically promotes from stub to real tracking when gateway URLs are configured.\n * When WSPACE_INT_GATEWAY_URL or GLOBAL_INT_GATEWAY_URL is set, this module will:\n * - Log activity events via GraphQL to the activity service\n * - Track usage via GraphQL to the usage service (if usage options provided)\n * - RBAC checks are NOT performed here (handled by gateway @rbac directives)\n *\n * When no gateway URL is configured, falls back to debug-level logging (stub mode).\n *\n * This is a backward-compatible drop-in replacement for the original stub. All 1,100+\n * existing call sites continue to work without modification.\n *\n * @module tracker/stub\n * @category Tracking\n */\nimport { logger } from '../logger/index.js';\n\n/**\n * Tracking event interface\n */\nexport interface TrackingEvent {\n eventType: string;\n entityType: string;\n entityId: string;\n userId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n timestamp?: Date;\n}\n\n/**\n * RBAC check options\n */\nexport interface RbacCheckOptions {\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n skipRbacCheck?: boolean;\n options?: {\n allowOwnerAccess?: boolean;\n allowWorkspaceAdmin?: boolean;\n scope?: string;\n };\n}\n\n/**\n * Usage tracking options\n */\nexport interface UsageTrackingOptions {\n billingAccountId?: string;\n addUsage?: boolean;\n description?: string;\n tags?: Record<string, unknown>;\n quotaName?: string;\n value?: number;\n}\n\n/**\n * Activity tracking options\n */\nexport interface ActivityTrackingOptions {\n activityType?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n teamId?: string;\n groupId?: string;\n projectId?: string;\n targetUserId?: string;\n resourceType?: string;\n resourceId?: string;\n enabled?: boolean;\n}\n\n/**\n * Unified tracking options\n */\nexport interface UnifiedTrackingOptions {\n operationName?: string;\n userId?: string;\n context?: unknown;\n rbacCheck?: RbacCheckOptions;\n activityOptions?: ActivityTrackingOptions;\n usageOptions?: UsageTrackingOptions & { enabled?: boolean };\n success?: boolean;\n errorMessage?: string;\n productId?: string;\n // Legacy properties for backward compatibility (can be at top level or in nested objects)\n action?: string;\n resourceType?: string;\n resourceId?: string;\n workspaceId?: string;\n tenantId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Gateway URL resolution — cached at module level for performance\n// ---------------------------------------------------------------------------\n\nlet _gatewayUrl: string | undefined;\nlet _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,6 +1,6 @@
1
1
  import { logger } from './chunk-CBZNP6RF.js';
2
2
  import { __export, __name } from './chunk-XE4OXN2W.js';
3
- import { readdir, readFile, stat } from 'fs/promises';
3
+ import { readdir, stat } from 'fs/promises';
4
4
  import { join, extname, basename, resolve, relative } from 'path';
5
5
 
6
6
  // src/i18n/index.ts
@@ -168,7 +168,7 @@ function validateFilePath(filePath, baseDir) {
168
168
  __name(validateFilePath, "validateFilePath");
169
169
  async function safeReadFile(filePath, baseDir) {
170
170
  const validatedPath = validateFilePath(filePath, baseDir);
171
- return readFile(validatedPath, "utf-8");
171
+ return Bun.file(validatedPath).text();
172
172
  }
173
173
  __name(safeReadFile, "safeReadFile");
174
174
  async function safeStat(filePath, baseDir) {
@@ -760,5 +760,5 @@ var DEFAULT_I18N_CONFIG = {
760
760
  };
761
761
 
762
762
  export { DEFAULT_I18N_CONFIG, I18n, Locales, RTL_LANGUAGES, clearTranslationCache, createI18n, createTranslator, discoverLocales, extractLocaleFromRequest, findBestMatch, flattenDictionary, getCachedTranslations, getI18n, getLanguage, getLanguageFromLocale, getLocale, getRegionFromLocale, getTextDirection, hasI18n, i18n_exports, initializeI18n, loadTranslationFile, loadTranslationsForLocale, normalizeLocale, parseAcceptLanguage, parseLocaleString, preloadAllTranslations, setCachedTranslations, t };
763
- //# sourceMappingURL=chunk-IYE2NTRX.js.map
764
- //# sourceMappingURL=chunk-IYE2NTRX.js.map
763
+ //# sourceMappingURL=chunk-ULFFX3YE.js.map
764
+ //# sourceMappingURL=chunk-ULFFX3YE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/index.ts","../src/i18n/types.ts","../src/i18n/parser.ts","../src/i18n/loader.ts","../src/i18n/i18n.ts","../src/i18n/helpers.ts"],"names":["RTL_LANGUAGES","getTextDirection","language","includes","parseLocaleString","localeStr","trimmed","trim","localePart","params","split","quality","param","key","value","toLowerCase","parsed","parseFloat","isNaN","locale","parts","region","toUpperCase","normalizedLocale","parseAcceptLanguage","header","locales","part","push","sort","a","b","extractLocaleFromRequest","request","defaultLocale","explicitLocale","headers","get","acceptLanguage","parsedLocales","length","normalizeLocale","getLanguageFromLocale","getRegionFromLocale","findBestMatch","requested","available","availableSet","Set","map","l","req","has","find","langMatch","translationCache","Map","validateFilePath","filePath","baseDir","resolvedBase","resolve","resolvedPath","relativePath","relative","startsWith","Error","safeReadFile","validatedPath","Bun","file","text","safeStat","stat","catch","safeReaddir","dirPath","readdir","flattenDictionary","obj","prefix","result","Object","entries","fullKey","assign","loadTranslationFile","content","data","JSON","parse","error","logger","getCacheKey","namespace","loadTranslationsForLocale","config","cacheKey","enableCache","pathsToTry","join","localesPath","path","stats","isFile","endsWith","translations","flattened","debug","isDirectory","files","extname","basename","keys","fallbackLocale","warn","fallbackTranslations","undefined","set","discoverLocales","validatedBasePath","entry","entryPath","preloadAllTranslations","supportedLocales","info","Promise","all","clearTranslationCache","delete","clear","getCachedTranslations","setCachedTranslations","getEnglishPluralCategory","absCount","getFrenchPluralCategory","getSlavicPluralCategory","mod10","mod100","getArabicPluralCategory","getPolishCzechPluralCategory","getRomanianPluralCategory","getHebrewPluralCategory","getPluralCategory","count","Math","abs","englishLanguages","interpolate","variables","replace","match","String","I18n","currentLocale","initialized","returnKeyOnMissing","logMissing","initialize","lazyLoad","getLocale","setLocale","getSupportedLocales","isSupported","normalized","some","supportedNorm","loadLocale","getTranslations","t","defaultValue","translate","tp","translatePlural","langTranslations","category","pluralKey","createContext","formatNumber","options","Intl","NumberFormat","format","formatCurrency","currency","style","formatDate","date","dateObj","Date","DateTimeFormat","formatRelativeTime","unit","RelativeTimeFormat","numeric","createContextFromRequest","bestMatch","getLanguageInfo","direction","code","globalI18n","initializeI18n","getI18n","createI18n","interpolateVariables","ctx","defaultMessage","i18n","translated","createTranslator","hasI18n","getLanguage","defaultLanguage","Locales","EN_US","EN_GB","EN_AU","EN_CA","EN_IN","ES_ES","ES_MX","FR_FR","FR_CA","DE_DE","DE_AT","DE_CH","IT_IT","PT_PT","PT_BR","RU_RU","ZH_CN","ZH_TW","ZH_HK","JA_JP","KO_KR","AR_SA","AR_AE","HI_IN","TA_IN","NL_NL","PL_PL","TR_TR","VI_VN","TH_TH","ID_ID","HE_IL","UK_UA","DEFAULT_I18N_CONFIG"],"mappings":"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","file":"chunk-ULFFX3YE.js","sourcesContent":["/**\n * I18n Module\n *\n * Comprehensive internationalization support for backend services.\n *\n * Features:\n * - Load translations from JSON files\n * - Accept-Language header parsing\n * - Translation with variable interpolation\n * - Pluralization support (CLDR rules)\n * - Locale-aware formatting (numbers, dates, currencies)\n * - Request context integration\n *\n * @example\n * ```typescript\n * import { I18n } from '@burdenoff/be-sdk/i18n';\n *\n * // Initialize\n * const i18n = new I18n({\n * defaultLocale: 'en-US',\n * localesPath: './locales',\n * });\n * await i18n.initialize();\n *\n * // Create context for a request\n * const ctx = i18n.createContextFromRequest(request);\n *\n * // Translate\n * const message = ctx.t('errors.notFound', { resource: 'Tag' });\n * // => \"Tag not found\"\n *\n * // Pluralize\n * const items = ctx.tp('items', 5, { count: 5 });\n * // => \"5 items\"\n * ```\n *\n * @packageDocumentation\n */\n\n// Core i18n class and functions\nexport { I18n, initializeI18n, getI18n, createI18n } from './i18n.js';\n\n// Context-based translation helpers (for use in resolvers/providers)\nexport {\n t,\n createTranslator,\n hasI18n,\n getLocale,\n getLanguage,\n type I18nCapableContext,\n type Translator,\n} from './helpers.js';\n\n// Types\nexport type {\n LocaleCode,\n LanguageCode,\n TranslationDictionary,\n FlatTranslationMap,\n TranslationVariables,\n PluralForms,\n TranslateFunction,\n PluralTranslateFunction,\n I18nConfig,\n ParsedLocale,\n I18nContext,\n II18n,\n TextDirection,\n LanguageInfo,\n} from './types.js';\n\n// Type helpers\nexport { RTL_LANGUAGES, getTextDirection } from './types.js';\n\n// Parser functions\nexport {\n parseLocaleString,\n parseAcceptLanguage,\n extractLocaleFromRequest,\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n} from './parser.js';\n\n// Loader functions\nexport {\n flattenDictionary,\n loadTranslationFile,\n loadTranslationsForLocale,\n discoverLocales,\n preloadAllTranslations,\n clearTranslationCache,\n getCachedTranslations,\n setCachedTranslations,\n} from './loader.js';\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\n/**\n * Common locale codes as constants\n */\nexport const Locales = {\n // English\n EN_US: 'en-US' as const,\n EN_GB: 'en-GB' as const,\n EN_AU: 'en-AU' as const,\n EN_CA: 'en-CA' as const,\n EN_IN: 'en-IN' as const,\n // Spanish\n ES_ES: 'es-ES' as const,\n ES_MX: 'es-MX' as const,\n // French\n FR_FR: 'fr-FR' as const,\n FR_CA: 'fr-CA' as const,\n // German\n DE_DE: 'de-DE' as const,\n DE_AT: 'de-AT' as const,\n DE_CH: 'de-CH' as const,\n // Italian\n IT_IT: 'it-IT' as const,\n // Portuguese\n PT_PT: 'pt-PT' as const,\n PT_BR: 'pt-BR' as const,\n // Russian\n RU_RU: 'ru-RU' as const,\n // Chinese\n ZH_CN: 'zh-CN' as const,\n ZH_TW: 'zh-TW' as const,\n ZH_HK: 'zh-HK' as const,\n // Japanese\n JA_JP: 'ja-JP' as const,\n // Korean\n KO_KR: 'ko-KR' as const,\n // Arabic\n AR_SA: 'ar-SA' as const,\n AR_AE: 'ar-AE' as const,\n // Hindi\n HI_IN: 'hi-IN' as const,\n // Tamil\n TA_IN: 'ta-IN' as const,\n // Dutch\n NL_NL: 'nl-NL' as const,\n // Polish\n PL_PL: 'pl-PL' as const,\n // Turkish\n TR_TR: 'tr-TR' as const,\n // Vietnamese\n VI_VN: 'vi-VN' as const,\n // Thai\n TH_TH: 'th-TH' as const,\n // Indonesian\n ID_ID: 'id-ID' as const,\n // Hebrew\n HE_IL: 'he-IL' as const,\n // Ukrainian\n UK_UA: 'uk-UA' as const,\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_I18N_CONFIG = {\n defaultLocale: 'en-US',\n fallbackLocale: 'en-US',\n enableCache: true,\n lazyLoad: false,\n logMissing: true,\n returnKeyOnMissing: true,\n} as const;\n","/**\n * I18n Module Types\n *\n * Type definitions for internationalization support\n */\n\n/**\n * Supported locale codes (BCP 47 format)\n * Language-Region pattern: xx-XX\n */\nexport type LocaleCode =\n // English variants\n | 'en-US'\n | 'en-GB'\n | 'en-AU'\n | 'en-CA'\n | 'en-IN'\n // Spanish variants\n | 'es-ES'\n | 'es-MX'\n | 'es-AR'\n // French variants\n | 'fr-FR'\n | 'fr-CA'\n | 'fr-BE'\n // German variants\n | 'de-DE'\n | 'de-AT'\n | 'de-CH'\n // Italian\n | 'it-IT'\n // Portuguese variants\n | 'pt-PT'\n | 'pt-BR'\n // Russian\n | 'ru-RU'\n // Chinese variants\n | 'zh-CN'\n | 'zh-TW'\n | 'zh-HK'\n // Japanese\n | 'ja-JP'\n // Korean\n | 'ko-KR'\n // Arabic variants\n | 'ar-SA'\n | 'ar-AE'\n | 'ar-EG'\n // Hindi\n | 'hi-IN'\n // Bengali\n | 'bn-IN'\n | 'bn-BD'\n // Tamil\n | 'ta-IN'\n // Telugu\n | 'te-IN'\n // Malayalam\n | 'ml-IN'\n // Dutch\n | 'nl-NL'\n | 'nl-BE'\n // Polish\n | 'pl-PL'\n // Turkish\n | 'tr-TR'\n // Vietnamese\n | 'vi-VN'\n // Thai\n | 'th-TH'\n // Indonesian\n | 'id-ID'\n // Malay\n | 'ms-MY'\n // Swedish\n | 'sv-SE'\n // Norwegian\n | 'nb-NO'\n // Danish\n | 'da-DK'\n // Finnish\n | 'fi-FI'\n // Greek\n | 'el-GR'\n // Czech\n | 'cs-CZ'\n // Romanian\n | 'ro-RO'\n // Hungarian\n | 'hu-HU'\n // Hebrew\n | 'he-IL'\n // Ukrainian\n | 'uk-UA'\n // Generic fallback (allow any valid BCP 47)\n | string;\n\n/**\n * Language code (ISO 639-1)\n */\nexport type LanguageCode =\n | 'en'\n | 'es'\n | 'fr'\n | 'de'\n | 'it'\n | 'pt'\n | 'ru'\n | 'zh'\n | 'ja'\n | 'ko'\n | 'ar'\n | 'hi'\n | 'bn'\n | 'ta'\n | 'te'\n | 'ml'\n | 'nl'\n | 'pl'\n | 'tr'\n | 'vi'\n | 'th'\n | 'id'\n | 'ms'\n | 'sv'\n | 'nb'\n | 'da'\n | 'fi'\n | 'el'\n | 'cs'\n | 'ro'\n | 'hu'\n | 'he'\n | 'uk'\n | string;\n\n/**\n * Translation dictionary type\n * Supports nested keys like { errors: { notFound: \"...\" } }\n * Includes null to match JSON data which may contain null values\n */\nexport type TranslationDictionary = {\n [key: string]: string | TranslationDictionary | null;\n};\n\n/**\n * Flattened translation map\n */\nexport type FlatTranslationMap = Record<string, string>;\n\n/**\n * Translation variables for interpolation\n */\nexport type TranslationVariables = Record<string, string | number | boolean>;\n\n/**\n * Pluralization rules\n */\nexport interface PluralForms {\n zero?: string;\n one: string;\n two?: string;\n few?: string;\n many?: string;\n other: string;\n}\n\n/**\n * Translation function type\n */\nexport type TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string) => string;\n\n/**\n * Plural translation function type\n */\nexport type PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables) => string;\n\n/**\n * I18n configuration options\n */\nexport interface I18nConfig {\n /** Default locale if none specified */\n defaultLocale: LocaleCode;\n /** Fallback locale when translation is missing */\n fallbackLocale?: LocaleCode;\n /** Path to locales directory */\n localesPath: string;\n /** Supported locales (if empty, all locales in directory are supported) */\n supportedLocales?: LocaleCode[];\n /** Whether to load translations lazily */\n lazyLoad?: boolean;\n /** Cache translations in memory */\n enableCache?: boolean;\n /** Namespace for this service (e.g., 'tags', 'auth') */\n namespace?: string;\n /** Log missing translations */\n logMissing?: boolean;\n /** Return key on missing translation instead of empty string */\n returnKeyOnMissing?: boolean;\n}\n\n/**\n * Parsed locale information\n */\nexport interface ParsedLocale {\n /** Full locale code (e.g., 'en-US') */\n locale: LocaleCode;\n /** Language code (e.g., 'en') */\n language: LanguageCode;\n /** Region code (e.g., 'US') */\n region?: string;\n /** Quality factor from Accept-Language header (0-1) */\n quality: number;\n}\n\n/**\n * I18n context for requests\n */\nexport interface I18nContext {\n /** Current locale */\n locale: LocaleCode;\n /** Language code */\n language: LanguageCode;\n /** Region code */\n region?: string;\n /** Geography: ISO 3166-1 alpha-2 country code (e.g., 'IN', 'US', 'DE') — from x-geo-country header */\n country?: string;\n /** Geography: ISO 4217 currency code (e.g., 'INR', 'USD', 'EUR') — from x-geo-currency header */\n currency?: string;\n /** Geography: IANA timezone (e.g., 'Asia/Kolkata', 'America/New_York') — from x-geo-timezone header */\n timezone?: string;\n /** Translation function */\n t: TranslateFunction;\n /** Plural translation function */\n tp: PluralTranslateFunction;\n /** Format number for locale */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format currency for locale */\n formatCurrency: (value: number, currency: string) => string;\n /** Format date for locale */\n formatDate: (date: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Format relative time for locale */\n formatRelativeTime: (value: number, unit: Intl.RelativeTimeFormatUnit) => string;\n}\n\n/**\n * I18n instance interface\n */\nexport interface II18n {\n /** Get current locale */\n getLocale(): LocaleCode;\n /** Set current locale */\n setLocale(locale: LocaleCode): void;\n /** Get supported locales */\n getSupportedLocales(): LocaleCode[];\n /** Check if locale is supported */\n isSupported(locale: LocaleCode): boolean;\n /** Translate a key */\n t: TranslateFunction;\n /** Translate with pluralization */\n tp: PluralTranslateFunction;\n /** Create context for request */\n createContext(locale: LocaleCode): I18nContext;\n /** Load translations for a locale */\n loadLocale(locale: LocaleCode): Promise<void>;\n /** Get all translations for a locale */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined;\n}\n\n/**\n * Language direction\n */\nexport type TextDirection = 'ltr' | 'rtl';\n\n/**\n * Language metadata\n */\nexport interface LanguageInfo {\n code: LanguageCode;\n name: string;\n nativeName: string;\n direction: TextDirection;\n locales: LocaleCode[];\n}\n\n/**\n * RTL languages\n */\nexport const RTL_LANGUAGES: LanguageCode[] = ['ar', 'he'];\n\n/**\n * Get text direction for a language\n */\nexport function getTextDirection(language: LanguageCode): TextDirection {\n return RTL_LANGUAGES.includes(language) ? 'rtl' : 'ltr';\n}\n","/**\n * I18n Parser Module\n *\n * Parses Accept-Language headers and locale strings\n */\n\nimport type { LocaleCode, LanguageCode, ParsedLocale } from './types.js';\n\n/**\n * Parse a single locale string (e.g., 'en-US', 'fr;q=0.9')\n */\nexport function parseLocaleString(localeStr: string): ParsedLocale | null {\n const trimmed = localeStr.trim();\n if (!trimmed || trimmed === '*') {\n return null;\n }\n\n // Parse quality factor if present (e.g., 'en-US;q=0.9')\n const [localePart, ...params] = trimmed.split(';');\n let quality = 1.0;\n\n for (const param of params) {\n const [key, value] = param.trim().split('=');\n if (key?.toLowerCase() === 'q' && value) {\n const parsed = parseFloat(value);\n if (!isNaN(parsed) && parsed >= 0 && parsed <= 1) {\n quality = parsed;\n }\n }\n }\n\n const locale = localePart?.trim();\n if (!locale) {\n return null;\n }\n\n // Parse language and region\n const parts = locale.split('-');\n const language = parts[0]?.toLowerCase() as LanguageCode;\n const region = parts[1]?.toUpperCase();\n\n // Reconstruct proper locale code\n const normalizedLocale = region ? `${language}-${region}` : language;\n\n return {\n locale: normalizedLocale,\n language,\n region,\n quality,\n };\n}\n\n/**\n * Parse Accept-Language header\n *\n * Example: 'en-US,en;q=0.9,fr;q=0.8,de;q=0.7'\n *\n * @param header The Accept-Language header value\n * @returns Array of parsed locales sorted by quality (highest first)\n */\nexport function parseAcceptLanguage(header: string | null | undefined): ParsedLocale[] {\n if (!header || header.trim() === '') {\n return [];\n }\n\n const locales: ParsedLocale[] = [];\n\n // Split by comma and parse each part\n const parts = header.split(',');\n for (const part of parts) {\n const parsed = parseLocaleString(part);\n if (parsed) {\n locales.push(parsed);\n }\n }\n\n // Sort by quality factor (highest first)\n locales.sort((a, b) => b.quality - a.quality);\n\n return locales;\n}\n\n/**\n * Extract locale from request headers\n *\n * Checks in order:\n * 1. X-Locale header (explicit override)\n * 2. X-Language header (explicit override)\n * 3. Accept-Language header\n *\n * @param request Web API Request object\n * @param defaultLocale Default locale to return if none found\n * @returns The best matching locale\n */\nexport function extractLocaleFromRequest(request: Request, defaultLocale: LocaleCode = 'en-US'): ParsedLocale {\n // Check explicit locale header first\n const explicitLocale = request.headers.get('x-locale') || request.headers.get('x-language');\n if (explicitLocale) {\n const parsed = parseLocaleString(explicitLocale);\n if (parsed) {\n return parsed;\n }\n }\n\n // Parse Accept-Language header\n const acceptLanguage = request.headers.get('accept-language');\n const parsedLocales = parseAcceptLanguage(acceptLanguage);\n\n if (parsedLocales.length > 0) {\n return parsedLocales[0]!;\n }\n\n // Return default locale\n const [language, region] = defaultLocale.split('-');\n return {\n locale: defaultLocale,\n language: language as LanguageCode,\n region: region,\n quality: 1.0,\n };\n}\n\n/**\n * Normalize a locale code to standard format\n *\n * @param locale The locale to normalize\n * @returns Normalized locale (e.g., 'en-us' -> 'en-US')\n */\nexport function normalizeLocale(locale: string): LocaleCode {\n const parts = locale.trim().split(/[-_]/);\n const language = parts[0]?.toLowerCase();\n const region = parts[1]?.toUpperCase();\n\n if (region) {\n return `${language}-${region}`;\n }\n return language as LocaleCode;\n}\n\n/**\n * Get the language code from a locale\n */\nexport function getLanguageFromLocale(locale: LocaleCode): LanguageCode {\n return locale.split('-')[0] as LanguageCode;\n}\n\n/**\n * Get the region code from a locale\n */\nexport function getRegionFromLocale(locale: LocaleCode): string | undefined {\n const parts = locale.split('-');\n return parts[1];\n}\n\n/**\n * Find the best matching locale from available locales\n *\n * @param requested Requested locales (sorted by preference)\n * @param available Available locales\n * @param defaultLocale Default locale to use if no match\n * @returns The best matching locale\n */\nexport function findBestMatch(\n requested: ParsedLocale[],\n available: LocaleCode[],\n defaultLocale: LocaleCode\n): LocaleCode {\n const availableSet = new Set(available.map((l) => l.toLowerCase()));\n\n for (const req of requested) {\n // Try exact match first (e.g., 'en-US')\n if (availableSet.has(req.locale.toLowerCase())) {\n // Return with proper casing from available\n return available.find((l) => l.toLowerCase() === req.locale.toLowerCase()) || req.locale;\n }\n\n // Try language-only match (e.g., 'en')\n if (availableSet.has(req.language.toLowerCase())) {\n return available.find((l) => l.toLowerCase() === req.language.toLowerCase()) || req.language;\n }\n\n // Try to find any locale with the same language\n const langMatch = available.find((l) => getLanguageFromLocale(l).toLowerCase() === req.language.toLowerCase());\n if (langMatch) {\n return langMatch;\n }\n }\n\n return defaultLocale;\n}\n","/**\n * I18n Loader Module\n *\n * Loads and manages translation files from the filesystem\n */\n\nimport { readdir, stat } from 'fs/promises';\nimport { join, extname, basename, resolve, relative } from 'path';\nimport type { LocaleCode, TranslationDictionary, FlatTranslationMap, I18nConfig } from './types.js';\nimport { normalizeLocale, getLanguageFromLocale } from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Translation cache\n */\nconst translationCache = new Map<string, FlatTranslationMap>();\n\n/**\n * Validate that a file path is within the allowed base directory\n * Prevents directory traversal attacks\n *\n * @param filePath The file path to validate\n * @param baseDir The base directory that must contain the file\n * @returns The resolved absolute path if valid\n * @throws Error if path escapes the base directory\n */\nfunction validateFilePath(filePath: string, baseDir: string): string {\n const resolvedBase = resolve(baseDir);\n const resolvedPath = resolve(filePath);\n const relativePath = relative(resolvedBase, resolvedPath);\n\n // If relative path starts with '..' or is absolute, it's outside base directory\n if (relativePath.startsWith('..') || resolve(relativePath) === relativePath) {\n throw new Error(`Invalid file path: ${filePath} is outside base directory ${baseDir}`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely read a file with path validation\n * Path is validated before reading to prevent directory traversal attacks\n */\nasync function safeReadFile(filePath: string, baseDir: string): Promise<string> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return Bun.file(validatedPath).text();\n}\n\n/**\n * Safely stat a file with path validation\n * Path is validated before stat to prevent directory traversal attacks\n */\nasync function safeStat(filePath: string, baseDir: string): Promise<Awaited<ReturnType<typeof stat>> | null> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return stat(validatedPath).catch(() => null);\n}\n\n/**\n * Safely read directory with path validation\n * Path is validated before readdir to prevent directory traversal attacks\n */\nasync function safeReaddir(dirPath: string, baseDir: string): Promise<string[]> {\n const validatedPath = validateFilePath(dirPath, baseDir);\n return readdir(validatedPath);\n}\n\n/**\n * Flatten a nested translation dictionary\n *\n * @param obj The nested dictionary\n * @param prefix Current key prefix\n * @returns Flattened key-value map\n */\nexport function flattenDictionary(obj: TranslationDictionary, prefix = ''): FlatTranslationMap {\n const result: FlatTranslationMap = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === 'string') {\n result[fullKey] = value;\n } else if (value !== null && typeof value === 'object') {\n // Check null first to avoid different-types-comparison warning\n // (typeof null === 'object' is a JavaScript quirk)\n Object.assign(result, flattenDictionary(value, fullKey));\n }\n }\n\n return result;\n}\n\n/**\n * Load a single translation file\n *\n * @param filePath Path to the translation file\n * @param baseDir Base directory for validation\n * @returns The loaded translations\n */\nexport async function loadTranslationFile(filePath: string, baseDir: string): Promise<TranslationDictionary> {\n try {\n const content = await safeReadFile(filePath, baseDir);\n const data = JSON.parse(content) as TranslationDictionary;\n return data;\n } catch (error) {\n logger.error(`[I18n] Failed to load translation file: ${filePath}`, error);\n return {};\n }\n}\n\n/**\n * Get cache key for translations\n */\nfunction getCacheKey(namespace: string | undefined, locale: LocaleCode): string {\n return namespace ? `${namespace}:${locale}` : locale;\n}\n\n/**\n * Load translations for a locale from a directory\n *\n * Supports multiple file formats:\n * - locales/en-US.json (single file per locale)\n * - locales/en-US/common.json (directory per locale with namespace files)\n * - locales/en.json (language-only fallback)\n *\n * @param config I18n configuration\n * @param locale The locale to load\n * @returns Flattened translations map\n */\nexport async function loadTranslationsForLocale(config: I18nConfig, locale: LocaleCode): Promise<FlatTranslationMap> {\n const cacheKey = getCacheKey(config.namespace, locale);\n\n // Check cache first\n if (config.enableCache !== false && translationCache.has(cacheKey)) {\n return translationCache.get(cacheKey)!;\n }\n\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const result: FlatTranslationMap = {};\n\n // Try loading in order of specificity\n const pathsToTry = [\n // Most specific: full locale\n join(config.localesPath, `${normalizedLocale}.json`),\n // Directory format\n join(config.localesPath, normalizedLocale),\n // Language only fallback\n join(config.localesPath, `${language}.json`),\n // Language directory\n join(config.localesPath, language),\n ];\n\n for (const path of pathsToTry) {\n try {\n const stats = await safeStat(path, config.localesPath);\n if (!stats) continue;\n\n if (stats.isFile() && path.endsWith('.json')) {\n // Single file\n const translations = await loadTranslationFile(path, config.localesPath);\n const flattened = flattenDictionary(translations);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded translations from ${path}`);\n break;\n } else if (stats.isDirectory()) {\n // Directory with multiple namespace files\n const files = await safeReaddir(path, config.localesPath);\n for (const file of files) {\n if (extname(file) === '.json') {\n const namespace = basename(file, '.json');\n const filePath = join(path, file);\n const translations = await loadTranslationFile(filePath, config.localesPath);\n const flattened = flattenDictionary(translations, namespace);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded namespace ${namespace} from ${filePath}`);\n }\n }\n break;\n }\n } catch {\n // Continue trying next path\n }\n }\n\n // If nothing loaded and we have a fallback, try that\n if (Object.keys(result).length === 0 && config.fallbackLocale && config.fallbackLocale !== locale) {\n logger.warn(`[I18n] No translations found for ${locale}, trying fallback ${config.fallbackLocale}`);\n const fallbackTranslations = await loadTranslationsForLocale(\n { ...config, fallbackLocale: undefined },\n config.fallbackLocale\n );\n Object.assign(result, fallbackTranslations);\n }\n\n // Cache the result\n if (config.enableCache !== false) {\n translationCache.set(cacheKey, result);\n }\n\n return result;\n}\n\n/**\n * Discover available locales in a directory\n *\n * @param localesPath Path to locales directory\n * @returns Array of available locale codes\n */\nexport async function discoverLocales(localesPath: string): Promise<LocaleCode[]> {\n const locales: LocaleCode[] = [];\n\n try {\n const validatedBasePath = resolve(localesPath);\n const entries = await readdir(validatedBasePath);\n\n for (const entry of entries) {\n const entryPath = join(validatedBasePath, entry);\n const stats = await safeStat(entryPath, validatedBasePath);\n if (!stats) continue;\n\n if (stats.isFile() && entry.endsWith('.json')) {\n // Single file: en-US.json or en.json\n const locale = basename(entry, '.json');\n locales.push(normalizeLocale(locale));\n } else if (stats.isDirectory()) {\n // Directory: en-US/ or en/\n locales.push(normalizeLocale(entry));\n }\n }\n } catch (error) {\n logger.error(`[I18n] Failed to discover locales in ${localesPath}`, error);\n }\n\n return locales;\n}\n\n/**\n * Preload all translations for supported locales\n *\n * @param config I18n configuration\n */\nexport async function preloadAllTranslations(config: I18nConfig): Promise<void> {\n const locales = config.supportedLocales || (await discoverLocales(config.localesPath));\n\n logger.info(`[I18n] Preloading translations for ${locales.length} locales...`);\n\n await Promise.all(\n locales.map(async (locale) => {\n try {\n await loadTranslationsForLocale(config, locale);\n } catch (error) {\n logger.error(`[I18n] Failed to preload locale ${locale}`, error);\n }\n })\n );\n\n logger.info(`[I18n] Preloaded translations for: ${locales.join(', ')}`);\n}\n\n/**\n * Clear the translation cache\n *\n * @param namespace Optional namespace to clear (clears all if not provided)\n */\nexport function clearTranslationCache(namespace?: string): void {\n if (namespace) {\n for (const key of translationCache.keys()) {\n if (key.startsWith(`${namespace}:`)) {\n translationCache.delete(key);\n }\n }\n } else {\n translationCache.clear();\n }\n}\n\n/**\n * Get cached translations for a locale\n */\nexport function getCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode\n): FlatTranslationMap | undefined {\n return translationCache.get(getCacheKey(namespace, locale));\n}\n\n/**\n * Set translations in cache (useful for testing or dynamic loading)\n */\nexport function setCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode,\n translations: FlatTranslationMap\n): void {\n translationCache.set(getCacheKey(namespace, locale), translations);\n}\n","/**\n * I18n Class\n *\n * Main internationalization class providing translation and formatting functions\n */\n\nimport type {\n LocaleCode,\n LanguageCode,\n I18nConfig,\n I18nContext,\n II18n,\n FlatTranslationMap,\n TranslationVariables,\n TranslateFunction,\n PluralTranslateFunction,\n} from './types.js';\nimport { getTextDirection } from './types.js';\nimport { loadTranslationsForLocale, preloadAllTranslations, discoverLocales, getCachedTranslations } from './loader.js';\nimport {\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n extractLocaleFromRequest,\n} from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Pluralization category based on CLDR rules\n */\ntype PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';\n\n/**\n * English and most Germanic/Romance languages (simple one/other)\n */\nfunction getEnglishPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * French pluralization (0 or 1 = one, else other)\n */\nfunction getFrenchPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0 || absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * Slavic languages (Russian, Ukrainian) - complex: one, few, many, other\n */\nfunction getSlavicPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (mod10 === 1 && mod100 !== 11) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n if (mod10 === 0 || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 11 && mod100 <= 14)) return 'many';\n return 'other';\n}\n\n/**\n * Arabic pluralization (zero, one, two, few, many, other)\n */\nfunction getArabicPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0) return 'zero';\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n const mod100 = absCount % 100;\n if (mod100 >= 3 && mod100 <= 10) return 'few';\n if (mod100 >= 11 && mod100 <= 99) return 'many';\n return 'other';\n}\n\n/**\n * Polish/Czech pluralization (one, few, many)\n */\nfunction getPolishCzechPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (absCount === 1) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n return 'many';\n}\n\n/**\n * Romanian pluralization (one, few, other)\n */\nfunction getRomanianPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n const mod100 = absCount % 100;\n if (absCount === 0 || (mod100 >= 1 && mod100 <= 19)) return 'few';\n return 'other';\n}\n\n/**\n * Hebrew pluralization (one, two, other)\n */\nfunction getHebrewPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n return 'other';\n}\n\n/**\n * Get plural category for a count in a given language\n * Based on CLDR plural rules: https://cldr.unicode.org/index/cldr-spec/plural-rules\n */\nfunction getPluralCategory(language: LanguageCode, count: number): PluralCategory {\n const absCount = Math.abs(count);\n\n // English and most Germanic/Romance languages\n const englishLanguages = [\n 'en',\n 'de',\n 'es',\n 'it',\n 'nl',\n 'sv',\n 'da',\n 'nb',\n 'fi',\n 'pt',\n 'el',\n 'hu',\n 'tr',\n 'id',\n 'ms',\n 'th',\n 'vi',\n 'ko',\n 'zh',\n 'ja',\n ];\n if (englishLanguages.includes(language)) {\n return getEnglishPluralCategory(absCount);\n }\n\n // French\n if (language === 'fr') {\n return getFrenchPluralCategory(absCount);\n }\n\n // Russian, Ukrainian\n if (language === 'ru' || language === 'uk') {\n return getSlavicPluralCategory(absCount);\n }\n\n // Arabic\n if (language === 'ar') {\n return getArabicPluralCategory(absCount);\n }\n\n // Polish, Czech\n if (language === 'pl' || language === 'cs') {\n return getPolishCzechPluralCategory(absCount);\n }\n\n // Romanian\n if (language === 'ro') {\n return getRomanianPluralCategory(absCount);\n }\n\n // Hebrew\n if (language === 'he') {\n return getHebrewPluralCategory(absCount);\n }\n\n // Default: simple singular/plural\n return getEnglishPluralCategory(absCount);\n}\n\n/**\n * Interpolate variables in a translation string\n *\n * Supports:\n * - {{variable}} - simple interpolation\n * - {{variable, number}} - number formatting (future)\n * - {{variable, date}} - date formatting (future)\n */\nfunction interpolate(text: string, variables?: TranslationVariables): string {\n if (!variables || !text) {\n return text;\n }\n\n // Use more specific pattern to avoid catastrophic backtracking\n // Matches {{ variableName }} with word characters (alphanumeric and underscore)\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key: string) => {\n const value = variables[key.trim()];\n if (value !== undefined) {\n return String(value);\n }\n return match; // Keep original if variable not found\n });\n}\n\n/**\n * I18n Class\n *\n * Main class for internationalization functionality\n */\nexport class I18n implements II18n {\n private config: I18nConfig;\n private currentLocale: LocaleCode;\n private supportedLocales: LocaleCode[] = [];\n private initialized = false;\n\n constructor(config: I18nConfig) {\n this.config = {\n ...config,\n fallbackLocale: config.fallbackLocale || 'en-US',\n enableCache: config.enableCache !== false,\n returnKeyOnMissing: config.returnKeyOnMissing !== false,\n logMissing: config.logMissing !== false,\n };\n this.currentLocale = normalizeLocale(config.defaultLocale);\n }\n\n /**\n * Initialize the i18n instance\n * Discovers available locales and optionally preloads translations\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Discover available locales\n if (this.config.supportedLocales && this.config.supportedLocales.length > 0) {\n this.supportedLocales = this.config.supportedLocales;\n } else {\n this.supportedLocales = await discoverLocales(this.config.localesPath);\n }\n\n // Preload translations if not lazy loading\n if (!this.config.lazyLoad) {\n await preloadAllTranslations(this.config);\n }\n\n this.initialized = true;\n logger.info(`[I18n] Initialized with ${this.supportedLocales.length} locales, default: ${this.currentLocale}`);\n }\n\n /**\n * Get current locale\n */\n getLocale(): LocaleCode {\n return this.currentLocale;\n }\n\n /**\n * Set current locale\n */\n setLocale(locale: LocaleCode): void {\n this.currentLocale = normalizeLocale(locale);\n }\n\n /**\n * Get supported locales\n */\n getSupportedLocales(): LocaleCode[] {\n return [...this.supportedLocales];\n }\n\n /**\n * Check if a locale is supported\n */\n isSupported(locale: LocaleCode): boolean {\n const normalized = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalized);\n\n return this.supportedLocales.some((l) => {\n const supportedNorm = normalizeLocale(l);\n // Exact match or language match\n return supportedNorm === normalized || getLanguageFromLocale(supportedNorm) === language;\n });\n }\n\n /**\n * Load translations for a specific locale\n */\n async loadLocale(locale: LocaleCode): Promise<void> {\n await loadTranslationsForLocale(this.config, locale);\n }\n\n /**\n * Get all translations for a locale\n */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined {\n return getCachedTranslations(this.config.namespace, locale);\n }\n\n /**\n * Translate a key\n */\n t: TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string): string => {\n return this.translate(this.currentLocale, key, variables, defaultValue);\n };\n\n /**\n * Translate with pluralization\n */\n tp: PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables): string => {\n return this.translatePlural(this.currentLocale, key, count, variables);\n };\n\n /**\n * Internal translate method\n */\n private translate(locale: LocaleCode, key: string, variables?: TranslationVariables, defaultValue?: string): string {\n const translations = getCachedTranslations(this.config.namespace, locale);\n let text = translations?.[key];\n\n // Try fallback locale if not found\n if (!text && this.config.fallbackLocale && locale !== this.config.fallbackLocale) {\n const fallbackTranslations = getCachedTranslations(this.config.namespace, this.config.fallbackLocale);\n text = fallbackTranslations?.[key];\n }\n\n // Try language-only fallback\n if (!text) {\n const language = getLanguageFromLocale(locale);\n if (language !== locale) {\n const langTranslations = getCachedTranslations(this.config.namespace, language);\n text = langTranslations?.[key];\n }\n }\n\n if (!text) {\n if (this.config.logMissing) {\n logger.warn(`[I18n] Missing translation for key: ${key} in locale: ${locale}`);\n }\n // Return default value, key, or empty string\n return defaultValue ?? (this.config.returnKeyOnMissing ? key : '');\n }\n\n return interpolate(text, variables);\n }\n\n /**\n * Internal translate with pluralization\n */\n private translatePlural(locale: LocaleCode, key: string, count: number, variables?: TranslationVariables): string {\n const language = getLanguageFromLocale(locale);\n const category = getPluralCategory(language, count);\n\n // Try plural-specific key first (e.g., 'items.one', 'items.other')\n const pluralKey = `${key}.${category}`;\n let text = this.translate(locale, pluralKey, undefined, '');\n\n // Fallback to 'other' if specific form not found\n if (!text && category !== 'other') {\n text = this.translate(locale, `${key}.other`, undefined, '');\n }\n\n // Final fallback to base key\n if (!text) {\n text = this.translate(locale, key, undefined, key);\n }\n\n return interpolate(text, { ...variables, count });\n }\n\n /**\n * Create an i18n context for a specific locale\n */\n createContext(locale: LocaleCode): I18nContext {\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const region = getRegionFromLocale(normalizedLocale);\n\n // Create bound translate functions for this locale\n const t: TranslateFunction = (key, variables, defaultValue) => {\n return this.translate(normalizedLocale, key, variables, defaultValue);\n };\n\n const tp: PluralTranslateFunction = (key, count, variables) => {\n return this.translatePlural(normalizedLocale, key, count, variables);\n };\n\n const formatNumber = (value: number, options?: Intl.NumberFormatOptions): string => {\n return new Intl.NumberFormat(normalizedLocale, options).format(value);\n };\n\n const formatCurrency = (value: number, currency: string): string => {\n return new Intl.NumberFormat(normalizedLocale, {\n style: 'currency',\n currency,\n }).format(value);\n };\n\n const formatDate = (date: Date | string, options?: Intl.DateTimeFormatOptions): string => {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat(normalizedLocale, options).format(dateObj);\n };\n\n const formatRelativeTime = (value: number, unit: Intl.RelativeTimeFormatUnit): string => {\n return new Intl.RelativeTimeFormat(normalizedLocale, { numeric: 'auto' }).format(value, unit);\n };\n\n return {\n locale: normalizedLocale,\n language,\n region,\n t,\n tp,\n formatNumber,\n formatCurrency,\n formatDate,\n formatRelativeTime,\n };\n }\n\n /**\n * Create context from a request\n */\n createContextFromRequest(request: Request): I18nContext {\n const parsed = extractLocaleFromRequest(request, this.config.defaultLocale);\n const bestMatch = findBestMatch([parsed], this.supportedLocales, this.config.defaultLocale);\n return this.createContext(bestMatch);\n }\n\n /**\n * Get language metadata\n */\n getLanguageInfo(locale: LocaleCode): {\n code: LanguageCode;\n direction: 'ltr' | 'rtl';\n locale: LocaleCode;\n region?: string;\n } {\n const language = getLanguageFromLocale(locale);\n const region = getRegionFromLocale(locale);\n const direction = getTextDirection(language);\n\n return {\n code: language,\n direction,\n locale,\n region,\n };\n }\n}\n\n/**\n * Singleton instance (optional, for simpler usage)\n */\nlet globalI18n: I18n | null = null;\n\n/**\n * Initialize global i18n instance\n */\nexport async function initializeI18n(config: I18nConfig): Promise<I18n> {\n globalI18n = new I18n(config);\n await globalI18n.initialize();\n return globalI18n;\n}\n\n/**\n * Get global i18n instance\n */\nexport function getI18n(): I18n | null {\n return globalI18n;\n}\n\n/**\n * Create a new i18n instance (for isolated use)\n */\nexport function createI18n(config: I18nConfig): I18n {\n return new I18n(config);\n}\n","/**\n * I18n Translation Helpers\n *\n * Provides utilities for getting translated messages from GraphQL/request context.\n * These helpers work with any context that has an optional `i18n` property.\n *\n * Falls back to the provided default message if i18n is not available or translation is missing.\n *\n * @example\n * ```typescript\n * import { t, createTranslator } from '@burdenoff/be-sdk';\n *\n * // Direct usage with context\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n * const message = t(ctx, 'tags.errors.keyExists', 'Tag {{key}} already exists', { key: 'my-tag' });\n *\n * // Create a bound translator for a specific context\n * const translate = createTranslator(ctx);\n * const message = translate('tags.errors.notFound', 'Tag not found');\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { I18nContext, TranslationVariables } from './types.js';\n\n/**\n * Context with optional i18n\n * Works with any object that has an optional i18n property\n */\nexport interface I18nCapableContext {\n i18n?: I18nContext;\n}\n\n/**\n * Interpolate variables in a string\n *\n * @param text - Text with {{variable}} placeholders\n * @param variables - Variables to interpolate\n * @returns Interpolated string\n */\nfunction interpolateVariables(text: string, variables?: TranslationVariables): string {\n if (!variables) return text;\n\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Get a translated message from context\n *\n * This is the primary function for getting translations in providers and resolvers.\n * It gracefully handles cases where i18n is not available by returning the default message.\n *\n * @param ctx - Context with optional i18n (GraphQL context, request context, etc.)\n * @param key - Translation key (e.g., 'tags.errors.notFound')\n * @param defaultMessage - Fallback message if translation not found\n * @param variables - Optional variables for interpolation\n * @returns Translated message or default message\n *\n * @example\n * ```typescript\n * // Simple usage\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n *\n * // With variables\n * const message = t(ctx, 'tags.errors.keyAlreadyExists', 'Tag with key {{key}} already exists', { key: 'my-tag' });\n *\n * // In a GraphQL resolver\n * if (!userId) {\n * throw new Error(t(context, 'common.errors.notAuthenticated', 'User not authenticated'));\n * }\n * ```\n */\nexport function t(\n ctx: I18nCapableContext,\n key: string,\n defaultMessage: string,\n variables?: TranslationVariables\n): string {\n // If i18n is not available, interpolate and return default message\n if (!ctx.i18n?.t) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n // Get translation with fallback to default\n const translated = ctx.i18n.t(key, variables, defaultMessage);\n\n // If translation returns the key (not found), use default message\n if (translated === key) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n return translated;\n}\n\n/**\n * Translator function type\n */\nexport type Translator = (key: string, defaultMessage: string, variables?: TranslationVariables) => string;\n\n/**\n * Create a bound translator function for a specific context\n *\n * This is useful when you need to pass a translator to services or\n * when you want to avoid repeating the context parameter.\n *\n * @param ctx - Context with optional i18n\n * @returns Translate function bound to the context\n *\n * @example\n * ```typescript\n * // Create translator\n * const translate = createTranslator(ctx);\n *\n * // Use it multiple times\n * const msg1 = translate('tags.errors.notFound', 'Tag not found');\n * const msg2 = translate('tags.errors.keyExists', 'Key {{key}} exists', { key: 'foo' });\n *\n * // Pass to a service\n * await someService.process(data, { translate });\n * ```\n */\nexport function createTranslator(ctx: I18nCapableContext): Translator {\n return (key: string, defaultMessage: string, variables?: TranslationVariables) => {\n return t(ctx, key, defaultMessage, variables);\n };\n}\n\n/**\n * Check if context has i18n support\n *\n * @param ctx - Context to check\n * @returns True if i18n is available and initialized\n */\nexport function hasI18n(ctx: I18nCapableContext): ctx is I18nCapableContext & { i18n: I18nContext } {\n return ctx.i18n?.t !== undefined;\n}\n\n/**\n * Get the current locale from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLocale - Default locale if i18n not available\n * @returns Current locale code\n */\nexport function getLocale(ctx: I18nCapableContext, defaultLocale: string = 'en-US'): string {\n return ctx.i18n?.locale ?? defaultLocale;\n}\n\n/**\n * Get the current language from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLanguage - Default language if i18n not available\n * @returns Current language code\n */\nexport function getLanguage(ctx: I18nCapableContext, defaultLanguage: string = 'en'): string {\n return ctx.i18n?.language ?? defaultLanguage;\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { DEFAULT_I18N_CONFIG, I18n, Locales, RTL_LANGUAGES, clearTranslationCache, createI18n, createTranslator, discoverLocales, extractLocaleFromRequest, findBestMatch, flattenDictionary, getCachedTranslations, getI18n, getLanguage, getLanguageFromLocale, getLocale, getRegionFromLocale, getTextDirection, hasI18n, initializeI18n, loadTranslationFile, loadTranslationsForLocale, normalizeLocale, parseAcceptLanguage, parseLocaleString, preloadAllTranslations, setCachedTranslations, t } from '../chunk-IYE2NTRX.js';
1
+ export { DEFAULT_I18N_CONFIG, I18n, Locales, RTL_LANGUAGES, clearTranslationCache, createI18n, createTranslator, discoverLocales, extractLocaleFromRequest, findBestMatch, flattenDictionary, getCachedTranslations, getI18n, getLanguage, getLanguageFromLocale, getLocale, getRegionFromLocale, getTextDirection, hasI18n, initializeI18n, loadTranslationFile, loadTranslationsForLocale, normalizeLocale, parseAcceptLanguage, parseLocaleString, preloadAllTranslations, setCachedTranslations, t } from '../chunk-ULFFX3YE.js';
2
2
  import '../chunk-CBZNP6RF.js';
3
3
  import '../chunk-XE4OXN2W.js';
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
- export { prisma_exports as Prisma } from './chunk-BRYRHBAC.js';
2
- import './chunk-GTEMQXCA.js';
3
1
  export { TemporalClient, TemporalClientFactory, TemporalModule, TemporalWorker, TemporalWorkerFactory, TemporalWorkerManager } from './chunk-5SD7DU3L.js';
4
- import { ActivityModule, UsageModule, TrackerModule } from './chunk-HNS7EHUX.js';
5
- export { ActivityModule, TrackerModule, UsageModule } from './chunk-HNS7EHUX.js';
2
+ import { ActivityModule, UsageModule, TrackerModule } from './chunk-PPIDJP2W.js';
3
+ export { ActivityModule, TrackerModule, UsageModule } from './chunk-PPIDJP2W.js';
4
+ import { RBACModule } from './chunk-BNJFEOGH.js';
5
+ export { RBACModule, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv } from './chunk-BNJFEOGH.js';
6
6
  export { instrumentation_exports as Instrumentation } from './chunk-ACYGOENW.js';
7
7
  import './chunk-REF7PANB.js';
8
8
  export { middleware_exports as Middleware } from './chunk-2HANKZZM.js';
9
9
  import { TenantNotificationsModule, NotificationsModule } from './chunk-RMDKB5O7.js';
10
10
  export { tenant_notifications_exports as Notifications, NotificationsModule } from './chunk-RMDKB5O7.js';
11
11
  export { observability_exports as Observability } from './chunk-5LXDPGDH.js';
12
- import { RBACModule } from './chunk-BNJFEOGH.js';
13
- export { RBACModule, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv } from './chunk-BNJFEOGH.js';
12
+ export { prisma_exports as Prisma } from './chunk-BRYRHBAC.js';
13
+ import './chunk-GTEMQXCA.js';
14
14
  export { export_exports as Export } from './chunk-SVONGBQR.js';
15
15
  export { feature_flags_exports as FeatureFlags } from './chunk-VWCN5PMD.js';
16
16
  import { GraphModule } from './chunk-TGTJ653K.js';
@@ -23,7 +23,7 @@ import { QueueType, EventQueueFactory } from './chunk-KGCISIBX.js';
23
23
  export { graphql_exports as GraphQL } from './chunk-X4NELQLV.js';
24
24
  import './chunk-QLVKMWFA.js';
25
25
  import './chunk-MHNA7IS7.js';
26
- export { i18n_exports as I18n, createTranslator, getLanguage, getLocale, hasI18n, t } from './chunk-IYE2NTRX.js';
26
+ export { i18n_exports as I18n, createTranslator, getLanguage, getLocale, hasI18n, t } from './chunk-ULFFX3YE.js';
27
27
  export { init_exports as Init } from './chunk-2BG75H2K.js';
28
28
  export { gateway_exports as Gateway } from './chunk-DMPS4Y53.js';
29
29
  import './chunk-LD7ETTWG.js';
@@ -1,6 +1,6 @@
1
1
  export { createWorkspaceGuardPlugin } from '../chunk-BTQREMD4.js';
2
2
  import { setWorkspaceContext } from '../chunk-GTEMQXCA.js';
3
- import { I18n } from '../chunk-IYE2NTRX.js';
3
+ import { I18n } from '../chunk-ULFFX3YE.js';
4
4
  import { logger } from '../chunk-CBZNP6RF.js';
5
5
  import { __name } from '../chunk-XE4OXN2W.js';
6
6
  import crypto from 'crypto';
@@ -1,6 +1,6 @@
1
- export { TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, createProductTracker, trackOperation, trackerStub } from '../chunk-HNS7EHUX.js';
2
- import '../chunk-RMDKB5O7.js';
1
+ export { TrackerModule, UNIFIED_TRACKER_CONSTANTS, UnifiedTrackerStub, UsageMetricType, createProductTracker, trackOperation, trackerStub } from '../chunk-PPIDJP2W.js';
3
2
  import '../chunk-BNJFEOGH.js';
3
+ import '../chunk-RMDKB5O7.js';
4
4
  import '../chunk-O6RHB2YP.js';
5
5
  import '../chunk-HP6JTFNR.js';
6
6
  import '../chunk-CBZNP6RF.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/be-sdk",
3
- "version": "2026.522.1",
3
+ "version": "2026.525.1",
4
4
  "description": "Backend SDK for Burdenoff products providing unified access to notifications, RBAC, activity tracking, usage monitoring, and more",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/i18n/index.ts","../src/i18n/types.ts","../src/i18n/parser.ts","../src/i18n/loader.ts","../src/i18n/i18n.ts","../src/i18n/helpers.ts"],"names":["RTL_LANGUAGES","getTextDirection","language","includes","parseLocaleString","localeStr","trimmed","trim","localePart","params","split","quality","param","key","value","toLowerCase","parsed","parseFloat","isNaN","locale","parts","region","toUpperCase","normalizedLocale","parseAcceptLanguage","header","locales","part","push","sort","a","b","extractLocaleFromRequest","request","defaultLocale","explicitLocale","headers","get","acceptLanguage","parsedLocales","length","normalizeLocale","getLanguageFromLocale","getRegionFromLocale","findBestMatch","requested","available","availableSet","Set","map","l","req","has","find","langMatch","translationCache","Map","validateFilePath","filePath","baseDir","resolvedBase","resolve","resolvedPath","relativePath","relative","startsWith","Error","safeReadFile","validatedPath","readFile","safeStat","stat","catch","safeReaddir","dirPath","readdir","flattenDictionary","obj","prefix","result","Object","entries","fullKey","assign","loadTranslationFile","content","data","JSON","parse","error","logger","getCacheKey","namespace","loadTranslationsForLocale","config","cacheKey","enableCache","pathsToTry","join","localesPath","path","stats","isFile","endsWith","translations","flattened","debug","isDirectory","files","file","extname","basename","keys","fallbackLocale","warn","fallbackTranslations","undefined","set","discoverLocales","validatedBasePath","entry","entryPath","preloadAllTranslations","supportedLocales","info","Promise","all","clearTranslationCache","delete","clear","getCachedTranslations","setCachedTranslations","getEnglishPluralCategory","absCount","getFrenchPluralCategory","getSlavicPluralCategory","mod10","mod100","getArabicPluralCategory","getPolishCzechPluralCategory","getRomanianPluralCategory","getHebrewPluralCategory","getPluralCategory","count","Math","abs","englishLanguages","interpolate","text","variables","replace","match","String","I18n","currentLocale","initialized","returnKeyOnMissing","logMissing","initialize","lazyLoad","getLocale","setLocale","getSupportedLocales","isSupported","normalized","some","supportedNorm","loadLocale","getTranslations","t","defaultValue","translate","tp","translatePlural","langTranslations","category","pluralKey","createContext","formatNumber","options","Intl","NumberFormat","format","formatCurrency","currency","style","formatDate","date","dateObj","Date","DateTimeFormat","formatRelativeTime","unit","RelativeTimeFormat","numeric","createContextFromRequest","bestMatch","getLanguageInfo","direction","code","globalI18n","initializeI18n","getI18n","createI18n","interpolateVariables","ctx","defaultMessage","i18n","translated","createTranslator","hasI18n","getLanguage","defaultLanguage","Locales","EN_US","EN_GB","EN_AU","EN_CA","EN_IN","ES_ES","ES_MX","FR_FR","FR_CA","DE_DE","DE_AT","DE_CH","IT_IT","PT_PT","PT_BR","RU_RU","ZH_CN","ZH_TW","ZH_HK","JA_JP","KO_KR","AR_SA","AR_AE","HI_IN","TA_IN","NL_NL","PL_PL","TR_TR","VI_VN","TH_TH","ID_ID","HE_IL","UK_UA","DEFAULT_I18N_CONFIG"],"mappings":"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","file":"chunk-IYE2NTRX.js","sourcesContent":["/**\n * I18n Module\n *\n * Comprehensive internationalization support for backend services.\n *\n * Features:\n * - Load translations from JSON files\n * - Accept-Language header parsing\n * - Translation with variable interpolation\n * - Pluralization support (CLDR rules)\n * - Locale-aware formatting (numbers, dates, currencies)\n * - Request context integration\n *\n * @example\n * ```typescript\n * import { I18n } from '@burdenoff/be-sdk/i18n';\n *\n * // Initialize\n * const i18n = new I18n({\n * defaultLocale: 'en-US',\n * localesPath: './locales',\n * });\n * await i18n.initialize();\n *\n * // Create context for a request\n * const ctx = i18n.createContextFromRequest(request);\n *\n * // Translate\n * const message = ctx.t('errors.notFound', { resource: 'Tag' });\n * // => \"Tag not found\"\n *\n * // Pluralize\n * const items = ctx.tp('items', 5, { count: 5 });\n * // => \"5 items\"\n * ```\n *\n * @packageDocumentation\n */\n\n// Core i18n class and functions\nexport { I18n, initializeI18n, getI18n, createI18n } from './i18n.js';\n\n// Context-based translation helpers (for use in resolvers/providers)\nexport {\n t,\n createTranslator,\n hasI18n,\n getLocale,\n getLanguage,\n type I18nCapableContext,\n type Translator,\n} from './helpers.js';\n\n// Types\nexport type {\n LocaleCode,\n LanguageCode,\n TranslationDictionary,\n FlatTranslationMap,\n TranslationVariables,\n PluralForms,\n TranslateFunction,\n PluralTranslateFunction,\n I18nConfig,\n ParsedLocale,\n I18nContext,\n II18n,\n TextDirection,\n LanguageInfo,\n} from './types.js';\n\n// Type helpers\nexport { RTL_LANGUAGES, getTextDirection } from './types.js';\n\n// Parser functions\nexport {\n parseLocaleString,\n parseAcceptLanguage,\n extractLocaleFromRequest,\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n} from './parser.js';\n\n// Loader functions\nexport {\n flattenDictionary,\n loadTranslationFile,\n loadTranslationsForLocale,\n discoverLocales,\n preloadAllTranslations,\n clearTranslationCache,\n getCachedTranslations,\n setCachedTranslations,\n} from './loader.js';\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\n/**\n * Common locale codes as constants\n */\nexport const Locales = {\n // English\n EN_US: 'en-US' as const,\n EN_GB: 'en-GB' as const,\n EN_AU: 'en-AU' as const,\n EN_CA: 'en-CA' as const,\n EN_IN: 'en-IN' as const,\n // Spanish\n ES_ES: 'es-ES' as const,\n ES_MX: 'es-MX' as const,\n // French\n FR_FR: 'fr-FR' as const,\n FR_CA: 'fr-CA' as const,\n // German\n DE_DE: 'de-DE' as const,\n DE_AT: 'de-AT' as const,\n DE_CH: 'de-CH' as const,\n // Italian\n IT_IT: 'it-IT' as const,\n // Portuguese\n PT_PT: 'pt-PT' as const,\n PT_BR: 'pt-BR' as const,\n // Russian\n RU_RU: 'ru-RU' as const,\n // Chinese\n ZH_CN: 'zh-CN' as const,\n ZH_TW: 'zh-TW' as const,\n ZH_HK: 'zh-HK' as const,\n // Japanese\n JA_JP: 'ja-JP' as const,\n // Korean\n KO_KR: 'ko-KR' as const,\n // Arabic\n AR_SA: 'ar-SA' as const,\n AR_AE: 'ar-AE' as const,\n // Hindi\n HI_IN: 'hi-IN' as const,\n // Tamil\n TA_IN: 'ta-IN' as const,\n // Dutch\n NL_NL: 'nl-NL' as const,\n // Polish\n PL_PL: 'pl-PL' as const,\n // Turkish\n TR_TR: 'tr-TR' as const,\n // Vietnamese\n VI_VN: 'vi-VN' as const,\n // Thai\n TH_TH: 'th-TH' as const,\n // Indonesian\n ID_ID: 'id-ID' as const,\n // Hebrew\n HE_IL: 'he-IL' as const,\n // Ukrainian\n UK_UA: 'uk-UA' as const,\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_I18N_CONFIG = {\n defaultLocale: 'en-US',\n fallbackLocale: 'en-US',\n enableCache: true,\n lazyLoad: false,\n logMissing: true,\n returnKeyOnMissing: true,\n} as const;\n","/**\n * I18n Module Types\n *\n * Type definitions for internationalization support\n */\n\n/**\n * Supported locale codes (BCP 47 format)\n * Language-Region pattern: xx-XX\n */\nexport type LocaleCode =\n // English variants\n | 'en-US'\n | 'en-GB'\n | 'en-AU'\n | 'en-CA'\n | 'en-IN'\n // Spanish variants\n | 'es-ES'\n | 'es-MX'\n | 'es-AR'\n // French variants\n | 'fr-FR'\n | 'fr-CA'\n | 'fr-BE'\n // German variants\n | 'de-DE'\n | 'de-AT'\n | 'de-CH'\n // Italian\n | 'it-IT'\n // Portuguese variants\n | 'pt-PT'\n | 'pt-BR'\n // Russian\n | 'ru-RU'\n // Chinese variants\n | 'zh-CN'\n | 'zh-TW'\n | 'zh-HK'\n // Japanese\n | 'ja-JP'\n // Korean\n | 'ko-KR'\n // Arabic variants\n | 'ar-SA'\n | 'ar-AE'\n | 'ar-EG'\n // Hindi\n | 'hi-IN'\n // Bengali\n | 'bn-IN'\n | 'bn-BD'\n // Tamil\n | 'ta-IN'\n // Telugu\n | 'te-IN'\n // Malayalam\n | 'ml-IN'\n // Dutch\n | 'nl-NL'\n | 'nl-BE'\n // Polish\n | 'pl-PL'\n // Turkish\n | 'tr-TR'\n // Vietnamese\n | 'vi-VN'\n // Thai\n | 'th-TH'\n // Indonesian\n | 'id-ID'\n // Malay\n | 'ms-MY'\n // Swedish\n | 'sv-SE'\n // Norwegian\n | 'nb-NO'\n // Danish\n | 'da-DK'\n // Finnish\n | 'fi-FI'\n // Greek\n | 'el-GR'\n // Czech\n | 'cs-CZ'\n // Romanian\n | 'ro-RO'\n // Hungarian\n | 'hu-HU'\n // Hebrew\n | 'he-IL'\n // Ukrainian\n | 'uk-UA'\n // Generic fallback (allow any valid BCP 47)\n | string;\n\n/**\n * Language code (ISO 639-1)\n */\nexport type LanguageCode =\n | 'en'\n | 'es'\n | 'fr'\n | 'de'\n | 'it'\n | 'pt'\n | 'ru'\n | 'zh'\n | 'ja'\n | 'ko'\n | 'ar'\n | 'hi'\n | 'bn'\n | 'ta'\n | 'te'\n | 'ml'\n | 'nl'\n | 'pl'\n | 'tr'\n | 'vi'\n | 'th'\n | 'id'\n | 'ms'\n | 'sv'\n | 'nb'\n | 'da'\n | 'fi'\n | 'el'\n | 'cs'\n | 'ro'\n | 'hu'\n | 'he'\n | 'uk'\n | string;\n\n/**\n * Translation dictionary type\n * Supports nested keys like { errors: { notFound: \"...\" } }\n * Includes null to match JSON data which may contain null values\n */\nexport type TranslationDictionary = {\n [key: string]: string | TranslationDictionary | null;\n};\n\n/**\n * Flattened translation map\n */\nexport type FlatTranslationMap = Record<string, string>;\n\n/**\n * Translation variables for interpolation\n */\nexport type TranslationVariables = Record<string, string | number | boolean>;\n\n/**\n * Pluralization rules\n */\nexport interface PluralForms {\n zero?: string;\n one: string;\n two?: string;\n few?: string;\n many?: string;\n other: string;\n}\n\n/**\n * Translation function type\n */\nexport type TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string) => string;\n\n/**\n * Plural translation function type\n */\nexport type PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables) => string;\n\n/**\n * I18n configuration options\n */\nexport interface I18nConfig {\n /** Default locale if none specified */\n defaultLocale: LocaleCode;\n /** Fallback locale when translation is missing */\n fallbackLocale?: LocaleCode;\n /** Path to locales directory */\n localesPath: string;\n /** Supported locales (if empty, all locales in directory are supported) */\n supportedLocales?: LocaleCode[];\n /** Whether to load translations lazily */\n lazyLoad?: boolean;\n /** Cache translations in memory */\n enableCache?: boolean;\n /** Namespace for this service (e.g., 'tags', 'auth') */\n namespace?: string;\n /** Log missing translations */\n logMissing?: boolean;\n /** Return key on missing translation instead of empty string */\n returnKeyOnMissing?: boolean;\n}\n\n/**\n * Parsed locale information\n */\nexport interface ParsedLocale {\n /** Full locale code (e.g., 'en-US') */\n locale: LocaleCode;\n /** Language code (e.g., 'en') */\n language: LanguageCode;\n /** Region code (e.g., 'US') */\n region?: string;\n /** Quality factor from Accept-Language header (0-1) */\n quality: number;\n}\n\n/**\n * I18n context for requests\n */\nexport interface I18nContext {\n /** Current locale */\n locale: LocaleCode;\n /** Language code */\n language: LanguageCode;\n /** Region code */\n region?: string;\n /** Geography: ISO 3166-1 alpha-2 country code (e.g., 'IN', 'US', 'DE') — from x-geo-country header */\n country?: string;\n /** Geography: ISO 4217 currency code (e.g., 'INR', 'USD', 'EUR') — from x-geo-currency header */\n currency?: string;\n /** Geography: IANA timezone (e.g., 'Asia/Kolkata', 'America/New_York') — from x-geo-timezone header */\n timezone?: string;\n /** Translation function */\n t: TranslateFunction;\n /** Plural translation function */\n tp: PluralTranslateFunction;\n /** Format number for locale */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format currency for locale */\n formatCurrency: (value: number, currency: string) => string;\n /** Format date for locale */\n formatDate: (date: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Format relative time for locale */\n formatRelativeTime: (value: number, unit: Intl.RelativeTimeFormatUnit) => string;\n}\n\n/**\n * I18n instance interface\n */\nexport interface II18n {\n /** Get current locale */\n getLocale(): LocaleCode;\n /** Set current locale */\n setLocale(locale: LocaleCode): void;\n /** Get supported locales */\n getSupportedLocales(): LocaleCode[];\n /** Check if locale is supported */\n isSupported(locale: LocaleCode): boolean;\n /** Translate a key */\n t: TranslateFunction;\n /** Translate with pluralization */\n tp: PluralTranslateFunction;\n /** Create context for request */\n createContext(locale: LocaleCode): I18nContext;\n /** Load translations for a locale */\n loadLocale(locale: LocaleCode): Promise<void>;\n /** Get all translations for a locale */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined;\n}\n\n/**\n * Language direction\n */\nexport type TextDirection = 'ltr' | 'rtl';\n\n/**\n * Language metadata\n */\nexport interface LanguageInfo {\n code: LanguageCode;\n name: string;\n nativeName: string;\n direction: TextDirection;\n locales: LocaleCode[];\n}\n\n/**\n * RTL languages\n */\nexport const RTL_LANGUAGES: LanguageCode[] = ['ar', 'he'];\n\n/**\n * Get text direction for a language\n */\nexport function getTextDirection(language: LanguageCode): TextDirection {\n return RTL_LANGUAGES.includes(language) ? 'rtl' : 'ltr';\n}\n","/**\n * I18n Parser Module\n *\n * Parses Accept-Language headers and locale strings\n */\n\nimport type { LocaleCode, LanguageCode, ParsedLocale } from './types.js';\n\n/**\n * Parse a single locale string (e.g., 'en-US', 'fr;q=0.9')\n */\nexport function parseLocaleString(localeStr: string): ParsedLocale | null {\n const trimmed = localeStr.trim();\n if (!trimmed || trimmed === '*') {\n return null;\n }\n\n // Parse quality factor if present (e.g., 'en-US;q=0.9')\n const [localePart, ...params] = trimmed.split(';');\n let quality = 1.0;\n\n for (const param of params) {\n const [key, value] = param.trim().split('=');\n if (key?.toLowerCase() === 'q' && value) {\n const parsed = parseFloat(value);\n if (!isNaN(parsed) && parsed >= 0 && parsed <= 1) {\n quality = parsed;\n }\n }\n }\n\n const locale = localePart?.trim();\n if (!locale) {\n return null;\n }\n\n // Parse language and region\n const parts = locale.split('-');\n const language = parts[0]?.toLowerCase() as LanguageCode;\n const region = parts[1]?.toUpperCase();\n\n // Reconstruct proper locale code\n const normalizedLocale = region ? `${language}-${region}` : language;\n\n return {\n locale: normalizedLocale,\n language,\n region,\n quality,\n };\n}\n\n/**\n * Parse Accept-Language header\n *\n * Example: 'en-US,en;q=0.9,fr;q=0.8,de;q=0.7'\n *\n * @param header The Accept-Language header value\n * @returns Array of parsed locales sorted by quality (highest first)\n */\nexport function parseAcceptLanguage(header: string | null | undefined): ParsedLocale[] {\n if (!header || header.trim() === '') {\n return [];\n }\n\n const locales: ParsedLocale[] = [];\n\n // Split by comma and parse each part\n const parts = header.split(',');\n for (const part of parts) {\n const parsed = parseLocaleString(part);\n if (parsed) {\n locales.push(parsed);\n }\n }\n\n // Sort by quality factor (highest first)\n locales.sort((a, b) => b.quality - a.quality);\n\n return locales;\n}\n\n/**\n * Extract locale from request headers\n *\n * Checks in order:\n * 1. X-Locale header (explicit override)\n * 2. X-Language header (explicit override)\n * 3. Accept-Language header\n *\n * @param request Web API Request object\n * @param defaultLocale Default locale to return if none found\n * @returns The best matching locale\n */\nexport function extractLocaleFromRequest(request: Request, defaultLocale: LocaleCode = 'en-US'): ParsedLocale {\n // Check explicit locale header first\n const explicitLocale = request.headers.get('x-locale') || request.headers.get('x-language');\n if (explicitLocale) {\n const parsed = parseLocaleString(explicitLocale);\n if (parsed) {\n return parsed;\n }\n }\n\n // Parse Accept-Language header\n const acceptLanguage = request.headers.get('accept-language');\n const parsedLocales = parseAcceptLanguage(acceptLanguage);\n\n if (parsedLocales.length > 0) {\n return parsedLocales[0]!;\n }\n\n // Return default locale\n const [language, region] = defaultLocale.split('-');\n return {\n locale: defaultLocale,\n language: language as LanguageCode,\n region: region,\n quality: 1.0,\n };\n}\n\n/**\n * Normalize a locale code to standard format\n *\n * @param locale The locale to normalize\n * @returns Normalized locale (e.g., 'en-us' -> 'en-US')\n */\nexport function normalizeLocale(locale: string): LocaleCode {\n const parts = locale.trim().split(/[-_]/);\n const language = parts[0]?.toLowerCase();\n const region = parts[1]?.toUpperCase();\n\n if (region) {\n return `${language}-${region}`;\n }\n return language as LocaleCode;\n}\n\n/**\n * Get the language code from a locale\n */\nexport function getLanguageFromLocale(locale: LocaleCode): LanguageCode {\n return locale.split('-')[0] as LanguageCode;\n}\n\n/**\n * Get the region code from a locale\n */\nexport function getRegionFromLocale(locale: LocaleCode): string | undefined {\n const parts = locale.split('-');\n return parts[1];\n}\n\n/**\n * Find the best matching locale from available locales\n *\n * @param requested Requested locales (sorted by preference)\n * @param available Available locales\n * @param defaultLocale Default locale to use if no match\n * @returns The best matching locale\n */\nexport function findBestMatch(\n requested: ParsedLocale[],\n available: LocaleCode[],\n defaultLocale: LocaleCode\n): LocaleCode {\n const availableSet = new Set(available.map((l) => l.toLowerCase()));\n\n for (const req of requested) {\n // Try exact match first (e.g., 'en-US')\n if (availableSet.has(req.locale.toLowerCase())) {\n // Return with proper casing from available\n return available.find((l) => l.toLowerCase() === req.locale.toLowerCase()) || req.locale;\n }\n\n // Try language-only match (e.g., 'en')\n if (availableSet.has(req.language.toLowerCase())) {\n return available.find((l) => l.toLowerCase() === req.language.toLowerCase()) || req.language;\n }\n\n // Try to find any locale with the same language\n const langMatch = available.find((l) => getLanguageFromLocale(l).toLowerCase() === req.language.toLowerCase());\n if (langMatch) {\n return langMatch;\n }\n }\n\n return defaultLocale;\n}\n","/**\n * I18n Loader Module\n *\n * Loads and manages translation files from the filesystem\n */\n\nimport { readFile, readdir, stat } from 'fs/promises';\nimport { join, extname, basename, resolve, relative } from 'path';\nimport type { LocaleCode, TranslationDictionary, FlatTranslationMap, I18nConfig } from './types.js';\nimport { normalizeLocale, getLanguageFromLocale } from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Translation cache\n */\nconst translationCache = new Map<string, FlatTranslationMap>();\n\n/**\n * Validate that a file path is within the allowed base directory\n * Prevents directory traversal attacks\n *\n * @param filePath The file path to validate\n * @param baseDir The base directory that must contain the file\n * @returns The resolved absolute path if valid\n * @throws Error if path escapes the base directory\n */\nfunction validateFilePath(filePath: string, baseDir: string): string {\n const resolvedBase = resolve(baseDir);\n const resolvedPath = resolve(filePath);\n const relativePath = relative(resolvedBase, resolvedPath);\n\n // If relative path starts with '..' or is absolute, it's outside base directory\n if (relativePath.startsWith('..') || resolve(relativePath) === relativePath) {\n throw new Error(`Invalid file path: ${filePath} is outside base directory ${baseDir}`);\n }\n\n return resolvedPath;\n}\n\n/**\n * Safely read a file with path validation\n * Path is validated before reading to prevent directory traversal attacks\n */\nasync function safeReadFile(filePath: string, baseDir: string): Promise<string> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return readFile(validatedPath, 'utf-8');\n}\n\n/**\n * Safely stat a file with path validation\n * Path is validated before stat to prevent directory traversal attacks\n */\nasync function safeStat(filePath: string, baseDir: string): Promise<Awaited<ReturnType<typeof stat>> | null> {\n const validatedPath = validateFilePath(filePath, baseDir);\n return stat(validatedPath).catch(() => null);\n}\n\n/**\n * Safely read directory with path validation\n * Path is validated before readdir to prevent directory traversal attacks\n */\nasync function safeReaddir(dirPath: string, baseDir: string): Promise<string[]> {\n const validatedPath = validateFilePath(dirPath, baseDir);\n return readdir(validatedPath);\n}\n\n/**\n * Flatten a nested translation dictionary\n *\n * @param obj The nested dictionary\n * @param prefix Current key prefix\n * @returns Flattened key-value map\n */\nexport function flattenDictionary(obj: TranslationDictionary, prefix = ''): FlatTranslationMap {\n const result: FlatTranslationMap = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === 'string') {\n result[fullKey] = value;\n } else if (value !== null && typeof value === 'object') {\n // Check null first to avoid different-types-comparison warning\n // (typeof null === 'object' is a JavaScript quirk)\n Object.assign(result, flattenDictionary(value, fullKey));\n }\n }\n\n return result;\n}\n\n/**\n * Load a single translation file\n *\n * @param filePath Path to the translation file\n * @param baseDir Base directory for validation\n * @returns The loaded translations\n */\nexport async function loadTranslationFile(filePath: string, baseDir: string): Promise<TranslationDictionary> {\n try {\n const content = await safeReadFile(filePath, baseDir);\n const data = JSON.parse(content) as TranslationDictionary;\n return data;\n } catch (error) {\n logger.error(`[I18n] Failed to load translation file: ${filePath}`, error);\n return {};\n }\n}\n\n/**\n * Get cache key for translations\n */\nfunction getCacheKey(namespace: string | undefined, locale: LocaleCode): string {\n return namespace ? `${namespace}:${locale}` : locale;\n}\n\n/**\n * Load translations for a locale from a directory\n *\n * Supports multiple file formats:\n * - locales/en-US.json (single file per locale)\n * - locales/en-US/common.json (directory per locale with namespace files)\n * - locales/en.json (language-only fallback)\n *\n * @param config I18n configuration\n * @param locale The locale to load\n * @returns Flattened translations map\n */\nexport async function loadTranslationsForLocale(config: I18nConfig, locale: LocaleCode): Promise<FlatTranslationMap> {\n const cacheKey = getCacheKey(config.namespace, locale);\n\n // Check cache first\n if (config.enableCache !== false && translationCache.has(cacheKey)) {\n return translationCache.get(cacheKey)!;\n }\n\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const result: FlatTranslationMap = {};\n\n // Try loading in order of specificity\n const pathsToTry = [\n // Most specific: full locale\n join(config.localesPath, `${normalizedLocale}.json`),\n // Directory format\n join(config.localesPath, normalizedLocale),\n // Language only fallback\n join(config.localesPath, `${language}.json`),\n // Language directory\n join(config.localesPath, language),\n ];\n\n for (const path of pathsToTry) {\n try {\n const stats = await safeStat(path, config.localesPath);\n if (!stats) continue;\n\n if (stats.isFile() && path.endsWith('.json')) {\n // Single file\n const translations = await loadTranslationFile(path, config.localesPath);\n const flattened = flattenDictionary(translations);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded translations from ${path}`);\n break;\n } else if (stats.isDirectory()) {\n // Directory with multiple namespace files\n const files = await safeReaddir(path, config.localesPath);\n for (const file of files) {\n if (extname(file) === '.json') {\n const namespace = basename(file, '.json');\n const filePath = join(path, file);\n const translations = await loadTranslationFile(filePath, config.localesPath);\n const flattened = flattenDictionary(translations, namespace);\n Object.assign(result, flattened);\n logger.debug(`[I18n] Loaded namespace ${namespace} from ${filePath}`);\n }\n }\n break;\n }\n } catch {\n // Continue trying next path\n }\n }\n\n // If nothing loaded and we have a fallback, try that\n if (Object.keys(result).length === 0 && config.fallbackLocale && config.fallbackLocale !== locale) {\n logger.warn(`[I18n] No translations found for ${locale}, trying fallback ${config.fallbackLocale}`);\n const fallbackTranslations = await loadTranslationsForLocale(\n { ...config, fallbackLocale: undefined },\n config.fallbackLocale\n );\n Object.assign(result, fallbackTranslations);\n }\n\n // Cache the result\n if (config.enableCache !== false) {\n translationCache.set(cacheKey, result);\n }\n\n return result;\n}\n\n/**\n * Discover available locales in a directory\n *\n * @param localesPath Path to locales directory\n * @returns Array of available locale codes\n */\nexport async function discoverLocales(localesPath: string): Promise<LocaleCode[]> {\n const locales: LocaleCode[] = [];\n\n try {\n const validatedBasePath = resolve(localesPath);\n const entries = await readdir(validatedBasePath);\n\n for (const entry of entries) {\n const entryPath = join(validatedBasePath, entry);\n const stats = await safeStat(entryPath, validatedBasePath);\n if (!stats) continue;\n\n if (stats.isFile() && entry.endsWith('.json')) {\n // Single file: en-US.json or en.json\n const locale = basename(entry, '.json');\n locales.push(normalizeLocale(locale));\n } else if (stats.isDirectory()) {\n // Directory: en-US/ or en/\n locales.push(normalizeLocale(entry));\n }\n }\n } catch (error) {\n logger.error(`[I18n] Failed to discover locales in ${localesPath}`, error);\n }\n\n return locales;\n}\n\n/**\n * Preload all translations for supported locales\n *\n * @param config I18n configuration\n */\nexport async function preloadAllTranslations(config: I18nConfig): Promise<void> {\n const locales = config.supportedLocales || (await discoverLocales(config.localesPath));\n\n logger.info(`[I18n] Preloading translations for ${locales.length} locales...`);\n\n await Promise.all(\n locales.map(async (locale) => {\n try {\n await loadTranslationsForLocale(config, locale);\n } catch (error) {\n logger.error(`[I18n] Failed to preload locale ${locale}`, error);\n }\n })\n );\n\n logger.info(`[I18n] Preloaded translations for: ${locales.join(', ')}`);\n}\n\n/**\n * Clear the translation cache\n *\n * @param namespace Optional namespace to clear (clears all if not provided)\n */\nexport function clearTranslationCache(namespace?: string): void {\n if (namespace) {\n for (const key of translationCache.keys()) {\n if (key.startsWith(`${namespace}:`)) {\n translationCache.delete(key);\n }\n }\n } else {\n translationCache.clear();\n }\n}\n\n/**\n * Get cached translations for a locale\n */\nexport function getCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode\n): FlatTranslationMap | undefined {\n return translationCache.get(getCacheKey(namespace, locale));\n}\n\n/**\n * Set translations in cache (useful for testing or dynamic loading)\n */\nexport function setCachedTranslations(\n namespace: string | undefined,\n locale: LocaleCode,\n translations: FlatTranslationMap\n): void {\n translationCache.set(getCacheKey(namespace, locale), translations);\n}\n","/**\n * I18n Class\n *\n * Main internationalization class providing translation and formatting functions\n */\n\nimport type {\n LocaleCode,\n LanguageCode,\n I18nConfig,\n I18nContext,\n II18n,\n FlatTranslationMap,\n TranslationVariables,\n TranslateFunction,\n PluralTranslateFunction,\n} from './types.js';\nimport { getTextDirection } from './types.js';\nimport { loadTranslationsForLocale, preloadAllTranslations, discoverLocales, getCachedTranslations } from './loader.js';\nimport {\n normalizeLocale,\n getLanguageFromLocale,\n getRegionFromLocale,\n findBestMatch,\n extractLocaleFromRequest,\n} from './parser.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Pluralization category based on CLDR rules\n */\ntype PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';\n\n/**\n * English and most Germanic/Romance languages (simple one/other)\n */\nfunction getEnglishPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * French pluralization (0 or 1 = one, else other)\n */\nfunction getFrenchPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0 || absCount === 1) return 'one';\n return 'other';\n}\n\n/**\n * Slavic languages (Russian, Ukrainian) - complex: one, few, many, other\n */\nfunction getSlavicPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (mod10 === 1 && mod100 !== 11) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n if (mod10 === 0 || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 11 && mod100 <= 14)) return 'many';\n return 'other';\n}\n\n/**\n * Arabic pluralization (zero, one, two, few, many, other)\n */\nfunction getArabicPluralCategory(absCount: number): PluralCategory {\n if (absCount === 0) return 'zero';\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n const mod100 = absCount % 100;\n if (mod100 >= 3 && mod100 <= 10) return 'few';\n if (mod100 >= 11 && mod100 <= 99) return 'many';\n return 'other';\n}\n\n/**\n * Polish/Czech pluralization (one, few, many)\n */\nfunction getPolishCzechPluralCategory(absCount: number): PluralCategory {\n const mod10 = absCount % 10;\n const mod100 = absCount % 100;\n\n if (absCount === 1) return 'one';\n if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';\n return 'many';\n}\n\n/**\n * Romanian pluralization (one, few, other)\n */\nfunction getRomanianPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n const mod100 = absCount % 100;\n if (absCount === 0 || (mod100 >= 1 && mod100 <= 19)) return 'few';\n return 'other';\n}\n\n/**\n * Hebrew pluralization (one, two, other)\n */\nfunction getHebrewPluralCategory(absCount: number): PluralCategory {\n if (absCount === 1) return 'one';\n if (absCount === 2) return 'two';\n return 'other';\n}\n\n/**\n * Get plural category for a count in a given language\n * Based on CLDR plural rules: https://cldr.unicode.org/index/cldr-spec/plural-rules\n */\nfunction getPluralCategory(language: LanguageCode, count: number): PluralCategory {\n const absCount = Math.abs(count);\n\n // English and most Germanic/Romance languages\n const englishLanguages = [\n 'en',\n 'de',\n 'es',\n 'it',\n 'nl',\n 'sv',\n 'da',\n 'nb',\n 'fi',\n 'pt',\n 'el',\n 'hu',\n 'tr',\n 'id',\n 'ms',\n 'th',\n 'vi',\n 'ko',\n 'zh',\n 'ja',\n ];\n if (englishLanguages.includes(language)) {\n return getEnglishPluralCategory(absCount);\n }\n\n // French\n if (language === 'fr') {\n return getFrenchPluralCategory(absCount);\n }\n\n // Russian, Ukrainian\n if (language === 'ru' || language === 'uk') {\n return getSlavicPluralCategory(absCount);\n }\n\n // Arabic\n if (language === 'ar') {\n return getArabicPluralCategory(absCount);\n }\n\n // Polish, Czech\n if (language === 'pl' || language === 'cs') {\n return getPolishCzechPluralCategory(absCount);\n }\n\n // Romanian\n if (language === 'ro') {\n return getRomanianPluralCategory(absCount);\n }\n\n // Hebrew\n if (language === 'he') {\n return getHebrewPluralCategory(absCount);\n }\n\n // Default: simple singular/plural\n return getEnglishPluralCategory(absCount);\n}\n\n/**\n * Interpolate variables in a translation string\n *\n * Supports:\n * - {{variable}} - simple interpolation\n * - {{variable, number}} - number formatting (future)\n * - {{variable, date}} - date formatting (future)\n */\nfunction interpolate(text: string, variables?: TranslationVariables): string {\n if (!variables || !text) {\n return text;\n }\n\n // Use more specific pattern to avoid catastrophic backtracking\n // Matches {{ variableName }} with word characters (alphanumeric and underscore)\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key: string) => {\n const value = variables[key.trim()];\n if (value !== undefined) {\n return String(value);\n }\n return match; // Keep original if variable not found\n });\n}\n\n/**\n * I18n Class\n *\n * Main class for internationalization functionality\n */\nexport class I18n implements II18n {\n private config: I18nConfig;\n private currentLocale: LocaleCode;\n private supportedLocales: LocaleCode[] = [];\n private initialized = false;\n\n constructor(config: I18nConfig) {\n this.config = {\n ...config,\n fallbackLocale: config.fallbackLocale || 'en-US',\n enableCache: config.enableCache !== false,\n returnKeyOnMissing: config.returnKeyOnMissing !== false,\n logMissing: config.logMissing !== false,\n };\n this.currentLocale = normalizeLocale(config.defaultLocale);\n }\n\n /**\n * Initialize the i18n instance\n * Discovers available locales and optionally preloads translations\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Discover available locales\n if (this.config.supportedLocales && this.config.supportedLocales.length > 0) {\n this.supportedLocales = this.config.supportedLocales;\n } else {\n this.supportedLocales = await discoverLocales(this.config.localesPath);\n }\n\n // Preload translations if not lazy loading\n if (!this.config.lazyLoad) {\n await preloadAllTranslations(this.config);\n }\n\n this.initialized = true;\n logger.info(`[I18n] Initialized with ${this.supportedLocales.length} locales, default: ${this.currentLocale}`);\n }\n\n /**\n * Get current locale\n */\n getLocale(): LocaleCode {\n return this.currentLocale;\n }\n\n /**\n * Set current locale\n */\n setLocale(locale: LocaleCode): void {\n this.currentLocale = normalizeLocale(locale);\n }\n\n /**\n * Get supported locales\n */\n getSupportedLocales(): LocaleCode[] {\n return [...this.supportedLocales];\n }\n\n /**\n * Check if a locale is supported\n */\n isSupported(locale: LocaleCode): boolean {\n const normalized = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalized);\n\n return this.supportedLocales.some((l) => {\n const supportedNorm = normalizeLocale(l);\n // Exact match or language match\n return supportedNorm === normalized || getLanguageFromLocale(supportedNorm) === language;\n });\n }\n\n /**\n * Load translations for a specific locale\n */\n async loadLocale(locale: LocaleCode): Promise<void> {\n await loadTranslationsForLocale(this.config, locale);\n }\n\n /**\n * Get all translations for a locale\n */\n getTranslations(locale: LocaleCode): FlatTranslationMap | undefined {\n return getCachedTranslations(this.config.namespace, locale);\n }\n\n /**\n * Translate a key\n */\n t: TranslateFunction = (key: string, variables?: TranslationVariables, defaultValue?: string): string => {\n return this.translate(this.currentLocale, key, variables, defaultValue);\n };\n\n /**\n * Translate with pluralization\n */\n tp: PluralTranslateFunction = (key: string, count: number, variables?: TranslationVariables): string => {\n return this.translatePlural(this.currentLocale, key, count, variables);\n };\n\n /**\n * Internal translate method\n */\n private translate(locale: LocaleCode, key: string, variables?: TranslationVariables, defaultValue?: string): string {\n const translations = getCachedTranslations(this.config.namespace, locale);\n let text = translations?.[key];\n\n // Try fallback locale if not found\n if (!text && this.config.fallbackLocale && locale !== this.config.fallbackLocale) {\n const fallbackTranslations = getCachedTranslations(this.config.namespace, this.config.fallbackLocale);\n text = fallbackTranslations?.[key];\n }\n\n // Try language-only fallback\n if (!text) {\n const language = getLanguageFromLocale(locale);\n if (language !== locale) {\n const langTranslations = getCachedTranslations(this.config.namespace, language);\n text = langTranslations?.[key];\n }\n }\n\n if (!text) {\n if (this.config.logMissing) {\n logger.warn(`[I18n] Missing translation for key: ${key} in locale: ${locale}`);\n }\n // Return default value, key, or empty string\n return defaultValue ?? (this.config.returnKeyOnMissing ? key : '');\n }\n\n return interpolate(text, variables);\n }\n\n /**\n * Internal translate with pluralization\n */\n private translatePlural(locale: LocaleCode, key: string, count: number, variables?: TranslationVariables): string {\n const language = getLanguageFromLocale(locale);\n const category = getPluralCategory(language, count);\n\n // Try plural-specific key first (e.g., 'items.one', 'items.other')\n const pluralKey = `${key}.${category}`;\n let text = this.translate(locale, pluralKey, undefined, '');\n\n // Fallback to 'other' if specific form not found\n if (!text && category !== 'other') {\n text = this.translate(locale, `${key}.other`, undefined, '');\n }\n\n // Final fallback to base key\n if (!text) {\n text = this.translate(locale, key, undefined, key);\n }\n\n return interpolate(text, { ...variables, count });\n }\n\n /**\n * Create an i18n context for a specific locale\n */\n createContext(locale: LocaleCode): I18nContext {\n const normalizedLocale = normalizeLocale(locale);\n const language = getLanguageFromLocale(normalizedLocale);\n const region = getRegionFromLocale(normalizedLocale);\n\n // Create bound translate functions for this locale\n const t: TranslateFunction = (key, variables, defaultValue) => {\n return this.translate(normalizedLocale, key, variables, defaultValue);\n };\n\n const tp: PluralTranslateFunction = (key, count, variables) => {\n return this.translatePlural(normalizedLocale, key, count, variables);\n };\n\n const formatNumber = (value: number, options?: Intl.NumberFormatOptions): string => {\n return new Intl.NumberFormat(normalizedLocale, options).format(value);\n };\n\n const formatCurrency = (value: number, currency: string): string => {\n return new Intl.NumberFormat(normalizedLocale, {\n style: 'currency',\n currency,\n }).format(value);\n };\n\n const formatDate = (date: Date | string, options?: Intl.DateTimeFormatOptions): string => {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat(normalizedLocale, options).format(dateObj);\n };\n\n const formatRelativeTime = (value: number, unit: Intl.RelativeTimeFormatUnit): string => {\n return new Intl.RelativeTimeFormat(normalizedLocale, { numeric: 'auto' }).format(value, unit);\n };\n\n return {\n locale: normalizedLocale,\n language,\n region,\n t,\n tp,\n formatNumber,\n formatCurrency,\n formatDate,\n formatRelativeTime,\n };\n }\n\n /**\n * Create context from a request\n */\n createContextFromRequest(request: Request): I18nContext {\n const parsed = extractLocaleFromRequest(request, this.config.defaultLocale);\n const bestMatch = findBestMatch([parsed], this.supportedLocales, this.config.defaultLocale);\n return this.createContext(bestMatch);\n }\n\n /**\n * Get language metadata\n */\n getLanguageInfo(locale: LocaleCode): {\n code: LanguageCode;\n direction: 'ltr' | 'rtl';\n locale: LocaleCode;\n region?: string;\n } {\n const language = getLanguageFromLocale(locale);\n const region = getRegionFromLocale(locale);\n const direction = getTextDirection(language);\n\n return {\n code: language,\n direction,\n locale,\n region,\n };\n }\n}\n\n/**\n * Singleton instance (optional, for simpler usage)\n */\nlet globalI18n: I18n | null = null;\n\n/**\n * Initialize global i18n instance\n */\nexport async function initializeI18n(config: I18nConfig): Promise<I18n> {\n globalI18n = new I18n(config);\n await globalI18n.initialize();\n return globalI18n;\n}\n\n/**\n * Get global i18n instance\n */\nexport function getI18n(): I18n | null {\n return globalI18n;\n}\n\n/**\n * Create a new i18n instance (for isolated use)\n */\nexport function createI18n(config: I18nConfig): I18n {\n return new I18n(config);\n}\n","/**\n * I18n Translation Helpers\n *\n * Provides utilities for getting translated messages from GraphQL/request context.\n * These helpers work with any context that has an optional `i18n` property.\n *\n * Falls back to the provided default message if i18n is not available or translation is missing.\n *\n * @example\n * ```typescript\n * import { t, createTranslator } from '@burdenoff/be-sdk';\n *\n * // Direct usage with context\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n * const message = t(ctx, 'tags.errors.keyExists', 'Tag {{key}} already exists', { key: 'my-tag' });\n *\n * // Create a bound translator for a specific context\n * const translate = createTranslator(ctx);\n * const message = translate('tags.errors.notFound', 'Tag not found');\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { I18nContext, TranslationVariables } from './types.js';\n\n/**\n * Context with optional i18n\n * Works with any object that has an optional i18n property\n */\nexport interface I18nCapableContext {\n i18n?: I18nContext;\n}\n\n/**\n * Interpolate variables in a string\n *\n * @param text - Text with {{variable}} placeholders\n * @param variables - Variables to interpolate\n * @returns Interpolated string\n */\nfunction interpolateVariables(text: string, variables?: TranslationVariables): string {\n if (!variables) return text;\n\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Get a translated message from context\n *\n * This is the primary function for getting translations in providers and resolvers.\n * It gracefully handles cases where i18n is not available by returning the default message.\n *\n * @param ctx - Context with optional i18n (GraphQL context, request context, etc.)\n * @param key - Translation key (e.g., 'tags.errors.notFound')\n * @param defaultMessage - Fallback message if translation not found\n * @param variables - Optional variables for interpolation\n * @returns Translated message or default message\n *\n * @example\n * ```typescript\n * // Simple usage\n * const message = t(ctx, 'tags.errors.notFound', 'Tag not found');\n *\n * // With variables\n * const message = t(ctx, 'tags.errors.keyAlreadyExists', 'Tag with key {{key}} already exists', { key: 'my-tag' });\n *\n * // In a GraphQL resolver\n * if (!userId) {\n * throw new Error(t(context, 'common.errors.notAuthenticated', 'User not authenticated'));\n * }\n * ```\n */\nexport function t(\n ctx: I18nCapableContext,\n key: string,\n defaultMessage: string,\n variables?: TranslationVariables\n): string {\n // If i18n is not available, interpolate and return default message\n if (!ctx.i18n?.t) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n // Get translation with fallback to default\n const translated = ctx.i18n.t(key, variables, defaultMessage);\n\n // If translation returns the key (not found), use default message\n if (translated === key) {\n return interpolateVariables(defaultMessage, variables);\n }\n\n return translated;\n}\n\n/**\n * Translator function type\n */\nexport type Translator = (key: string, defaultMessage: string, variables?: TranslationVariables) => string;\n\n/**\n * Create a bound translator function for a specific context\n *\n * This is useful when you need to pass a translator to services or\n * when you want to avoid repeating the context parameter.\n *\n * @param ctx - Context with optional i18n\n * @returns Translate function bound to the context\n *\n * @example\n * ```typescript\n * // Create translator\n * const translate = createTranslator(ctx);\n *\n * // Use it multiple times\n * const msg1 = translate('tags.errors.notFound', 'Tag not found');\n * const msg2 = translate('tags.errors.keyExists', 'Key {{key}} exists', { key: 'foo' });\n *\n * // Pass to a service\n * await someService.process(data, { translate });\n * ```\n */\nexport function createTranslator(ctx: I18nCapableContext): Translator {\n return (key: string, defaultMessage: string, variables?: TranslationVariables) => {\n return t(ctx, key, defaultMessage, variables);\n };\n}\n\n/**\n * Check if context has i18n support\n *\n * @param ctx - Context to check\n * @returns True if i18n is available and initialized\n */\nexport function hasI18n(ctx: I18nCapableContext): ctx is I18nCapableContext & { i18n: I18nContext } {\n return ctx.i18n?.t !== undefined;\n}\n\n/**\n * Get the current locale from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLocale - Default locale if i18n not available\n * @returns Current locale code\n */\nexport function getLocale(ctx: I18nCapableContext, defaultLocale: string = 'en-US'): string {\n return ctx.i18n?.locale ?? defaultLocale;\n}\n\n/**\n * Get the current language from context\n *\n * @param ctx - Context with optional i18n\n * @param defaultLanguage - Default language if i18n not available\n * @returns Current language code\n */\nexport function getLanguage(ctx: I18nCapableContext, defaultLanguage: string = 'en'): string {\n return ctx.i18n?.language ?? defaultLanguage;\n}\n"]}