@burdenoff/be-sdk 2026.1008.4 → 2026.1015.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/EventQueueFactory-ZHBJD3OD.js +7 -0
  2. package/dist/{EventQueueFactory-XRAIXICA.js.map → EventQueueFactory-ZHBJD3OD.js.map} +1 -1
  3. package/dist/{chunk-L5TDUAFN.js → chunk-6VK53YR3.js} +62 -10
  4. package/dist/chunk-6VK53YR3.js.map +1 -0
  5. package/dist/{chunk-VVBA3LQV.js → chunk-GJR6AQAL.js} +6 -5
  6. package/dist/chunk-GJR6AQAL.js.map +1 -0
  7. package/dist/{chunk-CYY4VIRK.js → chunk-HMVQOZHM.js} +20 -6
  8. package/dist/chunk-HMVQOZHM.js.map +1 -0
  9. package/dist/{chunk-MLBNB5DB.js → chunk-P67HNJGL.js} +3 -3
  10. package/dist/{chunk-MLBNB5DB.js.map → chunk-P67HNJGL.js.map} +1 -1
  11. package/dist/{chunk-EOHPDXXW.js → chunk-PKKVCYJH.js} +5 -5
  12. package/dist/{chunk-EOHPDXXW.js.map → chunk-PKKVCYJH.js.map} +1 -1
  13. package/dist/{chunk-BWFHIS26.js → chunk-RTBCGUHC.js} +3 -3
  14. package/dist/{chunk-BWFHIS26.js.map → chunk-RTBCGUHC.js.map} +1 -1
  15. package/dist/{chunk-JRMQ2B3B.js → chunk-VD4B362H.js} +4 -4
  16. package/dist/{chunk-JRMQ2B3B.js.map → chunk-VD4B362H.js.map} +1 -1
  17. package/dist/{chunk-3AEU6G6V.js → chunk-XTIOBNT7.js} +3 -3
  18. package/dist/{chunk-3AEU6G6V.js.map → chunk-XTIOBNT7.js.map} +1 -1
  19. package/dist/event-queue/index.js +3 -3
  20. package/dist/graph/index.d.ts +1 -1
  21. package/dist/graph/index.js +5 -5
  22. package/dist/{index-_dsCeVat.d.ts → index-D3DzCz1d.d.ts} +13 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +10 -10
  25. package/dist/init/index.js +1 -1
  26. package/dist/prisma/index.js +5 -5
  27. package/dist/server/index.js +1 -1
  28. package/package.json +1 -1
  29. package/dist/EventQueueFactory-XRAIXICA.js +0 -7
  30. package/dist/chunk-CYY4VIRK.js.map +0 -1
  31. package/dist/chunk-L5TDUAFN.js.map +0 -1
  32. package/dist/chunk-VVBA3LQV.js.map +0 -1
@@ -1,9 +1,9 @@
1
- export { buildContextWhereClause, buildContextWhereConditions, checkDatabaseHealth, contextMatches, createContextFromSDK, createDatabaseClient, createDatabaseClientFromEnv, extractFieldsFromModel, getAllModelNames, getDatabaseManager, getDatabaseProductName, getDatabaseStats, getDatabaseVersion, getDb, getModelFields, hasModel, initializeDatabase, initializeDatabaseWithConfig, isDatabaseInitialized, loadGeneratedFields, mergeContext, parseContext, resetDatabaseManager, resolvePoolTuningFromEnv, testConnection, toContextJson } from '../chunk-EOHPDXXW.js';
1
+ export { buildContextWhereClause, buildContextWhereConditions, checkDatabaseHealth, contextMatches, createContextFromSDK, createDatabaseClient, createDatabaseClientFromEnv, extractFieldsFromModel, getAllModelNames, getDatabaseManager, getDatabaseProductName, getDatabaseStats, getDatabaseVersion, getDb, getModelFields, hasModel, initializeDatabase, initializeDatabaseWithConfig, isDatabaseInitialized, loadGeneratedFields, mergeContext, parseContext, resetDatabaseManager, resolvePoolTuningFromEnv, testConnection, toContextJson } from '../chunk-PKKVCYJH.js';
2
2
  import '../chunk-OBBCR6WY.js';
3
- export { addWorkspaceExtension, buildTransactionContextStatement, defaultWorkspaceExtensionConfig, getCallerTransaction, getWorkspaceContext, injectCreateFields, injectWhereWorkspaceId, maybeSetRlsGuc, maybeTagConnection, resetCallerTransactionStateForTests, runOperationInCallerTransaction, runOperationWithRlsGuc, setWorkspaceContext, withWorkspaceContext, withWorkspaceContextSync } from '../chunk-CYY4VIRK.js';
4
- export { PrismaClientWrapper, configurePrismaLogging, createConnectionPool, createPrismaAdapter, createPrismaClient, ensureServiceApplicationName, installAcquireRetry, isTransientAcquireError } from '../chunk-L5TDUAFN.js';
5
- import '../chunk-3AEU6G6V.js';
6
- import '../chunk-MLBNB5DB.js';
3
+ export { addWorkspaceExtension, buildTransactionContextStatement, defaultWorkspaceExtensionConfig, getCallerTransaction, getWorkspaceContext, injectCreateFields, injectWhereWorkspaceId, maybeSetRlsGuc, maybeTagConnection, resetCallerTransactionStateForTests, runOperationInCallerTransaction, runOperationWithRlsGuc, setWorkspaceContext, withWorkspaceContext, withWorkspaceContextSync } from '../chunk-HMVQOZHM.js';
4
+ export { PrismaClientWrapper, configurePrismaLogging, createConnectionPool, createPrismaAdapter, createPrismaClient, ensureServiceApplicationName, installAcquireRetry, isTransientAcquireError } from '../chunk-6VK53YR3.js';
5
+ import '../chunk-XTIOBNT7.js';
6
+ import '../chunk-P67HNJGL.js';
7
7
  import '../chunk-LKCBI6B2.js';
8
8
  import '../chunk-KO2ZXZ7W.js';
9
9
  import '../chunk-RU266375.js';
@@ -1,7 +1,7 @@
1
1
  import { createHumanReadableErrorPlugin, formatHttpError, normalizeGraphQLResponse, createHttpErrorResponse } from '../chunk-6GL4SLU7.js';
2
2
  export { UserFacingGraphQLError, createHttpErrorResponse, createHumanReadableErrorPlugin, createWorkspaceGuardPlugin, formatHttpError, normalizeError, normalizeExecutionResultErrors, normalizeGraphQLResponse, normalizeGraphQLResponsePayload, toUserFacingGraphQLError } from '../chunk-6GL4SLU7.js';
3
3
  import { getWorkspaceQuotaRegistry } from '../chunk-WTEHAVBX.js';
4
- import { setWorkspaceContext, withWorkspaceContext } from '../chunk-CYY4VIRK.js';
4
+ import { setWorkspaceContext, withWorkspaceContext } from '../chunk-HMVQOZHM.js';
5
5
  import { I18n } from '../chunk-EBDHIL7V.js';
6
6
  import { getMetricsRegistry } from '../chunk-AWPNRV3L.js';
7
7
  import { ContextManager } from '../chunk-RZOFS2BQ.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/be-sdk",
3
- "version": "2026.1008.4",
3
+ "version": "2026.1015.1",
4
4
  "description": "Backend SDK for Burdenoff products providing unified access to notifications, RBAC, activity tracking, usage monitoring, and more",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1,7 +0,0 @@
