@burdenoff/be-sdk 2026.722.2 → 2026.723.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 (43) hide show
  1. package/dist/auth/index.d.ts +1 -1
  2. package/dist/cache/index.d.ts +1 -1
  3. package/dist/cache/index.js +1 -1
  4. package/dist/{chunk-PQJ6MN4U.js → chunk-ESLJ2732.js} +3 -3
  5. package/dist/{chunk-PQJ6MN4U.js.map → chunk-ESLJ2732.js.map} +1 -1
  6. package/dist/{chunk-WM5COTOD.js → chunk-F5SGJ6VS.js} +118 -4
  7. package/dist/chunk-F5SGJ6VS.js.map +1 -0
  8. package/dist/{chunk-I3ZYYDNN.js → chunk-IIYIO2GG.js} +83 -11
  9. package/dist/chunk-IIYIO2GG.js.map +1 -0
  10. package/dist/{chunk-KKJPFKO5.js → chunk-QMDYY6GJ.js} +2 -2
  11. package/dist/{chunk-KKJPFKO5.js.map → chunk-QMDYY6GJ.js.map} +1 -1
  12. package/dist/{chunk-ZMCD5XAK.js → chunk-TORD32GS.js} +64 -29
  13. package/dist/chunk-TORD32GS.js.map +1 -0
  14. package/dist/{chunk-TSV4KAZT.js → chunk-VOJROV6C.js} +3 -3
  15. package/dist/{chunk-TSV4KAZT.js.map → chunk-VOJROV6C.js.map} +1 -1
  16. package/dist/{chunk-YCKM7FS7.js → chunk-WCJIZR5Q.js} +123 -10
  17. package/dist/chunk-WCJIZR5Q.js.map +1 -0
  18. package/dist/{chunk-JCBYU5BE.js → chunk-YH6PCW6L.js} +3 -3
  19. package/dist/{chunk-JCBYU5BE.js.map → chunk-YH6PCW6L.js.map} +1 -1
  20. package/dist/{chunk-U77L54IQ.js → chunk-ZVZ4RAIH.js} +3 -3
  21. package/dist/{chunk-U77L54IQ.js.map → chunk-ZVZ4RAIH.js.map} +1 -1
  22. package/dist/export/index.js +3 -3
  23. package/dist/feature-flags/index.d.ts +9 -1
  24. package/dist/feature-flags/index.js +2 -1
  25. package/dist/gateway/index.js +2 -2
  26. package/dist/gateway/security/index.js +1 -1
  27. package/dist/{index-D0tR4rjy.d.ts → index-CW_C6LQY.d.ts} +19 -2
  28. package/dist/{index-CgTMsars.d.ts → index-N8DMWKzw.d.ts} +4 -0
  29. package/dist/{index-lcW5eSTp.d.ts → index-PJZzGd8r.d.ts} +19 -2
  30. package/dist/index.d.ts +4 -4
  31. package/dist/index.js +12 -12
  32. package/dist/init/index.js +3 -3
  33. package/dist/notifications/index.js +1 -1
  34. package/dist/platform/index.d.ts +1 -1
  35. package/dist/platform/index.js +1 -1
  36. package/dist/server/index.d.ts +2 -2
  37. package/dist/tracker/index.js +2 -2
  38. package/dist/{types-DVG_lcsL.d.ts → types-DMZAHZNR.d.ts} +1 -1
  39. package/package.json +1 -1
  40. package/dist/chunk-I3ZYYDNN.js.map +0 -1
  41. package/dist/chunk-WM5COTOD.js.map +0 -1
  42. package/dist/chunk-YCKM7FS7.js.map +0 -1
  43. package/dist/chunk-ZMCD5XAK.js.map +0 -1
