@burdenoff/be-sdk 2026.1006.1 → 2026.1008.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { B as BurdenoffGraphQLClient } from '../graphql-AaLJfGzz.js';
2
2
  import { a as SDKContext } from '../index-CfRZtB99.js';
3
- import { G as GraphQLContext } from '../types-Biv0uaJk.js';
3
+ import { G as GraphQLContext } from '../types-C-6m9NoG.js';
4
4
  import 'graphql-request';
5
5
  import '../layer-GNAVXBMf.js';
6
6
  import 'graphql';
@@ -8,7 +8,7 @@ import 'graphql-yoga';
8
8
  import '../client-CCXpAZ2r.js';
9
9
  import '@prisma/adapter-pg';
10
10
  import 'pg';
11
- import '../workspace-extension-DlxYz3P4.js';
11
+ import '../workspace-extension-DiNiTLa3.js';
12
12
  import '../types-C8TbSdEj.js';
13
13
 
14
14
  interface CookieOptions {
@@ -1,6 +1,6 @@
1
1
  import { configureResourceCaps } from './chunk-MZCBEJ67.js';
2
2
  import { createCounter } from './chunk-AWPNRV3L.js';
3
- import { GatewayClient } from './chunk-L22J3BYR.js';
3
+ import { GatewayClient } from './chunk-BOKCGHLE.js';
4
4
  import { LayerManager } from './chunk-5NT2OEDQ.js';
5
5
  import { logger } from './chunk-RU266375.js';
6
6
  import { __export, __name } from './chunk-XE4OXN2W.js';
@@ -267,5 +267,5 @@ async function initializeLayerStreams(config) {
267
267
  __name(initializeLayerStreams, "initializeLayerStreams");
268
268
 
269
269
  export { getSDKState, init_exports, initializeBurdenoffSDK, isSDKInitialized, resetSDK };
270
- //# sourceMappingURL=chunk-7WLOO2VU.js.map
271
- //# sourceMappingURL=chunk-7WLOO2VU.js.map
270
+ //# sourceMappingURL=chunk-3CUOJTE3.js.map
271
+ //# sourceMappingURL=chunk-3CUOJTE3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/init/index.ts"],"names":["sdkState","isInitialized","initializeBurdenoffSDK","config","logger","warn","info","startTime","Date","now","initializeLogging","layerManager","gatewayClient","initializeLayer","layer","layerType","type","fallbackCounter","createCounter","configureResourceCaps","transport","query","variables","options","timeout","skipRetry","skipCircuitBreaker","response","internalQuery","crossLayerQuery","data","onFallback","inc","prisma","initializeDatabase","valkey","initializeCache","eventPublisher","initializeEventQueue","autoCreateStreams","initializeLayerStreams","graphSync","initializeGraphSync","clickhouse","initializeAnalytics","initializeObservability","graphSyncEnabled","graph","enabled","analyticsEnabled","analytics","observabilityEnabled","observability","metrics","layerAwareEnabled","duration","initializedState","serviceName","error","getSDKState","Error","isSDKInitialized","resetSDK","loggingConfig","logging","isDevelopment","app","nodeEnv","level","setLevel","console","setConsoleEnabled","format","database","url","maxConnections","enableQueryLogging","undefined","cacheConfig","cache","defaultTTL","_config","process","env","EventQueueFactory","publisher","createPublisherFromEnv","connect","message","String","note","eventsEnabled","productSource","streamName","syncInterval","batchSize","requestTimeout","openTelemetry","port","endpoint","samplingRate","LayerManager","serviceIdentity","GatewayClient","internalGatewayUrl","getInternalGatewayUrl","crossLayerGatewayUrl","getCrossLayerGatewayUrl","debug"],"mappings":"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","file":"chunk-7WLOO2VU.js","sourcesContent":["/**\n * Burdenoff SDK Initialization Module\n *\n * Provides a unified initialization function for all state services\n * including database, cache, analytics, event queue, and graph sync.\n *\n * @module init\n * @category Initialization\n */\n\nimport { logger } from '../logger/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { GatewayClient } from '../gateway/index.js';\nimport { configureResourceCaps } from '../resource-caps/index.js';\nimport { createCounter } from '../instrumentation/metrics-collector.js';\nimport type { BurdenoffSDKInitConfig, InitializedSDKState } from './types.js';\n\n/**\n * Global SDK state\n */\nlet sdkState: InitializedSDKState | null = null;\nlet isInitialized = false;\n\n/**\n * Initialize Burdenoff SDK with unified configuration\n *\n * This function initializes all configured state services in the correct order:\n * 1. Logging configuration\n * 2. Database (Prisma with PostgreSQL)\n * 3. Cache (Valkey)\n * 4. Event Queue (Redis Streams)\n * 5. Graph Sync (Redis Streams-based — Apache AGE writes happen inside wspace-graph-svc)\n * 6. Analytics (ClickHouse)\n * 7. Observability (Metrics, OpenTelemetry)\n *\n * @param config - SDK initialization configuration\n * @returns Initialized SDK state\n *\n * @example\n * ```typescript\n * import { initializeBurdenoffSDK } from '@burdenoff/be-sdk/init';\n *\n * const state = await initializeBurdenoffSDK({\n * database: {\n * url: process.env.DATABASE_URL!,\n * maxConnections: 20,\n * },\n * graph: {\n * enabled: true,\n * eventsEnabled: true,\n * },\n * cache: {\n * valkey: {\n * url: process.env.VALKEY_URL!,\n * },\n * },\n * });\n * ```\n */\nexport async function initializeBurdenoffSDK(config: BurdenoffSDKInitConfig): Promise<InitializedSDKState> {\n if (isInitialized && sdkState) {\n logger.warn('[SDK Init] SDK already initialized, returning existing state');\n return sdkState;\n }\n\n logger.info('[SDK Init] Starting SDK initialization...');\n const startTime = Date.now();\n\n try {\n // 1. Configure logging\n await initializeLogging(config);\n\n // 2. Initialize layer manager (if configured)\n const { layerManager, gatewayClient } = await initializeLayer(config);\n\n // 2b. Wire resource caps to billing so plan-based limits actually apply.\n // `userBillingPlan` lives in the GLOBAL layer: global services reach it\n // on their own internal gateway; wspace services go cross-layer via the\n // public global gateway (service JWT). Without this, every resource cap\n // silently collapses to the free-tier fallback regardless of the\n // customer's plan (BOFF-4805). Primes the process-wide singleton so all\n // existing `getResourceCaps()` call sites resolve real plans unchanged.\n if (gatewayClient && config.layer) {\n const layerType = config.layer.type;\n const fallbackCounter = createCounter(\n 'resource_caps.clientless_fallback_total',\n 'Total number of times resource caps fell back because no billing source was configured at bootstrap'\n );\n configureResourceCaps({\n transport: async (query, variables) => {\n // Cap checks run on entity-create paths and ALWAYS fall back to the\n // configured billing-failure tier on failure, so a billing outage\n // must degrade fast rather than stall writes. Bound the lookup with a\n // short timeout and no retries instead of the gateway defaults\n // (~30s × 3 ≈ 90s). Results are cached 60s, so healthy lookups rarely\n // hit the gateway anyway. `skipCircuitBreaker` keeps this best-effort\n // probe OUT of the shared gateway circuit: its failures already\n // degrade to the fallback here, so they must not count toward opening\n // the internal/cross-layer circuit and fail-fast unrelated M2M calls\n // during a billing outage.\n const options = { query, variables, timeout: 8000, skipRetry: true, skipCircuitBreaker: true };\n const response =\n layerType === 'global'\n ? await gatewayClient.internalQuery(options)\n : await gatewayClient.crossLayerQuery(options);\n return response?.data ?? null;\n },\n // Emitting a dedicated clientless-fallback counter at bootstrap means\n // a service that somehow starts without a billing transport is\n // immediately visible in metrics (BOFF-4809). The resource-caps module\n // itself also emits `resource_caps.plan_resolution_total`, but that\n // only fires on the first cap check; this counter fires at bootstrap.\n onFallback: () => fallbackCounter.inc(),\n });\n logger.info('[SDK Init] Resource caps wired to billing', { layer: layerType });\n } else {\n logger.warn('[SDK Init] No layer/gateway configured — resource caps will use free-tier fallbacks (BOFF-4805)');\n }\n\n // 3. Initialize database (required)\n const prisma = await initializeDatabase(config);\n\n // 4. Initialize cache (optional)\n const valkey = await initializeCache(config);\n\n // 5. Initialize event queue (optional) — Redis Streams via REDIS_URL\n const eventPublisher = await initializeEventQueue(config);\n\n // 6. Initialize layer streams (if layer configured)\n if (config.layer?.autoCreateStreams !== false && config.layer) {\n await initializeLayerStreams(config);\n }\n\n // 7. Initialize graph sync (optional) — publisher emits to Redis Streams,\n // never opens a graph-DB connection\n const graphSync = await initializeGraphSync(config);\n\n // 8. Initialize analytics (optional)\n const clickhouse = await initializeAnalytics(config);\n\n // 9. Initialize observability (optional)\n await initializeObservability(config);\n\n // Create SDK state\n // graphSync is a publisher-side placeholder; services emit Redis Streams\n // events and wspace-graph-svc owns the sole Apache AGE connection.\n void graphSync;\n sdkState = {\n prisma,\n valkey,\n clickhouse,\n eventPublisher,\n layerManager,\n gatewayClient,\n graphSyncEnabled: config.graph?.enabled ?? false,\n analyticsEnabled: !!config.analytics?.clickhouse,\n observabilityEnabled: config.observability?.metrics?.enabled ?? false,\n layerAwareEnabled: !!config.layer,\n };\n\n isInitialized = true;\n\n const duration = Date.now() - startTime;\n // sdkState is guaranteed non-null here since we just assigned it above\n const initializedState = sdkState;\n logger.info(`[SDK Init] SDK initialized successfully in ${duration}ms`, {\n graphSyncEnabled: initializedState.graphSyncEnabled,\n analyticsEnabled: initializedState.analyticsEnabled,\n observabilityEnabled: initializedState.observabilityEnabled,\n layerAwareEnabled: initializedState.layerAwareEnabled,\n layer: config.layer?.type,\n serviceName: config.layer?.serviceName,\n });\n\n return initializedState;\n } catch (error) {\n logger.error('[SDK Init] Failed to initialize SDK:', error);\n throw error;\n }\n}\n\n/**\n * Get current SDK state\n * @throws Error if SDK is not initialized\n */\nexport function getSDKState(): InitializedSDKState {\n if (!isInitialized || !sdkState) {\n throw new Error('SDK not initialized. Call initializeBurdenoffSDK() first.');\n }\n return sdkState;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isSDKInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset SDK state (useful for testing)\n */\nexport async function resetSDK(): Promise<void> {\n logger.info('[SDK Init] Resetting SDK state...');\n\n if (sdkState) {\n // Cleanup resources\n // Note: Individual cleanup will be handled by service-specific shutdown handlers\n sdkState = null;\n }\n\n isInitialized = false;\n logger.info('[SDK Init] SDK state reset');\n}\n\n/**\n * Initialize logging configuration\n */\nasync function initializeLogging(config: BurdenoffSDKInitConfig): Promise<void> {\n logger.info('[SDK Init] Configuring logging...');\n\n const loggingConfig = config.logging ?? {};\n const isDevelopment = config.app?.nodeEnv === 'development';\n\n // Set log level\n const level = loggingConfig.level ?? 'info';\n logger.setLevel(level);\n\n // Set console logging\n const console = loggingConfig.console ?? true;\n logger.setConsoleEnabled(console);\n\n logger.info('[SDK Init] Logging configured', {\n level,\n console,\n format: loggingConfig.format ?? (isDevelopment ? 'pretty' : 'json'),\n });\n}\n\n/**\n * Initialize database (Prisma with PostgreSQL)\n */\nasync function initializeDatabase(config: BurdenoffSDKInitConfig): Promise<unknown> {\n logger.info('[SDK Init] Initializing database...');\n\n // Note: Database initialization is handled by createPrismaClient in prisma/client.ts\n // This is called by the application (e.g., workspaces-backend)\n // We just validate the config here\n if (!config.database?.url) {\n throw new Error('Database URL is required');\n }\n\n logger.info('[SDK Init] Database configuration validated', {\n maxConnections: config.database.maxConnections ?? 20,\n enableQueryLogging: config.database.enableQueryLogging ?? false,\n });\n\n // Return undefined as database client is created separately\n return undefined;\n}\n\n/**\n * Initialize cache (Valkey)\n */\nasync function initializeCache(config: BurdenoffSDKInitConfig): Promise<unknown> {\n const cacheConfig = config.cache?.valkey;\n\n if (!cacheConfig) {\n logger.info('[SDK Init] Cache not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing Valkey cache...');\n\n // Note: Valkey initialization is handled by cache module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] Valkey cache configuration validated', {\n url: cacheConfig.url ? '***' : undefined,\n defaultTTL: cacheConfig.defaultTTL ?? 3600,\n });\n\n return undefined;\n}\n\n/**\n * Initialize event queue (Redis Streams).\n *\n * NATS was retired on 2026-05-16. The publisher is created from\n * `REDIS_URL` (set platform-wide in KV). Legacy `config.eventQueue.nats`\n * values are ignored — kept on the type only as a back-compat shim.\n */\nasync function initializeEventQueue(_config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!process.env['REDIS_URL']) {\n logger.info('[SDK Init] REDIS_URL not set, skipping event queue init');\n return undefined;\n }\n\n try {\n const { EventQueueFactory } = await import('../event-queue/factory/EventQueueFactory.js');\n const publisher = EventQueueFactory.createPublisherFromEnv();\n await publisher.connect();\n\n logger.info('[SDK Init] Redis Streams event publisher connected');\n\n return publisher;\n } catch (error) {\n logger.warn('[SDK Init] Failed to connect Redis Streams event publisher (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n note: 'Service will continue without event publishing. Use direct API calls as fallback.',\n });\n return undefined;\n }\n}\n\n/**\n * Initialize graph sync (Redis Streams publisher side).\n *\n * Services publish entity events to Redis Streams; the `wspace-graph-svc`\n * consumer (and only it) persists them into Apache AGE via Azure PG\n * sidecar. This SDK function does no DB work — it just validates that the\n * publisher-side config is sensible and logs it.\n */\nasync function initializeGraphSync(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.graph?.enabled) {\n logger.info('[SDK Init] Graph sync not enabled, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Graph sync enabled (publisher-only mode)', {\n eventsEnabled: config.graph.eventsEnabled ?? true,\n productSource: config.graph.productSource,\n streamName: config.graph.streamName ?? 'graph_events',\n syncInterval: config.graph.syncInterval ?? 1000,\n batchSize: config.graph.batchSize ?? 10,\n });\n\n return undefined;\n}\n\n/**\n * Initialize analytics (ClickHouse)\n */\nasync function initializeAnalytics(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.analytics?.clickhouse) {\n logger.info('[SDK Init] Analytics not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing ClickHouse for analytics...');\n\n // Note: ClickHouse initialization is handled by analytics module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] ClickHouse configuration validated', {\n url: config.analytics.clickhouse.url,\n database: config.analytics.clickhouse.database,\n requestTimeout: config.analytics.clickhouse.requestTimeout ?? 60000,\n });\n\n return undefined;\n}\n\n/**\n * Initialize observability (metrics, tracing)\n */\nasync function initializeObservability(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.observability?.metrics?.enabled && !config.observability?.openTelemetry?.enabled) {\n logger.info('[SDK Init] Observability not configured, skipping');\n return;\n }\n\n logger.info('[SDK Init] Initializing observability...');\n\n // Note: Observability initialization is handled by observability module\n // This is a placeholder for future implementation\n if (config.observability.metrics?.enabled) {\n logger.info('[SDK Init] Metrics configuration validated', {\n port: config.observability.metrics.port ?? 9090,\n endpoint: config.observability.metrics.endpoint ?? '/metrics',\n });\n }\n\n if (config.observability.openTelemetry?.enabled) {\n logger.info('[SDK Init] OpenTelemetry configuration validated', {\n serviceName: config.observability.openTelemetry.serviceName,\n samplingRate: config.observability.openTelemetry.samplingRate ?? 1.0,\n });\n }\n}\n\n/**\n * Initialize layer manager and gateway client\n */\nasync function initializeLayer(\n config: BurdenoffSDKInitConfig\n): Promise<{ layerManager?: LayerManager; gatewayClient?: GatewayClient }> {\n if (!config.layer) {\n logger.info('[SDK Init] Layer configuration not provided, skipping layer initialization');\n return {};\n }\n\n logger.info('[SDK Init] Initializing layer manager...', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n });\n\n // Create layer manager\n const layerManager = new LayerManager({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n });\n\n // Create gateway client\n const gatewayClient = new GatewayClient({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n logger.info('[SDK Init] Layer manager initialized', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n return { layerManager, gatewayClient };\n}\n\n/**\n * Initialize layer-specific Redis streams.\n *\n * No-op since the 2026-05-16 NATS retirement: Redis Streams are created\n * on demand by `XGROUP CREATE ... MKSTREAM` inside the consumer, so no\n * upfront connect-and-provision step is needed.\n */\nasync function initializeLayerStreams(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.layer) {\n return;\n }\n logger.debug('[SDK Init] Layer streams init is a no-op for Redis Streams (auto-created on first XADD/XGROUP)', {\n layer: config.layer.type,\n });\n}\n\n// Export types\nexport type * from './types.js';\n"]}
1
+ {"version":3,"sources":["../src/init/index.ts"],"names":["sdkState","isInitialized","initializeBurdenoffSDK","config","logger","warn","info","startTime","Date","now","initializeLogging","layerManager","gatewayClient","initializeLayer","layer","layerType","type","fallbackCounter","createCounter","configureResourceCaps","transport","query","variables","options","timeout","skipRetry","skipCircuitBreaker","response","internalQuery","crossLayerQuery","data","onFallback","inc","prisma","initializeDatabase","valkey","initializeCache","eventPublisher","initializeEventQueue","autoCreateStreams","initializeLayerStreams","graphSync","initializeGraphSync","clickhouse","initializeAnalytics","initializeObservability","graphSyncEnabled","graph","enabled","analyticsEnabled","analytics","observabilityEnabled","observability","metrics","layerAwareEnabled","duration","initializedState","serviceName","error","getSDKState","Error","isSDKInitialized","resetSDK","loggingConfig","logging","isDevelopment","app","nodeEnv","level","setLevel","console","setConsoleEnabled","format","database","url","maxConnections","enableQueryLogging","undefined","cacheConfig","cache","defaultTTL","_config","process","env","EventQueueFactory","publisher","createPublisherFromEnv","connect","message","String","note","eventsEnabled","productSource","streamName","syncInterval","batchSize","requestTimeout","openTelemetry","port","endpoint","samplingRate","LayerManager","serviceIdentity","GatewayClient","internalGatewayUrl","getInternalGatewayUrl","crossLayerGatewayUrl","getCrossLayerGatewayUrl","debug"],"mappings":";;;;;;;;AAAA,IAAA,YAAA,GAAA;;;;;;;AAoBA,IAAIA,QAAAA,GAAuC,IAAA;AAC3C,IAAIC,aAAAA,GAAgB,KAAA;AAsCpB,eAAsBC,uBAAuBC,MAAAA,EAA8B;AACzE,EAAA,IAAIF,iBAAiBD,QAAAA,EAAU;AAC7BI,IAAAA,MAAAA,CAAOC,KAAK,8DAAA,CAAA;AACZ,IAAA,OAAOL,QAAAA;AACT,EAAA;AAEAI,EAAAA,MAAAA,CAAOE,KAAK,2CAAA,CAAA;AACZ,EAAA,MAAMC,SAAAA,GAAYC,KAAKC,GAAAA,EAAG;AAE1B,EAAA,IAAI;AAEF,IAAA,MAAMC,kBAAkBP,MAAAA,CAAAA;AAGxB,IAAA,MAAM,EAAEQ,YAAAA,EAAcC,aAAAA,EAAa,GAAK,MAAMC,gBAAgBV,MAAAA,CAAAA;AAS9D,IAAA,IAAIS,aAAAA,IAAiBT,OAAOW,KAAAA,EAAO;AACjC,MAAA,MAAMC,SAAAA,GAAYZ,OAAOW,KAAAA,CAAME,IAAAA;AAC/B,MAAA,MAAMC,eAAAA,GAAkBC,aAAAA,CACtB,yCAAA,EACA,qGAAA,CAAA;AAEFC,MAAAA,qBAAAA,CAAsB;QACpBC,SAAAA,kBAAW,MAAA,CAAA,OAAOC,OAAOC,SAAAA,KAAAA;AAWvB,UAAA,MAAMC,OAAAA,GAAU;AAAEF,YAAAA,KAAAA;AAAOC,YAAAA,SAAAA;YAAWE,OAAAA,EAAS,GAAA;YAAMC,SAAAA,EAAW,IAAA;YAAMC,kBAAAA,EAAoB;AAAK,WAAA;AAC7F,UAAA,MAAMC,QAAAA,GACJZ,SAAAA,KAAc,QAAA,GACV,MAAMH,aAAAA,CAAcgB,aAAAA,CAAcL,OAAAA,CAAAA,GAClC,MAAMX,aAAAA,CAAciB,eAAAA,CAAgBN,OAAAA,CAAAA;AAC1C,UAAA,OAAOI,UAAUG,IAAAA,IAAQ,IAAA;QAC3B,CAAA,EAjBW,WAAA,CAAA;;;;;;QAuBXC,UAAAA,kBAAY,MAAA,CAAA,MAAMd,eAAAA,CAAgBe,GAAAA,EAAG,EAAzB,YAAA;OACd,CAAA;AACA5B,MAAAA,MAAAA,CAAOE,KAAK,2CAAA,EAA6C;QAAEQ,KAAAA,EAAOC;OAAU,CAAA;IAC9E,CAAA,MAAO;AACLX,MAAAA,MAAAA,CAAOC,KAAK,sGAAA,CAAA;AACd,IAAA;AAGA,IAAA,MAAM4B,MAAAA,GAAS,MAAMC,kBAAAA,CAAmB/B,MAAAA,CAAAA;AAGxC,IAAA,MAAMgC,MAAAA,GAAS,MAAMC,eAAAA,CAAgBjC,MAAAA,CAAAA;AAGrC,IAAA,MAAMkC,cAAAA,GAAiB,MAAMC,oBAAAA,CAAqBnC,MAAAA,CAAAA;AAGlD,IAAA,IAAIA,MAAAA,CAAOW,KAAAA,EAAOyB,iBAAAA,KAAsB,KAAA,IAASpC,OAAOW,KAAAA,EAAO;AAC7D,MAAA,MAAM0B,uBAAuBrC,MAAAA,CAAAA;AAC/B,IAAA;AAIA,IAAA,MAAMsC,SAAAA,GAAY,MAAMC,mBAAAA,CAAoBvC,MAAAA,CAAAA;AAG5C,IAAA,MAAMwC,UAAAA,GAAa,MAAMC,mBAAAA,CAAoBzC,MAAAA,CAAAA;AAG7C,IAAA,MAAM0C,wBAAwB1C,MAAAA,CAAAA;AAK9B,IAAA,KAAKsC,SAAAA;AACLzC,IAAAA,QAAAA,GAAW;AACTiC,MAAAA,MAAAA;AACAE,MAAAA,MAAAA;AACAQ,MAAAA,UAAAA;AACAN,MAAAA,cAAAA;AACA1B,MAAAA,YAAAA;AACAC,MAAAA,aAAAA;MACAkC,gBAAAA,EAAkB3C,MAAAA,CAAO4C,OAAOC,OAAAA,IAAW,KAAA;MAC3CC,gBAAAA,EAAkB,CAAC,CAAC9C,MAAAA,CAAO+C,SAAAA,EAAWP,UAAAA;MACtCQ,oBAAAA,EAAsBhD,MAAAA,CAAOiD,aAAAA,EAAeC,OAAAA,EAASL,OAAAA,IAAW,KAAA;MAChEM,iBAAAA,EAAmB,CAAC,CAACnD,MAAAA,CAAOW;AAC9B,KAAA;AAEAb,IAAAA,aAAAA,GAAgB,IAAA;AAEhB,IAAA,MAAMsD,QAAAA,GAAW/C,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA;AAE9B,IAAA,MAAMiD,gBAAAA,GAAmBxD,QAAAA;AACzBI,IAAAA,MAAAA,CAAOE,IAAAA,CAAK,CAAA,2CAAA,EAA8CiD,QAAAA,CAAAA,EAAAA,CAAAA,EAAc;AACtET,MAAAA,gBAAAA,EAAkBU,gBAAAA,CAAiBV,gBAAAA;AACnCG,MAAAA,gBAAAA,EAAkBO,gBAAAA,CAAiBP,gBAAAA;AACnCE,MAAAA,oBAAAA,EAAsBK,gBAAAA,CAAiBL,oBAAAA;AACvCG,MAAAA,iBAAAA,EAAmBE,gBAAAA,CAAiBF,iBAAAA;AACpCxC,MAAAA,KAAAA,EAAOX,OAAOW,KAAAA,EAAOE,IAAAA;AACrByC,MAAAA,WAAAA,EAAatD,OAAOW,KAAAA,EAAO2C;KAC7B,CAAA;AAEA,IAAA,OAAOD,gBAAAA;AACT,EAAA,CAAA,CAAA,OAASE,KAAAA,EAAO;AACdtD,IAAAA,MAAAA,CAAOsD,KAAAA,CAAM,wCAAwCA,KAAAA,CAAAA;AACrD,IAAA,MAAMA,KAAAA;AACR,EAAA;AACF;AAxHsBxD,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;AA8Hf,SAASyD,WAAAA,GAAAA;AACd,EAAA,IAAI,CAAC1D,aAAAA,IAAiB,CAACD,QAAAA,EAAU;AAC/B,IAAA,MAAM,IAAI4D,MAAM,2DAAA,CAAA;AAClB,EAAA;AACA,EAAA,OAAO5D,QAAAA;AACT;AALgB2D,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAUT,SAASE,gBAAAA,GAAAA;AACd,EAAA,OAAO5D,aAAAA;AACT;AAFgB4D,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAOhB,eAAsBC,QAAAA,GAAAA;AACpB1D,EAAAA,MAAAA,CAAOE,KAAK,mCAAA,CAAA;AAEZ,EAAA,IAAIN,QAAAA,EAAU;AAGZA,IAAAA,QAAAA,GAAW,IAAA;AACb,EAAA;AAEAC,EAAAA,aAAAA,GAAgB,KAAA;AAChBG,EAAAA,MAAAA,CAAOE,KAAK,4BAAA,CAAA;AACd;AAXsBwD,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AAgBtB,eAAepD,kBAAkBP,MAAAA,EAA8B;AAC7DC,EAAAA,MAAAA,CAAOE,KAAK,mCAAA,CAAA;AAEZ,EAAA,MAAMyD,aAAAA,GAAgB5D,MAAAA,CAAO6D,OAAAA,IAAW,EAAC;AACzC,EAAA,MAAMC,aAAAA,GAAgB9D,MAAAA,CAAO+D,GAAAA,EAAKC,OAAAA,KAAY,aAAA;AAG9C,EAAA,MAAMC,KAAAA,GAAQL,cAAcK,KAAAA,IAAS,MAAA;AACrChE,EAAAA,MAAAA,CAAOiE,SAASD,KAAAA,CAAAA;AAGhB,EAAA,MAAME,OAAAA,GAAUP,cAAcO,OAAAA,IAAW,IAAA;AACzClE,EAAAA,MAAAA,CAAOmE,kBAAkBD,OAAAA,CAAAA;AAEzBlE,EAAAA,MAAAA,CAAOE,KAAK,+BAAA,EAAiC;AAC3C8D,IAAAA,KAAAA;AACAE,IAAAA,OAAAA;IACAE,MAAAA,EAAQT,aAAAA,CAAcS,MAAAA,KAAWP,aAAAA,GAAgB,QAAA,GAAW,MAAA;GAC9D,CAAA;AACF;AAnBevD,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AAwBf,eAAewB,mBAAmB/B,MAAAA,EAA8B;AAC9DC,EAAAA,MAAAA,CAAOE,KAAK,qCAAA,CAAA;AAKZ,EAAA,IAAI,CAACH,MAAAA,CAAOsE,QAAAA,EAAUC,GAAAA,EAAK;AACzB,IAAA,MAAM,IAAId,MAAM,0BAAA,CAAA;AAClB,EAAA;AAEAxD,EAAAA,MAAAA,CAAOE,KAAK,6CAAA,EAA+C;IACzDqE,cAAAA,EAAgBxE,MAAAA,CAAOsE,SAASE,cAAAA,IAAkB,EAAA;IAClDC,kBAAAA,EAAoBzE,MAAAA,CAAOsE,SAASG,kBAAAA,IAAsB;GAC5D,CAAA;AAGA,EAAA,OAAOC,MAAAA;AACT;AAjBe3C,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAsBf,eAAeE,gBAAgBjC,MAAAA,EAA8B;AAC3D,EAAA,MAAM2E,WAAAA,GAAc3E,OAAO4E,KAAAA,EAAO5C,MAAAA;AAElC,EAAA,IAAI,CAAC2C,WAAAA,EAAa;AAChB1E,IAAAA,MAAAA,CAAOE,KAAK,2CAAA,CAAA;AACZ,IAAA,OAAOuE,MAAAA;AACT,EAAA;AAEAzE,EAAAA,MAAAA,CAAOE,KAAK,yCAAA,CAAA;AAIZF,EAAAA,MAAAA,CAAOE,KAAK,iDAAA,EAAmD;IAC7DoE,GAAAA,EAAKI,WAAAA,CAAYJ,MAAM,KAAA,GAAQG,MAAAA;AAC/BG,IAAAA,UAAAA,EAAYF,YAAYE,UAAAA,IAAc;GACxC,CAAA;AAEA,EAAA,OAAOH,MAAAA;AACT;AAlBezC,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AA2Bf,eAAeE,qBAAqB2C,OAAAA,EAA+B;AACjE,EAAA,IAAI,CAACC,OAAAA,CAAQC,GAAAA,CAAI,WAAA,CAAA,EAAc;AAC7B/E,IAAAA,MAAAA,CAAOE,KAAK,yDAAA,CAAA;AACZ,IAAA,OAAOuE,MAAAA;AACT,EAAA;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,EAAEO,iBAAAA,EAAiB,GAAK,MAAM,OAAO,iCAAA,CAAA;AAC3C,IAAA,MAAMC,SAAAA,GAAYD,kBAAkBE,sBAAAA,EAAsB;AAC1D,IAAA,MAAMD,UAAUE,OAAAA,EAAO;AAEvBnF,IAAAA,MAAAA,CAAOE,KAAK,oDAAA,CAAA;AAEZ,IAAA,OAAO+E,SAAAA;AACT,EAAA,CAAA,CAAA,OAAS3B,KAAAA,EAAO;AACdtD,IAAAA,MAAAA,CAAOC,KAAK,wEAAA,EAA0E;AACpFqD,MAAAA,KAAAA,EAAOA,KAAAA,YAAiBE,KAAAA,GAAQF,KAAAA,CAAM8B,OAAAA,GAAUC,OAAO/B,KAAAA,CAAAA;MACvDgC,IAAAA,EAAM;KACR,CAAA;AACA,IAAA,OAAOb,MAAAA;AACT,EAAA;AACF;AArBevC,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AA+Bf,eAAeI,oBAAoBvC,MAAAA,EAA8B;AAC/D,EAAA,IAAI,CAACA,MAAAA,CAAO4C,KAAAA,EAAOC,OAAAA,EAAS;AAC1B5C,IAAAA,MAAAA,CAAOE,KAAK,6CAAA,CAAA;AACZ,IAAA,OAAOuE,MAAAA;AACT,EAAA;AAEAzE,EAAAA,MAAAA,CAAOE,KAAK,qDAAA,EAAuD;IACjEqF,aAAAA,EAAexF,MAAAA,CAAO4C,MAAM4C,aAAAA,IAAiB,IAAA;AAC7CC,IAAAA,aAAAA,EAAezF,OAAO4C,KAAAA,CAAM6C,aAAAA;IAC5BC,UAAAA,EAAY1F,MAAAA,CAAO4C,MAAM8C,UAAAA,IAAc,cAAA;IACvCC,YAAAA,EAAc3F,MAAAA,CAAO4C,MAAM+C,YAAAA,IAAgB,GAAA;IAC3CC,SAAAA,EAAW5F,MAAAA,CAAO4C,MAAMgD,SAAAA,IAAa;GACvC,CAAA;AAEA,EAAA,OAAOlB,MAAAA;AACT;AAfenC,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAoBf,eAAeE,oBAAoBzC,MAAAA,EAA8B;AAC/D,EAAA,IAAI,CAACA,MAAAA,CAAO+C,SAAAA,EAAWP,UAAAA,EAAY;AACjCvC,IAAAA,MAAAA,CAAOE,KAAK,+CAAA,CAAA;AACZ,IAAA,OAAOuE,MAAAA;AACT,EAAA;AAEAzE,EAAAA,MAAAA,CAAOE,KAAK,qDAAA,CAAA;AAIZF,EAAAA,MAAAA,CAAOE,KAAK,+CAAA,EAAiD;IAC3DoE,GAAAA,EAAKvE,MAAAA,CAAO+C,UAAUP,UAAAA,CAAW+B,GAAAA;IACjCD,QAAAA,EAAUtE,MAAAA,CAAO+C,UAAUP,UAAAA,CAAW8B,QAAAA;IACtCuB,cAAAA,EAAgB7F,MAAAA,CAAO+C,SAAAA,CAAUP,UAAAA,CAAWqD,cAAAA,IAAkB;GAChE,CAAA;AAEA,EAAA,OAAOnB,MAAAA;AACT;AAjBejC,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAsBf,eAAeC,wBAAwB1C,MAAAA,EAA8B;AACnE,EAAA,IAAI,CAACA,OAAOiD,aAAAA,EAAeC,OAAAA,EAASL,WAAW,CAAC7C,MAAAA,CAAOiD,aAAAA,EAAe6C,aAAAA,EAAejD,OAAAA,EAAS;AAC5F5C,IAAAA,MAAAA,CAAOE,KAAK,mDAAA,CAAA;AACZ,IAAA;AACF,EAAA;AAEAF,EAAAA,MAAAA,CAAOE,KAAK,0CAAA,CAAA;AAIZ,EAAA,IAAIH,MAAAA,CAAOiD,aAAAA,CAAcC,OAAAA,EAASL,OAAAA,EAAS;AACzC5C,IAAAA,MAAAA,CAAOE,KAAK,4CAAA,EAA8C;MACxD4F,IAAAA,EAAM/F,MAAAA,CAAOiD,aAAAA,CAAcC,OAAAA,CAAQ6C,IAAAA,IAAQ,IAAA;MAC3CC,QAAAA,EAAUhG,MAAAA,CAAOiD,aAAAA,CAAcC,OAAAA,CAAQ8C,QAAAA,IAAY;KACrD,CAAA;AACF,EAAA;AAEA,EAAA,IAAIhG,MAAAA,CAAOiD,aAAAA,CAAc6C,aAAAA,EAAejD,OAAAA,EAAS;AAC/C5C,IAAAA,MAAAA,CAAOE,KAAK,kDAAA,EAAoD;MAC9DmD,WAAAA,EAAatD,MAAAA,CAAOiD,cAAc6C,aAAAA,CAAcxC,WAAAA;MAChD2C,YAAAA,EAAcjG,MAAAA,CAAOiD,aAAAA,CAAc6C,aAAAA,CAAcG,YAAAA,IAAgB;KACnE,CAAA;AACF,EAAA;AACF;AAvBevD,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AA4Bf,eAAehC,gBACbV,MAAAA,EAA8B;AAE9B,EAAA,IAAI,CAACA,OAAOW,KAAAA,EAAO;AACjBV,IAAAA,MAAAA,CAAOE,KAAK,4EAAA,CAAA;AACZ,IAAA,OAAO,EAAC;AACV,EAAA;AAEAF,EAAAA,MAAAA,CAAOE,KAAK,0CAAA,EAA4C;AACtDQ,IAAAA,KAAAA,EAAOX,OAAOW,KAAAA,CAAME,IAAAA;AACpByC,IAAAA,WAAAA,EAAatD,OAAOW,KAAAA,CAAM2C;GAC5B,CAAA;AAGA,EAAA,MAAM9C,YAAAA,GAAe,IAAI0F,YAAAA,CAAa;AACpCvF,IAAAA,KAAAA,EAAOX,OAAOW,KAAAA,CAAME,IAAAA;AACpByC,IAAAA,WAAAA,EAAatD,OAAOW,KAAAA,CAAM2C,WAAAA;AAC1B6C,IAAAA,eAAAA,EAAiBnG,OAAOW,KAAAA,CAAMwF;GAChC,CAAA;AAGA,EAAA,MAAM1F,aAAAA,GAAgB,IAAI2F,aAAAA,CAAc;AACtCzF,IAAAA,KAAAA,EAAOX,OAAOW,KAAAA,CAAME,IAAAA;AACpByC,IAAAA,WAAAA,EAAatD,OAAOW,KAAAA,CAAM2C,WAAAA;AAC1B6C,IAAAA,eAAAA,EAAiBnG,OAAOW,KAAAA,CAAMwF,eAAAA;AAC9BE,IAAAA,kBAAAA,EAAoB7F,aAAa8F,qBAAAA,EAAqB;AACtDC,IAAAA,oBAAAA,EAAsB/F,aAAagG,uBAAAA;GACrC,CAAA;AAEAvG,EAAAA,MAAAA,CAAOE,KAAK,sCAAA,EAAwC;AAClDQ,IAAAA,KAAAA,EAAOX,OAAOW,KAAAA,CAAME,IAAAA;AACpByC,IAAAA,WAAAA,EAAatD,OAAOW,KAAAA,CAAM2C,WAAAA;AAC1B+C,IAAAA,kBAAAA,EAAoB7F,aAAa8F,qBAAAA,EAAqB;AACtDC,IAAAA,oBAAAA,EAAsB/F,aAAagG,uBAAAA;GACrC,CAAA;AAEA,EAAA,OAAO;AAAEhG,IAAAA,YAAAA;AAAcC,IAAAA;AAAc,GAAA;AACvC;AArCeC,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AA8Cf,eAAe2B,uBAAuBrC,MAAAA,EAA8B;AAClE,EAAA,IAAI,CAACA,OAAOW,KAAAA,EAAO;AACjB,IAAA;AACF,EAAA;AACAV,EAAAA,MAAAA,CAAOwG,MAAM,gGAAA,EAAkG;AAC7G9F,IAAAA,KAAAA,EAAOX,OAAOW,KAAAA,CAAME;GACtB,CAAA;AACF;AAPewB,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA","file":"chunk-3CUOJTE3.js","sourcesContent":["/**\n * Burdenoff SDK Initialization Module\n *\n * Provides a unified initialization function for all state services\n * including database, cache, analytics, event queue, and graph sync.\n *\n * @module init\n * @category Initialization\n */\n\nimport { logger } from '../logger/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { GatewayClient } from '../gateway/index.js';\nimport { configureResourceCaps } from '../resource-caps/index.js';\nimport { createCounter } from '../instrumentation/metrics-collector.js';\nimport type { BurdenoffSDKInitConfig, InitializedSDKState } from './types.js';\n\n/**\n * Global SDK state\n */\nlet sdkState: InitializedSDKState | null = null;\nlet isInitialized = false;\n\n/**\n * Initialize Burdenoff SDK with unified configuration\n *\n * This function initializes all configured state services in the correct order:\n * 1. Logging configuration\n * 2. Database (Prisma with PostgreSQL)\n * 3. Cache (Valkey)\n * 4. Event Queue (Redis Streams)\n * 5. Graph Sync (Redis Streams-based — Apache AGE writes happen inside wspace-graph-svc)\n * 6. Analytics (ClickHouse)\n * 7. Observability (Metrics, OpenTelemetry)\n *\n * @param config - SDK initialization configuration\n * @returns Initialized SDK state\n *\n * @example\n * ```typescript\n * import { initializeBurdenoffSDK } from '@burdenoff/be-sdk/init';\n *\n * const state = await initializeBurdenoffSDK({\n * database: {\n * url: process.env.DATABASE_URL!,\n * maxConnections: 20,\n * },\n * graph: {\n * enabled: true,\n * eventsEnabled: true,\n * },\n * cache: {\n * valkey: {\n * url: process.env.VALKEY_URL!,\n * },\n * },\n * });\n * ```\n */\nexport async function initializeBurdenoffSDK(config: BurdenoffSDKInitConfig): Promise<InitializedSDKState> {\n if (isInitialized && sdkState) {\n logger.warn('[SDK Init] SDK already initialized, returning existing state');\n return sdkState;\n }\n\n logger.info('[SDK Init] Starting SDK initialization...');\n const startTime = Date.now();\n\n try {\n // 1. Configure logging\n await initializeLogging(config);\n\n // 2. Initialize layer manager (if configured)\n const { layerManager, gatewayClient } = await initializeLayer(config);\n\n // 2b. Wire resource caps to billing so plan-based limits actually apply.\n // `userBillingPlan` lives in the GLOBAL layer: global services reach it\n // on their own internal gateway; wspace services go cross-layer via the\n // public global gateway (service JWT). Without this, every resource cap\n // silently collapses to the free-tier fallback regardless of the\n // customer's plan (BOFF-4805). Primes the process-wide singleton so all\n // existing `getResourceCaps()` call sites resolve real plans unchanged.\n if (gatewayClient && config.layer) {\n const layerType = config.layer.type;\n const fallbackCounter = createCounter(\n 'resource_caps.clientless_fallback_total',\n 'Total number of times resource caps fell back because no billing source was configured at bootstrap'\n );\n configureResourceCaps({\n transport: async (query, variables) => {\n // Cap checks run on entity-create paths and ALWAYS fall back to the\n // configured billing-failure tier on failure, so a billing outage\n // must degrade fast rather than stall writes. Bound the lookup with a\n // short timeout and no retries instead of the gateway defaults\n // (~30s × 3 ≈ 90s). Results are cached 60s, so healthy lookups rarely\n // hit the gateway anyway. `skipCircuitBreaker` keeps this best-effort\n // probe OUT of the shared gateway circuit: its failures already\n // degrade to the fallback here, so they must not count toward opening\n // the internal/cross-layer circuit and fail-fast unrelated M2M calls\n // during a billing outage.\n const options = { query, variables, timeout: 8000, skipRetry: true, skipCircuitBreaker: true };\n const response =\n layerType === 'global'\n ? await gatewayClient.internalQuery(options)\n : await gatewayClient.crossLayerQuery(options);\n return response?.data ?? null;\n },\n // Emitting a dedicated clientless-fallback counter at bootstrap means\n // a service that somehow starts without a billing transport is\n // immediately visible in metrics (BOFF-4809). The resource-caps module\n // itself also emits `resource_caps.plan_resolution_total`, but that\n // only fires on the first cap check; this counter fires at bootstrap.\n onFallback: () => fallbackCounter.inc(),\n });\n logger.info('[SDK Init] Resource caps wired to billing', { layer: layerType });\n } else {\n logger.warn('[SDK Init] No layer/gateway configured — resource caps will use free-tier fallbacks (BOFF-4805)');\n }\n\n // 3. Initialize database (required)\n const prisma = await initializeDatabase(config);\n\n // 4. Initialize cache (optional)\n const valkey = await initializeCache(config);\n\n // 5. Initialize event queue (optional) — Redis Streams via REDIS_URL\n const eventPublisher = await initializeEventQueue(config);\n\n // 6. Initialize layer streams (if layer configured)\n if (config.layer?.autoCreateStreams !== false && config.layer) {\n await initializeLayerStreams(config);\n }\n\n // 7. Initialize graph sync (optional) — publisher emits to Redis Streams,\n // never opens a graph-DB connection\n const graphSync = await initializeGraphSync(config);\n\n // 8. Initialize analytics (optional)\n const clickhouse = await initializeAnalytics(config);\n\n // 9. Initialize observability (optional)\n await initializeObservability(config);\n\n // Create SDK state\n // graphSync is a publisher-side placeholder; services emit Redis Streams\n // events and wspace-graph-svc owns the sole Apache AGE connection.\n void graphSync;\n sdkState = {\n prisma,\n valkey,\n clickhouse,\n eventPublisher,\n layerManager,\n gatewayClient,\n graphSyncEnabled: config.graph?.enabled ?? false,\n analyticsEnabled: !!config.analytics?.clickhouse,\n observabilityEnabled: config.observability?.metrics?.enabled ?? false,\n layerAwareEnabled: !!config.layer,\n };\n\n isInitialized = true;\n\n const duration = Date.now() - startTime;\n // sdkState is guaranteed non-null here since we just assigned it above\n const initializedState = sdkState;\n logger.info(`[SDK Init] SDK initialized successfully in ${duration}ms`, {\n graphSyncEnabled: initializedState.graphSyncEnabled,\n analyticsEnabled: initializedState.analyticsEnabled,\n observabilityEnabled: initializedState.observabilityEnabled,\n layerAwareEnabled: initializedState.layerAwareEnabled,\n layer: config.layer?.type,\n serviceName: config.layer?.serviceName,\n });\n\n return initializedState;\n } catch (error) {\n logger.error('[SDK Init] Failed to initialize SDK:', error);\n throw error;\n }\n}\n\n/**\n * Get current SDK state\n * @throws Error if SDK is not initialized\n */\nexport function getSDKState(): InitializedSDKState {\n if (!isInitialized || !sdkState) {\n throw new Error('SDK not initialized. Call initializeBurdenoffSDK() first.');\n }\n return sdkState;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isSDKInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset SDK state (useful for testing)\n */\nexport async function resetSDK(): Promise<void> {\n logger.info('[SDK Init] Resetting SDK state...');\n\n if (sdkState) {\n // Cleanup resources\n // Note: Individual cleanup will be handled by service-specific shutdown handlers\n sdkState = null;\n }\n\n isInitialized = false;\n logger.info('[SDK Init] SDK state reset');\n}\n\n/**\n * Initialize logging configuration\n */\nasync function initializeLogging(config: BurdenoffSDKInitConfig): Promise<void> {\n logger.info('[SDK Init] Configuring logging...');\n\n const loggingConfig = config.logging ?? {};\n const isDevelopment = config.app?.nodeEnv === 'development';\n\n // Set log level\n const level = loggingConfig.level ?? 'info';\n logger.setLevel(level);\n\n // Set console logging\n const console = loggingConfig.console ?? true;\n logger.setConsoleEnabled(console);\n\n logger.info('[SDK Init] Logging configured', {\n level,\n console,\n format: loggingConfig.format ?? (isDevelopment ? 'pretty' : 'json'),\n });\n}\n\n/**\n * Initialize database (Prisma with PostgreSQL)\n */\nasync function initializeDatabase(config: BurdenoffSDKInitConfig): Promise<unknown> {\n logger.info('[SDK Init] Initializing database...');\n\n // Note: Database initialization is handled by createPrismaClient in prisma/client.ts\n // This is called by the application (e.g., workspaces-backend)\n // We just validate the config here\n if (!config.database?.url) {\n throw new Error('Database URL is required');\n }\n\n logger.info('[SDK Init] Database configuration validated', {\n maxConnections: config.database.maxConnections ?? 20,\n enableQueryLogging: config.database.enableQueryLogging ?? false,\n });\n\n // Return undefined as database client is created separately\n return undefined;\n}\n\n/**\n * Initialize cache (Valkey)\n */\nasync function initializeCache(config: BurdenoffSDKInitConfig): Promise<unknown> {\n const cacheConfig = config.cache?.valkey;\n\n if (!cacheConfig) {\n logger.info('[SDK Init] Cache not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing Valkey cache...');\n\n // Note: Valkey initialization is handled by cache module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] Valkey cache configuration validated', {\n url: cacheConfig.url ? '***' : undefined,\n defaultTTL: cacheConfig.defaultTTL ?? 3600,\n });\n\n return undefined;\n}\n\n/**\n * Initialize event queue (Redis Streams).\n *\n * NATS was retired on 2026-05-16. The publisher is created from\n * `REDIS_URL` (set platform-wide in KV). Legacy `config.eventQueue.nats`\n * values are ignored — kept on the type only as a back-compat shim.\n */\nasync function initializeEventQueue(_config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!process.env['REDIS_URL']) {\n logger.info('[SDK Init] REDIS_URL not set, skipping event queue init');\n return undefined;\n }\n\n try {\n const { EventQueueFactory } = await import('../event-queue/factory/EventQueueFactory.js');\n const publisher = EventQueueFactory.createPublisherFromEnv();\n await publisher.connect();\n\n logger.info('[SDK Init] Redis Streams event publisher connected');\n\n return publisher;\n } catch (error) {\n logger.warn('[SDK Init] Failed to connect Redis Streams event publisher (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n note: 'Service will continue without event publishing. Use direct API calls as fallback.',\n });\n return undefined;\n }\n}\n\n/**\n * Initialize graph sync (Redis Streams publisher side).\n *\n * Services publish entity events to Redis Streams; the `wspace-graph-svc`\n * consumer (and only it) persists them into Apache AGE via Azure PG\n * sidecar. This SDK function does no DB work — it just validates that the\n * publisher-side config is sensible and logs it.\n */\nasync function initializeGraphSync(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.graph?.enabled) {\n logger.info('[SDK Init] Graph sync not enabled, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Graph sync enabled (publisher-only mode)', {\n eventsEnabled: config.graph.eventsEnabled ?? true,\n productSource: config.graph.productSource,\n streamName: config.graph.streamName ?? 'graph_events',\n syncInterval: config.graph.syncInterval ?? 1000,\n batchSize: config.graph.batchSize ?? 10,\n });\n\n return undefined;\n}\n\n/**\n * Initialize analytics (ClickHouse)\n */\nasync function initializeAnalytics(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.analytics?.clickhouse) {\n logger.info('[SDK Init] Analytics not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing ClickHouse for analytics...');\n\n // Note: ClickHouse initialization is handled by analytics module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] ClickHouse configuration validated', {\n url: config.analytics.clickhouse.url,\n database: config.analytics.clickhouse.database,\n requestTimeout: config.analytics.clickhouse.requestTimeout ?? 60000,\n });\n\n return undefined;\n}\n\n/**\n * Initialize observability (metrics, tracing)\n */\nasync function initializeObservability(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.observability?.metrics?.enabled && !config.observability?.openTelemetry?.enabled) {\n logger.info('[SDK Init] Observability not configured, skipping');\n return;\n }\n\n logger.info('[SDK Init] Initializing observability...');\n\n // Note: Observability initialization is handled by observability module\n // This is a placeholder for future implementation\n if (config.observability.metrics?.enabled) {\n logger.info('[SDK Init] Metrics configuration validated', {\n port: config.observability.metrics.port ?? 9090,\n endpoint: config.observability.metrics.endpoint ?? '/metrics',\n });\n }\n\n if (config.observability.openTelemetry?.enabled) {\n logger.info('[SDK Init] OpenTelemetry configuration validated', {\n serviceName: config.observability.openTelemetry.serviceName,\n samplingRate: config.observability.openTelemetry.samplingRate ?? 1.0,\n });\n }\n}\n\n/**\n * Initialize layer manager and gateway client\n */\nasync function initializeLayer(\n config: BurdenoffSDKInitConfig\n): Promise<{ layerManager?: LayerManager; gatewayClient?: GatewayClient }> {\n if (!config.layer) {\n logger.info('[SDK Init] Layer configuration not provided, skipping layer initialization');\n return {};\n }\n\n logger.info('[SDK Init] Initializing layer manager...', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n });\n\n // Create layer manager\n const layerManager = new LayerManager({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n });\n\n // Create gateway client\n const gatewayClient = new GatewayClient({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n logger.info('[SDK Init] Layer manager initialized', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n return { layerManager, gatewayClient };\n}\n\n/**\n * Initialize layer-specific Redis streams.\n *\n * No-op since the 2026-05-16 NATS retirement: Redis Streams are created\n * on demand by `XGROUP CREATE ... MKSTREAM` inside the consumer, so no\n * upfront connect-and-provision step is needed.\n */\nasync function initializeLayerStreams(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.layer) {\n return;\n }\n logger.debug('[SDK Init] Layer streams init is a no-op for Redis Streams (auto-created on first XADD/XGROUP)', {\n layer: config.layer.type,\n });\n}\n\n// Export types\nexport type * from './types.js';\n"]}
@@ -81,6 +81,10 @@ function hasAuthorizationHeader(headers) {
81
81
  return false;
82
82
  }
83
83
  __name(hasAuthorizationHeader, "hasAuthorizationHeader");
84
+ function isGraphQLError(value) {
85
+ return value !== null && typeof value === "object" && "message" in value && typeof value.message === "string" && (!("extensions" in value) || value.extensions !== null && typeof value.extensions === "object" && !Array.isArray(value.extensions));
86
+ }
87
+ __name(isGraphQLError, "isGraphQLError");
84
88
  function resolveBypassPermissionValue(token = process.env["INTERNAL_SERVICE_TOKEN"]) {
85
89
  const normalizedToken = token?.trim();
86
90
  if (!normalizedToken) {
@@ -501,8 +505,15 @@ var GatewayClient = class {
501
505
  clearTimeout(timeoutId);
502
506
  const duration = Date.now() - context.startTime;
503
507
  if (!response.ok) {
504
- throw new GatewayError(`HTTP ${response.status}: ${response.statusText}`, GatewayErrorType.NETWORK_ERROR, gatewayUrl, {
505
- statusCode: response.status
508
+ let graphqlErrors;
509
+ try {
510
+ const body2 = await response.json();
511
+ if (body2 !== null && typeof body2 === "object" && "errors" in body2 && Array.isArray(body2.errors) && body2.errors.length > 0 && body2.errors.every(isGraphQLError)) graphqlErrors = body2.errors;
512
+ } catch {
513
+ }
514
+ throw new GatewayError(`HTTP ${response.status}: ${response.statusText}`, graphqlErrors && response.status < 500 ? GatewayErrorType.GRAPHQL_ERROR : GatewayErrorType.NETWORK_ERROR, gatewayUrl, {
515
+ statusCode: response.status,
516
+ graphqlErrors
506
517
  });
507
518
  }
508
519
  const result = await response.json();
@@ -547,5 +558,5 @@ function createGatewayClientFromEnv() {
547
558
  __name(createGatewayClientFromEnv, "createGatewayClientFromEnv");
548
559
 
549
560
  export { CircuitState, GatewayClient, GatewayError, GatewayErrorType, createGatewayClient, createGatewayClientFromEnv, gateway_exports };
550
- //# sourceMappingURL=chunk-L22J3BYR.js.map
551
- //# sourceMappingURL=chunk-L22J3BYR.js.map
561
+ //# sourceMappingURL=chunk-BOKCGHLE.js.map
562
+ //# sourceMappingURL=chunk-BOKCGHLE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gateway/index.ts","../src/gateway/service-jwt-guard.ts","../src/gateway/types.ts","../src/gateway/client.ts"],"names":["SERVICE_JWT_SECRET_ENV","serviceJwtMisconfigurationMessage","context","environment","currentEnvironment","layer","operation","operationName","identity","serviceIdentity","gatewayUrl","assertServiceJwtConfigured","isDeployedEnvironment","Error","CircuitState","GatewayErrorType","GatewayError","type","statusCode","graphqlErrors","cause","message","options","name","Object","setPrototypeOf","prototype","uuidv4","crypto","randomUUID","hasAuthorizationHeader","headers","key","keys","toLowerCase","isGraphQLError","value","extensions","Array","isArray","resolveBypassPermissionValue","token","process","env","normalizedToken","trim","CircuitBreaker","state","CLOSED","failures","successes","consecutiveFailures","lastFailureTime","lastSuccessTime","openedAt","failureTimestamps","config","getState","checkStateTransition","recordSuccess","Date","now","HALF_OPEN","logger","info","recordFailure","push","windowStart","failureWindow","filter","t","length","failureThreshold","OPEN","warn","threshold","allowRequest","forceOpen","forceClose","getStats","elapsed","resetTimeout","GatewayClient","layerManager","internalCircuitBreaker","crossLayerCircuitBreaker","retryConfig","defaultHeaders","timeout","enableLogging","LayerManager","serviceName","internalGatewayUrl","crossLayerGatewayUrl","cbConfig","DEFAULT_CIRCUIT_BREAKER_CONFIG","circuitBreaker","DEFAULT_GATEWAY_RETRY_CONFIG","retry","getServiceIdentity","debug","internalUrl","getInternalUrl","crossLayerUrl","getCrossLayerUrl","getInternalGatewayUrl","getCrossLayerGatewayUrl","internalQuery","createRequestContext","executeWithRetry","bypassPermission","crossLayerQuery","query","getInternalCircuitBreaker","getCrossLayerCircuitBreaker","getHealthStatus","internal","url","circuitState","stats","crossLayer","updateDefaultHeaders","callType","requestId","actorId","workspaceId","startTime","shouldRetryError","error","GRAPHQL_ERROR","CIRCUIT_OPEN","calculateRetryDelay","attempt","Math","min","initialDelay","pow","backoffMultiplier","maxDelay","logRetryAttempt","maxAttempts","delay","settings","skipCircuitBreaker","skipRetry","lastError","result","executeRequest","String","sleep","UNKNOWN_ERROR","buildRequestHeaders","cfHeaders","ContextManager","getCfAccessHeaders","assign","entries","undefined","toString","cfCookie","existing","split","some","c","handleGraphQLErrors","duration","errors","errorMessages","map","e","join","handleFetchError","TIMEOUT_ERROR","NETWORK_ERROR","serviceActorId","serviceJwt","signServiceJwt","getLayer","body","JSON","stringify","variables","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","method","signal","clearTimeout","ok","json","every","status","statusText","hasData","data","ms","Promise","resolve","createGatewayClient","createGatewayClientFromEnv"],"mappings":"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","file":"chunk-BOKCGHLE.js","sourcesContent":["/**\n * Gateway Module\n *\n * Provides unified gateway client for layer-aware M2M communication\n * with circuit breaker and retry logic.\n *\n * @module gateway\n * @category Gateway\n *\n * @example\n * ```typescript\n * import { GatewayClient, createGatewayClientFromEnv } from '@burdenoff/be-sdk/gateway';\n *\n * // Create from environment variables\n * const client = createGatewayClientFromEnv();\n *\n * // Or create manually\n * const client = new GatewayClient({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Internal call (same layer, uses int-gateway with bypass)\n * const internalResult = await client.internalQuery({\n * query: `query { getTag(id: \"123\") { id name } }`,\n * });\n *\n * // Cross-layer call (via public gateway)\n * const crossLayerResult = await client.crossLayerQuery({\n * query: `query { getCurrentUser { id email } }`,\n * });\n * ```\n */\n\n// Client exports\nexport { GatewayClient, createGatewayClient, createGatewayClientFromEnv } from './client.js';\n\n// Service-JWT minting for cross-layer M2M auth. Exposed so non-GatewayClient\n// callers (e.g. bespoke graphql-request clients) can authenticate identically.\nexport { signServiceJwt } from './service-jwt.js';\n\n// Type exports\nexport {\n CircuitState,\n GatewayErrorType,\n GatewayError,\n type GatewayClientConfig,\n type GraphQLRequestOptions,\n type GraphQLResponse,\n type GraphQLError,\n type IGatewayClient,\n type ICircuitBreaker,\n type CircuitBreakerStats,\n type GatewayClientHealth,\n type RequestContext,\n} from './types.js';\n\n// Gateway-side security plugin stack (for public gateways).\n// Imported by consumers as `@burdenoff/be-sdk/gateway/security` — this\n// re-export lets `@burdenoff/be-sdk/gateway` also resolve the namespace.\nexport * as Security from './security/index.js';\n","/**\n * Cross-layer service-JWT configuration guard.\n *\n * A cross-layer call transits the peer layer's PUBLIC gateway, which propagates\n * `x-actor-*` context to subgraphs only when the request carries a valid JWT.\n * Without one the gateway strips those headers as potential client spoofing and\n * the subgraph rejects the call. So on a cross-layer request with no\n * Authorization header and no mintable service JWT, the outcome is already\n * decided before the request leaves the process: it will fail, downstream, with\n * an authentication error that names the callee rather than the missing secret.\n *\n * That is a bad trade in a deployed environment. It converts a one-line config\n * problem into an opaque failure attributed to the wrong service, and — because\n * several cross-layer callers treat these calls as best-effort and swallow the\n * error — into no visible failure at all. Alpha ran exactly that way: 414 calls\n * in 24h on `AddWorkspaceMemberFromWspace` and `WorkspaceOrganization`, every\n * one rejected, workspace-member mirroring silently not happening, and nothing\n * in the caller's logs above debug level.\n *\n * So in alpha, staging and production this throws before the request is sent,\n * naming the secret and the bundle to fix. Locally it stays a log: a laptop\n * calling across layers without a service JWT is a normal state while a\n * developer is mid-setup, and failing their `bun run dev` would be hostile.\n *\n * Verified inert before shipping, the same way the cache guard was: of the\n * alpha and prod service bundles in Secrets Manager, every be-sdk service that\n * makes cross-layer calls already carries `SERVICE_JWT_SECRET` (166 bundles).\n * The bundles without it are Temporal, OPA, the OTel collectors, NATS, Gatus,\n * the vibetunnels pair, the ai-assistant trio, the dormant `*-community`\n * deployments and the retired `state-archive-*` configs — none of which\n * constructs a GatewayClient or makes a cross-layer call. Nothing changes\n * today; this only catches the next caller rolled out without the secret.\n */\nimport { isDeployedEnvironment, currentEnvironment } from '../runtime/deployed-environment.js';\n\n/** Env var that must hold the signing key for service-actor JWTs. */\nexport const SERVICE_JWT_SECRET_ENV = 'SERVICE_JWT_SECRET';\n\nexport interface ServiceJwtGuardContext {\n /** Absolute URL of the peer gateway the call was about to be sent to. */\n gatewayUrl: string;\n /** GraphQL operation name, when the caller supplied one. */\n operationName?: string;\n /** Layer boundary of the CALLER, used to name the bundle to fix. */\n layer?: string;\n /** Service identity the JWT would have been minted for. */\n serviceIdentity?: string;\n}\n\n/**\n * Build the operator-facing explanation. Exported so the message itself is\n * covered by tests — a guard whose text does not say what to change just moves\n * the debugging, it does not remove it.\n */\nexport function serviceJwtMisconfigurationMessage(context: ServiceJwtGuardContext): string {\n const environment = currentEnvironment() || 'unset';\n const layer = context.layer ?? '{layer}';\n const operation = context.operationName ? ` (operation ${context.operationName})` : '';\n const identity = context.serviceIdentity ? ` as '${context.serviceIdentity}'` : '';\n return (\n `[GatewayClient] Cross-layer call to ${context.gatewayUrl}${operation} cannot be authenticated${identity}: ` +\n `${SERVICE_JWT_SECRET_ENV} is not set, so no service JWT can be minted. The peer layer's public ` +\n `gateway will strip actor headers and the subgraph will reject the request, so this call cannot ` +\n `succeed. Refusing to send it with DEPLOY_ENV=${environment}. Set ${SERVICE_JWT_SECRET_ENV} in ` +\n `boff/${environment}/${layer}/{module} — it must match the value the peer layer's gateway ` +\n `verifies with, which is per-environment and must never be copied across environments.`\n );\n}\n\n/**\n * Throw in a deployed environment when a cross-layer call is about to be sent\n * with no way to authenticate it. Returns normally everywhere else, and\n * whenever a JWT was available — so this costs nothing on the happy path.\n */\nexport function assertServiceJwtConfigured(context: ServiceJwtGuardContext): void {\n if (!isDeployedEnvironment()) return;\n throw new Error(serviceJwtMisconfigurationMessage(context));\n}\n","/**\n * Gateway Client Types\n *\n * Type definitions for the unified gateway client with\n * circuit breaker and retry logic.\n *\n * @module gateway/types\n * @category Gateway\n */\n\nimport type { ServiceLayer, CircuitBreakerConfig, GatewayRetryConfig, GatewayRequestHeaders } from '../types/layer.js';\n\n/**\n * Gateway client configuration\n */\nexport interface GatewayClientConfig {\n /**\n * Layer this client belongs to\n */\n layer: ServiceLayer;\n\n /**\n * Service name (for logging and headers)\n */\n serviceName: string;\n\n /**\n * Service identity for bypass headers\n * @default serviceName\n */\n serviceIdentity?: string;\n\n /**\n * Internal gateway URL (same layer M2M)\n * @default Resolved from layer defaults or environment\n */\n internalGatewayUrl?: string;\n\n /**\n * Cross-layer gateway URL (cross layer via public gateway)\n * @default Resolved from layer defaults or environment\n */\n crossLayerGatewayUrl?: string;\n\n /**\n * Request timeout in milliseconds\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Circuit breaker configuration\n */\n circuitBreaker?: Partial<CircuitBreakerConfig>;\n\n /**\n * Retry configuration\n */\n retry?: Partial<GatewayRetryConfig>;\n\n /**\n * Enable request logging\n * @default true\n */\n enableLogging?: boolean;\n\n /**\n * Default headers to include in all requests\n */\n defaultHeaders?: GatewayRequestHeaders;\n}\n\n/**\n * Circuit breaker states\n */\nexport enum CircuitState {\n CLOSED = 'CLOSED',\n OPEN = 'OPEN',\n HALF_OPEN = 'HALF_OPEN',\n}\n\n/**\n * Circuit breaker instance interface\n */\nexport interface ICircuitBreaker {\n /**\n * Get current circuit state\n */\n getState(): CircuitState;\n\n /**\n * Record a successful call\n */\n recordSuccess(): void;\n\n /**\n * Record a failed call\n */\n recordFailure(): void;\n\n /**\n * Check if circuit allows calls\n */\n allowRequest(): boolean;\n\n /**\n * Force open the circuit\n */\n forceOpen(): void;\n\n /**\n * Force close the circuit\n */\n forceClose(): void;\n\n /**\n * Get circuit statistics\n */\n getStats(): CircuitBreakerStats;\n}\n\n/**\n * Circuit breaker statistics\n */\nexport interface CircuitBreakerStats {\n state: CircuitState;\n failures: number;\n successes: number;\n consecutiveFailures: number;\n lastFailureTime: number | null;\n lastSuccessTime: number | null;\n openedAt: number | null;\n}\n\n/**\n * GraphQL request options\n */\nexport interface GraphQLRequestOptions {\n /**\n * GraphQL query or mutation string\n */\n query: string;\n\n /**\n * GraphQL variables\n */\n variables?: Record<string, unknown>;\n\n /**\n * Operation name (for multi-operation documents)\n */\n operationName?: string;\n\n /**\n * Additional headers for this request\n */\n headers?: GatewayRequestHeaders;\n\n /**\n * Override timeout for this request\n */\n timeout?: number;\n\n /**\n * Skip circuit breaker for this request\n * @default false\n */\n skipCircuitBreaker?: boolean;\n\n /**\n * Skip retry logic for this request\n * @default false\n */\n skipRetry?: boolean;\n}\n\n/**\n * GraphQL response\n */\nexport interface GraphQLResponse<T = unknown> {\n /**\n * Response data\n */\n data?: T;\n\n /**\n * GraphQL errors\n */\n errors?: GraphQLError[];\n}\n\n/**\n * GraphQL error structure\n */\nexport interface GraphQLError {\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Gateway client interface\n */\nexport interface IGatewayClient {\n /**\n * Execute internal (same layer) GraphQL query/mutation\n *\n * Uses internal gateway with bypass headers for M2M communication.\n *\n * @param options - Request options\n * @returns GraphQL response\n */\n internalQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>>;\n\n /**\n * Execute cross-layer GraphQL query/mutation\n *\n * Uses public gateway for cross-layer communication.\n *\n * @param options - Request options\n * @returns GraphQL response\n */\n crossLayerQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>>;\n\n /**\n * Execute GraphQL query/mutation with explicit gateway URL\n *\n * @param gatewayUrl - Gateway URL to use\n * @param options - Request options\n * @returns GraphQL response\n */\n query<T = unknown>(gatewayUrl: string, options: GraphQLRequestOptions): Promise<GraphQLResponse<T>>;\n\n /**\n * Get internal gateway circuit breaker\n */\n getInternalCircuitBreaker(): ICircuitBreaker;\n\n /**\n * Get cross-layer gateway circuit breaker\n */\n getCrossLayerCircuitBreaker(): ICircuitBreaker;\n\n /**\n * Get client health status\n */\n getHealthStatus(): GatewayClientHealth;\n\n /**\n * Update default headers\n */\n updateDefaultHeaders(headers: Partial<GatewayRequestHeaders>): void;\n}\n\n/**\n * Gateway client health status\n */\nexport interface GatewayClientHealth {\n /**\n * Internal gateway status\n */\n internal: {\n url: string;\n circuitState: CircuitState;\n stats: CircuitBreakerStats;\n };\n\n /**\n * Cross-layer gateway status\n */\n crossLayer: {\n url: string;\n circuitState: CircuitState;\n stats: CircuitBreakerStats;\n };\n}\n\n/**\n * Gateway error types\n */\nexport enum GatewayErrorType {\n NETWORK_ERROR = 'NETWORK_ERROR',\n TIMEOUT_ERROR = 'TIMEOUT_ERROR',\n CIRCUIT_OPEN = 'CIRCUIT_OPEN',\n GRAPHQL_ERROR = 'GRAPHQL_ERROR',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * Gateway error class\n */\nexport class GatewayError extends Error {\n type: GatewayErrorType;\n gatewayUrl: string;\n statusCode?: number;\n graphqlErrors?: GraphQLError[];\n override cause?: Error;\n\n constructor(\n message: string,\n type: GatewayErrorType,\n gatewayUrl: string,\n options?: {\n statusCode?: number;\n graphqlErrors?: GraphQLError[];\n cause?: Error;\n }\n ) {\n super(message);\n this.name = 'GatewayError';\n this.type = type;\n this.gatewayUrl = gatewayUrl;\n this.statusCode = options?.statusCode;\n this.graphqlErrors = options?.graphqlErrors;\n this.cause = options?.cause;\n Object.setPrototypeOf(this, GatewayError.prototype);\n }\n}\n\n/**\n * Request context for logging and tracing\n */\nexport interface RequestContext {\n /**\n * Request ID for tracing\n */\n requestId: string;\n\n /**\n * Actor ID making the request\n */\n actorId?: string;\n\n /**\n * Workspace ID context\n */\n workspaceId?: string;\n\n /**\n * Timestamp when request started\n */\n startTime: number;\n\n /**\n * Call type\n */\n callType: 'internal' | 'cross-layer' | 'direct';\n}\n","/**\n * Unified Gateway Client\n *\n * Provides a layer-aware GraphQL client with circuit breaker,\n * retry logic, and automatic header management for M2M communication.\n *\n * @module gateway/client\n * @category Gateway\n *\n * @example\n * ```typescript\n * import { GatewayClient } from '@burdenoff/be-sdk/gateway';\n *\n * const client = new GatewayClient({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Internal call (same layer)\n * const result = await client.internalQuery({\n * query: `query { getTag(id: \"123\") { id name } }`,\n * });\n *\n * // Cross-layer call\n * const authResult = await client.crossLayerQuery({\n * query: `query { getCurrentUser { id email } }`,\n * });\n * ```\n */\n\nimport { ContextManager } from '../context/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { logger } from '../logger/index.js';\nimport { signServiceJwt } from './service-jwt.js';\nimport { assertServiceJwtConfigured } from './service-jwt-guard.js';\nimport {\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n DEFAULT_GATEWAY_RETRY_CONFIG,\n type CircuitBreakerConfig,\n type GatewayRequestHeaders,\n type GatewayRetryConfig,\n type ServiceLayer,\n} from '../types/layer.js';\nimport {\n CircuitState,\n GatewayError,\n GatewayErrorType,\n type CircuitBreakerStats,\n type GatewayClientConfig,\n type GatewayClientHealth,\n type GraphQLError,\n type GraphQLRequestOptions,\n type GraphQLResponse,\n type ICircuitBreaker,\n type IGatewayClient,\n type RequestContext,\n} from './types.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Case-insensitive presence check for the `Authorization` header. HTTP header\n * names are case-insensitive (RFC 7230), and while the outbound `fetch` will\n * preserve whatever casing the caller supplies, callers may legitimately set\n * `authorization` / `Authorization` / even `AUTHORIZATION` via defaultHeaders\n * or options.headers. We must not overwrite an already-supplied token.\n */\nfunction hasAuthorizationHeader(headers: Record<string, string>): boolean {\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() === 'authorization') return true;\n }\n return false;\n}\n\nfunction isGraphQLError(value: unknown): value is GraphQLError {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'message' in value &&\n typeof value.message === 'string' &&\n (!('extensions' in value) ||\n (value.extensions !== null && typeof value.extensions === 'object' && !Array.isArray(value.extensions)))\n );\n}\n\nexport function resolveBypassPermissionValue(\n token: string | undefined = process.env['INTERNAL_SERVICE_TOKEN']\n): string {\n const normalizedToken = token?.trim();\n\n if (!normalizedToken) {\n throw new Error('INTERNAL_SERVICE_TOKEN must be configured for bypass-enabled gateway calls');\n }\n\n return normalizedToken;\n}\n\n/**\n * Circuit Breaker Implementation\n */\nclass CircuitBreaker implements ICircuitBreaker {\n private state: CircuitState = CircuitState.CLOSED;\n private failures = 0;\n private successes = 0;\n private consecutiveFailures = 0;\n private lastFailureTime: number | null = null;\n private lastSuccessTime: number | null = null;\n private openedAt: number | null = null;\n private failureTimestamps: number[] = [];\n private config: CircuitBreakerConfig;\n\n constructor(config: CircuitBreakerConfig) {\n this.config = config;\n }\n\n getState(): CircuitState {\n this.checkStateTransition();\n return this.state;\n }\n\n recordSuccess(): void {\n this.successes++;\n this.consecutiveFailures = 0;\n this.lastSuccessTime = Date.now();\n\n if (this.state === CircuitState.HALF_OPEN) {\n this.state = CircuitState.CLOSED;\n this.failures = 0;\n this.failureTimestamps = [];\n this.openedAt = null;\n logger.info('[CircuitBreaker] Circuit closed after successful test');\n }\n }\n\n recordFailure(): void {\n this.failures++;\n this.consecutiveFailures++;\n this.lastFailureTime = Date.now();\n this.failureTimestamps.push(Date.now());\n\n // Clean up old timestamps\n const windowStart = Date.now() - this.config.failureWindow;\n this.failureTimestamps = this.failureTimestamps.filter((t) => t > windowStart);\n\n // Check if we should open the circuit\n if (this.state === CircuitState.CLOSED && this.failureTimestamps.length >= this.config.failureThreshold) {\n this.state = CircuitState.OPEN;\n this.openedAt = Date.now();\n logger.warn('[CircuitBreaker] Circuit opened due to failures', {\n failures: this.failureTimestamps.length,\n threshold: this.config.failureThreshold,\n });\n }\n\n // If we're half-open and fail, go back to open\n if (this.state === CircuitState.HALF_OPEN) {\n this.state = CircuitState.OPEN;\n this.openedAt = Date.now();\n logger.warn('[CircuitBreaker] Circuit re-opened after failed test');\n }\n }\n\n allowRequest(): boolean {\n this.checkStateTransition();\n\n switch (this.state) {\n case CircuitState.CLOSED:\n return true;\n case CircuitState.OPEN:\n return false;\n case CircuitState.HALF_OPEN:\n // Allow one test request\n return true;\n default:\n return true;\n }\n }\n\n forceOpen(): void {\n this.state = CircuitState.OPEN;\n this.openedAt = Date.now();\n logger.info('[CircuitBreaker] Circuit force-opened');\n }\n\n forceClose(): void {\n this.state = CircuitState.CLOSED;\n this.failures = 0;\n this.consecutiveFailures = 0;\n this.failureTimestamps = [];\n this.openedAt = null;\n logger.info('[CircuitBreaker] Circuit force-closed');\n }\n\n getStats(): CircuitBreakerStats {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n consecutiveFailures: this.consecutiveFailures,\n lastFailureTime: this.lastFailureTime,\n lastSuccessTime: this.lastSuccessTime,\n openedAt: this.openedAt,\n };\n }\n\n private checkStateTransition(): void {\n if (this.state === CircuitState.OPEN && this.openedAt) {\n const elapsed = Date.now() - this.openedAt;\n if (elapsed >= this.config.resetTimeout) {\n this.state = CircuitState.HALF_OPEN;\n logger.info('[CircuitBreaker] Circuit transitioning to half-open');\n }\n }\n }\n}\n\n/**\n * Unified Gateway Client\n */\nexport class GatewayClient implements IGatewayClient {\n private config: GatewayClientConfig;\n private layerManager: LayerManager;\n private internalCircuitBreaker: CircuitBreaker;\n private crossLayerCircuitBreaker: CircuitBreaker;\n private retryConfig: GatewayRetryConfig;\n private defaultHeaders: GatewayRequestHeaders;\n\n constructor(config: GatewayClientConfig) {\n this.config = {\n timeout: 30000,\n enableLogging: true,\n ...config,\n };\n\n // Initialize layer manager\n this.layerManager = new LayerManager({\n layer: config.layer,\n serviceName: config.serviceName,\n serviceIdentity: config.serviceIdentity,\n });\n\n // Override URLs if provided\n if (config.internalGatewayUrl) {\n // Use getter internally, but we'll store the override\n }\n if (config.crossLayerGatewayUrl) {\n // Use getter internally, but we'll store the override\n }\n\n // Initialize circuit breakers\n const cbConfig: CircuitBreakerConfig = {\n ...DEFAULT_CIRCUIT_BREAKER_CONFIG,\n ...config.circuitBreaker,\n };\n this.internalCircuitBreaker = new CircuitBreaker(cbConfig);\n this.crossLayerCircuitBreaker = new CircuitBreaker(cbConfig);\n\n // Initialize retry config\n this.retryConfig = {\n ...DEFAULT_GATEWAY_RETRY_CONFIG,\n ...config.retry,\n };\n\n // Initialize default headers\n this.defaultHeaders = {\n 'x-service-identity': this.layerManager.getServiceIdentity(),\n 'x-actor-type': 'service',\n ...config.defaultHeaders,\n };\n\n logger.debug('[GatewayClient] Initialized', {\n layer: config.layer,\n serviceName: config.serviceName,\n internalUrl: this.getInternalUrl(),\n crossLayerUrl: this.getCrossLayerUrl(),\n });\n }\n\n private getInternalUrl(): string {\n return this.config.internalGatewayUrl || this.layerManager.getInternalGatewayUrl();\n }\n\n private getCrossLayerUrl(): string {\n return this.config.crossLayerGatewayUrl || this.layerManager.getCrossLayerGatewayUrl();\n }\n\n /**\n * Execute internal (same layer) GraphQL query/mutation\n */\n async internalQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>> {\n const context = this.createRequestContext('internal', options);\n\n return this.executeWithRetry(this.getInternalUrl(), options, this.internalCircuitBreaker, context, {\n bypassPermission: true,\n });\n }\n\n /**\n * Execute cross-layer GraphQL query/mutation\n */\n async crossLayerQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>> {\n const context = this.createRequestContext('cross-layer', options);\n\n return this.executeWithRetry(\n this.getCrossLayerUrl(),\n options,\n this.crossLayerCircuitBreaker,\n context,\n { bypassPermission: false } // Cross-layer calls go through public gateway\n );\n }\n\n /**\n * Execute GraphQL query/mutation with explicit gateway URL\n */\n async query<T = unknown>(gatewayUrl: string, options: GraphQLRequestOptions): Promise<GraphQLResponse<T>> {\n const context = this.createRequestContext('direct', options);\n\n // Use internal circuit breaker for direct calls\n return this.executeWithRetry(gatewayUrl, options, this.internalCircuitBreaker, context, {\n bypassPermission: false,\n });\n }\n\n getInternalCircuitBreaker(): ICircuitBreaker {\n return this.internalCircuitBreaker;\n }\n\n getCrossLayerCircuitBreaker(): ICircuitBreaker {\n return this.crossLayerCircuitBreaker;\n }\n\n getHealthStatus(): GatewayClientHealth {\n return {\n internal: {\n url: this.getInternalUrl(),\n circuitState: this.internalCircuitBreaker.getState(),\n stats: this.internalCircuitBreaker.getStats(),\n },\n crossLayer: {\n url: this.getCrossLayerUrl(),\n circuitState: this.crossLayerCircuitBreaker.getState(),\n stats: this.crossLayerCircuitBreaker.getStats(),\n },\n };\n }\n\n updateDefaultHeaders(headers: Partial<GatewayRequestHeaders>): void {\n this.defaultHeaders = { ...this.defaultHeaders, ...headers };\n }\n\n private createRequestContext(\n callType: 'internal' | 'cross-layer' | 'direct',\n options: GraphQLRequestOptions\n ): RequestContext {\n return {\n requestId: uuidv4(),\n actorId: options.headers?.['x-actor-id'] || this.defaultHeaders['x-actor-id'],\n workspaceId: options.headers?.['x-workspace-id'] || this.defaultHeaders['x-workspace-id'],\n startTime: Date.now(),\n callType,\n };\n }\n\n /**\n * Check if an error should be retried\n */\n private shouldRetryError(error: unknown): boolean {\n if (!(error instanceof GatewayError)) {\n return true;\n }\n // Don't retry GraphQL errors or circuit open errors\n return error.type !== GatewayErrorType.GRAPHQL_ERROR && error.type !== GatewayErrorType.CIRCUIT_OPEN;\n }\n\n /**\n * Calculate retry delay with exponential backoff\n */\n private calculateRetryDelay(attempt: number): number {\n return Math.min(\n this.retryConfig.initialDelay * Math.pow(this.retryConfig.backoffMultiplier, attempt - 1),\n this.retryConfig.maxDelay\n );\n }\n\n /**\n * Log retry attempt if logging is enabled\n */\n private logRetryAttempt(\n context: RequestContext,\n attempt: number,\n maxAttempts: number,\n delay: number,\n error: Error\n ): void {\n if (this.config.enableLogging) {\n logger.warn('[GatewayClient] Request failed, retrying', {\n requestId: context.requestId,\n attempt,\n maxAttempts,\n delay,\n error: error.message,\n });\n }\n }\n\n private async executeWithRetry<T>(\n gatewayUrl: string,\n options: GraphQLRequestOptions,\n circuitBreaker: CircuitBreaker,\n context: RequestContext,\n settings: { bypassPermission: boolean }\n ): Promise<GraphQLResponse<T>> {\n // Check circuit breaker\n if (!options.skipCircuitBreaker && !circuitBreaker.allowRequest()) {\n throw new GatewayError(`Circuit breaker is open for ${gatewayUrl}`, GatewayErrorType.CIRCUIT_OPEN, gatewayUrl);\n }\n\n const maxAttempts = options.skipRetry ? 1 : this.retryConfig.maxAttempts;\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const result = await this.executeRequest<T>(gatewayUrl, options, context, settings.bypassPermission);\n if (!options.skipCircuitBreaker) {\n circuitBreaker.recordSuccess();\n }\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (!options.skipCircuitBreaker) {\n circuitBreaker.recordFailure();\n }\n\n if (!this.shouldRetryError(error)) {\n throw error;\n }\n\n if (attempt < maxAttempts) {\n const delay = this.calculateRetryDelay(attempt);\n this.logRetryAttempt(context, attempt, maxAttempts, delay, lastError);\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError || new GatewayError('Request failed after retries', GatewayErrorType.UNKNOWN_ERROR, gatewayUrl);\n }\n\n /**\n * Build headers for a request\n */\n private buildRequestHeaders(\n context: RequestContext,\n options: GraphQLRequestOptions,\n bypassPermission: boolean\n ): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-request-id': context.requestId,\n 'x-call-type': context.callType,\n };\n\n // Cross-layer calls transit the peer layer's PUBLIC gateway, which on alpha\n // sits behind Cloudflare Access. Re-present the inbound request's CF creds\n // (service token and/or the CF_Authorization cookie) so the call passes the\n // CF edge. Added before default/request headers so a caller may still\n // override the non-cookie CF headers explicitly; the CF cookie is reconciled\n // after the merges below so it is never silently clobbered. No-op when the\n // inbound request carried no CF creds (local dev, production) — returns {}.\n const cfHeaders = context.callType === 'cross-layer' ? ContextManager.getCfAccessHeaders() : {};\n Object.assign(headers, cfHeaders);\n\n // Add default headers\n for (const [key, value] of Object.entries(this.defaultHeaders)) {\n if (value !== undefined) {\n headers[key] = String(value);\n }\n }\n\n // Add request-specific headers\n if (options.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n if (value !== undefined) {\n headers[key] = String(value);\n }\n }\n }\n\n // Add bypass headers for internal calls\n if (bypassPermission) {\n headers['x-bypass-permission'] = resolveBypassPermissionValue();\n headers['x-bypass-source'] = this.layerManager.getServiceIdentity();\n headers['x-bypass-timestamp'] = Date.now().toString();\n }\n\n // Reconcile the CF_Authorization cookie: the default/request-header merges\n // above may set their own `cookie`, which would otherwise clobber the CF\n // cookie applied earlier (or vice versa). Merge so both survive, without\n // duplicating if it's already present.\n const cfCookie = cfHeaders['cookie'];\n if (cfCookie) {\n const existing = headers['cookie'];\n if (!existing) {\n headers['cookie'] = cfCookie;\n } else if (!existing.split(';').some((c) => c.trim() === cfCookie)) {\n headers['cookie'] = `${existing}; ${cfCookie}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Handle GraphQL errors in response\n */\n private handleGraphQLErrors<T>(\n result: GraphQLResponse<T>,\n context: RequestContext,\n gatewayUrl: string,\n duration: number\n ): void {\n if (!result.errors || result.errors.length === 0) {\n return;\n }\n\n const errorMessages = result.errors.map((e: GraphQLError) => e.message).join(', ');\n\n if (this.config.enableLogging) {\n logger.warn('[GatewayClient] GraphQL errors', {\n requestId: context.requestId,\n errors: result.errors,\n duration,\n });\n }\n\n throw new GatewayError(`GraphQL error: ${errorMessages}`, GatewayErrorType.GRAPHQL_ERROR, gatewayUrl, {\n graphqlErrors: result.errors,\n });\n }\n\n /**\n * Handle fetch errors\n */\n private handleFetchError(\n error: unknown,\n context: RequestContext,\n gatewayUrl: string,\n timeout: number,\n duration: number\n ): never {\n if (error instanceof GatewayError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new GatewayError(`Request timed out after ${timeout}ms`, GatewayErrorType.TIMEOUT_ERROR, gatewayUrl, {\n cause: error,\n });\n }\n\n if (this.config.enableLogging) {\n logger.error('[GatewayClient] Request failed', {\n requestId: context.requestId,\n error: error.message,\n duration,\n });\n }\n\n throw new GatewayError(error.message, GatewayErrorType.NETWORK_ERROR, gatewayUrl, {\n cause: error,\n });\n }\n\n throw new GatewayError(String(error), GatewayErrorType.UNKNOWN_ERROR, gatewayUrl);\n }\n\n private async executeRequest<T>(\n gatewayUrl: string,\n options: GraphQLRequestOptions,\n context: RequestContext,\n bypassPermission: boolean\n ): Promise<GraphQLResponse<T>> {\n const timeout = options.timeout || this.config.timeout || 30000;\n const headers = this.buildRequestHeaders(context, options, bypassPermission);\n\n // Cross-layer calls transit the peer layer's PUBLIC gateway, which\n // requires JWT auth to propagate actor context. Mint a short-lived\n // service-actor JWT so the gateway admits the call and preserves\n // `x-actor-type: service` downstream. Skipped when the caller has\n // already supplied an Authorization header (e.g., user-originated\n // cross-layer flows) or when SERVICE_JWT_SECRET is unset.\n if (context.callType === 'cross-layer' && !hasAuthorizationHeader(headers)) {\n const serviceActorId = this.layerManager.getServiceIdentity();\n const serviceJwt = await signServiceJwt(serviceActorId);\n if (serviceJwt) {\n headers['Authorization'] = `Bearer ${serviceJwt}`;\n } else {\n // Without the JWT this call is already decided: the peer layer's public\n // gateway strips actor headers and the subgraph rejects it. Continuing\n // only converts a missing secret into an authentication error that names\n // the callee — and several cross-layer callers swallow that as\n // best-effort, so it surfaces as nothing at all. In a deployed\n // environment, refuse instead. See ./service-jwt-guard.ts.\n assertServiceJwtConfigured({\n gatewayUrl,\n operationName: options.operationName,\n layer: this.layerManager.getLayer(),\n serviceIdentity: serviceActorId,\n });\n if (this.config.enableLogging) {\n logger.debug(\n '[GatewayClient] SERVICE_JWT_SECRET not configured — cross-layer call will proceed without service JWT',\n { requestId: context.requestId, gatewayUrl }\n );\n }\n }\n }\n\n const body = JSON.stringify({\n query: options.query,\n variables: options.variables || {},\n operationName: options.operationName,\n });\n\n if (this.config.enableLogging) {\n logger.debug('[GatewayClient] Executing request', {\n requestId: context.requestId,\n gatewayUrl,\n operationName: options.operationName,\n callType: context.callType,\n bypassPermission,\n });\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(gatewayUrl, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n const duration = Date.now() - context.startTime;\n\n if (!response.ok) {\n let graphqlErrors: GraphQLError[] | undefined;\n try {\n const body: unknown = await response.json();\n if (\n body !== null &&\n typeof body === 'object' &&\n 'errors' in body &&\n Array.isArray(body.errors) &&\n body.errors.length > 0 &&\n body.errors.every(isGraphQLError)\n )\n graphqlErrors = body.errors;\n } catch {\n // Edge/proxy errors need not contain JSON; retain the original HTTP failure.\n }\n throw new GatewayError(\n `HTTP ${response.status}: ${response.statusText}`,\n graphqlErrors && response.status < 500 ? GatewayErrorType.GRAPHQL_ERROR : GatewayErrorType.NETWORK_ERROR,\n gatewayUrl,\n { statusCode: response.status, graphqlErrors }\n );\n }\n\n const result = (await response.json()) as GraphQLResponse<T>;\n this.handleGraphQLErrors(result, context, gatewayUrl, duration);\n\n if (this.config.enableLogging) {\n logger.debug('[GatewayClient] Request completed', {\n requestId: context.requestId,\n duration,\n hasData: !!result.data,\n });\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - context.startTime;\n this.handleFetchError(error, context, gatewayUrl, timeout, duration);\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Create a gateway client for a specific layer\n */\nexport function createGatewayClient(config: GatewayClientConfig): GatewayClient {\n return new GatewayClient(config);\n}\n\n/**\n * Create a gateway client from environment variables\n *\n * Required environment variables:\n * - SERVICE_LAYER: 'wspace' | 'global'\n * - SERVICE_NAME: Service name\n *\n * Optional:\n * - SERVICE_IDENTITY: Service identity (defaults to SERVICE_NAME)\n * - {LAYER}_INT_GATEWAY_URL: Internal gateway URL\n * - {OPPOSITE_LAYER}_PUBLIC_GATEWAY_URL: Cross-layer gateway URL\n */\nexport function createGatewayClientFromEnv(): GatewayClient {\n const layer = process.env['SERVICE_LAYER'] as ServiceLayer;\n\n if (!layer || (layer !== 'wspace' && layer !== 'global')) {\n throw new Error(`[GatewayClient] Invalid or missing SERVICE_LAYER. Expected 'wspace' or 'global', got '${layer}'`);\n }\n\n const serviceName = process.env['SERVICE_NAME'];\n if (!serviceName) {\n throw new Error('[GatewayClient] SERVICE_NAME environment variable is required');\n }\n\n const serviceIdentity = process.env['SERVICE_IDENTITY'] || serviceName;\n\n return new GatewayClient({\n layer,\n serviceName,\n serviceIdentity,\n });\n}\n"]}