@burdenoff/be-sdk 2026.705.1 → 2026.705.3
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/configs/eslint/index.js +19 -0
- package/dist/{chunk-254FNUIC.js → chunk-MD3RHPFS.js} +4 -3
- package/dist/chunk-MD3RHPFS.js.map +1 -0
- package/dist/{chunk-GTEMQXCA.js → chunk-QLXIIF4I.js} +70 -5
- package/dist/chunk-QLXIIF4I.js.map +1 -0
- package/dist/{chunk-UCLDHOZC.js → chunk-YCKM7FS7.js} +12 -4
- package/dist/chunk-YCKM7FS7.js.map +1 -0
- package/dist/{index-COyUmH7o.d.ts → index-DqvNf9U0.d.ts} +8 -2
- package/dist/{index-DgWLSDv2.d.ts → index-lcW5eSTp.d.ts} +7 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/platform/index.d.ts +1 -1
- package/dist/platform/index.js +1 -1
- package/dist/prisma/index.d.ts +1 -1
- package/dist/prisma/index.js +2 -2
- package/dist/server/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-254FNUIC.js.map +0 -1
- package/dist/chunk-GTEMQXCA.js.map +0 -1
- package/dist/chunk-UCLDHOZC.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/prisma/workspace-extension.ts"],"names":["workspaceContextStore","AsyncLocalStorage","fallbackContext","setWorkspaceContext","context","enterWith","getWorkspaceContext","getStore","withWorkspaceContext","fn","run","withWorkspaceContextSync","defaultConfig","enabled","enableReadIsolation","enableDeleteIsolation","enableUpdateWhereIsolation","populateContextJson","populateCreatedBy","populateUpdatedBy","populateTenantId","excludeModels","excludeModelsFromReadIsolation","strictMode","allowedUnguardedOperations","debug","hasField","data","field","injectCreateFields","wsCtx","config","injected","workspaceId","tenantId","actorId","onBehalfOf","contextJson","buildContextJsonFromWorkspaceContext","injectUpdateFields","injectWhereClause","where","organizationId","projectId","appId","Object","keys","length","undefined","injectWhereWorkspaceId","ctx","stripSkipFlag","args","cleaned","isExcludedFromReadIsolation","model","includes","enforceStrictMode","operation","opKey","Error","addWorkspaceExtension","baseClient","fullConfig","logger","info","prismaClient","$extends","query","$allModels","create","_skipWorkspaceInjection","injectedData","injectedKeys","filter","k","join","createMany","dataArray","Array","isArray","map","item","createManyAndReturn","update","injectedWhere","injectedDataKeys","whereChanged","updateMany","upsert","injectedCreate","injectedUpdate","findMany","findFirst","findFirstOrThrow","findUnique","findUniqueOrThrow","count","aggregate","groupBy","delete","deleteMany"],"mappings":"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","file":"chunk-GTEMQXCA.js","sourcesContent":["/**\n * Prisma Workspace Extension\n *\n * Automatically injects workspaceId into ALL Prisma operations using\n * request-scoped context from AsyncLocalStorage:\n *\n * **Write operations** (create, createMany, update, upsert):\n * - Auto-populates `workspaceId`, `tenantId`, `createdBy`, `updatedBy`, `context` JSON\n *\n * **Read operations** (findMany, findFirst, findUnique, count, aggregate, groupBy):\n * - Auto-injects `workspaceId` into the `where` clause for workspace isolation\n *\n * **Delete operations** (delete, deleteMany):\n * - Auto-injects `workspaceId` into the `where` clause to prevent cross-workspace deletion\n *\n * **Update where clause** (update, updateMany):\n * - Auto-injects `workspaceId` into the `where` clause to prevent cross-workspace updates\n *\n * **How it works:**\n * 1. The GraphQL server's buildContext extracts workspaceId from x-workspace-id header\n * 2. The workspace context store (AsyncLocalStorage) holds the current request's workspace info\n * 3. This Prisma extension intercepts ALL operations and auto-injects workspaceId\n *\n * **What gets auto-populated on writes:**\n * - `workspaceId` field (String or String?) - set from context if not explicitly provided\n * - `context` field (Json) - merged with workspace/actor info if not explicitly provided\n * - `tenantId` field (String or String?) - set from context if not explicitly provided\n * - `createdBy` / `updatedBy` fields - set from actor context if not explicitly provided\n *\n * **What gets auto-injected on reads/updates/deletes:**\n * - `workspaceId` in the `where` clause - ensures queries only access data within the workspace\n *\n * **Opt-out:**\n * - Explicitly providing `workspaceId` in the where/data will override auto-injection\n * - Pass `_skipWorkspaceInjection: true` in the query args to skip entirely\n * - Set `enableReadIsolation: false` in config to disable read-side injection only\n * - Add model names to `excludeModels` to skip specific models\n *\n * @module prisma/workspace-extension\n * @category Database\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { logger } from '../logger/index.js';\nimport type { InputJsonValue } from './context.js';\n\n// ============================================================================\n// Workspace Context Store (AsyncLocalStorage)\n// ============================================================================\n\n/**\n * Workspace context for the current request scope\n */\nexport interface WorkspaceContext {\n /** Workspace ID (from x-workspace-id header) */\n workspaceId?: string;\n /** Tenant ID (from x-tenant-id header or derived from workspace) */\n tenantId?: string;\n /** Actor ID (user/service/app performing the operation) */\n actorId?: string;\n /** Actor type (user, app, service, super_admin) */\n actorType?: string;\n /** Organization ID */\n organizationId?: string;\n /** Project ID */\n projectId?: string;\n /** App ID */\n appId?: string;\n /** On behalf of actor ID (for consent-based delegation) */\n onBehalfOf?: string;\n}\n\n/**\n * AsyncLocalStorage for workspace context\n * This is separate from the SDK's general ContextManager to allow\n * fine-grained control over workspace-specific context propagation.\n */\nconst workspaceContextStore = new AsyncLocalStorage<WorkspaceContext>();\n\n/**\n * Fallback context for environments where AsyncLocalStorage.enterWith()\n * doesn't propagate across async boundaries (e.g., Bun + GraphQL Yoga).\n *\n * IMPORTANT: This is NOT request-isolated — it's a module-level singleton.\n * It works for single-request-at-a-time scenarios but could race under\n * concurrent requests. The ALS is the primary mechanism; this is a fallback.\n */\nlet fallbackContext: WorkspaceContext | undefined;\n\n/**\n * Set workspace context for the current async scope.\n * Call this in your GraphQL context builder or middleware.\n *\n * Uses AsyncLocalStorage.enterWith() as the primary mechanism,\n * with a module-level fallback for runtimes where enterWith()\n * doesn't propagate through all async chains (e.g., Bun).\n *\n * @param context - The workspace context for this request\n *\n * @example\n * ```typescript\n * // In your server's buildContext:\n * import { setWorkspaceContext } from '@burdenoff/be-sdk/prisma';\n *\n * buildContext: async (defaultContext) => {\n * setWorkspaceContext({\n * workspaceId: defaultContext.workspace?.id,\n * tenantId: defaultContext.tenant?.id,\n * actorId: defaultContext.actor?.id,\n * actorType: defaultContext.actor?.type,\n * organizationId: defaultContext.organization?.id,\n * });\n * return defaultContext;\n * }\n * ```\n */\nexport function setWorkspaceContext(context: WorkspaceContext): void {\n workspaceContextStore.enterWith(context);\n fallbackContext = context;\n}\n\n/**\n * Get the current workspace context from AsyncLocalStorage.\n * Falls back to module-level context if ALS returns undefined\n * (can happen in Bun where enterWith() doesn't propagate through\n * some async chains like GraphQL Yoga's execution pipeline).\n *\n * @returns The current workspace context, or undefined if not set\n */\nexport function getWorkspaceContext(): WorkspaceContext | undefined {\n return workspaceContextStore.getStore() ?? fallbackContext;\n}\n\n/**\n * Run a function with a specific workspace context.\n * The context is isolated to this execution and its children.\n *\n * @param context - The workspace context\n * @param fn - The function to run\n * @returns The result of the function\n *\n * @example\n * ```typescript\n * const result = await withWorkspaceContext(\n * { workspaceId: 'ws-123', actorId: 'user-456' },\n * async () => {\n * // All Prisma operations in here will auto-inject workspaceId\n * return await prisma.tag.create({ data: { name: 'test' } });\n * }\n * );\n * ```\n */\nexport async function withWorkspaceContext<T>(context: WorkspaceContext, fn: () => Promise<T>): Promise<T> {\n return workspaceContextStore.run(context, fn);\n}\n\n/**\n * Run a synchronous function with a specific workspace context.\n */\nexport function withWorkspaceContextSync<T>(context: WorkspaceContext, fn: () => T): T {\n return workspaceContextStore.run(context, fn);\n}\n\n// ============================================================================\n// Extension Configuration\n// ============================================================================\n\n/**\n * Configuration for the workspace extension\n */\nexport interface WorkspaceExtensionConfig {\n /**\n * Enable automatic workspaceId injection on create/update\n * @default true\n */\n enabled?: boolean;\n\n /**\n * Enable automatic workspaceId injection on read operations\n * (findMany, findFirst, findUnique, findFirstOrThrow, findUniqueOrThrow,\n * count, aggregate, groupBy)\n *\n * When enabled, every read query automatically includes `workspaceId`\n * in the `where` clause, preventing cross-workspace data leakage.\n *\n * @default true\n */\n enableReadIsolation?: boolean;\n\n /**\n * Enable automatic workspaceId injection on delete operations\n * (delete, deleteMany)\n *\n * When enabled, every delete operation automatically includes `workspaceId`\n * in the `where` clause, preventing cross-workspace deletion.\n *\n * @default true\n */\n enableDeleteIsolation?: boolean;\n\n /**\n * Enable automatic workspaceId injection into update/updateMany `where` clauses.\n *\n * When enabled, update operations automatically include `workspaceId`\n * in the `where` clause in addition to the `data` injection,\n * preventing cross-workspace updates.\n *\n * @default true\n */\n enableUpdateWhereIsolation?: boolean;\n\n /**\n * Automatically populate the `context` JSON field with workspace/actor info\n * @default true\n */\n populateContextJson?: boolean;\n\n /**\n * Automatically populate `createdBy` field on create operations\n * @default true\n */\n populateCreatedBy?: boolean;\n\n /**\n * Automatically populate `updatedBy` field on update operations\n * @default true\n */\n populateUpdatedBy?: boolean;\n\n /**\n * Automatically populate `tenantId` field from context\n * @default false (tenantId is typically derived from workspaceId at the DB level)\n */\n populateTenantId?: boolean;\n\n /**\n * Models to exclude from auto-injection (both reads and writes).\n * Use this for models that intentionally don't have workspaceId.\n *\n * Common exclusions: system tables, infra tables, global reference data.\n *\n * @default []\n */\n excludeModels?: string[];\n\n /**\n * Models to exclude from read isolation only.\n * These models will still get write-side injection (workspaceId on create)\n * but reads will NOT have workspaceId auto-injected into `where`.\n *\n * Use this for child/join tables where workspace scoping is inherited\n * through parent relations, or for models queried by ID that don't\n * have a workspaceId column.\n *\n * @default []\n */\n excludeModelsFromReadIsolation?: string[];\n\n /**\n * When true, throws an error if workspaceId is missing from context\n * for any non-excluded model operation. This prevents silent\n * workspace-unscoped queries that could leak data across workspaces.\n *\n * When false, operations without workspace context proceed without\n * workspaceId injection (legacy behavior).\n *\n * @default true\n */\n strictMode?: boolean;\n\n /**\n * Operations that are allowed without workspace context even in strict mode.\n * Use `Model.operation` format (e.g., `['Workspace.create', 'RevokedToken.findMany']`).\n *\n * Valid operation names: create, createMany, createManyAndReturn, update, updateMany,\n * upsert, findMany, findFirst, findFirstOrThrow, findUnique, findUniqueOrThrow,\n * count, aggregate, groupBy, delete, deleteMany.\n *\n * @default []\n */\n allowedUnguardedOperations?: string[];\n\n /**\n * Log injection events (useful for debugging)\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Default configuration\n */\nconst defaultConfig: Required<WorkspaceExtensionConfig> = {\n enabled: true,\n enableReadIsolation: true,\n enableDeleteIsolation: true,\n enableUpdateWhereIsolation: true,\n populateContextJson: true,\n populateCreatedBy: true,\n populateUpdatedBy: true,\n populateTenantId: false,\n excludeModels: [],\n excludeModelsFromReadIsolation: [],\n strictMode: true,\n allowedUnguardedOperations: [],\n debug: false,\n};\n\n// ============================================================================\n// Data Injection Helpers\n// ============================================================================\n\n/**\n * Check if a field exists in the data object (including being set to null/undefined explicitly)\n */\nfunction hasField(data: Record<string, unknown>, field: string): boolean {\n return field in data;\n}\n\n/**\n * Inject workspace-related fields into create data\n */\nfunction injectCreateFields(\n data: Record<string, unknown>,\n wsCtx: WorkspaceContext,\n config: Required<WorkspaceExtensionConfig>\n): Record<string, unknown> {\n const injected = { ...data };\n\n // Inject workspaceId if not already provided\n if (wsCtx.workspaceId && !hasField(injected, 'workspaceId')) {\n injected['workspaceId'] = wsCtx.workspaceId;\n }\n\n // Inject tenantId if configured and not already provided\n if (config.populateTenantId && wsCtx.tenantId && !hasField(injected, 'tenantId')) {\n injected['tenantId'] = wsCtx.tenantId;\n }\n\n // Inject createdBy if configured and not already provided\n if (config.populateCreatedBy && wsCtx.actorId && !hasField(injected, 'createdBy')) {\n injected['createdBy'] = wsCtx.actorId;\n }\n\n // Inject updatedBy on create as well (initial value)\n if (config.populateUpdatedBy && wsCtx.actorId && !hasField(injected, 'updatedBy')) {\n injected['updatedBy'] = wsCtx.actorId;\n }\n\n // Inject onBehalfOf (for consent-based delegation tracking)\n // If onBehalfOf is in context (from consent), use it; otherwise defaults to actorId (self-action)\n if (wsCtx.onBehalfOf && !hasField(injected, 'onBehalfOf')) {\n injected['onBehalfOf'] = wsCtx.onBehalfOf;\n } else if (wsCtx.actorId && !hasField(injected, 'onBehalfOf')) {\n // Default to actorId if no delegation (self-action)\n injected['onBehalfOf'] = wsCtx.actorId;\n }\n\n // Populate context JSON field\n if (config.populateContextJson && !hasField(injected, 'context')) {\n const contextJson = buildContextJsonFromWorkspaceContext(wsCtx);\n if (contextJson) {\n injected['context'] = contextJson;\n }\n }\n\n return injected;\n}\n\n/**\n * Inject workspace-related fields into update data\n */\nfunction injectUpdateFields(\n data: Record<string, unknown>,\n wsCtx: WorkspaceContext,\n config: Required<WorkspaceExtensionConfig>\n): Record<string, unknown> {\n const injected = { ...data };\n\n // Inject updatedBy if configured and not already provided\n if (config.populateUpdatedBy && wsCtx.actorId && !hasField(injected, 'updatedBy')) {\n injected['updatedBy'] = wsCtx.actorId;\n }\n\n // Note: We intentionally do NOT auto-inject workspaceId on updates\n // because updates target existing records (workspaceId is immutable after creation)\n // and changing it would be a data integrity issue.\n\n return injected;\n}\n\n/**\n * Inject workspaceId into a where clause.\n * Only injects if workspaceId is available in context and not already present in where.\n *\n * For operations that may not have a where clause (e.g., findMany without filters),\n * creates a new where object with just workspaceId.\n */\nfunction injectWhereClause(\n where: Record<string, unknown> | undefined,\n wsCtx: WorkspaceContext\n): Record<string, unknown> | undefined {\n if (!wsCtx.workspaceId) return where;\n\n if (!where) {\n // No where clause exists, create one with just workspaceId\n return { workspaceId: wsCtx.workspaceId };\n }\n\n // Only inject if not already present\n if (!hasField(where, 'workspaceId')) {\n return { ...where, workspaceId: wsCtx.workspaceId };\n }\n\n return where;\n}\n\n/**\n * Build context JSON from workspace context\n */\nfunction buildContextJsonFromWorkspaceContext(wsCtx: WorkspaceContext): InputJsonValue | undefined {\n const context: Record<string, string> = {};\n\n if (wsCtx.workspaceId) context['workspaceId'] = wsCtx.workspaceId;\n if (wsCtx.actorId) context['userId'] = wsCtx.actorId;\n if (wsCtx.organizationId) context['organizationId'] = wsCtx.organizationId;\n if (wsCtx.projectId) context['projectId'] = wsCtx.projectId;\n if (wsCtx.appId) context['appId'] = wsCtx.appId;\n\n return Object.keys(context).length > 0 ? context : undefined;\n}\n\n/**\n * Inject workspaceId into where clause for read/update/delete operations.\n * This is a utility function exported for services that want to manually\n * add workspace scoping to their queries.\n *\n * @param where - The existing where clause\n * @param wsCtx - The workspace context (or auto-detected from AsyncLocalStorage)\n * @returns The where clause with workspaceId injected if not already present\n *\n * @example\n * ```typescript\n * import { injectWhereWorkspaceId, getWorkspaceContext } from '@burdenoff/be-sdk/prisma';\n *\n * const wsCtx = getWorkspaceContext();\n * const where = injectWhereWorkspaceId({ status: 'ACTIVE' }, wsCtx);\n * // Result: { status: 'ACTIVE', workspaceId: 'ws-123' }\n * ```\n */\nexport function injectWhereWorkspaceId(\n where: Record<string, unknown> | undefined,\n wsCtx?: WorkspaceContext\n): Record<string, unknown> | undefined {\n const ctx = wsCtx ?? getWorkspaceContext();\n if (!where || !ctx?.workspaceId) return where;\n\n // Only inject if not already present\n if (!hasField(where, 'workspaceId')) {\n return { ...where, workspaceId: ctx.workspaceId };\n }\n\n return where;\n}\n\n/**\n * Remove the _skipWorkspaceInjection flag from args before passing to Prisma.\n * Using a dedicated function avoids ESLint unused-variable warnings from destructuring.\n */\nfunction stripSkipFlag<T extends Record<string, unknown>>(args: T): Omit<T, '_skipWorkspaceInjection'> {\n const cleaned = { ...args };\n delete (cleaned as Record<string, unknown>)['_skipWorkspaceInjection'];\n return cleaned;\n}\n\n/**\n * Check if a model should be excluded from read isolation.\n * A model is excluded if it's in excludeModels OR excludeModelsFromReadIsolation.\n */\nfunction isExcludedFromReadIsolation(model: string, config: Required<WorkspaceExtensionConfig>): boolean {\n return config.excludeModels.includes(model) || config.excludeModelsFromReadIsolation.includes(model);\n}\n\n// ============================================================================\n// Strict Mode Enforcement\n// ============================================================================\n\n/**\n * Enforce strict mode: throw if workspace context is missing and the operation\n * is not explicitly allowed to run without it.\n *\n * @returns true if the operation should proceed without workspace injection (non-strict or allowed)\n * @throws Error if strict mode is enabled and the operation is not allowed\n */\nfunction enforceStrictMode(\n model: string,\n operation: string,\n wsCtx: WorkspaceContext | undefined,\n config: Required<WorkspaceExtensionConfig>\n): void {\n // If workspace context has a workspaceId, nothing to enforce\n if (wsCtx?.workspaceId) return;\n\n // If strict mode is off, allow silently\n if (!config.strictMode) return;\n\n // Check if this specific operation is allowed without workspace context\n const opKey = `${model}.${operation}`;\n if (config.allowedUnguardedOperations.includes(opKey)) return;\n\n // Strict mode violation — throw\n throw new Error(\n `[WorkspaceExtension] Workspace context required for ${model}.${operation}. ` +\n `No workspaceId found in request context. To bypass, either: ` +\n `(1) add \"${model}\" to excludeModels, ` +\n `(2) add \"${opKey}\" to allowedUnguardedOperations, or ` +\n `(3) pass _skipWorkspaceInjection: true in the query args.`\n );\n}\n\n// ============================================================================\n// Prisma Extension\n// ============================================================================\n\n/**\n * Standard args shape for operations with a `where` clause\n */\ninterface WhereArgs {\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Standard handler params from Prisma $extends\n */\ninterface ExtensionHandlerParams<TArgs> {\n model: string;\n args: TArgs;\n query: (args: unknown) => Promise<unknown>;\n}\n\n/**\n * Add workspace extension to a Prisma client.\n *\n * This extension provides comprehensive workspace isolation by automatically\n * injecting workspaceId into ALL Prisma operations:\n *\n * **Writes**: Auto-populates workspaceId, tenantId, createdBy, updatedBy, context JSON\n * **Reads**: Auto-injects workspaceId into where clause (findMany, findFirst, etc.)\n * **Updates**: Auto-injects workspaceId into where clause + updatedBy into data\n * **Deletes**: Auto-injects workspaceId into where clause\n *\n * **Chain order matters**: Apply this extension AFTER the graph extension\n * (handled automatically by createDatabaseClient).\n *\n * @param baseClient - The Prisma client to extend\n * @param config - Extension configuration\n * @returns Extended Prisma client with workspace auto-injection\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { addWorkspaceExtension } from '@burdenoff/be-sdk/prisma';\n *\n * const baseClient = new PrismaClient({ adapter });\n * const client = addWorkspaceExtension(baseClient, {\n * populateContextJson: true,\n * populateCreatedBy: true,\n * enableReadIsolation: true,\n * debug: process.env.NODE_ENV === 'development',\n * excludeModels: ['CircuitBreakerState', 'SchedulerState'],\n * excludeModelsFromReadIsolation: ['Permission', 'RbacResourceType'],\n * });\n * ```\n */\nexport function addWorkspaceExtension<T>(baseClient: T, config?: WorkspaceExtensionConfig): T {\n const fullConfig: Required<WorkspaceExtensionConfig> = {\n ...defaultConfig,\n ...config,\n };\n\n if (!fullConfig.enabled) {\n logger.info('[WorkspaceExtension] Extension disabled by configuration');\n return baseClient;\n }\n\n // Type assertion for Prisma client $extends\n const prismaClient = baseClient as { $extends: (args: unknown) => T };\n\n logger.info('[WorkspaceExtension] Workspace extension enabled', {\n populateContextJson: fullConfig.populateContextJson,\n populateCreatedBy: fullConfig.populateCreatedBy,\n populateUpdatedBy: fullConfig.populateUpdatedBy,\n populateTenantId: fullConfig.populateTenantId,\n enableReadIsolation: fullConfig.enableReadIsolation,\n enableDeleteIsolation: fullConfig.enableDeleteIsolation,\n enableUpdateWhereIsolation: fullConfig.enableUpdateWhereIsolation,\n strictMode: fullConfig.strictMode,\n excludeModels: fullConfig.excludeModels,\n excludeModelsFromReadIsolation: fullConfig.excludeModelsFromReadIsolation,\n allowedUnguardedOperations: fullConfig.allowedUnguardedOperations,\n });\n\n return prismaClient.$extends({\n query: {\n $allModels: {\n // ================================================================\n // WRITE OPERATIONS - inject workspaceId into data\n // ================================================================\n\n async create({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n // Skip if model is excluded or injection is explicitly skipped\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'create', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n // Inject fields into data\n const injectedData = injectCreateFields(args.data, wsCtx, fullConfig);\n\n if (fullConfig.debug) {\n const injectedKeys = Object.keys(injectedData).filter((k) => !(k in args.data));\n if (injectedKeys.length > 0) {\n logger.debug(`[WorkspaceExtension] ${model}.create - injected: ${injectedKeys.join(', ')}`, {\n workspaceId: wsCtx.workspaceId,\n actorId: wsCtx.actorId,\n });\n }\n }\n\n return query({\n ...stripSkipFlag(args),\n data: injectedData,\n });\n },\n\n async createMany({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown> | Record<string, unknown>[];\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'createMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n // Handle both single object and array\n const dataArray = Array.isArray(args.data) ? args.data : [args.data];\n const injectedData = dataArray.map((item) => injectCreateFields(item, wsCtx, fullConfig));\n\n return query({\n ...stripSkipFlag(args),\n data: Array.isArray(args.data) ? injectedData : injectedData[0],\n });\n },\n\n async createManyAndReturn({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown> | Record<string, unknown>[];\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'createManyAndReturn', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const dataArray = Array.isArray(args.data) ? args.data : [args.data];\n const injectedData = dataArray.map((item) => injectCreateFields(item, wsCtx, fullConfig));\n\n return query({\n ...stripSkipFlag(args),\n data: Array.isArray(args.data) ? injectedData : injectedData[0],\n });\n },\n\n // ================================================================\n // UPDATE OPERATIONS - inject updatedBy into data + workspaceId into where\n // ================================================================\n\n async update({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown>;\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'update', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedData = injectUpdateFields(args.data, wsCtx, fullConfig);\n\n // Inject workspaceId into where clause for update isolation\n let injectedWhere = args.where;\n if (fullConfig.enableUpdateWhereIsolation && !isExcludedFromReadIsolation(model, fullConfig)) {\n injectedWhere = injectWhereClause(args.where, wsCtx);\n }\n\n if (fullConfig.debug) {\n const injectedDataKeys = Object.keys(injectedData).filter((k) => !(k in args.data));\n const whereChanged = injectedWhere !== args.where;\n if (injectedDataKeys.length > 0 || whereChanged) {\n logger.debug(\n `[WorkspaceExtension] ${model}.update - injected data: ${injectedDataKeys.join(', ')}${whereChanged ? ', where: workspaceId' : ''}`\n );\n }\n }\n\n return query({\n ...stripSkipFlag(args),\n data: injectedData,\n where: injectedWhere,\n });\n },\n\n async updateMany({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n data: Record<string, unknown>;\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'updateMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedData = injectUpdateFields(args.data, wsCtx, fullConfig);\n\n // Inject workspaceId into where clause for update isolation\n let injectedWhere = args.where;\n if (fullConfig.enableUpdateWhereIsolation && !isExcludedFromReadIsolation(model, fullConfig)) {\n injectedWhere = injectWhereClause(args.where, wsCtx);\n }\n\n return query({\n ...stripSkipFlag(args),\n data: injectedData,\n where: injectedWhere,\n });\n },\n\n async upsert({\n model,\n args,\n query,\n }: ExtensionHandlerParams<{\n create: Record<string, unknown>;\n update: Record<string, unknown>;\n where?: Record<string, unknown>;\n _skipWorkspaceInjection?: boolean;\n [key: string]: unknown;\n }>) {\n if (fullConfig.excludeModels.includes(model) || args._skipWorkspaceInjection) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'upsert', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedCreate = injectCreateFields(args.create, wsCtx, fullConfig);\n const injectedUpdate = injectUpdateFields(args.update, wsCtx, fullConfig);\n\n // Inject workspaceId into where clause for upsert isolation\n let injectedWhere = args.where;\n if (fullConfig.enableUpdateWhereIsolation && !isExcludedFromReadIsolation(model, fullConfig)) {\n injectedWhere = injectWhereClause(args.where, wsCtx);\n }\n\n return query({\n ...stripSkipFlag(args),\n create: injectedCreate,\n update: injectedUpdate,\n where: injectedWhere,\n });\n },\n\n // ================================================================\n // READ OPERATIONS - inject workspaceId into where clause\n // ================================================================\n\n async findMany({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findMany - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async findFirst({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findFirst', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findFirst - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async findFirstOrThrow({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findFirstOrThrow', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findFirstOrThrow - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async findUnique({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findUnique', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n // For findUnique, the where clause uses unique fields.\n // We inject workspaceId only if the where clause is a plain object\n // (compound unique keys with workspaceId are common and already include it).\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findUnique - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async findUniqueOrThrow({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'findUniqueOrThrow', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.findUniqueOrThrow - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async count({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'count', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.count - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async aggregate({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'aggregate', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.aggregate - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async groupBy({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableReadIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'groupBy', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.groupBy - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n // ================================================================\n // DELETE OPERATIONS - inject workspaceId into where clause\n // ================================================================\n\n async delete({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableDeleteIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'delete', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.delete - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n\n async deleteMany({ model, args, query }: ExtensionHandlerParams<WhereArgs>) {\n if (\n !fullConfig.enableDeleteIsolation ||\n isExcludedFromReadIsolation(model, fullConfig) ||\n args._skipWorkspaceInjection\n ) {\n return query(stripSkipFlag(args));\n }\n\n const wsCtx = getWorkspaceContext();\n enforceStrictMode(model, 'deleteMany', wsCtx, fullConfig);\n if (!wsCtx?.workspaceId) {\n return query(args);\n }\n\n const injectedWhere = injectWhereClause(args.where, wsCtx);\n\n if (fullConfig.debug) {\n logger.debug(`[WorkspaceExtension] ${model}.deleteMany - injected workspaceId into where`, {\n workspaceId: wsCtx.workspaceId,\n });\n }\n\n return query({\n ...stripSkipFlag(args),\n where: injectedWhere,\n });\n },\n },\n },\n });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/index.ts","../src/platform/httpClient.ts","../src/platform/leaderLock.ts","../src/platform/rateLimit.ts","../src/platform/paginator.ts","../src/platform/dataLoaderFactory.ts","../src/platform/cacheInvalidation.ts","../src/platform/pgPartition.ts","../src/platform/llmClient.ts"],"names":["breakers","Map","hostOf","url","URL","host","getBreaker","b","get","failures","openedAt","state","set","defaultRetryOn","status","jitter","delay","Math","floor","random","sleep","ms","Promise","r","setTimeout","CircuitBreakerOpenError","Error","name","__resetHttpClientBreakers","clear","executeOnce","init","timeoutMs","signal","AbortSignal","timeout","fetch","httpClient","config","fullUrl","baseUrl","test","replace","breaker","breakerThreshold","threshold","cooldownMs","Date","now","logger","info","attempts","retry","initialDelay","initialDelayMs","maxDelay","maxDelayMs","retryOn","defaultTimeoutMs","headers","defaultHeaders","lastErr","attempt","response","warn","min","err","error","String","createHttpClient","RELEASE_LUA","RENEW_LUA","generateToken","toString","slice","process","pid","withLeaderLock","redis","fn","options","key","token","ttlMs","renewMs","max","ttlSeconds","ceil","acquired","stopped","renewTimer","setInterval","eval","catch","unref","result","clearInterval","rateLimitIncr","input","fullKey","count","incr","pexpire","windowMs","ttl","pttl","resetAt","remaining","limit","allowed","DEFAULT_GRAPHQL_PAGE_LIMIT","MAX_GRAPHQL_PAGE_LIMIT","clampLimit","opts","def","defaultLimit","maxLimit","minLimit","Number","isNaN","clampOffset","clampGraphqlLimit","normalizeOffsetPagination","offset","normalizeCursorPagination","first","after","trim","length","take","encodeCursor","payload","Buffer","from","JSON","stringify","decodeCursor","cursor","decoded","parse","Array","isArray","value","Object","entries","keys","buildConnection","items","nodes","edges","map","node","cursorForNode","firstEdge","lastEdge","at","pageInfo","hasNextPage","hasPreviousPage","startCursor","endCursor","totalCount","buildOffsetPage","total","pagination","nextOffset","hasMore","paginate","model","undefined","findMany","skip","id","where","orderBy","trimmed","nextCursor","buildLoaders","ctx","builder","resolveReferenceLoader","loaderName","keyField","reference","loader","loaders","load","VERSION_PREFIX","getNamespaceVersion","namespace","v","n","parseInt","isFinite","buildCacheKey","parts","ver","join","invalidateNamespace","pad2","monthlyPartitionName","table","year","month","ensureMonthlyPartitions","prisma","created","cur","UTC","getUTCFullYear","getUTCMonth","end","to","y","m","next","partition","lower","upper","$executeRawUnsafe","push","setUTCMonth","dropOldPartitions","rows","$queryRawUnsafe","dropped","cutoffYear","beforeDate","cutoffMonth","row","partitionRe","exec","partition_name","mo","DEFAULTS","maxAttempts","maxOutputTokensCap","LLMRouter","adapters","register","adapter","resolveChain","envChain","env","split","s","filter","Boolean","complete","req","cappedReq","maxTokens","chain","providerName","ctrl","AbortController","t","abort","provider","clearTimeout"],"mappings":"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","file":"chunk-UCLDHOZC.js","sourcesContent":["/**\n * @burdenoff/be-sdk/platform\n *\n * Reusable platform primitives consumed fleet-wide by Burdenoff svcs.\n */\nexport { httpClient, createHttpClient, CircuitBreakerOpenError, __resetHttpClientBreakers } from './httpClient.js';\nexport type { HttpClientConfig, HttpClientInit, RetryConfig, BreakerConfig } from './httpClient.js';\n\nexport { withLeaderLock } from './leaderLock.js';\nexport type { LeaderLockRedis, LeaderLockOptions, LeaderLockResult } from './leaderLock.js';\n\nexport { rateLimitIncr } from './rateLimit.js';\nexport type { RateLimitRedis, RateLimitInput, RateLimitResult } from './rateLimit.js';\n\nexport {\n DEFAULT_GRAPHQL_PAGE_LIMIT,\n MAX_GRAPHQL_PAGE_LIMIT,\n buildConnection,\n buildOffsetPage,\n clampGraphqlLimit,\n clampLimit,\n clampOffset,\n decodeCursor,\n encodeCursor,\n normalizeCursorPagination,\n normalizeOffsetPagination,\n paginate,\n} from './paginator.js';\nexport type { ClampLimitOptions, PaginateInput, PaginateResult, PrismaModelLike } from './paginator.js';\nexport type {\n BuildConnectionOptions,\n ConnectionEdge,\n ConnectionResult,\n CursorPaginationInput,\n CursorPayload,\n CursorPayloadValue,\n NormalizedCursorPagination,\n NormalizedOffsetPagination,\n OffsetPageResult,\n OffsetPaginationInput,\n PageInfo,\n} from './paginator.js';\n\nexport { buildLoaders, resolveReferenceLoader } from './dataLoaderFactory.js';\nexport type { DataLoaderLike, LoaderMap, LoaderBuilder, ReferenceObject } from './dataLoaderFactory.js';\n\nexport { buildCacheKey, getNamespaceVersion, invalidateNamespace } from './cacheInvalidation.js';\nexport type { CacheVersionRedis } from './cacheInvalidation.js';\n\nexport { monthlyPartitionName, ensureMonthlyPartitions, dropOldPartitions } from './pgPartition.js';\nexport type { PrismaRawClient, EnsureMonthlyOptions, DropOldOptions } from './pgPartition.js';\n\nexport { LLMRouter } from './llmClient.js';\nexport type { LLMRequest, LLMResponse, LLMProviderAdapter, LLMRouterOptions } from './llmClient.js';\n","/**\n * httpClient — hardened wrapper around global `fetch` with:\n * - per-request AbortSignal.timeout (default 5s)\n * - retries (default 3) with exponential backoff + full jitter\n * - per-host circuit breaker (opens at 5 consecutive 5xx, half-open after 30s)\n * - structured logging via existing be-sdk logger\n *\n * No required upstream dependency — we use the runtime `fetch` so the same\n * code path works on Bun and Node 20+. Consumers may pass an undici Agent\n * via `init.dispatcher` if they need keep-alive pooling; we forward unknown\n * init fields through.\n */\n\nimport { logger } from '../logger/index.js';\n\nexport interface RetryConfig {\n /** Total attempts including the first (default 3) */\n attempts?: number;\n /** Initial backoff in ms (default 100) */\n initialDelayMs?: number;\n /** Maximum backoff in ms (default 2000) */\n maxDelayMs?: number;\n /** Status codes that trigger a retry (default 408, 425, 429, 5xx) */\n retryOn?: (status: number) => boolean;\n}\n\nexport interface BreakerConfig {\n /** Consecutive 5xx failures to open breaker (default 5) */\n threshold?: number;\n /** Time in ms before HALF_OPEN trial (default 30000) */\n cooldownMs?: number;\n}\n\nexport interface HttpClientConfig {\n baseUrl?: string;\n defaultTimeoutMs?: number;\n retry?: RetryConfig;\n breaker?: BreakerConfig;\n /** Default headers merged into every request */\n defaultHeaders?: Record<string, string>;\n}\n\ninterface BreakerState {\n failures: number;\n openedAt: number | null;\n state: 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n}\n\nconst breakers = new Map<string, BreakerState>();\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nfunction getBreaker(host: string): BreakerState {\n let b = breakers.get(host);\n if (!b) {\n b = { failures: 0, openedAt: null, state: 'CLOSED' };\n breakers.set(host, b);\n }\n return b;\n}\n\nfunction defaultRetryOn(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599);\n}\n\nfunction jitter(delay: number): number {\n return Math.floor(Math.random() * delay);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nexport class CircuitBreakerOpenError extends Error {\n constructor(host: string) {\n super(`circuit breaker OPEN for host=${host}`);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\nexport interface HttpClientInit extends RequestInit {\n timeoutMs?: number;\n retry?: RetryConfig;\n}\n\n/**\n * Reset all breaker state (test helper).\n */\nexport function __resetHttpClientBreakers(): void {\n breakers.clear();\n}\n\nasync function executeOnce(url: string, init: HttpClientInit, timeoutMs: number): Promise<Response> {\n const signal = init.signal ?? AbortSignal.timeout(timeoutMs);\n return fetch(url, { ...init, signal });\n}\n\nexport async function httpClient(\n url: string,\n init: HttpClientInit = {},\n config: HttpClientConfig = {}\n): Promise<Response> {\n const fullUrl =\n config.baseUrl && !/^https?:\\/\\//i.test(url)\n ? `${config.baseUrl.replace(/\\/$/, '')}/${url.replace(/^\\//, '')}`\n : url;\n const host = hostOf(fullUrl);\n const breaker = getBreaker(host);\n const breakerThreshold = config.breaker?.threshold ?? 5;\n const cooldownMs = config.breaker?.cooldownMs ?? 30_000;\n\n if (breaker.state === 'OPEN') {\n if (breaker.openedAt && Date.now() - breaker.openedAt >= cooldownMs) {\n breaker.state = 'HALF_OPEN';\n logger.info('httpClient.breaker.halfOpen', { host });\n } else {\n throw new CircuitBreakerOpenError(host);\n }\n }\n\n const attempts = init.retry?.attempts ?? config.retry?.attempts ?? 3;\n const initialDelay = init.retry?.initialDelayMs ?? config.retry?.initialDelayMs ?? 100;\n const maxDelay = init.retry?.maxDelayMs ?? config.retry?.maxDelayMs ?? 2_000;\n const retryOn = init.retry?.retryOn ?? config.retry?.retryOn ?? defaultRetryOn;\n const timeoutMs = init.timeoutMs ?? config.defaultTimeoutMs ?? 5_000;\n\n const headers = { ...(config.defaultHeaders ?? {}), ...((init.headers as Record<string, string> | undefined) ?? {}) };\n\n let lastErr: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n const response = await executeOnce(fullUrl, { ...init, headers }, timeoutMs);\n if (response.status >= 500) {\n breaker.failures += 1;\n if (breaker.failures >= breakerThreshold) {\n breaker.state = 'OPEN';\n breaker.openedAt = Date.now();\n logger.warn('httpClient.breaker.open', { host, failures: breaker.failures });\n }\n if (attempt < attempts && retryOn(response.status)) {\n const delay = Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n await sleep(jitter(delay));\n continue;\n }\n return response;\n }\n // success path\n breaker.failures = 0;\n if (breaker.state === 'HALF_OPEN') {\n breaker.state = 'CLOSED';\n breaker.openedAt = null;\n logger.info('httpClient.breaker.closed', { host });\n }\n if (attempt < attempts && retryOn(response.status)) {\n const delay = Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n await sleep(jitter(delay));\n continue;\n }\n return response;\n } catch (err) {\n lastErr = err;\n breaker.failures += 1;\n if (breaker.failures >= breakerThreshold) {\n breaker.state = 'OPEN';\n breaker.openedAt = Date.now();\n logger.warn('httpClient.breaker.open', { host, failures: breaker.failures });\n }\n if (attempt >= attempts) break;\n const delay = Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n await sleep(jitter(delay));\n }\n }\n\n logger.error('httpClient.exhausted', { url: fullUrl, attempts, host });\n throw lastErr instanceof Error ? lastErr : new Error(`httpClient failed: ${String(lastErr)}`);\n}\n\nexport function createHttpClient(\n config: HttpClientConfig = {}\n): (url: string, init?: HttpClientInit) => Promise<Response> {\n return (url: string, init: HttpClientInit = {}) => httpClient(url, init, config);\n}\n","/**\n * withLeaderLock — Redis-based leader election.\n *\n * Acquires `SET NX EX` on `besdk:leader:{name}`. If acquired, runs fn() and\n * auto-renews the lease every `renewMs` (default ttlMs/3). On exit (success\n * or throw) the holder DELs the key only if it still owns it (token check\n * via a Redis LUA script — Redis-side, NOT JS eval).\n * If the lock cannot be acquired, fn() is NOT called and the function\n * resolves with `{ acquired: false }`.\n *\n * Redis client is duck-typed (ioredis-compatible) so consumers can pass\n * either ioredis or the be-sdk cache provider's underlying client.\n */\n\nimport { logger } from '../logger/index.js';\n\nexport interface LeaderLockRedis {\n /** ioredis: set(key, val, 'EX', seconds, 'NX') -> 'OK' | null */\n set(key: string, value: string, ex: 'EX', seconds: number, nx: 'NX'): Promise<'OK' | null>;\n /** Redis LUA EVAL for compare-and-delete / compare-and-renew (server-side script) */\n eval(script: string, numKeys: number, ...args: string[]): Promise<unknown>;\n}\n\nexport interface LeaderLockOptions {\n ttlMs: number;\n renewMs?: number;\n}\n\nexport interface LeaderLockResult<T> {\n acquired: boolean;\n result?: T;\n}\n\nconst RELEASE_LUA = `\nif redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"del\", KEYS[1])\nelse\n return 0\nend\n`;\n\nconst RENEW_LUA = `\nif redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"pexpire\", KEYS[1], ARGV[2])\nelse\n return 0\nend\n`;\n\nfunction generateToken(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}-${process.pid}`;\n}\n\nexport async function withLeaderLock<T>(\n redis: LeaderLockRedis,\n name: string,\n fn: () => Promise<T>,\n options: LeaderLockOptions\n): Promise<LeaderLockResult<T>> {\n const key = `besdk:leader:${name}`;\n const token = generateToken();\n const ttlMs = options.ttlMs;\n const renewMs = options.renewMs ?? Math.max(1_000, Math.floor(ttlMs / 3));\n const ttlSeconds = Math.max(1, Math.ceil(ttlMs / 1000));\n\n const acquired = await redis.set(key, token, 'EX', ttlSeconds, 'NX');\n if (acquired !== 'OK') {\n return { acquired: false };\n }\n\n logger.info('leaderLock.acquired', { name, token, ttlMs });\n\n let stopped = false;\n const renewTimer = setInterval(() => {\n if (stopped) return;\n redis.eval(RENEW_LUA, 1, key, token, String(ttlMs)).catch((err: unknown) => {\n logger.warn('leaderLock.renew.failed', { name, err: String(err) });\n });\n }, renewMs);\n // Don't keep the process alive just for this timer.\n if (typeof (renewTimer as unknown as { unref?: () => void }).unref === 'function') {\n (renewTimer as unknown as { unref: () => void }).unref();\n }\n\n try {\n const result = await fn();\n return { acquired: true, result };\n } finally {\n stopped = true;\n clearInterval(renewTimer);\n try {\n await redis.eval(RELEASE_LUA, 1, key, token);\n logger.info('leaderLock.released', { name, token });\n } catch (err) {\n logger.warn('leaderLock.release.failed', { name, err: String(err) });\n }\n }\n}\n","/**\n * rateLimitIncr — atomic INCR-based rate limit using EXPIRE NX.\n *\n * Strategy:\n * 1. INCR key\n * 2. If returned value === 1 (i.e. first increment), EXPIRE key with windowMs\n * 3. Compute remaining + resetAt\n *\n * This is two round-trips in the worst case. A future Lua/EVALSHA variant\n * can collapse it into a single round-trip; the public API is stable.\n *\n * Returns `allowed=false` if `count > limit`. The key is `besdk:rl:{key}`.\n */\n\nexport interface RateLimitRedis {\n incr(key: string): Promise<number>;\n pexpire(key: string, ms: number): Promise<number | 'OK'>;\n pttl(key: string): Promise<number>;\n}\n\nexport interface RateLimitInput {\n key: string;\n limit: number;\n windowMs: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n count: number;\n remaining: number;\n resetAt: number;\n}\n\nexport async function rateLimitIncr(redis: RateLimitRedis, input: RateLimitInput): Promise<RateLimitResult> {\n const fullKey = `besdk:rl:${input.key}`;\n const count = await redis.incr(fullKey);\n if (count === 1) {\n await redis.pexpire(fullKey, input.windowMs);\n }\n let ttl = -1;\n try {\n ttl = await redis.pttl(fullKey);\n } catch {\n ttl = input.windowMs;\n }\n const resetAt = Date.now() + (ttl > 0 ? ttl : input.windowMs);\n const remaining = Math.max(0, input.limit - count);\n return {\n allowed: count <= input.limit,\n count,\n remaining,\n resetAt,\n };\n}\n","/**\n * Paginator — Relay-style cursor pagination + safe limit clamping.\n *\n * Use `clampLimit` at resolver entry to enforce sane defaults/maxes.\n * Use `paginate` to translate a Relay-style { first, after } into a\n * Prisma-ready { take, skip, cursor } and return a connection-shaped\n * result.\n */\n\nexport interface ClampLimitOptions {\n defaultLimit?: number;\n maxLimit?: number;\n minLimit?: number;\n}\n\nexport const DEFAULT_GRAPHQL_PAGE_LIMIT = 50;\nexport const MAX_GRAPHQL_PAGE_LIMIT = 100;\n\nexport function clampLimit(input: number | undefined | null, opts: ClampLimitOptions = {}): number {\n const def = opts.defaultLimit ?? 50;\n const max = opts.maxLimit ?? 200;\n const min = opts.minLimit ?? 1;\n if (input == null || Number.isNaN(input)) return def;\n return Math.min(Math.max(Math.floor(input), min), max);\n}\n\nexport function clampOffset(input: number | undefined | null): number {\n if (input == null || Number.isNaN(input)) return 0;\n return Math.max(0, Math.floor(input));\n}\n\nexport function clampGraphqlLimit(input: number | undefined | null, opts: ClampLimitOptions = {}): number {\n return clampLimit(input, {\n defaultLimit: opts.defaultLimit ?? DEFAULT_GRAPHQL_PAGE_LIMIT,\n maxLimit: opts.maxLimit ?? MAX_GRAPHQL_PAGE_LIMIT,\n minLimit: opts.minLimit ?? 1,\n });\n}\n\nexport interface OffsetPaginationInput {\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface NormalizedOffsetPagination {\n limit: number;\n offset: number;\n}\n\nexport function normalizeOffsetPagination(\n input: OffsetPaginationInput | null | undefined,\n opts: ClampLimitOptions = {}\n): NormalizedOffsetPagination {\n return {\n limit: clampGraphqlLimit(input?.limit, opts),\n offset: clampOffset(input?.offset),\n };\n}\n\nexport interface CursorPaginationInput {\n first?: number | null;\n after?: string | null;\n}\n\nexport interface NormalizedCursorPagination {\n first: number;\n after: string | null;\n take: number;\n}\n\nexport function normalizeCursorPagination(\n input: CursorPaginationInput | null | undefined,\n opts: ClampLimitOptions = {}\n): NormalizedCursorPagination {\n const first = clampGraphqlLimit(input?.first, opts);\n const after = typeof input?.after === 'string' && input.after.trim().length > 0 ? input.after : null;\n return { first, after, take: first + 1 };\n}\n\nexport type CursorPayloadValue = string | number | boolean | null;\nexport type CursorPayload = Record<string, CursorPayloadValue>;\n\nexport function encodeCursor(payload: CursorPayload): string {\n return Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url');\n}\n\nexport function decodeCursor(cursor: string | null | undefined): CursorPayload | null {\n if (typeof cursor !== 'string' || cursor.trim().length === 0) return null;\n\n try {\n const decoded: unknown = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));\n if (decoded == null || typeof decoded !== 'object' || Array.isArray(decoded)) return null;\n\n const payload: CursorPayload = {};\n for (const [key, value] of Object.entries(decoded)) {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || value == null) {\n payload[key] = value;\n }\n }\n\n return Object.keys(payload).length > 0 ? payload : null;\n } catch {\n return null;\n }\n}\n\nexport interface PageInfo {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n startCursor: string | null;\n endCursor: string | null;\n}\n\nexport interface ConnectionEdge<TItem> {\n node: TItem;\n cursor: string;\n}\n\nexport interface ConnectionResult<TItem> {\n edges: ConnectionEdge<TItem>[];\n nodes: TItem[];\n pageInfo: PageInfo;\n totalCount?: number | null;\n}\n\nexport interface BuildConnectionOptions<TItem> {\n limit: number;\n cursorForNode: (item: TItem) => string;\n hasPreviousPage?: boolean;\n totalCount?: number | null;\n}\n\nexport function buildConnection<TItem>(items: TItem[], opts: BuildConnectionOptions<TItem>): ConnectionResult<TItem> {\n const nodes = items.length > opts.limit ? items.slice(0, opts.limit) : items;\n const edges = nodes.map((node) => ({ node, cursor: opts.cursorForNode(node) }));\n const firstEdge = edges[0];\n const lastEdge = edges.at(-1);\n\n return {\n edges,\n nodes,\n pageInfo: {\n hasNextPage: items.length > opts.limit,\n hasPreviousPage: opts.hasPreviousPage ?? false,\n startCursor: firstEdge?.cursor ?? null,\n endCursor: lastEdge?.cursor ?? null,\n },\n totalCount: opts.totalCount,\n };\n}\n\nexport interface OffsetPageResult<TItem> {\n items: TItem[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n nextOffset: number | null;\n}\n\nexport function buildOffsetPage<TItem>(\n items: TItem[],\n total: number,\n pagination: NormalizedOffsetPagination\n): OffsetPageResult<TItem> {\n const nextOffset = pagination.offset + items.length;\n const hasMore = nextOffset < total;\n\n return {\n items,\n total,\n limit: pagination.limit,\n offset: pagination.offset,\n hasMore,\n nextOffset: hasMore ? nextOffset : null,\n };\n}\n\nexport interface PaginateInput<TWhere, TOrderBy> {\n take?: number | null;\n cursor?: string | null;\n where?: TWhere;\n orderBy?: TOrderBy;\n}\n\nexport interface PaginateResult<TItem> {\n items: TItem[];\n hasMore: boolean;\n nextCursor: string | null;\n}\n\nexport interface PrismaModelLike<TItem, TWhere, TOrderBy> {\n findMany(args: {\n take?: number;\n skip?: number;\n cursor?: { id: string };\n where?: TWhere;\n orderBy?: TOrderBy;\n }): Promise<TItem[]>;\n}\n\nexport async function paginate<TItem extends { id: string }, TWhere = unknown, TOrderBy = unknown>(\n model: PrismaModelLike<TItem, TWhere, TOrderBy>,\n input: PaginateInput<TWhere, TOrderBy>,\n opts: ClampLimitOptions = {}\n): Promise<PaginateResult<TItem>> {\n const take = clampLimit(input.take ?? undefined, opts);\n // fetch +1 to detect hasMore\n const items = await model.findMany({\n take: take + 1,\n skip: input.cursor ? 1 : 0,\n cursor: input.cursor ? { id: input.cursor } : undefined,\n where: input.where,\n orderBy: input.orderBy,\n });\n const hasMore = items.length > take;\n const trimmed = hasMore ? items.slice(0, take) : items;\n const nextCursor = hasMore && trimmed.length > 0 ? (trimmed[trimmed.length - 1] as { id: string }).id : null;\n return { items: trimmed, hasMore, nextCursor };\n}\n","/**\n * DataLoaderFactory — per-request DataLoader collection.\n *\n * Each GraphQL request creates a fresh loader set scoped to its context\n * (db, workspaceId, requestId). Loaders are addressed by name and reused\n * within the request to coalesce N+1 fan-outs into a single batched query.\n *\n * Also ships `resolveReferenceLoader` — a convenience for Apollo Federation\n * `__resolveReference` resolvers so entity hydration stays N+1-free.\n *\n * This module is intentionally framework-agnostic; consumers may pair it\n * with the existing `SimpleDataLoader` in `src/dataloader/index.ts` or the\n * upstream `dataloader` npm package.\n */\n\nexport interface DataLoaderLike<K, V> {\n load(key: K): Promise<V>;\n loadMany(keys: readonly K[]): Promise<(V | Error)[]>;\n clear(key: K): this;\n clearAll(): this;\n prime(key: K, value: V): this;\n}\n\nexport type LoaderMap = Record<string, DataLoaderLike<unknown, unknown>>;\n\nexport type LoaderBuilder<Ctx, M extends LoaderMap> = (ctx: Ctx) => M;\n\n/**\n * Build a fresh loader collection from a context.\n *\n * @example\n * const loaders = buildLoaders(ctx, (c) => ({\n * userById: createSimpleLoader(async ids => c.db.user.findMany({ where: { id: { in: [...ids] } } }), u => u.id),\n * tagById: createSimpleLoader(...),\n * }));\n * await loaders.userById.load('user-123');\n */\nexport function buildLoaders<Ctx, M extends LoaderMap>(ctx: Ctx, builder: LoaderBuilder<Ctx, M>): M {\n return builder(ctx);\n}\n\n/**\n * `__resolveReference` helper for Apollo Federation.\n *\n * Given a context that contains a `loaders` map, returns a resolver\n * function bound to a specific loader name. Field references shaped as\n * `{ id: string }` (or `{ __keyField: string }`) are forwarded to\n * `loader.load(...)`.\n */\nexport interface ReferenceObject {\n id?: string;\n [key: string]: unknown;\n}\n\nexport function resolveReferenceLoader<T, Ctx extends { loaders: LoaderMap }>(\n loaderName: string,\n keyField: string = 'id'\n): (reference: ReferenceObject, ctx: Ctx) => Promise<T | null> {\n return async (reference, ctx) => {\n const loader = ctx.loaders[loaderName] as DataLoaderLike<string, T> | undefined;\n if (!loader) {\n throw new Error(`resolveReferenceLoader: loader \"${loaderName}\" not found on ctx.loaders`);\n }\n const key = reference[keyField];\n if (typeof key !== 'string') {\n return null;\n }\n return loader.load(key);\n };\n}\n","/**\n * Versioned-key cache invalidation helper.\n *\n * Pattern:\n * - Store `v:{namespace}` integer in Redis\n * - Compose keys as `${namespace}:v${ver}:${rest}`\n * - Invalidate via INCR `v:{namespace}` — no KEYS / SCAN required\n *\n * Use this instead of cacheClearPattern() for Azure Managed Redis (O(N)\n * blocking on KEYS is unsafe in prod).\n */\n\nexport interface CacheVersionRedis {\n get(key: string): Promise<string | null>;\n incr(key: string): Promise<number>;\n}\n\nconst VERSION_PREFIX = 'besdk:cv:';\n\nexport async function getNamespaceVersion(redis: CacheVersionRedis, namespace: string): Promise<number> {\n const v = await redis.get(`${VERSION_PREFIX}${namespace}`);\n if (!v) return 1;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) && n > 0 ? n : 1;\n}\n\nexport async function buildCacheKey(redis: CacheVersionRedis, namespace: string, ...parts: string[]): Promise<string> {\n const ver = await getNamespaceVersion(redis, namespace);\n return `${namespace}:v${ver}:${parts.join(':')}`;\n}\n\nexport async function invalidateNamespace(redis: CacheVersionRedis, namespace: string): Promise<number> {\n return redis.incr(`${VERSION_PREFIX}${namespace}`);\n}\n","/**\n * PG declarative partition + retention DSL.\n *\n * Helpers:\n * - ensureMonthlyPartitions(prisma, { table, from, to })\n * - dropOldPartitions(prisma, { table, beforeDate })\n *\n * Used by retention jobs / migrations to keep append-only tables\n * (ActivityLog, Message, TrackingEvent, ApplicationUsage, AuditLog)\n * bounded. Caller is responsible for ensuring the parent table is\n * already declared as PARTITION BY RANGE (created_at).\n */\n\nexport interface PrismaRawClient {\n $executeRawUnsafe(query: string, ...values: unknown[]): Promise<unknown>;\n $queryRawUnsafe<T = unknown>(query: string, ...values: unknown[]): Promise<T>;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\nexport function monthlyPartitionName(table: string, year: number, month: number): string {\n return `${table}_y${year}m${pad2(month)}`;\n}\n\nexport interface EnsureMonthlyOptions {\n table: string;\n from: Date;\n to: Date;\n}\n\nexport async function ensureMonthlyPartitions(prisma: PrismaRawClient, opts: EnsureMonthlyOptions): Promise<string[]> {\n const created: string[] = [];\n const cur = new Date(Date.UTC(opts.from.getUTCFullYear(), opts.from.getUTCMonth(), 1));\n const end = new Date(Date.UTC(opts.to.getUTCFullYear(), opts.to.getUTCMonth(), 1));\n while (cur <= end) {\n const y = cur.getUTCFullYear();\n const m = cur.getUTCMonth() + 1;\n const next = new Date(Date.UTC(y, m, 1));\n const partition = monthlyPartitionName(opts.table, y, m);\n const lower = `${y}-${pad2(m)}-01`;\n const upper = `${next.getUTCFullYear()}-${pad2(next.getUTCMonth() + 1)}-01`;\n await prisma.$executeRawUnsafe(\n `CREATE TABLE IF NOT EXISTS \"${partition}\" PARTITION OF \"${opts.table}\" FOR VALUES FROM ('${lower}') TO ('${upper}');`\n );\n created.push(partition);\n cur.setUTCMonth(cur.getUTCMonth() + 1);\n }\n return created;\n}\n\nexport interface DropOldOptions {\n table: string;\n beforeDate: Date;\n}\n\ninterface PartitionRow {\n partition_name: string;\n}\n\nexport async function dropOldPartitions(prisma: PrismaRawClient, opts: DropOldOptions): Promise<string[]> {\n // Find inherited tables of the parent, parse year/month from suffix, drop ones before threshold.\n const rows = await prisma.$queryRawUnsafe<PartitionRow[]>(\n `SELECT child.relname AS partition_name\n FROM pg_inherits\n JOIN pg_class parent ON pg_inherits.inhparent = parent.oid\n JOIN pg_class child ON pg_inherits.inhrelid = child.oid\n WHERE parent.relname = $1`,\n opts.table\n );\n const dropped: string[] = [];\n const cutoffYear = opts.beforeDate.getUTCFullYear();\n const cutoffMonth = opts.beforeDate.getUTCMonth() + 1;\n for (const row of rows) {\n const partitionRe = /_y(\\d{4})m(\\d{2})$/;\n const m = partitionRe.exec(row.partition_name);\n if (!m) continue;\n const y = Number(m[1]);\n const mo = Number(m[2]);\n if (y < cutoffYear || (y === cutoffYear && mo < cutoffMonth)) {\n await prisma.$executeRawUnsafe(`DROP TABLE IF EXISTS \"${row.partition_name}\";`);\n dropped.push(row.partition_name);\n }\n }\n return dropped;\n}\n","/**\n * Multi-provider LLM wrapper with timeout, retries, jitter, provider\n * fallback chain, token cap, and streaming passthrough.\n *\n * No hard dependency on a specific SDK — consumers register adapters.\n * Provider chain order is controlled by env `LLM_PROVIDER_CHAIN`\n * (comma-separated, e.g. `anthropic,openai,openrouter`).\n *\n * The wrapper is intentionally minimal — callers should construct it\n * once at boot, register adapters, and inject the singleton.\n */\n\nimport { logger } from '../logger/index.js';\n\nexport interface LLMRequest {\n model?: string;\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>;\n maxTokens?: number;\n temperature?: number;\n stream?: boolean;\n /** Override timeout for this request. */\n timeoutMs?: number;\n}\n\nexport interface LLMResponse {\n provider: string;\n content: string;\n inputTokens?: number;\n outputTokens?: number;\n raw?: unknown;\n}\n\nexport interface LLMProviderAdapter {\n name: string;\n complete(req: LLMRequest, signal: AbortSignal): Promise<LLMResponse>;\n}\n\nexport interface LLMRouterOptions {\n /** Default per-attempt timeout (ms). */\n timeoutMs?: number;\n /** Max attempts across providers. */\n maxAttempts?: number;\n /** Initial backoff (ms). */\n initialDelayMs?: number;\n /** Hard cap on output tokens regardless of caller request. */\n maxOutputTokensCap?: number;\n}\n\nconst DEFAULTS: Required<LLMRouterOptions> = {\n timeoutMs: 30_000,\n maxAttempts: 3,\n initialDelayMs: 500,\n maxOutputTokensCap: 4096,\n};\n\nfunction jitter(n: number): number {\n return Math.floor(Math.random() * n);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nexport class LLMRouter {\n private readonly adapters: Map<string, LLMProviderAdapter> = new Map();\n private readonly opts: Required<LLMRouterOptions>;\n\n constructor(opts: LLMRouterOptions = {}) {\n this.opts = { ...DEFAULTS, ...opts };\n }\n\n register(adapter: LLMProviderAdapter): void {\n this.adapters.set(adapter.name, adapter);\n }\n\n private resolveChain(): string[] {\n const envChain = process.env['LLM_PROVIDER_CHAIN']?.trim();\n if (envChain) {\n return envChain\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return Array.from(this.adapters.keys());\n }\n\n async complete(req: LLMRequest): Promise<LLMResponse> {\n const cappedReq: LLMRequest = {\n ...req,\n maxTokens: Math.min(req.maxTokens ?? this.opts.maxOutputTokensCap, this.opts.maxOutputTokensCap),\n };\n const chain = this.resolveChain();\n if (chain.length === 0) {\n throw new Error('LLMRouter: no providers registered');\n }\n\n let lastErr: unknown = null;\n for (let attempt = 0; attempt < this.opts.maxAttempts; attempt++) {\n const providerName = chain[attempt % chain.length];\n const adapter = providerName ? this.adapters.get(providerName) : undefined;\n if (!adapter) {\n logger.warn('llmRouter.provider.notRegistered', { providerName });\n continue;\n }\n const timeoutMs = req.timeoutMs ?? this.opts.timeoutMs;\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), timeoutMs);\n try {\n const response = await adapter.complete(cappedReq, ctrl.signal);\n return response;\n } catch (err) {\n lastErr = err;\n logger.warn('llmRouter.attempt.failed', { provider: adapter.name, attempt, err: String(err) });\n if (attempt < this.opts.maxAttempts - 1) {\n const delay = this.opts.initialDelayMs * 2 ** attempt;\n await sleep(jitter(delay));\n }\n } finally {\n clearTimeout(t);\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(`LLMRouter exhausted ${this.opts.maxAttempts} attempts`);\n }\n}\n"]}
|