@@ -17,6 +17,7 @@ __export(platform_exports, {
17
17
  clampLimit: () => clampLimit,
18
18
  clampOffset: () => clampOffset,
19
19
  createHttpClient: () => createHttpClient,
20
+ createLeaderLease: () => createLeaderLease,
20
21
  decodeCursor: () => decodeCursor,
21
22
  dropOldPartitions: () => dropOldPartitions,
22
23
  encodeCursor: () => encodeCursor,
@@ -27,6 +28,7 @@ __export(platform_exports, {
27
28
  monthlyPartitionName: () => monthlyPartitionName,
28
29
  normalizeCursorPagination: () => normalizeCursorPagination,
29
30
  normalizeOffsetPagination: () => normalizeOffsetPagination,
31
+ normalizeRedisUrl: () => normalizeRedisUrl,
30
32
  paginate: () => paginate,
31
33
  rateLimitIncr: () => rateLimitIncr,
32
34
  resolveReferenceLoader: () => resolveReferenceLoader,
@@ -197,18 +199,44 @@ else
197
199
  return 0
198
200
  end
199
201
  `;
202
+ function leaderKey(name) {
203
+ return `besdk:leader:${name}`;
204
+ }
205
+ __name(leaderKey, "leaderKey");
200
206
  function generateToken() {
201
207
  return `${Date.now()}-${Math.random().toString(36).slice(2)}-${process.pid}`;
202
208
  }
203
209
  __name(generateToken, "generateToken");
210
+ function defaultRenewMs(ttlMs) {
211
+ return Math.max(1e3, Math.floor(ttlMs / 3));
212
+ }
213
+ __name(defaultRenewMs, "defaultRenewMs");
214
+ async function acquireLease(redis, key, token, ttlMs) {
215
+ const ttlSeconds = Math.max(1, Math.ceil(ttlMs / 1e3));
216
+ return await redis.set(key, token, "EX", ttlSeconds, "NX") === "OK";
217
+ }
218
+ __name(acquireLease, "acquireLease");
219
+ async function renewLease(redis, key, token, ttlMs) {
220
+ return await redis.eval(RENEW_LUA, 1, key, token, String(ttlMs)) === 1;
221
+ }
222
+ __name(renewLease, "renewLease");
223
+ async function releaseLease(redis, key, token) {
224
+ await redis.eval(RELEASE_LUA, 1, key, token);
225
+ }
226
+ __name(releaseLease, "releaseLease");
227
+ function normalizeRedisUrl(url) {
228
+ if (url.startsWith("valkeys://")) return url.replace(/^valkeys:\/\//, "rediss://");
229
+ if (url.startsWith("valkey://")) return url.replace(/^valkey:\/\//, "redis://");
230
+ return url;
231
+ }
232
+ __name(normalizeRedisUrl, "normalizeRedisUrl");
204
233
  async function withLeaderLock(redis, name, fn, options) {
205
- const key = `besdk:leader:${name}`;
234
+ const key = leaderKey(name);
206
235
  const token = generateToken();
207
236
  const ttlMs = options.ttlMs;
208
- const renewMs = options.renewMs ?? Math.max(1e3, Math.floor(ttlMs / 3));
209
- const ttlSeconds = Math.max(1, Math.ceil(ttlMs / 1e3));
210
- const acquired = await redis.set(key, token, "EX", ttlSeconds, "NX");
211
- if (acquired !== "OK") {
237
+ const renewMs = options.renewMs ?? defaultRenewMs(ttlMs);
238
+ const acquired = await acquireLease(redis, key, token, ttlMs);
239
+ if (!acquired) {
212
240
  return {
213
241
  acquired: false
214
242
  };
@@ -221,7 +249,7 @@ async function withLeaderLock(redis, name, fn, options) {
221
249
  let stopped = false;
222
250
  const renewTimer = setInterval(() => {
223
251
  if (stopped) return;
224
- redis.eval(RENEW_LUA, 1, key, token, String(ttlMs)).catch((err) => {
252
+ renewLease(redis, key, token, ttlMs).catch((err) => {
225
253
  logger.warn("leaderLock.renew.failed", {
226
254
  name,
227
255
  err: String(err)
@@ -241,7 +269,7 @@ async function withLeaderLock(redis, name, fn, options) {
241
269
  stopped = true;
242
270
  clearInterval(renewTimer);
243
271
  try {
244
- await redis.eval(RELEASE_LUA, 1, key, token);
272
+ await releaseLease(redis, key, token);
245
273
  logger.info("leaderLock.released", {
246
274
  name,
247
275
  token
@@ -255,6 +283,91 @@ async function withLeaderLock(redis, name, fn, options) {
255
283
  }
256
284
  }
257
285
  __name(withLeaderLock, "withLeaderLock");
286
+ function createLeaderLease(options) {
287
+ const { name, ttlMs, redis } = options;
288
+ const key = leaderKey(name);
289
+ const token = generateToken();
290
+ const renewMs = options.renewMs ?? defaultRenewMs(ttlMs);
291
+ let held = false;
292
+ let released = false;
293
+ let inFlight = null;
294
+ const acquireOrRenew = /* @__PURE__ */ __name(async () => {
295
+ if (released) return false;
296
+ try {
297
+ if (held) {
298
+ if (await renewLease(redis, key, token, ttlMs)) {
299
+ return true;
300
+ }
301
+ held = false;
302
+ }
303
+ const acquired = await acquireLease(redis, key, token, ttlMs);
304
+ if (acquired && !held) {
305
+ logger.info("leaderLease.acquired", {
306
+ name,
307
+ token,
308
+ ttlMs
309
+ });
310
+ }
311
+ held = acquired;
312
+ return held;
313
+ } catch (err) {
314
+ logger.warn("leaderLease.renew.failed", {
315
+ name,
316
+ err: String(err)
317
+ });
318
+ return held;
319
+ }
320
+ }, "acquireOrRenew");
321
+ const runAttempt = /* @__PURE__ */ __name(() => {
322
+ if (inFlight) return inFlight;
323
+ const attempt = acquireOrRenew().finally(() => {
324
+ if (inFlight === attempt) inFlight = null;
325
+ });
326
+ inFlight = attempt;
327
+ return attempt;
328
+ }, "runAttempt");
329
+ const timer = setInterval(() => {
330
+ if (released) return;
331
+ void runAttempt();
332
+ }, renewMs);
333
+ if (typeof timer.unref === "function") {
334
+ timer.unref();
335
+ }
336
+ return {
337
+ renew() {
338
+ return runAttempt();
339
+ },
340
+ async release() {
341
+ if (released) return;
342
+ released = true;
343
+ clearInterval(timer);
344
+ if (inFlight) {
345
+ try {
346
+ await inFlight;
347
+ } catch {
348
+ }
349
+ }
350
+ if (!held) return;
351
+ held = false;
352
+ try {
353
+ await releaseLease(redis, key, token);
354
+ logger.info("leaderLease.released", {
355
+ name,
356
+ token
357
+ });
358
+ } catch (err) {
359
+ logger.warn("leaderLease.release.failed", {
360
+ name,
361
+ err: String(err)
362
+ });
363
+ }
364
+ },
365
+ isHeld() {
366
+ return held && !released;
367
+ }
368
+ };
369
+ }
370
+ __name(createLeaderLease, "createLeaderLease");
258
371
 
259
372
  // src/platform/rateLimit.ts
260
373
  async function rateLimitIncr(redis, input) {
@@ -576,6 +689,6 @@ var LLMRouter = class {
576
689
  }
577
690
  };
578
691
 
579
- export { CircuitBreakerOpenError, DEFAULT_GRAPHQL_PAGE_LIMIT, LLMRouter, MAX_GRAPHQL_PAGE_LIMIT, __resetHttpClientBreakers, buildCacheKey, buildConnection, buildLoaders, buildOffsetPage, clampGraphqlLimit, clampLimit, clampOffset, createHttpClient, decodeCursor, dropOldPartitions, encodeCursor, ensureMonthlyPartitions, getNamespaceVersion, httpClient, invalidateNamespace, monthlyPartitionName, normalizeCursorPagination, normalizeOffsetPagination, paginate, platform_exports, rateLimitIncr, resolveReferenceLoader, toPrismaPage, withLeaderLock };
580
- //# sourceMappingURL=chunk-YCKM7FS7.js.map
581
- //# sourceMappingURL=chunk-YCKM7FS7.js.map
692
+ export { CircuitBreakerOpenError, DEFAULT_GRAPHQL_PAGE_LIMIT, LLMRouter, MAX_GRAPHQL_PAGE_LIMIT, __resetHttpClientBreakers, buildCacheKey, buildConnection, buildLoaders, buildOffsetPage, clampGraphqlLimit, clampLimit, clampOffset, createHttpClient, createLeaderLease, decodeCursor, dropOldPartitions, encodeCursor, ensureMonthlyPartitions, getNamespaceVersion, httpClient, invalidateNamespace, monthlyPartitionName, normalizeCursorPagination, normalizeOffsetPagination, normalizeRedisUrl, paginate, platform_exports, rateLimitIncr, resolveReferenceLoader, toPrismaPage, withLeaderLock };
693
+ //# sourceMappingURL=chunk-WCJIZR5Q.js.map
694
+ //# sourceMappingURL=chunk-WCJIZR5Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/index.ts","../src/platform/httpClient.ts","../src/platform/leaderLock.ts","../src/platform/rateLimit.ts","../src/platform/paginator.ts","../src/platform/dataLoaderFactory.ts","../src/platform/cacheInvalidation.ts","../src/platform/pgPartition.ts","../src/platform/llmClient.ts"],"names":["breakers","Map","hostOf","url","URL","host","getBreaker","b","get","failures","openedAt","state","set","defaultRetryOn","status","jitter","delay","Math","floor","random","sleep","ms","Promise","r","setTimeout","CircuitBreakerOpenError","Error","name","__resetHttpClientBreakers","clear","executeOnce","init","timeoutMs","signal","AbortSignal","timeout","fetch","httpClient","config","fullUrl","baseUrl","test","replace","breaker","breakerThreshold","threshold","cooldownMs","Date","now","logger","info","attempts","retry","initialDelay","initialDelayMs","maxDelay","maxDelayMs","retryOn","defaultTimeoutMs","headers","defaultHeaders","lastErr","attempt","response","warn","min","err","error","String","createHttpClient","RELEASE_LUA","RENEW_LUA","leaderKey","generateToken","toString","slice","process","pid","defaultRenewMs","ttlMs","max","acquireLease","redis","key","token","ttlSeconds","ceil","renewLease","eval","releaseLease","normalizeRedisUrl","startsWith","withLeaderLock","fn","options","renewMs","acquired","stopped","renewTimer","setInterval","catch","unref","result","clearInterval","createLeaderLease","held","released","inFlight","acquireOrRenew","runAttempt","finally","timer","renew","release","isHeld","rateLimitIncr","input","fullKey","count","incr","pexpire","windowMs","ttl","pttl","resetAt","remaining","limit","allowed","DEFAULT_GRAPHQL_PAGE_LIMIT","MAX_GRAPHQL_PAGE_LIMIT","clampLimit","opts","def","defaultLimit","maxLimit","minLimit","Number","isNaN","clampOffset","clampGraphqlLimit","normalizeOffsetPagination","offset","normalizeCursorPagination","first","after","trim","length","take","encodeCursor","payload","Buffer","from","JSON","stringify","decodeCursor","cursor","decoded","parse","Array","isArray","value","Object","entries","keys","buildConnection","items","nodes","edges","map","node","cursorForNode","firstEdge","lastEdge","at","pageInfo","hasNextPage","hasPreviousPage","startCursor","endCursor","totalCount","buildOffsetPage","total","pagination","nextOffset","hasMore","toPrismaPage","skip","paginate","model","undefined","findMany","id","where","orderBy","trimmed","nextCursor","buildLoaders","ctx","builder","resolveReferenceLoader","loaderName","keyField","reference","loader","loaders","load","VERSION_PREFIX","getNamespaceVersion","namespace","v","n","parseInt","isFinite","buildCacheKey","parts","ver","join","invalidateNamespace","pad2","monthlyPartitionName","table","year","month","ensureMonthlyPartitions","prisma","created","cur","UTC","getUTCFullYear","getUTCMonth","end","to","y","m","next","partition","lower","upper","$executeRawUnsafe","push","setUTCMonth","dropOldPartitions","rows","$queryRawUnsafe","dropped","cutoffYear","beforeDate","cutoffMonth","row","partitionRe","exec","partition_name","mo","DEFAULTS","maxAttempts","maxOutputTokensCap","LLMRouter","adapters","register","adapter","resolveChain","envChain","env","split","s","filter","Boolean","complete","req","cappedReq","maxTokens","chain","providerName","ctrl","AbortController","t","abort","provider","clearTimeout"],"mappings":";;;;AAAA,IAAA,gBAAA,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgDA,IAAMA,QAAAA,uBAAeC,GAAAA,EAAAA;AAErB,SAASC,OAAOC,GAAAA,EAAW;AACzB,EAAA,IAAI;AACF,IAAA,OAAO,IAAIC,GAAAA,CAAID,GAAAA,CAAAA,CAAKE,IAAAA;EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOF,GAAAA;AACT,EAAA;AACF;AANSD,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA;AAQT,SAASI,WAAWD,IAAAA,EAAY;AAC9B,EAAA,IAAIE,CAAAA,GAAIP,QAAAA,CAASQ,GAAAA,CAAIH,IAAAA,CAAAA;AACrB,EAAA,IAAI,CAACE,CAAAA,EAAG;AACNA,IAAAA,CAAAA,GAAI;MAAEE,QAAAA,EAAU,CAAA;MAAGC,QAAAA,EAAU,IAAA;MAAMC,KAAAA,EAAO;AAAS,KAAA;AACnDX,IAAAA,QAAAA,CAASY,GAAAA,CAAIP,MAAME,CAAAA,CAAAA;AACrB,EAAA;AACA,EAAA,OAAOA,CAAAA;AACT;AAPSD,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAST,SAASO,eAAeC,MAAAA,EAAc;AACpC,EAAA,OAAOA,MAAAA,KAAW,OAAOA,MAAAA,KAAW,GAAA,IAAOA,WAAW,GAAA,IAAQA,MAAAA,IAAU,OAAOA,MAAAA,IAAU,GAAA;AAC3F;AAFSD,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAIT,SAASE,OAAOC,KAAAA,EAAa;AAC3B,EAAA,OAAOC,IAAAA,CAAKC,KAAAA,CAAMD,IAAAA,CAAKE,MAAAA,KAAWH,KAAAA,CAAAA;AACpC;AAFSD,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA;AAIT,SAASK,MAAMC,EAAAA,EAAU;AACvB,EAAA,OAAO,IAAIC,OAAAA,CAAQ,CAACC,MAAMC,UAAAA,CAAWD,CAAAA,EAAGF,EAAAA,CAAAA,CAAAA;AAC1C;AAFSD,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;AAIF,IAAMK,uBAAAA,GAAN,cAAsCC,KAAAA,CAAAA;EA/E7C;;;AAgFE,EAAA,WAAA,CAAYrB,IAAAA,EAAc;AACxB,IAAA,KAAA,CAAM,CAAA,8BAAA,EAAiCA,IAAAA,CAAAA,CAAM,CAAA;AAC7C,IAAA,IAAA,CAAKsB,IAAAA,GAAO,yBAAA;AACd,EAAA;AACF;AAUO,SAASC,yBAAAA,GAAAA;AACd5B,EAAAA,QAAAA,CAAS6B,KAAAA,EAAK;AAChB;AAFgBD,MAAAA,CAAAA,yBAAAA,EAAAA,2BAAAA,CAAAA;AAIhB,eAAeE,WAAAA,CAAY3B,GAAAA,EAAa4B,IAAAA,EAAsBC,SAAAA,EAAiB;AAC7E,EAAA,MAAMC,MAAAA,GAASF,IAAAA,CAAKE,MAAAA,IAAUC,WAAAA,CAAYC,QAAQH,SAAAA,CAAAA;AAClD,EAAA,OAAOI,MAAMjC,GAAAA,EAAK;IAAE,GAAG4B,IAAAA;AAAME,IAAAA;GAAO,CAAA;AACtC;AAHeH,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAKf,eAAsBO,WACpBlC,GAAAA,EACA4B,IAAAA,GAAuB,EAAC,EACxBO,MAAAA,GAA2B,EAAC,EAAC;AAE7B,EAAA,MAAMC,OAAAA,GACJD,OAAOE,OAAAA,IAAW,CAAC,gBAAgBC,IAAAA,CAAKtC,GAAAA,IACpC,CAAA,EAAGmC,MAAAA,CAAOE,QAAQE,OAAAA,CAAQ,KAAA,EAAO,EAAA,CAAA,CAAA,CAAA,EAAOvC,IAAIuC,OAAAA,CAAQ,KAAA,EAAO,EAAA,CAAA,CAAA,CAAA,GAC3DvC,GAAAA;AACN,EAAA,MAAME,IAAAA,GAAOH,OAAOqC,OAAAA,CAAAA;AACpB,EAAA,MAAMI,OAAAA,GAAUrC,WAAWD,IAAAA,CAAAA;AAC3B,EAAA,MAAMuC,gBAAAA,GAAmBN,MAAAA,CAAOK,OAAAA,EAASE,SAAAA,IAAa,CAAA;AACtD,EAAA,MAAMC,UAAAA,GAAaR,MAAAA,CAAOK,OAAAA,EAASG,UAAAA,IAAc,GAAA;AAEjD,EAAA,IAAIH,OAAAA,CAAQhC,UAAU,MAAA,EAAQ;AAC5B,IAAA,IAAIgC,QAAQjC,QAAAA,IAAYqC,IAAAA,CAAKC,KAAG,GAAKL,OAAAA,CAAQjC,YAAYoC,UAAAA,EAAY;AACnEH,MAAAA,OAAAA,CAAQhC,KAAAA,GAAQ,WAAA;AAChBsC,MAAAA,MAAAA,CAAOC,KAAK,6BAAA,EAA+B;AAAE7C,QAAAA;OAAK,CAAA;IACpD,CAAA,MAAO;AACL,MAAA,MAAM,IAAIoB,wBAAwBpB,IAAAA,CAAAA;AACpC,IAAA;AACF,EAAA;AAEA,EAAA,MAAM8C,WAAWpB,IAAAA,CAAKqB,KAAAA,EAAOD,QAAAA,IAAYb,MAAAA,CAAOc,OAAOD,QAAAA,IAAY,CAAA;AACnE,EAAA,MAAME,eAAetB,IAAAA,CAAKqB,KAAAA,EAAOE,cAAAA,IAAkBhB,MAAAA,CAAOc,OAAOE,cAAAA,IAAkB,GAAA;AACnF,EAAA,MAAMC,WAAWxB,IAAAA,CAAKqB,KAAAA,EAAOI,UAAAA,IAAclB,MAAAA,CAAOc,OAAOI,UAAAA,IAAc,GAAA;AACvE,EAAA,MAAMC,UAAU1B,IAAAA,CAAKqB,KAAAA,EAAOK,OAAAA,IAAWnB,MAAAA,CAAOc,OAAOK,OAAAA,IAAW5C,cAAAA;AAChE,EAAA,MAAMmB,SAAAA,GAAYD,IAAAA,CAAKC,SAAAA,IAAaM,MAAAA,CAAOoB,gBAAAA,IAAoB,GAAA;AAE/D,EAAA,MAAMC,OAAAA,GAAU;IAAE,GAAIrB,MAAAA,CAAOsB,kBAAkB,EAAC;IAAI,GAAK7B,IAAAA,CAAK4B,WAAkD;AAAI,GAAA;AAEpH,EAAA,IAAIE,OAAAA;AACJ,EAAA,KAAA,IAASC,OAAAA,GAAU,CAAA,EAAGA,OAAAA,IAAWX,QAAAA,EAAUW,OAAAA,EAAAA,EAAW;AACpD,IAAA,IAAI;AACF,MAAA,MAAMC,QAAAA,GAAW,MAAMjC,WAAAA,CAAYS,OAAAA,EAAS;QAAE,GAAGR,IAAAA;AAAM4B,QAAAA;AAAQ,OAAA,EAAG3B,SAAAA,CAAAA;AAClE,MAAA,IAAI+B,QAAAA,CAASjD,UAAU,GAAA,EAAK;AAC1B6B,QAAAA,OAAAA,CAAQlC,QAAAA,IAAY,CAAA;AACpB,QAAA,IAAIkC,OAAAA,CAAQlC,YAAYmC,gBAAAA,EAAkB;AACxCD,UAAAA,OAAAA,CAAQhC,KAAAA,GAAQ,MAAA;AAChBgC,UAAAA,OAAAA,CAAQjC,QAAAA,GAAWqC,KAAKC,GAAAA,EAAG;AAC3BC,UAAAA,MAAAA,CAAOe,KAAK,yBAAA,EAA2B;AAAE3D,YAAAA,IAAAA;AAAMI,YAAAA,QAAAA,EAAUkC,OAAAA,CAAQlC;WAAS,CAAA;AAC5E,QAAA;AACA,QAAA,IAAIqD,OAAAA,GAAUX,QAAAA,IAAYM,OAAAA,CAAQM,QAAAA,CAASjD,MAAM,CAAA,EAAG;AAClD,UAAA,MAAME,QAAQC,IAAAA,CAAKgD,GAAAA,CAAIZ,eAAe,CAAA,KAAMS,OAAAA,GAAU,IAAIP,QAAAA,CAAAA;AAC1D,UAAA,MAAMnC,KAAAA,CAAML,MAAAA,CAAOC,KAAAA,CAAAA,CAAAA;AACnB,UAAA;AACF,QAAA;AACA,QAAA,OAAO+C,QAAAA;AACT,MAAA;AAEApB,MAAAA,OAAAA,CAAQlC,QAAAA,GAAW,CAAA;AACnB,MAAA,IAAIkC,OAAAA,CAAQhC,UAAU,WAAA,EAAa;AACjCgC,QAAAA,OAAAA,CAAQhC,KAAAA,GAAQ,QAAA;AAChBgC,QAAAA,OAAAA,CAAQjC,QAAAA,GAAW,IAAA;AACnBuC,QAAAA,MAAAA,CAAOC,KAAK,2BAAA,EAA6B;AAAE7C,UAAAA;SAAK,CAAA;AAClD,MAAA;AACA,MAAA,IAAIyD,OAAAA,GAAUX,QAAAA,IAAYM,OAAAA,CAAQM,QAAAA,CAASjD,MAAM,CAAA,EAAG;AAClD,QAAA,MAAME,QAAQC,IAAAA,CAAKgD,GAAAA,CAAIZ,eAAe,CAAA,KAAMS,OAAAA,GAAU,IAAIP,QAAAA,CAAAA;AAC1D,QAAA,MAAMnC,KAAAA,CAAML,MAAAA,CAAOC,KAAAA,CAAAA,CAAAA;AACnB,QAAA;AACF,MAAA;AACA,MAAA,OAAO+C,QAAAA;AACT,IAAA,CAAA,CAAA,OAASG,GAAAA,EAAK;AACZL,MAAAA,OAAAA,GAAUK,GAAAA;AACVvB,MAAAA,OAAAA,CAAQlC,QAAAA,IAAY,CAAA;AACpB,MAAA,IAAIkC,OAAAA,CAAQlC,YAAYmC,gBAAAA,EAAkB;AACxCD,QAAAA,OAAAA,CAAQhC,KAAAA,GAAQ,MAAA;AAChBgC,QAAAA,OAAAA,CAAQjC,QAAAA,GAAWqC,KAAKC,GAAAA,EAAG;AAC3BC,QAAAA,MAAAA,CAAOe,KAAK,yBAAA,EAA2B;AAAE3D,UAAAA,IAAAA;AAAMI,UAAAA,QAAAA,EAAUkC,OAAAA,CAAQlC;SAAS,CAAA;AAC5E,MAAA;AACA,MAAA,IAAIqD,WAAWX,QAAAA,EAAU;AACzB,MAAA,MAAMnC,QAAQC,IAAAA,CAAKgD,GAAAA,CAAIZ,eAAe,CAAA,KAAMS,OAAAA,GAAU,IAAIP,QAAAA,CAAAA;AAC1D,MAAA,MAAMnC,KAAAA,CAAML,MAAAA,CAAOC,KAAAA,CAAAA,CAAAA;AACrB,IAAA;AACF,EAAA;AAEAiC,EAAAA,MAAAA,CAAOkB,MAAM,sBAAA,EAAwB;IAAEhE,GAAAA,EAAKoC,OAAAA;AAASY,IAAAA,QAAAA;AAAU9C,IAAAA;GAAK,CAAA;AACpE,EAAA,MAAMwD,OAAAA,YAAmBnC,QAAQmC,OAAAA,GAAU,IAAInC,MAAM,CAAA,mBAAA,EAAsB0C,MAAAA,CAAOP,OAAAA,CAAAA,CAAAA,CAAU,CAAA;AAC9F;AA9EsBxB,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAgFf,SAASgC,gBAAAA,CACd/B,MAAAA,GAA2B,EAAC,EAAC;AAE7B,EAAA,OAAO,CAACnC,KAAa4B,IAAAA,GAAuB,OAAOM,UAAAA,CAAWlC,GAAAA,EAAK4B,MAAMO,MAAAA,CAAAA;AAC3E;AAJgB+B,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;;;AClJhB,IAAMC,WAAAA,GAAc;;;;;;;AAQpB,IAAMC,SAAAA,GAAY;;;;;;;AAalB,SAASC,UAAU7C,IAAAA,EAAY;AAC7B,EAAA,OAAO,gBAAgBA,IAAAA,CAAAA,CAAAA;AACzB;AAFS6C,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAIT,SAASC,aAAAA,GAAAA;AACP,EAAA,OAAO,GAAG1B,IAAAA,CAAKC,GAAAA,EAAG,CAAA,CAAA,EAAM/B,KAAKE,MAAAA,EAAM,CAAGuD,QAAAA,CAAS,EAAA,EAAIC,KAAAA,CAAM,CAAA,CAAA,CAAA,CAAA,EAAMC,QAAQC,GAAG,CAAA,CAAA;AAC5E;AAFSJ,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAIT,SAASK,eAAeC,KAAAA,EAAa;AACnC,EAAA,OAAO9D,KAAK+D,GAAAA,CAAI,GAAA,EAAO/D,KAAKC,KAAAA,CAAM6D,KAAAA,GAAQ,CAAA,CAAA,CAAA;AAC5C;AAFSD,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAKT,eAAeG,YAAAA,CAAaC,KAAAA,EAAwBC,GAAAA,EAAaC,KAAAA,EAAeL,KAAAA,EAAa;AAC3F,EAAA,MAAMM,UAAAA,GAAapE,KAAK+D,GAAAA,CAAI,CAAA,EAAG/D,KAAKqE,IAAAA,CAAKP,KAAAA,GAAQ,GAAA,CAAA,CAAA;AACjD,EAAA,OAAQ,MAAMG,MAAMtE,GAAAA,CAAIuE,GAAAA,EAAKC,OAAO,IAAA,EAAMC,UAAAA,EAAY,IAAA,CAAA,KAAW,IAAA;AACnE;AAHeJ,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAMf,eAAeM,UAAAA,CAAWL,KAAAA,EAAwBC,GAAAA,EAAaC,KAAAA,EAAeL,KAAAA,EAAa;AACzF,EAAA,OAAQ,MAAMG,KAAAA,CAAMM,IAAAA,CAAKjB,SAAAA,EAAW,CAAA,EAAGY,KAAKC,KAAAA,EAAOhB,MAAAA,CAAOW,KAAAA,CAAAA,CAAAA,KAAa,CAAA;AACzE;AAFeQ,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAKf,eAAeE,YAAAA,CAAaP,KAAAA,EAAwBC,GAAAA,EAAaC,KAAAA,EAAa;AAC5E,EAAA,MAAMF,KAAAA,CAAMM,IAAAA,CAAKlB,WAAAA,EAAa,CAAA,EAAGa,KAAKC,KAAAA,CAAAA;AACxC;AAFeK,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAcR,SAASC,kBAAkBvF,GAAAA,EAAW;AAC3C,EAAA,IAAIA,GAAAA,CAAIwF,WAAW,YAAA,CAAA,SAAsBxF,GAAAA,CAAIuC,OAAAA,CAAQ,iBAAiB,WAAA,CAAA;AACtE,EAAA,IAAIvC,GAAAA,CAAIwF,WAAW,WAAA,CAAA,SAAqBxF,GAAAA,CAAIuC,OAAAA,CAAQ,gBAAgB,UAAA,CAAA;AACpE,EAAA,OAAOvC,GAAAA;AACT;AAJgBuF,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AAUhB,eAAsBE,cAAAA,CACpBV,KAAAA,EACAvD,IAAAA,EACAkE,EAAAA,EACAC,OAAAA,EAA0B;AAE1B,EAAA,MAAMX,GAAAA,GAAMX,UAAU7C,IAAAA,CAAAA;AACtB,EAAA,MAAMyD,QAAQX,aAAAA,EAAAA;AACd,EAAA,MAAMM,QAAQe,OAAAA,CAAQf,KAAAA;AACtB,EAAA,MAAMgB,OAAAA,GAAUD,OAAAA,CAAQC,OAAAA,IAAWjB,cAAAA,CAAeC,KAAAA,CAAAA;AAElD,EAAA,MAAMiB,WAAW,MAAMf,YAAAA,CAAaC,KAAAA,EAAOC,GAAAA,EAAKC,OAAOL,KAAAA,CAAAA;AACvD,EAAA,IAAI,CAACiB,QAAAA,EAAU;AACb,IAAA,OAAO;MAAEA,QAAAA,EAAU;AAAM,KAAA;AAC3B,EAAA;AAEA/C,EAAAA,MAAAA,CAAOC,KAAK,qBAAA,EAAuB;AAAEvB,IAAAA,IAAAA;AAAMyD,IAAAA,KAAAA;AAAOL,IAAAA;GAAM,CAAA;AAExD,EAAA,IAAIkB,OAAAA,GAAU,KAAA;AACd,EAAA,MAAMC,UAAAA,GAAaC,YAAY,MAAA;AAC7B,IAAA,IAAIF,OAAAA,EAAS;AACbV,IAAAA,UAAAA,CAAWL,OAAOC,GAAAA,EAAKC,KAAAA,EAAOL,KAAAA,CAAAA,CAAOqB,KAAAA,CAAM,CAAClC,GAAAA,KAAAA;AAC1CjB,MAAAA,MAAAA,CAAOe,KAAK,yBAAA,EAA2B;AAAErC,QAAAA,IAAAA;AAAMuC,QAAAA,GAAAA,EAAKE,OAAOF,GAAAA;OAAK,CAAA;IAClE,CAAA,CAAA;AACF,EAAA,CAAA,EAAG6B,OAAAA,CAAAA;AAEH,EAAA,IAAI,OAAQG,UAAAA,CAAiDG,KAAAA,KAAU,UAAA,EAAY;AAChFH,IAAAA,UAAAA,CAAgDG,KAAAA,EAAK;AACxD,EAAA;AAEA,EAAA,IAAI;AACF,IAAA,MAAMC,MAAAA,GAAS,MAAMT,EAAAA,EAAAA;AACrB,IAAA,OAAO;MAAEG,QAAAA,EAAU,IAAA;AAAMM,MAAAA;AAAO,KAAA;EAClC,CAAA,SAAA;AACEL,IAAAA,OAAAA,GAAU,IAAA;AACVM,IAAAA,aAAAA,CAAcL,UAAAA,CAAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAMT,YAAAA,CAAaP,KAAAA,EAAOC,GAAAA,EAAKC,KAAAA,CAAAA;AAC/BnC,MAAAA,MAAAA,CAAOC,KAAK,qBAAA,EAAuB;AAAEvB,QAAAA,IAAAA;AAAMyD,QAAAA;OAAM,CAAA;AACnD,IAAA,CAAA,CAAA,OAASlB,GAAAA,EAAK;AACZjB,MAAAA,MAAAA,CAAOe,KAAK,2BAAA,EAA6B;AAAErC,QAAAA,IAAAA;AAAMuC,QAAAA,GAAAA,EAAKE,OAAOF,GAAAA;OAAK,CAAA;AACpE,IAAA;AACF,EAAA;AACF;AA3CsB0B,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AA4Ff,SAASY,kBAAkBV,OAAAA,EAAiC;AACjE,EAAA,MAAM,EAAEnE,IAAAA,EAAMoD,KAAAA,EAAOG,KAAAA,EAAK,GAAKY,OAAAA;AAC/B,EAAA,MAAMX,GAAAA,GAAMX,UAAU7C,IAAAA,CAAAA;AACtB,EAAA,MAAMyD,QAAQX,aAAAA,EAAAA;AACd,EAAA,MAAMsB,OAAAA,GAAUD,OAAAA,CAAQC,OAAAA,IAAWjB,cAAAA,CAAeC,KAAAA,CAAAA;AAElD,EAAA,IAAI0B,IAAAA,GAAO,KAAA;AACX,EAAA,IAAIC,QAAAA,GAAW,KAAA;AACf,EAAA,IAAIC,QAAAA,GAAoC,IAAA;AAExC,EAAA,MAAMC,iCAAiB,MAAA,CAAA,YAAA;AACrB,IAAA,IAAIF,UAAU,OAAO,KAAA;AACrB,IAAA,IAAI;AACF,MAAA,IAAID,IAAAA,EAAM;AACR,QAAA,IAAI,MAAMlB,UAAAA,CAAWL,KAAAA,EAAOC,GAAAA,EAAKC,KAAAA,EAAOL,KAAAA,CAAAA,EAAQ;AAC9C,UAAA,OAAO,IAAA;AACT,QAAA;AAGA0B,QAAAA,IAAAA,GAAO,KAAA;AACT,MAAA;AACA,MAAA,MAAMT,WAAW,MAAMf,YAAAA,CAAaC,KAAAA,EAAOC,GAAAA,EAAKC,OAAOL,KAAAA,CAAAA;AACvD,MAAA,IAAIiB,QAAAA,IAAY,CAACS,IAAAA,EAAM;AACrBxD,QAAAA,MAAAA,CAAOC,KAAK,sBAAA,EAAwB;AAAEvB,UAAAA,IAAAA;AAAMyD,UAAAA,KAAAA;AAAOL,UAAAA;SAAM,CAAA;AAC3D,MAAA;AACA0B,MAAAA,IAAAA,GAAOT,QAAAA;AACP,MAAA,OAAOS,IAAAA;AACT,IAAA,CAAA,CAAA,OAASvC,GAAAA,EAAK;AACZjB,MAAAA,MAAAA,CAAOe,KAAK,0BAAA,EAA4B;AAAErC,QAAAA,IAAAA;AAAMuC,QAAAA,GAAAA,EAAKE,OAAOF,GAAAA;OAAK,CAAA;AACjE,MAAA,OAAOuC,IAAAA;AACT,IAAA;EACF,CAAA,EArBuB,gBAAA,CAAA;AAyBvB,EAAA,MAAMI,6BAAa,MAAA,CAAA,MAAA;AACjB,IAAA,IAAIF,UAAU,OAAOA,QAAAA;AACrB,IAAA,MAAM7C,OAAAA,GAAU8C,cAAAA,EAAAA,CAAiBE,OAAAA,CAAQ,MAAA;AACvC,MAAA,IAAIH,QAAAA,KAAa7C,SAAS6C,QAAAA,GAAW,IAAA;IACvC,CAAA,CAAA;AACAA,IAAAA,QAAAA,GAAW7C,OAAAA;AACX,IAAA,OAAOA,OAAAA;EACT,CAAA,EAPmB,YAAA,CAAA;AASnB,EAAA,MAAMiD,KAAAA,GAAQZ,YAAY,MAAA;AACxB,IAAA,IAAIO,QAAAA,EAAU;AACd,IAAA,KAAKG,UAAAA,EAAAA;AACP,EAAA,CAAA,EAAGd,OAAAA,CAAAA;AAEH,EAAA,IAAI,OAAQgB,KAAAA,CAA4CV,KAAAA,KAAU,UAAA,EAAY;AAC3EU,IAAAA,KAAAA,CAA2CV,KAAAA,EAAK;AACnD,EAAA;AAEA,EAAA,OAAO;IACLW,KAAAA,GAAAA;AACE,MAAA,OAAOH,UAAAA,EAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMI,OAAAA,GAAAA;AACJ,MAAA,IAAIP,QAAAA,EAAU;AACdA,MAAAA,QAAAA,GAAW,IAAA;AACXH,MAAAA,aAAAA,CAAcQ,KAAAA,CAAAA;AACd,MAAA,IAAIJ,QAAAA,EAAU;AACZ,QAAA,IAAI;AACF,UAAA,MAAMA,QAAAA;QACR,CAAA,CAAA,MAAQ;AAER,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAACF,IAAAA,EAAM;AACXA,MAAAA,IAAAA,GAAO,KAAA;AACP,MAAA,IAAI;AACF,QAAA,MAAMhB,YAAAA,CAAaP,KAAAA,EAAOC,GAAAA,EAAKC,KAAAA,CAAAA;AAC/BnC,QAAAA,MAAAA,CAAOC,KAAK,sBAAA,EAAwB;AAAEvB,UAAAA,IAAAA;AAAMyD,UAAAA;SAAM,CAAA;AACpD,MAAA,CAAA,CAAA,OAASlB,GAAAA,EAAK;AACZjB,QAAAA,MAAAA,CAAOe,KAAK,4BAAA,EAA8B;AAAErC,UAAAA,IAAAA;AAAMuC,UAAAA,GAAAA,EAAKE,OAAOF,GAAAA;SAAK,CAAA;AACrE,MAAA;AACF,IAAA,CAAA;IACAgD,MAAAA,GAAAA;AACE,MAAA,OAAOT,QAAQ,CAACC,QAAAA;AAClB,IAAA;AACF,GAAA;AACF;AAjFgBF,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;;;ACrKhB,eAAsBW,aAAAA,CAAcjC,OAAuBkC,KAAAA,EAAqB;AAC9E,EAAA,MAAMC,OAAAA,GAAU,CAAA,SAAA,EAAYD,KAAAA,CAAMjC,GAAG,CAAA,CAAA;AACrC,EAAA,MAAMmC,KAAAA,GAAQ,MAAMpC,KAAAA,CAAMqC,IAAAA,CAAKF,OAAAA,CAAAA;AAC/B,EAAA,IAAIC,UAAU,CAAA,EAAG;AACf,IAAA,MAAMpC,KAAAA,CAAMsC,OAAAA,CAAQH,OAAAA,EAASD,KAAAA,CAAMK,QAAQ,CAAA;AAC7C,EAAA;AACA,EAAA,IAAIC,GAAAA,GAAM,EAAA;AACV,EAAA,IAAI;AACFA,IAAAA,GAAAA,GAAM,MAAMxC,KAAAA,CAAMyC,IAAAA,CAAKN,OAAAA,CAAAA;EACzB,CAAA,CAAA,MAAQ;AACNK,IAAAA,GAAAA,GAAMN,KAAAA,CAAMK,QAAAA;AACd,EAAA;AACA,EAAA,MAAMG,UAAU7E,IAAAA,CAAKC,GAAAA,MAAS0E,GAAAA,GAAM,CAAA,GAAIA,MAAMN,KAAAA,CAAMK,QAAAA,CAAAA;AACpD,EAAA,MAAMI,YAAY5G,IAAAA,CAAK+D,GAAAA,CAAI,CAAA,EAAGoC,KAAAA,CAAMU,QAAQR,KAAAA,CAAAA;AAC5C,EAAA,OAAO;AACLS,IAAAA,OAAAA,EAAST,SAASF,KAAAA,CAAMU,KAAAA;AACxBR,IAAAA,KAAAA;AACAO,IAAAA,SAAAA;AACAD,IAAAA;AACF,GAAA;AACF;AApBsBT,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;AClBf,IAAMa,0BAAAA,GAA6B;AACnC,IAAMC,sBAAAA,GAAyB;AAE/B,SAASC,UAAAA,CAAWd,KAAAA,EAAkCe,IAAAA,GAA0B,EAAC,EAAC;AACvF,EAAA,MAAMC,GAAAA,GAAMD,KAAKE,YAAAA,IAAgB,EAAA;AACjC,EAAA,MAAMrD,GAAAA,GAAMmD,KAAKG,QAAAA,IAAY,GAAA;AAC7B,EAAA,MAAMrE,GAAAA,GAAMkE,KAAKI,QAAAA,IAAY,CAAA;AAC7B,EAAA,IAAInB,SAAS,IAAA,IAAQoB,MAAAA,CAAOC,KAAAA,CAAMrB,KAAAA,GAAQ,OAAOgB,GAAAA;AACjD,EAAA,OAAOnH,IAAAA,CAAKgD,GAAAA,CAAIhD,IAAAA,CAAK+D,GAAAA,CAAI/D,IAAAA,CAAKC,MAAMkG,KAAAA,CAAAA,EAAQnD,GAAAA,CAAAA,EAAMe,GAAAA,CAAAA;AACpD;AANgBkD,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAQT,SAASQ,YAAYtB,KAAAA,EAAgC;AAC1D,EAAA,IAAIA,SAAS,IAAA,IAAQoB,MAAAA,CAAOC,KAAAA,CAAMrB,KAAAA,GAAQ,OAAO,CAAA;AACjD,EAAA,OAAOnG,KAAK+D,GAAAA,CAAI,CAAA,EAAG/D,IAAAA,CAAKC,KAAAA,CAAMkG,KAAAA,CAAAA,CAAAA;AAChC;AAHgBsB,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAKT,SAASC,iBAAAA,CAAkBvB,KAAAA,EAAkCe,IAAAA,GAA0B,EAAC,EAAC;AAC9F,EAAA,OAAOD,WAAWd,KAAAA,EAAO;AACvBiB,IAAAA,YAAAA,EAAcF,KAAKE,YAAAA,IAAgBL,0BAAAA;AACnCM,IAAAA,QAAAA,EAAUH,KAAKG,QAAAA,IAAYL,sBAAAA;AAC3BM,IAAAA,QAAAA,EAAUJ,KAAKI,QAAAA,IAAY;GAC7B,CAAA;AACF;AANgBI,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AAkBT,SAASC,yBAAAA,CACdxB,KAAAA,EACAe,IAAAA,GAA0B,EAAC,EAAC;AAE5B,EAAA,OAAO;IACLL,KAAAA,EAAOa,iBAAAA,CAAkBvB,KAAAA,EAAOU,KAAAA,EAAOK,IAAAA,CAAAA;IACvCU,MAAAA,EAAQH,WAAAA,CAAYtB,OAAOyB,MAAAA;AAC7B,GAAA;AACF;AARgBD,MAAAA,CAAAA,yBAAAA,EAAAA,2BAAAA,CAAAA;AAqBT,SAASE,yBAAAA,CACd1B,KAAAA,EACAe,IAAAA,GAA0B,EAAC,EAAC;AAE5B,EAAA,MAAMY,KAAAA,GAAQJ,iBAAAA,CAAkBvB,KAAAA,EAAO2B,KAAAA,EAAOZ,IAAAA,CAAAA;AAC9C,EAAA,MAAMa,KAAAA,GAAQ,OAAO5B,KAAAA,EAAO4B,KAAAA,KAAU,QAAA,IAAY5B,KAAAA,CAAM4B,KAAAA,CAAMC,IAAAA,EAAI,CAAGC,MAAAA,GAAS,CAAA,GAAI9B,KAAAA,CAAM4B,KAAAA,GAAQ,IAAA;AAChG,EAAA,OAAO;AAAED,IAAAA,KAAAA;AAAOC,IAAAA,KAAAA;AAAOG,IAAAA,IAAAA,EAAMJ,KAAAA,GAAQ;AAAE,GAAA;AACzC;AAPgBD,MAAAA,CAAAA,yBAAAA,EAAAA,2BAAAA,CAAAA;AAYT,SAASM,aAAaC,OAAAA,EAAsB;AACjD,EAAA,OAAOC,MAAAA,CAAOC,KAAKC,IAAAA,CAAKC,SAAAA,CAAUJ,OAAAA,CAAAA,EAAU,MAAA,CAAA,CAAQ3E,QAAAA,CAAS,WAAA,CAAA;AAC/D;AAFgB0E,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAIT,SAASM,aAAaC,MAAAA,EAAiC;AAC5D,EAAA,IAAI,OAAOA,WAAW,QAAA,IAAYA,MAAAA,CAAOV,MAAI,CAAGC,MAAAA,KAAW,GAAG,OAAO,IAAA;AAErE,EAAA,IAAI;AACF,IAAA,MAAMU,OAAAA,GAAmBJ,IAAAA,CAAKK,KAAAA,CAAMP,MAAAA,CAAOC,IAAAA,CAAKI,QAAQ,WAAA,CAAA,CAAajF,QAAAA,CAAS,MAAA,CAAA,CAAA;AAC9E,IAAA,IAAIkF,OAAAA,IAAW,QAAQ,OAAOA,OAAAA,KAAY,YAAYE,KAAAA,CAAMC,OAAAA,CAAQH,OAAAA,CAAAA,EAAU,OAAO,IAAA;AAErF,IAAA,MAAMP,UAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,CAAClE,GAAAA,EAAK6E,KAAAA,KAAUC,MAAAA,CAAOC,OAAAA,CAAQN,OAAAA,CAAAA,EAAU;AAClD,MAAA,IAAI,OAAOI,KAAAA,KAAU,QAAA,IAAY,OAAOA,KAAAA,KAAU,YAAY,OAAOA,KAAAA,KAAU,SAAA,IAAaA,KAAAA,IAAS,IAAA,EAAM;AACzGX,QAAAA,OAAAA,CAAQlE,GAAAA,CAAAA,GAAO6E,KAAAA;AACjB,MAAA;AACF,IAAA;AAEA,IAAA,OAAOC,OAAOE,IAAAA,CAAKd,OAAAA,CAAAA,CAASH,MAAAA,GAAS,IAAIG,OAAAA,GAAU,IAAA;EACrD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AACT,EAAA;AACF;AAlBgBK,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AA8CT,SAASU,eAAAA,CAAuBC,OAAgBlC,IAAAA,EAAmC;AACxF,EAAA,MAAMmC,KAAAA,GAAQD,KAAAA,CAAMnB,MAAAA,GAASf,IAAAA,CAAKL,KAAAA,GAAQuC,MAAM1F,KAAAA,CAAM,CAAA,EAAGwD,IAAAA,CAAKL,KAAK,CAAA,GAAIuC,KAAAA;AACvE,EAAA,MAAME,KAAAA,GAAQD,KAAAA,CAAME,GAAAA,CAAI,CAACC,IAAAA,MAAU;AAAEA,IAAAA,IAAAA;IAAMd,MAAAA,EAAQxB,IAAAA,CAAKuC,cAAcD,IAAAA;GAAM,CAAA,CAAA;AAC5E,EAAA,MAAME,SAAAA,GAAYJ,MAAM,CAAA,CAAA;AACxB,EAAA,MAAMK,QAAAA,GAAWL,KAAAA,CAAMM,EAAAA,CAAG,EAAC,CAAA;AAE3B,EAAA,OAAO;AACLN,IAAAA,KAAAA;AACAD,IAAAA,KAAAA;IACAQ,QAAAA,EAAU;MACRC,WAAAA,EAAaV,KAAAA,CAAMnB,SAASf,IAAAA,CAAKL,KAAAA;AACjCkD,MAAAA,eAAAA,EAAiB7C,KAAK6C,eAAAA,IAAmB,KAAA;AACzCC,MAAAA,WAAAA,EAAaN,WAAWhB,MAAAA,IAAU,IAAA;AAClCuB,MAAAA,SAAAA,EAAWN,UAAUjB,MAAAA,IAAU;AACjC,KAAA;AACAwB,IAAAA,UAAAA,EAAYhD,IAAAA,CAAKgD;AACnB,GAAA;AACF;AAjBgBf,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AA4BT,SAASgB,eAAAA,CACdf,KAAAA,EACAgB,KAAAA,EACAC,UAAAA,EAAsC;AAEtC,EAAA,MAAMC,UAAAA,GAAaD,UAAAA,CAAWzC,MAAAA,GAASwB,KAAAA,CAAMnB,MAAAA;AAC7C,EAAA,MAAMsC,UAAUD,UAAAA,GAAaF,KAAAA;AAE7B,EAAA,OAAO;AACLhB,IAAAA,KAAAA;AACAgB,IAAAA,KAAAA;AACAvD,IAAAA,KAAAA,EAAOwD,UAAAA,CAAWxD,KAAAA;AAClBe,IAAAA,MAAAA,EAAQyC,UAAAA,CAAWzC,MAAAA;AACnB2C,IAAAA,OAAAA;AACAD,IAAAA,UAAAA,EAAYC,UAAUD,UAAAA,GAAa;AACrC,GAAA;AACF;AAhBgBH,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAiCT,SAASK,aAAaH,UAAAA,EAAsC;AACjE,EAAA,OAAO;AAAEnC,IAAAA,IAAAA,EAAMmC,UAAAA,CAAWxD,KAAAA;AAAO4D,IAAAA,IAAAA,EAAMJ,UAAAA,CAAWzC;AAAO,GAAA;AAC3D;AAFgB4C,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AA2BhB,eAAsBE,QAAAA,CACpBC,KAAAA,EACAxE,KAAAA,EACAe,IAAAA,GAA0B,EAAC,EAAC;AAG5B,EAAA,MAAMgB,IAAAA,GAAOR,iBAAAA,CAAkBvB,KAAAA,CAAM+B,IAAAA,IAAQ0C,QAAW1D,IAAAA,CAAAA;AAExD,EAAA,MAAMkC,KAAAA,GAAQ,MAAMuB,KAAAA,CAAME,QAAAA,CAAS;AACjC3C,IAAAA,IAAAA,EAAMA,IAAAA,GAAO,CAAA;IACbuC,IAAAA,EAAMtE,KAAAA,CAAMuC,SAAS,CAAA,GAAI,CAAA;AACzBA,IAAAA,MAAAA,EAAQvC,MAAMuC,MAAAA,GAAS;AAAEoC,MAAAA,EAAAA,EAAI3E,KAAAA,CAAMuC;KAAO,GAAIkC,MAAAA;AAC9CG,IAAAA,KAAAA,EAAO5E,KAAAA,CAAM4E,KAAAA;AACbC,IAAAA,OAAAA,EAAS7E,KAAAA,CAAM6E;GACjB,CAAA;AACA,EAAA,MAAMT,OAAAA,GAAUnB,MAAMnB,MAAAA,GAASC,IAAAA;AAC/B,EAAA,MAAM+C,UAAUV,OAAAA,GAAUnB,KAAAA,CAAM1F,KAAAA,CAAM,CAAA,EAAGwE,IAAAA,CAAAA,GAAQkB,KAAAA;AACjD,EAAA,MAAM8B,UAAAA,GAAaX,OAAAA,IAAWU,OAAAA,CAAQhD,MAAAA,GAAS,CAAA,GAAKgD,QAAQA,OAAAA,CAAQhD,MAAAA,GAAS,CAAA,CAAA,CAAsB6C,EAAAA,GAAK,IAAA;AACxG,EAAA,OAAO;IAAE1B,KAAAA,EAAO6B,OAAAA;AAASV,IAAAA,OAAAA;AAASW,IAAAA;AAAW,GAAA;AAC/C;AAnBsBR,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;;;ACvLf,SAASS,YAAAA,CAAuCC,KAAUC,OAAAA,EAA8B;AAC7F,EAAA,OAAOA,QAAQD,GAAAA,CAAAA;AACjB;AAFgBD,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAiBT,SAASG,sBAAAA,CACdC,UAAAA,EACAC,QAAAA,GAAmB,IAAA,EAAI;AAEvB,EAAA,OAAO,OAAOC,WAAWL,GAAAA,KAAAA;AACvB,IAAA,MAAMM,MAAAA,GAASN,GAAAA,CAAIO,OAAAA,CAAQJ,UAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACG,MAAAA,EAAQ;AACX,MAAA,MAAM,IAAIjL,KAAAA,CAAM,CAAA,gCAAA,EAAmC8K,UAAAA,CAAAA,0BAAAA,CAAsC,CAAA;AAC3F,IAAA;AACA,IAAA,MAAMrH,GAAAA,GAAMuH,UAAUD,QAAAA,CAAAA;AACtB,IAAA,IAAI,OAAOtH,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,OAAOwH,MAAAA,CAAOE,KAAK1H,GAAAA,CAAAA;AACrB,EAAA,CAAA;AACF;AAfgBoH,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;;;ACrChB,IAAMO,cAAAA,GAAiB,WAAA;AAEvB,eAAsBC,mBAAAA,CAAoB7H,OAA0B8H,SAAAA,EAAiB;AACnF,EAAA,MAAMC,CAAAA,GAAI,MAAM/H,KAAAA,CAAM1E,GAAAA,CAAI,GAAGsM,cAAAA,CAAAA,EAAiBE,SAAAA,CAAAA,CAAW,CAAA;AACzD,EAAA,IAAI,CAACC,GAAG,OAAO,CAAA;AACf,EAAA,MAAMC,CAAAA,GAAI1E,MAAAA,CAAO2E,QAAAA,CAASF,CAAAA,EAAG,EAAA,CAAA;AAC7B,EAAA,OAAOzE,OAAO4E,QAAAA,CAASF,CAAAA,CAAAA,IAAMA,CAAAA,GAAI,IAAIA,CAAAA,GAAI,CAAA;AAC3C;AALsBH,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAOtB,eAAsBM,aAAAA,CAAcnI,KAAAA,EAA0B8H,SAAAA,EAAAA,GAAsBM,KAAAA,EAAe;AACjG,EAAA,MAAMC,GAAAA,GAAM,MAAMR,mBAAAA,CAAoB7H,KAAAA,EAAO8H,SAAAA,CAAAA;AAC7C,EAAA,OAAO,CAAA,EAAGA,SAAAA,CAAAA,EAAAA,EAAcO,GAAAA,IAAOD,KAAAA,CAAME,IAAAA,CAAK,GAAA,CAAA,CAAA,CAAA;AAC5C;AAHsBH,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAKtB,eAAsBI,mBAAAA,CAAoBvI,OAA0B8H,SAAAA,EAAiB;AACnF,EAAA,OAAO9H,MAAMqC,IAAAA,CAAK,CAAA,EAAGuF,cAAAA,CAAAA,EAAiBE,SAAAA,CAAAA,CAAW,CAAA;AACnD;AAFsBS,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;ACbtB,SAASC,KAAKR,CAAAA,EAAS;AACrB,EAAA,OAAOA,IAAI,EAAA,GAAK,CAAA,CAAA,EAAIA,CAAAA,CAAAA,CAAAA,GAAM,GAAGA,CAAAA,CAAAA,CAAAA;AAC/B;AAFSQ,MAAAA,CAAAA,IAAAA,EAAAA,MAAAA,CAAAA;AAIF,SAASC,oBAAAA,CAAqBC,KAAAA,EAAeC,IAAAA,EAAcC,KAAAA,EAAa;AAC7E,EAAA,OAAO,GAAGF,KAAAA,CAAAA,EAAAA,EAAUC,IAAAA,CAAAA,CAAAA,EAAQH,IAAAA,CAAKI,KAAAA,CAAAA,CAAAA,CAAAA;AACnC;AAFgBH,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAUhB,eAAsBI,uBAAAA,CAAwBC,QAAyB7F,IAAAA,EAA0B;AAC/F,EAAA,MAAM8F,UAAoB,EAAA;AAC1B,EAAA,MAAMC,GAAAA,GAAM,IAAInL,IAAAA,CAAKA,IAAAA,CAAKoL,IAAIhG,IAAAA,CAAKoB,IAAAA,CAAK6E,cAAAA,EAAc,EAAIjG,IAAAA,CAAKoB,IAAAA,CAAK8E,WAAAA,EAAW,EAAI,CAAA,CAAA,CAAA;AACnF,EAAA,MAAMC,GAAAA,GAAM,IAAIvL,IAAAA,CAAKA,IAAAA,CAAKoL,IAAIhG,IAAAA,CAAKoG,EAAAA,CAAGH,cAAAA,EAAc,EAAIjG,IAAAA,CAAKoG,EAAAA,CAAGF,WAAAA,EAAW,EAAI,CAAA,CAAA,CAAA;AAC/E,EAAA,OAAOH,OAAOI,GAAAA,EAAK;AACjB,IAAA,MAAME,CAAAA,GAAIN,IAAIE,cAAAA,EAAc;AAC5B,IAAA,MAAMK,CAAAA,GAAIP,GAAAA,CAAIG,WAAAA,EAAW,GAAK,CAAA;AAC9B,IAAA,MAAMK,IAAAA,GAAO,IAAI3L,IAAAA,CAAKA,IAAAA,CAAKoL,IAAIK,CAAAA,EAAGC,CAAAA,EAAG,CAAA,CAAA,CAAA;AACrC,IAAA,MAAME,SAAAA,GAAYhB,oBAAAA,CAAqBxF,IAAAA,CAAKyF,KAAAA,EAAOY,GAAGC,CAAAA,CAAAA;AACtD,IAAA,MAAMG,QAAQ,CAAA,EAAGJ,CAAAA,CAAAA,CAAAA,EAAKd,IAAAA,CAAKe,CAAAA,CAAAA,CAAAA,GAAAA,CAAAA;AAC3B,IAAA,MAAMI,KAAAA,GAAQ,CAAA,EAAGH,IAAAA,CAAKN,cAAAA,EAAc,CAAA,CAAA,EAAMV,IAAAA,CAAKgB,IAAAA,CAAKL,WAAAA,EAAW,GAAK,CAAA,CAAA,CAAA,GAAA,CAAA;AACpE,IAAA,MAAML,MAAAA,CAAOc,iBAAAA,CACX,CAAA,4BAAA,EAA+BH,SAAAA,CAAAA,gBAAAA,EAA4BxG,IAAAA,CAAKyF,KAAK,CAAA,oBAAA,EAAuBgB,KAAAA,CAAAA,QAAAA,EAAgBC,KAAAA,CAAAA,GAAAA,CAAU,CAAA;AAExHZ,IAAAA,OAAAA,CAAQc,KAAKJ,SAAAA,CAAAA;AACbT,IAAAA,GAAAA,CAAIc,WAAAA,CAAYd,GAAAA,CAAIG,WAAAA,EAAW,GAAK,CAAA,CAAA;AACtC,EAAA;AACA,EAAA,OAAOJ,OAAAA;AACT;AAlBsBF,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AA6BtB,eAAsBkB,iBAAAA,CAAkBjB,QAAyB7F,IAAAA,EAAoB;AAEnF,EAAA,MAAM+G,IAAAA,GAAO,MAAMlB,MAAAA,CAAOmB,eAAAA,CACxB,CAAA;;;;AAKAhH,8BAAAA,CAAAA,EAAAA,IAAAA,CAAKyF,KAAK,CAAA;AAEZ,EAAA,MAAMwB,UAAoB,EAAA;AAC1B,EAAA,MAAMC,UAAAA,GAAalH,IAAAA,CAAKmH,UAAAA,CAAWlB,cAAAA,EAAc;AACjD,EAAA,MAAMmB,WAAAA,GAAcpH,IAAAA,CAAKmH,UAAAA,CAAWjB,WAAAA,EAAW,GAAK,CAAA;AACpD,EAAA,KAAA,MAAWmB,OAAON,IAAAA,EAAM;AACtB,IAAA,MAAMO,WAAAA,GAAc,oBAAA;AACpB,IAAA,MAAMhB,CAAAA,GAAIgB,WAAAA,CAAYC,IAAAA,CAAKF,GAAAA,CAAIG,cAAc,CAAA;AAC7C,IAAA,IAAI,CAAClB,CAAAA,EAAG;AACR,IAAA,MAAMD,CAAAA,GAAIhG,MAAAA,CAAOiG,CAAAA,CAAE,CAAA,CAAE,CAAA;AACrB,IAAA,MAAMmB,EAAAA,GAAKpH,MAAAA,CAAOiG,CAAAA,CAAE,CAAA,CAAE,CAAA;AACtB,IAAA,IAAID,CAAAA,GAAIa,UAAAA,IAAeb,CAAAA,KAAMa,UAAAA,IAAcO,KAAKL,WAAAA,EAAc;AAC5D,MAAA,MAAMvB,MAAAA,CAAOc,iBAAAA,CAAkB,CAAA,sBAAA,EAAyBU,GAAAA,CAAIG,cAAc,CAAA,EAAA,CAAI,CAAA;AAC9EP,MAAAA,OAAAA,CAAQL,IAAAA,CAAKS,IAAIG,cAAc,CAAA;AACjC,IAAA;AACF,EAAA;AACA,EAAA,OAAOP,OAAAA;AACT;AAzBsBH,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;;;ACbtB,IAAMY,QAAAA,GAAuC;EAC3C7N,SAAAA,EAAW,GAAA;EACX8N,WAAAA,EAAa,CAAA;EACbxM,cAAAA,EAAgB,GAAA;EAChByM,kBAAAA,EAAoB;AACtB,CAAA;AAEA,SAAShP,QAAOmM,CAAAA,EAAS;AACvB,EAAA,OAAOjM,IAAAA,CAAKC,KAAAA,CAAMD,IAAAA,CAAKE,MAAAA,KAAW+L,CAAAA,CAAAA;AACpC;AAFSnM,MAAAA,CAAAA,OAAAA,EAAAA,QAAAA,CAAAA;AAIT,SAASK,OAAMC,EAAAA,EAAU;AACvB,EAAA,OAAO,IAAIC,OAAAA,CAAQ,CAACC,MAAMC,UAAAA,CAAWD,CAAAA,EAAGF,EAAAA,CAAAA,CAAAA;AAC1C;AAFSD,MAAAA,CAAAA,MAAAA,EAAAA,OAAAA,CAAAA;AAIF,IAAM4O,YAAN,MAAMA;EA/Db;;;AAgEmBC,EAAAA,QAAAA,uBAAgDhQ,GAAAA,EAAAA;AAChDkI,EAAAA,IAAAA;EAEjB,WAAA,CAAYA,IAAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAKA,IAAAA,GAAO;MAAE,GAAG0H,QAAAA;MAAU,GAAG1H;AAAK,KAAA;AACrC,EAAA;AAEA+H,EAAAA,QAAAA,CAASC,OAAAA,EAAmC;AAC1C,IAAA,IAAA,CAAKF,QAAAA,CAASrP,GAAAA,CAAIuP,OAAAA,CAAQxO,IAAAA,EAAMwO,OAAAA,CAAAA;AAClC,EAAA;EAEQC,YAAAA,GAAyB;AAC/B,IAAA,MAAMC,QAAAA,GAAWzL,OAAAA,CAAQ0L,GAAAA,CAAI,oBAAA,GAAuBrH,IAAAA,EAAAA;AACpD,IAAA,IAAIoH,QAAAA,EAAU;AACZ,MAAA,OAAOA,QAAAA,CACJE,KAAAA,CAAM,GAAA,CAAA,CACN/F,GAAAA,CAAI,CAACgG,CAAAA,KAAMA,CAAAA,CAAEvH,IAAAA,EAAI,CAAA,CACjBwH,MAAAA,CAAOC,OAAAA,CAAAA;AACZ,IAAA;AACA,IAAA,OAAO5G,KAAAA,CAAMP,IAAAA,CAAK,IAAA,CAAK0G,QAAAA,CAAS9F,MAAI,CAAA;AACtC,EAAA;AAEA,EAAA,MAAMwG,SAASC,GAAAA,EAAuC;AACpD,IAAA,MAAMC,SAAAA,GAAwB;MAC5B,GAAGD,GAAAA;MACHE,SAAAA,EAAW7P,IAAAA,CAAKgD,IAAI2M,GAAAA,CAAIE,SAAAA,IAAa,KAAK3I,IAAAA,CAAK4H,kBAAAA,EAAoB,IAAA,CAAK5H,IAAAA,CAAK4H,kBAAkB;AACjG,KAAA;AACA,IAAA,MAAMgB,KAAAA,GAAQ,KAAKX,YAAAA,EAAY;AAC/B,IAAA,IAAIW,KAAAA,CAAM7H,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAIxH,MAAM,oCAAA,CAAA;AAClB,IAAA;AAEA,IAAA,IAAImC,OAAAA,GAAmB,IAAA;AACvB,IAAA,KAAA,IAASC,UAAU,CAAA,EAAGA,OAAAA,GAAU,IAAA,CAAKqE,IAAAA,CAAK2H,aAAahM,OAAAA,EAAAA,EAAW;AAChE,MAAA,MAAMkN,YAAAA,GAAeD,KAAAA,CAAMjN,OAAAA,GAAUiN,KAAAA,CAAM7H,MAAM,CAAA;AACjD,MAAA,MAAMiH,UAAUa,YAAAA,GAAe,IAAA,CAAKf,QAAAA,CAASzP,GAAAA,CAAIwQ,YAAAA,CAAAA,GAAgBnF,MAAAA;AACjE,MAAA,IAAI,CAACsE,OAAAA,EAAS;AACZlN,QAAAA,MAAAA,CAAOe,KAAK,kCAAA,EAAoC;AAAEgN,UAAAA;SAAa,CAAA;AAC/D,QAAA;AACF,MAAA;AACA,MAAA,MAAMhP,SAAAA,GAAY4O,GAAAA,CAAI5O,SAAAA,IAAa,IAAA,CAAKmG,IAAAA,CAAKnG,SAAAA;AAC7C,MAAA,MAAMiP,IAAAA,GAAO,IAAIC,eAAAA,EAAAA;AACjB,MAAA,MAAMC,IAAI3P,UAAAA,CAAW,MAAMyP,IAAAA,CAAKG,KAAAA,IAASpP,SAAAA,CAAAA;AACzC,MAAA,IAAI;AACF,QAAA,MAAM+B,WAAW,MAAMoM,OAAAA,CAAQQ,QAAAA,CAASE,SAAAA,EAAWI,KAAKhP,MAAM,CAAA;AAC9D,QAAA,OAAO8B,QAAAA;AACT,MAAA,CAAA,CAAA,OAASG,GAAAA,EAAK;AACZL,QAAAA,OAAAA,GAAUK,GAAAA;AACVjB,QAAAA,MAAAA,CAAOe,KAAK,0BAAA,EAA4B;AAAEqN,UAAAA,QAAAA,EAAUlB,OAAAA,CAAQxO,IAAAA;AAAMmC,UAAAA,OAAAA;AAASI,UAAAA,GAAAA,EAAKE,OAAOF,GAAAA;SAAK,CAAA;AAC5F,QAAA,IAAIJ,OAAAA,GAAU,IAAA,CAAKqE,IAAAA,CAAK2H,WAAAA,GAAc,CAAA,EAAG;AACvC,UAAA,MAAM9O,KAAAA,GAAQ,IAAA,CAAKmH,IAAAA,CAAK7E,cAAAA,GAAiB,CAAA,IAAKQ,OAAAA;AAC9C,UAAA,MAAM1C,MAAAA,CAAML,OAAAA,CAAOC,KAAAA,CAAAA,CAAAA;AACrB,QAAA;MACF,CAAA,SAAA;AACEsQ,QAAAA,YAAAA,CAAaH,CAAAA,CAAAA;AACf,MAAA;AACF,IAAA;AACA,IAAA,MAAMtN,OAAAA,YAAmBnC,QAAQmC,OAAAA,GAAU,IAAInC,MAAM,CAAA,oBAAA,EAAuB,IAAA,CAAKyG,IAAAA,CAAK2H,WAAW,CAAA,SAAA,CAAW,CAAA;AAC9G,EAAA;AACF","file":"chunk-WCJIZR5Q.js","sourcesContent":["/**\n * @burdenoff/be-sdk/platform\n *\n * Reusable platform primitives consumed fleet-wide by Burdenoff svcs.\n */\nexport { httpClient, createHttpClient, CircuitBreakerOpenError, __resetHttpClientBreakers } from './httpClient.js';\nexport type { HttpClientConfig, HttpClientInit, RetryConfig, BreakerConfig } from './httpClient.js';\n\nexport { withLeaderLock, createLeaderLease, normalizeRedisUrl } from './leaderLock.js';\nexport type {\n LeaderLockRedis,\n LeaderLockOptions,\n LeaderLockResult,\n CreateLeaderLeaseOptions,\n LeaderLease,\n} from './leaderLock.js';\n\nexport { rateLimitIncr } from './rateLimit.js';\nexport type { RateLimitRedis, RateLimitInput, RateLimitResult } from './rateLimit.js';\n\nexport {\n DEFAULT_GRAPHQL_PAGE_LIMIT,\n MAX_GRAPHQL_PAGE_LIMIT,\n buildConnection,\n buildOffsetPage,\n clampGraphqlLimit,\n clampLimit,\n clampOffset,\n decodeCursor,\n encodeCursor,\n normalizeCursorPagination,\n normalizeOffsetPagination,\n paginate,\n toPrismaPage,\n} from './paginator.js';\nexport type { ClampLimitOptions, PaginateInput, PaginateResult, PrismaModelLike } from './paginator.js';\nexport type {\n BuildConnectionOptions,\n ConnectionEdge,\n ConnectionResult,\n CursorPaginationInput,\n CursorPayload,\n CursorPayloadValue,\n NormalizedCursorPagination,\n NormalizedOffsetPagination,\n OffsetPageResult,\n OffsetPaginationInput,\n PageInfo,\n} from './paginator.js';\n\nexport { buildLoaders, resolveReferenceLoader } from './dataLoaderFactory.js';\nexport type { DataLoaderLike, LoaderMap, LoaderBuilder, ReferenceObject } from './dataLoaderFactory.js';\n\nexport { buildCacheKey, getNamespaceVersion, invalidateNamespace } from './cacheInvalidation.js';\nexport type { CacheVersionRedis } from './cacheInvalidation.js';\n\nexport { monthlyPartitionName, ensureMonthlyPartitions, dropOldPartitions } from './pgPartition.js';\nexport type { PrismaRawClient, EnsureMonthlyOptions, DropOldOptions } from './pgPartition.js';\n\nexport { LLMRouter } from './llmClient.js';\nexport type { LLMRequest, LLMResponse, LLMProviderAdapter, LLMRouterOptions } from './llmClient.js';\n","/**\n * httpClient — hardened wrapper around global `fetch` with:\n * - per-request AbortSignal.timeout (default 5s)\n * - retries (default 3) with exponential backoff + full jitter\n * - per-host circuit breaker (opens at 5 consecutive 5xx, half-open after 30s)\n * - structured logging via existing be-sdk logger\n *\n * No required upstream dependency — we use the runtime `fetch` so the same\n * code path works on Bun and Node 20+. Consumers may pass an undici Agent\n * via `init.dispatcher` if they need keep-alive pooling; we forward unknown\n * init fields through.\n */\n\nimport { logger } from '../logger/index.js';\n\nexport interface RetryConfig {\n /** Total attempts including the first (default 3) */\n attempts?: number;\n /** Initial backoff in ms (default 100) */\n initialDelayMs?: number;\n /** Maximum backoff in ms (default 2000) */\n maxDelayMs?: number;\n /** Status codes that trigger a retry (default 408, 425, 429, 5xx) */\n retryOn?: (status: number) => boolean;\n}\n\nexport interface BreakerConfig {\n /** Consecutive 5xx failures to open breaker (default 5) */\n threshold?: number;\n /** Time in ms before HALF_OPEN trial (default 30000) */\n cooldownMs?: number;\n}\n\nexport interface HttpClientConfig {\n baseUrl?: string;\n defaultTimeoutMs?: number;\n retry?: RetryConfig;\n breaker?: BreakerConfig;\n /** Default headers merged into every request */\n defaultHeaders?: Record<string, string>;\n}\n\ninterface BreakerState {\n failures: number;\n openedAt: number | null;\n state: 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n}\n\nconst breakers = new Map<string, BreakerState>();\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nfunction getBreaker(host: string): BreakerState {\n let b = breakers.get(host);\n if (!b) {\n b = { failures: 0, openedAt: null, state: 'CLOSED' };\n breakers.set(host, b);\n }\n return b;\n}\n\nfunction defaultRetryOn(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599);\n}\n\nfunction jitter(delay: number): number {\n return Math.floor(Math.random() * delay);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nexport class CircuitBreakerOpenError extends Error {\n constructor(host: string) {\n super(`circuit breaker OPEN for host=${host}`);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\nexport interface HttpClientInit extends RequestInit {\n timeoutMs?: number;\n retry?: RetryConfig;\n}\n\n/**\n * Reset all breaker state (test helper).\n */\nexport function __resetHttpClientBreakers(): void {\n breakers.clear();\n}\n\nasync function executeOnce(url: string, init: HttpClientInit, timeoutMs: number): Promise<Response> {\n const signal = init.signal ?? AbortSignal.timeout(timeoutMs);\n return fetch(url, { ...init, signal });\n}\n\nexport async function httpClient(\n url: string,\n init: HttpClientInit = {},\n config: HttpClientConfig = {}\n): Promise<Response> {\n const fullUrl =\n config.baseUrl && !/^https?:\\/\\//i.test(url)\n ? `${config.baseUrl.replace(/\\/$/, '')}/${url.replace(/^\\//, '')}`\n : url;\n const host = hostOf(fullUrl);\n const breaker = getBreaker(host);\n const breakerThreshold = config.breaker?.threshold ?? 5;\n const cooldownMs = config.breaker?.cooldownMs ?? 30_000;\n\n if (breaker.state === 'OPEN') {\n if (breaker.openedAt && Date.now() - breaker.openedAt >= cooldownMs) {\n breaker.state = 'HALF_OPEN';\n logger.info('httpClient.breaker.halfOpen', { host });\n } else {\n throw new CircuitBreakerOpenError(host);\n }\n }\n\n const attempts = init.retry?.attempts ?? config.retry?.attempts ?? 3;\n const initialDelay = init.retry?.initialDelayMs ?? config.retry?.initialDelayMs ?? 100;\n const maxDelay = init.retry?.maxDelayMs ?? config.retry?.maxDelayMs ?? 2_000;\n const retryOn = init.retry?.retryOn ?? config.retry?.retryOn ?? defaultRetryOn;\n const timeoutMs = init.timeoutMs ?? config.defaultTimeoutMs ?? 5_000;\n\n const headers = { ...(config.defaultHeaders ?? {}), ...((init.headers as Record<string, string> | undefined) ?? {}) };\n\n let lastErr: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n const response = await executeOnce(fullUrl, { ...init, headers }, timeoutMs);\n if (response.status >= 500) {\n breaker.failures += 1;\n if (breaker.failures >= breakerThreshold) {\n breaker.state = 'OPEN';\n breaker.openedAt = Date.now();\n logger.warn('httpClient.breaker.open', { host, failures: breaker.failures });\n }\n if (attempt < attempts && retryOn(response.status)) {\n const delay = Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n await sleep(jitter(delay));\n continue;\n }\n return response;\n }\n // success path\n breaker.failures = 0;\n if (breaker.state === 'HALF_OPEN') {\n breaker.state = 'CLOSED';\n breaker.openedAt = null;\n logger.info('httpClient.breaker.closed', { host });\n }\n if (attempt < attempts && retryOn(response.status)) {\n const delay = Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n await sleep(jitter(delay));\n continue;\n }\n return response;\n } catch (err) {\n lastErr = err;\n breaker.failures += 1;\n if (breaker.failures >= breakerThreshold) {\n breaker.state = 'OPEN';\n breaker.openedAt = Date.now();\n logger.warn('httpClient.breaker.open', { host, failures: breaker.failures });\n }\n if (attempt >= attempts) break;\n const delay = Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n await sleep(jitter(delay));\n }\n }\n\n logger.error('httpClient.exhausted', { url: fullUrl, attempts, host });\n throw lastErr instanceof Error ? lastErr : new Error(`httpClient failed: ${String(lastErr)}`);\n}\n\nexport function createHttpClient(\n config: HttpClientConfig = {}\n): (url: string, init?: HttpClientInit) => Promise<Response> {\n return (url: string, init: HttpClientInit = {}) => httpClient(url, init, config);\n}\n","/**\n * Redis-based leader election primitives.\n *\n * Two public entry points share one core (`besdk:leader:{name}` key,\n * `SET NX EX` acquire, Redis-side compare-and-renew / compare-and-delete\n * LUA scripts, per-holder token):\n *\n * - {@link withLeaderLock} — run-once wrapper: acquire, run `fn()` while\n * auto-renewing, release. Resolves `{ acquired: false }` (without running\n * `fn`) when another holder owns the lease.\n * - {@link createLeaderLease} — long-lived, self-renewing lease HANDLE for a\n * continuously-running singleton worker: acquire, auto-renew every\n * `ttlMs/3`, and re-acquire on failover, until `release()`.\n *\n * The Redis client is duck-typed (ioredis-compatible) so consumers can pass\n * either ioredis or any client exposing the same `set`/`eval` shape.\n */\n\nimport { logger } from '../logger/index.js';\n\nexport interface LeaderLockRedis {\n /** ioredis: set(key, val, 'EX', seconds, 'NX') -> 'OK' | null */\n set(key: string, value: string, ex: 'EX', seconds: number, nx: 'NX'): Promise<'OK' | null>;\n /** Redis LUA EVAL for compare-and-delete / compare-and-renew (server-side script) */\n eval(script: string, numKeys: number, ...args: string[]): Promise<unknown>;\n}\n\nexport interface LeaderLockOptions {\n ttlMs: number;\n renewMs?: number;\n}\n\nexport interface LeaderLockResult<T> {\n acquired: boolean;\n result?: T;\n}\n\nconst RELEASE_LUA = `\nif redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"del\", KEYS[1])\nelse\n return 0\nend\n`;\n\nconst RENEW_LUA = `\nif redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"pexpire\", KEYS[1], ARGV[2])\nelse\n return 0\nend\n`;\n\n// ---------------------------------------------------------------------------\n// Shared core primitives (used by BOTH withLeaderLock and createLeaderLease)\n// ---------------------------------------------------------------------------\n\n/** Standard Redis key for a named leader lease. */\nfunction leaderKey(name: string): string {\n return `besdk:leader:${name}`;\n}\n\nfunction generateToken(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}-${process.pid}`;\n}\n\nfunction defaultRenewMs(ttlMs: number): number {\n return Math.max(1_000, Math.floor(ttlMs / 3));\n}\n\n/** Attempt to acquire the lease with `SET key token EX ttl NX`. */\nasync function acquireLease(redis: LeaderLockRedis, key: string, token: string, ttlMs: number): Promise<boolean> {\n const ttlSeconds = Math.max(1, Math.ceil(ttlMs / 1000));\n return (await redis.set(key, token, 'EX', ttlSeconds, 'NX')) === 'OK';\n}\n\n/** Compare-and-renew: extend the lease only if we still own it (Redis-side). */\nasync function renewLease(redis: LeaderLockRedis, key: string, token: string, ttlMs: number): Promise<boolean> {\n return (await redis.eval(RENEW_LUA, 1, key, token, String(ttlMs))) === 1;\n}\n\n/** Compare-and-delete: release the lease only if we still own it (Redis-side). */\nasync function releaseLease(redis: LeaderLockRedis, key: string, token: string): Promise<void> {\n await redis.eval(RELEASE_LUA, 1, key, token);\n}\n\n/**\n * Normalise a Valkey/Redis URL to an ioredis-understood scheme:\n * - `valkeys://…` → `rediss://…` (TLS)\n * - `valkey://…` → `redis://…`\n * Any other scheme (incl. `redis://` / `rediss://`) is returned unchanged.\n *\n * Consumers building the ioredis client they hand to {@link createLeaderLease}\n * or {@link withLeaderLock} should run their `VALKEY_URL`/`REDIS_URL` through\n * this so they can retire their own copy of the same normaliser.\n */\nexport function normalizeRedisUrl(url: string): string {\n if (url.startsWith('valkeys://')) return url.replace(/^valkeys:\\/\\//, 'rediss://');\n if (url.startsWith('valkey://')) return url.replace(/^valkey:\\/\\//, 'redis://');\n return url;\n}\n\n// ---------------------------------------------------------------------------\n// withLeaderLock — run-once wrapper (public behaviour unchanged)\n// ---------------------------------------------------------------------------\n\nexport async function withLeaderLock<T>(\n redis: LeaderLockRedis,\n name: string,\n fn: () => Promise<T>,\n options: LeaderLockOptions\n): Promise<LeaderLockResult<T>> {\n const key = leaderKey(name);\n const token = generateToken();\n const ttlMs = options.ttlMs;\n const renewMs = options.renewMs ?? defaultRenewMs(ttlMs);\n\n const acquired = await acquireLease(redis, key, token, ttlMs);\n if (!acquired) {\n return { acquired: false };\n }\n\n logger.info('leaderLock.acquired', { name, token, ttlMs });\n\n let stopped = false;\n const renewTimer = setInterval(() => {\n if (stopped) return;\n renewLease(redis, key, token, ttlMs).catch((err: unknown) => {\n logger.warn('leaderLock.renew.failed', { name, err: String(err) });\n });\n }, renewMs);\n // Don't keep the process alive just for this timer.\n if (typeof (renewTimer as unknown as { unref?: () => void }).unref === 'function') {\n (renewTimer as unknown as { unref: () => void }).unref();\n }\n\n try {\n const result = await fn();\n return { acquired: true, result };\n } finally {\n stopped = true;\n clearInterval(renewTimer);\n try {\n await releaseLease(redis, key, token);\n logger.info('leaderLock.released', { name, token });\n } catch (err) {\n logger.warn('leaderLock.release.failed', { name, err: String(err) });\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// createLeaderLease — long-lived, self-renewing lease handle\n// ---------------------------------------------------------------------------\n\nexport interface CreateLeaderLeaseOptions {\n /** Logical lease name; becomes the `besdk:leader:{name}` Redis key. */\n name: string;\n /** Lease length in ms. Auto-renew keeps the lease alive within this window. */\n ttlMs: number;\n /**\n * ioredis-shaped client used for lease coordination — the same shape\n * {@link withLeaderLock} requires (`set(key, val, 'EX', secs, 'NX')` +\n * `eval(script, numKeys, ...args)`). Build it from a `normalizeRedisUrl`-d\n * `VALKEY_URL`/`REDIS_URL`.\n */\n redis: LeaderLockRedis;\n /** Auto-renew cadence in ms. Default: `max(1000, ttlMs/3)`. */\n renewMs?: number;\n}\n\nexport interface LeaderLease {\n /**\n * Acquire the lease if free, or renew it if already held. Resolves to whether\n * THIS handle currently holds the lease. The first call is the initial\n * acquire; the background timer keeps calling this until {@link release}.\n */\n renew(): Promise<boolean>;\n /** Stop auto-renewing and release the lease (only if still owned). */\n release(): Promise<void>;\n /** Whether this handle currently holds the lease (local, no Redis round-trip). */\n isHeld(): boolean;\n}\n\n/**\n * Create a self-renewing leader lease for a continuously-running singleton\n * worker. On creation an auto-renew timer starts (`renewMs`, default `ttlMs/3`,\n * unref'd) that acquires-if-free / renews-if-held — so a replica that starts as\n * a follower automatically takes over when the current holder dies and its\n * lease expires. Call `renew()` once up front to acquire deterministically:\n *\n * ```ts\n * const lease = createLeaderLease({ name: 'notification-sweep', ttlMs: 90_000, redis });\n * if (await lease.renew()) startWorker(); // became leader\n * // ...auto-renews in the background...\n * await lease.release(); // on graceful shutdown\n * ```\n */\nexport function createLeaderLease(options: CreateLeaderLeaseOptions): LeaderLease {\n const { name, ttlMs, redis } = options;\n const key = leaderKey(name);\n const token = generateToken();\n const renewMs = options.renewMs ?? defaultRenewMs(ttlMs);\n\n let held = false;\n let released = false;\n let inFlight: Promise<boolean> | null = null;\n\n const acquireOrRenew = async (): Promise<boolean> => {\n if (released) return false;\n try {\n if (held) {\n if (await renewLease(redis, key, token, ttlMs)) {\n return true;\n }\n // Lost the lease (expired, or claimed by another holder). Fall through\n // and try a fresh acquire — this is the failover path.\n held = false;\n }\n const acquired = await acquireLease(redis, key, token, ttlMs);\n if (acquired && !held) {\n logger.info('leaderLease.acquired', { name, token, ttlMs });\n }\n held = acquired;\n return held;\n } catch (err) {\n logger.warn('leaderLease.renew.failed', { name, err: String(err) });\n return held;\n }\n };\n\n // Coalesce overlapping attempts (background tick vs. an explicit renew())\n // so the local `held` flag can't be updated by two races at once.\n const runAttempt = (): Promise<boolean> => {\n if (inFlight) return inFlight;\n const attempt = acquireOrRenew().finally(() => {\n if (inFlight === attempt) inFlight = null;\n });\n inFlight = attempt;\n return attempt;\n };\n\n const timer = setInterval(() => {\n if (released) return;\n void runAttempt();\n }, renewMs);\n // Don't keep the process alive just for this timer.\n if (typeof (timer as unknown as { unref?: () => void }).unref === 'function') {\n (timer as unknown as { unref: () => void }).unref();\n }\n\n return {\n renew(): Promise<boolean> {\n return runAttempt();\n },\n async release(): Promise<void> {\n if (released) return;\n released = true;\n clearInterval(timer);\n if (inFlight) {\n try {\n await inFlight;\n } catch {\n // ignore — we're releasing anyway\n }\n }\n if (!held) return;\n held = false;\n try {\n await releaseLease(redis, key, token);\n logger.info('leaderLease.released', { name, token });\n } catch (err) {\n logger.warn('leaderLease.release.failed', { name, err: String(err) });\n }\n },\n isHeld(): boolean {\n return held && !released;\n },\n };\n}\n","/**\n * rateLimitIncr — atomic INCR-based rate limit using EXPIRE NX.\n *\n * Strategy:\n * 1. INCR key\n * 2. If returned value === 1 (i.e. first increment), EXPIRE key with windowMs\n * 3. Compute remaining + resetAt\n *\n * This is two round-trips in the worst case. A future Lua/EVALSHA variant\n * can collapse it into a single round-trip; the public API is stable.\n *\n * Returns `allowed=false` if `count > limit`. The key is `besdk:rl:{key}`.\n */\n\nexport interface RateLimitRedis {\n incr(key: string): Promise<number>;\n pexpire(key: string, ms: number): Promise<number | 'OK'>;\n pttl(key: string): Promise<number>;\n}\n\nexport interface RateLimitInput {\n key: string;\n limit: number;\n windowMs: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n count: number;\n remaining: number;\n resetAt: number;\n}\n\nexport async function rateLimitIncr(redis: RateLimitRedis, input: RateLimitInput): Promise<RateLimitResult> {\n const fullKey = `besdk:rl:${input.key}`;\n const count = await redis.incr(fullKey);\n if (count === 1) {\n await redis.pexpire(fullKey, input.windowMs);\n }\n let ttl = -1;\n try {\n ttl = await redis.pttl(fullKey);\n } catch {\n ttl = input.windowMs;\n }\n const resetAt = Date.now() + (ttl > 0 ? ttl : input.windowMs);\n const remaining = Math.max(0, input.limit - count);\n return {\n allowed: count <= input.limit,\n count,\n remaining,\n resetAt,\n };\n}\n","/**\n * Paginator — Relay-style cursor pagination + safe limit clamping.\n *\n * Use `clampLimit` at resolver entry to enforce sane defaults/maxes.\n * Use `paginate` to translate a Relay-style { first, after } into a\n * Prisma-ready { take, skip, cursor } and return a connection-shaped\n * result.\n */\n\nexport interface ClampLimitOptions {\n defaultLimit?: number;\n maxLimit?: number;\n minLimit?: number;\n}\n\nexport const DEFAULT_GRAPHQL_PAGE_LIMIT = 50;\nexport const MAX_GRAPHQL_PAGE_LIMIT = 100;\n\nexport function clampLimit(input: number | undefined | null, opts: ClampLimitOptions = {}): number {\n const def = opts.defaultLimit ?? 50;\n const max = opts.maxLimit ?? 200;\n const min = opts.minLimit ?? 1;\n if (input == null || Number.isNaN(input)) return def;\n return Math.min(Math.max(Math.floor(input), min), max);\n}\n\nexport function clampOffset(input: number | undefined | null): number {\n if (input == null || Number.isNaN(input)) return 0;\n return Math.max(0, Math.floor(input));\n}\n\nexport function clampGraphqlLimit(input: number | undefined | null, opts: ClampLimitOptions = {}): number {\n return clampLimit(input, {\n defaultLimit: opts.defaultLimit ?? DEFAULT_GRAPHQL_PAGE_LIMIT,\n maxLimit: opts.maxLimit ?? MAX_GRAPHQL_PAGE_LIMIT,\n minLimit: opts.minLimit ?? 1,\n });\n}\n\nexport interface OffsetPaginationInput {\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface NormalizedOffsetPagination {\n limit: number;\n offset: number;\n}\n\nexport function normalizeOffsetPagination(\n input: OffsetPaginationInput | null | undefined,\n opts: ClampLimitOptions = {}\n): NormalizedOffsetPagination {\n return {\n limit: clampGraphqlLimit(input?.limit, opts),\n offset: clampOffset(input?.offset),\n };\n}\n\nexport interface CursorPaginationInput {\n first?: number | null;\n after?: string | null;\n}\n\nexport interface NormalizedCursorPagination {\n first: number;\n after: string | null;\n take: number;\n}\n\nexport function normalizeCursorPagination(\n input: CursorPaginationInput | null | undefined,\n opts: ClampLimitOptions = {}\n): NormalizedCursorPagination {\n const first = clampGraphqlLimit(input?.first, opts);\n const after = typeof input?.after === 'string' && input.after.trim().length > 0 ? input.after : null;\n return { first, after, take: first + 1 };\n}\n\nexport type CursorPayloadValue = string | number | boolean | null;\nexport type CursorPayload = Record<string, CursorPayloadValue>;\n\nexport function encodeCursor(payload: CursorPayload): string {\n return Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url');\n}\n\nexport function decodeCursor(cursor: string | null | undefined): CursorPayload | null {\n if (typeof cursor !== 'string' || cursor.trim().length === 0) return null;\n\n try {\n const decoded: unknown = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));\n if (decoded == null || typeof decoded !== 'object' || Array.isArray(decoded)) return null;\n\n const payload: CursorPayload = {};\n for (const [key, value] of Object.entries(decoded)) {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || value == null) {\n payload[key] = value;\n }\n }\n\n return Object.keys(payload).length > 0 ? payload : null;\n } catch {\n return null;\n }\n}\n\nexport interface PageInfo {\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n startCursor: string | null;\n endCursor: string | null;\n}\n\nexport interface ConnectionEdge<TItem> {\n node: TItem;\n cursor: string;\n}\n\nexport interface ConnectionResult<TItem> {\n edges: ConnectionEdge<TItem>[];\n nodes: TItem[];\n pageInfo: PageInfo;\n totalCount?: number | null;\n}\n\nexport interface BuildConnectionOptions<TItem> {\n limit: number;\n cursorForNode: (item: TItem) => string;\n hasPreviousPage?: boolean;\n totalCount?: number | null;\n}\n\nexport function buildConnection<TItem>(items: TItem[], opts: BuildConnectionOptions<TItem>): ConnectionResult<TItem> {\n const nodes = items.length > opts.limit ? items.slice(0, opts.limit) : items;\n const edges = nodes.map((node) => ({ node, cursor: opts.cursorForNode(node) }));\n const firstEdge = edges[0];\n const lastEdge = edges.at(-1);\n\n return {\n edges,\n nodes,\n pageInfo: {\n hasNextPage: items.length > opts.limit,\n hasPreviousPage: opts.hasPreviousPage ?? false,\n startCursor: firstEdge?.cursor ?? null,\n endCursor: lastEdge?.cursor ?? null,\n },\n totalCount: opts.totalCount,\n };\n}\n\nexport interface OffsetPageResult<TItem> {\n items: TItem[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n nextOffset: number | null;\n}\n\nexport function buildOffsetPage<TItem>(\n items: TItem[],\n total: number,\n pagination: NormalizedOffsetPagination\n): OffsetPageResult<TItem> {\n const nextOffset = pagination.offset + items.length;\n const hasMore = nextOffset < total;\n\n return {\n items,\n total,\n limit: pagination.limit,\n offset: pagination.offset,\n hasMore,\n nextOffset: hasMore ? nextOffset : null,\n };\n}\n\n// ============================================================================\n// Prisma convenience helpers\n// ============================================================================\n\n/**\n * Convert a normalized offset pagination result to Prisma's `take`/`skip` args.\n *\n * ```ts\n * const pg = normalizeOffsetPagination(args);\n * const rows = await prisma.tag.findMany({ ...toPrismaPage(pg), where });\n * ```\n *\n * `limit` is clamped to MAX_GRAPHQL_PAGE_LIMIT (100) by `normalizeOffsetPagination`.\n * Always call normalizeOffsetPagination first — never pass a raw limit directly.\n */\nexport function toPrismaPage(pagination: NormalizedOffsetPagination): { take: number; skip: number } {\n return { take: pagination.limit, skip: pagination.offset };\n}\n\nexport interface PaginateInput<TWhere, TOrderBy> {\n take?: number | null;\n cursor?: string | null;\n where?: TWhere;\n orderBy?: TOrderBy;\n}\n\nexport interface PaginateResult<TItem> {\n items: TItem[];\n hasMore: boolean;\n nextCursor: string | null;\n}\n\nexport interface PrismaModelLike<TItem, TWhere, TOrderBy> {\n findMany(args: {\n take?: number;\n skip?: number;\n cursor?: { id: string };\n where?: TWhere;\n orderBy?: TOrderBy;\n }): Promise<TItem[]>;\n}\n\nexport async function paginate<TItem extends { id: string }, TWhere = unknown, TOrderBy = unknown>(\n model: PrismaModelLike<TItem, TWhere, TOrderBy>,\n input: PaginateInput<TWhere, TOrderBy>,\n opts: ClampLimitOptions = {}\n): Promise<PaginateResult<TItem>> {\n // Use GraphQL-aware cap (max=100) so paginate() is safe to call directly from resolvers.\n const take = clampGraphqlLimit(input.take ?? undefined, opts);\n // fetch +1 to detect hasMore\n const items = await model.findMany({\n take: take + 1,\n skip: input.cursor ? 1 : 0,\n cursor: input.cursor ? { id: input.cursor } : undefined,\n where: input.where,\n orderBy: input.orderBy,\n });\n const hasMore = items.length > take;\n const trimmed = hasMore ? items.slice(0, take) : items;\n const nextCursor = hasMore && trimmed.length > 0 ? (trimmed[trimmed.length - 1] as { id: string }).id : null;\n return { items: trimmed, hasMore, nextCursor };\n}\n","/**\n * DataLoaderFactory — per-request DataLoader collection.\n *\n * Each GraphQL request creates a fresh loader set scoped to its context\n * (db, workspaceId, requestId). Loaders are addressed by name and reused\n * within the request to coalesce N+1 fan-outs into a single batched query.\n *\n * Also ships `resolveReferenceLoader` — a convenience for Apollo Federation\n * `__resolveReference` resolvers so entity hydration stays N+1-free.\n *\n * This module is intentionally framework-agnostic; consumers may pair it\n * with the existing `SimpleDataLoader` in `src/dataloader/index.ts` or the\n * upstream `dataloader` npm package.\n */\n\nexport interface DataLoaderLike<K, V> {\n load(key: K): Promise<V>;\n loadMany(keys: readonly K[]): Promise<(V | Error)[]>;\n clear(key: K): this;\n clearAll(): this;\n prime(key: K, value: V): this;\n}\n\nexport type LoaderMap = Record<string, DataLoaderLike<unknown, unknown>>;\n\nexport type LoaderBuilder<Ctx, M extends LoaderMap> = (ctx: Ctx) => M;\n\n/**\n * Build a fresh loader collection from a context.\n *\n * @example\n * const loaders = buildLoaders(ctx, (c) => ({\n * userById: createSimpleLoader(async ids => c.db.user.findMany({ where: { id: { in: [...ids] } } }), u => u.id),\n * tagById: createSimpleLoader(...),\n * }));\n * await loaders.userById.load('user-123');\n */\nexport function buildLoaders<Ctx, M extends LoaderMap>(ctx: Ctx, builder: LoaderBuilder<Ctx, M>): M {\n return builder(ctx);\n}\n\n/**\n * `__resolveReference` helper for Apollo Federation.\n *\n * Given a context that contains a `loaders` map, returns a resolver\n * function bound to a specific loader name. Field references shaped as\n * `{ id: string }` (or `{ __keyField: string }`) are forwarded to\n * `loader.load(...)`.\n */\nexport interface ReferenceObject {\n id?: string;\n [key: string]: unknown;\n}\n\nexport function resolveReferenceLoader<T, Ctx extends { loaders: LoaderMap }>(\n loaderName: string,\n keyField: string = 'id'\n): (reference: ReferenceObject, ctx: Ctx) => Promise<T | null> {\n return async (reference, ctx) => {\n const loader = ctx.loaders[loaderName] as DataLoaderLike<string, T> | undefined;\n if (!loader) {\n throw new Error(`resolveReferenceLoader: loader \"${loaderName}\" not found on ctx.loaders`);\n }\n const key = reference[keyField];\n if (typeof key !== 'string') {\n return null;\n }\n return loader.load(key);\n };\n}\n","/**\n * Versioned-key cache invalidation helper.\n *\n * Pattern:\n * - Store `v:{namespace}` integer in Redis\n * - Compose keys as `${namespace}:v${ver}:${rest}`\n * - Invalidate via INCR `v:{namespace}` — no KEYS / SCAN required\n *\n * Use this instead of cacheClearPattern() for Azure Managed Redis (O(N)\n * blocking on KEYS is unsafe in prod).\n */\n\nexport interface CacheVersionRedis {\n get(key: string): Promise<string | null>;\n incr(key: string): Promise<number>;\n}\n\nconst VERSION_PREFIX = 'besdk:cv:';\n\nexport async function getNamespaceVersion(redis: CacheVersionRedis, namespace: string): Promise<number> {\n const v = await redis.get(`${VERSION_PREFIX}${namespace}`);\n if (!v) return 1;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) && n > 0 ? n : 1;\n}\n\nexport async function buildCacheKey(redis: CacheVersionRedis, namespace: string, ...parts: string[]): Promise<string> {\n const ver = await getNamespaceVersion(redis, namespace);\n return `${namespace}:v${ver}:${parts.join(':')}`;\n}\n\nexport async function invalidateNamespace(redis: CacheVersionRedis, namespace: string): Promise<number> {\n return redis.incr(`${VERSION_PREFIX}${namespace}`);\n}\n","/**\n * PG declarative partition + retention DSL.\n *\n * Helpers:\n * - ensureMonthlyPartitions(prisma, { table, from, to })\n * - dropOldPartitions(prisma, { table, beforeDate })\n *\n * Used by retention jobs / migrations to keep append-only tables\n * (ActivityLog, Message, TrackingEvent, ApplicationUsage, AuditLog)\n * bounded. Caller is responsible for ensuring the parent table is\n * already declared as PARTITION BY RANGE (created_at).\n */\n\nexport interface PrismaRawClient {\n $executeRawUnsafe(query: string, ...values: unknown[]): Promise<unknown>;\n $queryRawUnsafe<T = unknown>(query: string, ...values: unknown[]): Promise<T>;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\nexport function monthlyPartitionName(table: string, year: number, month: number): string {\n return `${table}_y${year}m${pad2(month)}`;\n}\n\nexport interface EnsureMonthlyOptions {\n table: string;\n from: Date;\n to: Date;\n}\n\nexport async function ensureMonthlyPartitions(prisma: PrismaRawClient, opts: EnsureMonthlyOptions): Promise<string[]> {\n const created: string[] = [];\n const cur = new Date(Date.UTC(opts.from.getUTCFullYear(), opts.from.getUTCMonth(), 1));\n const end = new Date(Date.UTC(opts.to.getUTCFullYear(), opts.to.getUTCMonth(), 1));\n while (cur <= end) {\n const y = cur.getUTCFullYear();\n const m = cur.getUTCMonth() + 1;\n const next = new Date(Date.UTC(y, m, 1));\n const partition = monthlyPartitionName(opts.table, y, m);\n const lower = `${y}-${pad2(m)}-01`;\n const upper = `${next.getUTCFullYear()}-${pad2(next.getUTCMonth() + 1)}-01`;\n await prisma.$executeRawUnsafe(\n `CREATE TABLE IF NOT EXISTS \"${partition}\" PARTITION OF \"${opts.table}\" FOR VALUES FROM ('${lower}') TO ('${upper}');`\n );\n created.push(partition);\n cur.setUTCMonth(cur.getUTCMonth() + 1);\n }\n return created;\n}\n\nexport interface DropOldOptions {\n table: string;\n beforeDate: Date;\n}\n\ninterface PartitionRow {\n partition_name: string;\n}\n\nexport async function dropOldPartitions(prisma: PrismaRawClient, opts: DropOldOptions): Promise<string[]> {\n // Find inherited tables of the parent, parse year/month from suffix, drop ones before threshold.\n const rows = await prisma.$queryRawUnsafe<PartitionRow[]>(\n `SELECT child.relname AS partition_name\n FROM pg_inherits\n JOIN pg_class parent ON pg_inherits.inhparent = parent.oid\n JOIN pg_class child ON pg_inherits.inhrelid = child.oid\n WHERE parent.relname = $1`,\n opts.table\n );\n const dropped: string[] = [];\n const cutoffYear = opts.beforeDate.getUTCFullYear();\n const cutoffMonth = opts.beforeDate.getUTCMonth() + 1;\n for (const row of rows) {\n const partitionRe = /_y(\\d{4})m(\\d{2})$/;\n const m = partitionRe.exec(row.partition_name);\n if (!m) continue;\n const y = Number(m[1]);\n const mo = Number(m[2]);\n if (y < cutoffYear || (y === cutoffYear && mo < cutoffMonth)) {\n await prisma.$executeRawUnsafe(`DROP TABLE IF EXISTS \"${row.partition_name}\";`);\n dropped.push(row.partition_name);\n }\n }\n return dropped;\n}\n","/**\n * Multi-provider LLM wrapper with timeout, retries, jitter, provider\n * fallback chain, token cap, and streaming passthrough.\n *\n * No hard dependency on a specific SDK — consumers register adapters.\n * Provider chain order is controlled by env `LLM_PROVIDER_CHAIN`\n * (comma-separated, e.g. `anthropic,openai,openrouter`).\n *\n * The wrapper is intentionally minimal — callers should construct it\n * once at boot, register adapters, and inject the singleton.\n */\n\nimport { logger } from '../logger/index.js';\n\nexport interface LLMRequest {\n model?: string;\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>;\n maxTokens?: number;\n temperature?: number;\n stream?: boolean;\n /** Override timeout for this request. */\n timeoutMs?: number;\n}\n\nexport interface LLMResponse {\n provider: string;\n content: string;\n inputTokens?: number;\n outputTokens?: number;\n raw?: unknown;\n}\n\nexport interface LLMProviderAdapter {\n name: string;\n complete(req: LLMRequest, signal: AbortSignal): Promise<LLMResponse>;\n}\n\nexport interface LLMRouterOptions {\n /** Default per-attempt timeout (ms). */\n timeoutMs?: number;\n /** Max attempts across providers. */\n maxAttempts?: number;\n /** Initial backoff (ms). */\n initialDelayMs?: number;\n /** Hard cap on output tokens regardless of caller request. */\n maxOutputTokensCap?: number;\n}\n\nconst DEFAULTS: Required<LLMRouterOptions> = {\n timeoutMs: 30_000,\n maxAttempts: 3,\n initialDelayMs: 500,\n maxOutputTokensCap: 4096,\n};\n\nfunction jitter(n: number): number {\n return Math.floor(Math.random() * n);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nexport class LLMRouter {\n private readonly adapters: Map<string, LLMProviderAdapter> = new Map();\n private readonly opts: Required<LLMRouterOptions>;\n\n constructor(opts: LLMRouterOptions = {}) {\n this.opts = { ...DEFAULTS, ...opts };\n }\n\n register(adapter: LLMProviderAdapter): void {\n this.adapters.set(adapter.name, adapter);\n }\n\n private resolveChain(): string[] {\n const envChain = process.env['LLM_PROVIDER_CHAIN']?.trim();\n if (envChain) {\n return envChain\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return Array.from(this.adapters.keys());\n }\n\n async complete(req: LLMRequest): Promise<LLMResponse> {\n const cappedReq: LLMRequest = {\n ...req,\n maxTokens: Math.min(req.maxTokens ?? this.opts.maxOutputTokensCap, this.opts.maxOutputTokensCap),\n };\n const chain = this.resolveChain();\n if (chain.length === 0) {\n throw new Error('LLMRouter: no providers registered');\n }\n\n let lastErr: unknown = null;\n for (let attempt = 0; attempt < this.opts.maxAttempts; attempt++) {\n const providerName = chain[attempt % chain.length];\n const adapter = providerName ? this.adapters.get(providerName) : undefined;\n if (!adapter) {\n logger.warn('llmRouter.provider.notRegistered', { providerName });\n continue;\n }\n const timeoutMs = req.timeoutMs ?? this.opts.timeoutMs;\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), timeoutMs);\n try {\n const response = await adapter.complete(cappedReq, ctrl.signal);\n return response;\n } catch (err) {\n lastErr = err;\n logger.warn('llmRouter.attempt.failed', { provider: adapter.name, attempt, err: String(err) });\n if (attempt < this.opts.maxAttempts - 1) {\n const delay = this.opts.initialDelayMs * 2 ** attempt;\n await sleep(jitter(delay));\n }\n } finally {\n clearTimeout(t);\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error(`LLMRouter exhausted ${this.opts.maxAttempts} attempts`);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { configureResourceCaps } from './chunk-KUM4N4CO.js';
2
- import { GatewayClient } from './chunk-U77L54IQ.js';
2
+ import { GatewayClient } from './chunk-ZVZ4RAIH.js';
3
3
  import { LayerManager } from './chunk-7UJXIX4I.js';
4
4
  import { logger } from './chunk-CBZNP6RF.js';
5
5
  import { __export, __name } from './chunk-XE4OXN2W.js';
@@ -259,5 +259,5 @@ async function initializeLayerStreams(config) {
259
259
  __name(initializeLayerStreams, "initializeLayerStreams");
260
260
 
261
261
  export { getSDKState, init_exports, initializeBurdenoffSDK, isSDKInitialized, resetSDK };
262
- //# sourceMappingURL=chunk-JCBYU5BE.js.map
263
- //# sourceMappingURL=chunk-JCBYU5BE.js.map
262
+ //# sourceMappingURL=chunk-YH6PCW6L.js.map
263
+ //# sourceMappingURL=chunk-YH6PCW6L.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","configureResourceCaps","transport","query","variables","options","timeout","skipRetry","skipCircuitBreaker","response","internalQuery","crossLayerQuery","data","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-JCBYU5BE.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 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 configureResourceCaps({\n transport: async (query, variables) => {\n // Cap checks run on entity-create paths and ALWAYS fall back to the\n // free tier on failure, so a billing outage must degrade fast rather\n // than stall writes. Bound the lookup with a short timeout and no\n // retries instead of the gateway defaults (~30s × 3 ≈ 90s). Results\n // are cached 60s, so healthy lookups rarely hit the gateway anyway.\n // `skipCircuitBreaker` keeps this best-effort probe OUT of the shared\n // gateway circuit: its failures already degrade to the fallback here,\n // so they must not count toward opening the internal/cross-layer\n // circuit and fail-fast unrelated M2M calls 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 });\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","configureResourceCaps","transport","query","variables","options","timeout","skipRetry","skipCircuitBreaker","response","internalQuery","crossLayerQuery","data","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-YH6PCW6L.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 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 configureResourceCaps({\n transport: async (query, variables) => {\n // Cap checks run on entity-create paths and ALWAYS fall back to the\n // free tier on failure, so a billing outage must degrade fast rather\n // than stall writes. Bound the lookup with a short timeout and no\n // retries instead of the gateway defaults (~30s × 3 ≈ 90s). Results\n // are cached 60s, so healthy lookups rarely hit the gateway anyway.\n // `skipCircuitBreaker` keeps this best-effort probe OUT of the shared\n // gateway circuit: its failures already degrade to the fallback here,\n // so they must not count toward opening the internal/cross-layer\n // circuit and fail-fast unrelated M2M calls 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 });\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,4 +1,4 @@
1
- import { security_exports } from './chunk-KKJPFKO5.js';
1
+ import { security_exports } from './chunk-QMDYY6GJ.js';
2
2
  import { LayerManager } from './chunk-7UJXIX4I.js';
3
3
  import { signServiceJwt } from './chunk-VFCMR5GX.js';
4
4
  import { ContextManager } from './chunk-RZOFS2BQ.js';
@@ -522,5 +522,5 @@ function createGatewayClientFromEnv() {
522
522
  __name(createGatewayClientFromEnv, "createGatewayClientFromEnv");
523
523
 
524
524
  export { CircuitState, GatewayClient, GatewayError, GatewayErrorType, createGatewayClient, createGatewayClientFromEnv, gateway_exports };
525
- //# sourceMappingURL=chunk-U77L54IQ.js.map
526
- //# sourceMappingURL=chunk-U77L54IQ.js.map
525
+ //# sourceMappingURL=chunk-ZVZ4RAIH.js.map
526
+ //# sourceMappingURL=chunk-ZVZ4RAIH.js.map