1
- export { EventQueueFactory, resolveQueueType } from './chunk-MLBNB5DB.js';
2
- import './chunk-LKCBI6B2.js';
3
- import './chunk-KO2ZXZ7W.js';
4
- import './chunk-RU266375.js';
5
- import './chunk-XE4OXN2W.js';
6
- //# sourceMappingURL=EventQueueFactory-XRAIXICA.js.map
7
- //# sourceMappingURL=EventQueueFactory-XRAIXICA.js.map
@@ -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","defaultWorkspaceExtensionConfig","enabled","enableReadIsolation","enableDeleteIsolation","enableUpdateWhereIsolation","populateContextJson","populateCreatedBy","populateUpdatedBy","populateTenantId","populateOnBehalfOf","excludeModels","excludeModelsFromReadIsolation","strictMode","allowedUnguardedOperations","debug","enableApplicationNameTagging","enableRlsGucTagging","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","taggedContexts","WeakSet","maybeTagConnection","rawPrisma","has","add","safeSvc","process","env","replace","safeWs","tag","$executeRawUnsafe","delete","rlsTaggedContexts","maybeSetRlsGuc","modelToClientProperty","charAt","toLowerCase","slice","runOperationWithRlsGuc","rootClient","clientProperty","$transaction","tx","delegate","method","getCallerTransaction","internalParams","transaction","kind","id","descriptor","sanitizeWorkspaceId","buildApplicationNameTag","buildTransactionContextStatement","settings","params","push","sql","join","key","MAX_TRACKED_CALLER_TRANSACTIONS","callerTransactionStates","Map","rememberCallerTransaction","state","set","size","oldest","next","value","applyCallerTransactionContext","statement","pending","requestTransaction","runOperationInCallerTransaction","get","inflight","ready","catch","resetCallerTransactionStateForTests","clear","addWorkspaceExtension","baseClient","fullConfig","logger","info","rawPrismaForTransactions","rawPrismaForCallerTransactions","tagsTransactions","dispatch","finalArgs","query","callerTransaction","__internalParams","rawOperation","prismaClient","rawOperationHooks","$queryRaw","$executeRaw","$queryRawUnsafe","$queryRawTyped","withQueryHooks","$extends","$allModels","create","_skipWorkspaceInjection","injectedData","injectedKeys","filter","k","createMany","dataArray","Array","isArray","map","item","createManyAndReturn","update","injectedWhere","injectedDataKeys","whereChanged","updateMany","upsert","injectedCreate","injectedUpdate","findMany","findFirst","findFirstOrThrow","findUnique","findUniqueOrThrow","count","aggregate","groupBy","deleteMany","wrapped","client","input","options","parent","$parent","setContext","then","results"],"mappings":"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","file":"chunk-CYY4VIRK.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 * Automatically populate the `onBehalfOf` field on create operations\n * (consent-based delegation tracking — defaults to the acting actor when no\n * delegation is present).\n *\n * Unlike `populateContextJson`/`populateCreatedBy`/`populateUpdatedBy`, this\n * has no per-model opt-out other than `excludeModels` (which also disables\n * RLS GUC tagging and isolation for that model). Set to `false` for services\n * whose Prisma models don't carry an `onBehalfOf` column — otherwise every\n * create on those models throws `Unknown argument onBehalfOf` from Prisma's\n * client-side validation.\n *\n * @default true\n */\n populateOnBehalfOf?: 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 * Tag the PostgreSQL connection with workspace attribution for pg_stat_activity visibility.\n *\n * When enabled, the first DB operation per workspace context sets:\n * `application_name = 'svc=<SERVICE_NAME>;ws=<workspaceId>'`\n *\n * This makes workspace-level query attribution visible in pg_stat_activity,\n * pg_locks, auto_explain, and monitoring tools without any schema changes.\n * Subsequent operations in the same request are deduplicated via WeakSet,\n * costing ~0 overhead after the first round-trip per request context.\n *\n * NOTE: This is a session-level SET so attribution may drift across ops\n * that reuse the same pooled connection from different requests. Use for\n * aggregate observability, not per-query forensics.\n *\n * @default false\n */\n enableApplicationNameTagging?: boolean;\n\n /**\n * Set the `app.workspace_id` GUC for Row Level Security enforcement.\n *\n * When enabled, every workspace-scoped operation runs with\n * `SET LOCAL app.workspace_id = '<workspaceId>'`\n * in effect (see \"Transactions\" below for how that is scoped).\n *\n * RLS policies using `current_setting('app.workspace_id', true)` then filter\n * rows by workspace, providing a defense-in-depth backstop to the application-\n * layer workspaceId injection in the WHERE clause.\n *\n * Pair with migrations that run per table:\n * `ALTER TABLE t ENABLE ROW LEVEL SECURITY;`\n * `CREATE POLICY ws_isolation ON t\n * USING (workspace_id = current_setting('app.workspace_id', true))\n * WITH CHECK (workspace_id = current_setting('app.workspace_id', true));`\n *\n * Fail-closed semantics: if the GUC is unset (NULL from missing_ok=true),\n * `workspace_id = NULL` is always false, so RLS returns no rows — leaking\n * nothing rather than everything.\n *\n * Transactions: a standalone operation runs in its own short transaction\n * (`SET LOCAL` + the operation). An operation on the `tx` client inside a\n * caller's `$transaction(async (tx) => …)`, including raw SQL, runs in the\n * caller's transaction, after one `set_config(..., true)` per transaction and\n * workspace, so it is atomic with the rest of that transaction and its row\n * locks are held until commit. `$transaction([...])` batches get the same\n * statement prepended (BOFF-8874).\n *\n * @default false\n */\n enableRlsGucTagging?: boolean;\n}\n\n/**\n * Default configuration. Exported so consumers/tests can spread over the\n * real defaults (`{ ...defaultWorkspaceExtensionConfig, populateOnBehalfOf: false }`)\n * instead of re-declaring every field.\n */\nexport const defaultWorkspaceExtensionConfig: 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 populateOnBehalfOf: true,\n excludeModels: [],\n excludeModelsFromReadIsolation: [],\n strictMode: true,\n allowedUnguardedOperations: [],\n debug: false,\n enableApplicationNameTagging: false,\n enableRlsGucTagging: 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 *\n * Exported (alongside `injectWhereWorkspaceId`) so consumers can unit-test\n * exactly what a given `WorkspaceExtensionConfig` injects for their own\n * Prisma schema — in particular, to verify `populateOnBehalfOf: false` /\n * `populateContextJson: false` actually suppress `onBehalfOf`/`context`\n * before wiring the extension against models that don't have those columns.\n */\nexport function 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 (config.populateOnBehalfOf && wsCtx.onBehalfOf && !hasField(injected, 'onBehalfOf')) {\n injected['onBehalfOf'] = wsCtx.onBehalfOf;\n } else if (config.populateOnBehalfOf && 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 /** Prisma-internal request params; `transaction` identifies a caller transaction. */\n __internalParams?: PrismaQueryInternalParams;\n}\n\n/** Handler params for top-level raw operations (`$queryRaw`, `$executeRaw`, …). */\ninterface RawOperationHandlerParams {\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n __internalParams?: PrismaQueryInternalParams;\n}\n\n/** Client surface the `$transaction` wrapper delegates to (the client one layer down). */\ntype TransactionDelegate = {\n $transaction: (input: unknown, options?: 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 */\n// ============================================================================\n// Connection Tagging (Phase 0.2)\n// ============================================================================\n\n/** Minimal Prisma raw-exec surface needed for SET application_name */\ntype RawPrismaForTagging = {\n $executeRawUnsafe: (query: string, ...values: unknown[]) => Promise<number>;\n};\n\n/**\n * WeakSet of contexts that have already had the connection tagged this request.\n * WorkspaceContext objects live only for the duration of a request, so entries\n * are automatically GC'd when the context goes out of scope — no manual cleanup.\n */\nconst taggedContexts = new WeakSet<WorkspaceContext>();\n\n/**\n * Tag the current Postgres connection with workspace attribution (once per context).\n * Sets `application_name = 'svc=<name>;ws=<workspaceId>'` at the session level.\n * Non-fatal: tagging failures are swallowed so the main operation still proceeds.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport async function maybeTagConnection(rawPrisma: RawPrismaForTagging, wsCtx: WorkspaceContext): Promise<void> {\n if (taggedContexts.has(wsCtx)) return;\n taggedContexts.add(wsCtx);\n // Strip non-safe chars; workspace IDs are UUIDs/CUIDs, service names are kebab-case\n const safeSvc = (process.env['SERVICE_NAME'] ?? 'svc').replace(/[^a-zA-Z0-9\\-_]/g, '');\n const safeWs = (wsCtx.workspaceId ?? '').replace(/[^a-zA-Z0-9\\-_]/g, '');\n const tag = `svc=${safeSvc};ws=${safeWs}`;\n try {\n await rawPrisma.$executeRawUnsafe(`SET application_name = '${tag}'`);\n } catch {\n // Retry on the next operation if this one failed\n taggedContexts.delete(wsCtx);\n }\n}\n\n// ============================================================================\n// RLS GUC Tagging (Phase 3)\n// ============================================================================\n\n/**\n * WeakSet of contexts that have already had the RLS GUC set this request.\n */\nconst rlsTaggedContexts = new WeakSet<WorkspaceContext>();\n\n/**\n * Set `app.workspace_id` GUC for RLS enforcement (once per context, session-level).\n *\n * When set, RLS policies using `current_setting('app.workspace_id', true)` filter\n * rows to the current workspace. Non-fatal: failures are swallowed and retried on\n * the next operation via WeakSet entry removal.\n *\n * NOT used by the extension's operation handlers below (see\n * `runOperationWithRlsGuc`) — session-level `SET` is unsafe once traffic is routed\n * through PgBouncer in transaction-pooling mode (see that function's doc comment\n * for the full incident writeup, BOFF-5488). Kept as a standalone export, still\n * unit tested, for any caller that genuinely runs on an unpooled/session-pooled\n * connection where session-level `SET` is sufficient.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport async function maybeSetRlsGuc(rawPrisma: RawPrismaForTagging, wsCtx: WorkspaceContext): Promise<void> {\n if (rlsTaggedContexts.has(wsCtx)) return;\n rlsTaggedContexts.add(wsCtx);\n // Allow alphanumeric, hyphens, underscores — CUID/UUID safe, prevents SQL injection\n const safeWs = (wsCtx.workspaceId ?? '').replace(/[^a-zA-Z0-9\\-_]/g, '');\n try {\n await rawPrisma.$executeRawUnsafe(`SET app.workspace_id = '${safeWs}'`);\n } catch {\n // Retry on the next operation if this one failed\n rlsTaggedContexts.delete(wsCtx);\n }\n}\n\n/**\n * A Prisma interactive-transaction client (`tx` inside `$transaction(async (tx) =>\n * …)`), typed with just enough surface for `runOperationWithRlsGuc`: raw SQL\n * execution, plus one delegate per model keyed by its Prisma Client property name\n * (e.g. `customer`, `driver`). The index signature is `unknown` (not a concrete\n * delegate shape) because this helper is generic across every model in the schema\n * — callers narrow and verify the specific delegate/method they need at runtime.\n */\ntype PrismaTxForRlsGuc = {\n $executeRawUnsafe: (query: string, ...values: unknown[]) => Promise<number>;\n [modelClientProperty: string]: unknown;\n};\n\n/** Minimal Prisma client surface needed to open an interactive transaction. */\ntype RawPrismaForRlsTransaction = {\n $transaction: <TResult>(fn: (tx: PrismaTxForRlsGuc) => Promise<TResult>) => Promise<TResult>;\n};\n\n/**\n * Prisma DMMF model name (e.g. `Customer`) -> Prisma Client delegate property\n * (e.g. `customer`). Matches Prisma's own client-generation rule: lower-case the\n * first character, leave the rest untouched.\n */\nfunction modelToClientProperty(model: string): string {\n return model.length > 0 ? model.charAt(0).toLowerCase() + model.slice(1) : model;\n}\n\n/**\n * Run a single Prisma operation with `app.workspace_id` set as a\n * **transaction-scoped** (`SET LOCAL`) GUC immediately ahead of it, so Postgres\n * RLS policies using `current_setting('app.workspace_id', true)` see the right\n * value for both the `USING` (read) and `WITH CHECK` (write) clauses.\n *\n * Session-level `SET` (`maybeSetRlsGuc` above, the original Phase 3\n * implementation) is NOT safe once traffic goes through PgBouncer in\n * **transaction pooling mode** — the mode configured on all four\n * `boff-pg-{global,wspace}-{alpha,prod}-cin` servers' built-in PgBouncer (see\n * infra-specs/current-architecture/02-database-postgres-age.md). PgBouncer hands\n * the physical backend connection back to the pool after every standalone\n * statement/implicit transaction, so a `SET` executed by one statement is not\n * guaranteed visible to the very next one, even over what looks like the same\n * logical client connection.\n *\n * This was exactly BOFF-5488: `wspace-movethewheels-svc`'s RLS Phase 3b (FORCE\n * ROW LEVEL SECURITY + a non-owner runtime role, `wspace_movethewheels_app`,\n * pointed at the pooled `:6432` connection) made the `ws_isolation` policy bind\n * for real, but the session-level `SET` from `maybeSetRlsGuc` was landing on a\n * different pooled backend connection than the write that followed it — so every\n * write failed `WITH CHECK` (`new row violates row-level security policy`) and\n * every read matched zero rows.\n *\n * A Prisma **interactive transaction** (`$transaction(async (tx) => …)`) pins one\n * physical connection for the callback's full duration — PgBouncer sees a single\n * unbroken `BEGIN … COMMIT` and cannot reassign the backend mid-transaction — so\n * `SET LOCAL` inside it is guaranteed visible to the operation issued right after\n * it in the same callback. Safe under transaction-mode pooling, session-mode\n * pooling, and with no pooler in front of Postgres at all. The extra round trip\n * (one interactive transaction instead of one direct call) only applies to\n * services that opt into `enableRlsGucTagging` — off by default.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport async function runOperationWithRlsGuc<TResult>(\n rootClient: RawPrismaForRlsTransaction,\n wsCtx: WorkspaceContext,\n model: string,\n operation: string,\n args: unknown\n): Promise<TResult> {\n const safeWs = (wsCtx.workspaceId ?? '').replace(/[^a-zA-Z0-9\\-_]/g, '');\n const clientProperty = modelToClientProperty(model);\n return rootClient.$transaction(async (tx) => {\n await tx.$executeRawUnsafe(`SET LOCAL app.workspace_id = '${safeWs}'`);\n // `tx[clientProperty]` is typed `unknown` (see PrismaTxForRlsGuc) because this\n // helper is generic across every model; narrow to the minimal callable shape\n // needed and verify at runtime before invoking rather than trusting a cast.\n const delegate = tx[clientProperty] as Record<string, (opArgs: unknown) => Promise<TResult>> | undefined;\n const method = delegate?.[operation];\n if (typeof method !== 'function') {\n throw new Error(\n `[WorkspaceExtension] Unable to resolve ${model}.${operation} (client property \"${clientProperty}\") ` +\n 'on the interactive-transaction client for RLS GUC tagging.'\n );\n }\n return method(args);\n });\n}\n\n// ============================================================================\n// Caller transactions (BOFF-8874)\n// ============================================================================\n//\n// `runOperationWithRlsGuc` above opens its OWN interactive transaction per\n// operation. That is right for a standalone call, but wrong when the operation is\n// issued on the `tx` client inside a caller's `prisma.$transaction(...)`: the\n// operation would commit on another connection, so the caller's transaction\n// would not be atomic and its `SELECT … FOR UPDATE` fences would run without the\n// GUC (matching no rows under FORCE RLS, so locking nothing).\n//\n// Inside a caller transaction the extension now runs the context statement\n// (`set_config(..., is_local => true)`, identical to `SET LOCAL`) on the caller's\n// transaction itself, once per transaction and workspace, and then executes the\n// operation in place. Batch transactions (`$transaction([...])`) get the same\n// statement prepended to the batch by the client-level `$transaction` wrapper in\n// `addWorkspaceExtension`. Outside any transaction nothing changes.\n\n/**\n * Prisma passes the transaction an operation belongs to on the query-extension\n * callback's `__internalParams.transaction`: `{ kind: 'itx', id, payload }` for an\n * interactive transaction, `{ kind: 'batch', … }` for `$transaction([...])`, and\n * nothing for a standalone call. The `live-pg` contract test pins this down\n * against the installed Prisma version.\n */\nexport interface PrismaQueryInternalParams {\n transaction?: unknown;\n}\n\n/** The caller transaction an operation runs in, if any. */\nexport type CallerTransaction = { kind: 'itx'; id: string; descriptor: object } | { kind: 'batch' };\n\n/**\n * Classify the transaction an extension callback is running in.\n *\n * Throws on a transaction descriptor this version does not understand rather\n * than guessing: running such an operation down the standalone path would\n * silently break the caller's atomicity again.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport function getCallerTransaction(\n internalParams: PrismaQueryInternalParams | undefined\n): CallerTransaction | undefined {\n const transaction = internalParams?.transaction;\n if (transaction === undefined || transaction === null) return undefined;\n if (typeof transaction === 'object') {\n const { kind, id } = transaction as { kind?: unknown; id?: unknown };\n if (kind === 'itx' && typeof id === 'string' && id.length > 0) {\n return { kind: 'itx', id, descriptor: transaction };\n }\n if (kind === 'batch') return { kind: 'batch' };\n }\n throw new Error(\n '[WorkspaceExtension] Unrecognised Prisma transaction descriptor on __internalParams.transaction; ' +\n 'refusing to run the operation outside the caller transaction. This Prisma version is not supported ' +\n 'by the be-sdk RLS transaction integration (BOFF-8874).'\n );\n}\n\n/** Same sanitisation as the standalone path: CUID/UUID-safe, prevents SQL injection. */\nfunction sanitizeWorkspaceId(workspaceId: string | undefined): string {\n return (workspaceId ?? '').replace(/[^a-zA-Z0-9\\-_]/g, '');\n}\n\n/** Same tag `maybeTagConnection` sets: `svc=<SERVICE_NAME>;ws=<workspaceId>`. */\nfunction buildApplicationNameTag(wsCtx: WorkspaceContext): string {\n const safeSvc = (process.env['SERVICE_NAME'] ?? 'svc').replace(/[^a-zA-Z0-9\\-_]/g, '');\n return `svc=${safeSvc};ws=${sanitizeWorkspaceId(wsCtx.workspaceId)}`;\n}\n\n/** A single parameterised statement that sets the transaction-local context. */\nexport interface TransactionContextStatement {\n sql: string;\n params: string[];\n /** Identifies the values set, so a transaction only re-runs it when they change. */\n key: string;\n}\n\n/**\n * Build the transaction-local context statement for the enabled tagging modes,\n * or `undefined` when neither RLS GUC nor application_name tagging is on.\n * `set_config(name, value, true)` is exactly `SET LOCAL name = value`.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport function buildTransactionContextStatement(\n wsCtx: WorkspaceContext,\n config: Pick<Required<WorkspaceExtensionConfig>, 'enableRlsGucTagging' | 'enableApplicationNameTagging'>\n): TransactionContextStatement | undefined {\n const settings: string[] = [];\n const params: string[] = [];\n if (config.enableRlsGucTagging) {\n params.push(sanitizeWorkspaceId(wsCtx.workspaceId));\n settings.push(`set_config('app.workspace_id', $${params.length}, true)`);\n }\n if (config.enableApplicationNameTagging) {\n params.push(buildApplicationNameTag(wsCtx));\n settings.push(`set_config('application_name', $${params.length}, true)`);\n }\n if (settings.length === 0) return undefined;\n return { sql: `SELECT ${settings.join(', ')}`, params, key: params.join('\\u0000') };\n}\n\n/**\n * A raw Prisma statement before it runs. Prisma's lazy `PrismaPromise` exposes\n * `requestTransaction(descriptor)`, which is how `$transaction` binds statements to\n * a transaction; the extension uses it to run the context statement on the\n * caller's transaction instead of a pooled connection of its own.\n */\ntype PendingRawStatement = PromiseLike<number> & {\n requestTransaction?: (transaction: object) => PromiseLike<unknown>;\n};\n\n/** Unextended client surface for issuing the context statement. */\nexport type RawPrismaForCallerTransaction = {\n $executeRawUnsafe: (query: string, ...values: unknown[]) => PendingRawStatement;\n};\n\ninterface CallerTransactionState {\n /** Descriptor of the (possibly nested) transaction level the context was set on. */\n descriptor: object;\n key: string;\n ready: Promise<void>;\n inflight: number;\n}\n\n/**\n * Context already applied per caller transaction id. Bounded: an evicted entry\n * only costs one repeated context statement, never correctness.\n */\nconst MAX_TRACKED_CALLER_TRANSACTIONS = 4096;\nconst callerTransactionStates = new Map<string, CallerTransactionState>();\n\nfunction rememberCallerTransaction(id: string, state: CallerTransactionState): void {\n callerTransactionStates.delete(id);\n callerTransactionStates.set(id, state);\n if (callerTransactionStates.size > MAX_TRACKED_CALLER_TRANSACTIONS) {\n const oldest = callerTransactionStates.keys().next().value;\n if (oldest !== undefined) callerTransactionStates.delete(oldest);\n }\n}\n\nasync function applyCallerTransactionContext(\n rawPrisma: RawPrismaForCallerTransaction,\n descriptor: object,\n statement: TransactionContextStatement\n): Promise<void> {\n const pending = rawPrisma.$executeRawUnsafe(statement.sql, ...statement.params);\n if (typeof pending.requestTransaction !== 'function') {\n throw new Error(\n '[WorkspaceExtension] Cannot bind the RLS context statement to the caller transaction ' +\n '(PrismaPromise.requestTransaction is unavailable); refusing to run it on another connection (BOFF-8874).'\n );\n }\n await pending.requestTransaction(descriptor);\n}\n\n/**\n * Run `run` (the operation, already bound to the caller's interactive\n * transaction by Prisma) after making sure that transaction carries the\n * workspace context. The context statement runs on the caller's transaction,\n * once per transaction level and workspace: a later operation for the same\n * workspace costs no extra round trip, a workspace switch re-runs it, and so does\n * the first operation after entering or leaving a nested transaction (a\n * savepoint rollback reverts `SET LOCAL`, a release keeps it).\n *\n * Concurrent operations for *different* workspaces on one transaction cannot be\n * isolated from each other, so that case throws instead of risking one running\n * under the other's GUC.\n *\n * @internal Exported for unit testing only — do not call from product code.\n */\nexport async function runOperationInCallerTransaction<TResult>(\n rawPrisma: RawPrismaForCallerTransaction,\n transaction: { id: string; descriptor: object },\n wsCtx: WorkspaceContext,\n config: Pick<Required<WorkspaceExtensionConfig>, 'enableRlsGucTagging' | 'enableApplicationNameTagging'>,\n run: () => Promise<TResult>\n): Promise<TResult> {\n const statement = buildTransactionContextStatement(wsCtx, config);\n if (!statement) return run();\n\n let state = callerTransactionStates.get(transaction.id);\n if (!state || state.descriptor !== transaction.descriptor || state.key !== statement.key) {\n if (state && state.inflight > 0 && state.key !== statement.key) {\n throw new Error(\n '[WorkspaceExtension] Concurrent operations for different workspaces inside one transaction are not ' +\n 'supported: the RLS context is per transaction. Await the other workspace’s operations first.'\n );\n }\n const next: CallerTransactionState = {\n descriptor: transaction.descriptor,\n key: statement.key,\n ready: applyCallerTransactionContext(rawPrisma, transaction.descriptor, statement),\n inflight: 0,\n };\n next.ready.catch(() => {\n if (callerTransactionStates.get(transaction.id) === next) callerTransactionStates.delete(transaction.id);\n });\n rememberCallerTransaction(transaction.id, next);\n state = next;\n }\n\n state.inflight += 1;\n try {\n await state.ready;\n return await run();\n } finally {\n state.inflight -= 1;\n }\n}\n\n/** @internal Test hook: forget all tracked caller transactions. */\nexport function resetCallerTransactionStateForTests(): void {\n callerTransactionStates.clear();\n}\n\nexport function addWorkspaceExtension<T>(baseClient: T, config?: WorkspaceExtensionConfig): T {\n const fullConfig: Required<WorkspaceExtensionConfig> = {\n ...defaultWorkspaceExtensionConfig,\n ...config,\n };\n\n if (!fullConfig.enabled) {\n logger.info('[WorkspaceExtension] Extension disabled by configuration');\n return baseClient;\n }\n\n // Capture the unwrapped client for connection tagging (pre-extension, avoids recursion)\n const rawPrisma = baseClient as unknown as RawPrismaForTagging;\n // Same unwrapped client, typed for the interactive-transaction RLS GUC path\n // (see runOperationWithRlsGuc) — separate cast so maybeTagConnection/\n // maybeSetRlsGuc's narrower RawPrismaForTagging type is untouched.\n const rawPrismaForTransactions = baseClient as unknown as RawPrismaForRlsTransaction;\n // Same unwrapped client again, typed for binding the context statement to a\n // caller's transaction (see runOperationInCallerTransaction).\n const rawPrismaForCallerTransactions = baseClient as unknown as RawPrismaForCallerTransaction;\n const tagsTransactions = fullConfig.enableRlsGucTagging || fullConfig.enableApplicationNameTagging;\n\n /**\n * Execute an operation whose args have already been workspace-injected.\n *\n * - Inside a caller's interactive transaction: set the context on that\n * transaction (once) and run the operation in place, so it is atomic with\n * the rest of the caller's transaction and its locks last until commit.\n * - Inside a batch `$transaction([...])`: run in place; the `$transaction`\n * wrapper below prepended the context statement to the batch.\n * - Standalone: unchanged — session application_name tag, then the\n * operation in its own `SET LOCAL` transaction when RLS tagging is on.\n */\n const dispatch = async (\n params: { model: string; query: (args: unknown) => Promise<unknown>; __internalParams?: PrismaQueryInternalParams },\n wsCtx: WorkspaceContext,\n operation: string,\n finalArgs: unknown\n ): Promise<unknown> => {\n // No tagging: nothing is set per operation, so every call runs in place\n // exactly as before (inside a caller transaction or not).\n if (!tagsTransactions) return params.query(finalArgs);\n const callerTransaction = getCallerTransaction(params.__internalParams);\n if (callerTransaction?.kind === 'itx') {\n return runOperationInCallerTransaction(rawPrismaForCallerTransactions, callerTransaction, wsCtx, fullConfig, () =>\n params.query(finalArgs)\n );\n }\n if (callerTransaction?.kind === 'batch') {\n return params.query(finalArgs);\n }\n if (fullConfig.enableApplicationNameTagging) {\n await maybeTagConnection(rawPrisma, wsCtx);\n }\n if (fullConfig.enableRlsGucTagging) {\n return runOperationWithRlsGuc(rawPrismaForTransactions, wsCtx, params.model, operation, finalArgs);\n }\n return params.query(finalArgs);\n };\n\n /**\n * Raw SQL inside a caller's interactive transaction gets the same context, so\n * `SELECT … FOR UPDATE` fences and raw reads/writes see the caller's workspace\n * under FORCE RLS. Standalone raw SQL is unchanged (no context statement).\n */\n const rawOperation = async ({ args, query, __internalParams }: RawOperationHandlerParams): Promise<unknown> => {\n if (!tagsTransactions) return query(args);\n const callerTransaction = getCallerTransaction(__internalParams);\n if (callerTransaction?.kind !== 'itx') return query(args);\n const wsCtx = getWorkspaceContext();\n if (!wsCtx?.workspaceId) return query(args);\n return runOperationInCallerTransaction(rawPrismaForCallerTransactions, callerTransaction, wsCtx, fullConfig, () =>\n query(args)\n );\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 enableApplicationNameTagging: fullConfig.enableApplicationNameTagging,\n enableRlsGucTagging: fullConfig.enableRlsGucTagging,\n });\n\n // Raw SQL hooks only matter when a context statement exists to apply.\n const rawOperationHooks = tagsTransactions\n ? {\n $queryRaw: rawOperation,\n $executeRaw: rawOperation,\n $queryRawUnsafe: rawOperation,\n $executeRawUnsafe: rawOperation,\n $queryRawTyped: rawOperation,\n }\n : {};\n\n const withQueryHooks = prismaClient.$extends({\n query: {\n ...rawOperationHooks,\n $allModels: {\n // ================================================================\n // WRITE OPERATIONS - inject workspaceId into data\n // ================================================================\n\n async create({\n model,\n args,\n query,\n __internalParams,\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 const finalArgs = {\n ...stripSkipFlag(args),\n data: injectedData,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'create', finalArgs);\n },\n\n async createMany({\n model,\n args,\n query,\n __internalParams,\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 const finalArgs = {\n ...stripSkipFlag(args),\n data: Array.isArray(args.data) ? injectedData : injectedData[0],\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'createMany', finalArgs);\n },\n\n async createManyAndReturn({\n model,\n args,\n query,\n __internalParams,\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 const finalArgs = {\n ...stripSkipFlag(args),\n data: Array.isArray(args.data) ? injectedData : injectedData[0],\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'createManyAndReturn', finalArgs);\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 __internalParams,\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 const finalArgs = {\n ...stripSkipFlag(args),\n data: injectedData,\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'update', finalArgs);\n },\n\n async updateMany({\n model,\n args,\n query,\n __internalParams,\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 const finalArgs = {\n ...stripSkipFlag(args),\n data: injectedData,\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'updateMany', finalArgs);\n },\n\n async upsert({\n model,\n args,\n query,\n __internalParams,\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 const finalArgs = {\n ...stripSkipFlag(args),\n create: injectedCreate,\n update: injectedUpdate,\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'upsert', finalArgs);\n },\n\n // ================================================================\n // READ OPERATIONS - inject workspaceId into where clause\n // ================================================================\n\n async findMany({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'findMany', finalArgs);\n },\n\n async findFirst({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'findFirst', finalArgs);\n },\n\n async findFirstOrThrow({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'findFirstOrThrow', finalArgs);\n },\n\n async findUnique({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'findUnique', finalArgs);\n },\n\n async findUniqueOrThrow({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'findUniqueOrThrow', finalArgs);\n },\n\n async count({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'count', finalArgs);\n },\n\n async aggregate({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'aggregate', finalArgs);\n },\n\n async groupBy({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'groupBy', finalArgs);\n },\n\n // ================================================================\n // DELETE OPERATIONS - inject workspaceId into where clause\n // ================================================================\n\n async delete({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'delete', finalArgs);\n },\n\n async deleteMany({ model, args, query, __internalParams }: 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 const finalArgs = {\n ...stripSkipFlag(args),\n where: injectedWhere,\n };\n return dispatch({ model, query, __internalParams }, wsCtx, 'deleteMany', finalArgs);\n },\n },\n },\n });\n\n if (!tagsTransactions) return withQueryHooks;\n\n // Batch transactions: Prisma runs `$transaction([...])` members in one database\n // transaction, but an operation hook cannot add a statement to the batch. So\n // wrap `$transaction` itself and prepend the context statement; its result is\n // dropped so callers get exactly their own members' results. The function form\n // passes straight through — the hooks above handle interactive transactions.\n // `$parent` is the client one extension layer down (the query-hooked client\n // above), so members and nested transactions keep every hook.\n const wrapped = withQueryHooks as unknown as { $extends: (args: unknown) => T };\n return wrapped.$extends({\n client: {\n $transaction(this: { $parent?: TransactionDelegate }, input: unknown, options?: unknown): Promise<unknown> {\n const parent = this.$parent;\n if (!parent) {\n throw new Error('[WorkspaceExtension] $transaction wrapper could not resolve its parent client.');\n }\n if (Array.isArray(input)) {\n const wsCtx = getWorkspaceContext();\n const statement = wsCtx?.workspaceId ? buildTransactionContextStatement(wsCtx, fullConfig) : undefined;\n if (statement) {\n const setContext = rawPrismaForCallerTransactions.$executeRawUnsafe(statement.sql, ...statement.params);\n return parent\n .$transaction([setContext, ...input], options)\n .then((results) => (Array.isArray(results) ? results.slice(1) : results));\n }\n }\n return parent.$transaction(input, options);\n },\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graph/utils/registry.ts","../src/graph/utils/helpers.ts","../src/prisma/client.ts","../src/graph/middleware/prisma-extension.ts"],"names":["GraphRegistry","entityMappings","Map","relationshipMappings","registeredModules","Set","resolveFields","entityType","config","Array","isArray","fields","logger","warn","registerModule","moduleName","entities","relationships","has","info","entityCount","entityConfig","Object","entries","enabled","resolvedFields","resolvedConfig","set","relationshipCount","relationshipType","relationshipConfig","add","getEntityConfig","get","getRelationshipConfig","getAllEntityTypes","from","keys","getAllRelationshipTypes","getRegisteredModules","isEntityRegistered","isRelationshipRegistered","getOrganizationId","data","getOrgId","undefined","getWorkspaceId","getRbacConfig","rbac","resolveRbacMetadata","entityData","rbacConfig","name","extractName","identifier","extractIdentifier","parentResourceIdentifier","parentResourceField","resourceTypeName","createResource","getStats","collections","edgeTypes","values","collection","label","modules","size","clear","getRelationshipsForEntity","result","key","push","printStatus","stats","join","uuidv4","crypto","randomUUID","createEntityEvent","eventType","organizationId","entity","metadata","productSource","eventId","process","env","timestamp","Date","toISOString","userId","correlationId","createRelationshipEvent","relationship","id","to","type","extractMinimalFields","modelName","minimal","field","parseRelationship","String","fromField","extractMetadata","getCollectionForEntity","extractEntityTitle","extractTitle","shouldSyncEntity","shouldSyncRelationship","createConnectionPool","idleTimeoutMillis","poolConfig","connectionString","databaseUrl","max","maxConnections","connectionTimeoutMillis","keepAlive","keepAliveInitialDelayMillis","applicationName","application_name","queryTimeoutMillis","query_timeout","statementTimeoutMillis","statement_timeout","idleInTransactionTimeoutMillis","idle_in_transaction_session_timeout","lockTimeoutMillis","lock_timeout","pool","Pool","on","error","message","installAcquireRetry","acquireRetries","acquireRetryDelayMillis","startPoolWarmer","isTransientAcquireError","Error","toLowerCase","includes","retries","baseDelayMillis","originalConnect","connect","bind","acquireWithRetry","attempt","delayMillis","Promise","resolve","setTimeout","patchedConnect","callback","then","client","release","keepWarm","intervalMs","warmupIntervalMillis","WARM_FAILURE_LOG_INTERVAL_MS","consecutiveWarmFailures","lastWarmFailureLogAt","timer","setInterval","query","failedAttempts","now","unref","originalEnd","end","args","clearInterval","ensureServiceApplicationName","productName","createPrismaAdapter","PrismaPg","configurePrismaLogging","isDevelopment","slowQueryThreshold","enableQueryLogging","$on","e","duration","substring","length","params","debug","target","PrismaClientWrapper","connectionState","isConnected","attempts","isDisconnecting","getClient","getPool","getConnectionState","delay","$connect","lastConnectedAt","lastError","errorMessage","waitTime","Math","pow","disconnect","$disconnect","registerShutdownHandlers","shutdownHandler","signal","exit","createPrismaClient","PrismaClientConstructor","adapter","logLevels","emit","level","log","defaultConfig","monitoredOperations","extractEntityInfo","model","record","extractContext","actorId","workspaceId","emitEntityEvent","entityInfo","entityTypes","context","minimalData","orgId","rbacMetadata","hasName","eventEmitter","publishEntityEvent","catch","emitRelationshipEvents","fromId","relationshipKey","foreignKeyValue","targetType","polymorphicTypeField","description","relationType","addGraphExtension","baseClient","fullConfig","prismaClient","$extends","$allModels","create","update","delete","updateMany","deleteMany"],"mappings":"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","file":"chunk-L5TDUAFN.js","sourcesContent":["/**\n * Graph Registry - Decentralized Graph Configuration System\n *\n * This registry allows each module to define its own graph configuration\n * without touching the central graph module. Modules register their entity\n * and relationship mappings, which are then used by the graph sync service.\n *\n * @module graph-registry\n * @category Graph\n */\nimport { logger } from '../../logger/index.js';\nimport type {\n EntityGraphConfig,\n ModuleGraphConfig,\n RelationshipGraphConfig,\n RegistryEntityRbacConfig,\n} from '../types.js';\n\n/**\n * Internal representation of entity config with resolved fields\n */\ninterface ResolvedEntityGraphConfig extends Omit<EntityGraphConfig, 'fields'> {\n fields: string[];\n getOrgId?: (data: Record<string, unknown>) => string | undefined;\n getWorkspaceId?: (data: Record<string, unknown>) => string | undefined;\n rbac?: RegistryEntityRbacConfig;\n}\n\n/**\n * Central registry for all graph configurations\n */\nexport class GraphRegistry {\n private static entityMappings: Map<string, ResolvedEntityGraphConfig> = new Map();\n private static relationshipMappings: Map<string, RelationshipGraphConfig> = new Map();\n private static registeredModules: Set<string> = new Set();\n\n /**\n * Resolve fields from entity configuration\n *\n * @param entityType - Name of the entity type\n * @param config - Entity configuration\n * @returns Resolved array of field names\n */\n private static resolveFields(entityType: string, config: EntityGraphConfig): string[] {\n if (Array.isArray(config.fields)) {\n return config.fields;\n }\n\n // Fallback: empty array if fields not configured\n logger.warn(`[GraphRegistry] No fields configuration for ${entityType}, using empty array`);\n return [];\n }\n\n /**\n * Register a module's graph configuration\n * @param config - Module graph configuration\n */\n static registerModule(config: ModuleGraphConfig): void {\n const { moduleName, entities, relationships } = config;\n\n if (this.registeredModules.has(moduleName)) {\n logger.warn(`[GraphRegistry] Module '${moduleName}' already registered, skipping`);\n return;\n }\n\n logger.info(`[GraphRegistry] Registering module: ${moduleName}`);\n\n // Register entities\n let entityCount = 0;\n for (const [entityType, entityConfig] of Object.entries(entities)) {\n if (entityConfig.enabled !== false) {\n // Resolve fields\n const resolvedFields = this.resolveFields(entityType, entityConfig);\n\n // Store resolved configuration\n const resolvedConfig: ResolvedEntityGraphConfig = {\n ...entityConfig,\n fields: resolvedFields,\n };\n\n this.entityMappings.set(entityType, resolvedConfig);\n entityCount++;\n }\n }\n\n // Register relationships\n let relationshipCount = 0;\n if (relationships) {\n for (const [relationshipType, relationshipConfig] of Object.entries(relationships)) {\n if (relationshipConfig.enabled !== false) {\n this.relationshipMappings.set(relationshipType, relationshipConfig);\n relationshipCount++;\n }\n }\n }\n\n this.registeredModules.add(moduleName);\n logger.info(\n `[GraphRegistry] ✅ Registered ${moduleName}: ${entityCount} entities, ${relationshipCount} relationships`\n );\n }\n\n /**\n * Get entity configuration by entity type\n * @param entityType - Entity type name (e.g., 'Calendar', 'Group')\n * @returns Entity configuration or undefined (with resolved fields)\n */\n static getEntityConfig(entityType: string): ResolvedEntityGraphConfig | undefined {\n return this.entityMappings.get(entityType);\n }\n\n /**\n * Get relationship configuration by relationship type\n * @param relationshipType - Relationship type name (e.g., 'EventAttendee', 'GroupMembership')\n * @returns Relationship configuration or undefined\n */\n static getRelationshipConfig(relationshipType: string): RelationshipGraphConfig | undefined {\n return this.relationshipMappings.get(relationshipType);\n }\n\n /**\n * Get all registered entity types\n * @returns Array of entity type names\n */\n static getAllEntityTypes(): string[] {\n return Array.from(this.entityMappings.keys());\n }\n\n /**\n * Get all registered relationship types\n * @returns Array of relationship type names\n */\n static getAllRelationshipTypes(): string[] {\n return Array.from(this.relationshipMappings.keys());\n }\n\n /**\n * Get all registered module names\n * @returns Array of module names\n */\n static getRegisteredModules(): string[] {\n return Array.from(this.registeredModules);\n }\n\n /**\n * Check if an entity type is registered\n * @param entityType - Entity type to check\n * @returns True if registered\n */\n static isEntityRegistered(entityType: string): boolean {\n return this.entityMappings.has(entityType);\n }\n\n /**\n * Check if a relationship type is registered\n * @param relationshipType - Relationship type to check\n * @returns True if registered\n */\n static isRelationshipRegistered(relationshipType: string): boolean {\n return this.relationshipMappings.has(relationshipType);\n }\n\n /**\n * Extract organization ID from entity data using configured mapping function\n * @param entityType - Entity type name\n * @param data - Entity data record\n * @returns Organization ID or undefined\n */\n static getOrganizationId(entityType: string, data: Record<string, unknown>): string | undefined {\n const config = this.entityMappings.get(entityType);\n if (!config || !config.getOrgId) {\n return undefined;\n }\n return config.getOrgId(data);\n }\n\n /**\n * Extract workspace ID from entity data using configured mapping function\n * @param entityType - Entity type name\n * @param data - Entity data record\n * @returns Workspace ID or undefined\n */\n static getWorkspaceId(entityType: string, data: Record<string, unknown>): string | undefined {\n const config = this.entityMappings.get(entityType);\n if (!config || !config.getWorkspaceId) {\n return undefined;\n }\n return config.getWorkspaceId(data);\n }\n\n /**\n * Get RBAC configuration for an entity type\n * Used by the Prisma graph extension to include RBAC metadata in entity events\n * @param entityType - Entity type name (e.g., 'Conversation', 'Agent')\n * @returns RBAC config or undefined if no RBAC is configured for this entity\n */\n static getRbacConfig(entityType: string): RegistryEntityRbacConfig | undefined {\n const config = this.entityMappings.get(entityType);\n return config?.rbac;\n }\n\n /**\n * Resolve RBAC event metadata from entity data\n * Converts the registry's function-based RBAC config into the flat metadata\n * structure expected by the RBAC consumer in the NATS event payload.\n * @param entityType - Entity type name\n * @param entityData - The entity data record\n * @returns RBAC metadata for the event or undefined\n */\n static resolveRbacMetadata(\n entityType: string,\n entityData: Record<string, unknown>\n ):\n | {\n resourceTypeName: string;\n name?: string;\n identifier?: string;\n parentResourceIdentifier?: string;\n createResource?: boolean;\n }\n | undefined {\n const rbacConfig = this.getRbacConfig(entityType);\n if (!rbacConfig) {\n return undefined;\n }\n\n const name = rbacConfig.extractName ? rbacConfig.extractName(entityData) : undefined;\n const identifier = rbacConfig.extractIdentifier ? rbacConfig.extractIdentifier(entityData) : undefined;\n const parentResourceIdentifier = rbacConfig.parentResourceField\n ? (entityData[rbacConfig.parentResourceField] as string | undefined)\n : undefined;\n\n return {\n resourceTypeName: rbacConfig.resourceTypeName,\n ...(name && { name }),\n ...(identifier && { identifier }),\n ...(parentResourceIdentifier && { parentResourceIdentifier }),\n ...(rbacConfig.createResource !== undefined && { createResource: rbacConfig.createResource }),\n };\n }\n\n /**\n * Get statistics about registered configurations\n * @returns Statistics object\n */\n static getStats(): {\n modules: number;\n entities: number;\n relationships: number;\n collections: Set<string>;\n edgeTypes: Set<string>;\n } {\n const collections = new Set<string>();\n const edgeTypes = new Set<string>();\n\n for (const config of this.entityMappings.values()) {\n collections.add(config.collection || 'product_entities');\n }\n\n for (const config of this.relationshipMappings.values()) {\n if (config.label) {\n edgeTypes.add(config.label);\n }\n }\n\n return {\n modules: this.registeredModules.size,\n entities: this.entityMappings.size,\n relationships: this.relationshipMappings.size,\n collections,\n edgeTypes,\n };\n }\n\n /**\n * Clear all registrations (for testing)\n */\n static clear(): void {\n this.entityMappings.clear();\n this.relationshipMappings.clear();\n this.registeredModules.clear();\n logger.info('[GraphRegistry] Cleared all registrations');\n }\n\n /**\n * Get all relationships where the given entity type is the \"from\" side\n * This is used for automatic relationship event emission when entities are created/updated\n * @param entityType - Entity type name (e.g., 'UniversalTag')\n * @returns Array of [relationshipKey, config] tuples\n */\n static getRelationshipsForEntity(entityType: string): Array<[string, RelationshipGraphConfig]> {\n const result: Array<[string, RelationshipGraphConfig]> = [];\n\n for (const [key, config] of this.relationshipMappings.entries()) {\n if (config.from === entityType) {\n result.push([key, config]);\n }\n }\n\n return result;\n }\n\n /**\n * Print registry status to console\n */\n static printStatus(): void {\n const stats = this.getStats();\n logger.info('');\n logger.info('📊 Graph Registry Status');\n logger.info('========================');\n logger.info(`Registered Modules: ${stats.modules}`);\n logger.info(`Total Entities: ${stats.entities}`);\n logger.info(`Total Relationships: ${stats.relationships}`);\n logger.info(`Vertex Collections: ${stats.collections.size}`);\n logger.info(`Edge Types: ${stats.edgeTypes.size}`);\n logger.info('');\n logger.info('Registered Modules:', this.getRegisteredModules().join(', '));\n logger.info('');\n }\n}\n","/**\n * Event Helpers - Registry-Based Graph Event Utilities\n *\n * This version uses the GraphRegistry to dynamically load entity and relationship\n * configurations from module-level graph.config.ts files.\n *\n * @module graph-helpers\n * @category Graph\n */\nimport { logger } from '../../logger/index.js';\nimport type { GraphEvent, GraphEventType } from '../types.js';\nimport { GraphRegistry } from './registry.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Create an entity event for the graph\n */\nexport function createEntityEvent(\n eventType: GraphEventType,\n organizationId: string,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n metadata?: {\n userId?: string;\n correlationId?: string;\n workspaceId?: string;\n projectId?: string;\n },\n productSource?: string\n): GraphEvent {\n return {\n eventId: `evt_${uuidv4()}`,\n eventType,\n organizationId,\n productSource: productSource || process.env['PRODUCT_SOURCE'] || 'default',\n timestamp: new Date().toISOString(),\n entity,\n metadata: {\n userId: metadata?.userId,\n correlationId: metadata?.correlationId || `req_${uuidv4()}`,\n },\n };\n}\n\n/**\n * Create a relationship event for the graph\n */\nexport function createRelationshipEvent(\n eventType: GraphEventType,\n organizationId: string,\n relationship: {\n from: { id: string; type: string };\n to: { id: string; type: string };\n type: string;\n metadata: Record<string, unknown>;\n },\n metadata?: {\n userId?: string;\n correlationId?: string;\n },\n productSource?: string\n): GraphEvent {\n return {\n eventId: `evt_${uuidv4()}`,\n eventType,\n organizationId,\n productSource: productSource || process.env['PRODUCT_SOURCE'] || 'default',\n timestamp: new Date().toISOString(),\n entity: {\n id: `${relationship.from.id}_${relationship.to.id}`,\n type: relationship.type,\n data: {},\n },\n relationship,\n metadata: {\n userId: metadata?.userId,\n correlationId: metadata?.correlationId || `req_${uuidv4()}`,\n },\n };\n}\n\n/**\n * Extract minimal fields for syncing to graph (uses registry)\n *\n * @param modelName - Prisma model name (e.g., 'Calendar', 'Group')\n * @param entity - Full entity data from Prisma\n * @returns Minimal entity data for graph sync\n */\nexport function extractMinimalFields(modelName: string, entity: Record<string, unknown>): Record<string, unknown> {\n // Get entity config from registry\n const config = GraphRegistry.getEntityConfig(modelName);\n\n if (!config) {\n // Fallback: if entity not registered, just use id and workspaceID\n logger.warn(`[GraphHelpers] No graph config found for entity type: ${modelName}, using fallback`);\n const minimal: Record<string, unknown> = {};\n\n if (entity['id']) minimal['id'] = entity['id'];\n if (entity['workspaceID']) minimal['workspaceID'] = entity['workspaceID'];\n if (entity['workspaceId']) minimal['workspaceId'] = entity['workspaceId'];\n\n return minimal;\n }\n\n // Extract configured fields\n const minimal: Record<string, unknown> = {};\n\n for (const field of config.fields) {\n if (entity[field] !== undefined) {\n minimal[field] = entity[field];\n }\n }\n\n return minimal;\n}\n\n/**\n * Parse relationship from join table models (uses registry)\n *\n * @param modelName - Relationship model name (e.g., 'EventAttendee', 'GroupMembership')\n * @param relationship - Full relationship data from Prisma\n * @returns Parsed relationship with from/to/type/metadata\n */\nexport function parseRelationship(\n modelName: string,\n relationship: Record<string, unknown>\n): {\n from: { id: string; type: string };\n to: { id: string; type: string };\n relationshipType: string;\n metadata: Record<string, unknown>;\n} {\n // Get relationship config from registry\n const config = GraphRegistry.getRelationshipConfig(modelName);\n\n if (!config) {\n logger.warn(`[GraphHelpers] No graph config found for relationship type: ${modelName}, using fallback`);\n return {\n from: { id: 'unknown', type: 'Unknown' },\n to: { id: 'unknown', type: 'Unknown' },\n relationshipType: 'relates_to',\n metadata: {},\n };\n }\n\n // Extract relationship data using config\n return {\n from: {\n id: String(relationship[config.fromField] || 'unknown'),\n type: config.from,\n },\n to: {\n id: String(relationship[config.to] || 'unknown'),\n type: config.to,\n },\n relationshipType: config.label || 'relates_to',\n metadata: config.extractMetadata?.(relationship) ?? {},\n };\n}\n\n/**\n * Get the graph vertex label for an entity type (uses registry)\n *\n * @param entityType - Entity type name\n * @returns Collection name\n */\nexport function getCollectionForEntity(entityType: string): string {\n const config = GraphRegistry.getEntityConfig(entityType);\n\n if (!config) {\n // Default to product_entities if not registered\n return 'entity';\n }\n\n return config.collection || 'entity';\n}\n\n/**\n * Extract title from entity (uses registry or fallback)\n *\n * @param entityType - Entity type name\n * @param entity - Entity data\n * @returns Title string\n */\nexport function extractEntityTitle(entityType: string, entity: Record<string, unknown>): string {\n const config = GraphRegistry.getEntityConfig(entityType);\n\n // Use custom title extractor if provided\n if (config?.extractTitle) {\n return config.extractTitle(entity);\n }\n\n // Fallback: try common title fields\n return String(entity['name'] || entity['title'] || entity['email'] || entity['id'] || 'Untitled');\n}\n\n/**\n * Check if an entity type should be synced to the graph\n *\n * @param entityType - Entity type name\n * @returns True if entity should be synced\n */\nexport function shouldSyncEntity(entityType: string): boolean {\n const config = GraphRegistry.getEntityConfig(entityType);\n\n if (!config) {\n // If not registered, don't sync\n return false;\n }\n\n // Check if explicitly disabled\n return config.enabled !== false;\n}\n\n/**\n * Check if a relationship type should be synced to the graph\n *\n * @param relationshipType - Relationship type name\n * @returns True if relationship should be synced\n */\nexport function shouldSyncRelationship(relationshipType: string): boolean {\n const config = GraphRegistry.getRelationshipConfig(relationshipType);\n\n if (!config) {\n // If not registered, don't sync\n return false;\n }\n\n // Check if explicitly disabled\n return config.enabled !== false;\n}\n","/**\n * Prisma 7 Client Factory with PostgreSQL Adapter\n *\n * This module provides a generic factory for creating Prisma clients\n * configured with the PostgreSQL driver adapter as required by Prisma 7.\n *\n * Breaking Changes in Prisma 7:\n * - Must use database driver adapter (@prisma/adapter-pg for PostgreSQL)\n * - Datasource URL moved from schema.prisma to prisma.config.ts\n * - DMMF no longer available at runtime (use generator for build-time access)\n *\n * @module prisma/client\n */\n\nimport { PrismaPg } from '@prisma/adapter-pg';\nimport { Pool, type PoolClient, type PoolConfig } from 'pg';\nimport { logger } from '../logger/index.js';\nimport type { PrismaClientConfig, ConnectionState } from './types.js';\n\n/**\n * Prisma event object types\n */\nexport interface PrismaQueryEvent {\n query: string;\n params: string;\n duration: number;\n target?: string;\n}\n\nexport interface PrismaLogEvent {\n message: string;\n target?: string;\n}\n\nexport type PrismaEvent = PrismaQueryEvent | PrismaLogEvent;\n\n/**\n * Transaction options for Prisma $transaction method\n */\nexport interface PrismaTransactionOptions {\n maxWait?: number;\n timeout?: number;\n isolationLevel?: string;\n}\n\n/**\n * Base Prisma client interface with required methods\n *\n * This interface defines the MINIMUM contract required for server bootstrapping.\n * It only includes methods actually used by the SDK's server module.\n *\n * Note: Service-specific model properties (e.g., universalTag, user, workspace, etc.)\n * and full method signatures should be accessed by casting to the service's\n * generated Prisma client type.\n *\n * @example\n * ```typescript\n * // In your service's context type:\n * import type { PrismaClient } from './generated/prisma/client.js';\n * import type { GraphQLContext } from '@burdenoff/be-sdk';\n *\n * export interface Context extends GraphQLContext {\n * db: PrismaClient;\n * }\n * ```\n */\nexport interface PrismaClientBase {\n /** Connect to the database */\n $connect(): Promise<void>;\n /** Disconnect from the database */\n $disconnect(): Promise<void>;\n /** Register event handlers for logging */\n $on(event: string, callback: (e: PrismaEvent) => void): void;\n /** Execute a raw SQL query */\n $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: unknown[]): Promise<T>;\n}\n\n/**\n * Database client return type for getDb()\n *\n * Returns the service's PrismaClient type (T) with a `client` property\n * for backwards compatibility. All model access and typing comes from\n * the service's own generated Prisma types.\n *\n * @example\n * ```typescript\n * // In your service - import YOUR generated PrismaClient\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { getDb } from '@burdenoff/be-sdk/prisma';\n *\n * // Pass your PrismaClient type for full type safety\n * const db = getDb<PrismaClient>();\n * const tags = await db.client.universalTag.findMany(); // Fully typed!\n * ```\n */\nexport type DatabaseReturnType<T extends PrismaClientBase = PrismaClientBase> = T & {\n /**\n * Client property for explicit model access.\n * This is the same as the db object itself, provided for API consistency.\n */\n client: T;\n};\n\n/**\n * Create a PostgreSQL connection pool.\n *\n * The base pool sizing (max / idle / connection timeout) is unchanged. The\n * optional tuning fields (`applicationName`, `statementTimeoutMillis`,\n * `idleInTransactionTimeoutMillis`, `lockTimeoutMillis`) are only attached to\n * the pool config when explicitly provided — when they are all unset, the\n * resulting pool is byte-for-byte identical to the previous behavior. This keeps\n * the change safe to roll out fleet-wide: `application_name` is pure diagnostic\n * metadata, and every DB-enforced timeout defaults to OFF (pg default).\n */\nexport function createConnectionPool(config: PrismaClientConfig): Pool {\n const idleTimeoutMillis = config.idleTimeoutMillis ?? 30000;\n const poolConfig: PoolConfig = {\n connectionString: config.databaseUrl,\n max: config.maxConnections ?? 20,\n idleTimeoutMillis,\n connectionTimeoutMillis: config.connectionTimeoutMillis ?? 10000,\n // Keep pooled TCP sockets alive so Azure's load balancer / Postgres does not\n // silently drop an idle connection out from under the pool. Without this the\n // first query after a quiet window re-establishes a socket — the slow cold\n // TLS handshake that intermittently exceeds connectionTimeoutMillis and 500s\n // the request (context-switcher bootstrap after ~30s idle). Pure transport\n // hygiene; no effect on query behavior.\n keepAlive: true,\n keepAliveInitialDelayMillis: 10000,\n };\n\n // Diagnostic metadata only — no effect on query behavior.\n if (config.applicationName) {\n poolConfig.application_name = config.applicationName;\n }\n\n // Client-side query timeout — the pooler-safe query bound. node-postgres\n // applies this as a per-query timer inside the driver (NOT a startup\n // parameter and NOT a server GUC), so it works transparently through Azure's\n // built-in PgBouncer transaction pooling (the :6432 runtime endpoint) where\n // the server-side `statement_timeout` startup parameter cannot be used. When\n // it fires, pg destroys the connection and the pool replaces it on the next\n // acquire, so a runaway/hung query can no longer permanently pin a pool slot.\n // Only applied when explicitly opted in, so the default is unchanged.\n if (config.queryTimeoutMillis != null && config.queryTimeoutMillis > 0) {\n poolConfig.query_timeout = config.queryTimeoutMillis;\n }\n\n // DB-enforced safety timeouts — only applied when explicitly opted in, so the\n // default (unset) preserves the current no-server-timeout behavior exactly.\n if (config.statementTimeoutMillis != null && config.statementTimeoutMillis > 0) {\n poolConfig.statement_timeout = config.statementTimeoutMillis;\n }\n if (config.idleInTransactionTimeoutMillis != null && config.idleInTransactionTimeoutMillis > 0) {\n poolConfig.idle_in_transaction_session_timeout = config.idleInTransactionTimeoutMillis;\n }\n if (config.lockTimeoutMillis != null && config.lockTimeoutMillis > 0) {\n poolConfig.lock_timeout = config.lockTimeoutMillis;\n }\n\n const pool = new Pool(poolConfig);\n\n // node-postgres emits 'error' on the Pool when an IDLE pooled client is\n // dropped by the server or network (e.g. a Postgres restart, a PgBouncer\n // server_lifetime recycle, an Azure LB reset). With no listener that is an\n // unhandled 'error' event — which CRASHES the process. The pool discards the\n // dead client and replaces it on the next acquire, so this is log-worthy but\n // never fatal.\n pool.on('error', (error: Error) => {\n logger.warn(\n '[pg-pool] Idle pooled connection errored (dropped by server/network); it will be replaced on next acquire',\n { error: error.message }\n );\n });\n\n installAcquireRetry(pool, config.acquireRetries ?? 2, config.acquireRetryDelayMillis ?? 250);\n startPoolWarmer(pool, config, idleTimeoutMillis);\n return pool;\n}\n\n/**\n * True for errors that occur while ESTABLISHING a connection and are worth one\n * more attempt: the cold-connect stall past `connectionTimeoutMillis` observed\n * on Azure ACA, a checkout-queue timeout, a reset/refused during handshake, or\n * transient DNS. Anything else (auth failure, TLS misconfig, \"pool after end\")\n * fails immediately.\n */\nexport function isTransientAcquireError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('connection terminated due to connection timeout') ||\n message.includes('timeout exceeded when trying to connect') ||\n message.includes('connection terminated unexpectedly') ||\n message.includes('econnreset') ||\n message.includes('econnrefused') ||\n message.includes('eai_again')\n );\n}\n\ntype PoolConnectCallback = (\n err: Error | undefined,\n client: PoolClient | undefined,\n done: (release?: Error | boolean) => void\n) => void;\n\n/**\n * Retry transient connect-phase failures when acquiring a pooled connection.\n *\n * The acquire phase (pool checkout / physical connect) happens BEFORE any query\n * is dispatched, so retrying it is always safe — it can never double-execute a\n * statement. This is the piece the keep-warm ping cannot cover: the warmer keeps\n * one connection live, but a concurrent burst after an idle window still\n * cold-connects clients 2..N, and any of those stalling past\n * `connectionTimeoutMillis` used to surface directly as a resolver 500\n * (\"Connection terminated due to connection timeout\").\n *\n * Patches `pool.connect` in place (both the promise and callback forms —\n * `pool.query` funnels through the callback form internally, and the Prisma\n * pg adapter uses both), so every consumer of the pool gets the retry.\n */\nexport function installAcquireRetry(pool: Pool, retries: number, baseDelayMillis: number): void {\n if (retries <= 0) return;\n const originalConnect = pool.connect.bind(pool) as () => Promise<PoolClient>;\n\n const acquireWithRetry = async (): Promise<PoolClient> => {\n let attempt = 0;\n for (;;) {\n try {\n return await originalConnect();\n } catch (error) {\n if (attempt >= retries || !isTransientAcquireError(error)) {\n throw error;\n }\n attempt += 1;\n const delayMillis = baseDelayMillis * 2 ** (attempt - 1);\n logger.warn(\n `[pg-pool] Transient connection-acquire failure (attempt ${String(attempt)}/${String(retries)}); ` +\n `retrying in ${String(delayMillis)}ms`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n await new Promise((resolve) => setTimeout(resolve, delayMillis));\n }\n }\n };\n\n const patchedConnect = (callback?: PoolConnectCallback): Promise<PoolClient> | void => {\n if (typeof callback === 'function') {\n acquireWithRetry().then(\n (client) => {\n callback(undefined, client, client.release.bind(client));\n },\n (error: unknown) => {\n callback(error instanceof Error ? error : new Error(String(error)), undefined, () => undefined);\n }\n );\n return;\n }\n return acquireWithRetry();\n };\n\n pool.connect = patchedConnect as typeof pool.connect;\n}\n\n/**\n * Keep at least one pooled connection live during quiet periods.\n *\n * `pg.Pool` closes every idle client after `idleTimeoutMillis`, so a service\n * that goes quiet for that long drains to zero connections and the next request\n * pays a full cold connect. On Azure ACA that cold TLS handshake occasionally\n * stalls past `connectionTimeoutMillis`, 500ing the request. A lightweight\n * `SELECT 1` on an interval shorter than the idle timeout keeps one connection\n * checked-out-and-released just often enough that its idle timer never expires,\n * so post-idle requests reuse a warm socket. The timer is `unref`'d (never keeps\n * the process alive) and cleared when the pool ends.\n */\nfunction startPoolWarmer(pool: Pool, config: PrismaClientConfig, idleTimeoutMillis: number): void {\n if (config.keepWarm === false) return;\n const intervalMs = config.warmupIntervalMillis ?? 20000;\n // A warmer at/above the idle timeout can't keep anything warm — skip it.\n if (intervalMs <= 0 || (idleTimeoutMillis > 0 && intervalMs >= idleTimeoutMillis)) return;\n\n // Surface persistent warm-up failures (throttled) instead of swallowing them:\n // if the warmer itself cannot reach Postgres the pool is silently unable to\n // establish connections, and previously operators only found out from\n // user-facing 500s. One warn per minute is enough signal without noise; a\n // recovery logs once so the window is visible in retrospect.\n const WARM_FAILURE_LOG_INTERVAL_MS = 60000;\n let consecutiveWarmFailures = 0;\n let lastWarmFailureLogAt = 0;\n const timer = setInterval(() => {\n pool.query('SELECT 1').then(\n () => {\n if (consecutiveWarmFailures > 0) {\n logger.info('[pg-pool] Warm-up query recovered', { failedAttempts: consecutiveWarmFailures });\n consecutiveWarmFailures = 0;\n }\n },\n (error: unknown) => {\n consecutiveWarmFailures += 1;\n const now = Date.now();\n if (now - lastWarmFailureLogAt >= WARM_FAILURE_LOG_INTERVAL_MS) {\n lastWarmFailureLogAt = now;\n logger.warn('[pg-pool] Warm-up query failing — the pool cannot establish connections to Postgres right now', {\n consecutiveWarmFailures,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n );\n }, intervalMs);\n if (typeof timer.unref === 'function') timer.unref();\n\n // Stop warming once the pool is torn down (graceful shutdown / disconnect).\n const originalEnd = pool.end.bind(pool);\n pool.end = ((...args: Parameters<typeof originalEnd>) => {\n clearInterval(timer);\n return originalEnd(...args);\n }) as typeof pool.end;\n}\n\n/**\n * Ensure a per-service Postgres `application_name` is set process-wide.\n *\n * node-postgres reads the libpq `PGAPPNAME` environment variable as the\n * `application_name` fallback for every Client/Pool it creates. Setting it here\n * guarantees per-service attribution in pg_stat_activity / pg_stat_statements for\n * ALL pools a service opens — including pools a service constructs itself (e.g.\n * via `createPrismaGraphIntegration`'s `createPrismaClient` closure) that bypass\n * `createConnectionPool`.\n *\n * Behavior-preserving: this is pure diagnostic metadata, it is only applied when\n * `PGAPPNAME` is not already set (so an explicit operator/env value wins), and an\n * explicit `application_name` in a pool config still takes precedence over the\n * env fallback.\n */\nexport function ensureServiceApplicationName(productName: string | undefined): void {\n if (productName && !process.env['PGAPPNAME']) {\n process.env['PGAPPNAME'] = `svc=${productName}`;\n }\n}\n\n/**\n * Create a Prisma PostgreSQL adapter\n */\nexport function createPrismaAdapter(pool: Pool): PrismaPg {\n return new PrismaPg(pool);\n}\n\n/**\n * Configure Prisma client logging\n */\nexport function configurePrismaLogging<T extends PrismaClientBase>(client: T, config: PrismaClientConfig): T {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n const slowQueryThreshold = config.slowQueryThreshold ?? (isDevelopment ? 100 : 500);\n\n // Query logging\n if (config.enableQueryLogging ?? isDevelopment) {\n client.$on('query', (e: PrismaEvent) => {\n if ('query' in e && 'duration' in e) {\n if (e.duration > slowQueryThreshold) {\n logger.warn('[Prisma] Slow query detected', {\n query: e.query.substring(0, 200) + (e.query.length > 200 ? '...' : ''),\n params: e.params,\n duration: `${e.duration}ms`,\n });\n } else {\n logger.debug('[Prisma] Query', {\n query: e.query.substring(0, 100) + (e.query.length > 100 ? '...' : ''),\n duration: `${e.duration}ms`,\n });\n }\n }\n });\n }\n\n // Error logging\n client.$on('error', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.error('[Prisma] Database error', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n // Warning logging\n client.$on('warn', (e: PrismaEvent) => {\n if ('message' in e) {\n logger.warn('[Prisma] Database warning', {\n message: e.message,\n target: e.target,\n });\n }\n });\n\n return client;\n}\n\n/**\n * Prisma Client Wrapper with connection management\n */\nexport class PrismaClientWrapper<T extends PrismaClientBase> {\n private client: T;\n private pool: Pool;\n private connectionState: ConnectionState = {\n isConnected: false,\n attempts: 0,\n };\n private isDisconnecting = false;\n\n constructor(client: T, pool: Pool, config: PrismaClientConfig) {\n this.client = client;\n this.pool = pool;\n\n // Configure logging\n configurePrismaLogging(this.client, config);\n }\n\n /**\n * Get the Prisma client instance\n */\n public getClient(): T {\n return this.client;\n }\n\n /**\n * Get the connection pool\n */\n public getPool(): Pool {\n return this.pool;\n }\n\n /**\n * Get connection state\n */\n public getConnectionState(): ConnectionState {\n return { ...this.connectionState };\n }\n\n /**\n * Connect to database with retry logic\n */\n public async connect(retries = 5, delay = 1000): Promise<void> {\n if (this.connectionState.isConnected) {\n logger.info('[Prisma] Already connected to database');\n return;\n }\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n this.connectionState.attempts = attempt;\n\n try {\n await this.client.$connect();\n this.connectionState.isConnected = true;\n this.connectionState.lastConnectedAt = new Date();\n this.connectionState.lastError = undefined;\n\n logger.info('[Prisma] Successfully connected to database');\n return;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.connectionState.lastError = errorMessage;\n\n logger.error(`[Prisma] Connection attempt ${attempt}/${retries} failed`, {\n error: errorMessage,\n });\n\n if (attempt === retries) {\n logger.error('[Prisma] Max connection retries reached');\n throw error;\n }\n\n // Exponential backoff\n const waitTime = delay * Math.pow(2, attempt - 1);\n logger.info(`[Prisma] Retrying in ${waitTime}ms...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n }\n }\n\n /**\n * Gracefully disconnect from database\n */\n public async disconnect(): Promise<void> {\n // Guard against multiple disconnect calls\n if (this.isDisconnecting) {\n logger.debug('[Prisma] Disconnect already in progress, skipping');\n return;\n }\n\n if (!this.connectionState.isConnected) {\n logger.info('[Prisma] Database already disconnected');\n return;\n }\n\n // Mark as disconnecting to prevent concurrent disconnect calls\n this.isDisconnecting = true;\n\n try {\n await this.client.$disconnect();\n await this.pool.end();\n this.connectionState.isConnected = false;\n\n logger.info('[Prisma] Successfully disconnected from database');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Ignore \"Called end on pool more than once\" errors\n if (errorMessage.includes('Called end on pool more than once')) {\n logger.debug('[Prisma] Pool already ended, ignoring duplicate end call');\n this.connectionState.isConnected = false;\n return;\n }\n\n logger.error('[Prisma] Error disconnecting from database', {\n error: errorMessage,\n });\n throw error;\n } finally {\n this.isDisconnecting = false;\n }\n }\n\n /**\n * Register graceful shutdown handlers\n */\n public registerShutdownHandlers(): void {\n const shutdownHandler = async (signal: string): Promise<void> => {\n logger.info(`[Prisma] Received ${signal}, starting graceful shutdown...`);\n\n try {\n await this.disconnect();\n process.exit(0);\n } catch (error) {\n logger.error('[Prisma] Error during graceful shutdown', {\n error: error instanceof Error ? error.message : String(error),\n });\n process.exit(1);\n }\n };\n\n // Register shutdown handlers\n process.on('SIGINT', () => void shutdownHandler('SIGINT'));\n process.on('SIGTERM', () => void shutdownHandler('SIGTERM'));\n process.on('beforeExit', () => void this.disconnect());\n }\n}\n\n/**\n * Create a configured Prisma client wrapper\n *\n * @example\n * ```typescript\n * import { PrismaClient } from './generated/prisma/client.js';\n * import { createPrismaClient } from '@burdenoff/be-sdk';\n *\n * const wrapper = createPrismaClient(PrismaClient, {\n * databaseUrl: process.env.DATABASE_URL!,\n * });\n *\n * await wrapper.connect();\n * const prisma = wrapper.getClient();\n *\n * // Use prisma client\n * const users = await prisma.user.findMany();\n * ```\n */\n/**\n * Prisma log level options\n */\nexport type PrismaLogLevel = 'info' | 'query' | 'warn' | 'error';\n\n/**\n * Prisma log definition\n */\nexport interface PrismaLogDefinition {\n level: PrismaLogLevel;\n emit: 'stdout' | 'event';\n}\n\n/**\n * Prisma client constructor options\n */\nexport interface PrismaClientConstructorOptions {\n adapter: PrismaPg;\n log?: (PrismaLogLevel | PrismaLogDefinition)[];\n}\n\nexport function createPrismaClient<T extends PrismaClientBase>(\n PrismaClientConstructor: new (options: PrismaClientConstructorOptions) => T,\n config: PrismaClientConfig\n): PrismaClientWrapper<T> {\n const isDevelopment = process.env['NODE_ENV'] === 'development';\n\n // Create connection pool\n const pool = createConnectionPool(config);\n\n // Create adapter\n const adapter = createPrismaAdapter(pool);\n\n // Determine log levels\n const logLevels: PrismaLogDefinition[] =\n (config.logLevels as PrismaLogDefinition[] | undefined) ??\n (isDevelopment\n ? [\n { emit: 'event', level: 'query' },\n { emit: 'event', level: 'info' },\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]\n : [\n { emit: 'event', level: 'warn' },\n { emit: 'event', level: 'error' },\n ]);\n\n // Create Prisma client\n const client = new PrismaClientConstructor({\n adapter,\n log: logLevels,\n });\n\n // Create and return wrapper\n return new PrismaClientWrapper(client, pool, config);\n}\n","/**\n * Prisma Middleware for Graph Event Emission\n *\n * Automatically emits events to the graph event queue when entities are\n * created, updated, or deleted in PostgreSQL.\n *\n * This is a product-agnostic Prisma extension that can be used by any Burdenoff product.\n *\n * @module prisma-graph-extension\n * @category Graph\n */\nimport { logger } from '../../logger/index.js';\nimport { extractMinimalFields } from '../utils/helpers.js';\nimport { GraphRegistry } from '../utils/registry.js';\n\n/**\n * Event types for entity operations\n */\nexport type EntityEventType =\n | 'entity.created'\n | 'entity.updated'\n | 'entity.deleted'\n | 'relationship.created'\n | 'relationship.deleted';\n\n/**\n * RBAC metadata for entity events (resolved from graph config)\n */\nexport interface EntityEventRbacMetadata {\n resourceTypeName: string;\n name?: string;\n identifier?: string;\n parentResourceIdentifier?: string;\n createResource?: boolean;\n}\n\n/**\n * Event emitter interface - products must provide their own implementation\n */\nexport interface GraphEventEmitter {\n publishEntityEvent(\n eventType: EntityEventType,\n entity: {\n id: string;\n type: string;\n data: Record<string, unknown>;\n },\n context: {\n productName: string;\n organizationId: string;\n actorId?: string;\n workspaceId?: string;\n },\n rbac?: EntityEventRbacMetadata\n ): Promise<void>;\n}\n\n/**\n * Configuration for graph middleware\n */\nexport interface GraphMiddlewareConfig {\n /** Whether middleware is enabled */\n enabled: boolean;\n /** Product name for event metadata */\n productName: string;\n /** Event emitter implementation */\n eventEmitter: GraphEventEmitter;\n /** Entity types to monitor (if empty, monitors all registered types) */\n entityTypes?: string[];\n /** Operations to monitor */\n monitoredOperations?: Array<'create' | 'update' | 'delete' | 'deleteMany' | 'updateMany'>;\n}\n\n/**\n * Default configuration\n */\nconst defaultConfig: {\n enabled: boolean;\n monitoredOperations: Array<'create' | 'update' | 'delete' | 'deleteMany' | 'updateMany'>;\n} = {\n enabled: true,\n monitoredOperations: ['create', 'update', 'delete', 'deleteMany', 'updateMany'],\n};\n\n/**\n * Extract entity information from Prisma result\n */\nfunction extractEntityInfo(\n model: string,\n result: unknown\n): { id: string; type: string; data: Record<string, unknown> } | null {\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n const record = result as Record<string, unknown>;\n const id = record['id'] as string;\n\n if (!id) {\n return null;\n }\n\n return {\n id,\n type: model,\n data: record,\n };\n}\n\n/**\n * Extract organization and user context from Prisma arguments\n */\nfunction extractContext(args: unknown): {\n organizationId?: string;\n actorId?: string;\n workspaceId?: string;\n} {\n if (!args || typeof args !== 'object') {\n return {};\n }\n\n const data =\n (args as { data?: Record<string, unknown>; where?: Record<string, unknown> })['data'] ||\n (args as { where?: Record<string, unknown> })['where'];\n\n if (!data || typeof data !== 'object') {\n return {};\n }\n\n return {\n organizationId: data['organizationId'] as string | undefined,\n actorId:\n (data['actorId'] as string | undefined) ||\n (data['createdBy'] as string | undefined) ||\n (data['updatedBy'] as string | undefined) ||\n (data['userId'] as string | undefined),\n workspaceId: (data['workspaceId'] as string | undefined) || (data['workspaceID'] as string | undefined),\n };\n}\n\n/**\n * Emit event for entity operation\n */\nfunction emitEntityEvent(\n eventType: EntityEventType,\n model: string,\n result: unknown,\n args: unknown,\n config: GraphMiddlewareConfig\n): void {\n const entityInfo = extractEntityInfo(model, result);\n if (!entityInfo) {\n return;\n }\n\n // Check if this entity type is registered in the graph registry\n if (!GraphRegistry.isEntityRegistered(model)) {\n return;\n }\n\n // Check if we should monitor this entity type\n if (config.entityTypes && config.entityTypes.length > 0 && !config.entityTypes.includes(model)) {\n return;\n }\n\n const context = extractContext(args);\n const minimalData = extractMinimalFields(model, entityInfo.data);\n\n // Use GraphRegistry to extract organization and workspace IDs from entity data\n // This allows entity-specific field mappings (e.g., tenantId → organizationId)\n const orgId = GraphRegistry.getOrganizationId(model, entityInfo.data) || context.organizationId || 'unknown';\n const workspaceId = GraphRegistry.getWorkspaceId(model, entityInfo.data) || context.workspaceId;\n const actorId = context.actorId || 'unknown';\n\n // Resolve RBAC metadata from GraphRegistry (if entity has rbac config)\n const rbacMetadata = GraphRegistry.resolveRbacMetadata(model, entityInfo.data);\n\n if (rbacMetadata) {\n logger.debug(`[GraphMiddleware] Including RBAC metadata for ${model}`, {\n resourceTypeName: rbacMetadata.resourceTypeName,\n hasName: !!rbacMetadata.name,\n });\n }\n\n // Emit event (non-blocking) — includes RBAC metadata when configured\n config.eventEmitter\n .publishEntityEvent(\n eventType,\n {\n id: entityInfo.id,\n type: entityInfo.type,\n data: minimalData,\n },\n {\n productName: config.productName,\n organizationId: orgId,\n actorId,\n workspaceId,\n },\n rbacMetadata\n )\n .catch((error: unknown) => {\n logger.error('[GraphMiddleware] Failed to emit event:', error);\n });\n\n // After emitting entity event, check for relationship events\n // Only for create/update operations\n if (eventType === 'entity.created' || eventType === 'entity.updated') {\n emitRelationshipEvents(model, entityInfo.data, orgId, config);\n }\n}\n\n/**\n * Emit relationship events based on foreign key values\n * This automatically creates edges in the graph when entities with foreign keys are created/updated\n */\nfunction emitRelationshipEvents(\n entityType: string,\n entityData: Record<string, unknown>,\n organizationId: string,\n config: GraphMiddlewareConfig\n): void {\n // Get all relationships where this entity type is the \"from\" side\n const relationships = GraphRegistry.getRelationshipsForEntity(entityType);\n\n if (relationships.length === 0) {\n return;\n }\n\n const fromId = entityData['id'] as string;\n if (!fromId) {\n return;\n }\n\n // For each relationship, check if the foreign key field has a value\n for (const [relationshipKey, relationshipConfig] of relationships) {\n const foreignKeyValue = entityData[relationshipConfig.fromField] as string | null | undefined;\n\n // Skip if foreign key is null/undefined (no relationship)\n if (!foreignKeyValue) {\n continue;\n }\n\n // Handle polymorphic relationships\n let targetType = relationshipConfig.to;\n if (relationshipConfig.to === '*') {\n if (relationshipConfig.polymorphicTypeField) {\n targetType = entityData[relationshipConfig.polymorphicTypeField] as string;\n if (!targetType) {\n logger.warn(`[GraphMiddleware] Polymorphic relationship ${relationshipKey} has no type field value`);\n continue;\n }\n } else {\n logger.debug(`[GraphMiddleware] Skipping polymorphic relationship without type field: ${relationshipKey}`);\n continue;\n }\n }\n\n // Extract metadata if configured\n const metadata = relationshipConfig.extractMetadata\n ? relationshipConfig.extractMetadata(entityData)\n : { description: relationshipConfig.description };\n\n // Emit relationship.created event\n config.eventEmitter\n .publishEntityEvent(\n 'relationship.created',\n {\n id: `${fromId}_${foreignKeyValue}`,\n type: relationshipConfig.label,\n data: {\n from: {\n id: fromId,\n type: entityType,\n },\n to: {\n id: foreignKeyValue,\n type: targetType,\n },\n relationType: relationshipConfig.label,\n metadata,\n },\n },\n {\n productName: config.productName,\n organizationId,\n }\n )\n .catch((error: unknown) => {\n logger.error(`[GraphMiddleware] Failed to emit relationship event for ${relationshipKey}:`, error);\n });\n\n logger.debug(\n `[GraphMiddleware] Emitted relationship.created: ${relationshipConfig.label} (${entityType}:${fromId} -> ${targetType}:${foreignKeyValue})`\n );\n }\n}\n\n/**\n * Add graph extension to Prisma client for automatic event emission\n *\n * This function uses Prisma Client Extensions (Prisma 6+) to intercept\n * database operations and emit events to the graph event queue.\n *\n * @param baseClient - Base Prisma client instance\n * @param config - Configuration for the middleware\n * @returns Extended Prisma client with graph event emission\n *\n * @example\n * ```typescript\n * import { PrismaClient } from '@prisma/client';\n * import { addGraphExtension } from '@burdenoff/be-sdk/graph';\n * import { eventQueue } from './event-queue';\n *\n * const baseClient = new PrismaClient();\n * const client = addGraphExtension(baseClient, {\n * enabled: true,\n * productName: 'workspaces',\n * eventEmitter: eventQueue,\n * entityTypes: ['Project', 'Group', 'Workspace'], // Optional: monitor specific types\n * });\n * ```\n */\nexport function addGraphExtension<T>(baseClient: T, config: GraphMiddlewareConfig): T {\n const fullConfig = { ...defaultConfig, ...config };\n\n if (!fullConfig.enabled) {\n logger.info('[GraphMiddleware] Extension disabled by configuration');\n return baseClient;\n }\n\n // Type assertion for Prisma client\n const prismaClient = baseClient as { $extends: (args: unknown) => T };\n\n return prismaClient.$extends({\n query: {\n $allModels: {\n async create({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('create')) {\n emitEntityEvent('entity.created', model, result, args, fullConfig);\n }\n\n return result;\n },\n\n async update({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('update')) {\n emitEntityEvent('entity.updated', model, result, args, fullConfig);\n }\n\n return result;\n },\n\n async delete({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('delete')) {\n emitEntityEvent('entity.deleted', model, result, args, fullConfig);\n }\n\n return result;\n },\n\n async updateMany({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('updateMany')) {\n logger.info(`[GraphMiddleware] updateMany for ${model} (bulk operation not tracked individually)`);\n }\n\n return result;\n },\n\n async deleteMany({\n model,\n args,\n query,\n }: {\n model: string;\n args: unknown;\n query: (args: unknown) => Promise<unknown>;\n }) {\n const result = await query(args);\n\n if (fullConfig.monitoredOperations?.includes('deleteMany')) {\n logger.info(`[GraphMiddleware] deleteMany for ${model} (bulk operation not tracked individually)`);\n }\n\n return result;\n },\n },\n },\n });\n}\n"]}