@burdenoff/be-sdk 2026.716.2 → 2026.717.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EventQueueFactory-ELT7NDXK.js +7 -0
- package/dist/{EventQueueFactory-BDOT45WD.js.map → EventQueueFactory-ELT7NDXK.js.map} +1 -1
- package/dist/auth/index.d.ts +2 -2
- package/dist/cache/index.d.ts +2 -1
- package/dist/cache/index.js +2 -1
- package/dist/{chunk-M5JYRRI6.js → chunk-BWKRHVRX.js} +4 -4
- package/dist/{chunk-M5JYRRI6.js.map → chunk-BWKRHVRX.js.map} +1 -1
- package/dist/{chunk-IMMJMVP7.js → chunk-EQHHYSOE.js} +17 -4
- package/dist/chunk-EQHHYSOE.js.map +1 -0
- package/dist/{chunk-X5FPXATC.js → chunk-JAZ473V3.js} +3 -3
- package/dist/{chunk-X5FPXATC.js.map → chunk-JAZ473V3.js.map} +1 -1
- package/dist/{chunk-5ORHPLOA.js → chunk-JNJSSBKO.js} +19 -2
- package/dist/chunk-JNJSSBKO.js.map +1 -0
- package/dist/{chunk-CJCO3OWF.js → chunk-L4S54SIX.js} +53 -18
- package/dist/chunk-L4S54SIX.js.map +1 -0
- package/dist/{chunk-5A5GGMWK.js → chunk-NJ5GTICM.js} +71 -4
- package/dist/chunk-NJ5GTICM.js.map +1 -0
- package/dist/{chunk-DBIWNA72.js → chunk-Q3SO65JD.js} +2 -2
- package/dist/{chunk-DBIWNA72.js.map → chunk-Q3SO65JD.js.map} +1 -1
- package/dist/{chunk-A4TGVW5V.js → chunk-SBZ3UZ5J.js} +3 -3
- package/dist/{chunk-A4TGVW5V.js.map → chunk-SBZ3UZ5J.js.map} +1 -1
- package/dist/{chunk-OQ62HA7Z.js → chunk-URDYOM2L.js} +3 -3
- package/dist/{chunk-OQ62HA7Z.js.map → chunk-URDYOM2L.js.map} +1 -1
- package/dist/{chunk-YKY24YLZ.js → chunk-V4QNOY4E.js} +4 -4
- package/dist/{chunk-YKY24YLZ.js.map → chunk-V4QNOY4E.js.map} +1 -1
- package/dist/chunk-VBXPFYZ5.js +61 -0
- package/dist/chunk-VBXPFYZ5.js.map +1 -0
- package/dist/{chunk-A6WNRJZF.js → chunk-WFVLQELZ.js} +4 -4
- package/dist/{chunk-A6WNRJZF.js.map → chunk-WFVLQELZ.js.map} +1 -1
- package/dist/{client-u23M69Qt.d.ts → client-Dhi02YAf.d.ts} +5 -1
- package/dist/event-queue/index.d.ts +2 -1
- package/dist/event-queue/index.js +4 -3
- package/dist/export/index.js +3 -3
- package/dist/gateway/index.js +2 -2
- package/dist/gateway/security/index.js +1 -1
- package/dist/graph/index.d.ts +2 -2
- package/dist/graph/index.js +6 -5
- package/dist/{index-qg-t-NT2.d.ts → index-BfvCLSmh.d.ts} +4 -2
- package/dist/{index-2jyc-oTr.d.ts → index-CGTwU6CR.d.ts} +1 -1
- package/dist/{index-5QTY_V54.d.ts → index-CQGCVFmI.d.ts} +7 -2
- package/dist/{index-Zh4KQBM1.d.ts → index-CgTMsars.d.ts} +6 -1
- package/dist/index-CoMKgL-p.d.ts +12 -0
- package/dist/index.d.ts +10 -8
- package/dist/index.js +20 -16
- package/dist/index.js.map +1 -1
- package/dist/init/index.js +3 -3
- package/dist/lifecycle/index.d.ts +1 -0
- package/dist/lifecycle/index.js +5 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/prisma/index.d.ts +2 -2
- package/dist/prisma/index.js +5 -4
- package/dist/server/index.d.ts +3 -3
- package/dist/shutdown-registry-CW9LryO8.d.ts +10 -0
- package/dist/{types-De9M0Yin.d.ts → types-DYE90pls.d.ts} +1 -1
- package/package.json +3 -3
- package/dist/EventQueueFactory-BDOT45WD.js +0 -6
- package/dist/chunk-5A5GGMWK.js.map +0 -1
- package/dist/chunk-5ORHPLOA.js.map +0 -1
- package/dist/chunk-CJCO3OWF.js.map +0 -1
- package/dist/chunk-IMMJMVP7.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/graphql.ts","../src/search/index.ts","../src/translation/index.ts","../src/payments/index.ts","../src/bootstrap/index.ts","../src/client/tenant-backend.ts","../src/index.ts"],"names":["isServiceLayer","value","BurdenoffGraphQLClient","workspacesClient","tenantGateway","config","defaultContext","GraphQLClient","workspacesApiUrl","headers","getHeaders","tenantApiUrl","GatewayClient","layer","serviceLayer","process","env","serviceName","crossLayerGatewayUrl","timeout","retry","context","token","actorId","actorType","workspaceId","productId","updateContext","setHeaders","query","variables","executeWithRetry","executeQuery","tenantQuery","APIError","operation","mergedContext","response","crossLayerQuery","data","api","error","mapTenantError","GatewayError","first","graphqlErrors","message","extensions","type","GatewayErrorType","NETWORK_ERROR","NetworkError","gatewayErrorType","TIMEOUT_ERROR","TimeoutError","handleError","client","request","maxAttempts","initialDelay","maxDelay","backoffMultiplier","lastError","delay","attempt","shouldRetry","sleep","Math","min","code","Error","includes","originalError","errors","length","firstError","String","ms","Promise","resolve","setTimeout","getContext","SearchModule","search","options","trim","ValidationError","logger","debug","resourceTypes","input","organizationId","projectId","fields","fuzziness","boosts","filters","sort","limit","offset","highlight","info","total","took","indexDocument","id","title","mutation","description","content","tags","metadata","removeDocument","updateDocument","updates","indexDocumentsBulk","documents","count","indexed","failed","suggest","prefix","getSuggestions","getRelated","documentId","minScore","getRelatedDocuments","aggregate","aggregations","gqlQuery","getAggregations","clearIndex","deletedCount","clearSearchIndex","reindex","reindexDocuments","TranslationModule","translate","text","targetLanguage","sourceLanguage","textLength","translated","interpolate","getTranslations","keys","language","namespace","fallbackLanguage","translations","get","key","translation","setTranslation","deleteTranslation","setTranslationsBatch","getAllTranslations","detectLanguage","getSupportedLanguages","importTranslations","Object","exportTranslations","exportProductTranslations","resolveProductId","productName","languageCode","format","result","url","decodeJson","decodeDataUrlJson","upsertProductTranslations","flatTranslations","flattenTranslationTree","flatDefaults","defaultValues","publish","updateExisting","keysProcessed","createdKeys","updatedKeyDefaults","createdTranslations","updatedTranslations","entries","existingKeysMap","Map","keyRow","findTranslationKeyByKey","set","defaultValue","keyId","createdKey","createTranslationKey","updateTranslationKeyDefaultValue","translationRow","findGlobalTranslation","createdTranslation","createLanguageTranslation","status","updateLanguageTranslation","shouldUpdateValue","shouldPublish","out","rawValue","nextKey","assign","startsWith","commaIdx","indexOf","header","slice","payload","decoded","Buffer","from","toString","decodeURIComponent","JSON","parse","isBase64","name","i18nProductByName","translationKeyByKey","filter","globalTranslation","items","find","item","tenantId","createTranslation","escapeRegex","str","replace","escapedKey","regex","RegExp","formatPlural","_language","zero","one","other","formatDateTime","date","dateObj","Date","Intl","DateTimeFormat","formatNumber","number","NumberFormat","formatCurrency","amount","currency","style","PaymentsModule","createPayment","paymentMethod","customerId","paymentId","getPayment","getPayments","startDate","endDate","refundPayment","reason","verifyPayment","verificationData","verified","createSubscription","planId","trialDays","subscriptionId","getSubscription","cancelSubscription","cancelAtPeriodEnd","getCustomerSubscriptions","getPlans","activeOnly","createPaymentIntent","paymentIntentId","getPaymentStats","BootstrapModule","startTime","healthCheckInterval","bootstrap","environment","validateConfiguration","databaseConnected","connectDatabase","loadedModules","loadModules","healthCheck","setupHealthChecks","setupSignalHandlers","success","serviceVersion","startedAt","toISOString","modules","healthCheckEnabled","database","DatabaseModule","validateDatabaseUrl","sanitizedUrl","sanitizeDatabaseUrl","moduleName","push","loaded","interval","setInterval","health","performHealthCheck","healthy","warn","checks","memUsage","memoryUsage","memory","used","heapUsed","heapTotal","percentage","uptime","floor","now","getTime","timestamp","gracefulShutdown","signal","clearInterval","cleanup","exit","on","promise","ContextManager","clearContext","getInfo","setupDefaultContext","setContext","createContextMiddleware","req","_res","next","extractContextFromRequest","user","user_id","workspace_id","tenant_endpoint","getHeader","toLowerCase","Array","isArray","authHeader","appId","cfAccessClientId","cfAccessClientSecret","cfAuthorization","loadSchema","schemaPath","onShutdown","callback","originalHandler","listeners","removeAllListeners","isReady","getMetrics","cpu","cpuUsage","createBootstrap","TenantBackendClient","graphqlClient","notifications","sdkConfig","workspacesBackendUrl","tenantBackendUrl","TenantNotificationsModule","tenantUrl","workspacesUrl","hasApiKey","apiKey","setAuthToken","getClient","getConfig","createTenantBackendClient","BurdenoffSDK","eventPublisher","eventPublisherInitPromise","eventQueueConfig","initializationPromise","isShuttingDown","auth","tenantNotifications","rbac","activity","usage","tracker","events","graph","payments","_temporal","_temporalPromise","_temporalConfig","getTemporalModule","loadTemporalModule","TemporalModule","TM","moduleType","address","taskQueue","fromEnv","setLevel","level","setConsoleEnabled","console","transport","addTransport","AuthModule","NotificationsModule","RBACModule","ActivityModule","UsageModule","TrackerModule","EventsModule","GraphModule","temporalModuleType","temporalAddress","temporalNamespace","temporalTaskQueue","eventQueue","autoConnect","maxReconnectAttempts","reconnectTimeWait","hasDefaultContext","hasEventQueueConfig","hasTemporalConfig","scheduleBackgroundInit","queueMicrotask","initializeAsync","withContext","fn","promises","initializeEventQueue","catch","allSettled","publisherConfig","QueueType","REDIS_STREAMS","password","EventQueueFactory","createPublisher","connect","getEventPublisher","waitForReady","isEventQueueHealthy","connected","details","isConnected","isTemporalHealthy","isClientConnected","getHealthStatus","temporal","all","shutdown","force","shutdownPromises","disconnect","race","_","reject","createSDK"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GraphQL Client for Burdenoff Backend SDK\n * Handles communication with workspaces-backend and tenant-backend\n */\n\nimport type { Variables } from 'graphql-request';\nimport { GraphQLClient } from 'graphql-request';\nimport { GatewayClient } from '../gateway/client.js';\nimport { GatewayError, GatewayErrorType } from '../gateway/types.js';\nimport type { ServiceLayer } from '../types/layer.js';\nimport type { SDKConfig, SDKContext } from '../types/index.js';\nimport { APIError, NetworkError, TimeoutError } from '../types/index.js';\n\nfunction isServiceLayer(value: string | undefined): value is ServiceLayer {\n return value === 'wspace' || value === 'global';\n}\n\n/**\n * GraphQL client wrapper with retry logic and error handling\n */\nexport class BurdenoffGraphQLClient {\n private workspacesClient: GraphQLClient;\n /**\n * Cross-layer (tenant) calls go through the unified GatewayClient, which\n * targets the peer layer's PUBLIC gateway and mints a short-lived `service`\n * actor JWT (via signServiceJwt) so the gateway admits the M2M call and the\n * subgraph sees a trusted service context. This is the same mechanism used by\n * `GatewayClient.crossLayerQuery` everywhere else — kept consistent here so\n * tenant SDK calls (notifications, tenant lookups) authenticate identically.\n */\n private tenantGateway?: GatewayClient;\n private config: SDKConfig;\n private defaultContext: SDKContext;\n\n constructor(config: SDKConfig, defaultContext: SDKContext = {}) {\n this.config = config;\n this.defaultContext = defaultContext;\n\n // Initialize workspaces API client (should point to wspace-int-gateway for M2M calls)\n this.workspacesClient = new GraphQLClient(config.workspacesApiUrl, {\n headers: this.getHeaders(defaultContext),\n });\n\n // Cross-layer (tenant) calls go through the unified GatewayClient. The\n // configured tenantApiUrl is the peer layer's PUBLIC gateway; GatewayClient\n // mints the service JWT for it. `layer`/`serviceName` fall back to the\n // standard SERVICE_LAYER/SERVICE_NAME env vars.\n if (config.tenantApiUrl) {\n this.tenantGateway = new GatewayClient({\n layer:\n config.serviceLayer ??\n (isServiceLayer(process.env['SERVICE_LAYER']) ? process.env['SERVICE_LAYER'] : 'wspace'),\n serviceName: config.serviceName ?? process.env['SERVICE_NAME'] ?? 'burdenoff-be-sdk',\n crossLayerGatewayUrl: config.tenantApiUrl,\n timeout: config.timeout,\n // Honor the SDK's retry config (same field shape) so callers that lower\n // maxAttempts for non-idempotent tenant mutations (e.g. notification\n // sends) are respected instead of falling back to the gateway default.\n retry: config.retry,\n });\n }\n }\n\n /**\n * Get headers for GraphQL request\n * Includes actor context headers for RBAC authorization\n */\n private getHeaders(context: SDKContext): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (context.token) {\n headers['Authorization'] = `Bearer ${context.token}`;\n }\n\n // Actor context headers for RBAC\n if (context.actorId) {\n headers['x-actor-id'] = context.actorId;\n }\n\n if (context.actorType) {\n headers['x-actor-type'] = context.actorType;\n }\n\n if (context.workspaceId) {\n headers['x-workspace-id'] = context.workspaceId;\n }\n\n if (context.productId) {\n headers['x-product-id'] = context.productId;\n }\n\n return headers;\n }\n\n /**\n * Update context for future requests\n */\n public updateContext(context: Partial<SDKContext>): void {\n this.defaultContext = { ...this.defaultContext, ...context };\n this.workspacesClient.setHeaders(this.getHeaders(this.defaultContext));\n // The tenant GatewayClient derives per-request headers (and mints its own\n // service JWT) at call time, so there is no persistent header state to update.\n }\n\n /**\n * Execute GraphQL query/mutation against workspaces API\n */\n public async query<T>(query: string, variables?: Variables, context?: SDKContext): Promise<T> {\n return this.executeWithRetry(\n () => this.executeQuery(this.workspacesClient, query, variables, context),\n 'workspaces'\n );\n }\n\n /**\n * Execute GraphQL query/mutation against the tenant (cross-layer) API.\n *\n * Routed through GatewayClient.crossLayerQuery: targets the peer layer's\n * PUBLIC gateway and mints a short-lived `service` actor JWT. Only routing\n * context (workspace / product) is forwarded — the end-user identity is not,\n * because cross-layer tenant operations are service-to-service M2M. Retry and\n * circuit-breaking are handled inside GatewayClient.\n */\n public async tenantQuery<T>(query: string, variables?: Variables, context?: SDKContext): Promise<T> {\n if (!this.tenantGateway) {\n throw new APIError('Tenant API URL not configured', {\n operation: 'tenantQuery',\n });\n }\n\n const mergedContext = { ...this.defaultContext, ...context };\n const headers: Record<string, string> = {};\n if (mergedContext.workspaceId) {\n headers['x-workspace-id'] = mergedContext.workspaceId;\n }\n if (mergedContext.productId) {\n headers['x-product-id'] = mergedContext.productId;\n }\n\n try {\n const response = await this.tenantGateway.crossLayerQuery<T>({\n query,\n variables: variables as Record<string, unknown> | undefined,\n headers,\n });\n\n if (response.data == null) {\n throw new APIError('Tenant query returned no data', { api: 'tenant' });\n }\n return response.data;\n } catch (error) {\n throw this.mapTenantError(error);\n }\n }\n\n /**\n * Map a GatewayClient failure back to the SDK's APIError contract so existing\n * tenant callers (which inspect `error.message` / extensions, e.g. \"Forbidden\")\n * keep working unchanged.\n */\n private mapTenantError(error: unknown): Error {\n if (error instanceof APIError) {\n return error;\n }\n if (error instanceof GatewayError) {\n const first = error.graphqlErrors?.[0];\n if (first) {\n return new APIError(first.message, {\n graphqlErrors: error.graphqlErrors,\n extensions: first.extensions,\n });\n }\n // Preserve the SDK's error-subtype contract: callers may branch on\n // `instanceof NetworkError` / `TimeoutError`, which the legacy tenant path\n // (executeQuery → handleError) used to throw.\n if (error.type === GatewayErrorType.NETWORK_ERROR) {\n return new NetworkError(error.message, { gatewayErrorType: error.type });\n }\n if (error.type === GatewayErrorType.TIMEOUT_ERROR) {\n return new TimeoutError(error.message, { gatewayErrorType: error.type });\n }\n return new APIError(error.message, { gatewayErrorType: error.type });\n }\n return this.handleError(error);\n }\n\n /**\n * Execute GraphQL request\n */\n private async executeQuery<T>(\n client: GraphQLClient,\n query: string,\n variables?: Variables,\n context?: SDKContext\n ): Promise<T> {\n try {\n // Merge context with default context\n const mergedContext = { ...this.defaultContext, ...context };\n\n // Update headers for this request if context provided.\n if (context) {\n client.setHeaders(this.getHeaders(mergedContext));\n }\n\n const response = await client.request<T>(query, variables);\n return response;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Execute with retry logic\n */\n private async executeWithRetry<T>(operation: () => Promise<T>, api: 'workspaces' | 'tenant'): Promise<T> {\n const maxAttempts = this.config.retry?.maxAttempts || 3;\n const initialDelay = this.config.retry?.initialDelay || 1000;\n const maxDelay = this.config.retry?.maxDelay || 10000;\n const backoffMultiplier = this.config.retry?.backoffMultiplier || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on certain errors\n if (error instanceof APIError && !this.shouldRetry(error)) {\n throw error;\n }\n\n // Don't retry on last attempt\n if (attempt === maxAttempts) {\n break;\n }\n\n // Wait before retrying\n await this.sleep(Math.min(delay, maxDelay));\n delay *= backoffMultiplier;\n }\n }\n\n throw new APIError(`GraphQL request failed after ${maxAttempts} attempts`, {\n api,\n lastError: lastError?.message,\n });\n }\n\n /**\n * Determine if error should be retried\n */\n private shouldRetry(error: APIError): boolean {\n // Retry on network errors and timeouts\n if (error instanceof NetworkError || error instanceof TimeoutError) {\n return true;\n }\n\n // Retry on 5xx server errors\n if (error.code === 'SERVER_ERROR') {\n return true;\n }\n\n // Don't retry on client errors (4xx)\n return false;\n }\n\n /**\n * Handle GraphQL errors\n */\n private handleError(error: unknown): Error {\n if (error instanceof Error) {\n // Check for network errors\n if (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED')) {\n return new NetworkError('Network error while connecting to API', {\n originalError: error.message,\n });\n }\n\n // Check for timeout errors\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n return new TimeoutError('Request timed out', {\n originalError: error.message,\n });\n }\n\n // GraphQL errors\n if ('response' in error && error.response) {\n const response = error.response as {\n errors?: Array<{ message: string; extensions?: Record<string, unknown> }>;\n };\n if (response.errors && response.errors.length > 0) {\n const firstError = response.errors[0];\n if (firstError) {\n return new APIError(firstError.message, {\n graphqlErrors: response.errors,\n extensions: firstError.extensions,\n });\n }\n }\n }\n\n return new APIError(error.message, {\n originalError: error.message,\n });\n }\n\n return new APIError('Unknown error occurred', {\n error: String(error),\n });\n }\n\n /**\n * Sleep utility for retry delays\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get current context\n */\n public getContext(): SDKContext {\n return { ...this.defaultContext };\n }\n}\n","/**\n * Search Module\n * Helpers for managing global search across products via the federated GraphQL gateway\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 interface SearchOptions {\n /** Search query */\n query: string;\n /** Resource types to search */\n resourceTypes?: string[];\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** Search in specific fields */\n fields?: string[];\n /** Fuzzy search tolerance (0-1) */\n fuzziness?: number;\n /** Boost specific fields */\n boosts?: Record<string, number>;\n /** Filters */\n filters?: SearchFilter[];\n /** Sort options */\n sort?: SearchSort[];\n /** Pagination */\n limit?: number;\n offset?: number;\n /** Highlight matches */\n highlight?: boolean;\n}\n\nexport interface SearchFilter {\n /** Field to filter */\n field: string;\n /** Filter operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'range';\n /** Filter value */\n value: unknown;\n}\n\nexport interface SearchSort {\n /** Field to sort by */\n field: string;\n /** Sort order */\n order: 'asc' | 'desc';\n}\n\nexport interface SearchResult {\n id: string;\n type: string;\n title: string;\n description?: string;\n data: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n score: number;\n highlights?: Record<string, string[]>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SearchResponse {\n results: SearchResult[];\n total: number;\n took: number;\n aggregations?: Record<string, SearchAggregation>;\n}\n\nexport interface SearchAggregation {\n buckets: Array<{\n key: string;\n count: number;\n }>;\n}\n\nexport interface IndexDocumentOptions {\n /** Resource ID */\n id: string;\n /** Resource type */\n type: string;\n /** Document title */\n title: string;\n /** Document description */\n description?: string;\n /** Document content */\n content?: string;\n /** Additional data */\n data: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** Tags */\n tags?: string[];\n /** Metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Search Module\n */\nexport class SearchModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Search across all resources\n */\n public async search(options: SearchOptions): Promise<SearchResponse> {\n if (!options.query || options.query.trim().length === 0) {\n throw new ValidationError('Search query is required');\n }\n\n logger.debug('[Search] Searching', {\n query: options.query,\n resourceTypes: options.resourceTypes,\n });\n\n const query = `\n query Search($input: SearchInput!) {\n search(input: $input) {\n results {\n id\n type\n title\n description\n data\n workspaceId\n organizationId\n projectId\n score\n highlights\n createdAt\n updatedAt\n }\n total\n took\n aggregations\n }\n }\n `;\n\n const variables = {\n input: {\n query: options.query,\n resourceTypes: options.resourceTypes,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId || this.context.projectId,\n fields: options.fields,\n fuzziness: options.fuzziness || 0.8,\n boosts: options.boosts,\n filters: options.filters,\n sort: options.sort,\n limit: options.limit || 20,\n offset: options.offset || 0,\n highlight: options.highlight !== false,\n },\n };\n\n const response = await this.client.query<{ search: SearchResponse }>(query, variables, this.context);\n\n logger.info('[Search] Search completed', {\n total: response.search.total,\n took: response.search.took,\n });\n\n return response.search;\n }\n\n /**\n * Index document for search\n */\n public async indexDocument(options: IndexDocumentOptions): Promise<{ id: string; indexed: boolean }> {\n if (!options.id) {\n throw new ValidationError('Document ID is required');\n }\n\n if (!options.type) {\n throw new ValidationError('Document type is required');\n }\n\n if (!options.title) {\n throw new ValidationError('Document title is required');\n }\n\n logger.debug('[Search] Indexing document', {\n id: options.id,\n type: options.type,\n });\n\n const mutation = `\n mutation IndexDocument($input: IndexDocumentInput!) {\n indexDocument(input: $input) {\n id\n indexed\n }\n }\n `;\n\n const variables = {\n input: {\n id: options.id,\n type: options.type,\n title: options.title,\n description: options.description,\n content: options.content,\n data: options.data,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId || this.context.projectId,\n tags: options.tags,\n metadata: options.metadata,\n },\n };\n\n const response = await this.client.query<{ indexDocument: { id: string; indexed: boolean } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Search] Document indexed', { id: response.indexDocument.id });\n\n return response.indexDocument;\n }\n\n /**\n * Remove document from search index\n */\n public async removeDocument(id: string, type: string): Promise<boolean> {\n logger.debug('[Search] Removing document', { id, type });\n\n const mutation = `\n mutation RemoveDocument($id: ID!, $type: String!) {\n removeDocument(id: $id, type: $type) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { id, type }, this.context);\n\n logger.info('[Search] Document removed', { id });\n\n return true;\n }\n\n /**\n * Update document in search index\n */\n public async updateDocument(\n id: string,\n type: string,\n updates: Partial<IndexDocumentOptions>\n ): Promise<{ id: string; updated: boolean }> {\n logger.debug('[Search] Updating document', { id, type });\n\n const mutation = `\n mutation UpdateDocument($id: ID!, $type: String!, $updates: JSON!) {\n updateDocument(id: $id, type: $type, updates: $updates) {\n id\n updated\n }\n }\n `;\n\n const response = await this.client.query<{ updateDocument: { id: string; updated: boolean } }>(\n mutation,\n { id, type, updates },\n this.context\n );\n\n logger.info('[Search] Document updated', { id });\n\n return response.updateDocument;\n }\n\n /**\n * Bulk index documents\n */\n public async indexDocumentsBulk(documents: IndexDocumentOptions[]): Promise<{\n indexed: number;\n failed: number;\n errors: string[];\n }> {\n logger.debug('[Search] Bulk indexing documents', { count: documents.length });\n\n const mutation = `\n mutation IndexDocumentsBulk($documents: [IndexDocumentInput!]!) {\n indexDocumentsBulk(documents: $documents) {\n indexed\n failed\n errors\n }\n }\n `;\n\n const response = await this.client.query<{\n indexDocumentsBulk: {\n indexed: number;\n failed: number;\n errors: string[];\n };\n }>(mutation, { documents }, this.context);\n\n logger.info('[Search] Bulk indexing completed', {\n indexed: response.indexDocumentsBulk.indexed,\n failed: response.indexDocumentsBulk.failed,\n });\n\n return response.indexDocumentsBulk;\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n public async suggest(\n prefix: string,\n options?: {\n resourceTypes?: string[];\n limit?: number;\n }\n ): Promise<\n Array<{\n text: string;\n score: number;\n type?: string;\n }>\n > {\n if (!prefix || prefix.trim().length === 0) {\n throw new ValidationError('Prefix is required for suggestions');\n }\n\n logger.debug('[Search] Getting suggestions', { prefix });\n\n const query = `\n query GetSuggestions($prefix: String!, $resourceTypes: [String!], $limit: Int) {\n getSuggestions(prefix: $prefix, resourceTypes: $resourceTypes, limit: $limit) {\n text\n score\n type\n }\n }\n `;\n\n const response = await this.client.query<{\n getSuggestions: Array<{\n text: string;\n score: number;\n type?: string;\n }>;\n }>(\n query,\n {\n prefix,\n resourceTypes: options?.resourceTypes,\n limit: options?.limit || 10,\n },\n this.context\n );\n\n return response.getSuggestions;\n }\n\n /**\n * Get related documents\n */\n public async getRelated(\n documentId: string,\n options?: {\n limit?: number;\n minScore?: number;\n }\n ): Promise<SearchResult[]> {\n logger.debug('[Search] Getting related documents', { documentId });\n\n const query = `\n query GetRelatedDocuments($documentId: ID!, $limit: Int, $minScore: Float) {\n getRelatedDocuments(documentId: $documentId, limit: $limit, minScore: $minScore) {\n id\n type\n title\n description\n data\n score\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getRelatedDocuments: SearchResult[] }>(\n query,\n {\n documentId,\n limit: options?.limit || 10,\n minScore: options?.minScore || 0.5,\n },\n this.context\n );\n\n return response.getRelatedDocuments;\n }\n\n /**\n * Get search aggregations\n */\n public async aggregate(\n query: string,\n aggregations: Array<{\n field: string;\n type: 'terms' | 'date_histogram' | 'range';\n size?: number;\n }>\n ): Promise<Record<string, SearchAggregation>> {\n logger.debug('[Search] Getting aggregations', { query });\n\n const gqlQuery = `\n query GetAggregations($query: String!, $aggregations: [AggregationInput!]!) {\n getAggregations(query: $query, aggregations: $aggregations) {\n aggregations\n }\n }\n `;\n\n const response = await this.client.query<{\n getAggregations: { aggregations: Record<string, SearchAggregation> };\n }>(gqlQuery, { query, aggregations }, this.context);\n\n return response.getAggregations.aggregations;\n }\n\n /**\n * Clear search index for workspace\n */\n public async clearIndex(workspaceId?: string): Promise<{ deletedCount: number }> {\n logger.debug('[Search] Clearing index', { workspaceId });\n\n const mutation = `\n mutation ClearSearchIndex($workspaceId: ID) {\n clearSearchIndex(workspaceId: $workspaceId) {\n deletedCount\n }\n }\n `;\n\n const response = await this.client.query<{ clearSearchIndex: { deletedCount: number } }>(\n mutation,\n { workspaceId: workspaceId || this.context.workspaceId },\n this.context\n );\n\n logger.info('[Search] Index cleared', { deletedCount: response.clearSearchIndex.deletedCount });\n\n return response.clearSearchIndex;\n }\n\n /**\n * Reindex all documents\n */\n public async reindex(options?: {\n workspaceId?: string;\n resourceTypes?: string[];\n }): Promise<{ indexed: number; failed: number }> {\n logger.debug('[Search] Reindexing', options);\n\n const mutation = `\n mutation ReindexDocuments($workspaceId: ID, $resourceTypes: [String!]) {\n reindexDocuments(workspaceId: $workspaceId, resourceTypes: $resourceTypes) {\n indexed\n failed\n }\n }\n `;\n\n const response = await this.client.query<{\n reindexDocuments: { indexed: number; failed: number };\n }>(\n mutation,\n {\n workspaceId: options?.workspaceId || this.context.workspaceId,\n resourceTypes: options?.resourceTypes,\n },\n this.context\n );\n\n logger.info('[Search] Reindexing completed', response.reindexDocuments);\n\n return response.reindexDocuments;\n }\n}\n","/**\n * Translation Module\n * Helpers for managing translations and internationalization in backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport type SupportedLanguage =\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\nexport interface TranslationOptions {\n /** Text to translate */\n text: string;\n /** Source language */\n sourceLanguage?: SupportedLanguage;\n /** Target language */\n targetLanguage: SupportedLanguage;\n /** Translation context */\n context?: string;\n /** Variables to interpolate */\n variables?: Record<string, string | number>;\n}\n\nexport interface Translation {\n original: string;\n translated: string;\n sourceLanguage: string;\n targetLanguage: string;\n confidence?: number;\n}\n\nexport interface GetTranslationsOptions {\n /** Translation keys */\n keys: string[];\n /** Target language */\n language: SupportedLanguage;\n /** Namespace */\n namespace?: string;\n /** Fallback language */\n fallbackLanguage?: SupportedLanguage;\n}\n\nexport interface TranslationKey {\n key: string;\n value: string;\n language: SupportedLanguage;\n namespace?: string;\n description?: string;\n variables?: string[];\n}\n\nexport interface SetTranslationOptions {\n /** Translation key */\n key: string;\n /** Translation value */\n value: string;\n /** Language */\n language: SupportedLanguage;\n /** Namespace */\n namespace?: string;\n /** Description */\n description?: string;\n /** Variables used in translation */\n variables?: string[];\n}\n\nexport type TranslationExportFormat = 'JSON' | 'CSV' | 'XLSX' | 'PO' | 'XLIFF';\n\nexport interface ProductTranslationTree {\n [key: string]: string | ProductTranslationTree;\n}\n\nexport interface ExportProductTranslationsOptions {\n /** Product ID (preferred when already known) */\n productId?: string;\n /** Product name (e.g. 'vibecontrols') */\n productName?: string;\n /** Target language code (e.g. 'en', 'ta', 'hi') */\n languageCode?: string;\n /** Export format expected by i18n service */\n format?: TranslationExportFormat;\n /** Decode data URL payload into JSON object for JSON exports */\n decodeJson?: boolean;\n}\n\nexport interface ProductTranslationsExportResult {\n format: TranslationExportFormat;\n url: string;\n translations?: Record<string, unknown>;\n}\n\nexport interface UpsertProductTranslationsOptions {\n /** Product ID (preferred when already known) */\n productId?: string;\n /** Product name (e.g. 'vibecontrols') */\n productName?: string;\n /** Language code to upsert translations for */\n languageCode: string;\n /** Translation map (flat or nested) */\n translations: Record<string, string> | ProductTranslationTree;\n /** Optional default language values for translation key defaultValue */\n defaultValues?: Record<string, string> | ProductTranslationTree;\n /** Whether to update existing translation values if they differ */\n updateExisting?: boolean;\n /** Publish translations after create/update */\n publish?: boolean;\n}\n\nexport interface UpsertProductTranslationsResult {\n productId: string;\n languageCode: string;\n keysProcessed: number;\n createdKeys: number;\n updatedKeyDefaults: number;\n createdTranslations: number;\n updatedTranslations: number;\n}\n\n/**\n * Translation Module\n */\nexport class TranslationModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Translate text\n */\n public async translate(options: TranslationOptions): Promise<Translation> {\n if (!options.text || options.text.trim().length === 0) {\n throw new ValidationError('Text to translate is required');\n }\n\n if (!options.targetLanguage) {\n throw new ValidationError('Target language is required');\n }\n\n logger.debug('[Translation] Translating text', {\n sourceLanguage: options.sourceLanguage || 'auto',\n targetLanguage: options.targetLanguage,\n textLength: options.text.length,\n });\n\n const query = `\n query Translate($input: TranslateInput!) {\n translate(input: $input) {\n original\n translated\n sourceLanguage\n targetLanguage\n confidence\n }\n }\n `;\n\n const variables = {\n input: {\n text: options.text,\n sourceLanguage: options.sourceLanguage,\n targetLanguage: options.targetLanguage,\n context: options.context,\n },\n };\n\n const response = await this.client.query<{ translate: Translation }>(query, variables, this.context);\n\n // Interpolate variables if provided\n let translated = response.translate.translated;\n if (options.variables) {\n translated = this.interpolate(translated, options.variables);\n }\n\n logger.info('[Translation] Text translated', {\n sourceLanguage: response.translate.sourceLanguage,\n targetLanguage: response.translate.targetLanguage,\n });\n\n return {\n ...response.translate,\n translated,\n };\n }\n\n /**\n * Get translations for keys\n */\n public async getTranslations(options: GetTranslationsOptions): Promise<Record<string, string>> {\n if (!options.keys || options.keys.length === 0) {\n throw new ValidationError('Translation keys are required');\n }\n\n if (!options.language) {\n throw new ValidationError('Language is required');\n }\n\n logger.debug('[Translation] Getting translations', {\n language: options.language,\n count: options.keys.length,\n });\n\n const query = `\n query GetTranslations(\n $keys: [String!]!\n $language: String!\n $namespace: String\n $fallbackLanguage: String\n ) {\n getTranslations(\n keys: $keys\n language: $language\n namespace: $namespace\n fallbackLanguage: $fallbackLanguage\n ) {\n translations\n }\n }\n `;\n\n const response = await this.client.query<{\n getTranslations: { translations: Record<string, string> };\n }>(\n query,\n {\n keys: options.keys,\n language: options.language,\n namespace: options.namespace,\n fallbackLanguage: options.fallbackLanguage || 'en',\n },\n this.context\n );\n\n return response.getTranslations.translations;\n }\n\n /**\n * Get single translation\n */\n public async get(\n key: string,\n language: SupportedLanguage,\n variables?: Record<string, string | number>\n ): Promise<string> {\n const translations = await this.getTranslations({\n keys: [key],\n language,\n });\n\n let translation = translations[key] || key;\n\n if (variables) {\n translation = this.interpolate(translation, variables);\n }\n\n return translation;\n }\n\n /**\n * Set translation\n */\n public async setTranslation(options: SetTranslationOptions): Promise<TranslationKey> {\n if (!options.key) {\n throw new ValidationError('Translation key is required');\n }\n\n if (!options.value) {\n throw new ValidationError('Translation value is required');\n }\n\n if (!options.language) {\n throw new ValidationError('Language is required');\n }\n\n logger.debug('[Translation] Setting translation', {\n key: options.key,\n language: options.language,\n });\n\n const mutation = `\n mutation SetTranslation($input: SetTranslationInput!) {\n setTranslation(input: $input) {\n key\n value\n language\n namespace\n description\n variables\n }\n }\n `;\n\n const variables = {\n input: {\n key: options.key,\n value: options.value,\n language: options.language,\n namespace: options.namespace,\n description: options.description,\n variables: options.variables,\n },\n };\n\n const response = await this.client.query<{ setTranslation: TranslationKey }>(mutation, variables, this.context);\n\n logger.info('[Translation] Translation set', { key: options.key, language: options.language });\n\n return response.setTranslation;\n }\n\n /**\n * Delete translation\n */\n public async deleteTranslation(key: string, language: SupportedLanguage, namespace?: string): Promise<boolean> {\n logger.debug('[Translation] Deleting translation', { key, language });\n\n const mutation = `\n mutation DeleteTranslation($key: String!, $language: String!, $namespace: String) {\n deleteTranslation(key: $key, language: $language, namespace: $namespace) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { key, language, namespace }, this.context);\n\n logger.info('[Translation] Translation deleted', { key, language });\n\n return true;\n }\n\n /**\n * Batch set translations\n */\n public async setTranslationsBatch(translations: SetTranslationOptions[]): Promise<TranslationKey[]> {\n logger.debug('[Translation] Batch setting translations', { count: translations.length });\n\n const mutation = `\n mutation SetTranslationsBatch($translations: [SetTranslationInput!]!) {\n setTranslationsBatch(translations: $translations) {\n key\n value\n language\n namespace\n description\n variables\n }\n }\n `;\n\n const response = await this.client.query<{ setTranslationsBatch: TranslationKey[] }>(\n mutation,\n { translations },\n this.context\n );\n\n logger.info('[Translation] Batch translations set', { count: response.setTranslationsBatch.length });\n\n return response.setTranslationsBatch;\n }\n\n /**\n * Get all translations for language\n */\n public async getAllTranslations(language: SupportedLanguage, namespace?: string): Promise<TranslationKey[]> {\n logger.debug('[Translation] Getting all translations', { language, namespace });\n\n const query = `\n query GetAllTranslations($language: String!, $namespace: String) {\n getAllTranslations(language: $language, namespace: $namespace) {\n key\n value\n language\n namespace\n description\n variables\n }\n }\n `;\n\n const response = await this.client.query<{ getAllTranslations: TranslationKey[] }>(\n query,\n { language, namespace },\n this.context\n );\n\n return response.getAllTranslations;\n }\n\n /**\n * Detect language\n */\n public async detectLanguage(text: string): Promise<{\n language: SupportedLanguage;\n confidence: number;\n }> {\n if (!text || text.trim().length === 0) {\n throw new ValidationError('Text is required for language detection');\n }\n\n logger.debug('[Translation] Detecting language');\n\n const query = `\n query DetectLanguage($text: String!) {\n detectLanguage(text: $text) {\n language\n confidence\n }\n }\n `;\n\n const response = await this.client.query<{\n detectLanguage: {\n language: SupportedLanguage;\n confidence: number;\n };\n }>(query, { text }, this.context);\n\n return response.detectLanguage;\n }\n\n /**\n * Get supported languages\n */\n public async getSupportedLanguages(): Promise<\n Array<{\n code: SupportedLanguage;\n name: string;\n nativeName: string;\n }>\n > {\n logger.debug('[Translation] Getting supported languages');\n\n const query = `\n query GetSupportedLanguages {\n getSupportedLanguages {\n code\n name\n nativeName\n }\n }\n `;\n\n const response = await this.client.query<{\n getSupportedLanguages: Array<{\n code: SupportedLanguage;\n name: string;\n nativeName: string;\n }>;\n }>(query, {}, this.context);\n\n return response.getSupportedLanguages;\n }\n\n /**\n * Import translations from file\n */\n public async importTranslations(\n language: SupportedLanguage,\n translations: Record<string, string>,\n namespace?: string\n ): Promise<{ imported: number; failed: number }> {\n logger.debug('[Translation] Importing translations', {\n language,\n count: Object.keys(translations).length,\n });\n\n const mutation = `\n mutation ImportTranslations($language: String!, $translations: JSON!, $namespace: String) {\n importTranslations(language: $language, translations: $translations, namespace: $namespace) {\n imported\n failed\n }\n }\n `;\n\n const response = await this.client.query<{\n importTranslations: { imported: number; failed: number };\n }>(mutation, { language, translations, namespace }, this.context);\n\n logger.info('[Translation] Translations imported', response.importTranslations);\n\n return response.importTranslations;\n }\n\n /**\n * Export translations to JSON\n */\n public async exportTranslations(language: SupportedLanguage, namespace?: string): Promise<Record<string, string>> {\n logger.debug('[Translation] Exporting translations', { language, namespace });\n\n const query = `\n query ExportTranslations($language: String!, $namespace: String) {\n exportTranslations(language: $language, namespace: $namespace) {\n translations\n }\n }\n `;\n\n const response = await this.client.query<{\n exportTranslations: { translations: Record<string, string> };\n }>(query, { language, namespace }, this.context);\n\n logger.info('[Translation] Translations exported', {\n language,\n count: Object.keys(response.exportTranslations.translations).length,\n });\n\n return response.exportTranslations.translations;\n }\n\n /**\n * Export product translations from global i18n service (federated schema).\n *\n * This uses the modern i18n GraphQL contract:\n * - i18nProductByName\n * - exportTranslations(productId, languageCode, format)\n */\n public async exportProductTranslations(\n options: ExportProductTranslationsOptions\n ): Promise<ProductTranslationsExportResult> {\n const productId = await this.resolveProductId(options.productId, options.productName);\n const languageCode = options.languageCode ?? 'en';\n const format = options.format ?? 'JSON';\n\n const query = `\n query ExportProductTranslations(\n $productId: String!\n $languageCode: String!\n $format: ImportJobFormat!\n ) {\n exportTranslations(productId: $productId, languageCode: $languageCode, format: $format) {\n format\n url\n }\n }\n `;\n\n const response = await this.client.query<{\n exportTranslations: { format: TranslationExportFormat; url: string };\n }>(\n query,\n {\n productId,\n languageCode,\n format,\n },\n this.context\n );\n\n const result: ProductTranslationsExportResult = {\n format: response.exportTranslations.format,\n url: response.exportTranslations.url,\n };\n\n if ((options.decodeJson ?? true) && format === 'JSON') {\n result.translations = this.decodeDataUrlJson(response.exportTranslations.url);\n }\n\n return result;\n }\n\n /**\n * Upsert product translations in global i18n service.\n *\n * Behavior:\n * - Ensures translation keys exist (create if missing)\n * - Optionally updates translation key defaultValue\n * - Creates/updates language translation entries\n * - Optionally publishes translations\n */\n public async upsertProductTranslations(\n options: UpsertProductTranslationsOptions\n ): Promise<UpsertProductTranslationsResult> {\n if (!options.languageCode) {\n throw new ValidationError('languageCode is required');\n }\n\n const flatTranslations = this.flattenTranslationTree(options.translations);\n if (Object.keys(flatTranslations).length === 0) {\n throw new ValidationError('translations cannot be empty');\n }\n\n const flatDefaults = options.defaultValues ? this.flattenTranslationTree(options.defaultValues) : flatTranslations;\n\n const productId = await this.resolveProductId(options.productId, options.productName);\n const publish = options.publish ?? true;\n const updateExisting = options.updateExisting ?? true;\n\n const result: UpsertProductTranslationsResult = {\n productId,\n languageCode: options.languageCode,\n keysProcessed: 0,\n createdKeys: 0,\n updatedKeyDefaults: 0,\n createdTranslations: 0,\n updatedTranslations: 0,\n };\n\n const entries = Object.entries(flatTranslations);\n\n // Bulk-fetch existing keys to avoid N+1 queries (1 query instead of N)\n const existingKeysMap = new Map<string, { id: string; defaultValue: string | null }>();\n for (const [key] of entries) {\n const keyRow = await this.findTranslationKeyByKey(productId, key);\n if (keyRow) {\n existingKeysMap.set(key, keyRow);\n }\n }\n\n for (const [key, value] of entries) {\n const defaultValue = flatDefaults[key] ?? value;\n let keyId = '';\n\n const keyRow = existingKeysMap.get(key);\n if (!keyRow) {\n const createdKey = await this.createTranslationKey(productId, key, defaultValue);\n keyId = createdKey.id;\n result.createdKeys += 1;\n } else {\n keyId = keyRow.id;\n if (defaultValue && keyRow.defaultValue !== defaultValue) {\n await this.updateTranslationKeyDefaultValue(keyId, defaultValue);\n result.updatedKeyDefaults += 1;\n }\n }\n\n const translationRow = await this.findGlobalTranslation(keyId, options.languageCode);\n if (!translationRow) {\n const createdTranslation = await this.createLanguageTranslation(keyId, options.languageCode, value);\n result.createdTranslations += 1;\n\n if (publish && createdTranslation.status !== 'PUBLISHED') {\n await this.updateLanguageTranslation(createdTranslation.id, value, 'PUBLISHED');\n }\n } else {\n const shouldUpdateValue = updateExisting && translationRow.value !== value;\n const shouldPublish = publish && translationRow.status !== 'PUBLISHED';\n\n if (shouldUpdateValue || shouldPublish) {\n await this.updateLanguageTranslation(\n translationRow.id,\n shouldUpdateValue ? value : translationRow.value,\n publish ? 'PUBLISHED' : (translationRow.status as 'PUBLISHED' | 'DRAFT' | 'REVIEW')\n );\n if (shouldUpdateValue) {\n result.updatedTranslations += 1;\n }\n }\n }\n\n result.keysProcessed += 1;\n }\n\n logger.info('[Translation] Product translations upsert completed', {\n productId,\n languageCode: options.languageCode,\n keysProcessed: result.keysProcessed,\n createdKeys: result.createdKeys,\n createdTranslations: result.createdTranslations,\n updatedTranslations: result.updatedTranslations,\n });\n\n return result;\n }\n\n private flattenTranslationTree(\n input: Record<string, string> | ProductTranslationTree,\n prefix = ''\n ): Record<string, string> {\n const out: Record<string, string> = {};\n\n for (const [key, rawValue] of Object.entries(input)) {\n const nextKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof rawValue === 'string') {\n out[nextKey] = rawValue;\n continue;\n }\n\n if (rawValue && typeof rawValue === 'object') {\n Object.assign(out, this.flattenTranslationTree(rawValue, nextKey));\n }\n }\n\n return out;\n }\n\n private decodeDataUrlJson(url: string): Record<string, unknown> {\n if (!url.startsWith('data:')) {\n throw new ValidationError('Expected exportTranslations URL to be a data URL');\n }\n\n const commaIdx = url.indexOf(',');\n if (commaIdx === -1) {\n throw new ValidationError('Invalid data URL: missing comma separator');\n }\n\n const header = url.slice(0, commaIdx); // e.g. \"data:application/json;base64\"\n const payload = url.slice(commaIdx + 1);\n if (!payload) {\n throw new ValidationError('Invalid data URL payload');\n }\n\n try {\n const decoded = header.includes('base64')\n ? Buffer.from(payload, 'base64').toString('utf8')\n : decodeURIComponent(payload);\n return JSON.parse(decoded) as Record<string, unknown>;\n } catch (error) {\n logger.error('[Translation] Failed to decode data URL JSON', {\n error,\n isBase64: header.includes('base64'),\n });\n throw new ValidationError('Failed to decode JSON translation payload');\n }\n }\n\n private async resolveProductId(productId?: string, productName?: string): Promise<string> {\n if (productId) {\n return productId;\n }\n\n if (!productName) {\n throw new ValidationError('Either productId or productName is required');\n }\n\n const query = `\n query GetI18nProductByName($name: String!) {\n i18nProductByName(name: $name) {\n id\n }\n }\n `;\n\n const response = await this.client.query<{\n i18nProductByName: { id: string } | null;\n }>(query, { name: productName }, this.context);\n\n if (!response.i18nProductByName?.id) {\n throw new ValidationError(`i18n product not found: ${productName}`);\n }\n\n return response.i18nProductByName.id;\n }\n\n private async findTranslationKeyByKey(\n productId: string,\n key: string\n ): Promise<{ id: string; defaultValue: string | null } | null> {\n const query = `\n query FindTranslationKey($productId: String!, $key: String!) {\n translationKeyByKey(productId: $productId, key: $key) {\n id\n defaultValue\n }\n }\n `;\n\n const response = await this.client.query<{\n translationKeyByKey: { id: string; defaultValue: string | null } | null;\n }>(\n query,\n {\n productId,\n key,\n },\n this.context\n );\n\n return response.translationKeyByKey;\n }\n\n private async createTranslationKey(productId: string, key: string, defaultValue: string): Promise<{ id: string }> {\n const mutation = `\n mutation CreateTranslationKey($input: CreateTranslationKeyInput!) {\n createTranslationKey(input: $input) {\n id\n }\n }\n `;\n\n const response = await this.client.query<{\n createTranslationKey: { id: string };\n }>(\n mutation,\n {\n input: {\n productId,\n key,\n defaultValue,\n },\n },\n this.context\n );\n\n return response.createTranslationKey;\n }\n\n private async updateTranslationKeyDefaultValue(id: string, defaultValue: string): Promise<void> {\n const mutation = `\n mutation UpdateTranslationKeyDefault($id: ID!, $input: UpdateTranslationKeyInput!) {\n updateTranslationKey(id: $id, input: $input) {\n id\n }\n }\n `;\n\n await this.client.query(\n mutation,\n {\n id,\n input: { defaultValue },\n },\n this.context\n );\n }\n\n private async findGlobalTranslation(\n keyId: string,\n languageCode: string\n ): Promise<{ id: string; value: string; status: string } | null> {\n const query = `\n query FindTranslation($filter: TranslationFilterInput) {\n translations(filter: $filter, limit: 50, offset: 0) {\n items {\n id\n value\n status\n tenantId\n }\n }\n }\n `;\n\n const response = await this.client.query<{\n translations: {\n items: Array<{\n id: string;\n value: string;\n status: string;\n tenantId: string | null;\n }>;\n };\n }>(\n query,\n {\n filter: {\n keyId,\n languageCode,\n },\n },\n this.context\n );\n\n const globalTranslation = response.translations.items.find((item) => item.tenantId === null);\n if (!globalTranslation) {\n return null;\n }\n\n return {\n id: globalTranslation.id,\n value: globalTranslation.value,\n status: globalTranslation.status,\n };\n }\n\n private async createLanguageTranslation(\n keyId: string,\n languageCode: string,\n value: string\n ): Promise<{ id: string; status: string }> {\n const mutation = `\n mutation CreateTranslation($input: CreateTranslationInput!) {\n createTranslation(input: $input) {\n id\n status\n }\n }\n `;\n\n const response = await this.client.query<{\n createTranslation: { id: string; status: string };\n }>(\n mutation,\n {\n input: {\n keyId,\n languageCode,\n value,\n },\n },\n this.context\n );\n\n return response.createTranslation;\n }\n\n private async updateLanguageTranslation(\n id: string,\n value: string,\n status: 'PUBLISHED' | 'DRAFT' | 'REVIEW'\n ): Promise<void> {\n const mutation = `\n mutation UpdateTranslation($id: ID!, $input: UpdateTranslationInput!) {\n updateTranslation(id: $id, input: $input) {\n id\n status\n }\n }\n `;\n\n await this.client.query(\n mutation,\n {\n id,\n input: {\n value,\n status,\n },\n },\n this.context\n );\n }\n\n /**\n * Escape regex special characters in a string\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Interpolate variables in translation string\n */\n private interpolate(text: string, variables: Record<string, string | number>): string {\n let result = text;\n\n for (const [key, value] of Object.entries(variables)) {\n // Escape regex special characters in key to prevent regex injection\n const escapedKey = this.escapeRegex(key);\n const regex = new RegExp(`{{\\\\s*${escapedKey}\\\\s*}}`, 'g');\n result = result.replace(regex, String(value));\n }\n\n return result;\n }\n\n /**\n * Format translation with pluralization\n */\n public formatPlural(\n _language: SupportedLanguage,\n count: number,\n translations: {\n zero?: string;\n one: string;\n other: string;\n }\n ): string {\n if (count === 0 && translations.zero) {\n return translations.zero;\n }\n\n if (count === 1) {\n return translations.one;\n }\n\n return translations.other;\n }\n\n /**\n * Format date/time for locale\n */\n public formatDateTime(\n date: Date | string,\n language: SupportedLanguage,\n options?: Intl.DateTimeFormatOptions\n ): string {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat(language, options).format(dateObj);\n }\n\n /**\n * Format number for locale\n */\n public formatNumber(number: number, language: SupportedLanguage, options?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(language, options).format(number);\n }\n\n /**\n * Format currency for locale\n */\n public formatCurrency(amount: number, currency: string, language: SupportedLanguage): string {\n return new Intl.NumberFormat(language, {\n style: 'currency',\n currency,\n }).format(amount);\n }\n}\n","/**\n * Payments Module\n * Helpers for managing payments, subscriptions, and verification\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 PaymentStatus {\n PENDING = 'pending',\n PROCESSING = 'processing',\n SUCCEEDED = 'succeeded',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n REFUNDED = 'refunded',\n}\n\nexport enum PaymentMethod {\n CREDIT_CARD = 'credit_card',\n DEBIT_CARD = 'debit_card',\n BANK_TRANSFER = 'bank_transfer',\n UPI = 'upi',\n WALLET = 'wallet',\n PAYPAL = 'paypal',\n STRIPE = 'stripe',\n}\n\nexport enum SubscriptionStatus {\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n CANCELLED = 'cancelled',\n EXPIRED = 'expired',\n PAST_DUE = 'past_due',\n TRIALING = 'trialing',\n}\n\nexport interface CreatePaymentOptions {\n /** Amount in smallest currency unit (e.g., cents) */\n amount: number;\n /** Currency code (e.g., USD, EUR, INR) */\n currency: string;\n /** Payment method */\n paymentMethod: PaymentMethod;\n /** Customer ID */\n customerId: string;\n /** Description */\n description?: string;\n /** Metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface Payment {\n id: string;\n amount: number;\n currency: string;\n status: PaymentStatus;\n paymentMethod: PaymentMethod;\n customerId: string;\n description?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n transactionId?: string;\n failureReason?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateSubscriptionOptions {\n /** Customer ID */\n customerId: string;\n /** Plan ID */\n planId: string;\n /** Payment method */\n paymentMethod: PaymentMethod;\n /** Trial period in days */\n trialDays?: number;\n /** Metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface Subscription {\n id: string;\n customerId: string;\n planId: string;\n status: SubscriptionStatus;\n currentPeriodStart: string;\n currentPeriodEnd: string;\n trialEnd?: string;\n cancelledAt?: string;\n endedAt?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Plan {\n id: string;\n name: string;\n description?: string;\n amount: number;\n currency: string;\n interval: 'day' | 'week' | 'month' | 'year';\n intervalCount: number;\n features?: string[];\n metadata?: Record<string, unknown>;\n active: boolean;\n createdAt: string;\n}\n\nexport interface GetPaymentsOptions {\n customerId?: string;\n status?: PaymentStatus;\n workspaceId?: string;\n organizationId?: string;\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Payments Module\n */\nexport class PaymentsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create payment\n */\n public async createPayment(options: CreatePaymentOptions): Promise<Payment> {\n // Validate inputs\n if (typeof options.amount !== 'number' || options.amount <= 0) {\n throw new ValidationError('Amount must be a positive number');\n }\n\n if (!options.currency) {\n throw new ValidationError('Currency is required');\n }\n\n if (!options.paymentMethod) {\n throw new ValidationError('Payment method is required');\n }\n\n if (!options.customerId) {\n throw new ValidationError('Customer ID is required');\n }\n\n logger.debug('[Payments] Creating payment', {\n amount: options.amount,\n currency: options.currency,\n customerId: options.customerId,\n });\n\n const mutation = `\n mutation CreatePayment($input: CreatePaymentInput!) {\n createPayment(input: $input) {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n description\n metadata\n workspaceId\n organizationId\n transactionId\n failureReason\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n amount: options.amount,\n currency: options.currency,\n paymentMethod: options.paymentMethod,\n customerId: options.customerId,\n description: options.description,\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<{ createPayment: Payment }>(mutation, variables, this.context);\n\n logger.info('[Payments] Payment created', { paymentId: response.createPayment.id });\n\n return response.createPayment;\n }\n\n /**\n * Get payment by ID\n */\n public async getPayment(paymentId: string): Promise<Payment> {\n logger.debug('[Payments] Getting payment', { paymentId });\n\n const query = `\n query GetPayment($paymentId: ID!) {\n getPayment(paymentId: $paymentId) {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n description\n metadata\n workspaceId\n organizationId\n transactionId\n failureReason\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getPayment: Payment }>(query, { paymentId }, this.context);\n\n return response.getPayment;\n }\n\n /**\n * Get payments with filters\n */\n public async getPayments(options: GetPaymentsOptions): Promise<{\n payments: Payment[];\n total: number;\n }> {\n logger.debug('[Payments] Getting payments', options);\n\n const query = `\n query GetPayments(\n $customerId: ID\n $status: PaymentStatus\n $workspaceId: ID\n $organizationId: ID\n $startDate: DateTime\n $endDate: DateTime\n $limit: Int\n $offset: Int\n ) {\n getPayments(\n customerId: $customerId\n status: $status\n workspaceId: $workspaceId\n organizationId: $organizationId\n startDate: $startDate\n endDate: $endDate\n limit: $limit\n offset: $offset\n ) {\n payments {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n description\n transactionId\n createdAt\n updatedAt\n }\n total\n }\n }\n `;\n\n const variables = {\n customerId: options.customerId,\n status: options.status,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n startDate: options.startDate,\n endDate: options.endDate,\n limit: options.limit || 50,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getPayments: {\n payments: Payment[];\n total: number;\n };\n }>(query, variables, this.context);\n\n return response.getPayments;\n }\n\n /**\n * Refund payment\n */\n public async refundPayment(paymentId: string, amount?: number, reason?: string): Promise<Payment> {\n logger.debug('[Payments] Refunding payment', { paymentId, amount });\n\n const mutation = `\n mutation RefundPayment($paymentId: ID!, $amount: Int, $reason: String) {\n refundPayment(paymentId: $paymentId, amount: $amount, reason: $reason) {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n failureReason\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ refundPayment: Payment }>(\n mutation,\n { paymentId, amount, reason },\n this.context\n );\n\n logger.info('[Payments] Payment refunded', { paymentId });\n\n return response.refundPayment;\n }\n\n /**\n * Verify payment\n */\n public async verifyPayment(\n paymentId: string,\n verificationData: Record<string, unknown>\n ): Promise<{\n verified: boolean;\n status: PaymentStatus;\n }> {\n logger.debug('[Payments] Verifying payment', { paymentId });\n\n const mutation = `\n mutation VerifyPayment($paymentId: ID!, $verificationData: JSON!) {\n verifyPayment(paymentId: $paymentId, verificationData: $verificationData) {\n verified\n status\n }\n }\n `;\n\n const response = await this.client.query<{\n verifyPayment: {\n verified: boolean;\n status: PaymentStatus;\n };\n }>(mutation, { paymentId, verificationData }, this.context);\n\n logger.info('[Payments] Payment verified', {\n paymentId,\n verified: response.verifyPayment.verified,\n });\n\n return response.verifyPayment;\n }\n\n /**\n * Create subscription\n */\n public async createSubscription(options: CreateSubscriptionOptions): Promise<Subscription> {\n if (!options.customerId) {\n throw new ValidationError('Customer ID is required');\n }\n\n if (!options.planId) {\n throw new ValidationError('Plan ID is required');\n }\n\n if (!options.paymentMethod) {\n throw new ValidationError('Payment method is required');\n }\n\n logger.debug('[Payments] Creating subscription', {\n customerId: options.customerId,\n planId: options.planId,\n });\n\n const mutation = `\n mutation CreateSubscription($input: CreateSubscriptionInput!) {\n createSubscription(input: $input) {\n id\n customerId\n planId\n status\n currentPeriodStart\n currentPeriodEnd\n trialEnd\n cancelledAt\n endedAt\n metadata\n workspaceId\n organizationId\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n customerId: options.customerId,\n planId: options.planId,\n paymentMethod: options.paymentMethod,\n trialDays: options.trialDays,\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<{ createSubscription: Subscription }>(mutation, variables, this.context);\n\n logger.info('[Payments] Subscription created', { subscriptionId: response.createSubscription.id });\n\n return response.createSubscription;\n }\n\n /**\n * Get subscription\n */\n public async getSubscription(subscriptionId: string): Promise<Subscription> {\n logger.debug('[Payments] Getting subscription', { subscriptionId });\n\n const query = `\n query GetSubscription($subscriptionId: ID!) {\n getSubscription(subscriptionId: $subscriptionId) {\n id\n customerId\n planId\n status\n currentPeriodStart\n currentPeriodEnd\n trialEnd\n cancelledAt\n endedAt\n metadata\n workspaceId\n organizationId\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getSubscription: Subscription }>(\n query,\n { subscriptionId },\n this.context\n );\n\n return response.getSubscription;\n }\n\n /**\n * Cancel subscription\n */\n public async cancelSubscription(subscriptionId: string, cancelAtPeriodEnd = false): Promise<Subscription> {\n logger.debug('[Payments] Cancelling subscription', {\n subscriptionId,\n cancelAtPeriodEnd,\n });\n\n const mutation = `\n mutation CancelSubscription($subscriptionId: ID!, $cancelAtPeriodEnd: Boolean!) {\n cancelSubscription(subscriptionId: $subscriptionId, cancelAtPeriodEnd: $cancelAtPeriodEnd) {\n id\n status\n cancelledAt\n endedAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ cancelSubscription: Subscription }>(\n mutation,\n { subscriptionId, cancelAtPeriodEnd },\n this.context\n );\n\n logger.info('[Payments] Subscription cancelled', { subscriptionId });\n\n return response.cancelSubscription;\n }\n\n /**\n * Get customer subscriptions\n */\n public async getCustomerSubscriptions(customerId: string): Promise<Subscription[]> {\n logger.debug('[Payments] Getting customer subscriptions', { customerId });\n\n const query = `\n query GetCustomerSubscriptions($customerId: ID!) {\n getCustomerSubscriptions(customerId: $customerId) {\n id\n customerId\n planId\n status\n currentPeriodStart\n currentPeriodEnd\n trialEnd\n cancelledAt\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getCustomerSubscriptions: Subscription[] }>(\n query,\n { customerId },\n this.context\n );\n\n return response.getCustomerSubscriptions;\n }\n\n /**\n * Get plans\n */\n public async getPlans(activeOnly = true): Promise<Plan[]> {\n logger.debug('[Payments] Getting plans', { activeOnly });\n\n const query = `\n query GetPlans($activeOnly: Boolean!) {\n getPlans(activeOnly: $activeOnly) {\n id\n name\n description\n amount\n currency\n interval\n intervalCount\n features\n metadata\n active\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getPlans: Plan[] }>(query, { activeOnly }, this.context);\n\n return response.getPlans;\n }\n\n /**\n * Create payment intent\n */\n public async createPaymentIntent(options: {\n amount: number;\n currency: string;\n customerId: string;\n paymentMethod?: PaymentMethod;\n metadata?: Record<string, unknown>;\n }): Promise<{\n clientSecret: string;\n paymentIntentId: string;\n }> {\n logger.debug('[Payments] Creating payment intent', {\n amount: options.amount,\n currency: options.currency,\n });\n\n const mutation = `\n mutation CreatePaymentIntent($input: CreatePaymentIntentInput!) {\n createPaymentIntent(input: $input) {\n clientSecret\n paymentIntentId\n }\n }\n `;\n\n const response = await this.client.query<{\n createPaymentIntent: {\n clientSecret: string;\n paymentIntentId: string;\n };\n }>(mutation, { input: options }, this.context);\n\n logger.info('[Payments] Payment intent created', {\n paymentIntentId: response.createPaymentIntent.paymentIntentId,\n });\n\n return response.createPaymentIntent;\n }\n\n /**\n * Get payment statistics\n */\n public async getPaymentStats(options?: { startDate?: string; endDate?: string; workspaceId?: string }): Promise<{\n totalRevenue: number;\n totalPayments: number;\n successfulPayments: number;\n failedPayments: number;\n refundedAmount: number;\n averagePaymentAmount: number;\n }> {\n logger.debug('[Payments] Getting payment statistics', options);\n\n const query = `\n query GetPaymentStats($startDate: DateTime, $endDate: DateTime, $workspaceId: ID) {\n getPaymentStats(startDate: $startDate, endDate: $endDate, workspaceId: $workspaceId) {\n totalRevenue\n totalPayments\n successfulPayments\n failedPayments\n refundedAmount\n averagePaymentAmount\n }\n }\n `;\n\n const response = await this.client.query<{\n getPaymentStats: {\n totalRevenue: number;\n totalPayments: number;\n successfulPayments: number;\n failedPayments: number;\n refundedAmount: number;\n averagePaymentAmount: number;\n };\n }>(\n query,\n {\n startDate: options?.startDate,\n endDate: options?.endDate,\n workspaceId: options?.workspaceId || this.context.workspaceId,\n },\n this.context\n );\n\n return response.getPaymentStats;\n }\n}\n","/**\n * Bootstrap Module\n * Helpers for bootstrapping server, loading modules, and setting up schemas\n */\n\nimport { logger } from '../logger/index.js';\nimport { DatabaseModule, type DatabaseConfig } from '../database/index.js';\nimport { ContextManager } from '../context/index.js';\nimport type { SDKConfig, SDKContext } from '../types/index.js';\n\n/**\n * Type for HTTP header values\n */\ntype HeaderValue = string | string[] | undefined;\n\nexport interface BootstrapConfig extends SDKConfig {\n /** Database configuration */\n database?: DatabaseConfig;\n /** Enable health checks */\n healthCheck?: boolean;\n /** Health check interval in milliseconds */\n healthCheckInterval?: number;\n /** Modules to load */\n modules?: string[];\n /** Environment */\n environment?: 'development' | 'staging' | 'production';\n /** Service name */\n serviceName?: string;\n /** Service version */\n serviceVersion?: string;\n /** Port to run health check server */\n healthCheckPort?: number;\n}\n\nexport interface BootstrapResult {\n success: boolean;\n serviceName: string;\n serviceVersion: string;\n environment: string;\n startedAt: string;\n modules: string[];\n databaseConnected: boolean;\n healthCheckEnabled: boolean;\n}\n\nexport interface BootstrapHealthCheckResult {\n healthy: boolean;\n checks: {\n database?: boolean;\n graphql?: boolean;\n memory?: {\n used: number;\n total: number;\n percentage: number;\n };\n uptime?: number;\n };\n timestamp: string;\n}\n\n/**\n * Bootstrap Module\n */\nexport class BootstrapModule {\n private config: BootstrapConfig;\n private startTime: Date;\n private healthCheckInterval?: NodeJS.Timeout;\n\n constructor(config: BootstrapConfig) {\n this.config = config;\n this.startTime = new Date();\n }\n\n /**\n * Bootstrap the application\n */\n public async bootstrap(): Promise<BootstrapResult> {\n logger.info('[Bootstrap] Starting application bootstrap', {\n serviceName: this.config.serviceName,\n environment: this.config.environment || 'development',\n });\n\n try {\n // 1. Validate configuration\n await this.validateConfiguration();\n\n // 2. Connect to database\n const databaseConnected = await this.connectDatabase();\n\n // 3. Load modules\n const loadedModules = await this.loadModules();\n\n // 4. Setup health checks\n if (this.config.healthCheck) {\n await this.setupHealthChecks();\n }\n\n // 5. Setup signal handlers\n this.setupSignalHandlers();\n\n const result: BootstrapResult = {\n success: true,\n serviceName: this.config.serviceName || 'burdenoff-service',\n serviceVersion: this.config.serviceVersion || '1.0.0',\n environment: this.config.environment || 'development',\n startedAt: this.startTime.toISOString(),\n modules: loadedModules,\n databaseConnected,\n healthCheckEnabled: this.config.healthCheck || false,\n };\n\n logger.info('[Bootstrap] Application bootstrapped successfully', result);\n\n return result;\n } catch (error) {\n logger.error('[Bootstrap] Failed to bootstrap application', { error });\n throw error;\n }\n }\n\n /**\n * Validate configuration\n */\n private async validateConfiguration(): Promise<void> {\n logger.debug('[Bootstrap] Validating configuration');\n\n if (!this.config.workspacesApiUrl) {\n throw new Error('Workspaces API URL is required');\n }\n\n if (this.config.database?.url && !DatabaseModule.validateDatabaseUrl(this.config.database.url)) {\n throw new Error('Invalid database URL');\n }\n\n logger.debug('[Bootstrap] Configuration validated');\n }\n\n /**\n * Connect to database\n */\n private async connectDatabase(): Promise<boolean> {\n if (!this.config.database) {\n logger.debug('[Bootstrap] No database configuration provided, skipping');\n return false;\n }\n\n logger.info('[Bootstrap] Connecting to database');\n\n try {\n // Database connection is typically handled by Prisma or other ORM\n // This is a placeholder for validation and logging\n const sanitizedUrl = DatabaseModule.sanitizeDatabaseUrl(this.config.database.url);\n logger.info('[Bootstrap] Database connection configured', { url: sanitizedUrl });\n\n return true;\n } catch (error) {\n logger.error('[Bootstrap] Failed to connect to database', { error });\n return false;\n }\n }\n\n /**\n * Load modules\n */\n private async loadModules(): Promise<string[]> {\n const modules = this.config.modules || [];\n\n if (modules.length === 0) {\n logger.debug('[Bootstrap] No modules to load');\n return [];\n }\n\n logger.info('[Bootstrap] Loading modules', { modules });\n\n const loadedModules: string[] = [];\n\n for (const moduleName of modules) {\n try {\n logger.debug(`[Bootstrap] Loading module: ${moduleName}`);\n // Module loading logic would go here\n loadedModules.push(moduleName);\n } catch (error) {\n logger.error(`[Bootstrap] Failed to load module: ${moduleName}`, { error });\n }\n }\n\n logger.info('[Bootstrap] Modules loaded', { loaded: loadedModules });\n\n return loadedModules;\n }\n\n /**\n * Setup health checks\n */\n private async setupHealthChecks(): Promise<void> {\n logger.info('[Bootstrap] Setting up health checks');\n\n const interval = this.config.healthCheckInterval || 30000; // 30 seconds\n\n this.healthCheckInterval = setInterval(() => {\n void (async () => {\n const health = await this.performHealthCheck();\n\n if (!health.healthy) {\n logger.warn('[Bootstrap] Health check failed', health);\n } else {\n logger.debug('[Bootstrap] Health check passed', health);\n }\n })();\n }, interval);\n\n logger.info('[Bootstrap] Health checks configured', { interval });\n }\n\n /**\n * Perform health check\n */\n public async performHealthCheck(): Promise<BootstrapHealthCheckResult> {\n const checks: BootstrapHealthCheckResult['checks'] = {};\n\n // Memory check\n const memUsage = process.memoryUsage();\n checks.memory = {\n used: memUsage.heapUsed,\n total: memUsage.heapTotal,\n percentage: (memUsage.heapUsed / memUsage.heapTotal) * 100,\n };\n\n // Uptime\n checks.uptime = Math.floor((Date.now() - this.startTime.getTime()) / 1000);\n\n // Determine overall health\n const healthy =\n checks.memory.percentage < 90 && // Less than 90% memory usage\n checks.uptime > 0;\n\n return {\n healthy,\n checks,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Setup signal handlers for graceful shutdown\n */\n private setupSignalHandlers(): void {\n logger.debug('[Bootstrap] Setting up signal handlers');\n\n const gracefulShutdown = async (signal: string): Promise<void> => {\n logger.info(`[Bootstrap] Received ${signal}, shutting down gracefully`);\n\n // Clear health check interval\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n }\n\n // Perform cleanup\n await this.cleanup();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => {\n void gracefulShutdown('SIGTERM');\n });\n process.on('SIGINT', () => {\n void gracefulShutdown('SIGINT');\n });\n\n process.on('unhandledRejection', (reason, promise) => {\n logger.error('[Bootstrap] Unhandled rejection', {\n reason,\n promise,\n });\n });\n\n process.on('uncaughtException', (error) => {\n logger.error('[Bootstrap] Uncaught exception', { error });\n process.exit(1);\n });\n }\n\n /**\n * Cleanup on shutdown\n */\n private async cleanup(): Promise<void> {\n logger.info('[Bootstrap] Performing cleanup');\n\n // Clear context\n ContextManager.clearContext();\n\n logger.info('[Bootstrap] Cleanup completed');\n }\n\n /**\n * Get application info\n */\n public getInfo(): {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n uptime: number;\n startedAt: string;\n } {\n return {\n serviceName: this.config.serviceName || 'burdenoff-service',\n serviceVersion: this.config.serviceVersion || '1.0.0',\n environment: this.config.environment || 'development',\n uptime: Math.floor((Date.now() - this.startTime.getTime()) / 1000),\n startedAt: this.startTime.toISOString(),\n };\n }\n\n /**\n * Setup default context\n */\n public setupDefaultContext(context: SDKContext): void {\n logger.debug('[Bootstrap] Setting up default context', context);\n ContextManager.setContext(context);\n }\n\n /**\n * Create context middleware (for Elysia/HTTP frameworks)\n */\n public createContextMiddleware() {\n return async (\n req: { headers: Record<string, HeaderValue>; user?: unknown },\n _res: unknown,\n next: () => void\n ): Promise<void> => {\n const context = this.extractContextFromRequest(\n req as {\n headers: Record<string, HeaderValue>;\n user?: { user_id?: string; workspace_id?: string; org_id?: string; tenant_endpoint?: string };\n }\n );\n ContextManager.setContext(context);\n next();\n };\n }\n\n /**\n * Extract context from request\n */\n private extractContextFromRequest(req: {\n headers: Record<string, string | string[] | undefined>;\n user?: { user_id?: string; workspace_id?: string; org_id?: string; tenant_endpoint?: string };\n }): SDKContext {\n const context: SDKContext = {};\n\n // Extract from user object (if JWT already verified)\n if (req.user) {\n context.actorId = req.user.user_id;\n context.workspaceId = req.user.workspace_id;\n context.tenantId = req.user.tenant_endpoint;\n }\n\n // Extract from headers\n const getHeader = (key: string): string | undefined => {\n const value = req.headers[key.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n };\n\n const authHeader = getHeader('authorization');\n if (authHeader) {\n context.token = authHeader.replace('Bearer ', '');\n }\n\n const workspaceId = getHeader('x-workspace-id');\n if (workspaceId && !context.workspaceId) {\n context.workspaceId = workspaceId;\n }\n\n const productId = getHeader('x-product-id');\n if (productId) {\n context.productId = productId;\n }\n\n const projectId = getHeader('x-project-id');\n if (projectId) {\n context.projectId = projectId;\n }\n\n const appId = getHeader('x-app-id');\n if (appId) {\n context.appId = appId;\n }\n\n // Cloudflare Access service token — captured so cross-layer calls can\n // re-present it on alpha (see ContextManager.getCfAccessHeaders). Kept in\n // sync with the canonical extractor in `src/context/index.ts`. Setting it\n // via ContextManager.setContext (see createContextMiddleware) also mirrors\n // it to the module-level fallback for Bun + Yoga.\n const cfAccessClientId = getHeader('cf-access-client-id');\n if (cfAccessClientId) {\n context.cfAccessClientId = cfAccessClientId;\n }\n\n const cfAccessClientSecret = getHeader('cf-access-client-secret');\n if (cfAccessClientSecret) {\n context.cfAccessClientSecret = cfAccessClientSecret;\n }\n\n // Cloudflare Access user-SSO cookie, forwarded by the public gateway as\n // x-cf-authorization. Re-presented as the CF_Authorization cookie on\n // cross-layer calls (see ContextManager.getCfAccessHeaders). See BOFF-2929.\n const cfAuthorization = getHeader('x-cf-authorization');\n if (cfAuthorization) {\n context.cfAuthorization = cfAuthorization;\n }\n\n return context;\n }\n\n /**\n * Load GraphQL schema\n */\n public async loadSchema(schemaPath: string): Promise<boolean> {\n logger.info('[Bootstrap] Loading GraphQL schema', { schemaPath });\n\n try {\n // Schema loading logic would go here\n // This is typically handled by the GraphQL server setup\n logger.info('[Bootstrap] Schema loaded successfully');\n return true;\n } catch (error) {\n logger.error('[Bootstrap] Failed to load schema', { error });\n return false;\n }\n }\n\n /**\n * Register shutdown hook\n */\n public onShutdown(callback: () => Promise<void> | void): void {\n const originalHandler = process.listeners('SIGTERM')[0] as (() => void) | undefined;\n\n process.removeAllListeners('SIGTERM');\n process.on('SIGTERM', () => {\n void (async () => {\n await callback();\n if (typeof originalHandler === 'function') {\n originalHandler();\n }\n })();\n });\n }\n\n /**\n * Check if application is ready\n */\n public async isReady(): Promise<boolean> {\n const health = await this.performHealthCheck();\n return health.healthy;\n }\n\n /**\n * Get metrics\n */\n public getMetrics(): {\n memory: NodeJS.MemoryUsage;\n uptime: number;\n cpu: NodeJS.CpuUsage;\n } {\n return {\n memory: process.memoryUsage(),\n uptime: Math.floor((Date.now() - this.startTime.getTime()) / 1000),\n cpu: process.cpuUsage(),\n };\n }\n}\n\n/**\n * Create bootstrap instance\n */\nexport function createBootstrap(config: BootstrapConfig): BootstrapModule {\n return new BootstrapModule(config);\n}\n","/**\n * Tenant Backend Client\n * Centralized client for accessing tenant-backend services (notifications, auth, etc.)\n *\n * This is a reusable utility that can be used by any backend to communicate with tenant-backend.\n */\n\nimport { BurdenoffGraphQLClient } from './graphql.js';\nimport { TenantNotificationsModule } from '../notifications/tenant-notifications.js';\nimport { logger } from '../logger/index.js';\nimport type { SDKConfig } from '../types/index.js';\n\nexport interface TenantBackendClientConfig {\n /** Tenant backend GraphQL URL */\n tenantBackendUrl: string;\n /** Workspaces backend GraphQL URL (for SDK initialization) */\n workspacesBackendUrl?: string;\n /** Optional API key for tenant backend authentication */\n apiKey?: string;\n}\n\n/**\n * Tenant Backend Client\n * Provides access to centralized tenant-backend services using be-sdk\n *\n * @example\n * ```typescript\n * import { TenantBackendClient } from '@burdenoff/be-sdk';\n *\n * const client = new TenantBackendClient({\n * tenantBackendUrl: process.env.GLOBAL_INT_GATEWAY_URL!,\n * workspacesBackendUrl: process.env.WORKSPACES_BACKEND_URL,\n * apiKey: process.env.TENANT_BACKEND_API_KEY,\n * });\n *\n * // Send notification\n * await client.notifications.sendWithTemplate({\n * templateSlug: 'user-welcome',\n * recipients: ['user@example.com'],\n * variables: { userName: 'John' },\n * });\n *\n * // Execute raw query\n * const result = await client.query(`\n * query GetUser($id: ID!) {\n * user(id: $id) { id name email }\n * }\n * `, { id: 'user-123' });\n * ```\n */\nexport class TenantBackendClient {\n private graphqlClient: BurdenoffGraphQLClient;\n private config: TenantBackendClientConfig;\n\n /** Notifications module for sending notifications via tenant backend */\n public readonly notifications: TenantNotificationsModule;\n\n constructor(config: TenantBackendClientConfig) {\n this.config = config;\n\n // Build SDK config\n const sdkConfig: SDKConfig = {\n workspacesApiUrl: config.workspacesBackendUrl || 'http://localhost:4000/graphql',\n tenantApiUrl: config.tenantBackendUrl,\n };\n\n // Initialize GraphQL client\n this.graphqlClient = new BurdenoffGraphQLClient(sdkConfig, {});\n\n // Initialize notifications module with empty context (context will be set per request)\n this.notifications = new TenantNotificationsModule(this.graphqlClient, {});\n\n logger.info('[TenantBackend] Client initialized using be-sdk', {\n tenantUrl: config.tenantBackendUrl,\n workspacesUrl: config.workspacesBackendUrl,\n hasApiKey: !!config.apiKey,\n });\n }\n\n /**\n * Update authentication token\n *\n * @param token - JWT token for authentication\n */\n public setAuthToken(token: string): void {\n this.graphqlClient.updateContext({ token });\n logger.debug('[TenantBackend] Authentication token updated');\n }\n\n /**\n * Execute raw GraphQL query against tenant backend\n *\n * @param query - GraphQL query string\n * @param variables - Query variables\n * @returns Query result\n *\n * @example\n * ```typescript\n * const result = await client.query(`\n * query GetTemplate($slug: String!) {\n * notificationTemplate(slug: $slug) {\n * id\n * slug\n * subject\n * }\n * }\n * `, { slug: 'user-welcome' });\n * ```\n */\n public async query<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n return this.graphqlClient.tenantQuery<T>(query, variables);\n }\n\n /**\n * Health check\n *\n * @returns True if tenant backend is reachable, false otherwise\n */\n public async healthCheck(): Promise<boolean> {\n try {\n const query = `\n query HealthCheck {\n __typename\n }\n `;\n await this.graphqlClient.tenantQuery(query);\n return true;\n } catch (error) {\n logger.error('[TenantBackend] Health check failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n }\n\n /**\n * Get GraphQL client for advanced usage\n *\n * @returns Underlying BurdenoffGraphQLClient\n */\n public getClient(): BurdenoffGraphQLClient {\n return this.graphqlClient;\n }\n\n /**\n * Get client configuration\n *\n * @returns Client configuration\n */\n public getConfig(): TenantBackendClientConfig {\n return { ...this.config };\n }\n}\n\n/**\n * Create a TenantBackendClient instance\n *\n * @param config - Client configuration\n * @returns TenantBackendClient instance\n *\n * @example\n * ```typescript\n * import { createTenantBackendClient } from '@burdenoff/be-sdk';\n *\n * const client = createTenantBackendClient({\n * tenantBackendUrl: process.env.GLOBAL_INT_GATEWAY_URL!,\n * });\n * ```\n */\nexport function createTenantBackendClient(config: TenantBackendClientConfig): TenantBackendClient {\n return new TenantBackendClient(config);\n}\n","/**\n * Burdenoff Backend SDK\n * Comprehensive SDK for all Burdenoff products\n *\n * @packageDocumentation\n */\n\nimport { BurdenoffGraphQLClient } from './client/graphql.js';\nimport type { SDKConfig, SDKContext } from './types/index.js';\nimport type { Logger } from './logger/index.js';\nimport { logger } from './logger/index.js';\nimport { ContextManager } from './context/index.js';\nimport { AuthModule } from './auth/index.js';\nimport { NotificationsModule } from './notifications/index.js';\nimport { TenantNotificationsModule } from './notifications/tenant-notifications.js';\nimport { RBACModule } from './rbac/index.js';\nimport { ActivityModule } from './activity/index.js';\nimport { UsageModule } from './usage/index.js';\nimport { TrackerModule } from './tracker/index.js';\nimport { DatabaseModule } from './database/index.js';\nimport { EventsModule, EventQueueFactory, QueueType } from './event-queue/index.js';\nimport type { IEventPublisher, PublisherConfig } from './event-queue/index.js';\nimport { GraphModule } from './graph/index.js';\nimport { SearchModule } from './search/index.js';\nimport { TranslationModule } from './translation/index.js';\nimport { PaymentsModule } from './payments/index.js';\nimport type { BootstrapModule } from './bootstrap/index.js';\nimport { createBootstrap } from './bootstrap/index.js';\n// Temporal is lazy-loaded to avoid requiring @temporalio/client when not used\nimport type { TemporalModule } from './temporal/index.js';\n\n/**\n * Main Burdenoff SDK class\n *\n * @example\n * ```typescript\n * import { BurdenoffSDK } from '@burdenoff/be-sdk';\n *\n * const sdk = new BurdenoffSDK({\n * workspacesApiUrl: 'https://api.burdenoff.com/graphql',\n * timeout: 30000,\n * });\n *\n * // Use the unified tracker (most common use case)\n * const result = await sdk.tracker.track({\n * userId: 'user123',\n * action: 'create_project',\n * resourceType: 'project',\n * usage: {\n * metricType: UsageMetricType.PROJECTS,\n * amount: 1,\n * },\n * });\n * ```\n */\nexport class BurdenoffSDK {\n private client: BurdenoffGraphQLClient;\n private defaultContext: SDKContext;\n\n // Event queue publisher state (Redis Streams)\n private eventPublisher: IEventPublisher | null = null;\n private eventPublisherInitPromise: Promise<void> | null = null;\n private eventQueueConfig: import('./types/index.js').EventQueueSDKConfig | null = null;\n\n // Initialization state\n private initializationPromise: Promise<void> | null = null;\n private isShuttingDown = false;\n\n /** Authentication module */\n public readonly auth: AuthModule;\n\n /** Notifications module (workspaces-backend) */\n public readonly notifications: NotificationsModule;\n\n /** Tenant Notifications module (tenant-backend - RECOMMENDED) */\n public readonly tenantNotifications: TenantNotificationsModule;\n\n /** RBAC module */\n public readonly rbac: RBACModule;\n\n /** Activity tracking module */\n public readonly activity: ActivityModule;\n\n /** Usage & Quota module */\n public readonly usage: UsageModule;\n\n /** Unified Tracker module (MOST IMPORTANT - use this for most operations) */\n public readonly tracker: TrackerModule;\n\n /** Database helpers module */\n public readonly database: typeof DatabaseModule;\n\n /** Events/Queue module */\n public readonly events: EventsModule;\n\n /** Graph integration module */\n public readonly graph: GraphModule;\n\n /** Search module */\n public readonly search: SearchModule;\n\n /** Translation module */\n public readonly translation: TranslationModule;\n\n /** Payments module */\n public readonly payments: PaymentsModule;\n\n /** Temporal workflow orchestration module (lazy-loaded) */\n private _temporal: TemporalModule | null = null;\n private _temporalPromise: Promise<TemporalModule> | null = null;\n private _temporalConfig: { moduleType?: string; address?: string; namespace?: string; taskQueue?: string } | null =\n null;\n\n /**\n * Get Temporal workflow orchestration module (lazy-loaded)\n * Only loads @temporalio/client when this method is called\n *\n * @returns Promise resolving to TemporalModule\n * @example\n * ```typescript\n * const temporal = await sdk.getTemporalModule();\n * await temporal.startWorkflow('myWorkflow', { ... });\n * ```\n */\n public async getTemporalModule(): Promise<TemporalModule> {\n if (this._temporal) {\n return this._temporal;\n }\n\n if (!this._temporalPromise) {\n this._temporalPromise = this.loadTemporalModule();\n }\n\n return this._temporalPromise;\n }\n\n /**\n * Load temporal module dynamically\n * @private\n */\n private async loadTemporalModule(): Promise<TemporalModule> {\n const { TemporalModule: TM } = (await import('./temporal/index.js')) as { TemporalModule: typeof TemporalModule };\n this._temporal = this._temporalConfig?.moduleType\n ? new TM({\n moduleType: this._temporalConfig.moduleType as 'workspace' | 'tenant',\n address: this._temporalConfig.address,\n namespace: this._temporalConfig.namespace,\n taskQueue: this._temporalConfig.taskQueue,\n })\n : TM.fromEnv();\n return this._temporal;\n }\n\n /** Logger instance */\n public readonly logger: Logger;\n\n /** Context manager */\n public readonly context: typeof ContextManager;\n\n /**\n * Create SDK instance\n */\n constructor(config: SDKConfig, defaultContext: SDKContext = {}) {\n // Initialize client\n this.client = new BurdenoffGraphQLClient(config, defaultContext);\n this.defaultContext = defaultContext;\n\n // Initialize logger\n this.logger = logger;\n if (config.logger) {\n this.logger.setLevel(config.logger.level);\n this.logger.setConsoleEnabled(config.logger.console);\n if (config.logger.transport) {\n this.logger.addTransport(config.logger.transport);\n }\n }\n\n // Initialize context manager\n this.context = ContextManager;\n if (Object.keys(defaultContext).length > 0) {\n ContextManager.setContext(defaultContext);\n }\n\n // Initialize all modules\n this.auth = new AuthModule(this.client, defaultContext);\n this.notifications = new NotificationsModule(this.client, defaultContext);\n this.tenantNotifications = new TenantNotificationsModule(this.client, defaultContext);\n this.rbac = new RBACModule(this.client, defaultContext);\n this.activity = new ActivityModule(this.client, defaultContext);\n this.usage = new UsageModule(this.client, defaultContext);\n this.tracker = new TrackerModule(this.client, defaultContext);\n this.database = DatabaseModule;\n this.events = new EventsModule(this.client, defaultContext);\n this.graph = new GraphModule(this.client, defaultContext);\n this.search = new SearchModule(this.client, defaultContext);\n this.translation = new TranslationModule(this.client, defaultContext);\n this.payments = new PaymentsModule(this.client, defaultContext);\n\n // Store Temporal configuration for lazy loading (avoids requiring @temporalio/client when not used)\n if (config.temporalModuleType) {\n this._temporalConfig = {\n moduleType: config.temporalModuleType,\n address: config.temporalAddress,\n namespace: config.temporalNamespace,\n taskQueue: config.temporalTaskQueue,\n };\n }\n\n // Store event queue configuration. Auto-enabled when REDIS_URL is set\n // even if no explicit config block is provided.\n if (config.eventQueue || process.env['REDIS_URL']) {\n this.eventQueueConfig = {\n autoConnect: true,\n maxReconnectAttempts: -1,\n reconnectTimeWait: 2000,\n ...config.eventQueue,\n };\n }\n\n logger.info('[SDK] Burdenoff SDK initialized', {\n workspacesApiUrl: config.workspacesApiUrl,\n tenantApiUrl: config.tenantApiUrl,\n hasDefaultContext: Object.keys(defaultContext).length > 0,\n hasEventQueueConfig: !!this.eventQueueConfig,\n hasTemporalConfig: !!config.temporalModuleType,\n });\n\n // Schedule background initialization outside the constructor\n // This defers async work to after constructor completes (satisfies no-async-constructor)\n this.scheduleBackgroundInit();\n }\n\n /**\n * Schedule background initialization outside constructor\n * Uses queueMicrotask to defer async work while maintaining initialization order\n * @private\n */\n private scheduleBackgroundInit(): void {\n queueMicrotask(() => {\n this.initializationPromise = this.initializeAsync();\n });\n }\n\n /**\n * Update SDK context\n */\n public setContext(context: SDKContext): void {\n this.defaultContext = { ...this.defaultContext, ...context };\n this.client.updateContext(context);\n ContextManager.setContext(this.defaultContext);\n }\n\n /**\n * Get current context\n */\n public getContext(): SDKContext | undefined {\n return ContextManager.getContext();\n }\n\n /**\n * Run function with specific context\n */\n public async withContext<T>(context: SDKContext, fn: () => Promise<T>): Promise<T> {\n return ContextManager.withContext(context, fn);\n }\n\n /**\n * Background initialization for event queue and other async resources\n * @private\n */\n private async initializeAsync(): Promise<void> {\n const promises: Promise<void>[] = [];\n\n if (this.eventQueueConfig?.autoConnect) {\n promises.push(\n this.initializeEventQueue().catch((error) => {\n logger.warn('[SDK] Failed to auto-connect to Redis Streams', { error });\n })\n );\n }\n\n await Promise.allSettled(promises);\n }\n\n /**\n * Initialize the Redis Streams event publisher\n * @private\n */\n private async initializeEventQueue(): Promise<void> {\n if (!this.eventQueueConfig || this.eventPublisher) return;\n\n const url = this.eventQueueConfig.url || process.env['REDIS_URL'];\n if (!url) {\n logger.warn('[SDK] No REDIS_URL available — event publisher disabled');\n return;\n }\n\n const publisherConfig: PublisherConfig = {\n type: QueueType.REDIS_STREAMS,\n url,\n password: this.eventQueueConfig.password,\n name: this.eventQueueConfig.name || 'burdenoff-sdk-publisher',\n maxReconnectAttempts: this.eventQueueConfig.maxReconnectAttempts ?? -1,\n reconnectTimeWait: this.eventQueueConfig.reconnectTimeWait ?? 2000,\n };\n\n this.eventPublisher = EventQueueFactory.createPublisher(publisherConfig);\n await this.eventPublisher.connect();\n\n logger.info('[SDK] Redis Streams event publisher initialized', {\n url,\n name: this.eventQueueConfig.name,\n });\n }\n\n /**\n * Get the event publisher instance (lazy initialization).\n *\n * @example\n * ```typescript\n * const publisher = await sdk.getEventPublisher();\n * await publisher.publish({\n * subject: 'events.user.created',\n * data: { userId: 'user-123' }\n * });\n * ```\n */\n public async getEventPublisher(): Promise<IEventPublisher> {\n if (this.eventPublisher) return this.eventPublisher;\n if (!this.eventQueueConfig) {\n throw new Error('[SDK] Event queue not configured - set REDIS_URL or provide config.eventQueue');\n }\n\n if (!this.eventPublisherInitPromise) {\n this.eventPublisherInitPromise = this.initializeEventQueue();\n }\n await this.eventPublisherInitPromise;\n\n if (!this.eventPublisher) {\n throw new Error('[SDK] Event publisher initialization failed');\n }\n return this.eventPublisher;\n }\n\n /**\n * Wait for SDK initialization to complete\n *\n * @example\n * ```typescript\n * await sdk.waitForReady();\n * ```\n */\n public async waitForReady(): Promise<void> {\n if (this.initializationPromise) {\n await this.initializationPromise;\n }\n }\n\n /**\n * Check event queue (Redis Streams) health status\n *\n * @example\n * ```typescript\n * const health = await sdk.isEventQueueHealthy();\n * if (health.status === 'healthy') {\n * console.log('Event queue is connected');\n * }\n * ```\n */\n public async isEventQueueHealthy(): Promise<import('./types/index.js').EventQueueHealthStatus> {\n if (!this.eventQueueConfig) {\n return { status: 'not_configured', connected: false };\n }\n\n if (!this.eventPublisher) {\n return {\n status: 'unhealthy',\n connected: false,\n url: this.eventQueueConfig.url,\n details: { reason: 'Not initialized' },\n };\n }\n\n try {\n const healthCheck = await this.eventPublisher.healthCheck();\n return {\n status: healthCheck.status as 'healthy' | 'unhealthy',\n connected: this.eventPublisher.isConnected(),\n url: this.eventQueueConfig.url,\n details: healthCheck.details,\n };\n } catch (error) {\n return {\n status: 'unhealthy',\n connected: false,\n url: this.eventQueueConfig.url,\n details: { error: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n\n /**\n * Check Temporal health status\n *\n * @example\n * ```typescript\n * const health = await sdk.isTemporalHealthy();\n * if (health.status === 'healthy') {\n * console.log('Temporal is connected');\n * }\n * ```\n */\n public async isTemporalHealthy(): Promise<import('./types/index.js').TemporalHealthStatus> {\n // If temporal hasn't been loaded yet, it's not configured\n if (!this._temporal) {\n return { status: 'not_configured', connected: false };\n }\n\n const config = this._temporal.getConfig();\n\n if (!config.address) {\n return { status: 'not_configured', connected: false };\n }\n\n try {\n const client = this._temporal.getClient();\n // Use the public isClientConnected method\n const connected = client.isClientConnected();\n\n return {\n status: connected ? 'healthy' : 'unhealthy',\n connected: connected,\n address: config.address,\n namespace: config.namespace,\n details: { taskQueue: config.taskQueue },\n };\n } catch (error: unknown) {\n return {\n status: 'unhealthy',\n connected: false,\n address: config.address,\n namespace: config.namespace,\n details: { error: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n\n /**\n * Get overall SDK health status\n *\n * @example\n * ```typescript\n * const health = await sdk.getHealthStatus();\n * console.log('Event Queue:', health.eventQueue.status);\n * console.log('Temporal:', health.temporal.status);\n * ```\n */\n public async getHealthStatus(): Promise<import('./types/index.js').SDKHealthStatus> {\n const [eventQueue, temporal] = await Promise.all([this.isEventQueueHealthy(), this.isTemporalHealthy()]);\n return { eventQueue, temporal };\n }\n\n /**\n * Graceful shutdown - disconnect all resources\n *\n * @example\n * ```typescript\n * // On application shutdown\n * await sdk.shutdown({ timeout: 5000, force: true });\n * ```\n */\n public async shutdown(options: import('./types/index.js').SDKShutdownOptions = {}): Promise<void> {\n if (this.isShuttingDown) {\n logger.warn('[SDK] Shutdown already in progress');\n return;\n }\n this.isShuttingDown = true;\n\n const timeout = options.timeout ?? 5000;\n const force = options.force ?? true;\n\n logger.info('[SDK] Starting graceful shutdown', { timeout, force });\n\n const shutdownPromises: Promise<void>[] = [];\n\n if (this.eventPublisher) {\n shutdownPromises.push(\n this.eventPublisher.disconnect().catch((error) => {\n logger.error('[SDK] Error disconnecting event publisher', { error });\n })\n );\n }\n\n if (this._temporal) {\n shutdownPromises.push(\n this._temporal.disconnect().catch((error: unknown) => {\n logger.error('[SDK] Error disconnecting Temporal', { error });\n })\n );\n }\n\n try {\n await Promise.race([\n Promise.allSettled(shutdownPromises),\n new Promise((_, reject) => setTimeout(() => reject(new Error('[SDK] Shutdown timeout exceeded')), timeout)),\n ]);\n\n logger.info('[SDK] Shutdown completed successfully');\n } catch (error) {\n if (!force) {\n throw error;\n }\n logger.warn('[SDK] Shutdown timeout exceeded, forcing shutdown', { error });\n }\n }\n\n /**\n * Create bootstrap instance\n */\n public static createBootstrap(config: Parameters<typeof createBootstrap>[0]): BootstrapModule {\n return createBootstrap(config);\n }\n}\n\n// ============================================================================\n// Core SDK Exports (Top-level)\n// ============================================================================\n\nexport { BurdenoffGraphQLClient } from './client/graphql.js';\nexport { TenantBackendClient, createTenantBackendClient } from './client/tenant-backend.js';\nexport type { TenantBackendClientConfig } from './client/tenant-backend.js';\nexport {\n createInternalClient,\n createInternalClientForWorkspaces,\n createInternalClientForTenant,\n} from './client/internal-client.js';\nexport { ContextManager } from './context/index.js';\nexport { AuthModule } from './auth/index.js';\nexport { NotificationsModule } from './notifications/index.js';\nexport {\n RBACModule,\n createRBACDirective,\n createRBACDirectiveForLayer,\n createRBACDirectiveFromEnv,\n type RBACDirectiveConfig,\n type LayerAwareRBACConfig,\n} from './rbac/index.js';\nexport { ActivityModule } from './activity/index.js';\nexport { UsageModule } from './usage/index.js';\nexport { TrackerModule } from './tracker/index.js';\nexport { DatabaseModule } from './database/index.js';\nexport { EventsModule } from './event-queue/index.js';\nexport { GraphModule } from './graph/index.js';\nexport { SearchModule } from './search/index.js';\nexport { TranslationModule } from './translation/index.js';\nexport type {\n TranslationExportFormat,\n ProductTranslationTree,\n ExportProductTranslationsOptions,\n ProductTranslationsExportResult,\n UpsertProductTranslationsOptions,\n UpsertProductTranslationsResult,\n} from './translation/index.js';\nexport { PaymentsModule } from './payments/index.js';\nexport {\n ResourceCapsModule,\n ResourceCapExceededError,\n RESOURCE_CAP_DEFAULTS,\n getResourceCaps,\n type ResourceName,\n type ResourceCap,\n type ResourceCapsConfig,\n type PlanTier,\n type ResourceCapDefaults,\n} from './resource-caps/index.js';\n// Generic sharing (invite/accept/permission). Primary entrypoint is the\n// '@burdenoff/be-sdk/sharing' subpath; namespace-exported here to avoid symbol\n// collisions at the package root.\nexport * as Sharing from './sharing/index.js';\nexport { BootstrapModule, createBootstrap } from './bootstrap/index.js';\nexport {\n TemporalModule,\n TemporalClient,\n TemporalClientFactory,\n TemporalWorker,\n TemporalWorkerFactory,\n TemporalWorkerManager,\n type TemporalClientConfig,\n type TemporalWorkerConfig,\n type WorkflowStartOptions,\n} from './temporal/index.js';\n\n// Export core SDK types (only SDK-specific types, not module types)\nexport type {\n SDKConfig,\n SDKContext,\n LoggerConfig,\n LoggerTransport,\n EventQueueSDKConfig,\n EventQueueHealthStatus,\n TemporalHealthStatus,\n SDKHealthStatus,\n SDKShutdownOptions,\n // Layer types\n ServiceLayer,\n LayerConfig,\n LayerGatewayConfig,\n LayerResourceUrls,\n LayerFullConfig,\n GatewayRoutingConfig,\n CircuitBreakerConfig,\n GatewayRetryConfig,\n GatewayRequestHeaders,\n} from './types/index.js';\n\n// Export layer defaults\nexport {\n DEFAULT_GATEWAY_ROUTING,\n DEFAULT_LAYER_RESOURCES,\n DEFAULT_LAYER_STREAMS,\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n DEFAULT_GATEWAY_RETRY_CONFIG,\n} from './types/index.js';\n\n// ============================================================================\n// Namespaced Exports (Recommended - Avoids Collisions)\n// ============================================================================\n\n/**\n * Logger namespace - Logging functionality\n *\n * @example\n * ```typescript\n * import { Logger } from '@burdenoff/be-sdk';\n *\n * Logger.logger.info('Message');\n * Logger.log('Message');\n * Logger.error('Error message');\n * ```\n */\nexport * as Logger from './logger/index.js';\n\n/**\n * Cache namespace - Caching functionality\n *\n * @example\n * ```typescript\n * import { Cache } from '@burdenoff/be-sdk';\n *\n * const cache = Cache.createCache('my-namespace');\n * await cache.connect();\n * await cache.set('key', 'value', { ttl: 60 });\n * ```\n */\nexport * as Cache from './cache/index.js';\n\n/**\n * EventQueue namespace - Event queue/messaging functionality\n *\n * @example\n * ```typescript\n * import { EventQueue } from '@burdenoff/be-sdk';\n *\n * const publisher = EventQueue.createPublisher();\n * await publisher.connect();\n * await publisher.publish({ subject: 'events.test', data: { foo: 'bar' } });\n * ```\n */\nexport * as EventQueue from './event-queue/index.js';\n\n/**\n * Graph namespace - Graph database operations\n *\n * @example\n * ```typescript\n * import { Graph } from '@burdenoff/be-sdk';\n *\n * const syncService = new Graph.GraphSyncService();\n * await syncService.processEvent(event);\n * ```\n */\nexport * as Graph from './graph/index.js';\n\n/**\n * Middleware namespace - HTTP/GraphQL middleware\n *\n * @example\n * ```typescript\n * import { Middleware } from '@burdenoff/be-sdk';\n *\n * app.use(Middleware.SecurityMiddleware);\n * app.use(Middleware.setupMetricsMiddleware());\n * ```\n */\nexport * as Middleware from './middleware/index.js';\n\n/**\n * Observability namespace - Monitoring, tracing, metrics\n *\n * @example\n * ```typescript\n * import { Observability } from '@burdenoff/be-sdk';\n *\n * const tracer = Observability.createTracer('my-service');\n * ```\n */\nexport * as Observability from './observability/index.js';\n\n/**\n * GraphQL namespace - GraphQL utilities\n *\n * @example\n * ```typescript\n * import { GraphQL } from '@burdenoff/be-sdk';\n *\n * const schema = GraphQL.buildSchema(typeDefs);\n * ```\n */\nexport * as GraphQL from './graphql/index.js';\n\n/**\n * Prisma namespace - Prisma utilities and helpers\n *\n * @example\n * ```typescript\n * import { Prisma } from '@burdenoff/be-sdk';\n *\n * const client = Prisma.createPrismaClient();\n * ```\n */\nexport * as Prisma from './prisma/index.js';\n\n/**\n * Utils namespace - General utilities\n *\n * @example\n * ```typescript\n * import { Utils } from '@burdenoff/be-sdk';\n *\n * const id = Utils.generateId();\n * ```\n */\nexport * as Utils from './utils/index.js';\n\n/**\n * I18n namespace - Internationalization utilities\n *\n * @example\n * ```typescript\n * import { I18n } from '@burdenoff/be-sdk';\n *\n * const i18n = new I18n.I18n({\n * defaultLocale: 'en-US',\n * localesPath: './locales',\n * });\n * await i18n.initialize();\n *\n * const ctx = i18n.createContextFromRequest(request);\n * const message = ctx.t('errors.notFound', { resource: 'Tag' });\n * ```\n */\nexport * as I18n from './i18n/index.js';\n\n/**\n * Translation helper functions - Direct exports for convenience\n *\n * Use `t()` in GraphQL resolvers and providers to get translated messages:\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 bound translator\n * const translate = createTranslator(ctx);\n * const msg = translate('tags.errors.notFound', 'Tag not found');\n * ```\n */\nexport { t, createTranslator, hasI18n, getLocale, getLanguage } from './i18n/helpers.js';\nexport type { I18nCapableContext, Translator } from './i18n/helpers.js';\n\n/**\n * Export namespace - Data export utilities\n *\n * @example\n * ```typescript\n * import { Export } from '@burdenoff/be-sdk';\n *\n * class UserExporter extends Export.BaseModuleExporter<User> {\n * moduleKey = 'users';\n * // ...\n * }\n *\n * const csv = Export.convertToCSV(data);\n * const paginated = Export.PaginationService.paginate(items, { page: 1 });\n * ```\n */\nexport * as Export from './export/index.js';\n\n/**\n * Init namespace - Initialization utilities\n *\n * @example\n * ```typescript\n * import { Init } from '@burdenoff/be-sdk';\n *\n * await Init.initializeArangoSchema();\n * ```\n */\nexport * as Init from './init/index.js';\n\n/**\n * DataLoader namespace - DataLoader utilities for batching and caching\n *\n * @example\n * ```typescript\n * import { DataLoader } from '@burdenoff/be-sdk';\n *\n * const tagLoader = DataLoader.createEntityLoader<Tag, string>({\n * batchFn: async (ids) => db.tag.findMany({ where: { id: { in: [...ids] } } }),\n * getKey: (tag) => tag.id,\n * });\n *\n * const tag = await tagLoader.load('tag-123');\n * ```\n */\nexport * as DataLoader from './dataloader/index.js';\n\n/**\n * Notifications namespace - Notification functionality\n *\n * @example\n * ```typescript\n * import { Notifications } from '@burdenoff/be-sdk';\n *\n * await notifications.sendWithTemplate({\n * templateSlug: 'welcome-email',\n * recipients: ['user@example.com'],\n * variables: { name: 'John' }\n * });\n * ```\n */\nexport * as Notifications from './notifications/tenant-notifications.js';\n\n/**\n * Instrumentation namespace - OpenTelemetry instrumentation utilities\n *\n * Provides comprehensive tracing, metrics, and logging instrumentation\n * for microservices with conditional enable/disable support.\n *\n * @example\n * ```typescript\n * import { Instrumentation } from '@burdenoff/be-sdk';\n *\n * // Initialize instrumentation\n * const { tracer, metrics } = Instrumentation.initializeInstrumentation('my-service', {\n * features: { tracing: true, metrics: true, logging: true }\n * });\n *\n * // Create spans\n * await tracer.withSpan('operation', async (span) => {\n * span.setAttribute('key', 'value');\n * });\n *\n * // Create metrics\n * const counter = Instrumentation.createCounter('requests_total', 'Total requests');\n * counter.inc({ endpoint: '/api/users' });\n *\n * // Use decorators\n * class MyService {\n * @Instrumentation.Trace()\n * async myMethod() { ... }\n *\n * @Instrumentation.Instrument({ tracing: true, metrics: true, logging: true })\n * async trackedMethod() { ... }\n * }\n *\n * // GraphQL instrumentation plugin\n * const yoga = createYoga({\n * plugins: [Instrumentation.createGraphQLInstrumentationPlugin()],\n * });\n * ```\n */\nexport * as Instrumentation from './instrumentation/index.js';\n\n/**\n * Layer namespace - Service layer detection and configuration\n *\n * Provides automatic detection of service layer (wspace vs global) and\n * configuration of layer-specific resource URLs.\n *\n * @example\n * ```typescript\n * import { Layer } from '@burdenoff/be-sdk';\n *\n * // Create layer manager\n * const layerManager = new Layer.LayerManager({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Get layer-specific URLs\n * const internalGatewayUrl = layerManager.getInternalGatewayUrl();\n * const crossLayerGatewayUrl = layerManager.getCrossLayerGatewayUrl();\n * const eventQueueUrl = layerManager.getEventQueueUrl();\n * const valkeyUrl = layerManager.getValkeyUrl();\n *\n * // Create from environment\n * const manager = Layer.createLayerManagerFromEnv('wspace-tags-svc');\n *\n * // Detect layer from service name\n * const layer = Layer.detectLayerFromServiceName('global-auth-svc'); // 'global'\n * ```\n */\nexport * as Layer from './layer/index.js';\n\n/**\n * Crypto namespace - Encryption utilities for sensitive data\n *\n * Provides AES-256-GCM encryption/decryption for storing sensitive\n * data like credentials, API keys, and secrets.\n *\n * @example\n * ```typescript\n * import { Crypto } from '@burdenoff/be-sdk';\n *\n * // Generate a key (store this securely, e.g., in env vars)\n * const key = Crypto.generateEncryptionKey();\n *\n * // Encrypt sensitive data\n * const encrypted = Crypto.encrypt('my-api-key', key);\n *\n * // Decrypt when needed\n * const decrypted = Crypto.decrypt(encrypted, key);\n *\n * // Check if value is already encrypted\n * if (!Crypto.isEncrypted(value)) {\n * value = Crypto.encrypt(value, key);\n * }\n * ```\n */\nexport * as Crypto from './crypto/index.js';\n\n/**\n * Gateway namespace - Unified gateway client with circuit breaker\n *\n * Provides GraphQL client with automatic circuit breaker, retry logic,\n * and layer-aware routing for internal and cross-layer communication.\n *\n * @example\n * ```typescript\n * import { Gateway } from '@burdenoff/be-sdk';\n *\n * // Create gateway client\n * const client = new Gateway.GatewayClient({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * serviceIdentity: 'wspace-tags-svc',\n * internalGatewayUrl: 'http://wspace-int-gateway:4000/graphql',\n * crossLayerGatewayUrl: 'http://global-public-gateway:4000/graphql',\n * });\n *\n * // Make internal (same-layer) query\n * const result = await client.internalQuery({\n * query: 'query GetTags { tags { id name } }',\n * });\n *\n * // Make cross-layer query (e.g., wspace -> global)\n * const tenant = await client.crossLayerQuery({\n * query: 'query GetTenant($id: ID!) { tenant(id: $id) { name } }',\n * variables: { id: 'tenant-123' },\n * });\n *\n * // Create from environment\n * const gatewayClient = Gateway.createGatewayClientFromEnv('wspace-tags-svc');\n * ```\n */\nexport * as Gateway from './gateway/index.js';\n\n/**\n * FeatureFlags namespace - In-house feature flag evaluation\n *\n * @example\n * ```typescript\n * import { FeatureFlags } from '@burdenoff/be-sdk';\n *\n * const provider = new FeatureFlags.FeatureFlagProvider({\n * gatewayUrl: 'http://global-int-gateway:4000/global/graphql',\n * });\n *\n * const isEnabled = await provider.isEnabled('calendar.recurring-events', {\n * actorId: 'user-123',\n * actorType: 'user',\n * workspaceId: 'ws-456',\n * });\n * ```\n */\nexport * as FeatureFlags from './feature-flags/index.js';\n\n/**\n * Captcha namespace - reCAPTCHA v2/v3 token verification\n *\n * Provides environment-toggleable reCAPTCHA verification using Google's\n * siteverify API. Supports both v2 (checkbox) and v3 (invisible/score-based).\n *\n * @example\n * ```typescript\n * import { Captcha } from '@burdenoff/be-sdk';\n *\n * // Auto-bypass when CAPTCHA_ENABLED !== \"true\"\n * const result = await Captcha.verifyCaptchaIfEnabled({\n * token: input.recaptchaToken,\n * expectedAction: 'login',\n * minScore: 0.5,\n * });\n *\n * if (!result.success) {\n * throw new Error('Captcha verification failed');\n * }\n * ```\n */\nexport * as Captcha from './captcha/index.js';\nexport { verifyCaptcha, verifyCaptchaIfEnabled, isCaptchaEnabled } from './captcha/index.js';\nexport type { RecaptchaVerifyOptions, RecaptchaVerifyResult } from './captcha/index.js';\n\n/**\n * Platform Primitives\n *\n * Reusable building blocks consumed by every svc as part of the\n * scale-refactor: hardened HTTP client, leader lock, rate limiter,\n * paginator, dataloader factory, cache-invalidation, monthly PG\n * partition helpers, multi-provider LLM router.\n */\nexport * as Platform from './platform/index.js';\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default BurdenoffSDK;\n\n/**\n * Create SDK instance (convenience function)\n */\nexport function createSDK(config: SDKConfig, context?: SDKContext): BurdenoffSDK {\n return new BurdenoffSDK(config, context);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/graphql.ts","../src/search/index.ts","../src/translation/index.ts","../src/payments/index.ts","../src/bootstrap/index.ts","../src/client/tenant-backend.ts","../src/index.ts"],"names":["isServiceLayer","value","BurdenoffGraphQLClient","workspacesClient","tenantGateway","config","defaultContext","GraphQLClient","workspacesApiUrl","headers","getHeaders","tenantApiUrl","GatewayClient","layer","serviceLayer","process","env","serviceName","crossLayerGatewayUrl","timeout","retry","context","token","actorId","actorType","workspaceId","productId","updateContext","setHeaders","query","variables","executeWithRetry","executeQuery","tenantQuery","APIError","operation","mergedContext","response","crossLayerQuery","data","api","error","mapTenantError","GatewayError","first","graphqlErrors","message","extensions","type","GatewayErrorType","NETWORK_ERROR","NetworkError","gatewayErrorType","TIMEOUT_ERROR","TimeoutError","handleError","client","request","maxAttempts","initialDelay","maxDelay","backoffMultiplier","lastError","delay","attempt","shouldRetry","sleep","Math","min","code","Error","includes","originalError","errors","length","firstError","String","ms","Promise","resolve","setTimeout","getContext","SearchModule","search","options","trim","ValidationError","logger","debug","resourceTypes","input","organizationId","projectId","fields","fuzziness","boosts","filters","sort","limit","offset","highlight","info","total","took","indexDocument","id","title","mutation","description","content","tags","metadata","removeDocument","updateDocument","updates","indexDocumentsBulk","documents","count","indexed","failed","suggest","prefix","getSuggestions","getRelated","documentId","minScore","getRelatedDocuments","aggregate","aggregations","gqlQuery","getAggregations","clearIndex","deletedCount","clearSearchIndex","reindex","reindexDocuments","TranslationModule","translate","text","targetLanguage","sourceLanguage","textLength","translated","interpolate","getTranslations","keys","language","namespace","fallbackLanguage","translations","get","key","translation","setTranslation","deleteTranslation","setTranslationsBatch","getAllTranslations","detectLanguage","getSupportedLanguages","importTranslations","Object","exportTranslations","exportProductTranslations","resolveProductId","productName","languageCode","format","result","url","decodeJson","decodeDataUrlJson","upsertProductTranslations","flatTranslations","flattenTranslationTree","flatDefaults","defaultValues","publish","updateExisting","keysProcessed","createdKeys","updatedKeyDefaults","createdTranslations","updatedTranslations","entries","existingKeysMap","Map","keyRow","findTranslationKeyByKey","set","defaultValue","keyId","createdKey","createTranslationKey","updateTranslationKeyDefaultValue","translationRow","findGlobalTranslation","createdTranslation","createLanguageTranslation","status","updateLanguageTranslation","shouldUpdateValue","shouldPublish","out","rawValue","nextKey","assign","startsWith","commaIdx","indexOf","header","slice","payload","decoded","Buffer","from","toString","decodeURIComponent","JSON","parse","isBase64","name","i18nProductByName","translationKeyByKey","filter","globalTranslation","items","find","item","tenantId","createTranslation","escapeRegex","str","replace","escapedKey","regex","RegExp","formatPlural","_language","zero","one","other","formatDateTime","date","dateObj","Date","Intl","DateTimeFormat","formatNumber","number","NumberFormat","formatCurrency","amount","currency","style","PaymentsModule","createPayment","paymentMethod","customerId","paymentId","getPayment","getPayments","startDate","endDate","refundPayment","reason","verifyPayment","verificationData","verified","createSubscription","planId","trialDays","subscriptionId","getSubscription","cancelSubscription","cancelAtPeriodEnd","getCustomerSubscriptions","getPlans","activeOnly","createPaymentIntent","paymentIntentId","getPaymentStats","BootstrapModule","startTime","healthCheckInterval","bootstrap","environment","validateConfiguration","databaseConnected","connectDatabase","loadedModules","loadModules","healthCheck","setupHealthChecks","setupSignalHandlers","success","serviceVersion","startedAt","toISOString","modules","healthCheckEnabled","database","DatabaseModule","validateDatabaseUrl","sanitizedUrl","sanitizeDatabaseUrl","moduleName","push","loaded","interval","setInterval","health","performHealthCheck","healthy","warn","checks","memUsage","memoryUsage","memory","used","heapUsed","heapTotal","percentage","uptime","floor","now","getTime","timestamp","gracefulShutdown","signal","clearInterval","cleanup","exit","on","promise","disposeAll","ContextManager","clearContext","getInfo","setupDefaultContext","setContext","createContextMiddleware","req","_res","next","extractContextFromRequest","user","user_id","workspace_id","tenant_endpoint","getHeader","toLowerCase","Array","isArray","authHeader","appId","cfAccessClientId","cfAccessClientSecret","cfAuthorization","loadSchema","schemaPath","onShutdown","callback","originalHandler","listeners","removeAllListeners","isReady","getMetrics","cpu","cpuUsage","createBootstrap","TenantBackendClient","graphqlClient","notifications","sdkConfig","workspacesBackendUrl","tenantBackendUrl","TenantNotificationsModule","tenantUrl","workspacesUrl","hasApiKey","apiKey","setAuthToken","getClient","getConfig","createTenantBackendClient","BurdenoffSDK","eventPublisher","eventPublisherInitPromise","eventQueueConfig","initializationPromise","isShuttingDown","auth","tenantNotifications","rbac","activity","usage","tracker","events","graph","payments","_temporal","_temporalPromise","_temporalConfig","getTemporalModule","loadTemporalModule","TemporalModule","TM","moduleType","address","taskQueue","fromEnv","setLevel","level","setConsoleEnabled","console","transport","addTransport","AuthModule","NotificationsModule","RBACModule","ActivityModule","UsageModule","TrackerModule","EventsModule","GraphModule","temporalModuleType","temporalAddress","temporalNamespace","temporalTaskQueue","eventQueue","autoConnect","maxReconnectAttempts","reconnectTimeWait","hasDefaultContext","hasEventQueueConfig","hasTemporalConfig","scheduleBackgroundInit","queueMicrotask","initializeAsync","withContext","fn","promises","initializeEventQueue","catch","allSettled","publisherConfig","QueueType","REDIS_STREAMS","password","EventQueueFactory","createPublisher","connect","getEventPublisher","waitForReady","isEventQueueHealthy","connected","details","isConnected","isTemporalHealthy","isClientConnected","getHealthStatus","temporal","all","shutdown","force","shutdownPromises","disconnect","race","_","reject","createSDK"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GraphQL Client for Burdenoff Backend SDK\n * Handles communication with workspaces-backend and tenant-backend\n */\n\nimport type { Variables } from 'graphql-request';\nimport { GraphQLClient } from 'graphql-request';\nimport { GatewayClient } from '../gateway/client.js';\nimport { GatewayError, GatewayErrorType } from '../gateway/types.js';\nimport type { ServiceLayer } from '../types/layer.js';\nimport type { SDKConfig, SDKContext } from '../types/index.js';\nimport { APIError, NetworkError, TimeoutError } from '../types/index.js';\n\nfunction isServiceLayer(value: string | undefined): value is ServiceLayer {\n return value === 'wspace' || value === 'global';\n}\n\n/**\n * GraphQL client wrapper with retry logic and error handling\n */\nexport class BurdenoffGraphQLClient {\n private workspacesClient: GraphQLClient;\n /**\n * Cross-layer (tenant) calls go through the unified GatewayClient, which\n * targets the peer layer's PUBLIC gateway and mints a short-lived `service`\n * actor JWT (via signServiceJwt) so the gateway admits the M2M call and the\n * subgraph sees a trusted service context. This is the same mechanism used by\n * `GatewayClient.crossLayerQuery` everywhere else — kept consistent here so\n * tenant SDK calls (notifications, tenant lookups) authenticate identically.\n */\n private tenantGateway?: GatewayClient;\n private config: SDKConfig;\n private defaultContext: SDKContext;\n\n constructor(config: SDKConfig, defaultContext: SDKContext = {}) {\n this.config = config;\n this.defaultContext = defaultContext;\n\n // Initialize workspaces API client (should point to wspace-int-gateway for M2M calls)\n this.workspacesClient = new GraphQLClient(config.workspacesApiUrl, {\n headers: this.getHeaders(defaultContext),\n });\n\n // Cross-layer (tenant) calls go through the unified GatewayClient. The\n // configured tenantApiUrl is the peer layer's PUBLIC gateway; GatewayClient\n // mints the service JWT for it. `layer`/`serviceName` fall back to the\n // standard SERVICE_LAYER/SERVICE_NAME env vars.\n if (config.tenantApiUrl) {\n this.tenantGateway = new GatewayClient({\n layer:\n config.serviceLayer ??\n (isServiceLayer(process.env['SERVICE_LAYER']) ? process.env['SERVICE_LAYER'] : 'wspace'),\n serviceName: config.serviceName ?? process.env['SERVICE_NAME'] ?? 'burdenoff-be-sdk',\n crossLayerGatewayUrl: config.tenantApiUrl,\n timeout: config.timeout,\n // Honor the SDK's retry config (same field shape) so callers that lower\n // maxAttempts for non-idempotent tenant mutations (e.g. notification\n // sends) are respected instead of falling back to the gateway default.\n retry: config.retry,\n });\n }\n }\n\n /**\n * Get headers for GraphQL request\n * Includes actor context headers for RBAC authorization\n */\n private getHeaders(context: SDKContext): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (context.token) {\n headers['Authorization'] = `Bearer ${context.token}`;\n }\n\n // Actor context headers for RBAC\n if (context.actorId) {\n headers['x-actor-id'] = context.actorId;\n }\n\n if (context.actorType) {\n headers['x-actor-type'] = context.actorType;\n }\n\n if (context.workspaceId) {\n headers['x-workspace-id'] = context.workspaceId;\n }\n\n if (context.productId) {\n headers['x-product-id'] = context.productId;\n }\n\n return headers;\n }\n\n /**\n * Update context for future requests\n */\n public updateContext(context: Partial<SDKContext>): void {\n this.defaultContext = { ...this.defaultContext, ...context };\n this.workspacesClient.setHeaders(this.getHeaders(this.defaultContext));\n // The tenant GatewayClient derives per-request headers (and mints its own\n // service JWT) at call time, so there is no persistent header state to update.\n }\n\n /**\n * Execute GraphQL query/mutation against workspaces API\n */\n public async query<T>(query: string, variables?: Variables, context?: SDKContext): Promise<T> {\n return this.executeWithRetry(\n () => this.executeQuery(this.workspacesClient, query, variables, context),\n 'workspaces'\n );\n }\n\n /**\n * Execute GraphQL query/mutation against the tenant (cross-layer) API.\n *\n * Routed through GatewayClient.crossLayerQuery: targets the peer layer's\n * PUBLIC gateway and mints a short-lived `service` actor JWT. Only routing\n * context (workspace / product) is forwarded — the end-user identity is not,\n * because cross-layer tenant operations are service-to-service M2M. Retry and\n * circuit-breaking are handled inside GatewayClient.\n */\n public async tenantQuery<T>(query: string, variables?: Variables, context?: SDKContext): Promise<T> {\n if (!this.tenantGateway) {\n throw new APIError('Tenant API URL not configured', {\n operation: 'tenantQuery',\n });\n }\n\n const mergedContext = { ...this.defaultContext, ...context };\n const headers: Record<string, string> = {};\n if (mergedContext.workspaceId) {\n headers['x-workspace-id'] = mergedContext.workspaceId;\n }\n if (mergedContext.productId) {\n headers['x-product-id'] = mergedContext.productId;\n }\n\n try {\n const response = await this.tenantGateway.crossLayerQuery<T>({\n query,\n variables: variables as Record<string, unknown> | undefined,\n headers,\n });\n\n if (response.data == null) {\n throw new APIError('Tenant query returned no data', { api: 'tenant' });\n }\n return response.data;\n } catch (error) {\n throw this.mapTenantError(error);\n }\n }\n\n /**\n * Map a GatewayClient failure back to the SDK's APIError contract so existing\n * tenant callers (which inspect `error.message` / extensions, e.g. \"Forbidden\")\n * keep working unchanged.\n */\n private mapTenantError(error: unknown): Error {\n if (error instanceof APIError) {\n return error;\n }\n if (error instanceof GatewayError) {\n const first = error.graphqlErrors?.[0];\n if (first) {\n return new APIError(first.message, {\n graphqlErrors: error.graphqlErrors,\n extensions: first.extensions,\n });\n }\n // Preserve the SDK's error-subtype contract: callers may branch on\n // `instanceof NetworkError` / `TimeoutError`, which the legacy tenant path\n // (executeQuery → handleError) used to throw.\n if (error.type === GatewayErrorType.NETWORK_ERROR) {\n return new NetworkError(error.message, { gatewayErrorType: error.type });\n }\n if (error.type === GatewayErrorType.TIMEOUT_ERROR) {\n return new TimeoutError(error.message, { gatewayErrorType: error.type });\n }\n return new APIError(error.message, { gatewayErrorType: error.type });\n }\n return this.handleError(error);\n }\n\n /**\n * Execute GraphQL request\n */\n private async executeQuery<T>(\n client: GraphQLClient,\n query: string,\n variables?: Variables,\n context?: SDKContext\n ): Promise<T> {\n try {\n // Merge context with default context\n const mergedContext = { ...this.defaultContext, ...context };\n\n // Update headers for this request if context provided.\n if (context) {\n client.setHeaders(this.getHeaders(mergedContext));\n }\n\n const response = await client.request<T>(query, variables);\n return response;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Execute with retry logic\n */\n private async executeWithRetry<T>(operation: () => Promise<T>, api: 'workspaces' | 'tenant'): Promise<T> {\n const maxAttempts = this.config.retry?.maxAttempts || 3;\n const initialDelay = this.config.retry?.initialDelay || 1000;\n const maxDelay = this.config.retry?.maxDelay || 10000;\n const backoffMultiplier = this.config.retry?.backoffMultiplier || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on certain errors\n if (error instanceof APIError && !this.shouldRetry(error)) {\n throw error;\n }\n\n // Don't retry on last attempt\n if (attempt === maxAttempts) {\n break;\n }\n\n // Wait before retrying\n await this.sleep(Math.min(delay, maxDelay));\n delay *= backoffMultiplier;\n }\n }\n\n throw new APIError(`GraphQL request failed after ${maxAttempts} attempts`, {\n api,\n lastError: lastError?.message,\n });\n }\n\n /**\n * Determine if error should be retried\n */\n private shouldRetry(error: APIError): boolean {\n // Retry on network errors and timeouts\n if (error instanceof NetworkError || error instanceof TimeoutError) {\n return true;\n }\n\n // Retry on 5xx server errors\n if (error.code === 'SERVER_ERROR') {\n return true;\n }\n\n // Don't retry on client errors (4xx)\n return false;\n }\n\n /**\n * Handle GraphQL errors\n */\n private handleError(error: unknown): Error {\n if (error instanceof Error) {\n // Check for network errors\n if (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED')) {\n return new NetworkError('Network error while connecting to API', {\n originalError: error.message,\n });\n }\n\n // Check for timeout errors\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n return new TimeoutError('Request timed out', {\n originalError: error.message,\n });\n }\n\n // GraphQL errors\n if ('response' in error && error.response) {\n const response = error.response as {\n errors?: Array<{ message: string; extensions?: Record<string, unknown> }>;\n };\n if (response.errors && response.errors.length > 0) {\n const firstError = response.errors[0];\n if (firstError) {\n return new APIError(firstError.message, {\n graphqlErrors: response.errors,\n extensions: firstError.extensions,\n });\n }\n }\n }\n\n return new APIError(error.message, {\n originalError: error.message,\n });\n }\n\n return new APIError('Unknown error occurred', {\n error: String(error),\n });\n }\n\n /**\n * Sleep utility for retry delays\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get current context\n */\n public getContext(): SDKContext {\n return { ...this.defaultContext };\n }\n}\n","/**\n * Search Module\n * Helpers for managing global search across products via the federated GraphQL gateway\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 interface SearchOptions {\n /** Search query */\n query: string;\n /** Resource types to search */\n resourceTypes?: string[];\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** Search in specific fields */\n fields?: string[];\n /** Fuzzy search tolerance (0-1) */\n fuzziness?: number;\n /** Boost specific fields */\n boosts?: Record<string, number>;\n /** Filters */\n filters?: SearchFilter[];\n /** Sort options */\n sort?: SearchSort[];\n /** Pagination */\n limit?: number;\n offset?: number;\n /** Highlight matches */\n highlight?: boolean;\n}\n\nexport interface SearchFilter {\n /** Field to filter */\n field: string;\n /** Filter operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'range';\n /** Filter value */\n value: unknown;\n}\n\nexport interface SearchSort {\n /** Field to sort by */\n field: string;\n /** Sort order */\n order: 'asc' | 'desc';\n}\n\nexport interface SearchResult {\n id: string;\n type: string;\n title: string;\n description?: string;\n data: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n score: number;\n highlights?: Record<string, string[]>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SearchResponse {\n results: SearchResult[];\n total: number;\n took: number;\n aggregations?: Record<string, SearchAggregation>;\n}\n\nexport interface SearchAggregation {\n buckets: Array<{\n key: string;\n count: number;\n }>;\n}\n\nexport interface IndexDocumentOptions {\n /** Resource ID */\n id: string;\n /** Resource type */\n type: string;\n /** Document title */\n title: string;\n /** Document description */\n description?: string;\n /** Document content */\n content?: string;\n /** Additional data */\n data: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n /** Project context */\n projectId?: string;\n /** Tags */\n tags?: string[];\n /** Metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Search Module\n */\nexport class SearchModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Search across all resources\n */\n public async search(options: SearchOptions): Promise<SearchResponse> {\n if (!options.query || options.query.trim().length === 0) {\n throw new ValidationError('Search query is required');\n }\n\n logger.debug('[Search] Searching', {\n query: options.query,\n resourceTypes: options.resourceTypes,\n });\n\n const query = `\n query Search($input: SearchInput!) {\n search(input: $input) {\n results {\n id\n type\n title\n description\n data\n workspaceId\n organizationId\n projectId\n score\n highlights\n createdAt\n updatedAt\n }\n total\n took\n aggregations\n }\n }\n `;\n\n const variables = {\n input: {\n query: options.query,\n resourceTypes: options.resourceTypes,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId || this.context.projectId,\n fields: options.fields,\n fuzziness: options.fuzziness || 0.8,\n boosts: options.boosts,\n filters: options.filters,\n sort: options.sort,\n limit: options.limit || 20,\n offset: options.offset || 0,\n highlight: options.highlight !== false,\n },\n };\n\n const response = await this.client.query<{ search: SearchResponse }>(query, variables, this.context);\n\n logger.info('[Search] Search completed', {\n total: response.search.total,\n took: response.search.took,\n });\n\n return response.search;\n }\n\n /**\n * Index document for search\n */\n public async indexDocument(options: IndexDocumentOptions): Promise<{ id: string; indexed: boolean }> {\n if (!options.id) {\n throw new ValidationError('Document ID is required');\n }\n\n if (!options.type) {\n throw new ValidationError('Document type is required');\n }\n\n if (!options.title) {\n throw new ValidationError('Document title is required');\n }\n\n logger.debug('[Search] Indexing document', {\n id: options.id,\n type: options.type,\n });\n\n const mutation = `\n mutation IndexDocument($input: IndexDocumentInput!) {\n indexDocument(input: $input) {\n id\n indexed\n }\n }\n `;\n\n const variables = {\n input: {\n id: options.id,\n type: options.type,\n title: options.title,\n description: options.description,\n content: options.content,\n data: options.data,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n projectId: options.projectId || this.context.projectId,\n tags: options.tags,\n metadata: options.metadata,\n },\n };\n\n const response = await this.client.query<{ indexDocument: { id: string; indexed: boolean } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Search] Document indexed', { id: response.indexDocument.id });\n\n return response.indexDocument;\n }\n\n /**\n * Remove document from search index\n */\n public async removeDocument(id: string, type: string): Promise<boolean> {\n logger.debug('[Search] Removing document', { id, type });\n\n const mutation = `\n mutation RemoveDocument($id: ID!, $type: String!) {\n removeDocument(id: $id, type: $type) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { id, type }, this.context);\n\n logger.info('[Search] Document removed', { id });\n\n return true;\n }\n\n /**\n * Update document in search index\n */\n public async updateDocument(\n id: string,\n type: string,\n updates: Partial<IndexDocumentOptions>\n ): Promise<{ id: string; updated: boolean }> {\n logger.debug('[Search] Updating document', { id, type });\n\n const mutation = `\n mutation UpdateDocument($id: ID!, $type: String!, $updates: JSON!) {\n updateDocument(id: $id, type: $type, updates: $updates) {\n id\n updated\n }\n }\n `;\n\n const response = await this.client.query<{ updateDocument: { id: string; updated: boolean } }>(\n mutation,\n { id, type, updates },\n this.context\n );\n\n logger.info('[Search] Document updated', { id });\n\n return response.updateDocument;\n }\n\n /**\n * Bulk index documents\n */\n public async indexDocumentsBulk(documents: IndexDocumentOptions[]): Promise<{\n indexed: number;\n failed: number;\n errors: string[];\n }> {\n logger.debug('[Search] Bulk indexing documents', { count: documents.length });\n\n const mutation = `\n mutation IndexDocumentsBulk($documents: [IndexDocumentInput!]!) {\n indexDocumentsBulk(documents: $documents) {\n indexed\n failed\n errors\n }\n }\n `;\n\n const response = await this.client.query<{\n indexDocumentsBulk: {\n indexed: number;\n failed: number;\n errors: string[];\n };\n }>(mutation, { documents }, this.context);\n\n logger.info('[Search] Bulk indexing completed', {\n indexed: response.indexDocumentsBulk.indexed,\n failed: response.indexDocumentsBulk.failed,\n });\n\n return response.indexDocumentsBulk;\n }\n\n /**\n * Get search suggestions (autocomplete)\n */\n public async suggest(\n prefix: string,\n options?: {\n resourceTypes?: string[];\n limit?: number;\n }\n ): Promise<\n Array<{\n text: string;\n score: number;\n type?: string;\n }>\n > {\n if (!prefix || prefix.trim().length === 0) {\n throw new ValidationError('Prefix is required for suggestions');\n }\n\n logger.debug('[Search] Getting suggestions', { prefix });\n\n const query = `\n query GetSuggestions($prefix: String!, $resourceTypes: [String!], $limit: Int) {\n getSuggestions(prefix: $prefix, resourceTypes: $resourceTypes, limit: $limit) {\n text\n score\n type\n }\n }\n `;\n\n const response = await this.client.query<{\n getSuggestions: Array<{\n text: string;\n score: number;\n type?: string;\n }>;\n }>(\n query,\n {\n prefix,\n resourceTypes: options?.resourceTypes,\n limit: options?.limit || 10,\n },\n this.context\n );\n\n return response.getSuggestions;\n }\n\n /**\n * Get related documents\n */\n public async getRelated(\n documentId: string,\n options?: {\n limit?: number;\n minScore?: number;\n }\n ): Promise<SearchResult[]> {\n logger.debug('[Search] Getting related documents', { documentId });\n\n const query = `\n query GetRelatedDocuments($documentId: ID!, $limit: Int, $minScore: Float) {\n getRelatedDocuments(documentId: $documentId, limit: $limit, minScore: $minScore) {\n id\n type\n title\n description\n data\n score\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getRelatedDocuments: SearchResult[] }>(\n query,\n {\n documentId,\n limit: options?.limit || 10,\n minScore: options?.minScore || 0.5,\n },\n this.context\n );\n\n return response.getRelatedDocuments;\n }\n\n /**\n * Get search aggregations\n */\n public async aggregate(\n query: string,\n aggregations: Array<{\n field: string;\n type: 'terms' | 'date_histogram' | 'range';\n size?: number;\n }>\n ): Promise<Record<string, SearchAggregation>> {\n logger.debug('[Search] Getting aggregations', { query });\n\n const gqlQuery = `\n query GetAggregations($query: String!, $aggregations: [AggregationInput!]!) {\n getAggregations(query: $query, aggregations: $aggregations) {\n aggregations\n }\n }\n `;\n\n const response = await this.client.query<{\n getAggregations: { aggregations: Record<string, SearchAggregation> };\n }>(gqlQuery, { query, aggregations }, this.context);\n\n return response.getAggregations.aggregations;\n }\n\n /**\n * Clear search index for workspace\n */\n public async clearIndex(workspaceId?: string): Promise<{ deletedCount: number }> {\n logger.debug('[Search] Clearing index', { workspaceId });\n\n const mutation = `\n mutation ClearSearchIndex($workspaceId: ID) {\n clearSearchIndex(workspaceId: $workspaceId) {\n deletedCount\n }\n }\n `;\n\n const response = await this.client.query<{ clearSearchIndex: { deletedCount: number } }>(\n mutation,\n { workspaceId: workspaceId || this.context.workspaceId },\n this.context\n );\n\n logger.info('[Search] Index cleared', { deletedCount: response.clearSearchIndex.deletedCount });\n\n return response.clearSearchIndex;\n }\n\n /**\n * Reindex all documents\n */\n public async reindex(options?: {\n workspaceId?: string;\n resourceTypes?: string[];\n }): Promise<{ indexed: number; failed: number }> {\n logger.debug('[Search] Reindexing', options);\n\n const mutation = `\n mutation ReindexDocuments($workspaceId: ID, $resourceTypes: [String!]) {\n reindexDocuments(workspaceId: $workspaceId, resourceTypes: $resourceTypes) {\n indexed\n failed\n }\n }\n `;\n\n const response = await this.client.query<{\n reindexDocuments: { indexed: number; failed: number };\n }>(\n mutation,\n {\n workspaceId: options?.workspaceId || this.context.workspaceId,\n resourceTypes: options?.resourceTypes,\n },\n this.context\n );\n\n logger.info('[Search] Reindexing completed', response.reindexDocuments);\n\n return response.reindexDocuments;\n }\n}\n","/**\n * Translation Module\n * Helpers for managing translations and internationalization in backend\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { ValidationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport type SupportedLanguage =\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\nexport interface TranslationOptions {\n /** Text to translate */\n text: string;\n /** Source language */\n sourceLanguage?: SupportedLanguage;\n /** Target language */\n targetLanguage: SupportedLanguage;\n /** Translation context */\n context?: string;\n /** Variables to interpolate */\n variables?: Record<string, string | number>;\n}\n\nexport interface Translation {\n original: string;\n translated: string;\n sourceLanguage: string;\n targetLanguage: string;\n confidence?: number;\n}\n\nexport interface GetTranslationsOptions {\n /** Translation keys */\n keys: string[];\n /** Target language */\n language: SupportedLanguage;\n /** Namespace */\n namespace?: string;\n /** Fallback language */\n fallbackLanguage?: SupportedLanguage;\n}\n\nexport interface TranslationKey {\n key: string;\n value: string;\n language: SupportedLanguage;\n namespace?: string;\n description?: string;\n variables?: string[];\n}\n\nexport interface SetTranslationOptions {\n /** Translation key */\n key: string;\n /** Translation value */\n value: string;\n /** Language */\n language: SupportedLanguage;\n /** Namespace */\n namespace?: string;\n /** Description */\n description?: string;\n /** Variables used in translation */\n variables?: string[];\n}\n\nexport type TranslationExportFormat = 'JSON' | 'CSV' | 'XLSX' | 'PO' | 'XLIFF';\n\nexport interface ProductTranslationTree {\n [key: string]: string | ProductTranslationTree;\n}\n\nexport interface ExportProductTranslationsOptions {\n /** Product ID (preferred when already known) */\n productId?: string;\n /** Product name (e.g. 'vibecontrols') */\n productName?: string;\n /** Target language code (e.g. 'en', 'ta', 'hi') */\n languageCode?: string;\n /** Export format expected by i18n service */\n format?: TranslationExportFormat;\n /** Decode data URL payload into JSON object for JSON exports */\n decodeJson?: boolean;\n}\n\nexport interface ProductTranslationsExportResult {\n format: TranslationExportFormat;\n url: string;\n translations?: Record<string, unknown>;\n}\n\nexport interface UpsertProductTranslationsOptions {\n /** Product ID (preferred when already known) */\n productId?: string;\n /** Product name (e.g. 'vibecontrols') */\n productName?: string;\n /** Language code to upsert translations for */\n languageCode: string;\n /** Translation map (flat or nested) */\n translations: Record<string, string> | ProductTranslationTree;\n /** Optional default language values for translation key defaultValue */\n defaultValues?: Record<string, string> | ProductTranslationTree;\n /** Whether to update existing translation values if they differ */\n updateExisting?: boolean;\n /** Publish translations after create/update */\n publish?: boolean;\n}\n\nexport interface UpsertProductTranslationsResult {\n productId: string;\n languageCode: string;\n keysProcessed: number;\n createdKeys: number;\n updatedKeyDefaults: number;\n createdTranslations: number;\n updatedTranslations: number;\n}\n\n/**\n * Translation Module\n */\nexport class TranslationModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Translate text\n */\n public async translate(options: TranslationOptions): Promise<Translation> {\n if (!options.text || options.text.trim().length === 0) {\n throw new ValidationError('Text to translate is required');\n }\n\n if (!options.targetLanguage) {\n throw new ValidationError('Target language is required');\n }\n\n logger.debug('[Translation] Translating text', {\n sourceLanguage: options.sourceLanguage || 'auto',\n targetLanguage: options.targetLanguage,\n textLength: options.text.length,\n });\n\n const query = `\n query Translate($input: TranslateInput!) {\n translate(input: $input) {\n original\n translated\n sourceLanguage\n targetLanguage\n confidence\n }\n }\n `;\n\n const variables = {\n input: {\n text: options.text,\n sourceLanguage: options.sourceLanguage,\n targetLanguage: options.targetLanguage,\n context: options.context,\n },\n };\n\n const response = await this.client.query<{ translate: Translation }>(query, variables, this.context);\n\n // Interpolate variables if provided\n let translated = response.translate.translated;\n if (options.variables) {\n translated = this.interpolate(translated, options.variables);\n }\n\n logger.info('[Translation] Text translated', {\n sourceLanguage: response.translate.sourceLanguage,\n targetLanguage: response.translate.targetLanguage,\n });\n\n return {\n ...response.translate,\n translated,\n };\n }\n\n /**\n * Get translations for keys\n */\n public async getTranslations(options: GetTranslationsOptions): Promise<Record<string, string>> {\n if (!options.keys || options.keys.length === 0) {\n throw new ValidationError('Translation keys are required');\n }\n\n if (!options.language) {\n throw new ValidationError('Language is required');\n }\n\n logger.debug('[Translation] Getting translations', {\n language: options.language,\n count: options.keys.length,\n });\n\n const query = `\n query GetTranslations(\n $keys: [String!]!\n $language: String!\n $namespace: String\n $fallbackLanguage: String\n ) {\n getTranslations(\n keys: $keys\n language: $language\n namespace: $namespace\n fallbackLanguage: $fallbackLanguage\n ) {\n translations\n }\n }\n `;\n\n const response = await this.client.query<{\n getTranslations: { translations: Record<string, string> };\n }>(\n query,\n {\n keys: options.keys,\n language: options.language,\n namespace: options.namespace,\n fallbackLanguage: options.fallbackLanguage || 'en',\n },\n this.context\n );\n\n return response.getTranslations.translations;\n }\n\n /**\n * Get single translation\n */\n public async get(\n key: string,\n language: SupportedLanguage,\n variables?: Record<string, string | number>\n ): Promise<string> {\n const translations = await this.getTranslations({\n keys: [key],\n language,\n });\n\n let translation = translations[key] || key;\n\n if (variables) {\n translation = this.interpolate(translation, variables);\n }\n\n return translation;\n }\n\n /**\n * Set translation\n */\n public async setTranslation(options: SetTranslationOptions): Promise<TranslationKey> {\n if (!options.key) {\n throw new ValidationError('Translation key is required');\n }\n\n if (!options.value) {\n throw new ValidationError('Translation value is required');\n }\n\n if (!options.language) {\n throw new ValidationError('Language is required');\n }\n\n logger.debug('[Translation] Setting translation', {\n key: options.key,\n language: options.language,\n });\n\n const mutation = `\n mutation SetTranslation($input: SetTranslationInput!) {\n setTranslation(input: $input) {\n key\n value\n language\n namespace\n description\n variables\n }\n }\n `;\n\n const variables = {\n input: {\n key: options.key,\n value: options.value,\n language: options.language,\n namespace: options.namespace,\n description: options.description,\n variables: options.variables,\n },\n };\n\n const response = await this.client.query<{ setTranslation: TranslationKey }>(mutation, variables, this.context);\n\n logger.info('[Translation] Translation set', { key: options.key, language: options.language });\n\n return response.setTranslation;\n }\n\n /**\n * Delete translation\n */\n public async deleteTranslation(key: string, language: SupportedLanguage, namespace?: string): Promise<boolean> {\n logger.debug('[Translation] Deleting translation', { key, language });\n\n const mutation = `\n mutation DeleteTranslation($key: String!, $language: String!, $namespace: String) {\n deleteTranslation(key: $key, language: $language, namespace: $namespace) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { key, language, namespace }, this.context);\n\n logger.info('[Translation] Translation deleted', { key, language });\n\n return true;\n }\n\n /**\n * Batch set translations\n */\n public async setTranslationsBatch(translations: SetTranslationOptions[]): Promise<TranslationKey[]> {\n logger.debug('[Translation] Batch setting translations', { count: translations.length });\n\n const mutation = `\n mutation SetTranslationsBatch($translations: [SetTranslationInput!]!) {\n setTranslationsBatch(translations: $translations) {\n key\n value\n language\n namespace\n description\n variables\n }\n }\n `;\n\n const response = await this.client.query<{ setTranslationsBatch: TranslationKey[] }>(\n mutation,\n { translations },\n this.context\n );\n\n logger.info('[Translation] Batch translations set', { count: response.setTranslationsBatch.length });\n\n return response.setTranslationsBatch;\n }\n\n /**\n * Get all translations for language\n */\n public async getAllTranslations(language: SupportedLanguage, namespace?: string): Promise<TranslationKey[]> {\n logger.debug('[Translation] Getting all translations', { language, namespace });\n\n const query = `\n query GetAllTranslations($language: String!, $namespace: String) {\n getAllTranslations(language: $language, namespace: $namespace) {\n key\n value\n language\n namespace\n description\n variables\n }\n }\n `;\n\n const response = await this.client.query<{ getAllTranslations: TranslationKey[] }>(\n query,\n { language, namespace },\n this.context\n );\n\n return response.getAllTranslations;\n }\n\n /**\n * Detect language\n */\n public async detectLanguage(text: string): Promise<{\n language: SupportedLanguage;\n confidence: number;\n }> {\n if (!text || text.trim().length === 0) {\n throw new ValidationError('Text is required for language detection');\n }\n\n logger.debug('[Translation] Detecting language');\n\n const query = `\n query DetectLanguage($text: String!) {\n detectLanguage(text: $text) {\n language\n confidence\n }\n }\n `;\n\n const response = await this.client.query<{\n detectLanguage: {\n language: SupportedLanguage;\n confidence: number;\n };\n }>(query, { text }, this.context);\n\n return response.detectLanguage;\n }\n\n /**\n * Get supported languages\n */\n public async getSupportedLanguages(): Promise<\n Array<{\n code: SupportedLanguage;\n name: string;\n nativeName: string;\n }>\n > {\n logger.debug('[Translation] Getting supported languages');\n\n const query = `\n query GetSupportedLanguages {\n getSupportedLanguages {\n code\n name\n nativeName\n }\n }\n `;\n\n const response = await this.client.query<{\n getSupportedLanguages: Array<{\n code: SupportedLanguage;\n name: string;\n nativeName: string;\n }>;\n }>(query, {}, this.context);\n\n return response.getSupportedLanguages;\n }\n\n /**\n * Import translations from file\n */\n public async importTranslations(\n language: SupportedLanguage,\n translations: Record<string, string>,\n namespace?: string\n ): Promise<{ imported: number; failed: number }> {\n logger.debug('[Translation] Importing translations', {\n language,\n count: Object.keys(translations).length,\n });\n\n const mutation = `\n mutation ImportTranslations($language: String!, $translations: JSON!, $namespace: String) {\n importTranslations(language: $language, translations: $translations, namespace: $namespace) {\n imported\n failed\n }\n }\n `;\n\n const response = await this.client.query<{\n importTranslations: { imported: number; failed: number };\n }>(mutation, { language, translations, namespace }, this.context);\n\n logger.info('[Translation] Translations imported', response.importTranslations);\n\n return response.importTranslations;\n }\n\n /**\n * Export translations to JSON\n */\n public async exportTranslations(language: SupportedLanguage, namespace?: string): Promise<Record<string, string>> {\n logger.debug('[Translation] Exporting translations', { language, namespace });\n\n const query = `\n query ExportTranslations($language: String!, $namespace: String) {\n exportTranslations(language: $language, namespace: $namespace) {\n translations\n }\n }\n `;\n\n const response = await this.client.query<{\n exportTranslations: { translations: Record<string, string> };\n }>(query, { language, namespace }, this.context);\n\n logger.info('[Translation] Translations exported', {\n language,\n count: Object.keys(response.exportTranslations.translations).length,\n });\n\n return response.exportTranslations.translations;\n }\n\n /**\n * Export product translations from global i18n service (federated schema).\n *\n * This uses the modern i18n GraphQL contract:\n * - i18nProductByName\n * - exportTranslations(productId, languageCode, format)\n */\n public async exportProductTranslations(\n options: ExportProductTranslationsOptions\n ): Promise<ProductTranslationsExportResult> {\n const productId = await this.resolveProductId(options.productId, options.productName);\n const languageCode = options.languageCode ?? 'en';\n const format = options.format ?? 'JSON';\n\n const query = `\n query ExportProductTranslations(\n $productId: String!\n $languageCode: String!\n $format: ImportJobFormat!\n ) {\n exportTranslations(productId: $productId, languageCode: $languageCode, format: $format) {\n format\n url\n }\n }\n `;\n\n const response = await this.client.query<{\n exportTranslations: { format: TranslationExportFormat; url: string };\n }>(\n query,\n {\n productId,\n languageCode,\n format,\n },\n this.context\n );\n\n const result: ProductTranslationsExportResult = {\n format: response.exportTranslations.format,\n url: response.exportTranslations.url,\n };\n\n if ((options.decodeJson ?? true) && format === 'JSON') {\n result.translations = this.decodeDataUrlJson(response.exportTranslations.url);\n }\n\n return result;\n }\n\n /**\n * Upsert product translations in global i18n service.\n *\n * Behavior:\n * - Ensures translation keys exist (create if missing)\n * - Optionally updates translation key defaultValue\n * - Creates/updates language translation entries\n * - Optionally publishes translations\n */\n public async upsertProductTranslations(\n options: UpsertProductTranslationsOptions\n ): Promise<UpsertProductTranslationsResult> {\n if (!options.languageCode) {\n throw new ValidationError('languageCode is required');\n }\n\n const flatTranslations = this.flattenTranslationTree(options.translations);\n if (Object.keys(flatTranslations).length === 0) {\n throw new ValidationError('translations cannot be empty');\n }\n\n const flatDefaults = options.defaultValues ? this.flattenTranslationTree(options.defaultValues) : flatTranslations;\n\n const productId = await this.resolveProductId(options.productId, options.productName);\n const publish = options.publish ?? true;\n const updateExisting = options.updateExisting ?? true;\n\n const result: UpsertProductTranslationsResult = {\n productId,\n languageCode: options.languageCode,\n keysProcessed: 0,\n createdKeys: 0,\n updatedKeyDefaults: 0,\n createdTranslations: 0,\n updatedTranslations: 0,\n };\n\n const entries = Object.entries(flatTranslations);\n\n // Bulk-fetch existing keys to avoid N+1 queries (1 query instead of N)\n const existingKeysMap = new Map<string, { id: string; defaultValue: string | null }>();\n for (const [key] of entries) {\n const keyRow = await this.findTranslationKeyByKey(productId, key);\n if (keyRow) {\n existingKeysMap.set(key, keyRow);\n }\n }\n\n for (const [key, value] of entries) {\n const defaultValue = flatDefaults[key] ?? value;\n let keyId = '';\n\n const keyRow = existingKeysMap.get(key);\n if (!keyRow) {\n const createdKey = await this.createTranslationKey(productId, key, defaultValue);\n keyId = createdKey.id;\n result.createdKeys += 1;\n } else {\n keyId = keyRow.id;\n if (defaultValue && keyRow.defaultValue !== defaultValue) {\n await this.updateTranslationKeyDefaultValue(keyId, defaultValue);\n result.updatedKeyDefaults += 1;\n }\n }\n\n const translationRow = await this.findGlobalTranslation(keyId, options.languageCode);\n if (!translationRow) {\n const createdTranslation = await this.createLanguageTranslation(keyId, options.languageCode, value);\n result.createdTranslations += 1;\n\n if (publish && createdTranslation.status !== 'PUBLISHED') {\n await this.updateLanguageTranslation(createdTranslation.id, value, 'PUBLISHED');\n }\n } else {\n const shouldUpdateValue = updateExisting && translationRow.value !== value;\n const shouldPublish = publish && translationRow.status !== 'PUBLISHED';\n\n if (shouldUpdateValue || shouldPublish) {\n await this.updateLanguageTranslation(\n translationRow.id,\n shouldUpdateValue ? value : translationRow.value,\n publish ? 'PUBLISHED' : (translationRow.status as 'PUBLISHED' | 'DRAFT' | 'REVIEW')\n );\n if (shouldUpdateValue) {\n result.updatedTranslations += 1;\n }\n }\n }\n\n result.keysProcessed += 1;\n }\n\n logger.info('[Translation] Product translations upsert completed', {\n productId,\n languageCode: options.languageCode,\n keysProcessed: result.keysProcessed,\n createdKeys: result.createdKeys,\n createdTranslations: result.createdTranslations,\n updatedTranslations: result.updatedTranslations,\n });\n\n return result;\n }\n\n private flattenTranslationTree(\n input: Record<string, string> | ProductTranslationTree,\n prefix = ''\n ): Record<string, string> {\n const out: Record<string, string> = {};\n\n for (const [key, rawValue] of Object.entries(input)) {\n const nextKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof rawValue === 'string') {\n out[nextKey] = rawValue;\n continue;\n }\n\n if (rawValue && typeof rawValue === 'object') {\n Object.assign(out, this.flattenTranslationTree(rawValue, nextKey));\n }\n }\n\n return out;\n }\n\n private decodeDataUrlJson(url: string): Record<string, unknown> {\n if (!url.startsWith('data:')) {\n throw new ValidationError('Expected exportTranslations URL to be a data URL');\n }\n\n const commaIdx = url.indexOf(',');\n if (commaIdx === -1) {\n throw new ValidationError('Invalid data URL: missing comma separator');\n }\n\n const header = url.slice(0, commaIdx); // e.g. \"data:application/json;base64\"\n const payload = url.slice(commaIdx + 1);\n if (!payload) {\n throw new ValidationError('Invalid data URL payload');\n }\n\n try {\n const decoded = header.includes('base64')\n ? Buffer.from(payload, 'base64').toString('utf8')\n : decodeURIComponent(payload);\n return JSON.parse(decoded) as Record<string, unknown>;\n } catch (error) {\n logger.error('[Translation] Failed to decode data URL JSON', {\n error,\n isBase64: header.includes('base64'),\n });\n throw new ValidationError('Failed to decode JSON translation payload');\n }\n }\n\n private async resolveProductId(productId?: string, productName?: string): Promise<string> {\n if (productId) {\n return productId;\n }\n\n if (!productName) {\n throw new ValidationError('Either productId or productName is required');\n }\n\n const query = `\n query GetI18nProductByName($name: String!) {\n i18nProductByName(name: $name) {\n id\n }\n }\n `;\n\n const response = await this.client.query<{\n i18nProductByName: { id: string } | null;\n }>(query, { name: productName }, this.context);\n\n if (!response.i18nProductByName?.id) {\n throw new ValidationError(`i18n product not found: ${productName}`);\n }\n\n return response.i18nProductByName.id;\n }\n\n private async findTranslationKeyByKey(\n productId: string,\n key: string\n ): Promise<{ id: string; defaultValue: string | null } | null> {\n const query = `\n query FindTranslationKey($productId: String!, $key: String!) {\n translationKeyByKey(productId: $productId, key: $key) {\n id\n defaultValue\n }\n }\n `;\n\n const response = await this.client.query<{\n translationKeyByKey: { id: string; defaultValue: string | null } | null;\n }>(\n query,\n {\n productId,\n key,\n },\n this.context\n );\n\n return response.translationKeyByKey;\n }\n\n private async createTranslationKey(productId: string, key: string, defaultValue: string): Promise<{ id: string }> {\n const mutation = `\n mutation CreateTranslationKey($input: CreateTranslationKeyInput!) {\n createTranslationKey(input: $input) {\n id\n }\n }\n `;\n\n const response = await this.client.query<{\n createTranslationKey: { id: string };\n }>(\n mutation,\n {\n input: {\n productId,\n key,\n defaultValue,\n },\n },\n this.context\n );\n\n return response.createTranslationKey;\n }\n\n private async updateTranslationKeyDefaultValue(id: string, defaultValue: string): Promise<void> {\n const mutation = `\n mutation UpdateTranslationKeyDefault($id: ID!, $input: UpdateTranslationKeyInput!) {\n updateTranslationKey(id: $id, input: $input) {\n id\n }\n }\n `;\n\n await this.client.query(\n mutation,\n {\n id,\n input: { defaultValue },\n },\n this.context\n );\n }\n\n private async findGlobalTranslation(\n keyId: string,\n languageCode: string\n ): Promise<{ id: string; value: string; status: string } | null> {\n const query = `\n query FindTranslation($filter: TranslationFilterInput) {\n translations(filter: $filter, limit: 50, offset: 0) {\n items {\n id\n value\n status\n tenantId\n }\n }\n }\n `;\n\n const response = await this.client.query<{\n translations: {\n items: Array<{\n id: string;\n value: string;\n status: string;\n tenantId: string | null;\n }>;\n };\n }>(\n query,\n {\n filter: {\n keyId,\n languageCode,\n },\n },\n this.context\n );\n\n const globalTranslation = response.translations.items.find((item) => item.tenantId === null);\n if (!globalTranslation) {\n return null;\n }\n\n return {\n id: globalTranslation.id,\n value: globalTranslation.value,\n status: globalTranslation.status,\n };\n }\n\n private async createLanguageTranslation(\n keyId: string,\n languageCode: string,\n value: string\n ): Promise<{ id: string; status: string }> {\n const mutation = `\n mutation CreateTranslation($input: CreateTranslationInput!) {\n createTranslation(input: $input) {\n id\n status\n }\n }\n `;\n\n const response = await this.client.query<{\n createTranslation: { id: string; status: string };\n }>(\n mutation,\n {\n input: {\n keyId,\n languageCode,\n value,\n },\n },\n this.context\n );\n\n return response.createTranslation;\n }\n\n private async updateLanguageTranslation(\n id: string,\n value: string,\n status: 'PUBLISHED' | 'DRAFT' | 'REVIEW'\n ): Promise<void> {\n const mutation = `\n mutation UpdateTranslation($id: ID!, $input: UpdateTranslationInput!) {\n updateTranslation(id: $id, input: $input) {\n id\n status\n }\n }\n `;\n\n await this.client.query(\n mutation,\n {\n id,\n input: {\n value,\n status,\n },\n },\n this.context\n );\n }\n\n /**\n * Escape regex special characters in a string\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Interpolate variables in translation string\n */\n private interpolate(text: string, variables: Record<string, string | number>): string {\n let result = text;\n\n for (const [key, value] of Object.entries(variables)) {\n // Escape regex special characters in key to prevent regex injection\n const escapedKey = this.escapeRegex(key);\n const regex = new RegExp(`{{\\\\s*${escapedKey}\\\\s*}}`, 'g');\n result = result.replace(regex, String(value));\n }\n\n return result;\n }\n\n /**\n * Format translation with pluralization\n */\n public formatPlural(\n _language: SupportedLanguage,\n count: number,\n translations: {\n zero?: string;\n one: string;\n other: string;\n }\n ): string {\n if (count === 0 && translations.zero) {\n return translations.zero;\n }\n\n if (count === 1) {\n return translations.one;\n }\n\n return translations.other;\n }\n\n /**\n * Format date/time for locale\n */\n public formatDateTime(\n date: Date | string,\n language: SupportedLanguage,\n options?: Intl.DateTimeFormatOptions\n ): string {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat(language, options).format(dateObj);\n }\n\n /**\n * Format number for locale\n */\n public formatNumber(number: number, language: SupportedLanguage, options?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(language, options).format(number);\n }\n\n /**\n * Format currency for locale\n */\n public formatCurrency(amount: number, currency: string, language: SupportedLanguage): string {\n return new Intl.NumberFormat(language, {\n style: 'currency',\n currency,\n }).format(amount);\n }\n}\n","/**\n * Payments Module\n * Helpers for managing payments, subscriptions, and verification\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 PaymentStatus {\n PENDING = 'pending',\n PROCESSING = 'processing',\n SUCCEEDED = 'succeeded',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n REFUNDED = 'refunded',\n}\n\nexport enum PaymentMethod {\n CREDIT_CARD = 'credit_card',\n DEBIT_CARD = 'debit_card',\n BANK_TRANSFER = 'bank_transfer',\n UPI = 'upi',\n WALLET = 'wallet',\n PAYPAL = 'paypal',\n STRIPE = 'stripe',\n}\n\nexport enum SubscriptionStatus {\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n CANCELLED = 'cancelled',\n EXPIRED = 'expired',\n PAST_DUE = 'past_due',\n TRIALING = 'trialing',\n}\n\nexport interface CreatePaymentOptions {\n /** Amount in smallest currency unit (e.g., cents) */\n amount: number;\n /** Currency code (e.g., USD, EUR, INR) */\n currency: string;\n /** Payment method */\n paymentMethod: PaymentMethod;\n /** Customer ID */\n customerId: string;\n /** Description */\n description?: string;\n /** Metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface Payment {\n id: string;\n amount: number;\n currency: string;\n status: PaymentStatus;\n paymentMethod: PaymentMethod;\n customerId: string;\n description?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n transactionId?: string;\n failureReason?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateSubscriptionOptions {\n /** Customer ID */\n customerId: string;\n /** Plan ID */\n planId: string;\n /** Payment method */\n paymentMethod: PaymentMethod;\n /** Trial period in days */\n trialDays?: number;\n /** Metadata */\n metadata?: Record<string, unknown>;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface Subscription {\n id: string;\n customerId: string;\n planId: string;\n status: SubscriptionStatus;\n currentPeriodStart: string;\n currentPeriodEnd: string;\n trialEnd?: string;\n cancelledAt?: string;\n endedAt?: string;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Plan {\n id: string;\n name: string;\n description?: string;\n amount: number;\n currency: string;\n interval: 'day' | 'week' | 'month' | 'year';\n intervalCount: number;\n features?: string[];\n metadata?: Record<string, unknown>;\n active: boolean;\n createdAt: string;\n}\n\nexport interface GetPaymentsOptions {\n customerId?: string;\n status?: PaymentStatus;\n workspaceId?: string;\n organizationId?: string;\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Payments Module\n */\nexport class PaymentsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create payment\n */\n public async createPayment(options: CreatePaymentOptions): Promise<Payment> {\n // Validate inputs\n if (typeof options.amount !== 'number' || options.amount <= 0) {\n throw new ValidationError('Amount must be a positive number');\n }\n\n if (!options.currency) {\n throw new ValidationError('Currency is required');\n }\n\n if (!options.paymentMethod) {\n throw new ValidationError('Payment method is required');\n }\n\n if (!options.customerId) {\n throw new ValidationError('Customer ID is required');\n }\n\n logger.debug('[Payments] Creating payment', {\n amount: options.amount,\n currency: options.currency,\n customerId: options.customerId,\n });\n\n const mutation = `\n mutation CreatePayment($input: CreatePaymentInput!) {\n createPayment(input: $input) {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n description\n metadata\n workspaceId\n organizationId\n transactionId\n failureReason\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n amount: options.amount,\n currency: options.currency,\n paymentMethod: options.paymentMethod,\n customerId: options.customerId,\n description: options.description,\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<{ createPayment: Payment }>(mutation, variables, this.context);\n\n logger.info('[Payments] Payment created', { paymentId: response.createPayment.id });\n\n return response.createPayment;\n }\n\n /**\n * Get payment by ID\n */\n public async getPayment(paymentId: string): Promise<Payment> {\n logger.debug('[Payments] Getting payment', { paymentId });\n\n const query = `\n query GetPayment($paymentId: ID!) {\n getPayment(paymentId: $paymentId) {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n description\n metadata\n workspaceId\n organizationId\n transactionId\n failureReason\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getPayment: Payment }>(query, { paymentId }, this.context);\n\n return response.getPayment;\n }\n\n /**\n * Get payments with filters\n */\n public async getPayments(options: GetPaymentsOptions): Promise<{\n payments: Payment[];\n total: number;\n }> {\n logger.debug('[Payments] Getting payments', options);\n\n const query = `\n query GetPayments(\n $customerId: ID\n $status: PaymentStatus\n $workspaceId: ID\n $organizationId: ID\n $startDate: DateTime\n $endDate: DateTime\n $limit: Int\n $offset: Int\n ) {\n getPayments(\n customerId: $customerId\n status: $status\n workspaceId: $workspaceId\n organizationId: $organizationId\n startDate: $startDate\n endDate: $endDate\n limit: $limit\n offset: $offset\n ) {\n payments {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n description\n transactionId\n createdAt\n updatedAt\n }\n total\n }\n }\n `;\n\n const variables = {\n customerId: options.customerId,\n status: options.status,\n workspaceId: options.workspaceId || this.context.workspaceId,\n organizationId: options.organizationId,\n startDate: options.startDate,\n endDate: options.endDate,\n limit: options.limit || 50,\n offset: options.offset || 0,\n };\n\n const response = await this.client.query<{\n getPayments: {\n payments: Payment[];\n total: number;\n };\n }>(query, variables, this.context);\n\n return response.getPayments;\n }\n\n /**\n * Refund payment\n */\n public async refundPayment(paymentId: string, amount?: number, reason?: string): Promise<Payment> {\n logger.debug('[Payments] Refunding payment', { paymentId, amount });\n\n const mutation = `\n mutation RefundPayment($paymentId: ID!, $amount: Int, $reason: String) {\n refundPayment(paymentId: $paymentId, amount: $amount, reason: $reason) {\n id\n amount\n currency\n status\n paymentMethod\n customerId\n failureReason\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ refundPayment: Payment }>(\n mutation,\n { paymentId, amount, reason },\n this.context\n );\n\n logger.info('[Payments] Payment refunded', { paymentId });\n\n return response.refundPayment;\n }\n\n /**\n * Verify payment\n */\n public async verifyPayment(\n paymentId: string,\n verificationData: Record<string, unknown>\n ): Promise<{\n verified: boolean;\n status: PaymentStatus;\n }> {\n logger.debug('[Payments] Verifying payment', { paymentId });\n\n const mutation = `\n mutation VerifyPayment($paymentId: ID!, $verificationData: JSON!) {\n verifyPayment(paymentId: $paymentId, verificationData: $verificationData) {\n verified\n status\n }\n }\n `;\n\n const response = await this.client.query<{\n verifyPayment: {\n verified: boolean;\n status: PaymentStatus;\n };\n }>(mutation, { paymentId, verificationData }, this.context);\n\n logger.info('[Payments] Payment verified', {\n paymentId,\n verified: response.verifyPayment.verified,\n });\n\n return response.verifyPayment;\n }\n\n /**\n * Create subscription\n */\n public async createSubscription(options: CreateSubscriptionOptions): Promise<Subscription> {\n if (!options.customerId) {\n throw new ValidationError('Customer ID is required');\n }\n\n if (!options.planId) {\n throw new ValidationError('Plan ID is required');\n }\n\n if (!options.paymentMethod) {\n throw new ValidationError('Payment method is required');\n }\n\n logger.debug('[Payments] Creating subscription', {\n customerId: options.customerId,\n planId: options.planId,\n });\n\n const mutation = `\n mutation CreateSubscription($input: CreateSubscriptionInput!) {\n createSubscription(input: $input) {\n id\n customerId\n planId\n status\n currentPeriodStart\n currentPeriodEnd\n trialEnd\n cancelledAt\n endedAt\n metadata\n workspaceId\n organizationId\n createdAt\n updatedAt\n }\n }\n `;\n\n const variables = {\n input: {\n customerId: options.customerId,\n planId: options.planId,\n paymentMethod: options.paymentMethod,\n trialDays: options.trialDays,\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<{ createSubscription: Subscription }>(mutation, variables, this.context);\n\n logger.info('[Payments] Subscription created', { subscriptionId: response.createSubscription.id });\n\n return response.createSubscription;\n }\n\n /**\n * Get subscription\n */\n public async getSubscription(subscriptionId: string): Promise<Subscription> {\n logger.debug('[Payments] Getting subscription', { subscriptionId });\n\n const query = `\n query GetSubscription($subscriptionId: ID!) {\n getSubscription(subscriptionId: $subscriptionId) {\n id\n customerId\n planId\n status\n currentPeriodStart\n currentPeriodEnd\n trialEnd\n cancelledAt\n endedAt\n metadata\n workspaceId\n organizationId\n createdAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ getSubscription: Subscription }>(\n query,\n { subscriptionId },\n this.context\n );\n\n return response.getSubscription;\n }\n\n /**\n * Cancel subscription\n */\n public async cancelSubscription(subscriptionId: string, cancelAtPeriodEnd = false): Promise<Subscription> {\n logger.debug('[Payments] Cancelling subscription', {\n subscriptionId,\n cancelAtPeriodEnd,\n });\n\n const mutation = `\n mutation CancelSubscription($subscriptionId: ID!, $cancelAtPeriodEnd: Boolean!) {\n cancelSubscription(subscriptionId: $subscriptionId, cancelAtPeriodEnd: $cancelAtPeriodEnd) {\n id\n status\n cancelledAt\n endedAt\n updatedAt\n }\n }\n `;\n\n const response = await this.client.query<{ cancelSubscription: Subscription }>(\n mutation,\n { subscriptionId, cancelAtPeriodEnd },\n this.context\n );\n\n logger.info('[Payments] Subscription cancelled', { subscriptionId });\n\n return response.cancelSubscription;\n }\n\n /**\n * Get customer subscriptions\n */\n public async getCustomerSubscriptions(customerId: string): Promise<Subscription[]> {\n logger.debug('[Payments] Getting customer subscriptions', { customerId });\n\n const query = `\n query GetCustomerSubscriptions($customerId: ID!) {\n getCustomerSubscriptions(customerId: $customerId) {\n id\n customerId\n planId\n status\n currentPeriodStart\n currentPeriodEnd\n trialEnd\n cancelledAt\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getCustomerSubscriptions: Subscription[] }>(\n query,\n { customerId },\n this.context\n );\n\n return response.getCustomerSubscriptions;\n }\n\n /**\n * Get plans\n */\n public async getPlans(activeOnly = true): Promise<Plan[]> {\n logger.debug('[Payments] Getting plans', { activeOnly });\n\n const query = `\n query GetPlans($activeOnly: Boolean!) {\n getPlans(activeOnly: $activeOnly) {\n id\n name\n description\n amount\n currency\n interval\n intervalCount\n features\n metadata\n active\n createdAt\n }\n }\n `;\n\n const response = await this.client.query<{ getPlans: Plan[] }>(query, { activeOnly }, this.context);\n\n return response.getPlans;\n }\n\n /**\n * Create payment intent\n */\n public async createPaymentIntent(options: {\n amount: number;\n currency: string;\n customerId: string;\n paymentMethod?: PaymentMethod;\n metadata?: Record<string, unknown>;\n }): Promise<{\n clientSecret: string;\n paymentIntentId: string;\n }> {\n logger.debug('[Payments] Creating payment intent', {\n amount: options.amount,\n currency: options.currency,\n });\n\n const mutation = `\n mutation CreatePaymentIntent($input: CreatePaymentIntentInput!) {\n createPaymentIntent(input: $input) {\n clientSecret\n paymentIntentId\n }\n }\n `;\n\n const response = await this.client.query<{\n createPaymentIntent: {\n clientSecret: string;\n paymentIntentId: string;\n };\n }>(mutation, { input: options }, this.context);\n\n logger.info('[Payments] Payment intent created', {\n paymentIntentId: response.createPaymentIntent.paymentIntentId,\n });\n\n return response.createPaymentIntent;\n }\n\n /**\n * Get payment statistics\n */\n public async getPaymentStats(options?: { startDate?: string; endDate?: string; workspaceId?: string }): Promise<{\n totalRevenue: number;\n totalPayments: number;\n successfulPayments: number;\n failedPayments: number;\n refundedAmount: number;\n averagePaymentAmount: number;\n }> {\n logger.debug('[Payments] Getting payment statistics', options);\n\n const query = `\n query GetPaymentStats($startDate: DateTime, $endDate: DateTime, $workspaceId: ID) {\n getPaymentStats(startDate: $startDate, endDate: $endDate, workspaceId: $workspaceId) {\n totalRevenue\n totalPayments\n successfulPayments\n failedPayments\n refundedAmount\n averagePaymentAmount\n }\n }\n `;\n\n const response = await this.client.query<{\n getPaymentStats: {\n totalRevenue: number;\n totalPayments: number;\n successfulPayments: number;\n failedPayments: number;\n refundedAmount: number;\n averagePaymentAmount: number;\n };\n }>(\n query,\n {\n startDate: options?.startDate,\n endDate: options?.endDate,\n workspaceId: options?.workspaceId || this.context.workspaceId,\n },\n this.context\n );\n\n return response.getPaymentStats;\n }\n}\n","/**\n * Bootstrap Module\n * Helpers for bootstrapping server, loading modules, and setting up schemas\n */\n\nimport { logger } from '../logger/index.js';\nimport { DatabaseModule, type DatabaseConfig } from '../database/index.js';\nimport { ContextManager } from '../context/index.js';\nimport { disposeAll } from '../lifecycle/index.js';\nimport type { SDKConfig, SDKContext } from '../types/index.js';\n\n/**\n * Type for HTTP header values\n */\ntype HeaderValue = string | string[] | undefined;\n\nexport interface BootstrapConfig extends SDKConfig {\n /** Database configuration */\n database?: DatabaseConfig;\n /** Enable health checks */\n healthCheck?: boolean;\n /** Health check interval in milliseconds */\n healthCheckInterval?: number;\n /** Modules to load */\n modules?: string[];\n /** Environment */\n environment?: 'development' | 'staging' | 'production';\n /** Service name */\n serviceName?: string;\n /** Service version */\n serviceVersion?: string;\n /** Port to run health check server */\n healthCheckPort?: number;\n}\n\nexport interface BootstrapResult {\n success: boolean;\n serviceName: string;\n serviceVersion: string;\n environment: string;\n startedAt: string;\n modules: string[];\n databaseConnected: boolean;\n healthCheckEnabled: boolean;\n}\n\nexport interface BootstrapHealthCheckResult {\n healthy: boolean;\n checks: {\n database?: boolean;\n graphql?: boolean;\n memory?: {\n used: number;\n total: number;\n percentage: number;\n };\n uptime?: number;\n };\n timestamp: string;\n}\n\n/**\n * Bootstrap Module\n */\nexport class BootstrapModule {\n private config: BootstrapConfig;\n private startTime: Date;\n private healthCheckInterval?: NodeJS.Timeout;\n\n constructor(config: BootstrapConfig) {\n this.config = config;\n this.startTime = new Date();\n }\n\n /**\n * Bootstrap the application\n */\n public async bootstrap(): Promise<BootstrapResult> {\n logger.info('[Bootstrap] Starting application bootstrap', {\n serviceName: this.config.serviceName,\n environment: this.config.environment || 'development',\n });\n\n try {\n // 1. Validate configuration\n await this.validateConfiguration();\n\n // 2. Connect to database\n const databaseConnected = await this.connectDatabase();\n\n // 3. Load modules\n const loadedModules = await this.loadModules();\n\n // 4. Setup health checks\n if (this.config.healthCheck) {\n await this.setupHealthChecks();\n }\n\n // 5. Setup signal handlers\n this.setupSignalHandlers();\n\n const result: BootstrapResult = {\n success: true,\n serviceName: this.config.serviceName || 'burdenoff-service',\n serviceVersion: this.config.serviceVersion || '1.0.0',\n environment: this.config.environment || 'development',\n startedAt: this.startTime.toISOString(),\n modules: loadedModules,\n databaseConnected,\n healthCheckEnabled: this.config.healthCheck || false,\n };\n\n logger.info('[Bootstrap] Application bootstrapped successfully', result);\n\n return result;\n } catch (error) {\n logger.error('[Bootstrap] Failed to bootstrap application', { error });\n throw error;\n }\n }\n\n /**\n * Validate configuration\n */\n private async validateConfiguration(): Promise<void> {\n logger.debug('[Bootstrap] Validating configuration');\n\n if (!this.config.workspacesApiUrl) {\n throw new Error('Workspaces API URL is required');\n }\n\n if (this.config.database?.url && !DatabaseModule.validateDatabaseUrl(this.config.database.url)) {\n throw new Error('Invalid database URL');\n }\n\n logger.debug('[Bootstrap] Configuration validated');\n }\n\n /**\n * Connect to database\n */\n private async connectDatabase(): Promise<boolean> {\n if (!this.config.database) {\n logger.debug('[Bootstrap] No database configuration provided, skipping');\n return false;\n }\n\n logger.info('[Bootstrap] Connecting to database');\n\n try {\n // Database connection is typically handled by Prisma or other ORM\n // This is a placeholder for validation and logging\n const sanitizedUrl = DatabaseModule.sanitizeDatabaseUrl(this.config.database.url);\n logger.info('[Bootstrap] Database connection configured', { url: sanitizedUrl });\n\n return true;\n } catch (error) {\n logger.error('[Bootstrap] Failed to connect to database', { error });\n return false;\n }\n }\n\n /**\n * Load modules\n */\n private async loadModules(): Promise<string[]> {\n const modules = this.config.modules || [];\n\n if (modules.length === 0) {\n logger.debug('[Bootstrap] No modules to load');\n return [];\n }\n\n logger.info('[Bootstrap] Loading modules', { modules });\n\n const loadedModules: string[] = [];\n\n for (const moduleName of modules) {\n try {\n logger.debug(`[Bootstrap] Loading module: ${moduleName}`);\n // Module loading logic would go here\n loadedModules.push(moduleName);\n } catch (error) {\n logger.error(`[Bootstrap] Failed to load module: ${moduleName}`, { error });\n }\n }\n\n logger.info('[Bootstrap] Modules loaded', { loaded: loadedModules });\n\n return loadedModules;\n }\n\n /**\n * Setup health checks\n */\n private async setupHealthChecks(): Promise<void> {\n logger.info('[Bootstrap] Setting up health checks');\n\n const interval = this.config.healthCheckInterval || 30000; // 30 seconds\n\n this.healthCheckInterval = setInterval(() => {\n void (async () => {\n const health = await this.performHealthCheck();\n\n if (!health.healthy) {\n logger.warn('[Bootstrap] Health check failed', health);\n } else {\n logger.debug('[Bootstrap] Health check passed', health);\n }\n })();\n }, interval);\n\n logger.info('[Bootstrap] Health checks configured', { interval });\n }\n\n /**\n * Perform health check\n */\n public async performHealthCheck(): Promise<BootstrapHealthCheckResult> {\n const checks: BootstrapHealthCheckResult['checks'] = {};\n\n // Memory check\n const memUsage = process.memoryUsage();\n checks.memory = {\n used: memUsage.heapUsed,\n total: memUsage.heapTotal,\n percentage: (memUsage.heapUsed / memUsage.heapTotal) * 100,\n };\n\n // Uptime\n checks.uptime = Math.floor((Date.now() - this.startTime.getTime()) / 1000);\n\n // Determine overall health\n const healthy =\n checks.memory.percentage < 90 && // Less than 90% memory usage\n checks.uptime > 0;\n\n return {\n healthy,\n checks,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Setup signal handlers for graceful shutdown\n */\n private setupSignalHandlers(): void {\n logger.debug('[Bootstrap] Setting up signal handlers');\n\n const gracefulShutdown = async (signal: string): Promise<void> => {\n logger.info(`[Bootstrap] Received ${signal}, shutting down gracefully`);\n\n // Clear health check interval\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n }\n\n // Perform cleanup\n await this.cleanup();\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => {\n void gracefulShutdown('SIGTERM');\n });\n process.on('SIGINT', () => {\n void gracefulShutdown('SIGINT');\n });\n\n process.on('unhandledRejection', (reason, promise) => {\n logger.error('[Bootstrap] Unhandled rejection', {\n reason,\n promise,\n });\n });\n\n process.on('uncaughtException', (error) => {\n logger.error('[Bootstrap] Uncaught exception', { error });\n process.exit(1);\n });\n }\n\n /**\n * Cleanup on shutdown\n */\n private async cleanup(): Promise<void> {\n logger.info('[Bootstrap] Performing cleanup');\n\n // Gracefully close every registered long-lived connection (Redis Streams\n // event publisher/consumer, cache client) so their sockets are torn down\n // deterministically here instead of being left for the OS at process exit.\n // Bounded per-connection so a hung close never blocks the exit. Never throws.\n await disposeAll();\n\n // Clear context\n ContextManager.clearContext();\n\n logger.info('[Bootstrap] Cleanup completed');\n }\n\n /**\n * Get application info\n */\n public getInfo(): {\n serviceName: string;\n serviceVersion: string;\n environment: string;\n uptime: number;\n startedAt: string;\n } {\n return {\n serviceName: this.config.serviceName || 'burdenoff-service',\n serviceVersion: this.config.serviceVersion || '1.0.0',\n environment: this.config.environment || 'development',\n uptime: Math.floor((Date.now() - this.startTime.getTime()) / 1000),\n startedAt: this.startTime.toISOString(),\n };\n }\n\n /**\n * Setup default context\n */\n public setupDefaultContext(context: SDKContext): void {\n logger.debug('[Bootstrap] Setting up default context', context);\n ContextManager.setContext(context);\n }\n\n /**\n * Create context middleware (for Elysia/HTTP frameworks)\n */\n public createContextMiddleware() {\n return async (\n req: { headers: Record<string, HeaderValue>; user?: unknown },\n _res: unknown,\n next: () => void\n ): Promise<void> => {\n const context = this.extractContextFromRequest(\n req as {\n headers: Record<string, HeaderValue>;\n user?: { user_id?: string; workspace_id?: string; org_id?: string; tenant_endpoint?: string };\n }\n );\n ContextManager.setContext(context);\n next();\n };\n }\n\n /**\n * Extract context from request\n */\n private extractContextFromRequest(req: {\n headers: Record<string, string | string[] | undefined>;\n user?: { user_id?: string; workspace_id?: string; org_id?: string; tenant_endpoint?: string };\n }): SDKContext {\n const context: SDKContext = {};\n\n // Extract from user object (if JWT already verified)\n if (req.user) {\n context.actorId = req.user.user_id;\n context.workspaceId = req.user.workspace_id;\n context.tenantId = req.user.tenant_endpoint;\n }\n\n // Extract from headers\n const getHeader = (key: string): string | undefined => {\n const value = req.headers[key.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n };\n\n const authHeader = getHeader('authorization');\n if (authHeader) {\n context.token = authHeader.replace('Bearer ', '');\n }\n\n const workspaceId = getHeader('x-workspace-id');\n if (workspaceId && !context.workspaceId) {\n context.workspaceId = workspaceId;\n }\n\n const productId = getHeader('x-product-id');\n if (productId) {\n context.productId = productId;\n }\n\n const projectId = getHeader('x-project-id');\n if (projectId) {\n context.projectId = projectId;\n }\n\n const appId = getHeader('x-app-id');\n if (appId) {\n context.appId = appId;\n }\n\n // Cloudflare Access service token — captured so cross-layer calls can\n // re-present it on alpha (see ContextManager.getCfAccessHeaders). Kept in\n // sync with the canonical extractor in `src/context/index.ts`. Setting it\n // via ContextManager.setContext (see createContextMiddleware) also mirrors\n // it to the module-level fallback for Bun + Yoga.\n const cfAccessClientId = getHeader('cf-access-client-id');\n if (cfAccessClientId) {\n context.cfAccessClientId = cfAccessClientId;\n }\n\n const cfAccessClientSecret = getHeader('cf-access-client-secret');\n if (cfAccessClientSecret) {\n context.cfAccessClientSecret = cfAccessClientSecret;\n }\n\n // Cloudflare Access user-SSO cookie, forwarded by the public gateway as\n // x-cf-authorization. Re-presented as the CF_Authorization cookie on\n // cross-layer calls (see ContextManager.getCfAccessHeaders). See BOFF-2929.\n const cfAuthorization = getHeader('x-cf-authorization');\n if (cfAuthorization) {\n context.cfAuthorization = cfAuthorization;\n }\n\n return context;\n }\n\n /**\n * Load GraphQL schema\n */\n public async loadSchema(schemaPath: string): Promise<boolean> {\n logger.info('[Bootstrap] Loading GraphQL schema', { schemaPath });\n\n try {\n // Schema loading logic would go here\n // This is typically handled by the GraphQL server setup\n logger.info('[Bootstrap] Schema loaded successfully');\n return true;\n } catch (error) {\n logger.error('[Bootstrap] Failed to load schema', { error });\n return false;\n }\n }\n\n /**\n * Register shutdown hook\n */\n public onShutdown(callback: () => Promise<void> | void): void {\n const originalHandler = process.listeners('SIGTERM')[0] as (() => void) | undefined;\n\n process.removeAllListeners('SIGTERM');\n process.on('SIGTERM', () => {\n void (async () => {\n await callback();\n if (typeof originalHandler === 'function') {\n originalHandler();\n }\n })();\n });\n }\n\n /**\n * Check if application is ready\n */\n public async isReady(): Promise<boolean> {\n const health = await this.performHealthCheck();\n return health.healthy;\n }\n\n /**\n * Get metrics\n */\n public getMetrics(): {\n memory: NodeJS.MemoryUsage;\n uptime: number;\n cpu: NodeJS.CpuUsage;\n } {\n return {\n memory: process.memoryUsage(),\n uptime: Math.floor((Date.now() - this.startTime.getTime()) / 1000),\n cpu: process.cpuUsage(),\n };\n }\n}\n\n/**\n * Create bootstrap instance\n */\nexport function createBootstrap(config: BootstrapConfig): BootstrapModule {\n return new BootstrapModule(config);\n}\n","/**\n * Tenant Backend Client\n * Centralized client for accessing tenant-backend services (notifications, auth, etc.)\n *\n * This is a reusable utility that can be used by any backend to communicate with tenant-backend.\n */\n\nimport { BurdenoffGraphQLClient } from './graphql.js';\nimport { TenantNotificationsModule } from '../notifications/tenant-notifications.js';\nimport { logger } from '../logger/index.js';\nimport type { SDKConfig } from '../types/index.js';\n\nexport interface TenantBackendClientConfig {\n /** Tenant backend GraphQL URL */\n tenantBackendUrl: string;\n /** Workspaces backend GraphQL URL (for SDK initialization) */\n workspacesBackendUrl?: string;\n /** Optional API key for tenant backend authentication */\n apiKey?: string;\n}\n\n/**\n * Tenant Backend Client\n * Provides access to centralized tenant-backend services using be-sdk\n *\n * @example\n * ```typescript\n * import { TenantBackendClient } from '@burdenoff/be-sdk';\n *\n * const client = new TenantBackendClient({\n * tenantBackendUrl: process.env.GLOBAL_INT_GATEWAY_URL!,\n * workspacesBackendUrl: process.env.WORKSPACES_BACKEND_URL,\n * apiKey: process.env.TENANT_BACKEND_API_KEY,\n * });\n *\n * // Send notification\n * await client.notifications.sendWithTemplate({\n * templateSlug: 'user-welcome',\n * recipients: ['user@example.com'],\n * variables: { userName: 'John' },\n * });\n *\n * // Execute raw query\n * const result = await client.query(`\n * query GetUser($id: ID!) {\n * user(id: $id) { id name email }\n * }\n * `, { id: 'user-123' });\n * ```\n */\nexport class TenantBackendClient {\n private graphqlClient: BurdenoffGraphQLClient;\n private config: TenantBackendClientConfig;\n\n /** Notifications module for sending notifications via tenant backend */\n public readonly notifications: TenantNotificationsModule;\n\n constructor(config: TenantBackendClientConfig) {\n this.config = config;\n\n // Build SDK config\n const sdkConfig: SDKConfig = {\n workspacesApiUrl: config.workspacesBackendUrl || 'http://localhost:4000/graphql',\n tenantApiUrl: config.tenantBackendUrl,\n };\n\n // Initialize GraphQL client\n this.graphqlClient = new BurdenoffGraphQLClient(sdkConfig, {});\n\n // Initialize notifications module with empty context (context will be set per request)\n this.notifications = new TenantNotificationsModule(this.graphqlClient, {});\n\n logger.info('[TenantBackend] Client initialized using be-sdk', {\n tenantUrl: config.tenantBackendUrl,\n workspacesUrl: config.workspacesBackendUrl,\n hasApiKey: !!config.apiKey,\n });\n }\n\n /**\n * Update authentication token\n *\n * @param token - JWT token for authentication\n */\n public setAuthToken(token: string): void {\n this.graphqlClient.updateContext({ token });\n logger.debug('[TenantBackend] Authentication token updated');\n }\n\n /**\n * Execute raw GraphQL query against tenant backend\n *\n * @param query - GraphQL query string\n * @param variables - Query variables\n * @returns Query result\n *\n * @example\n * ```typescript\n * const result = await client.query(`\n * query GetTemplate($slug: String!) {\n * notificationTemplate(slug: $slug) {\n * id\n * slug\n * subject\n * }\n * }\n * `, { slug: 'user-welcome' });\n * ```\n */\n public async query<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n return this.graphqlClient.tenantQuery<T>(query, variables);\n }\n\n /**\n * Health check\n *\n * @returns True if tenant backend is reachable, false otherwise\n */\n public async healthCheck(): Promise<boolean> {\n try {\n const query = `\n query HealthCheck {\n __typename\n }\n `;\n await this.graphqlClient.tenantQuery(query);\n return true;\n } catch (error) {\n logger.error('[TenantBackend] Health check failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n }\n\n /**\n * Get GraphQL client for advanced usage\n *\n * @returns Underlying BurdenoffGraphQLClient\n */\n public getClient(): BurdenoffGraphQLClient {\n return this.graphqlClient;\n }\n\n /**\n * Get client configuration\n *\n * @returns Client configuration\n */\n public getConfig(): TenantBackendClientConfig {\n return { ...this.config };\n }\n}\n\n/**\n * Create a TenantBackendClient instance\n *\n * @param config - Client configuration\n * @returns TenantBackendClient instance\n *\n * @example\n * ```typescript\n * import { createTenantBackendClient } from '@burdenoff/be-sdk';\n *\n * const client = createTenantBackendClient({\n * tenantBackendUrl: process.env.GLOBAL_INT_GATEWAY_URL!,\n * });\n * ```\n */\nexport function createTenantBackendClient(config: TenantBackendClientConfig): TenantBackendClient {\n return new TenantBackendClient(config);\n}\n","/**\n * Burdenoff Backend SDK\n * Comprehensive SDK for all Burdenoff products\n *\n * @packageDocumentation\n */\n\nimport { BurdenoffGraphQLClient } from './client/graphql.js';\nimport type { SDKConfig, SDKContext } from './types/index.js';\nimport type { Logger } from './logger/index.js';\nimport { logger } from './logger/index.js';\nimport { ContextManager } from './context/index.js';\nimport { AuthModule } from './auth/index.js';\nimport { NotificationsModule } from './notifications/index.js';\nimport { TenantNotificationsModule } from './notifications/tenant-notifications.js';\nimport { RBACModule } from './rbac/index.js';\nimport { ActivityModule } from './activity/index.js';\nimport { UsageModule } from './usage/index.js';\nimport { TrackerModule } from './tracker/index.js';\nimport { DatabaseModule } from './database/index.js';\nimport { EventsModule, EventQueueFactory, QueueType } from './event-queue/index.js';\nimport type { IEventPublisher, PublisherConfig } from './event-queue/index.js';\nimport { disposeAll } from './lifecycle/index.js';\nimport { GraphModule } from './graph/index.js';\nimport { SearchModule } from './search/index.js';\nimport { TranslationModule } from './translation/index.js';\nimport { PaymentsModule } from './payments/index.js';\nimport type { BootstrapModule } from './bootstrap/index.js';\nimport { createBootstrap } from './bootstrap/index.js';\n// Temporal is lazy-loaded to avoid requiring @temporalio/client when not used\nimport type { TemporalModule } from './temporal/index.js';\n\n/**\n * Main Burdenoff SDK class\n *\n * @example\n * ```typescript\n * import { BurdenoffSDK } from '@burdenoff/be-sdk';\n *\n * const sdk = new BurdenoffSDK({\n * workspacesApiUrl: 'https://api.burdenoff.com/graphql',\n * timeout: 30000,\n * });\n *\n * // Use the unified tracker (most common use case)\n * const result = await sdk.tracker.track({\n * userId: 'user123',\n * action: 'create_project',\n * resourceType: 'project',\n * usage: {\n * metricType: UsageMetricType.PROJECTS,\n * amount: 1,\n * },\n * });\n * ```\n */\nexport class BurdenoffSDK {\n private client: BurdenoffGraphQLClient;\n private defaultContext: SDKContext;\n\n // Event queue publisher state (Redis Streams)\n private eventPublisher: IEventPublisher | null = null;\n private eventPublisherInitPromise: Promise<void> | null = null;\n private eventQueueConfig: import('./types/index.js').EventQueueSDKConfig | null = null;\n\n // Initialization state\n private initializationPromise: Promise<void> | null = null;\n private isShuttingDown = false;\n\n /** Authentication module */\n public readonly auth: AuthModule;\n\n /** Notifications module (workspaces-backend) */\n public readonly notifications: NotificationsModule;\n\n /** Tenant Notifications module (tenant-backend - RECOMMENDED) */\n public readonly tenantNotifications: TenantNotificationsModule;\n\n /** RBAC module */\n public readonly rbac: RBACModule;\n\n /** Activity tracking module */\n public readonly activity: ActivityModule;\n\n /** Usage & Quota module */\n public readonly usage: UsageModule;\n\n /** Unified Tracker module (MOST IMPORTANT - use this for most operations) */\n public readonly tracker: TrackerModule;\n\n /** Database helpers module */\n public readonly database: typeof DatabaseModule;\n\n /** Events/Queue module */\n public readonly events: EventsModule;\n\n /** Graph integration module */\n public readonly graph: GraphModule;\n\n /** Search module */\n public readonly search: SearchModule;\n\n /** Translation module */\n public readonly translation: TranslationModule;\n\n /** Payments module */\n public readonly payments: PaymentsModule;\n\n /** Temporal workflow orchestration module (lazy-loaded) */\n private _temporal: TemporalModule | null = null;\n private _temporalPromise: Promise<TemporalModule> | null = null;\n private _temporalConfig: { moduleType?: string; address?: string; namespace?: string; taskQueue?: string } | null =\n null;\n\n /**\n * Get Temporal workflow orchestration module (lazy-loaded)\n * Only loads @temporalio/client when this method is called\n *\n * @returns Promise resolving to TemporalModule\n * @example\n * ```typescript\n * const temporal = await sdk.getTemporalModule();\n * await temporal.startWorkflow('myWorkflow', { ... });\n * ```\n */\n public async getTemporalModule(): Promise<TemporalModule> {\n if (this._temporal) {\n return this._temporal;\n }\n\n if (!this._temporalPromise) {\n this._temporalPromise = this.loadTemporalModule();\n }\n\n return this._temporalPromise;\n }\n\n /**\n * Load temporal module dynamically\n * @private\n */\n private async loadTemporalModule(): Promise<TemporalModule> {\n const { TemporalModule: TM } = (await import('./temporal/index.js')) as { TemporalModule: typeof TemporalModule };\n this._temporal = this._temporalConfig?.moduleType\n ? new TM({\n moduleType: this._temporalConfig.moduleType as 'workspace' | 'tenant',\n address: this._temporalConfig.address,\n namespace: this._temporalConfig.namespace,\n taskQueue: this._temporalConfig.taskQueue,\n })\n : TM.fromEnv();\n return this._temporal;\n }\n\n /** Logger instance */\n public readonly logger: Logger;\n\n /** Context manager */\n public readonly context: typeof ContextManager;\n\n /**\n * Create SDK instance\n */\n constructor(config: SDKConfig, defaultContext: SDKContext = {}) {\n // Initialize client\n this.client = new BurdenoffGraphQLClient(config, defaultContext);\n this.defaultContext = defaultContext;\n\n // Initialize logger\n this.logger = logger;\n if (config.logger) {\n this.logger.setLevel(config.logger.level);\n this.logger.setConsoleEnabled(config.logger.console);\n if (config.logger.transport) {\n this.logger.addTransport(config.logger.transport);\n }\n }\n\n // Initialize context manager\n this.context = ContextManager;\n if (Object.keys(defaultContext).length > 0) {\n ContextManager.setContext(defaultContext);\n }\n\n // Initialize all modules\n this.auth = new AuthModule(this.client, defaultContext);\n this.notifications = new NotificationsModule(this.client, defaultContext);\n this.tenantNotifications = new TenantNotificationsModule(this.client, defaultContext);\n this.rbac = new RBACModule(this.client, defaultContext);\n this.activity = new ActivityModule(this.client, defaultContext);\n this.usage = new UsageModule(this.client, defaultContext);\n this.tracker = new TrackerModule(this.client, defaultContext);\n this.database = DatabaseModule;\n this.events = new EventsModule(this.client, defaultContext);\n this.graph = new GraphModule(this.client, defaultContext);\n this.search = new SearchModule(this.client, defaultContext);\n this.translation = new TranslationModule(this.client, defaultContext);\n this.payments = new PaymentsModule(this.client, defaultContext);\n\n // Store Temporal configuration for lazy loading (avoids requiring @temporalio/client when not used)\n if (config.temporalModuleType) {\n this._temporalConfig = {\n moduleType: config.temporalModuleType,\n address: config.temporalAddress,\n namespace: config.temporalNamespace,\n taskQueue: config.temporalTaskQueue,\n };\n }\n\n // Store event queue configuration. Auto-enabled when REDIS_URL is set\n // even if no explicit config block is provided.\n if (config.eventQueue || process.env['REDIS_URL']) {\n this.eventQueueConfig = {\n autoConnect: true,\n maxReconnectAttempts: -1,\n reconnectTimeWait: 2000,\n ...config.eventQueue,\n };\n }\n\n logger.info('[SDK] Burdenoff SDK initialized', {\n workspacesApiUrl: config.workspacesApiUrl,\n tenantApiUrl: config.tenantApiUrl,\n hasDefaultContext: Object.keys(defaultContext).length > 0,\n hasEventQueueConfig: !!this.eventQueueConfig,\n hasTemporalConfig: !!config.temporalModuleType,\n });\n\n // Schedule background initialization outside the constructor\n // This defers async work to after constructor completes (satisfies no-async-constructor)\n this.scheduleBackgroundInit();\n }\n\n /**\n * Schedule background initialization outside constructor\n * Uses queueMicrotask to defer async work while maintaining initialization order\n * @private\n */\n private scheduleBackgroundInit(): void {\n queueMicrotask(() => {\n this.initializationPromise = this.initializeAsync();\n });\n }\n\n /**\n * Update SDK context\n */\n public setContext(context: SDKContext): void {\n this.defaultContext = { ...this.defaultContext, ...context };\n this.client.updateContext(context);\n ContextManager.setContext(this.defaultContext);\n }\n\n /**\n * Get current context\n */\n public getContext(): SDKContext | undefined {\n return ContextManager.getContext();\n }\n\n /**\n * Run function with specific context\n */\n public async withContext<T>(context: SDKContext, fn: () => Promise<T>): Promise<T> {\n return ContextManager.withContext(context, fn);\n }\n\n /**\n * Background initialization for event queue and other async resources\n * @private\n */\n private async initializeAsync(): Promise<void> {\n const promises: Promise<void>[] = [];\n\n if (this.eventQueueConfig?.autoConnect) {\n promises.push(\n this.initializeEventQueue().catch((error) => {\n logger.warn('[SDK] Failed to auto-connect to Redis Streams', { error });\n })\n );\n }\n\n await Promise.allSettled(promises);\n }\n\n /**\n * Initialize the Redis Streams event publisher\n * @private\n */\n private async initializeEventQueue(): Promise<void> {\n if (!this.eventQueueConfig || this.eventPublisher) return;\n\n const url = this.eventQueueConfig.url || process.env['REDIS_URL'];\n if (!url) {\n logger.warn('[SDK] No REDIS_URL available — event publisher disabled');\n return;\n }\n\n const publisherConfig: PublisherConfig = {\n type: QueueType.REDIS_STREAMS,\n url,\n password: this.eventQueueConfig.password,\n name: this.eventQueueConfig.name || 'burdenoff-sdk-publisher',\n maxReconnectAttempts: this.eventQueueConfig.maxReconnectAttempts ?? -1,\n reconnectTimeWait: this.eventQueueConfig.reconnectTimeWait ?? 2000,\n };\n\n this.eventPublisher = EventQueueFactory.createPublisher(publisherConfig);\n await this.eventPublisher.connect();\n\n logger.info('[SDK] Redis Streams event publisher initialized', {\n url,\n name: this.eventQueueConfig.name,\n });\n }\n\n /**\n * Get the event publisher instance (lazy initialization).\n *\n * @example\n * ```typescript\n * const publisher = await sdk.getEventPublisher();\n * await publisher.publish({\n * subject: 'events.user.created',\n * data: { userId: 'user-123' }\n * });\n * ```\n */\n public async getEventPublisher(): Promise<IEventPublisher> {\n if (this.eventPublisher) return this.eventPublisher;\n if (!this.eventQueueConfig) {\n throw new Error('[SDK] Event queue not configured - set REDIS_URL or provide config.eventQueue');\n }\n\n if (!this.eventPublisherInitPromise) {\n this.eventPublisherInitPromise = this.initializeEventQueue();\n }\n await this.eventPublisherInitPromise;\n\n if (!this.eventPublisher) {\n throw new Error('[SDK] Event publisher initialization failed');\n }\n return this.eventPublisher;\n }\n\n /**\n * Wait for SDK initialization to complete\n *\n * @example\n * ```typescript\n * await sdk.waitForReady();\n * ```\n */\n public async waitForReady(): Promise<void> {\n if (this.initializationPromise) {\n await this.initializationPromise;\n }\n }\n\n /**\n * Check event queue (Redis Streams) health status\n *\n * @example\n * ```typescript\n * const health = await sdk.isEventQueueHealthy();\n * if (health.status === 'healthy') {\n * console.log('Event queue is connected');\n * }\n * ```\n */\n public async isEventQueueHealthy(): Promise<import('./types/index.js').EventQueueHealthStatus> {\n if (!this.eventQueueConfig) {\n return { status: 'not_configured', connected: false };\n }\n\n if (!this.eventPublisher) {\n return {\n status: 'unhealthy',\n connected: false,\n url: this.eventQueueConfig.url,\n details: { reason: 'Not initialized' },\n };\n }\n\n try {\n const healthCheck = await this.eventPublisher.healthCheck();\n return {\n status: healthCheck.status as 'healthy' | 'unhealthy',\n connected: this.eventPublisher.isConnected(),\n url: this.eventQueueConfig.url,\n details: healthCheck.details,\n };\n } catch (error) {\n return {\n status: 'unhealthy',\n connected: false,\n url: this.eventQueueConfig.url,\n details: { error: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n\n /**\n * Check Temporal health status\n *\n * @example\n * ```typescript\n * const health = await sdk.isTemporalHealthy();\n * if (health.status === 'healthy') {\n * console.log('Temporal is connected');\n * }\n * ```\n */\n public async isTemporalHealthy(): Promise<import('./types/index.js').TemporalHealthStatus> {\n // If temporal hasn't been loaded yet, it's not configured\n if (!this._temporal) {\n return { status: 'not_configured', connected: false };\n }\n\n const config = this._temporal.getConfig();\n\n if (!config.address) {\n return { status: 'not_configured', connected: false };\n }\n\n try {\n const client = this._temporal.getClient();\n // Use the public isClientConnected method\n const connected = client.isClientConnected();\n\n return {\n status: connected ? 'healthy' : 'unhealthy',\n connected: connected,\n address: config.address,\n namespace: config.namespace,\n details: { taskQueue: config.taskQueue },\n };\n } catch (error: unknown) {\n return {\n status: 'unhealthy',\n connected: false,\n address: config.address,\n namespace: config.namespace,\n details: { error: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n\n /**\n * Get overall SDK health status\n *\n * @example\n * ```typescript\n * const health = await sdk.getHealthStatus();\n * console.log('Event Queue:', health.eventQueue.status);\n * console.log('Temporal:', health.temporal.status);\n * ```\n */\n public async getHealthStatus(): Promise<import('./types/index.js').SDKHealthStatus> {\n const [eventQueue, temporal] = await Promise.all([this.isEventQueueHealthy(), this.isTemporalHealthy()]);\n return { eventQueue, temporal };\n }\n\n /**\n * Graceful shutdown - disconnect all resources\n *\n * @example\n * ```typescript\n * // On application shutdown\n * await sdk.shutdown({ timeout: 5000, force: true });\n * ```\n */\n public async shutdown(options: import('./types/index.js').SDKShutdownOptions = {}): Promise<void> {\n if (this.isShuttingDown) {\n logger.warn('[SDK] Shutdown already in progress');\n return;\n }\n this.isShuttingDown = true;\n\n const timeout = options.timeout ?? 5000;\n const force = options.force ?? true;\n\n logger.info('[SDK] Starting graceful shutdown', { timeout, force });\n\n const shutdownPromises: Promise<void>[] = [];\n\n if (this.eventPublisher) {\n shutdownPromises.push(\n this.eventPublisher.disconnect().catch((error) => {\n logger.error('[SDK] Error disconnecting event publisher', { error });\n })\n );\n }\n\n if (this._temporal) {\n shutdownPromises.push(\n this._temporal.disconnect().catch((error: unknown) => {\n logger.error('[SDK] Error disconnecting Temporal', { error });\n })\n );\n }\n\n // Close every other long-lived connection registered process-wide — the\n // Redis Streams event consumer(s) (whose blocking clients nothing else\n // closes) and cache clients — so shutdown is complete regardless of how\n // those resources were constructed. disposeAll is bounded + never throws.\n shutdownPromises.push(disposeAll(timeout));\n\n try {\n await Promise.race([\n Promise.allSettled(shutdownPromises),\n new Promise((_, reject) => setTimeout(() => reject(new Error('[SDK] Shutdown timeout exceeded')), timeout)),\n ]);\n\n logger.info('[SDK] Shutdown completed successfully');\n } catch (error) {\n if (!force) {\n throw error;\n }\n logger.warn('[SDK] Shutdown timeout exceeded, forcing shutdown', { error });\n }\n }\n\n /**\n * Create bootstrap instance\n */\n public static createBootstrap(config: Parameters<typeof createBootstrap>[0]): BootstrapModule {\n return createBootstrap(config);\n }\n}\n\n// ============================================================================\n// Core SDK Exports (Top-level)\n// ============================================================================\n\nexport { BurdenoffGraphQLClient } from './client/graphql.js';\nexport { TenantBackendClient, createTenantBackendClient } from './client/tenant-backend.js';\nexport type { TenantBackendClientConfig } from './client/tenant-backend.js';\nexport {\n createInternalClient,\n createInternalClientForWorkspaces,\n createInternalClientForTenant,\n} from './client/internal-client.js';\nexport { ContextManager } from './context/index.js';\nexport { AuthModule } from './auth/index.js';\nexport { NotificationsModule } from './notifications/index.js';\nexport {\n RBACModule,\n createRBACDirective,\n createRBACDirectiveForLayer,\n createRBACDirectiveFromEnv,\n type RBACDirectiveConfig,\n type LayerAwareRBACConfig,\n} from './rbac/index.js';\nexport { ActivityModule } from './activity/index.js';\nexport { UsageModule } from './usage/index.js';\nexport { TrackerModule } from './tracker/index.js';\nexport { DatabaseModule } from './database/index.js';\nexport { EventsModule } from './event-queue/index.js';\nexport {\n registerDisposable,\n unregisterDisposable,\n getRegisteredDisposableCount,\n disposeAll,\n type ShutdownDisposable,\n} from './lifecycle/index.js';\nexport { GraphModule } from './graph/index.js';\nexport { SearchModule } from './search/index.js';\nexport { TranslationModule } from './translation/index.js';\nexport type {\n TranslationExportFormat,\n ProductTranslationTree,\n ExportProductTranslationsOptions,\n ProductTranslationsExportResult,\n UpsertProductTranslationsOptions,\n UpsertProductTranslationsResult,\n} from './translation/index.js';\nexport { PaymentsModule } from './payments/index.js';\nexport {\n ResourceCapsModule,\n ResourceCapExceededError,\n RESOURCE_CAP_DEFAULTS,\n getResourceCaps,\n type ResourceName,\n type ResourceCap,\n type ResourceCapsConfig,\n type PlanTier,\n type ResourceCapDefaults,\n} from './resource-caps/index.js';\n// Generic sharing (invite/accept/permission). Primary entrypoint is the\n// '@burdenoff/be-sdk/sharing' subpath; namespace-exported here to avoid symbol\n// collisions at the package root.\nexport * as Sharing from './sharing/index.js';\nexport { BootstrapModule, createBootstrap } from './bootstrap/index.js';\nexport {\n TemporalModule,\n TemporalClient,\n TemporalClientFactory,\n TemporalWorker,\n TemporalWorkerFactory,\n TemporalWorkerManager,\n type TemporalClientConfig,\n type TemporalWorkerConfig,\n type WorkflowStartOptions,\n} from './temporal/index.js';\n\n// Export core SDK types (only SDK-specific types, not module types)\nexport type {\n SDKConfig,\n SDKContext,\n LoggerConfig,\n LoggerTransport,\n EventQueueSDKConfig,\n EventQueueHealthStatus,\n TemporalHealthStatus,\n SDKHealthStatus,\n SDKShutdownOptions,\n // Layer types\n ServiceLayer,\n LayerConfig,\n LayerGatewayConfig,\n LayerResourceUrls,\n LayerFullConfig,\n GatewayRoutingConfig,\n CircuitBreakerConfig,\n GatewayRetryConfig,\n GatewayRequestHeaders,\n} from './types/index.js';\n\n// Export layer defaults\nexport {\n DEFAULT_GATEWAY_ROUTING,\n DEFAULT_LAYER_RESOURCES,\n DEFAULT_LAYER_STREAMS,\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n DEFAULT_GATEWAY_RETRY_CONFIG,\n} from './types/index.js';\n\n// ============================================================================\n// Namespaced Exports (Recommended - Avoids Collisions)\n// ============================================================================\n\n/**\n * Logger namespace - Logging functionality\n *\n * @example\n * ```typescript\n * import { Logger } from '@burdenoff/be-sdk';\n *\n * Logger.logger.info('Message');\n * Logger.log('Message');\n * Logger.error('Error message');\n * ```\n */\nexport * as Logger from './logger/index.js';\n\n/**\n * Cache namespace - Caching functionality\n *\n * @example\n * ```typescript\n * import { Cache } from '@burdenoff/be-sdk';\n *\n * const cache = Cache.createCache('my-namespace');\n * await cache.connect();\n * await cache.set('key', 'value', { ttl: 60 });\n * ```\n */\nexport * as Cache from './cache/index.js';\n\n/**\n * EventQueue namespace - Event queue/messaging functionality\n *\n * @example\n * ```typescript\n * import { EventQueue } from '@burdenoff/be-sdk';\n *\n * const publisher = EventQueue.createPublisher();\n * await publisher.connect();\n * await publisher.publish({ subject: 'events.test', data: { foo: 'bar' } });\n * ```\n */\nexport * as EventQueue from './event-queue/index.js';\n\n/**\n * Lifecycle namespace - graceful-shutdown registry for long-lived connections\n *\n * @example\n * ```typescript\n * import { Lifecycle } from '@burdenoff/be-sdk';\n *\n * // Close every registered connection (event bus, cache) on shutdown.\n * await Lifecycle.disposeAll();\n * ```\n */\nexport * as Lifecycle from './lifecycle/index.js';\n\n/**\n * Graph namespace - Graph database operations\n *\n * @example\n * ```typescript\n * import { Graph } from '@burdenoff/be-sdk';\n *\n * const syncService = new Graph.GraphSyncService();\n * await syncService.processEvent(event);\n * ```\n */\nexport * as Graph from './graph/index.js';\n\n/**\n * Middleware namespace - HTTP/GraphQL middleware\n *\n * @example\n * ```typescript\n * import { Middleware } from '@burdenoff/be-sdk';\n *\n * app.use(Middleware.SecurityMiddleware);\n * app.use(Middleware.setupMetricsMiddleware());\n * ```\n */\nexport * as Middleware from './middleware/index.js';\n\n/**\n * Observability namespace - Monitoring, tracing, metrics\n *\n * @example\n * ```typescript\n * import { Observability } from '@burdenoff/be-sdk';\n *\n * const tracer = Observability.createTracer('my-service');\n * ```\n */\nexport * as Observability from './observability/index.js';\n\n/**\n * GraphQL namespace - GraphQL utilities\n *\n * @example\n * ```typescript\n * import { GraphQL } from '@burdenoff/be-sdk';\n *\n * const schema = GraphQL.buildSchema(typeDefs);\n * ```\n */\nexport * as GraphQL from './graphql/index.js';\n\n/**\n * Prisma namespace - Prisma utilities and helpers\n *\n * @example\n * ```typescript\n * import { Prisma } from '@burdenoff/be-sdk';\n *\n * const client = Prisma.createPrismaClient();\n * ```\n */\nexport * as Prisma from './prisma/index.js';\n\n/**\n * Utils namespace - General utilities\n *\n * @example\n * ```typescript\n * import { Utils } from '@burdenoff/be-sdk';\n *\n * const id = Utils.generateId();\n * ```\n */\nexport * as Utils from './utils/index.js';\n\n/**\n * I18n namespace - Internationalization utilities\n *\n * @example\n * ```typescript\n * import { I18n } from '@burdenoff/be-sdk';\n *\n * const i18n = new I18n.I18n({\n * defaultLocale: 'en-US',\n * localesPath: './locales',\n * });\n * await i18n.initialize();\n *\n * const ctx = i18n.createContextFromRequest(request);\n * const message = ctx.t('errors.notFound', { resource: 'Tag' });\n * ```\n */\nexport * as I18n from './i18n/index.js';\n\n/**\n * Translation helper functions - Direct exports for convenience\n *\n * Use `t()` in GraphQL resolvers and providers to get translated messages:\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 bound translator\n * const translate = createTranslator(ctx);\n * const msg = translate('tags.errors.notFound', 'Tag not found');\n * ```\n */\nexport { t, createTranslator, hasI18n, getLocale, getLanguage } from './i18n/helpers.js';\nexport type { I18nCapableContext, Translator } from './i18n/helpers.js';\n\n/**\n * Export namespace - Data export utilities\n *\n * @example\n * ```typescript\n * import { Export } from '@burdenoff/be-sdk';\n *\n * class UserExporter extends Export.BaseModuleExporter<User> {\n * moduleKey = 'users';\n * // ...\n * }\n *\n * const csv = Export.convertToCSV(data);\n * const paginated = Export.PaginationService.paginate(items, { page: 1 });\n * ```\n */\nexport * as Export from './export/index.js';\n\n/**\n * Init namespace - Initialization utilities\n *\n * @example\n * ```typescript\n * import { Init } from '@burdenoff/be-sdk';\n *\n * await Init.initializeArangoSchema();\n * ```\n */\nexport * as Init from './init/index.js';\n\n/**\n * DataLoader namespace - DataLoader utilities for batching and caching\n *\n * @example\n * ```typescript\n * import { DataLoader } from '@burdenoff/be-sdk';\n *\n * const tagLoader = DataLoader.createEntityLoader<Tag, string>({\n * batchFn: async (ids) => db.tag.findMany({ where: { id: { in: [...ids] } } }),\n * getKey: (tag) => tag.id,\n * });\n *\n * const tag = await tagLoader.load('tag-123');\n * ```\n */\nexport * as DataLoader from './dataloader/index.js';\n\n/**\n * Notifications namespace - Notification functionality\n *\n * @example\n * ```typescript\n * import { Notifications } from '@burdenoff/be-sdk';\n *\n * await notifications.sendWithTemplate({\n * templateSlug: 'welcome-email',\n * recipients: ['user@example.com'],\n * variables: { name: 'John' }\n * });\n * ```\n */\nexport * as Notifications from './notifications/tenant-notifications.js';\n\n/**\n * Instrumentation namespace - OpenTelemetry instrumentation utilities\n *\n * Provides comprehensive tracing, metrics, and logging instrumentation\n * for microservices with conditional enable/disable support.\n *\n * @example\n * ```typescript\n * import { Instrumentation } from '@burdenoff/be-sdk';\n *\n * // Initialize instrumentation\n * const { tracer, metrics } = Instrumentation.initializeInstrumentation('my-service', {\n * features: { tracing: true, metrics: true, logging: true }\n * });\n *\n * // Create spans\n * await tracer.withSpan('operation', async (span) => {\n * span.setAttribute('key', 'value');\n * });\n *\n * // Create metrics\n * const counter = Instrumentation.createCounter('requests_total', 'Total requests');\n * counter.inc({ endpoint: '/api/users' });\n *\n * // Use decorators\n * class MyService {\n * @Instrumentation.Trace()\n * async myMethod() { ... }\n *\n * @Instrumentation.Instrument({ tracing: true, metrics: true, logging: true })\n * async trackedMethod() { ... }\n * }\n *\n * // GraphQL instrumentation plugin\n * const yoga = createYoga({\n * plugins: [Instrumentation.createGraphQLInstrumentationPlugin()],\n * });\n * ```\n */\nexport * as Instrumentation from './instrumentation/index.js';\n\n/**\n * Layer namespace - Service layer detection and configuration\n *\n * Provides automatic detection of service layer (wspace vs global) and\n * configuration of layer-specific resource URLs.\n *\n * @example\n * ```typescript\n * import { Layer } from '@burdenoff/be-sdk';\n *\n * // Create layer manager\n * const layerManager = new Layer.LayerManager({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Get layer-specific URLs\n * const internalGatewayUrl = layerManager.getInternalGatewayUrl();\n * const crossLayerGatewayUrl = layerManager.getCrossLayerGatewayUrl();\n * const eventQueueUrl = layerManager.getEventQueueUrl();\n * const valkeyUrl = layerManager.getValkeyUrl();\n *\n * // Create from environment\n * const manager = Layer.createLayerManagerFromEnv('wspace-tags-svc');\n *\n * // Detect layer from service name\n * const layer = Layer.detectLayerFromServiceName('global-auth-svc'); // 'global'\n * ```\n */\nexport * as Layer from './layer/index.js';\n\n/**\n * Crypto namespace - Encryption utilities for sensitive data\n *\n * Provides AES-256-GCM encryption/decryption for storing sensitive\n * data like credentials, API keys, and secrets.\n *\n * @example\n * ```typescript\n * import { Crypto } from '@burdenoff/be-sdk';\n *\n * // Generate a key (store this securely, e.g., in env vars)\n * const key = Crypto.generateEncryptionKey();\n *\n * // Encrypt sensitive data\n * const encrypted = Crypto.encrypt('my-api-key', key);\n *\n * // Decrypt when needed\n * const decrypted = Crypto.decrypt(encrypted, key);\n *\n * // Check if value is already encrypted\n * if (!Crypto.isEncrypted(value)) {\n * value = Crypto.encrypt(value, key);\n * }\n * ```\n */\nexport * as Crypto from './crypto/index.js';\n\n/**\n * Gateway namespace - Unified gateway client with circuit breaker\n *\n * Provides GraphQL client with automatic circuit breaker, retry logic,\n * and layer-aware routing for internal and cross-layer communication.\n *\n * @example\n * ```typescript\n * import { Gateway } from '@burdenoff/be-sdk';\n *\n * // Create gateway client\n * const client = new Gateway.GatewayClient({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * serviceIdentity: 'wspace-tags-svc',\n * internalGatewayUrl: 'http://wspace-int-gateway:4000/graphql',\n * crossLayerGatewayUrl: 'http://global-public-gateway:4000/graphql',\n * });\n *\n * // Make internal (same-layer) query\n * const result = await client.internalQuery({\n * query: 'query GetTags { tags { id name } }',\n * });\n *\n * // Make cross-layer query (e.g., wspace -> global)\n * const tenant = await client.crossLayerQuery({\n * query: 'query GetTenant($id: ID!) { tenant(id: $id) { name } }',\n * variables: { id: 'tenant-123' },\n * });\n *\n * // Create from environment\n * const gatewayClient = Gateway.createGatewayClientFromEnv('wspace-tags-svc');\n * ```\n */\nexport * as Gateway from './gateway/index.js';\n\n/**\n * FeatureFlags namespace - In-house feature flag evaluation\n *\n * @example\n * ```typescript\n * import { FeatureFlags } from '@burdenoff/be-sdk';\n *\n * const provider = new FeatureFlags.FeatureFlagProvider({\n * gatewayUrl: 'http://global-int-gateway:4000/global/graphql',\n * });\n *\n * const isEnabled = await provider.isEnabled('calendar.recurring-events', {\n * actorId: 'user-123',\n * actorType: 'user',\n * workspaceId: 'ws-456',\n * });\n * ```\n */\nexport * as FeatureFlags from './feature-flags/index.js';\n\n/**\n * Captcha namespace - reCAPTCHA v2/v3 token verification\n *\n * Provides environment-toggleable reCAPTCHA verification using Google's\n * siteverify API. Supports both v2 (checkbox) and v3 (invisible/score-based).\n *\n * @example\n * ```typescript\n * import { Captcha } from '@burdenoff/be-sdk';\n *\n * // Auto-bypass when CAPTCHA_ENABLED !== \"true\"\n * const result = await Captcha.verifyCaptchaIfEnabled({\n * token: input.recaptchaToken,\n * expectedAction: 'login',\n * minScore: 0.5,\n * });\n *\n * if (!result.success) {\n * throw new Error('Captcha verification failed');\n * }\n * ```\n */\nexport * as Captcha from './captcha/index.js';\nexport { verifyCaptcha, verifyCaptchaIfEnabled, isCaptchaEnabled } from './captcha/index.js';\nexport type { RecaptchaVerifyOptions, RecaptchaVerifyResult } from './captcha/index.js';\n\n/**\n * Platform Primitives\n *\n * Reusable building blocks consumed by every svc as part of the\n * scale-refactor: hardened HTTP client, leader lock, rate limiter,\n * paginator, dataloader factory, cache-invalidation, monthly PG\n * partition helpers, multi-provider LLM router.\n */\nexport * as Platform from './platform/index.js';\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default BurdenoffSDK;\n\n/**\n * Create SDK instance (convenience function)\n */\nexport function createSDK(config: SDKConfig, context?: SDKContext): BurdenoffSDK {\n return new BurdenoffSDK(config, context);\n}\n"]}
|