@burdenoff/be-sdk 2026.825.7 → 2026.825.9

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 (120) hide show
  1. package/dist/EventQueueFactory-J2XXPYXH.js +7 -0
  2. package/dist/{EventQueueFactory-ELT7NDXK.js.map → EventQueueFactory-J2XXPYXH.js.map} +1 -1
  3. package/dist/auth/index.js +2 -2
  4. package/dist/cache/index.js +3 -3
  5. package/dist/{chunk-AW6JUXCU.js → chunk-3UQMAUX4.js} +4 -4
  6. package/dist/{chunk-AW6JUXCU.js.map → chunk-3UQMAUX4.js.map} +1 -1
  7. package/dist/{chunk-N3YN6ZII.js → chunk-5JNHVKHG.js} +3 -3
  8. package/dist/{chunk-N3YN6ZII.js.map → chunk-5JNHVKHG.js.map} +1 -1
  9. package/dist/{chunk-7UJXIX4I.js → chunk-5NT2OEDQ.js} +3 -3
  10. package/dist/{chunk-7UJXIX4I.js.map → chunk-5NT2OEDQ.js.map} +1 -1
  11. package/dist/{chunk-OQLDXOZ3.js → chunk-6GL4SLU7.js} +3 -3
  12. package/dist/{chunk-OQLDXOZ3.js.map → chunk-6GL4SLU7.js.map} +1 -1
  13. package/dist/{chunk-L3QCRJOA.js → chunk-74Y5YD3U.js} +7 -7
  14. package/dist/{chunk-L3QCRJOA.js.map → chunk-74Y5YD3U.js.map} +1 -1
  15. package/dist/{chunk-NVVWSOY7.js → chunk-AX3UF33H.js} +3 -3
  16. package/dist/{chunk-NVVWSOY7.js.map → chunk-AX3UF33H.js.map} +1 -1
  17. package/dist/{chunk-Z3O32BW6.js → chunk-CPLFP5JK.js} +3 -3
  18. package/dist/{chunk-Z3O32BW6.js.map → chunk-CPLFP5JK.js.map} +1 -1
  19. package/dist/{chunk-XD5ZK727.js → chunk-DS3YMJ4X.js} +3 -3
  20. package/dist/{chunk-XD5ZK727.js.map → chunk-DS3YMJ4X.js.map} +1 -1
  21. package/dist/{chunk-2HANKZZM.js → chunk-ELU7VL3E.js} +3 -3
  22. package/dist/{chunk-2HANKZZM.js.map → chunk-ELU7VL3E.js.map} +1 -1
  23. package/dist/{chunk-KESVEZB2.js → chunk-FA5ROGTS.js} +3 -3
  24. package/dist/{chunk-KESVEZB2.js.map → chunk-FA5ROGTS.js.map} +1 -1
  25. package/dist/{chunk-WFVLQELZ.js → chunk-FYH5IAPR.js} +6 -6
  26. package/dist/{chunk-WFVLQELZ.js.map → chunk-FYH5IAPR.js.map} +1 -1
  27. package/dist/{chunk-RXMOV3YE.js → chunk-GJWQK3IU.js} +3 -3
  28. package/dist/{chunk-RXMOV3YE.js.map → chunk-GJWQK3IU.js.map} +1 -1
  29. package/dist/{chunk-TORD32GS.js → chunk-INAZ3PKF.js} +3 -3
  30. package/dist/{chunk-TORD32GS.js.map → chunk-INAZ3PKF.js.map} +1 -1
  31. package/dist/{chunk-UJG32VIP.js → chunk-IUJSIXMM.js} +3 -3
  32. package/dist/{chunk-UJG32VIP.js.map → chunk-IUJSIXMM.js.map} +1 -1
  33. package/dist/{chunk-VI4VSNTI.js → chunk-KJOSPVB2.js} +3 -3
  34. package/dist/{chunk-VI4VSNTI.js.map → chunk-KJOSPVB2.js.map} +1 -1
  35. package/dist/{chunk-UM32ZA3G.js → chunk-KMNSVLDS.js} +5 -5
  36. package/dist/{chunk-UM32ZA3G.js.map → chunk-KMNSVLDS.js.map} +1 -1
  37. package/dist/{chunk-VBXPFYZ5.js → chunk-KO2ZXZ7W.js} +3 -3
  38. package/dist/{chunk-VBXPFYZ5.js.map → chunk-KO2ZXZ7W.js.map} +1 -1
  39. package/dist/{chunk-VDYBUTFI.js → chunk-KW55Q6TA.js} +5 -5
  40. package/dist/{chunk-VDYBUTFI.js.map → chunk-KW55Q6TA.js.map} +1 -1
  41. package/dist/{chunk-OCYZEBOL.js → chunk-L5TDUAFN.js} +3 -3
  42. package/dist/{chunk-OCYZEBOL.js.map → chunk-L5TDUAFN.js.map} +1 -1
  43. package/dist/{chunk-S7LWYERE.js → chunk-LKCBI6B2.js} +3 -3
  44. package/dist/{chunk-S7LWYERE.js.map → chunk-LKCBI6B2.js.map} +1 -1
  45. package/dist/{chunk-LGTQ26Z2.js → chunk-MEA4BQNA.js} +3 -3
  46. package/dist/{chunk-LGTQ26Z2.js.map → chunk-MEA4BQNA.js.map} +1 -1
  47. package/dist/{chunk-QLVKMWFA.js → chunk-MWPYA2HD.js} +3 -3
  48. package/dist/{chunk-QLVKMWFA.js.map → chunk-MWPYA2HD.js.map} +1 -1
  49. package/dist/{chunk-XWVP4MC6.js → chunk-MZCBEJ67.js} +3 -3
  50. package/dist/{chunk-XWVP4MC6.js.map → chunk-MZCBEJ67.js.map} +1 -1
  51. package/dist/{chunk-URDYOM2L.js → chunk-QJN4K7LD.js} +4 -4
  52. package/dist/{chunk-URDYOM2L.js.map → chunk-QJN4K7LD.js.map} +1 -1
  53. package/dist/{chunk-CBZNP6RF.js → chunk-RU266375.js} +48 -7
  54. package/dist/chunk-RU266375.js.map +1 -0
  55. package/dist/{chunk-A6DGEZJ4.js → chunk-UD5PPGVU.js} +3 -3
  56. package/dist/{chunk-A6DGEZJ4.js.map → chunk-UD5PPGVU.js.map} +1 -1
  57. package/dist/{chunk-JNJSSBKO.js → chunk-UFXHLQ2T.js} +5 -5
  58. package/dist/{chunk-JNJSSBKO.js.map → chunk-UFXHLQ2T.js.map} +1 -1
  59. package/dist/{chunk-F5SGJ6VS.js → chunk-UNASM5VJ.js} +3 -3
  60. package/dist/{chunk-F5SGJ6VS.js.map → chunk-UNASM5VJ.js.map} +1 -1
  61. package/dist/{chunk-5LXDPGDH.js → chunk-VAT66FJA.js} +3 -3
  62. package/dist/{chunk-5LXDPGDH.js.map → chunk-VAT66FJA.js.map} +1 -1
  63. package/dist/{chunk-7E76FL2C.js → chunk-XCQN6GH7.js} +18 -10
  64. package/dist/chunk-XCQN6GH7.js.map +1 -0
  65. package/dist/{chunk-4X5WL6I3.js → chunk-XYWLCNJH.js} +5 -5
  66. package/dist/{chunk-4X5WL6I3.js.map → chunk-XYWLCNJH.js.map} +1 -1
  67. package/dist/{chunk-MX4AHK3E.js → chunk-YAQ7GNAC.js} +6 -6
  68. package/dist/{chunk-MX4AHK3E.js.map → chunk-YAQ7GNAC.js.map} +1 -1
  69. package/dist/{chunk-RNR45JQH.js → chunk-YK7C5DU6.js} +3 -3
  70. package/dist/{chunk-RNR45JQH.js.map → chunk-YK7C5DU6.js.map} +1 -1
  71. package/dist/{chunk-IC7YDBGE.js → chunk-YNDJQRI3.js} +3 -3
  72. package/dist/{chunk-IC7YDBGE.js.map → chunk-YNDJQRI3.js.map} +1 -1
  73. package/dist/{chunk-WCJIZR5Q.js → chunk-Z5BURBFZ.js} +3 -3
  74. package/dist/{chunk-WCJIZR5Q.js.map → chunk-Z5BURBFZ.js.map} +1 -1
  75. package/dist/client/internal-client.js +2 -2
  76. package/dist/database/index.js +2 -2
  77. package/dist/event-queue/index.js +6 -6
  78. package/dist/export/index.js +5 -5
  79. package/dist/feature-flags/index.js +2 -2
  80. package/dist/gateway/index.js +4 -4
  81. package/dist/gateway/security/index.js +2 -2
  82. package/dist/graph/index.js +8 -8
  83. package/dist/graphql/index.js +4 -4
  84. package/dist/graphql/services/index.js +2 -2
  85. package/dist/i18n/index.js +2 -2
  86. package/dist/{index-BtpoFSLa.d.ts → index-BLWIKXin.d.ts} +1 -1
  87. package/dist/{index-C0qWSC_Q.d.ts → index-hWpL68Vx.d.ts} +4 -2
  88. package/dist/index.d.ts +3 -3
  89. package/dist/index.js +44 -44
  90. package/dist/init/index.js +6 -6
  91. package/dist/instrumentation/index.d.ts +2 -2
  92. package/dist/instrumentation/index.js +2 -2
  93. package/dist/layer/index.js +2 -2
  94. package/dist/lifecycle/index.js +2 -2
  95. package/dist/logger/index.d.ts +1 -1
  96. package/dist/logger/index.js +1 -1
  97. package/dist/middleware/index.js +2 -2
  98. package/dist/notifications/index.js +2 -2
  99. package/dist/observability/index.js +2 -2
  100. package/dist/pino-logger-GJ2CYLD5.js +5 -0
  101. package/dist/{pino-logger-XF275Y5C.js.map → pino-logger-GJ2CYLD5.js.map} +1 -1
  102. package/dist/platform/index.js +2 -2
  103. package/dist/prisma/index.js +8 -8
  104. package/dist/rbac/index.js +2 -2
  105. package/dist/resource-caps/index.js +2 -2
  106. package/dist/server/index.js +6 -6
  107. package/dist/sharding/index.js +1 -1
  108. package/dist/sharing/index.js +2 -2
  109. package/dist/telemetry/index.d.ts +3 -3
  110. package/dist/telemetry/index.js +5 -5
  111. package/dist/temporal/index.js +2 -2
  112. package/dist/tracker/index.js +4 -4
  113. package/dist/workspace-guard-7PEZT3ZJ.js +5 -0
  114. package/dist/{workspace-guard-4BUG4ZP2.js.map → workspace-guard-7PEZT3ZJ.js.map} +1 -1
  115. package/package.json +1 -1
  116. package/dist/EventQueueFactory-ELT7NDXK.js +0 -7
  117. package/dist/chunk-7E76FL2C.js.map +0 -1
  118. package/dist/chunk-CBZNP6RF.js.map +0 -1
  119. package/dist/pino-logger-XF275Y5C.js +0 -5
  120. package/dist/workspace-guard-4BUG4ZP2.js +0 -5
@@ -1,5 +1,5 @@
1
1
  import { DEFAULT_LAYER_STREAMS, DEFAULT_LAYER_RESOURCES, DEFAULT_GATEWAY_ROUTING } from './chunk-YFOHAHZE.js';
2
- import { logger } from './chunk-CBZNP6RF.js';
2
+ import { logger } from './chunk-RU266375.js';
3
3
  import { __export, __name } from './chunk-XE4OXN2W.js';
4
4
 
5
5
  // src/layer/index.ts
@@ -229,5 +229,5 @@ function validateLayerConfig(config) {
229
229
  __name(validateLayerConfig, "validateLayerConfig");
230
230
 
231
231
  export { LayerManager, createLayerManagerFromEnv, detectLayerFromServiceName, getGatewayUrlForLayer, layer_exports, validateLayerConfig };
232
- //# sourceMappingURL=chunk-7UJXIX4I.js.map
233
- //# sourceMappingURL=chunk-7UJXIX4I.js.map
232
+ //# sourceMappingURL=chunk-5NT2OEDQ.js.map
233
+ //# sourceMappingURL=chunk-5NT2OEDQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/layer/index.ts"],"names":["LayerManager","config","gatewayConfig","resourceConfig","routingConfig","serviceIdentity","serviceName","DEFAULT_GATEWAY_ROUTING","layer","resolveGatewayConfig","resolveResourceConfig","logger","debug","envPrefix","toUpperCase","internalGatewayUrl","process","env","internalGateway","host","port","graphqlPath","crossLayerEnvPrefix","crossLayerGatewayUrl","crossLayerGateway","defaults","DEFAULT_LAYER_RESOURCES","eventQueueUrl","valkeyUrl","temporalAddress","temporalNamespace","rbacGatewayUrl","getLayer","getServiceName","getServiceIdentity","getInternalGatewayUrl","getCrossLayerGatewayUrl","getEventQueueUrl","getValkeyUrl","getTemporalAddress","getTemporalNamespace","getRbacGatewayUrl","getDefaultStreams","DEFAULT_LAYER_STREAMS","getFullConfig","gateways","resources","isWspaceLayer","isGlobalLayer","getOppositeLayer","createLayerManagerFromEnv","Error","detectLayerFromServiceName","startsWith","undefined","getGatewayUrlForLayer","sourceLayer","targetLayer","sourceManager","routing","validateLayerConfig","expectedPrefix","warn"],"mappings":";;;;;AAAA,IAAA,aAAA,GAAA;;;;;;;;;;;AAyCO,IAAMA,eAAN,MAAMA;EAzCb;;;AA0CUC,EAAAA,MAAAA;AACAC,EAAAA,aAAAA;AACAC,EAAAA,cAAAA;AACAC,EAAAA,aAAAA;AAER,EAAA,WAAA,CAAYH,MAAAA,EAAqB;AAC/B,IAAA,IAAA,CAAKA,MAAAA,GAAS;AACZI,MAAAA,eAAAA,EAAiBJ,MAAAA,CAAOK,WAAAA;MACxB,GAAGL;AACL,KAAA;AAGA,IAAA,IAAA,CAAKG,aAAAA,GAAgBG,uBAAAA,CAAwBN,MAAAA,CAAOO,KAAK,CAAA;AAGzD,IAAA,IAAA,CAAKN,aAAAA,GAAgB,KAAKO,oBAAAA,EAAoB;AAG9C,IAAA,IAAA,CAAKN,cAAAA,GAAiB,KAAKO,qBAAAA,EAAqB;AAEhDC,IAAAA,MAAAA,CAAOC,MAAM,4BAAA,EAA8B;AACzCJ,MAAAA,KAAAA,EAAO,KAAKP,MAAAA,CAAOO,KAAAA;AACnBF,MAAAA,WAAAA,EAAa,KAAKL,MAAAA,CAAOK,WAAAA;AACzBD,MAAAA,eAAAA,EAAiB,KAAKJ,MAAAA,CAAOI;KAC/B,CAAA;AACF,EAAA;;;;EAKQI,oBAAAA,GAA2C;AACjD,IAAA,MAAMI,SAAAA,GAAY,IAAA,CAAKZ,MAAAA,CAAOO,KAAAA,CAAMM,WAAAA,EAAW;AAG/C,IAAA,MAAMC,kBAAAA,GACJC,QAAQC,GAAAA,CAAI,CAAA,EAAGJ,SAAAA,CAAAA,gBAAAA,CAA2B,CAAA,IAC1C,UAAU,IAAA,CAAKT,aAAAA,CAAcc,gBAAgBC,IAAI,CAAA,CAAA,EAAI,KAAKf,aAAAA,CAAcc,eAAAA,CAAgBE,IAAI,CAAA,EAAG,IAAA,CAAKhB,aAAAA,CAAcc,eAAAA,CAAgBG,WAAW,CAAA,CAAA;AAG/I,IAAA,MAAMC,mBAAAA,GAAsB,IAAA,CAAKrB,MAAAA,CAAOO,KAAAA,KAAU,WAAW,QAAA,GAAW,QAAA;AACxE,IAAA,MAAMe,oBAAAA,GACJP,QAAQC,GAAAA,CAAI,CAAA,EAAGK,mBAAAA,CAAAA,mBAAAA,CAAwC,CAAA,IACvD,UAAU,IAAA,CAAKlB,aAAAA,CAAcoB,kBAAkBL,IAAI,CAAA,CAAA,EAAI,KAAKf,aAAAA,CAAcoB,iBAAAA,CAAkBJ,IAAI,CAAA,EAAG,IAAA,CAAKhB,aAAAA,CAAcoB,iBAAAA,CAAkBH,WAAW,CAAA,CAAA;AAErJ,IAAA,OAAO;AACLN,MAAAA,kBAAAA;AACAQ,MAAAA;AACF,KAAA;AACF,EAAA;;;;EAKQb,qBAAAA,GAA2C;AACjD,IAAA,MAAMG,SAAAA,GAAY,IAAA,CAAKZ,MAAAA,CAAOO,KAAAA,CAAMM,WAAAA,EAAW;AAC/C,IAAA,MAAMW,QAAAA,GAAWC,uBAAAA,CAAwB,IAAA,CAAKzB,MAAAA,CAAOO,KAAK,CAAA;AAE1D,IAAA,OAAO;;;;AAILmB,MAAAA,aAAAA,EAAeX,OAAAA,CAAQC,GAAAA,CAAI,WAAA,CAAA,IAAgBQ,QAAAA,CAASE,aAAAA;;;;;AAKpDC,MAAAA,SAAAA,EACEZ,OAAAA,CAAQC,GAAAA,CAAI,CAAA,EAAGJ,SAAAA,aAAsB,CAAA,IACrCG,OAAAA,CAAQC,GAAAA,CAAI,YAAA,CAAA,IACZD,OAAAA,CAAQC,GAAAA,CAAI,WAAA,KACZQ,QAAAA,CAASG,SAAAA;AACXC,MAAAA,eAAAA,EAAiBb,QAAQC,GAAAA,CAAI,CAAA,EAAGJ,SAAAA,CAAAA,iBAAAA,CAA4B,KAAKY,QAAAA,CAASI,eAAAA;AAC1EC,MAAAA,iBAAAA,EAAmBd,QAAQC,GAAAA,CAAI,CAAA,EAAGJ,SAAAA,CAAAA,mBAAAA,CAA8B,KAAKY,QAAAA,CAASK,iBAAAA;AAC9EC,MAAAA,cAAAA,EAAgBf,QAAQC,GAAAA,CAAI,CAAA,EAAGJ,SAAAA,CAAAA,iBAAAA,CAA4B,KAAKY,QAAAA,CAASM;AAC3E,KAAA;AACF,EAAA;;;;EAKAC,QAAAA,GAAyB;AACvB,IAAA,OAAO,KAAK/B,MAAAA,CAAOO,KAAAA;AACrB,EAAA;;;;EAKAyB,cAAAA,GAAyB;AACvB,IAAA,OAAO,KAAKhC,MAAAA,CAAOK,WAAAA;AACrB,EAAA;;;;EAKA4B,kBAAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAKjC,MAAAA,CAAOI,eAAAA,IAAmB,IAAA,CAAKJ,MAAAA,CAAOK,WAAAA;AACpD,EAAA;;;;EAKA6B,qBAAAA,GAAgC;AAC9B,IAAA,OAAO,KAAKjC,aAAAA,CAAca,kBAAAA;AAC5B,EAAA;;;;EAKAqB,uBAAAA,GAAkC;AAChC,IAAA,OAAO,KAAKlC,aAAAA,CAAcqB,oBAAAA;AAC5B,EAAA;;;;EAKAc,gBAAAA,GAA2B;AACzB,IAAA,OAAO,KAAKlC,cAAAA,CAAewB,aAAAA;AAC7B,EAAA;;;;EAKAW,YAAAA,GAAuB;AACrB,IAAA,OAAO,KAAKnC,cAAAA,CAAeyB,SAAAA;AAC7B,EAAA;;;;EAKAW,kBAAAA,GAA6B;AAC3B,IAAA,OAAO,KAAKpC,cAAAA,CAAe0B,eAAAA;AAC7B,EAAA;;;;EAKAW,oBAAAA,GAA+B;AAC7B,IAAA,OAAO,KAAKrC,cAAAA,CAAe2B,iBAAAA;AAC7B,EAAA;;;;EAKAW,iBAAAA,GAA4B;AAC1B,IAAA,OAAO,KAAKtC,cAAAA,CAAe4B,cAAAA;AAC7B,EAAA;;;;EAKAW,iBAAAA,GAAuF;AACrF,IAAA,OAAOC,qBAAAA,CAAsB,IAAA,CAAK1C,MAAAA,CAAOO,KAAK,CAAA;AAChD,EAAA;;;;EAKAoC,aAAAA,GAAiC;AAC/B,IAAA,OAAO;AACL,MAAA,GAAG,IAAA,CAAK3C,MAAAA;AACR4C,MAAAA,QAAAA,EAAU,IAAA,CAAK3C,aAAAA;AACf4C,MAAAA,SAAAA,EAAW,IAAA,CAAK3C;AAClB,KAAA;AACF,EAAA;;;;EAKA4C,aAAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK9C,OAAOO,KAAAA,KAAU,QAAA;AAC/B,EAAA;;;;EAKAwC,aAAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK/C,OAAOO,KAAAA,KAAU,QAAA;AAC/B,EAAA;;;;EAKAyC,gBAAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAKhD,MAAAA,CAAOO,KAAAA,KAAU,QAAA,GAAW,QAAA,GAAW,QAAA;AACrD,EAAA;AACF;AAYO,SAAS0C,yBAAAA,GAAAA;AACd,EAAA,MAAM1C,KAAAA,GAAQQ,OAAAA,CAAQC,GAAAA,CAAI,eAAA,CAAA;AAE1B,EAAA,IAAI,CAACT,KAAAA,IAAUA,KAAAA,KAAU,QAAA,IAAYA,UAAU,QAAA,EAAW;AACxD,IAAA,MAAM,IAAI2C,KAAAA,CACR,CAAA,0GAAA,EACyC3C,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAErD,EAAA;AAEA,EAAA,MAAMF,WAAAA,GAAcU,OAAAA,CAAQC,GAAAA,CAAI,cAAA,CAAA;AAChC,EAAA,IAAI,CAACX,WAAAA,EAAa;AAChB,IAAA,MAAM,IAAI6C,MAAM,8DAAA,CAAA;AAClB,EAAA;AAEA,EAAA,MAAM9C,eAAAA,GAAkBW,OAAAA,CAAQC,GAAAA,CAAI,kBAAA,CAAA,IAAuBX,WAAAA;AAE3D,EAAA,OAAO,IAAIN,YAAAA,CAAa;AACtBQ,IAAAA,KAAAA;AACAF,IAAAA,WAAAA;AACAD,IAAAA;GACF,CAAA;AACF;AAtBgB6C,MAAAA,CAAAA,yBAAAA,EAAAA,2BAAAA,CAAAA;AA8BT,SAASE,2BAA2B9C,WAAAA,EAAmB;AAC5D,EAAA,IAAIA,WAAAA,CAAY+C,UAAAA,CAAW,SAAA,CAAA,EAAY;AACrC,IAAA,OAAO,QAAA;AACT,EAAA;AACA,EAAA,IAAI/C,WAAAA,CAAY+C,UAAAA,CAAW,SAAA,CAAA,EAAY;AACrC,IAAA,OAAO,QAAA;AACT,EAAA;AACA,EAAA,OAAOC,MAAAA;AACT;AARgBF,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;AAkBT,SAASG,qBAAAA,CACdC,WAAAA,EACAC,WAAAA,EACAC,aAAAA,EAA4B;AAG5B,EAAA,IAAIF,gBAAgBC,WAAAA,EAAa;AAC/B,IAAA,IAAIC,aAAAA,EAAe;AACjB,MAAA,OAAOA,cAAcvB,qBAAAA,EAAqB;AAC5C,IAAA;AACA,IAAA,MAAMwB,QAAAA,GAAUpD,wBAAwBiD,WAAAA,CAAAA;AACxC,IAAA,OAAO,CAAA,OAAA,EAAUG,QAAAA,CAAQzC,eAAAA,CAAgBC,IAAI,CAAA,CAAA,EAAIwC,QAAAA,CAAQzC,eAAAA,CAAgBE,IAAI,CAAA,EAAGuC,QAAAA,CAAQzC,eAAAA,CAAgBG,WAAW,CAAA,CAAA;AACrH,EAAA;AAGA,EAAA,IAAIqC,aAAAA,EAAe;AACjB,IAAA,OAAOA,cAActB,uBAAAA,EAAuB;AAC9C,EAAA;AACA,EAAA,MAAMuB,OAAAA,GAAUpD,wBAAwBiD,WAAAA,CAAAA;AACxC,EAAA,OAAO,CAAA,OAAA,EAAUG,OAAAA,CAAQnC,iBAAAA,CAAkBL,IAAI,CAAA,CAAA,EAAIwC,OAAAA,CAAQnC,iBAAAA,CAAkBJ,IAAI,CAAA,EAAGuC,OAAAA,CAAQnC,iBAAAA,CAAkBH,WAAW,CAAA,CAAA;AAC3H;AApBgBkC,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AA4BT,SAASK,oBAAoB3D,MAAAA,EAAmB;AACrD,EAAA,IAAI,CAACA,OAAOO,KAAAA,EAAO;AACjB,IAAA,MAAM,IAAI2C,MAAM,kCAAA,CAAA;AAClB,EAAA;AACA,EAAA,IAAIlD,MAAAA,CAAOO,KAAAA,KAAU,QAAA,IAAYP,MAAAA,CAAOO,UAAU,QAAA,EAAU;AAC1D,IAAA,MAAM,IAAI2C,KAAAA,CAAM,CAAA,8BAAA,EAAiClD,MAAAA,CAAOO,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAChG,EAAA;AACA,EAAA,IAAI,CAACP,OAAOK,WAAAA,EAAa;AACvB,IAAA,MAAM,IAAI6C,MAAM,wCAAA,CAAA;AAClB,EAAA;AAGA,EAAA,MAAMU,cAAAA,GAAiB,CAAA,EAAG5D,MAAAA,CAAOO,KAAK,CAAA,CAAA,CAAA;AACtC,EAAA,IAAI,CAACP,MAAAA,CAAOK,WAAAA,CAAY+C,UAAAA,CAAWQ,cAAAA,CAAAA,EAAiB;AAClDlD,IAAAA,MAAAA,CAAOmD,KAAK,+DAAA,EAAiE;AAC3ExD,MAAAA,WAAAA,EAAaL,MAAAA,CAAOK,WAAAA;AACpBuD,MAAAA,cAAAA;AACArD,MAAAA,KAAAA,EAAOP,MAAAA,CAAOO;KAChB,CAAA;AACF,EAAA;AACF;AApBgBoD,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA","file":"chunk-7UJXIX4I.js","sourcesContent":["/**\n * Layer Detection and Configuration Module\n *\n * Provides layer-aware configuration and gateway URL resolution\n * for wspace (workspace) and global (tenant) service layers.\n *\n * @module layer\n * @category Configuration\n *\n * @example\n * ```typescript\n * import { LayerManager } from '@burdenoff/be-sdk/layer';\n *\n * // Create layer manager for a wspace service\n * const layer = new LayerManager({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Get gateway URLs\n * const internalUrl = layer.getInternalGatewayUrl(); // wspace-int-gateway\n * const crossLayerUrl = layer.getCrossLayerGatewayUrl(); // global-public-gateway\n * ```\n */\n\nimport {\n type ServiceLayer,\n type LayerConfig,\n type LayerGatewayConfig,\n type LayerResourceUrls,\n type LayerFullConfig,\n type GatewayRoutingConfig,\n DEFAULT_GATEWAY_ROUTING,\n DEFAULT_LAYER_RESOURCES,\n DEFAULT_LAYER_STREAMS,\n} from '../types/layer.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Layer Manager - Provides layer-aware configuration and URL resolution\n */\nexport class LayerManager {\n private config: LayerConfig;\n private gatewayConfig: LayerGatewayConfig;\n private resourceConfig: LayerResourceUrls;\n private routingConfig: GatewayRoutingConfig;\n\n constructor(config: LayerConfig) {\n this.config = {\n serviceIdentity: config.serviceName, // Default to service name\n ...config,\n };\n\n // Load routing config for layer\n this.routingConfig = DEFAULT_GATEWAY_ROUTING[config.layer];\n\n // Initialize gateway config\n this.gatewayConfig = this.resolveGatewayConfig();\n\n // Initialize resource config\n this.resourceConfig = this.resolveResourceConfig();\n\n logger.debug('[LayerManager] Initialized', {\n layer: this.config.layer,\n serviceName: this.config.serviceName,\n serviceIdentity: this.config.serviceIdentity,\n });\n }\n\n /**\n * Resolve gateway configuration from environment or defaults\n */\n private resolveGatewayConfig(): LayerGatewayConfig {\n const envPrefix = this.config.layer.toUpperCase();\n\n // Internal gateway URL\n const internalGatewayUrl =\n process.env[`${envPrefix}_INT_GATEWAY_URL`] ||\n `http://${this.routingConfig.internalGateway.host}:${this.routingConfig.internalGateway.port}${this.routingConfig.internalGateway.graphqlPath}`;\n\n // Cross-layer gateway URL\n const crossLayerEnvPrefix = this.config.layer === 'wspace' ? 'GLOBAL' : 'WSPACE';\n const crossLayerGatewayUrl =\n process.env[`${crossLayerEnvPrefix}_PUBLIC_GATEWAY_URL`] ||\n `http://${this.routingConfig.crossLayerGateway.host}:${this.routingConfig.crossLayerGateway.port}${this.routingConfig.crossLayerGateway.graphqlPath}`;\n\n return {\n internalGatewayUrl,\n crossLayerGatewayUrl,\n };\n }\n\n /**\n * Resolve resource configuration from environment or defaults\n */\n private resolveResourceConfig(): LayerResourceUrls {\n const envPrefix = this.config.layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[this.config.layer];\n\n return {\n // Event queue is fleet-shared (ACA Managed Redis or local shared-valkey).\n // REDIS_URL (set in ACA KV / local .env) always wins; the per-layer\n // default is only the local-dev compose fallback.\n eventQueueUrl: process.env['REDIS_URL'] || defaults.eventQueueUrl,\n // Cache Valkey: layer-specific → generic VALKEY_URL → canonical REDIS_URL →\n // local-dev compose default. REDIS_URL is the same Azure Managed Redis the\n // event queue uses; falling back to it keeps a service whose VALKEY_URL is\n // blank from silently dropping to the local-dev host in prod.\n valkeyUrl:\n process.env[`${envPrefix}_VALKEY_URL`] ||\n process.env['VALKEY_URL'] ||\n process.env['REDIS_URL'] ||\n defaults.valkeyUrl,\n temporalAddress: process.env[`${envPrefix}_TEMPORAL_ADDRESS`] || defaults.temporalAddress,\n temporalNamespace: process.env[`${envPrefix}_TEMPORAL_NAMESPACE`] || defaults.temporalNamespace,\n rbacGatewayUrl: process.env[`${envPrefix}_RBAC_GATEWAY_URL`] || defaults.rbacGatewayUrl,\n };\n }\n\n /**\n * Get the layer type\n */\n getLayer(): ServiceLayer {\n return this.config.layer;\n }\n\n /**\n * Get the service name\n */\n getServiceName(): string {\n return this.config.serviceName;\n }\n\n /**\n * Get the service identity (for bypass headers)\n */\n getServiceIdentity(): string {\n return this.config.serviceIdentity || this.config.serviceName;\n }\n\n /**\n * Get internal gateway URL (same layer M2M calls)\n */\n getInternalGatewayUrl(): string {\n return this.gatewayConfig.internalGatewayUrl;\n }\n\n /**\n * Get cross-layer gateway URL (cross layer calls via public gateway)\n */\n getCrossLayerGatewayUrl(): string {\n return this.gatewayConfig.crossLayerGatewayUrl;\n }\n\n /**\n * Get event queue (Redis Streams) URL for this layer\n */\n getEventQueueUrl(): string {\n return this.resourceConfig.eventQueueUrl;\n }\n\n /**\n * Get Valkey URL for this layer\n */\n getValkeyUrl(): string {\n return this.resourceConfig.valkeyUrl;\n }\n\n /**\n * Get Temporal address for this layer\n */\n getTemporalAddress(): string {\n return this.resourceConfig.temporalAddress;\n }\n\n /**\n * Get Temporal namespace for this layer\n */\n getTemporalNamespace(): string {\n return this.resourceConfig.temporalNamespace;\n }\n\n /**\n * Get RBAC gateway URL for this layer\n */\n getRbacGatewayUrl(): string {\n return this.resourceConfig.rbacGatewayUrl;\n }\n\n /**\n * Get default streams for this layer\n */\n getDefaultStreams(): Array<{ name: string; subjects: string[]; description?: string }> {\n return DEFAULT_LAYER_STREAMS[this.config.layer];\n }\n\n /**\n * Get full configuration\n */\n getFullConfig(): LayerFullConfig {\n return {\n ...this.config,\n gateways: this.gatewayConfig,\n resources: this.resourceConfig,\n };\n }\n\n /**\n * Check if this is a wspace layer service\n */\n isWspaceLayer(): boolean {\n return this.config.layer === 'wspace';\n }\n\n /**\n * Check if this is a global layer service\n */\n isGlobalLayer(): boolean {\n return this.config.layer === 'global';\n }\n\n /**\n * Get the opposite layer\n */\n getOppositeLayer(): ServiceLayer {\n return this.config.layer === 'wspace' ? 'global' : 'wspace';\n }\n}\n\n/**\n * Create LayerManager from environment variables\n *\n * Environment variables:\n * - SERVICE_LAYER: 'wspace' | 'global'\n * - SERVICE_NAME: Service name (e.g., 'wspace-tags-svc')\n * - SERVICE_IDENTITY: Service identity for bypass headers (defaults to SERVICE_NAME)\n *\n * @throws Error if SERVICE_LAYER is not set or invalid\n */\nexport function createLayerManagerFromEnv(): LayerManager {\n const layer = process.env['SERVICE_LAYER'] as ServiceLayer;\n\n if (!layer || (layer !== 'wspace' && layer !== 'global')) {\n throw new Error(\n `[LayerManager] Invalid or missing SERVICE_LAYER environment variable. ` +\n `Expected 'wspace' or 'global', got '${layer}'`\n );\n }\n\n const serviceName = process.env['SERVICE_NAME'];\n if (!serviceName) {\n throw new Error('[LayerManager] SERVICE_NAME environment variable is required');\n }\n\n const serviceIdentity = process.env['SERVICE_IDENTITY'] || serviceName;\n\n return new LayerManager({\n layer,\n serviceName,\n serviceIdentity,\n });\n}\n\n/**\n * Detect layer from service name\n *\n * @param serviceName - Service name (e.g., 'wspace-tags-svc', 'global-auth-svc')\n * @returns Detected layer or undefined if unable to detect\n */\nexport function detectLayerFromServiceName(serviceName: string): ServiceLayer | undefined {\n if (serviceName.startsWith('wspace-')) {\n return 'wspace';\n }\n if (serviceName.startsWith('global-')) {\n return 'global';\n }\n return undefined;\n}\n\n/**\n * Get gateway URL for a target layer from a source layer\n *\n * @param sourceLayer - Layer making the call\n * @param targetLayer - Layer being called\n * @param sourceManager - LayerManager for the source layer (optional, for URL resolution)\n * @returns Gateway URL to use for the call\n */\nexport function getGatewayUrlForLayer(\n sourceLayer: ServiceLayer,\n targetLayer: ServiceLayer,\n sourceManager?: LayerManager\n): string {\n // Same layer = internal gateway\n if (sourceLayer === targetLayer) {\n if (sourceManager) {\n return sourceManager.getInternalGatewayUrl();\n }\n const routing = DEFAULT_GATEWAY_ROUTING[sourceLayer];\n return `http://${routing.internalGateway.host}:${routing.internalGateway.port}${routing.internalGateway.graphqlPath}`;\n }\n\n // Different layer = cross-layer public gateway\n if (sourceManager) {\n return sourceManager.getCrossLayerGatewayUrl();\n }\n const routing = DEFAULT_GATEWAY_ROUTING[sourceLayer];\n return `http://${routing.crossLayerGateway.host}:${routing.crossLayerGateway.port}${routing.crossLayerGateway.graphqlPath}`;\n}\n\n/**\n * Validate layer configuration\n *\n * @param config - Layer configuration to validate\n * @throws Error if configuration is invalid\n */\nexport function validateLayerConfig(config: LayerConfig): void {\n if (!config.layer) {\n throw new Error('[LayerManager] layer is required');\n }\n if (config.layer !== 'wspace' && config.layer !== 'global') {\n throw new Error(`[LayerManager] Invalid layer '${config.layer}'. Must be 'wspace' or 'global'`);\n }\n if (!config.serviceName) {\n throw new Error('[LayerManager] serviceName is required');\n }\n\n // Validate naming convention\n const expectedPrefix = `${config.layer}-`;\n if (!config.serviceName.startsWith(expectedPrefix)) {\n logger.warn('[LayerManager] Service name does not follow naming convention', {\n serviceName: config.serviceName,\n expectedPrefix,\n layer: config.layer,\n });\n }\n}\n\n// Re-export types for convenience\nexport type {\n ServiceLayer,\n LayerConfig,\n LayerGatewayConfig,\n LayerResourceUrls,\n LayerFullConfig,\n GatewayRoutingConfig,\n} from '../types/layer.js';\n\nexport { DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES, DEFAULT_LAYER_STREAMS } from '../types/layer.js';\n"]}
1
+ {"version":3,"sources":["../src/layer/index.ts"],"names":["LayerManager","config","gatewayConfig","resourceConfig","routingConfig","serviceIdentity","serviceName","DEFAULT_GATEWAY_ROUTING","layer","resolveGatewayConfig","resolveResourceConfig","logger","debug","envPrefix","toUpperCase","internalGatewayUrl","process","env","internalGateway","host","port","graphqlPath","crossLayerEnvPrefix","crossLayerGatewayUrl","crossLayerGateway","defaults","DEFAULT_LAYER_RESOURCES","eventQueueUrl","valkeyUrl","temporalAddress","temporalNamespace","rbacGatewayUrl","getLayer","getServiceName","getServiceIdentity","getInternalGatewayUrl","getCrossLayerGatewayUrl","getEventQueueUrl","getValkeyUrl","getTemporalAddress","getTemporalNamespace","getRbacGatewayUrl","getDefaultStreams","DEFAULT_LAYER_STREAMS","getFullConfig","gateways","resources","isWspaceLayer","isGlobalLayer","getOppositeLayer","createLayerManagerFromEnv","Error","detectLayerFromServiceName","startsWith","undefined","getGatewayUrlForLayer","sourceLayer","targetLayer","sourceManager","routing","validateLayerConfig","expectedPrefix","warn"],"mappings":"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","file":"chunk-5NT2OEDQ.js","sourcesContent":["/**\n * Layer Detection and Configuration Module\n *\n * Provides layer-aware configuration and gateway URL resolution\n * for wspace (workspace) and global (tenant) service layers.\n *\n * @module layer\n * @category Configuration\n *\n * @example\n * ```typescript\n * import { LayerManager } from '@burdenoff/be-sdk/layer';\n *\n * // Create layer manager for a wspace service\n * const layer = new LayerManager({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Get gateway URLs\n * const internalUrl = layer.getInternalGatewayUrl(); // wspace-int-gateway\n * const crossLayerUrl = layer.getCrossLayerGatewayUrl(); // global-public-gateway\n * ```\n */\n\nimport {\n type ServiceLayer,\n type LayerConfig,\n type LayerGatewayConfig,\n type LayerResourceUrls,\n type LayerFullConfig,\n type GatewayRoutingConfig,\n DEFAULT_GATEWAY_ROUTING,\n DEFAULT_LAYER_RESOURCES,\n DEFAULT_LAYER_STREAMS,\n} from '../types/layer.js';\nimport { logger } from '../logger/index.js';\n\n/**\n * Layer Manager - Provides layer-aware configuration and URL resolution\n */\nexport class LayerManager {\n private config: LayerConfig;\n private gatewayConfig: LayerGatewayConfig;\n private resourceConfig: LayerResourceUrls;\n private routingConfig: GatewayRoutingConfig;\n\n constructor(config: LayerConfig) {\n this.config = {\n serviceIdentity: config.serviceName, // Default to service name\n ...config,\n };\n\n // Load routing config for layer\n this.routingConfig = DEFAULT_GATEWAY_ROUTING[config.layer];\n\n // Initialize gateway config\n this.gatewayConfig = this.resolveGatewayConfig();\n\n // Initialize resource config\n this.resourceConfig = this.resolveResourceConfig();\n\n logger.debug('[LayerManager] Initialized', {\n layer: this.config.layer,\n serviceName: this.config.serviceName,\n serviceIdentity: this.config.serviceIdentity,\n });\n }\n\n /**\n * Resolve gateway configuration from environment or defaults\n */\n private resolveGatewayConfig(): LayerGatewayConfig {\n const envPrefix = this.config.layer.toUpperCase();\n\n // Internal gateway URL\n const internalGatewayUrl =\n process.env[`${envPrefix}_INT_GATEWAY_URL`] ||\n `http://${this.routingConfig.internalGateway.host}:${this.routingConfig.internalGateway.port}${this.routingConfig.internalGateway.graphqlPath}`;\n\n // Cross-layer gateway URL\n const crossLayerEnvPrefix = this.config.layer === 'wspace' ? 'GLOBAL' : 'WSPACE';\n const crossLayerGatewayUrl =\n process.env[`${crossLayerEnvPrefix}_PUBLIC_GATEWAY_URL`] ||\n `http://${this.routingConfig.crossLayerGateway.host}:${this.routingConfig.crossLayerGateway.port}${this.routingConfig.crossLayerGateway.graphqlPath}`;\n\n return {\n internalGatewayUrl,\n crossLayerGatewayUrl,\n };\n }\n\n /**\n * Resolve resource configuration from environment or defaults\n */\n private resolveResourceConfig(): LayerResourceUrls {\n const envPrefix = this.config.layer.toUpperCase();\n const defaults = DEFAULT_LAYER_RESOURCES[this.config.layer];\n\n return {\n // Event queue is fleet-shared (ACA Managed Redis or local shared-valkey).\n // REDIS_URL (set in ACA KV / local .env) always wins; the per-layer\n // default is only the local-dev compose fallback.\n eventQueueUrl: process.env['REDIS_URL'] || defaults.eventQueueUrl,\n // Cache Valkey: layer-specific → generic VALKEY_URL → canonical REDIS_URL →\n // local-dev compose default. REDIS_URL is the same Azure Managed Redis the\n // event queue uses; falling back to it keeps a service whose VALKEY_URL is\n // blank from silently dropping to the local-dev host in prod.\n valkeyUrl:\n process.env[`${envPrefix}_VALKEY_URL`] ||\n process.env['VALKEY_URL'] ||\n process.env['REDIS_URL'] ||\n defaults.valkeyUrl,\n temporalAddress: process.env[`${envPrefix}_TEMPORAL_ADDRESS`] || defaults.temporalAddress,\n temporalNamespace: process.env[`${envPrefix}_TEMPORAL_NAMESPACE`] || defaults.temporalNamespace,\n rbacGatewayUrl: process.env[`${envPrefix}_RBAC_GATEWAY_URL`] || defaults.rbacGatewayUrl,\n };\n }\n\n /**\n * Get the layer type\n */\n getLayer(): ServiceLayer {\n return this.config.layer;\n }\n\n /**\n * Get the service name\n */\n getServiceName(): string {\n return this.config.serviceName;\n }\n\n /**\n * Get the service identity (for bypass headers)\n */\n getServiceIdentity(): string {\n return this.config.serviceIdentity || this.config.serviceName;\n }\n\n /**\n * Get internal gateway URL (same layer M2M calls)\n */\n getInternalGatewayUrl(): string {\n return this.gatewayConfig.internalGatewayUrl;\n }\n\n /**\n * Get cross-layer gateway URL (cross layer calls via public gateway)\n */\n getCrossLayerGatewayUrl(): string {\n return this.gatewayConfig.crossLayerGatewayUrl;\n }\n\n /**\n * Get event queue (Redis Streams) URL for this layer\n */\n getEventQueueUrl(): string {\n return this.resourceConfig.eventQueueUrl;\n }\n\n /**\n * Get Valkey URL for this layer\n */\n getValkeyUrl(): string {\n return this.resourceConfig.valkeyUrl;\n }\n\n /**\n * Get Temporal address for this layer\n */\n getTemporalAddress(): string {\n return this.resourceConfig.temporalAddress;\n }\n\n /**\n * Get Temporal namespace for this layer\n */\n getTemporalNamespace(): string {\n return this.resourceConfig.temporalNamespace;\n }\n\n /**\n * Get RBAC gateway URL for this layer\n */\n getRbacGatewayUrl(): string {\n return this.resourceConfig.rbacGatewayUrl;\n }\n\n /**\n * Get default streams for this layer\n */\n getDefaultStreams(): Array<{ name: string; subjects: string[]; description?: string }> {\n return DEFAULT_LAYER_STREAMS[this.config.layer];\n }\n\n /**\n * Get full configuration\n */\n getFullConfig(): LayerFullConfig {\n return {\n ...this.config,\n gateways: this.gatewayConfig,\n resources: this.resourceConfig,\n };\n }\n\n /**\n * Check if this is a wspace layer service\n */\n isWspaceLayer(): boolean {\n return this.config.layer === 'wspace';\n }\n\n /**\n * Check if this is a global layer service\n */\n isGlobalLayer(): boolean {\n return this.config.layer === 'global';\n }\n\n /**\n * Get the opposite layer\n */\n getOppositeLayer(): ServiceLayer {\n return this.config.layer === 'wspace' ? 'global' : 'wspace';\n }\n}\n\n/**\n * Create LayerManager from environment variables\n *\n * Environment variables:\n * - SERVICE_LAYER: 'wspace' | 'global'\n * - SERVICE_NAME: Service name (e.g., 'wspace-tags-svc')\n * - SERVICE_IDENTITY: Service identity for bypass headers (defaults to SERVICE_NAME)\n *\n * @throws Error if SERVICE_LAYER is not set or invalid\n */\nexport function createLayerManagerFromEnv(): LayerManager {\n const layer = process.env['SERVICE_LAYER'] as ServiceLayer;\n\n if (!layer || (layer !== 'wspace' && layer !== 'global')) {\n throw new Error(\n `[LayerManager] Invalid or missing SERVICE_LAYER environment variable. ` +\n `Expected 'wspace' or 'global', got '${layer}'`\n );\n }\n\n const serviceName = process.env['SERVICE_NAME'];\n if (!serviceName) {\n throw new Error('[LayerManager] SERVICE_NAME environment variable is required');\n }\n\n const serviceIdentity = process.env['SERVICE_IDENTITY'] || serviceName;\n\n return new LayerManager({\n layer,\n serviceName,\n serviceIdentity,\n });\n}\n\n/**\n * Detect layer from service name\n *\n * @param serviceName - Service name (e.g., 'wspace-tags-svc', 'global-auth-svc')\n * @returns Detected layer or undefined if unable to detect\n */\nexport function detectLayerFromServiceName(serviceName: string): ServiceLayer | undefined {\n if (serviceName.startsWith('wspace-')) {\n return 'wspace';\n }\n if (serviceName.startsWith('global-')) {\n return 'global';\n }\n return undefined;\n}\n\n/**\n * Get gateway URL for a target layer from a source layer\n *\n * @param sourceLayer - Layer making the call\n * @param targetLayer - Layer being called\n * @param sourceManager - LayerManager for the source layer (optional, for URL resolution)\n * @returns Gateway URL to use for the call\n */\nexport function getGatewayUrlForLayer(\n sourceLayer: ServiceLayer,\n targetLayer: ServiceLayer,\n sourceManager?: LayerManager\n): string {\n // Same layer = internal gateway\n if (sourceLayer === targetLayer) {\n if (sourceManager) {\n return sourceManager.getInternalGatewayUrl();\n }\n const routing = DEFAULT_GATEWAY_ROUTING[sourceLayer];\n return `http://${routing.internalGateway.host}:${routing.internalGateway.port}${routing.internalGateway.graphqlPath}`;\n }\n\n // Different layer = cross-layer public gateway\n if (sourceManager) {\n return sourceManager.getCrossLayerGatewayUrl();\n }\n const routing = DEFAULT_GATEWAY_ROUTING[sourceLayer];\n return `http://${routing.crossLayerGateway.host}:${routing.crossLayerGateway.port}${routing.crossLayerGateway.graphqlPath}`;\n}\n\n/**\n * Validate layer configuration\n *\n * @param config - Layer configuration to validate\n * @throws Error if configuration is invalid\n */\nexport function validateLayerConfig(config: LayerConfig): void {\n if (!config.layer) {\n throw new Error('[LayerManager] layer is required');\n }\n if (config.layer !== 'wspace' && config.layer !== 'global') {\n throw new Error(`[LayerManager] Invalid layer '${config.layer}'. Must be 'wspace' or 'global'`);\n }\n if (!config.serviceName) {\n throw new Error('[LayerManager] serviceName is required');\n }\n\n // Validate naming convention\n const expectedPrefix = `${config.layer}-`;\n if (!config.serviceName.startsWith(expectedPrefix)) {\n logger.warn('[LayerManager] Service name does not follow naming convention', {\n serviceName: config.serviceName,\n expectedPrefix,\n layer: config.layer,\n });\n }\n}\n\n// Re-export types for convenience\nexport type {\n ServiceLayer,\n LayerConfig,\n LayerGatewayConfig,\n LayerResourceUrls,\n LayerFullConfig,\n GatewayRoutingConfig,\n} from '../types/layer.js';\n\nexport { DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES, DEFAULT_LAYER_STREAMS } from '../types/layer.js';\n"]}
@@ -1,4 +1,4 @@
1
- import { logger } from './chunk-CBZNP6RF.js';
1
+ import { logger } from './chunk-RU266375.js';
2
2
  import { __name } from './chunk-XE4OXN2W.js';
3
3
  import { GraphQLError } from 'graphql';
4
4
 
@@ -503,5 +503,5 @@ function createWorkspaceGuardPlugin(config) {
503
503
  __name(createWorkspaceGuardPlugin, "createWorkspaceGuardPlugin");
504
504
 
505
505
  export { UserFacingGraphQLError, createHttpErrorResponse, createHumanReadableErrorPlugin, createWorkspaceGuardPlugin, formatHttpError, normalizeError, normalizeExecutionResultErrors, normalizeGraphQLResponse, normalizeGraphQLResponsePayload, toUserFacingGraphQLError };
506
- //# sourceMappingURL=chunk-OQLDXOZ3.js.map
507
- //# sourceMappingURL=chunk-OQLDXOZ3.js.map
506
+ //# sourceMappingURL=chunk-6GL4SLU7.js.map
507
+ //# sourceMappingURL=chunk-6GL4SLU7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/errors.ts","../src/server/workspace-guard.ts"],"names":["DEFAULT_ERROR_CODE","DEFAULT_HTTP_STATUS","INVALID_CREDENTIALS_USER_MESSAGE","DEFAULT_USER_MESSAGES","BAD_REQUEST","BAD_USER_INPUT","CAPTCHA_FAILED","CAPTCHA_REQUIRED","COMPLEXITY_TOO_HIGH","CONFLICT","FORBIDDEN","INTERNAL_SERVER_ERROR","INVALID_PASSWORD","NOT_FOUND","PERMISSION_DENIED","QUOTA_EXCEEDED","QUOTA_EXHAUSTED","RATE_LIMITED","RESOURCE_CAP_EXCEEDED","STORAGE_QUOTA_EXCEEDED","TIMEOUT","UNAUTHENTICATED","VALIDATION_ERROR","WORKSPACE_REQUIRED","DEFAULT_STATUS_BY_CODE","SENSITIVE_EXTENSION_KEYS","Set","TECHNICAL_MESSAGE_PATTERNS","GRAPHQL_VALIDATION_MESSAGE_PATTERNS","isRecord","value","Array","isArray","readString","record","key","trim","length","readExtensions","error","extensions","readOriginalError","GraphQLError","originalError","Error","undefined","sanitizeExtensions","sanitized","Object","entries","has","normalizeCode","code","replace","toUpperCase","inferCodeFromMessage","message","lower","toLowerCase","some","pattern","test","includes","inferCode","extensionCode","originalCode","directCode","readErrorMessage","isLikelyTechnicalMessage","readExplicitUserMessage","resolveUserMessage","explicit","fallback","resolveTechnicalMessage","options","environment","serviceName","readHttpStatus","http","normalizeError","originalExtensions","directExtensions","mergedExtensions","userMessage","technicalMessage","status","UserFacingGraphQLError","details","httpStatus","cause","name","toUserFacingGraphQLError","normalized","nodes","source","positions","path","normalizeExecutionResultErrors","result","forEach","entry","errors","map","normalizeGraphQLResponsePayload","payload","normalizeGraphQLResponse","response","contentType","headers","get","text","Response","statusText","JSON","parse","stringify","createHumanReadableErrorPlugin","onExecute","onExecuteDone","formatHttpError","body","createHttpErrorResponse","formatted","WorkspaceRequiredError","isFieldPublic","field","directives","astNode","dir","args","arguments","arg","kind","resolveOperationType","document","operationName","defs","definitions","def","operation","allRootFieldsPublic","schema","opType","rootType","getMutationType","getSubscriptionType","getQueryType","fields","getFields","opDef","find","d","selections","selectionSet","sel","fieldName","startsWith","fieldDef","createWorkspaceGuardPlugin","config","enabled","whitelistedOperations","allowPublicDirective","errorMessage","logger","info","context","contextValue","workspaceId","workspace","id","headerWorkspaceId","request","warn"],"mappings":";;;;AAwCA,IAAMA,kBAAAA,GAAqB,uBAAA;AAC3B,IAAMC,mBAAAA,GAAsB,GAAA;AAK5B,IAAMC,gCAAAA,GAAmC,wCAAA;AAEzC,IAAMC,qBAAAA,GAAgD;EACpDC,WAAAA,EAAa,yCAAA;EACbC,cAAAA,EAAgB,6CAAA;EAChBC,cAAAA,EAAgB,4CAAA;EAChBC,gBAAAA,EAAkB,+CAAA;EAClBC,mBAAAA,EAAqB,yEAAA;EACrBC,QAAAA,EAAU,yEAAA;EACVC,SAAAA,EAAW,wCAAA;EACXC,qBAAAA,EAAuB,yCAAA;EACvBC,gBAAAA,EAAkBV,gCAAAA;EAClBW,SAAAA,EAAW,uCAAA;EACXC,iBAAAA,EAAmB,wCAAA;EACnBC,cAAAA,EAAgB,kCAAA;EAChBC,eAAAA,EAAiB,kCAAA;EACjBC,YAAAA,EAAc,wDAAA;EACdC,qBAAAA,EAAuB,gEAAA;EACvBC,sBAAAA,EAAwB,mEAAA;EACxBC,OAAAA,EAAS,8CAAA;EACTC,eAAAA,EAAiB,6BAAA;EACjBC,gBAAAA,EAAkB,6CAAA;EAClBC,kBAAAA,EAAoB;AACtB,CAAA;AAEA,IAAMC,sBAAAA,GAAiD;EACrDpB,WAAAA,EAAa,GAAA;EACbC,cAAAA,EAAgB,GAAA;EAChBC,cAAAA,EAAgB,GAAA;EAChBC,gBAAAA,EAAkB,GAAA;EAClBC,mBAAAA,EAAqB,GAAA;EACrBC,QAAAA,EAAU,GAAA;EACVC,SAAAA,EAAW,GAAA;EACXE,gBAAAA,EAAkB,GAAA;EAClBC,SAAAA,EAAW,GAAA;EACXC,iBAAAA,EAAmB,GAAA;EACnBC,cAAAA,EAAgB,GAAA;EAChBC,eAAAA,EAAiB,GAAA;EACjBC,YAAAA,EAAc,GAAA;EACdC,qBAAAA,EAAuB,GAAA;EACvBC,sBAAAA,EAAwB,GAAA;EACxBC,OAAAA,EAAS,GAAA;EACTC,eAAAA,EAAiB,GAAA;EACjBC,gBAAAA,EAAkB,GAAA;EAClBC,kBAAAA,EAAoB;AACtB,CAAA;AAEA,IAAME,wBAAAA,uBAA+BC,GAAAA,CAAI;AAAC,EAAA,WAAA;AAAa,EAAA,eAAA;AAAiB,EAAA,OAAA;AAAS,EAAA;AAAa,CAAA,CAAA;AAE9F,IAAMC,0BAAAA,GAA6B;AACjC,EAAA,aAAA;AACA,EAAA,UAAA;AACA,EAAA,iBAAA;AACA,EAAA,YAAA;AACA,EAAA,gBAAA;AACA,EAAA,WAAA;AACA,EAAA,kBAAA;AACA,EAAA,eAAA;AACA,EAAA,eAAA;AACA,EAAA,YAAA;AACA,EAAA,gCAAA;AACA,EAAA,4BAAA;AACA,EAAA;;AAGF,IAAMC,mCAAAA,GAAsC;AAC1C,EAAA,iBAAA;AACA,EAAA,wBAAA;AACA,EAAA,+CAAA;AACA,EAAA,uCAAA;AACA,EAAA,wCAAA;AACA,EAAA,kCAAA;AACA,EAAA,2CAAA;AACA,EAAA,uCAAA;AACA,EAAA,0CAAA;AACA,EAAA,yBAAA;AACA,EAAA;;AAGF,SAASC,SAASC,KAAAA,EAAc;AAC9B,EAAA,OAAO,OAAOA,UAAU,QAAA,IAAYA,KAAAA,KAAU,QAAQ,CAACC,KAAAA,CAAMC,QAAQF,KAAAA,CAAAA;AACvE;AAFSD,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AAIT,SAASI,UAAAA,CAAWC,QAAiCC,GAAAA,EAAW;AAC9D,EAAA,MAAML,KAAAA,GAAQI,OAAOC,GAAAA,CAAAA;AACrB,EAAA,OAAO,OAAOL,UAAU,QAAA,IAAYA,KAAAA,CAAMM,MAAI,CAAGC,MAAAA,GAAS,IAAIP,KAAAA,GAAQ,IAAA;AACxE;AAHSG,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAKT,SAASK,eAAeC,KAAAA,EAAc;AACpC,EAAA,IAAI,CAACV,QAAAA,CAASU,KAAAA,CAAAA,SAAe,EAAC;AAC9B,EAAA,MAAMC,UAAAA,GAAaD,MAAM,YAAA,CAAA;AACzB,EAAA,OAAOV,QAAAA,CAASW,UAAAA,CAAAA,GAAcA,UAAAA,GAAa,EAAC;AAC9C;AAJSF,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAMT,SAASG,kBAAkBF,KAAAA,EAAc;AACvC,EAAA,IAAIA,KAAAA,YAAiBG,YAAAA,IAAgBH,KAAAA,CAAMI,aAAAA,YAAyBC,KAAAA,EAAO;AACzE,IAAA,OAAOL,KAAAA,CAAMI,aAAAA;AACf,EAAA;AACA,EAAA,OAAOE,MAAAA;AACT;AALSJ,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AAOT,SAASK,mBAAmBN,UAAAA,EAAmC;AAC7D,EAAA,MAAMO,YAAqC,EAAC;AAC5C,EAAA,KAAA,MAAW,CAACZ,GAAAA,EAAKL,KAAAA,KAAUkB,MAAAA,CAAOC,OAAAA,CAAQT,UAAAA,CAAAA,EAAa;AACrD,IAAA,IAAI,CAACf,wBAAAA,CAAyByB,GAAAA,CAAIf,GAAAA,CAAAA,EAAM;AACtCY,MAAAA,SAAAA,CAAUZ,GAAAA,CAAAA,GAAOL,KAAAA;AACnB,IAAA;AACF,EAAA;AACA,EAAA,OAAOiB,SAAAA;AACT;AARSD,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAUT,SAASK,cAAcC,IAAAA,EAAmB;AACxC,EAAA,IAAI,CAACA,MAAM,OAAOpD,kBAAAA;AAClB,EAAA,OAAOoD,KACJhB,IAAAA,EAAI,CACJiB,QAAQ,SAAA,EAAW,GAAA,EACnBC,WAAAA,EAAW;AAChB;AANSH,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAQT,SAASI,qBAAqBC,OAAAA,EAAe;AAC3C,EAAA,MAAMC,KAAAA,GAAQD,QAAQE,WAAAA,EAAW;AAEjC,EAAA,IAAI9B,mCAAAA,CAAoC+B,KAAK,CAACC,OAAAA,KAAYA,QAAQC,IAAAA,CAAKL,OAAAA,CAAAA,CAAAA,EAAW;AAChF,IAAA,OAAO,gBAAA;AACT,EAAA;AAEA,EAAA,IACEC,KAAAA,CAAMK,SAAS,iBAAA,CAAA,IACfL,MAAMK,QAAAA,CAAS,mBAAA,CAAA,IACfL,KAAAA,CAAMK,QAAAA,CAAS,yBAAA,KACfL,KAAAA,CAAMK,QAAAA,CAAS,cAAA,CAAA,IACfL,KAAAA,CAAMK,QAAAA,CAAS,gBAAA,CAAA,IACfL,KAAAA,CAAMK,QAAAA,CAAS,YAAA,CAAA,EACf;AACA,IAAA,OAAO,iBAAA;AACT,EAAA;AAEA,EAAA,IAAIL,MAAMK,QAAAA,CAAS,mBAAA,KAAwBL,KAAAA,CAAMK,QAAAA,CAAS,uBAAA,CAAA,EAA0B;AAClF,IAAA,OAAO,oBAAA;AACT,EAAA;AAEA,EAAA,IACEL,KAAAA,CAAMK,QAAAA,CAAS,WAAA,CAAA,IACfL,MAAMK,QAAAA,CAAS,eAAA,CAAA,IACfL,KAAAA,CAAMK,SAAS,mBAAA,CAAA,IACfL,KAAAA,CAAMK,QAAAA,CAAS,gBAAA,CAAA,EACf;AACA,IAAA,OAAO,WAAA;AACT,EAAA;AAEA,EAAA,IAAIL,MAAMK,QAAAA,CAAS,WAAA,KAAgBL,KAAAA,CAAMK,QAAAA,CAAS,aAAA,CAAA,EAAgB;AAChE,IAAA,OAAO,WAAA;AACT,EAAA;AAEA,EAAA,IAAIL,KAAAA,CAAMK,QAAAA,CAAS,gBAAA,CAAA,IAAqBL,KAAAA,CAAMK,QAAAA,CAAS,eAAA,CAAA,IAAoBL,KAAAA,CAAMK,QAAAA,CAAS,UAAA,CAAA,EAAa;AACrG,IAAA,OAAO,UAAA;AACT,EAAA;AAEA,EAAA,IAAIL,KAAAA,CAAMK,QAAAA,CAAS,OAAA,CAAA,IAAYL,KAAAA,CAAMK,QAAAA,CAAS,cAAA,CAAA,IAAmBL,KAAAA,CAAMK,QAAAA,CAAS,eAAA,CAAA,EAAkB;AAChG,IAAA,OAAO,gBAAA;AACT,EAAA;AAEA,EAAA,IAAIL,MAAMK,QAAAA,CAAS,SAAA,KAAcL,KAAAA,CAAMK,QAAAA,CAAS,WAAA,CAAA,EAAc;AAC5D,IAAA,OAAO,SAAA;AACT,EAAA;AAEA,EAAA,IACEL,KAAAA,CAAMK,QAAAA,CAAS,UAAA,CAAA,IACfL,MAAMK,QAAAA,CAAS,SAAA,CAAA,IACfL,KAAAA,CAAMK,SAAS,SAAA,CAAA,IACfL,KAAAA,CAAMK,QAAAA,CAAS,aAAA,CAAA,EACf;AACA,IAAA,OAAO,gBAAA;AACT,EAAA;AAEA,EAAA,OAAO9D,kBAAAA;AACT;AAzDSuD,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AA2DT,SAASQ,SAAAA,CAAUxB,KAAAA,EAAgBC,UAAAA,EAAqCG,aAAAA,EAAgC;AACtG,EAAA,MAAMqB,aAAAA,GAAgB,OAAOxB,UAAAA,CAAW,MAAA,MAAY,QAAA,GAAWA,UAAAA,CAAW,MAAA,CAAA,GAAU,IAAA;AACpF,EAAA,IAAIwB,aAAAA,EAAe,OAAOb,aAAAA,CAAca,aAAAA,CAAAA;AAExC,EAAA,IAAInC,QAAAA,CAASc,aAAAA,CAAAA,EAAgB;AAC3B,IAAA,MAAMsB,YAAAA,GAAehC,UAAAA,CAAWU,aAAAA,EAAe,MAAA,CAAA;AAC/C,IAAA,IAAIsB,YAAAA,EAAc,OAAOd,aAAAA,CAAcc,YAAAA,CAAAA;AACzC,EAAA;AAEA,EAAA,IAAIpC,QAAAA,CAASU,KAAAA,CAAAA,EAAQ;AACnB,IAAA,MAAM2B,UAAAA,GAAajC,UAAAA,CAAWM,KAAAA,EAAO,MAAA,CAAA;AACrC,IAAA,IAAI2B,UAAAA,EAAY,OAAOf,aAAAA,CAAce,UAAAA,CAAAA;AACvC,EAAA;AAEA,EAAA,MAAMV,OAAAA,GAAUW,iBAAiB5B,KAAAA,CAAAA;AACjC,EAAA,OAAOgB,qBAAqBC,OAAAA,CAAAA;AAC9B;AAhBSO,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAkBT,SAASI,iBAAiB5B,KAAAA,EAAc;AACtC,EAAA,IAAIA,iBAAiBK,KAAAA,IAASL,KAAAA,CAAMiB,QAAQpB,IAAAA,EAAI,CAAGC,SAAS,CAAA,EAAG;AAC7D,IAAA,OAAOE,KAAAA,CAAMiB,OAAAA;AACf,EAAA;AACA,EAAA,IAAI3B,QAAAA,CAASU,KAAAA,CAAAA,EAAQ;AACnB,IAAA,MAAMiB,OAAAA,GAAUvB,UAAAA,CAAWM,KAAAA,EAAO,SAAA,CAAA;AAClC,IAAA,IAAIiB,SAAS,OAAOA,OAAAA;AACtB,EAAA;AACA,EAAA,OAAOrD,qBAAAA,CAAsBH,kBAAAA,CAAuB;AACtD;AATSmE,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAWT,SAASC,yBAAyBZ,OAAAA,EAAe;AAC/C,EAAA,IAAIA,OAAAA,CAAQnB,MAAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AACjC,EAAA,IAAImB,OAAAA,CAAQM,QAAAA,CAAS,IAAA,CAAA,EAAO,OAAO,IAAA;AACnC,EAAA,IAAIN,OAAAA,CAAQM,SAAS,GAAA,CAAA,IAAQN,QAAQM,QAAAA,CAAS,GAAA,GAAM,OAAO,IAAA;AAC3D,EAAA,IAAIlC,mCAAAA,CAAoC+B,KAAK,CAACC,OAAAA,KAAYA,QAAQC,IAAAA,CAAKL,OAAAA,CAAAA,CAAAA,EAAW,OAAO,IAAA;AACzF,EAAA,OAAO7B,2BAA2BgC,IAAAA,CAAK,CAACC,YAAYA,OAAAA,CAAQC,IAAAA,CAAKL,OAAAA,CAAAA,CAAAA;AACnE;AANSY,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AAQT,SAASC,wBAAwB7B,UAAAA,EAAmC;AAClE,EAAA,OACEP,UAAAA,CAAWO,UAAAA,EAAY,aAAA,CAAA,IACvBP,UAAAA,CAAWO,YAAY,cAAA,CAAA,IACvBP,UAAAA,CAAWO,UAAAA,EAAY,gBAAA,CAAA;AAE3B;AANS6B,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAQT,SAASC,kBAAAA,CAAmBlB,IAAAA,EAAcI,OAAAA,EAAiBhB,UAAAA,EAAmC;AAC5F,EAAA,MAAM+B,QAAAA,GAAWF,wBAAwB7B,UAAAA,CAAAA;AACzC,EAAA,IAAI+B,UAAU,OAAOA,QAAAA;AAErB,EAAA,MAAMC,WACJrE,qBAAAA,CAAsBiD,IAAAA,CAAAA,IACtBjD,qBAAAA,CAAsBH,kBAAAA,CAAAA,IACtB,yCAAA;AACF,EAAA,IAAIoD,SAASpD,kBAAAA,EAAoB;AAC/B,IAAA,OAAOwE,QAAAA;AACT,EAAA;AAEA,EAAA,IAAI,CAACJ,wBAAAA,CAAyBZ,OAAAA,CAAAA,EAAU;AACtC,IAAA,OAAOA,OAAAA;AACT,EAAA;AAEA,EAAA,OAAOgB,QAAAA;AACT;AAjBSF,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAmBT,SAASG,uBAAAA,CACPrB,IAAAA,EACAI,OAAAA,EACAhB,UAAAA,EACAkC,OAAAA,EAAkC;AAElC,EAAA,MAAMH,QAAAA,GAAWtC,UAAAA,CAAWO,UAAAA,EAAY,kBAAA,CAAA;AACxC,EAAA,IAAI+B,UAAU,OAAOA,QAAAA;AAErB,EAAA,IAAIG,OAAAA,CAAQC,WAAAA,KAAgB,YAAA,IAAgBvB,IAAAA,KAASpD,kBAAAA,EAAoB;AACvE,IAAA,OAAO0E,QAAQE,WAAAA,GAAc,CAAA,EAAGF,QAAQE,WAAW,CAAA,UAAA,EAAa5E,kBAAAA,CAAAA,CAAAA,GAAuBA,kBAAAA;AACzF,EAAA;AAEA,EAAA,OAAOwD,OAAAA;AACT;AAdSiB,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAgBT,SAASI,cAAAA,CAAerC,YAAqCY,IAAAA,EAAY;AACvE,EAAA,MAAM0B,IAAAA,GAAOtC,WAAW,MAAA,CAAA;AACxB,EAAA,IAAIX,SAASiD,IAAAA,CAAAA,IAAS,OAAOA,IAAAA,CAAK,QAAA,MAAc,QAAA,EAAU;AACxD,IAAA,OAAOA,KAAK,QAAA,CAAA;AACd,EAAA;AACA,EAAA,OAAOtD,sBAAAA,CAAuB4B,IAAAA,CAAAA,IAASnD,mBAAAA;AACzC;AANS4E,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAQF,SAASE,cAAAA,CAAexC,KAAAA,EAAgBmC,OAAAA,GAAqC,EAAC,EAAC;AACpF,EAAA,MAAM/B,aAAAA,GAAgBF,kBAAkBF,KAAAA,CAAAA;AACxC,EAAA,MAAMyC,kBAAAA,GAAqB1C,eAAeK,aAAAA,CAAAA;AAC1C,EAAA,MAAMsC,gBAAAA,GAAmB3C,eAAeC,KAAAA,CAAAA;AACxC,EAAA,MAAM2C,mBAAmBpC,kBAAAA,CAAmB;IAAE,GAAGkC,kBAAAA;IAAoB,GAAGC;GAAiB,CAAA;AACzF,EAAA,MAAMzB,OAAAA,GAAUW,iBAAiB5B,KAAAA,CAAAA;AACjC,EAAA,MAAMa,IAAAA,GAAOW,SAAAA,CAAUxB,KAAAA,EAAO2C,gBAAAA,EAAkBvC,aAAAA,CAAAA;AAChD,EAAA,MAAMwC,WAAAA,GAAcb,kBAAAA,CAAmBlB,IAAAA,EAAMI,OAAAA,EAAS0B,gBAAAA,CAAAA;AACtD,EAAA,MAAME,gBAAAA,GAAmBX,uBAAAA,CAAwBrB,IAAAA,EAAMI,OAAAA,EAAS0B,kBAAkBR,OAAAA,CAAAA;AAClF,EAAA,MAAMW,MAAAA,GAASR,cAAAA,CAAeK,gBAAAA,EAAkB9B,IAAAA,CAAAA;AAEhD,EAAA,MAAMZ,UAAAA,GAAsC;IAC1C,GAAG0C,gBAAAA;AACH9B,IAAAA,IAAAA;AACA+B,IAAAA,WAAAA;AACAC,IAAAA;AACF,GAAA;AAEA,EAAA,IAAIV,QAAQE,WAAAA,EAAa;AACvBpC,IAAAA,UAAAA,CAAW,aAAA,IAAiBkC,OAAAA,CAAQE,WAAAA;AACtC,EAAA;AAEA,EAAA,IAAI,CAAC/C,QAAAA,CAASW,UAAAA,CAAW,MAAA,CAAO,CAAA,EAAG;AACjCA,IAAAA,UAAAA,CAAW,MAAA,CAAA,GAAU;AAAE6C,MAAAA;AAAO,KAAA;AAChC,EAAA;AAEA,EAAA,OAAO;AACLjC,IAAAA,IAAAA;AACA+B,IAAAA,WAAAA;AACAC,IAAAA,gBAAAA;AACA5C,IAAAA,UAAAA;AACA6C,IAAAA;AACF,GAAA;AACF;AAjCgBN,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAmCT,IAAMO,sBAAAA,GAAN,cAAqC5C,YAAAA,CAAAA;EA3V5C;;;AA4VE,EAAA,WAAA,CAAYgC,OAAAA,EAAiC;AAC3C,IAAA,MAAMlC,UAAAA,GAAsC;MAC1CY,IAAAA,EAAMD,aAAAA,CAAcuB,QAAQtB,IAAI,CAAA;AAChC+B,MAAAA,WAAAA,EAAaT,OAAAA,CAAQS,WAAAA;MACrBC,gBAAAA,EAAkBV,OAAAA,CAAQU,oBAAoBV,OAAAA,CAAQS;AACxD,KAAA;AAEA,IAAA,IAAIT,QAAQa,OAAAA,EAAS;AACnB/C,MAAAA,UAAAA,CAAW,SAAA,IAAakC,OAAAA,CAAQa,OAAAA;AAClC,IAAA;AAEA,IAAA,IAAIb,QAAQc,UAAAA,EAAY;AACtBhD,MAAAA,UAAAA,CAAW,MAAA,CAAA,GAAU;AAAE6C,QAAAA,MAAAA,EAAQX,OAAAA,CAAQc;AAAW,OAAA;AACpD,IAAA;AAEA,IAAA,KAAA,CAAMd,QAAQS,WAAAA,EAAa;AACzBxC,MAAAA,aAAAA,EAAe+B,OAAAA,CAAQe,KAAAA;AACvBjD,MAAAA;KACF,CAAA;AACA,IAAA,IAAA,CAAKkD,IAAAA,GAAO,wBAAA;AACd,EAAA;AACF;AAEO,SAASC,wBAAAA,CAAyBpD,KAAAA,EAAgBmC,OAAAA,GAAqC,EAAC,EAAC;AAC9F,EAAA,MAAMkB,UAAAA,GAAab,cAAAA,CAAexC,KAAAA,EAAOmC,OAAAA,CAAAA;AAEzC,EAAA,IAAInC,iBAAiBG,YAAAA,EAAc;AACjC,IAAA,OAAO,IAAIA,YAAAA,CAAakD,UAAAA,CAAWT,WAAAA,EAAa;AAC9CU,MAAAA,KAAAA,EAAOtD,KAAAA,CAAMsD,KAAAA;AACbC,MAAAA,MAAAA,EAAQvD,KAAAA,CAAMuD,MAAAA;AACdC,MAAAA,SAAAA,EAAWxD,KAAAA,CAAMwD,SAAAA;AACjBC,MAAAA,IAAAA,EAAMzD,KAAAA,CAAMyD,IAAAA;AACZrD,MAAAA,aAAAA,EAAeJ,KAAAA,CAAMI,aAAAA;AACrBH,MAAAA,UAAAA,EAAYoD,UAAAA,CAAWpD;KACzB,CAAA;AACF,EAAA;AAEA,EAAA,OAAO,IAAIE,YAAAA,CAAakD,UAAAA,CAAWT,WAAAA,EAAa;IAC9CxC,aAAAA,EAAeJ,KAAAA,YAAiBK,QAAQL,KAAAA,GAAQM,MAAAA;AAChDL,IAAAA,UAAAA,EAAYoD,UAAAA,CAAWpD;GACzB,CAAA;AACF;AAlBgBmD,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AAoBT,SAASM,8BAAAA,CAA+BC,MAAAA,EAAiBxB,OAAAA,GAAqC,EAAC,EAAC;AACrG,EAAA,IAAI3C,KAAAA,CAAMC,OAAAA,CAAQkE,MAAAA,CAAAA,EAAS;AACzBA,IAAAA,MAAAA,CAAOC,QAAQ,CAACC,KAAAA,KAAUH,8BAAAA,CAA+BG,KAAAA,EAAO1B,OAAAA,CAAAA,CAAAA;AAChE,IAAA;AACF,EAAA;AAEA,EAAA,IAAI,CAAC7C,QAAAA,CAASqE,MAAAA,CAAAA,EAAS;AACvB,EAAA,MAAMG,MAAAA,GAASH,OAAO,QAAA,CAAA;AACtB,EAAA,IAAI,CAACnE,KAAAA,CAAMC,OAAAA,CAAQqE,MAAAA,CAAAA,IAAWA,MAAAA,CAAOhE,WAAW,CAAA,EAAG;AAEnD6D,EAAAA,MAAAA,CAAO,QAAA,IAAYG,MAAAA,CAAOC,GAAAA,CAAI,CAAC/D,KAAAA,KAAUoD,wBAAAA,CAAyBpD,KAAAA,EAAOmC,OAAAA,CAAAA,CAAAA;AAC3E;AAXgBuB,MAAAA,CAAAA,8BAAAA,EAAAA,gCAAAA,CAAAA;AAaT,SAASM,+BAAAA,CAAgCC,OAAAA,EAAkB9B,OAAAA,GAAqC,EAAC,EAAC;AACvGuB,EAAAA,8BAAAA,CAA+BO,SAAS9B,OAAAA,CAAAA;AACxC,EAAA,OAAO8B,OAAAA;AACT;AAHgBD,MAAAA,CAAAA,+BAAAA,EAAAA,iCAAAA,CAAAA;AAKhB,eAAsBE,wBAAAA,CACpBC,QAAAA,EACAhC,OAAAA,GAAqC,EAAC,EAAC;AAEvC,EAAA,MAAMiC,WAAAA,GAAcD,QAAAA,CAASE,OAAAA,CAAQC,GAAAA,CAAI,cAAA,CAAA,IAAmB,EAAA;AAC5D,EAAA,IAAI,CAACF,WAAAA,CAAYjD,WAAAA,EAAW,CAAGI,QAAAA,CAAS,MAAA,CAAA,EAAS;AAC/C,IAAA,OAAO4C,QAAAA;AACT,EAAA;AAEA,EAAA,MAAMI,IAAAA,GAAO,MAAMJ,QAAAA,CAASI,IAAAA,EAAI;AAChC,EAAA,IAAI,CAACA,IAAAA,EAAM;AACT,IAAA,OAAO,IAAIC,SAASD,IAAAA,EAAM;AACxBzB,MAAAA,MAAAA,EAAQqB,QAAAA,CAASrB,MAAAA;AACjB2B,MAAAA,UAAAA,EAAYN,QAAAA,CAASM,UAAAA;AACrBJ,MAAAA,OAAAA,EAASF,QAAAA,CAASE;KACpB,CAAA;AACF,EAAA;AAEA,EAAA,IAAIJ,OAAAA;AACJ,EAAA,IAAI;AACFA,IAAAA,OAAAA,GAAUS,IAAAA,CAAKC,MAAMJ,IAAAA,CAAAA;EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAIC,SAASD,IAAAA,EAAM;AACxBzB,MAAAA,MAAAA,EAAQqB,QAAAA,CAASrB,MAAAA;AACjB2B,MAAAA,UAAAA,EAAYN,QAAAA,CAASM,UAAAA;AACrBJ,MAAAA,OAAAA,EAASF,QAAAA,CAASE;KACpB,CAAA;AACF,EAAA;AAEAL,EAAAA,+BAAAA,CAAgCC,SAAS9B,OAAAA,CAAAA;AAEzC,EAAA,OAAO,IAAIqC,QAAAA,CAASE,IAAAA,CAAKE,SAAAA,CAAUX,OAAAA,CAAAA,EAAU;AAC3CnB,IAAAA,MAAAA,EAAQqB,QAAAA,CAASrB,MAAAA;AACjB2B,IAAAA,UAAAA,EAAYN,QAAAA,CAASM,UAAAA;AACrBJ,IAAAA,OAAAA,EAASF,QAAAA,CAASE;GACpB,CAAA;AACF;AApCsBH,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AAsCf,SAASW,8BAAAA,CAA+B1C,OAAAA,GAAqC,EAAC,EAAC;AACpF,EAAA,OAAO;IACL2C,SAAAA,GAAAA;AACE,MAAA,OAAO;QACLC,aAAAA,CAAc,EAAEpB,QAAM,EAAuB;AAC3CD,UAAAA,8BAAAA,CAA+BC,QAAQxB,OAAAA,CAAAA;AACzC,QAAA;AACF,OAAA;AACF,IAAA;AACF,GAAA;AACF;AAVgB0C,MAAAA,CAAAA,8BAAAA,EAAAA,gCAAAA,CAAAA;AAYT,SAASG,eAAAA,CAAgBhF,KAAAA,EAAgBmC,OAAAA,GAAqC,EAAC,EAAC;AACrF,EAAA,MAAMkB,UAAAA,GAAab,cAAAA,CAAexC,KAAAA,EAAOmC,OAAAA,CAAAA;AACzC,EAAA,OAAO;AACLW,IAAAA,MAAAA,EAAQO,UAAAA,CAAWP,MAAAA;IACnBmC,IAAAA,EAAM;AACJjF,MAAAA,KAAAA,EAAOqD,UAAAA,CAAWT,WAAAA;AAClB3B,MAAAA,OAAAA,EAASoC,UAAAA,CAAWT,WAAAA;AACpBA,MAAAA,WAAAA,EAAaS,UAAAA,CAAWT,WAAAA;AACxBC,MAAAA,gBAAAA,EAAkBQ,UAAAA,CAAWR,gBAAAA;AAC7BhC,MAAAA,IAAAA,EAAMwC,UAAAA,CAAWxC,IAAAA;AACjBZ,MAAAA,UAAAA,EAAYoD,UAAAA,CAAWpD;AACzB;AACF,GAAA;AACF;AAbgB+E,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAeT,SAASE,uBAAAA,CAAwBlF,KAAAA,EAAgBmC,OAAAA,GAAqC,EAAC,EAAC;AAC7F,EAAA,MAAMgD,SAAAA,GAAYH,eAAAA,CAAgBhF,KAAAA,EAAOmC,OAAAA,CAAAA;AACzC,EAAA,OAAO,IAAIqC,QAAAA,CAASE,IAAAA,CAAKE,SAAAA,CAAUO,SAAAA,CAAUF,IAAI,CAAA,EAAG;AAClDnC,IAAAA,MAAAA,EAAQqC,SAAAA,CAAUrC,MAAAA;IAClBuB,OAAAA,EAAS;MAAE,cAAA,EAAgB;AAAmB;GAChD,CAAA;AACF;AANgBa,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;AC7YhB,IAAME,sBAAAA,GAAN,MAAMA,uBAAAA,SAA+BrC,sBAAAA,CAAAA;EA7ErC;;;AA8EE,EAAA,WAAA,CAAY9B,OAAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM;MACJJ,IAAAA,EAAM,oBAAA;MACN+B,WAAAA,EAAa,0CAAA;MACbC,gBAAAA,EAAkB5B,OAAAA;MAClBgC,UAAAA,EAAY;KACd,CAAA;AACA,IAAA,IAAA,CAAKE,IAAAA,GAAO,wBAAA;AACd,EAAA;AACF,CAAA;AAkCA,SAASkC,cAAcC,KAAAA,EAA+B;AACpD,EAAA,MAAMC,UAAAA,GAAaD,OAAOE,OAAAA,EAASD,UAAAA;AACnC,EAAA,IAAI,CAACA,UAAAA,IAAcA,UAAAA,CAAWzF,MAAAA,KAAW,GAAG,OAAO,KAAA;AAEnD,EAAA,KAAA,MAAW2F,OAAOF,UAAAA,EAAY;AAC5B,IAAA,MAAMpC,IAAAA,GAAOsC,IAAItC,IAAAA,EAAM5D,KAAAA;AACvB,IAAA,IAAI4D,IAAAA,KAAS,UAAU,OAAO,IAAA;AAC9B,IAAA,IAAIA,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAMuC,IAAAA,GAAOD,GAAAA,CAAIE,SAAAA,IAAa,EAAA;AAC9B,MAAA,KAAA,MAAWC,OAAOF,IAAAA,EAAM;AACtB,QAAA,IAAIE,GAAAA,CAAIzC,IAAAA,EAAM5D,KAAAA,KAAU,QAAA,IAAYqG,GAAAA,CAAIrG,KAAAA,EAAOsG,IAAAA,KAAS,cAAA,IAAkBD,GAAAA,CAAIrG,KAAAA,CAAMA,KAAAA,KAAU,IAAA,EAAM;AAClG,UAAA,OAAO,IAAA;AACT,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACA,EAAA,OAAO,KAAA;AACT;AAjBS8F,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAqCT,SAASS,oBAAAA,CACPC,UACAC,aAAAA,EAAwC;AAExC,EAAA,MAAMC,IAAAA,GAAOF,QAAAA,EAAUG,WAAAA,IAAe,EAAA;AACtC,EAAA,KAAA,MAAWC,OAAOF,IAAAA,EAAM;AACtB,IAAA,IAAIE,GAAAA,CAAIN,SAAS,qBAAA,EAAuB;AAGxC,IAAA,IAAIM,IAAIC,SAAAA,KAAc,CAACJ,iBAAiBG,GAAAA,CAAIhD,IAAAA,EAAM5D,UAAUyG,aAAAA,CAAAA,EAAgB;AAC1E,MAAA,OAAOG,GAAAA,CAAIC,SAAAA;AACb,IAAA;AACF,EAAA;AACA,EAAA,OAAO,OAAA;AACT;AAdSN,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAoBT,SAASO,mBAAAA,CACPC,MAAAA,EACAP,QAAAA,EACAC,aAAAA,EAAwC;AAExC,EAAA,IAAI,CAACM,MAAAA,IAAU,CAACP,QAAAA,EAAU,OAAO,KAAA;AAEjC,EAAA,MAAMQ,MAAAA,GAAST,oBAAAA,CAAqBC,QAAAA,EAAUC,aAAAA,CAAAA;AAC9C,EAAA,IAAIQ,QAAAA;AACJ,EAAA,IAAID,WAAW,UAAA,EAAY;AACzBC,IAAAA,QAAAA,GAAWF,OAAOG,eAAAA,IAAe;AACnC,EAAA,CAAA,MAAA,IAAWF,WAAW,cAAA,EAAgB;AACpCC,IAAAA,QAAAA,GAAWF,OAAOI,mBAAAA,IAAmB;EACvC,CAAA,MAAO;AACLF,IAAAA,QAAAA,GAAWF,OAAOK,YAAAA,IAAY;AAChC,EAAA;AAEA,EAAA,IAAI,CAACH,UAAU,OAAO,KAAA;AAEtB,EAAA,MAAMI,MAAAA,GAASJ,SAASK,SAAAA,EAAS;AACjC,EAAA,MAAMZ,IAAAA,GAAOF,QAAAA,CAASG,WAAAA,IAAe,EAAA;AAGrC,EAAA,MAAMY,KAAAA,GAAQb,IAAAA,CAAKc,IAAAA,CAAK,CAACC,CAAAA,KAAMA,CAAAA,CAAEZ,SAAAA,KAAc,CAACJ,aAAAA,IAAiBgB,CAAAA,CAAE7D,IAAAA,EAAM5D,KAAAA,KAAUyG,aAAAA,CAAY,CAAA;AAC/F,EAAA,MAAMiB,UAAAA,GAAaH,KAAAA,EAAOI,YAAAA,EAAcD,UAAAA,IAAc,EAAA;AACtD,EAAA,IAAIA,UAAAA,CAAWnH,MAAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAEpC,EAAA,KAAA,MAAWqH,OAAOF,UAAAA,EAAY;AAG5B,IAAA,IAAIE,GAAAA,CAAItB,IAAAA,IAAQsB,GAAAA,CAAItB,IAAAA,KAAS,SAAS,OAAO,KAAA;AAC7C,IAAA,MAAMuB,SAAAA,GAAYD,IAAIhE,IAAAA,EAAM5D,KAAAA;AAC5B,IAAA,IAAI,CAAC6H,WAAW,OAAO,KAAA;AAGvB,IAAA,IAAIA,SAAAA,CAAUC,UAAAA,CAAW,IAAA,CAAA,EAAO;AAChC,IAAA,MAAMC,QAAAA,GAAWV,OAAOQ,SAAAA,CAAAA;AACxB,IAAA,IAAI,CAAC/B,aAAAA,CAAciC,QAAAA,CAAAA,EAAW,OAAO,KAAA;AACvC,EAAA;AACA,EAAA,OAAO,IAAA;AACT;AAxCSjB,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAkEF,SAASkB,2BAA2BC,MAAAA,EAA6B;AACtE,EAAA,MAAMC,OAAAA,GAAUD,QAAQC,OAAAA,IAAW,IAAA;AACnC,EAAA,MAAMC,wBAAwB,IAAIvI,GAAAA,CAAIqI,MAAAA,EAAQE,qBAAAA,IAAyB,EAAE,CAAA;AACzE,EAAA,MAAMC,oBAAAA,GAAuBH,QAAQG,oBAAAA,IAAwB,IAAA;AAC7D,EAAA,MAAMC,YAAAA,GACJJ,QAAQI,YAAAA,IACR,4GAAA;AAEF,EAAA,IAAI,CAACH,OAAAA,EAAS;AACZI,IAAAA,MAAAA,CAAOC,KAAK,2CAAA,CAAA;AACZ,IAAA,OAAO,EAAC;AACV,EAAA;AAEAD,EAAAA,MAAAA,CAAOC,KAAK,0CAAA,EAA4C;IACtDJ,qBAAAA,EAAuB;AAAIA,MAAAA,GAAAA;;AAC3BC,IAAAA;GACF,CAAA;AAEA,EAAA,OAAO;IACL7C,SAAAA,CAAU,EACRY,MAAI,EAQL;AAEC,MAAA,IAAIM,gBAAgBN,IAAAA,CAAKM,aAAAA;AAEzB,MAAA,IAAI,CAACA,aAAAA,IAAiBN,IAAAA,CAAKK,QAAAA,EAAUG,WAAAA,EAAa;AAChD,QAAA,KAAA,MAAWC,GAAAA,IAAOT,IAAAA,CAAKK,QAAAA,CAASG,WAAAA,EAAa;AAC3C,UAAA,IAAIC,GAAAA,CAAIC,SAAAA,IAAaD,GAAAA,CAAIhD,IAAAA,EAAM5D,KAAAA,EAAO;AACpCyG,YAAAA,aAAAA,GAAgBG,IAAIhD,IAAAA,CAAK5D,KAAAA;AACzB,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AAGA,MAAA,IAAIyG,aAAAA,IAAiB0B,qBAAAA,CAAsB/G,GAAAA,CAAIqF,aAAAA,CAAAA,EAAgB;AAC7D,QAAA,OAAO1F,MAAAA;AACT,MAAA;AAGA,MAAA,IAAIqH,wBAAwBtB,mBAAAA,CAAoBX,IAAAA,CAAKY,QAAQZ,IAAAA,CAAKK,QAAAA,EAAUC,aAAAA,CAAAA,EAAgB;AAC1F,QAAA,OAAO1F,MAAAA;AACT,MAAA;AAGA,MAAA,MAAMyH,UAAUrC,IAAAA,CAAKsC,YAAAA;AACrB,MAAA,MAAMC,WAAAA,GAAcF,SAASG,SAAAA,EAAWC,EAAAA;AAGxC,MAAA,MAAMC,iBAAAA,GAAoBL,OAAAA,EAASM,OAAAA,EAAShE,OAAAA,EAASC,MAAM,gBAAA,CAAA;AAE3D,MAAA,IAAI,CAAC2D,WAAAA,IAAe,CAACG,iBAAAA,EAAmB;AACtCP,QAAAA,MAAAA,CAAOS,KAAK,8DAAA,EAAgE;AAC1EtC,UAAAA,aAAAA,EAAeA,aAAAA,IAAiB;SAClC,CAAA;AACA,QAAA,MAAM,IAAIZ,uBAAuBwC,YAAAA,CAAAA;AACnC,MAAA;AAEA,MAAA,OAAOtH,MAAAA;AACT,IAAA;AACF,GAAA;AACF;AApEgBiH,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA","file":"chunk-OQLDXOZ3.js","sourcesContent":["import { GraphQLError } from 'graphql';\n\nimport type { YogaPlugin } from './types.js';\n\nexport interface UserFacingErrorOptions {\n code: string;\n userMessage: string;\n technicalMessage?: string;\n details?: Record<string, unknown>;\n httpStatus?: number;\n cause?: Error;\n}\n\nexport interface ErrorNormalizationOptions {\n serviceName?: string;\n environment?: string;\n}\n\nexport interface NormalizedErrorState {\n code: string;\n userMessage: string;\n technicalMessage: string;\n extensions: Record<string, unknown>;\n status: number;\n}\n\nexport interface HttpErrorPayload {\n error: string;\n message: string;\n userMessage: string;\n technicalMessage: string;\n code: string;\n extensions: Record<string, unknown>;\n}\n\nexport interface HttpErrorResult {\n status: number;\n body: HttpErrorPayload;\n}\n\nconst DEFAULT_ERROR_CODE = 'INTERNAL_SERVER_ERROR';\nconst DEFAULT_HTTP_STATUS = 500;\n\n// Held in a separately-named const so the literal isn't assigned directly to\n// the `INVALID_PASSWORD` key — that pattern trips sonarjs/no-hardcoded-passwords\n// (a false positive: this is a user-facing message, not a credential).\nconst INVALID_CREDENTIALS_USER_MESSAGE = 'The password you entered is incorrect.';\n\nconst DEFAULT_USER_MESSAGES: Record<string, string> = {\n BAD_REQUEST: 'Please check the request and try again.',\n BAD_USER_INPUT: 'Please check the information and try again.',\n CAPTCHA_FAILED: 'The verification failed. Please try again.',\n CAPTCHA_REQUIRED: 'Please complete the verification to continue.',\n COMPLEXITY_TOO_HIGH: 'This request is too large to process. Please simplify it and try again.',\n CONFLICT: 'This change conflicts with existing data. Please refresh and try again.',\n FORBIDDEN: 'You do not have permission to do that.',\n INTERNAL_SERVER_ERROR: 'Something went wrong. Please try again.',\n INVALID_PASSWORD: INVALID_CREDENTIALS_USER_MESSAGE,\n NOT_FOUND: 'We could not find the requested item.',\n PERMISSION_DENIED: 'You do not have permission to do that.',\n QUOTA_EXCEEDED: \"You've reached your usage limit.\",\n QUOTA_EXHAUSTED: \"You've reached your usage limit.\",\n RATE_LIMITED: 'Too many requests. Please wait a moment and try again.',\n RESOURCE_CAP_EXCEEDED: \"You've reached your plan limit. Upgrade your plan to continue.\",\n STORAGE_QUOTA_EXCEEDED: \"You've reached your storage limit. Upgrade your plan to continue.\",\n TIMEOUT: 'The request took too long. Please try again.',\n UNAUTHENTICATED: 'Please sign in to continue.',\n VALIDATION_ERROR: 'Please check the information and try again.',\n WORKSPACE_REQUIRED: 'Please choose a workspace and try again.',\n};\n\nconst DEFAULT_STATUS_BY_CODE: Record<string, number> = {\n BAD_REQUEST: 400,\n BAD_USER_INPUT: 400,\n CAPTCHA_FAILED: 400,\n CAPTCHA_REQUIRED: 400,\n COMPLEXITY_TOO_HIGH: 400,\n CONFLICT: 409,\n FORBIDDEN: 403,\n INVALID_PASSWORD: 400,\n NOT_FOUND: 404,\n PERMISSION_DENIED: 403,\n QUOTA_EXCEEDED: 429,\n QUOTA_EXHAUSTED: 429,\n RATE_LIMITED: 429,\n RESOURCE_CAP_EXCEEDED: 429,\n STORAGE_QUOTA_EXCEEDED: 429,\n TIMEOUT: 504,\n UNAUTHENTICATED: 401,\n VALIDATION_ERROR: 400,\n WORKSPACE_REQUIRED: 403,\n};\n\nconst SENSITIVE_EXTENSION_KEYS = new Set(['exception', 'originalError', 'stack', 'stacktrace']);\n\nconst TECHNICAL_MESSAGE_PATTERNS = [\n /\\bprisma\\b/i,\n /\\bsql\\b/i,\n /\\bconstraint\\b/i,\n /\\bstack\\b/i,\n /\\bundefined\\b/i,\n /\\bnull\\b/i,\n /\\bECONN[A-Z_]*\\b/,\n /\\bETIMEDOUT\\b/,\n /\\bENOTFOUND\\b/,\n /\\bP\\d{4}\\b/,\n /Cannot (read|set|find|access)/i,\n /Build failed \\(exit \\d+\\)/i,\n /JSON\\.stringify/i,\n];\n\nconst GRAPHQL_VALIDATION_MESSAGE_PATTERNS = [\n /^Syntax Error:/i,\n /^Cannot query field\\b/i,\n /^Cannot return null for non-nullable field\\b/i,\n /^Unknown (argument|directive|type)\\b/i,\n /^Variable \"\\$[^\"]+\" got invalid value/i,\n /^Field \"[^\"]+\" of required type/i,\n /^Field \"[^\"]+\" must not have a selection/i,\n /^Field \"[^\"]+\" must have a selection/i,\n /^Fragment \"[^\"]+\" cannot be spread here/i,\n /^There can be only one/i,\n /Did you mean /i,\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(record: Record<string, unknown>, key: string): string | null {\n const value = record[key];\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\n\nfunction readExtensions(error: unknown): Record<string, unknown> {\n if (!isRecord(error)) return {};\n const extensions = error['extensions'];\n return isRecord(extensions) ? extensions : {};\n}\n\nfunction readOriginalError(error: unknown): Error | undefined {\n if (error instanceof GraphQLError && error.originalError instanceof Error) {\n return error.originalError;\n }\n return undefined;\n}\n\nfunction sanitizeExtensions(extensions: Record<string, unknown>): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(extensions)) {\n if (!SENSITIVE_EXTENSION_KEYS.has(key)) {\n sanitized[key] = value;\n }\n }\n return sanitized;\n}\n\nfunction normalizeCode(code: string | null): string {\n if (!code) return DEFAULT_ERROR_CODE;\n return code\n .trim()\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n}\n\nfunction inferCodeFromMessage(message: string): string {\n const lower = message.toLowerCase();\n\n if (GRAPHQL_VALIDATION_MESSAGE_PATTERNS.some((pattern) => pattern.test(message))) {\n return 'BAD_USER_INPUT';\n }\n\n if (\n lower.includes('unauthenticated') ||\n lower.includes('not authenticated') ||\n lower.includes('authentication required') ||\n lower.includes('unauthorized') ||\n lower.includes('please sign in') ||\n lower.includes('sign in to')\n ) {\n return 'UNAUTHENTICATED';\n }\n\n if (lower.includes('workspace context') || lower.includes('switch to a workspace')) {\n return 'WORKSPACE_REQUIRED';\n }\n\n if (\n lower.includes('forbidden') ||\n lower.includes('access denied') ||\n lower.includes('permission denied') ||\n lower.includes('not authorized')\n ) {\n return 'FORBIDDEN';\n }\n\n if (lower.includes('not found') || lower.includes('disappeared')) {\n return 'NOT_FOUND';\n }\n\n if (lower.includes('already exists') || lower.includes('already taken') || lower.includes('conflict')) {\n return 'CONFLICT';\n }\n\n if (lower.includes('quota') || lower.includes('cap exceeded') || lower.includes('limit reached')) {\n return 'QUOTA_EXCEEDED';\n }\n\n if (lower.includes('timeout') || lower.includes('timed out')) {\n return 'TIMEOUT';\n }\n\n if (\n lower.includes('required') ||\n lower.includes('invalid') ||\n lower.includes('missing') ||\n lower.includes('unsupported')\n ) {\n return 'BAD_USER_INPUT';\n }\n\n return DEFAULT_ERROR_CODE;\n}\n\nfunction inferCode(error: unknown, extensions: Record<string, unknown>, originalError: Error | undefined): string {\n const extensionCode = typeof extensions['code'] === 'string' ? extensions['code'] : null;\n if (extensionCode) return normalizeCode(extensionCode);\n\n if (isRecord(originalError)) {\n const originalCode = readString(originalError, 'code');\n if (originalCode) return normalizeCode(originalCode);\n }\n\n if (isRecord(error)) {\n const directCode = readString(error, 'code');\n if (directCode) return normalizeCode(directCode);\n }\n\n const message = readErrorMessage(error);\n return inferCodeFromMessage(message);\n}\n\nfunction readErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n if (isRecord(error)) {\n const message = readString(error, 'message');\n if (message) return message;\n }\n return DEFAULT_USER_MESSAGES[DEFAULT_ERROR_CODE] ?? 'Something went wrong. Please try again.';\n}\n\nfunction isLikelyTechnicalMessage(message: string): boolean {\n if (message.length > 220) return true;\n if (message.includes('\\n')) return true;\n if (message.includes('{') && message.includes('}')) return true;\n if (GRAPHQL_VALIDATION_MESSAGE_PATTERNS.some((pattern) => pattern.test(message))) return true;\n return TECHNICAL_MESSAGE_PATTERNS.some((pattern) => pattern.test(message));\n}\n\nfunction readExplicitUserMessage(extensions: Record<string, unknown>): string | null {\n return (\n readString(extensions, 'userMessage') ??\n readString(extensions, 'humanMessage') ??\n readString(extensions, 'displayMessage')\n );\n}\n\nfunction resolveUserMessage(code: string, message: string, extensions: Record<string, unknown>): string {\n const explicit = readExplicitUserMessage(extensions);\n if (explicit) return explicit;\n\n const fallback =\n DEFAULT_USER_MESSAGES[code] ??\n DEFAULT_USER_MESSAGES[DEFAULT_ERROR_CODE] ??\n 'Something went wrong. Please try again.';\n if (code === DEFAULT_ERROR_CODE) {\n return fallback;\n }\n\n if (!isLikelyTechnicalMessage(message)) {\n return message;\n }\n\n return fallback;\n}\n\nfunction resolveTechnicalMessage(\n code: string,\n message: string,\n extensions: Record<string, unknown>,\n options: ErrorNormalizationOptions\n): string {\n const explicit = readString(extensions, 'technicalMessage');\n if (explicit) return explicit;\n\n if (options.environment === 'production' && code === DEFAULT_ERROR_CODE) {\n return options.serviceName ? `${options.serviceName} returned ${DEFAULT_ERROR_CODE}` : DEFAULT_ERROR_CODE;\n }\n\n return message;\n}\n\nfunction readHttpStatus(extensions: Record<string, unknown>, code: string): number {\n const http = extensions['http'];\n if (isRecord(http) && typeof http['status'] === 'number') {\n return http['status'];\n }\n return DEFAULT_STATUS_BY_CODE[code] ?? DEFAULT_HTTP_STATUS;\n}\n\nexport function normalizeError(error: unknown, options: ErrorNormalizationOptions = {}): NormalizedErrorState {\n const originalError = readOriginalError(error);\n const originalExtensions = readExtensions(originalError);\n const directExtensions = readExtensions(error);\n const mergedExtensions = sanitizeExtensions({ ...originalExtensions, ...directExtensions });\n const message = readErrorMessage(error);\n const code = inferCode(error, mergedExtensions, originalError);\n const userMessage = resolveUserMessage(code, message, mergedExtensions);\n const technicalMessage = resolveTechnicalMessage(code, message, mergedExtensions, options);\n const status = readHttpStatus(mergedExtensions, code);\n\n const extensions: Record<string, unknown> = {\n ...mergedExtensions,\n code,\n userMessage,\n technicalMessage,\n };\n\n if (options.serviceName) {\n extensions['serviceName'] = options.serviceName;\n }\n\n if (!isRecord(extensions['http'])) {\n extensions['http'] = { status };\n }\n\n return {\n code,\n userMessage,\n technicalMessage,\n extensions,\n status,\n };\n}\n\nexport class UserFacingGraphQLError extends GraphQLError {\n constructor(options: UserFacingErrorOptions) {\n const extensions: Record<string, unknown> = {\n code: normalizeCode(options.code),\n userMessage: options.userMessage,\n technicalMessage: options.technicalMessage ?? options.userMessage,\n };\n\n if (options.details) {\n extensions['details'] = options.details;\n }\n\n if (options.httpStatus) {\n extensions['http'] = { status: options.httpStatus };\n }\n\n super(options.userMessage, {\n originalError: options.cause,\n extensions,\n });\n this.name = 'UserFacingGraphQLError';\n }\n}\n\nexport function toUserFacingGraphQLError(error: unknown, options: ErrorNormalizationOptions = {}): GraphQLError {\n const normalized = normalizeError(error, options);\n\n if (error instanceof GraphQLError) {\n return new GraphQLError(normalized.userMessage, {\n nodes: error.nodes,\n source: error.source,\n positions: error.positions,\n path: error.path,\n originalError: error.originalError,\n extensions: normalized.extensions,\n });\n }\n\n return new GraphQLError(normalized.userMessage, {\n originalError: error instanceof Error ? error : undefined,\n extensions: normalized.extensions,\n });\n}\n\nexport function normalizeExecutionResultErrors(result: unknown, options: ErrorNormalizationOptions = {}): void {\n if (Array.isArray(result)) {\n result.forEach((entry) => normalizeExecutionResultErrors(entry, options));\n return;\n }\n\n if (!isRecord(result)) return;\n const errors = result['errors'];\n if (!Array.isArray(errors) || errors.length === 0) return;\n\n result['errors'] = errors.map((error) => toUserFacingGraphQLError(error, options));\n}\n\nexport function normalizeGraphQLResponsePayload(payload: unknown, options: ErrorNormalizationOptions = {}): unknown {\n normalizeExecutionResultErrors(payload, options);\n return payload;\n}\n\nexport async function normalizeGraphQLResponse(\n response: Response,\n options: ErrorNormalizationOptions = {}\n): Promise<Response> {\n const contentType = response.headers.get('content-type') ?? '';\n if (!contentType.toLowerCase().includes('json')) {\n return response;\n }\n\n const text = await response.text();\n if (!text) {\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(text) as unknown;\n } catch {\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n }\n\n normalizeGraphQLResponsePayload(payload, options);\n\n return new Response(JSON.stringify(payload), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\nexport function createHumanReadableErrorPlugin(options: ErrorNormalizationOptions = {}): YogaPlugin {\n return {\n onExecute() {\n return {\n onExecuteDone({ result }: { result: unknown }) {\n normalizeExecutionResultErrors(result, options);\n },\n };\n },\n };\n}\n\nexport function formatHttpError(error: unknown, options: ErrorNormalizationOptions = {}): HttpErrorResult {\n const normalized = normalizeError(error, options);\n return {\n status: normalized.status,\n body: {\n error: normalized.userMessage,\n message: normalized.userMessage,\n userMessage: normalized.userMessage,\n technicalMessage: normalized.technicalMessage,\n code: normalized.code,\n extensions: normalized.extensions,\n },\n };\n}\n\nexport function createHttpErrorResponse(error: unknown, options: ErrorNormalizationOptions = {}): Response {\n const formatted = formatHttpError(error, options);\n return new Response(JSON.stringify(formatted.body), {\n status: formatted.status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n","/**\n * Workspace Guard Plugin for GraphQL Yoga\n *\n * Blocks GraphQL operations that lack a valid workspace context (x-workspace-id header).\n * This provides defense-in-depth at the GraphQL layer — even if the gateway allows a request\n * through, the service itself will reject it if workspace context is missing.\n *\n * **Whitelisted operations** (e.g., workspace creation) can bypass the guard.\n *\n * **Public schema fields** marked with `@public` or `@rbac(public: true)` are auto-bypassed\n * when `allowPublicDirective` is enabled (default true). This lets anonymous public-link\n * resolvers (e.g. `accessShare`) be reached through the federation gateway without an\n * `x-workspace-id` header.\n *\n * @module server/workspace-guard\n * @category Security\n */\n\nimport { logger } from '../logger/index.js';\nimport { UserFacingGraphQLError } from './errors.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for the workspace guard plugin\n */\nexport interface WorkspaceGuardConfig {\n /**\n * Enable the workspace guard.\n * @default true\n */\n enabled?: boolean;\n\n /**\n * GraphQL operation names that can run without workspace context.\n * These are typically operations like `createWorkspace` that execute\n * before a workspace exists.\n *\n * Matching is case-sensitive against the operation name in the GraphQL document.\n *\n * @default []\n *\n * @example\n * ```typescript\n * whitelistedOperations: ['createWorkspace', 'validateTokens']\n * ```\n */\n whitelistedOperations?: string[];\n\n /**\n * Custom error message when workspace context is missing.\n * @default 'Workspace context required. Provide a valid X-Workspace-Authorization header.'\n */\n errorMessage?: string;\n\n /**\n * If true, fields whose schema definition carries the `@public` directive or\n * `@rbac(public: true)` are bypassed by the guard automatically — no need to\n * list them in `whitelistedOperations`. The check uses the GraphQL schema\n * passed to the executor at request time.\n *\n * Set to false to fall back to the legacy operation-name allowlist only.\n *\n * @default true\n */\n allowPublicDirective?: boolean;\n}\n\n// ============================================================================\n// GraphQL Error\n// ============================================================================\n\n/**\n * Workspace required error with proper GraphQL error extensions\n */\nclass WorkspaceRequiredError extends UserFacingGraphQLError {\n constructor(message: string) {\n super({\n code: 'WORKSPACE_REQUIRED',\n userMessage: 'Please choose a workspace and try again.',\n technicalMessage: message,\n httpStatus: 403,\n });\n this.name = 'WorkspaceRequiredError';\n }\n}\n\n// ============================================================================\n// Schema directive helpers\n// ============================================================================\n\n/**\n * Minimal structural typings for the bits of the GraphQL schema we look at.\n * We avoid importing the GraphQL types directly so the SDK keeps `graphql`\n * as a peer dep without a runtime hard dependency.\n */\ninterface FieldLikeDef {\n astNode?: {\n directives?: ReadonlyArray<{\n name: { value: string };\n arguments?: ReadonlyArray<{\n name: { value: string };\n value: { kind: string; value?: unknown };\n }>;\n }>;\n };\n}\n\ninterface SchemaLike {\n getQueryType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n getMutationType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n getSubscriptionType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n}\n\n/**\n * Returns true iff the field carries either:\n * - `@public` directive, OR\n * - `@rbac(public: true)` directive (any arg-order)\n */\nfunction isFieldPublic(field: FieldLikeDef | undefined): boolean {\n const directives = field?.astNode?.directives;\n if (!directives || directives.length === 0) return false;\n\n for (const dir of directives) {\n const name = dir.name?.value;\n if (name === 'public') return true;\n if (name === 'rbac') {\n const args = dir.arguments ?? [];\n for (const arg of args) {\n if (arg.name?.value === 'public' && arg.value?.kind === 'BooleanValue' && arg.value.value === true) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\ninterface DocumentLike {\n definitions?: ReadonlyArray<{\n kind?: string;\n operation?: string;\n name?: { value?: string };\n selectionSet?: {\n selections?: ReadonlyArray<{\n kind?: string;\n name?: { value?: string };\n }>;\n };\n }>;\n}\n\n/**\n * Resolve the operation type ('query' | 'mutation' | 'subscription') for the\n * primary operation in the document. Falls back to 'query'.\n */\nfunction resolveOperationType(\n document: DocumentLike | undefined,\n operationName: string | null | undefined\n): 'query' | 'mutation' | 'subscription' {\n const defs = document?.definitions ?? [];\n for (const def of defs) {\n if (def.kind !== 'OperationDefinition') {\n // Older parsers may not set kind; fall through to the operation property check below.\n }\n if (def.operation && (!operationName || def.name?.value === operationName)) {\n return def.operation as 'query' | 'mutation' | 'subscription';\n }\n }\n return 'query';\n}\n\n/**\n * Returns true iff every root field in the document selection set is marked\n * public on the schema. Empty selection sets return false (fail-closed).\n */\nfunction allRootFieldsPublic(\n schema: SchemaLike | undefined,\n document: DocumentLike | undefined,\n operationName: string | null | undefined\n): boolean {\n if (!schema || !document) return false;\n\n const opType = resolveOperationType(document, operationName);\n let rootType: ReturnType<NonNullable<SchemaLike['getQueryType']>> | undefined;\n if (opType === 'mutation') {\n rootType = schema.getMutationType?.();\n } else if (opType === 'subscription') {\n rootType = schema.getSubscriptionType?.();\n } else {\n rootType = schema.getQueryType?.();\n }\n\n if (!rootType) return false;\n\n const fields = rootType.getFields();\n const defs = document.definitions ?? [];\n\n // Find the operation definition matching operationName (or first one).\n const opDef = defs.find((d) => d.operation && (!operationName || d.name?.value === operationName));\n const selections = opDef?.selectionSet?.selections ?? [];\n if (selections.length === 0) return false;\n\n for (const sel of selections) {\n // Only consider plain Field selections (skip fragments — fragments at the root\n // shouldn't drive a public bypass; fail-closed there).\n if (sel.kind && sel.kind !== 'Field') return false;\n const fieldName = sel.name?.value;\n if (!fieldName) return false;\n // __schema / __type introspection is always allowed without workspace context;\n // treat them as public.\n if (fieldName.startsWith('__')) continue;\n const fieldDef = fields[fieldName];\n if (!isFieldPublic(fieldDef)) return false;\n }\n return true;\n}\n\n// ============================================================================\n// Plugin\n// ============================================================================\n\n/**\n * Create a GraphQL Yoga plugin that guards operations requiring workspace context.\n *\n * The plugin inspects the GraphQL context for workspace information (set by the SDK's\n * buildContext from the x-workspace-id header). If missing and the operation is not\n * whitelisted (and not all-public per directive), it throws a WORKSPACE_REQUIRED error.\n *\n * @param config - Guard configuration\n * @returns A Yoga-compatible plugin\n *\n * @example\n * ```typescript\n * import { createWorkspaceGuardPlugin } from '@burdenoff/be-sdk/server';\n *\n * const guardPlugin = createWorkspaceGuardPlugin({\n * whitelistedOperations: ['createWorkspace'],\n * allowPublicDirective: true, // default\n * });\n * ```\n */\nexport function createWorkspaceGuardPlugin(config?: WorkspaceGuardConfig) {\n const enabled = config?.enabled ?? true;\n const whitelistedOperations = new Set(config?.whitelistedOperations ?? []);\n const allowPublicDirective = config?.allowPublicDirective ?? true;\n const errorMessage =\n config?.errorMessage ??\n 'Workspace context required. Ensure the request includes a valid workspace context (x-workspace-id header).';\n\n if (!enabled) {\n logger.info('[WorkspaceGuard] Workspace guard disabled');\n return {};\n }\n\n logger.info('[WorkspaceGuard] Workspace guard enabled', {\n whitelistedOperations: [...whitelistedOperations],\n allowPublicDirective,\n });\n\n return {\n onExecute({\n args,\n }: {\n args: {\n schema?: SchemaLike;\n document?: DocumentLike;\n operationName?: string | null;\n contextValue?: { workspace?: { id?: string }; request?: Request };\n };\n }) {\n // Extract operation name from args or document\n let operationName = args.operationName;\n\n if (!operationName && args.document?.definitions) {\n for (const def of args.document.definitions) {\n if (def.operation && def.name?.value) {\n operationName = def.name.value;\n break;\n }\n }\n }\n\n // Check if operation is whitelisted by name\n if (operationName && whitelistedOperations.has(operationName)) {\n return undefined;\n }\n\n // Check schema-directive-based public bypass (Option C)\n if (allowPublicDirective && allRootFieldsPublic(args.schema, args.document, operationName)) {\n return undefined;\n }\n\n // Check for workspace context\n const context = args.contextValue;\n const workspaceId = context?.workspace?.id;\n\n // Also check the raw header as a fallback\n const headerWorkspaceId = context?.request?.headers?.get?.('x-workspace-id');\n\n if (!workspaceId && !headerWorkspaceId) {\n logger.warn('[WorkspaceGuard] Blocked operation without workspace context', {\n operationName: operationName ?? '<anonymous>',\n });\n throw new WorkspaceRequiredError(errorMessage);\n }\n\n return undefined;\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/server/errors.ts","../src/server/workspace-guard.ts"],"names":["DEFAULT_ERROR_CODE","DEFAULT_HTTP_STATUS","INVALID_CREDENTIALS_USER_MESSAGE","DEFAULT_USER_MESSAGES","BAD_REQUEST","BAD_USER_INPUT","CAPTCHA_FAILED","CAPTCHA_REQUIRED","COMPLEXITY_TOO_HIGH","CONFLICT","FORBIDDEN","INTERNAL_SERVER_ERROR","INVALID_PASSWORD","NOT_FOUND","PERMISSION_DENIED","QUOTA_EXCEEDED","QUOTA_EXHAUSTED","RATE_LIMITED","RESOURCE_CAP_EXCEEDED","STORAGE_QUOTA_EXCEEDED","TIMEOUT","UNAUTHENTICATED","VALIDATION_ERROR","WORKSPACE_REQUIRED","DEFAULT_STATUS_BY_CODE","SENSITIVE_EXTENSION_KEYS","Set","TECHNICAL_MESSAGE_PATTERNS","GRAPHQL_VALIDATION_MESSAGE_PATTERNS","isRecord","value","Array","isArray","readString","record","key","trim","length","readExtensions","error","extensions","readOriginalError","GraphQLError","originalError","Error","undefined","sanitizeExtensions","sanitized","Object","entries","has","normalizeCode","code","replace","toUpperCase","inferCodeFromMessage","message","lower","toLowerCase","some","pattern","test","includes","inferCode","extensionCode","originalCode","directCode","readErrorMessage","isLikelyTechnicalMessage","readExplicitUserMessage","resolveUserMessage","explicit","fallback","resolveTechnicalMessage","options","environment","serviceName","readHttpStatus","http","normalizeError","originalExtensions","directExtensions","mergedExtensions","userMessage","technicalMessage","status","UserFacingGraphQLError","details","httpStatus","cause","name","toUserFacingGraphQLError","normalized","nodes","source","positions","path","normalizeExecutionResultErrors","result","forEach","entry","errors","map","normalizeGraphQLResponsePayload","payload","normalizeGraphQLResponse","response","contentType","headers","get","text","Response","statusText","JSON","parse","stringify","createHumanReadableErrorPlugin","onExecute","onExecuteDone","formatHttpError","body","createHttpErrorResponse","formatted","WorkspaceRequiredError","isFieldPublic","field","directives","astNode","dir","args","arguments","arg","kind","resolveOperationType","document","operationName","defs","definitions","def","operation","allRootFieldsPublic","schema","opType","rootType","getMutationType","getSubscriptionType","getQueryType","fields","getFields","opDef","find","d","selections","selectionSet","sel","fieldName","startsWith","fieldDef","createWorkspaceGuardPlugin","config","enabled","whitelistedOperations","allowPublicDirective","errorMessage","logger","info","context","contextValue","workspaceId","workspace","id","headerWorkspaceId","request","warn"],"mappings":"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","file":"chunk-6GL4SLU7.js","sourcesContent":["import { GraphQLError } from 'graphql';\n\nimport type { YogaPlugin } from './types.js';\n\nexport interface UserFacingErrorOptions {\n code: string;\n userMessage: string;\n technicalMessage?: string;\n details?: Record<string, unknown>;\n httpStatus?: number;\n cause?: Error;\n}\n\nexport interface ErrorNormalizationOptions {\n serviceName?: string;\n environment?: string;\n}\n\nexport interface NormalizedErrorState {\n code: string;\n userMessage: string;\n technicalMessage: string;\n extensions: Record<string, unknown>;\n status: number;\n}\n\nexport interface HttpErrorPayload {\n error: string;\n message: string;\n userMessage: string;\n technicalMessage: string;\n code: string;\n extensions: Record<string, unknown>;\n}\n\nexport interface HttpErrorResult {\n status: number;\n body: HttpErrorPayload;\n}\n\nconst DEFAULT_ERROR_CODE = 'INTERNAL_SERVER_ERROR';\nconst DEFAULT_HTTP_STATUS = 500;\n\n// Held in a separately-named const so the literal isn't assigned directly to\n// the `INVALID_PASSWORD` key — that pattern trips sonarjs/no-hardcoded-passwords\n// (a false positive: this is a user-facing message, not a credential).\nconst INVALID_CREDENTIALS_USER_MESSAGE = 'The password you entered is incorrect.';\n\nconst DEFAULT_USER_MESSAGES: Record<string, string> = {\n BAD_REQUEST: 'Please check the request and try again.',\n BAD_USER_INPUT: 'Please check the information and try again.',\n CAPTCHA_FAILED: 'The verification failed. Please try again.',\n CAPTCHA_REQUIRED: 'Please complete the verification to continue.',\n COMPLEXITY_TOO_HIGH: 'This request is too large to process. Please simplify it and try again.',\n CONFLICT: 'This change conflicts with existing data. Please refresh and try again.',\n FORBIDDEN: 'You do not have permission to do that.',\n INTERNAL_SERVER_ERROR: 'Something went wrong. Please try again.',\n INVALID_PASSWORD: INVALID_CREDENTIALS_USER_MESSAGE,\n NOT_FOUND: 'We could not find the requested item.',\n PERMISSION_DENIED: 'You do not have permission to do that.',\n QUOTA_EXCEEDED: \"You've reached your usage limit.\",\n QUOTA_EXHAUSTED: \"You've reached your usage limit.\",\n RATE_LIMITED: 'Too many requests. Please wait a moment and try again.',\n RESOURCE_CAP_EXCEEDED: \"You've reached your plan limit. Upgrade your plan to continue.\",\n STORAGE_QUOTA_EXCEEDED: \"You've reached your storage limit. Upgrade your plan to continue.\",\n TIMEOUT: 'The request took too long. Please try again.',\n UNAUTHENTICATED: 'Please sign in to continue.',\n VALIDATION_ERROR: 'Please check the information and try again.',\n WORKSPACE_REQUIRED: 'Please choose a workspace and try again.',\n};\n\nconst DEFAULT_STATUS_BY_CODE: Record<string, number> = {\n BAD_REQUEST: 400,\n BAD_USER_INPUT: 400,\n CAPTCHA_FAILED: 400,\n CAPTCHA_REQUIRED: 400,\n COMPLEXITY_TOO_HIGH: 400,\n CONFLICT: 409,\n FORBIDDEN: 403,\n INVALID_PASSWORD: 400,\n NOT_FOUND: 404,\n PERMISSION_DENIED: 403,\n QUOTA_EXCEEDED: 429,\n QUOTA_EXHAUSTED: 429,\n RATE_LIMITED: 429,\n RESOURCE_CAP_EXCEEDED: 429,\n STORAGE_QUOTA_EXCEEDED: 429,\n TIMEOUT: 504,\n UNAUTHENTICATED: 401,\n VALIDATION_ERROR: 400,\n WORKSPACE_REQUIRED: 403,\n};\n\nconst SENSITIVE_EXTENSION_KEYS = new Set(['exception', 'originalError', 'stack', 'stacktrace']);\n\nconst TECHNICAL_MESSAGE_PATTERNS = [\n /\\bprisma\\b/i,\n /\\bsql\\b/i,\n /\\bconstraint\\b/i,\n /\\bstack\\b/i,\n /\\bundefined\\b/i,\n /\\bnull\\b/i,\n /\\bECONN[A-Z_]*\\b/,\n /\\bETIMEDOUT\\b/,\n /\\bENOTFOUND\\b/,\n /\\bP\\d{4}\\b/,\n /Cannot (read|set|find|access)/i,\n /Build failed \\(exit \\d+\\)/i,\n /JSON\\.stringify/i,\n];\n\nconst GRAPHQL_VALIDATION_MESSAGE_PATTERNS = [\n /^Syntax Error:/i,\n /^Cannot query field\\b/i,\n /^Cannot return null for non-nullable field\\b/i,\n /^Unknown (argument|directive|type)\\b/i,\n /^Variable \"\\$[^\"]+\" got invalid value/i,\n /^Field \"[^\"]+\" of required type/i,\n /^Field \"[^\"]+\" must not have a selection/i,\n /^Field \"[^\"]+\" must have a selection/i,\n /^Fragment \"[^\"]+\" cannot be spread here/i,\n /^There can be only one/i,\n /Did you mean /i,\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(record: Record<string, unknown>, key: string): string | null {\n const value = record[key];\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\n\nfunction readExtensions(error: unknown): Record<string, unknown> {\n if (!isRecord(error)) return {};\n const extensions = error['extensions'];\n return isRecord(extensions) ? extensions : {};\n}\n\nfunction readOriginalError(error: unknown): Error | undefined {\n if (error instanceof GraphQLError && error.originalError instanceof Error) {\n return error.originalError;\n }\n return undefined;\n}\n\nfunction sanitizeExtensions(extensions: Record<string, unknown>): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(extensions)) {\n if (!SENSITIVE_EXTENSION_KEYS.has(key)) {\n sanitized[key] = value;\n }\n }\n return sanitized;\n}\n\nfunction normalizeCode(code: string | null): string {\n if (!code) return DEFAULT_ERROR_CODE;\n return code\n .trim()\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n}\n\nfunction inferCodeFromMessage(message: string): string {\n const lower = message.toLowerCase();\n\n if (GRAPHQL_VALIDATION_MESSAGE_PATTERNS.some((pattern) => pattern.test(message))) {\n return 'BAD_USER_INPUT';\n }\n\n if (\n lower.includes('unauthenticated') ||\n lower.includes('not authenticated') ||\n lower.includes('authentication required') ||\n lower.includes('unauthorized') ||\n lower.includes('please sign in') ||\n lower.includes('sign in to')\n ) {\n return 'UNAUTHENTICATED';\n }\n\n if (lower.includes('workspace context') || lower.includes('switch to a workspace')) {\n return 'WORKSPACE_REQUIRED';\n }\n\n if (\n lower.includes('forbidden') ||\n lower.includes('access denied') ||\n lower.includes('permission denied') ||\n lower.includes('not authorized')\n ) {\n return 'FORBIDDEN';\n }\n\n if (lower.includes('not found') || lower.includes('disappeared')) {\n return 'NOT_FOUND';\n }\n\n if (lower.includes('already exists') || lower.includes('already taken') || lower.includes('conflict')) {\n return 'CONFLICT';\n }\n\n if (lower.includes('quota') || lower.includes('cap exceeded') || lower.includes('limit reached')) {\n return 'QUOTA_EXCEEDED';\n }\n\n if (lower.includes('timeout') || lower.includes('timed out')) {\n return 'TIMEOUT';\n }\n\n if (\n lower.includes('required') ||\n lower.includes('invalid') ||\n lower.includes('missing') ||\n lower.includes('unsupported')\n ) {\n return 'BAD_USER_INPUT';\n }\n\n return DEFAULT_ERROR_CODE;\n}\n\nfunction inferCode(error: unknown, extensions: Record<string, unknown>, originalError: Error | undefined): string {\n const extensionCode = typeof extensions['code'] === 'string' ? extensions['code'] : null;\n if (extensionCode) return normalizeCode(extensionCode);\n\n if (isRecord(originalError)) {\n const originalCode = readString(originalError, 'code');\n if (originalCode) return normalizeCode(originalCode);\n }\n\n if (isRecord(error)) {\n const directCode = readString(error, 'code');\n if (directCode) return normalizeCode(directCode);\n }\n\n const message = readErrorMessage(error);\n return inferCodeFromMessage(message);\n}\n\nfunction readErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n if (isRecord(error)) {\n const message = readString(error, 'message');\n if (message) return message;\n }\n return DEFAULT_USER_MESSAGES[DEFAULT_ERROR_CODE] ?? 'Something went wrong. Please try again.';\n}\n\nfunction isLikelyTechnicalMessage(message: string): boolean {\n if (message.length > 220) return true;\n if (message.includes('\\n')) return true;\n if (message.includes('{') && message.includes('}')) return true;\n if (GRAPHQL_VALIDATION_MESSAGE_PATTERNS.some((pattern) => pattern.test(message))) return true;\n return TECHNICAL_MESSAGE_PATTERNS.some((pattern) => pattern.test(message));\n}\n\nfunction readExplicitUserMessage(extensions: Record<string, unknown>): string | null {\n return (\n readString(extensions, 'userMessage') ??\n readString(extensions, 'humanMessage') ??\n readString(extensions, 'displayMessage')\n );\n}\n\nfunction resolveUserMessage(code: string, message: string, extensions: Record<string, unknown>): string {\n const explicit = readExplicitUserMessage(extensions);\n if (explicit) return explicit;\n\n const fallback =\n DEFAULT_USER_MESSAGES[code] ??\n DEFAULT_USER_MESSAGES[DEFAULT_ERROR_CODE] ??\n 'Something went wrong. Please try again.';\n if (code === DEFAULT_ERROR_CODE) {\n return fallback;\n }\n\n if (!isLikelyTechnicalMessage(message)) {\n return message;\n }\n\n return fallback;\n}\n\nfunction resolveTechnicalMessage(\n code: string,\n message: string,\n extensions: Record<string, unknown>,\n options: ErrorNormalizationOptions\n): string {\n const explicit = readString(extensions, 'technicalMessage');\n if (explicit) return explicit;\n\n if (options.environment === 'production' && code === DEFAULT_ERROR_CODE) {\n return options.serviceName ? `${options.serviceName} returned ${DEFAULT_ERROR_CODE}` : DEFAULT_ERROR_CODE;\n }\n\n return message;\n}\n\nfunction readHttpStatus(extensions: Record<string, unknown>, code: string): number {\n const http = extensions['http'];\n if (isRecord(http) && typeof http['status'] === 'number') {\n return http['status'];\n }\n return DEFAULT_STATUS_BY_CODE[code] ?? DEFAULT_HTTP_STATUS;\n}\n\nexport function normalizeError(error: unknown, options: ErrorNormalizationOptions = {}): NormalizedErrorState {\n const originalError = readOriginalError(error);\n const originalExtensions = readExtensions(originalError);\n const directExtensions = readExtensions(error);\n const mergedExtensions = sanitizeExtensions({ ...originalExtensions, ...directExtensions });\n const message = readErrorMessage(error);\n const code = inferCode(error, mergedExtensions, originalError);\n const userMessage = resolveUserMessage(code, message, mergedExtensions);\n const technicalMessage = resolveTechnicalMessage(code, message, mergedExtensions, options);\n const status = readHttpStatus(mergedExtensions, code);\n\n const extensions: Record<string, unknown> = {\n ...mergedExtensions,\n code,\n userMessage,\n technicalMessage,\n };\n\n if (options.serviceName) {\n extensions['serviceName'] = options.serviceName;\n }\n\n if (!isRecord(extensions['http'])) {\n extensions['http'] = { status };\n }\n\n return {\n code,\n userMessage,\n technicalMessage,\n extensions,\n status,\n };\n}\n\nexport class UserFacingGraphQLError extends GraphQLError {\n constructor(options: UserFacingErrorOptions) {\n const extensions: Record<string, unknown> = {\n code: normalizeCode(options.code),\n userMessage: options.userMessage,\n technicalMessage: options.technicalMessage ?? options.userMessage,\n };\n\n if (options.details) {\n extensions['details'] = options.details;\n }\n\n if (options.httpStatus) {\n extensions['http'] = { status: options.httpStatus };\n }\n\n super(options.userMessage, {\n originalError: options.cause,\n extensions,\n });\n this.name = 'UserFacingGraphQLError';\n }\n}\n\nexport function toUserFacingGraphQLError(error: unknown, options: ErrorNormalizationOptions = {}): GraphQLError {\n const normalized = normalizeError(error, options);\n\n if (error instanceof GraphQLError) {\n return new GraphQLError(normalized.userMessage, {\n nodes: error.nodes,\n source: error.source,\n positions: error.positions,\n path: error.path,\n originalError: error.originalError,\n extensions: normalized.extensions,\n });\n }\n\n return new GraphQLError(normalized.userMessage, {\n originalError: error instanceof Error ? error : undefined,\n extensions: normalized.extensions,\n });\n}\n\nexport function normalizeExecutionResultErrors(result: unknown, options: ErrorNormalizationOptions = {}): void {\n if (Array.isArray(result)) {\n result.forEach((entry) => normalizeExecutionResultErrors(entry, options));\n return;\n }\n\n if (!isRecord(result)) return;\n const errors = result['errors'];\n if (!Array.isArray(errors) || errors.length === 0) return;\n\n result['errors'] = errors.map((error) => toUserFacingGraphQLError(error, options));\n}\n\nexport function normalizeGraphQLResponsePayload(payload: unknown, options: ErrorNormalizationOptions = {}): unknown {\n normalizeExecutionResultErrors(payload, options);\n return payload;\n}\n\nexport async function normalizeGraphQLResponse(\n response: Response,\n options: ErrorNormalizationOptions = {}\n): Promise<Response> {\n const contentType = response.headers.get('content-type') ?? '';\n if (!contentType.toLowerCase().includes('json')) {\n return response;\n }\n\n const text = await response.text();\n if (!text) {\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(text) as unknown;\n } catch {\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n }\n\n normalizeGraphQLResponsePayload(payload, options);\n\n return new Response(JSON.stringify(payload), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\nexport function createHumanReadableErrorPlugin(options: ErrorNormalizationOptions = {}): YogaPlugin {\n return {\n onExecute() {\n return {\n onExecuteDone({ result }: { result: unknown }) {\n normalizeExecutionResultErrors(result, options);\n },\n };\n },\n };\n}\n\nexport function formatHttpError(error: unknown, options: ErrorNormalizationOptions = {}): HttpErrorResult {\n const normalized = normalizeError(error, options);\n return {\n status: normalized.status,\n body: {\n error: normalized.userMessage,\n message: normalized.userMessage,\n userMessage: normalized.userMessage,\n technicalMessage: normalized.technicalMessage,\n code: normalized.code,\n extensions: normalized.extensions,\n },\n };\n}\n\nexport function createHttpErrorResponse(error: unknown, options: ErrorNormalizationOptions = {}): Response {\n const formatted = formatHttpError(error, options);\n return new Response(JSON.stringify(formatted.body), {\n status: formatted.status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n","/**\n * Workspace Guard Plugin for GraphQL Yoga\n *\n * Blocks GraphQL operations that lack a valid workspace context (x-workspace-id header).\n * This provides defense-in-depth at the GraphQL layer — even if the gateway allows a request\n * through, the service itself will reject it if workspace context is missing.\n *\n * **Whitelisted operations** (e.g., workspace creation) can bypass the guard.\n *\n * **Public schema fields** marked with `@public` or `@rbac(public: true)` are auto-bypassed\n * when `allowPublicDirective` is enabled (default true). This lets anonymous public-link\n * resolvers (e.g. `accessShare`) be reached through the federation gateway without an\n * `x-workspace-id` header.\n *\n * @module server/workspace-guard\n * @category Security\n */\n\nimport { logger } from '../logger/index.js';\nimport { UserFacingGraphQLError } from './errors.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for the workspace guard plugin\n */\nexport interface WorkspaceGuardConfig {\n /**\n * Enable the workspace guard.\n * @default true\n */\n enabled?: boolean;\n\n /**\n * GraphQL operation names that can run without workspace context.\n * These are typically operations like `createWorkspace` that execute\n * before a workspace exists.\n *\n * Matching is case-sensitive against the operation name in the GraphQL document.\n *\n * @default []\n *\n * @example\n * ```typescript\n * whitelistedOperations: ['createWorkspace', 'validateTokens']\n * ```\n */\n whitelistedOperations?: string[];\n\n /**\n * Custom error message when workspace context is missing.\n * @default 'Workspace context required. Provide a valid X-Workspace-Authorization header.'\n */\n errorMessage?: string;\n\n /**\n * If true, fields whose schema definition carries the `@public` directive or\n * `@rbac(public: true)` are bypassed by the guard automatically — no need to\n * list them in `whitelistedOperations`. The check uses the GraphQL schema\n * passed to the executor at request time.\n *\n * Set to false to fall back to the legacy operation-name allowlist only.\n *\n * @default true\n */\n allowPublicDirective?: boolean;\n}\n\n// ============================================================================\n// GraphQL Error\n// ============================================================================\n\n/**\n * Workspace required error with proper GraphQL error extensions\n */\nclass WorkspaceRequiredError extends UserFacingGraphQLError {\n constructor(message: string) {\n super({\n code: 'WORKSPACE_REQUIRED',\n userMessage: 'Please choose a workspace and try again.',\n technicalMessage: message,\n httpStatus: 403,\n });\n this.name = 'WorkspaceRequiredError';\n }\n}\n\n// ============================================================================\n// Schema directive helpers\n// ============================================================================\n\n/**\n * Minimal structural typings for the bits of the GraphQL schema we look at.\n * We avoid importing the GraphQL types directly so the SDK keeps `graphql`\n * as a peer dep without a runtime hard dependency.\n */\ninterface FieldLikeDef {\n astNode?: {\n directives?: ReadonlyArray<{\n name: { value: string };\n arguments?: ReadonlyArray<{\n name: { value: string };\n value: { kind: string; value?: unknown };\n }>;\n }>;\n };\n}\n\ninterface SchemaLike {\n getQueryType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n getMutationType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n getSubscriptionType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n}\n\n/**\n * Returns true iff the field carries either:\n * - `@public` directive, OR\n * - `@rbac(public: true)` directive (any arg-order)\n */\nfunction isFieldPublic(field: FieldLikeDef | undefined): boolean {\n const directives = field?.astNode?.directives;\n if (!directives || directives.length === 0) return false;\n\n for (const dir of directives) {\n const name = dir.name?.value;\n if (name === 'public') return true;\n if (name === 'rbac') {\n const args = dir.arguments ?? [];\n for (const arg of args) {\n if (arg.name?.value === 'public' && arg.value?.kind === 'BooleanValue' && arg.value.value === true) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\ninterface DocumentLike {\n definitions?: ReadonlyArray<{\n kind?: string;\n operation?: string;\n name?: { value?: string };\n selectionSet?: {\n selections?: ReadonlyArray<{\n kind?: string;\n name?: { value?: string };\n }>;\n };\n }>;\n}\n\n/**\n * Resolve the operation type ('query' | 'mutation' | 'subscription') for the\n * primary operation in the document. Falls back to 'query'.\n */\nfunction resolveOperationType(\n document: DocumentLike | undefined,\n operationName: string | null | undefined\n): 'query' | 'mutation' | 'subscription' {\n const defs = document?.definitions ?? [];\n for (const def of defs) {\n if (def.kind !== 'OperationDefinition') {\n // Older parsers may not set kind; fall through to the operation property check below.\n }\n if (def.operation && (!operationName || def.name?.value === operationName)) {\n return def.operation as 'query' | 'mutation' | 'subscription';\n }\n }\n return 'query';\n}\n\n/**\n * Returns true iff every root field in the document selection set is marked\n * public on the schema. Empty selection sets return false (fail-closed).\n */\nfunction allRootFieldsPublic(\n schema: SchemaLike | undefined,\n document: DocumentLike | undefined,\n operationName: string | null | undefined\n): boolean {\n if (!schema || !document) return false;\n\n const opType = resolveOperationType(document, operationName);\n let rootType: ReturnType<NonNullable<SchemaLike['getQueryType']>> | undefined;\n if (opType === 'mutation') {\n rootType = schema.getMutationType?.();\n } else if (opType === 'subscription') {\n rootType = schema.getSubscriptionType?.();\n } else {\n rootType = schema.getQueryType?.();\n }\n\n if (!rootType) return false;\n\n const fields = rootType.getFields();\n const defs = document.definitions ?? [];\n\n // Find the operation definition matching operationName (or first one).\n const opDef = defs.find((d) => d.operation && (!operationName || d.name?.value === operationName));\n const selections = opDef?.selectionSet?.selections ?? [];\n if (selections.length === 0) return false;\n\n for (const sel of selections) {\n // Only consider plain Field selections (skip fragments — fragments at the root\n // shouldn't drive a public bypass; fail-closed there).\n if (sel.kind && sel.kind !== 'Field') return false;\n const fieldName = sel.name?.value;\n if (!fieldName) return false;\n // __schema / __type introspection is always allowed without workspace context;\n // treat them as public.\n if (fieldName.startsWith('__')) continue;\n const fieldDef = fields[fieldName];\n if (!isFieldPublic(fieldDef)) return false;\n }\n return true;\n}\n\n// ============================================================================\n// Plugin\n// ============================================================================\n\n/**\n * Create a GraphQL Yoga plugin that guards operations requiring workspace context.\n *\n * The plugin inspects the GraphQL context for workspace information (set by the SDK's\n * buildContext from the x-workspace-id header). If missing and the operation is not\n * whitelisted (and not all-public per directive), it throws a WORKSPACE_REQUIRED error.\n *\n * @param config - Guard configuration\n * @returns A Yoga-compatible plugin\n *\n * @example\n * ```typescript\n * import { createWorkspaceGuardPlugin } from '@burdenoff/be-sdk/server';\n *\n * const guardPlugin = createWorkspaceGuardPlugin({\n * whitelistedOperations: ['createWorkspace'],\n * allowPublicDirective: true, // default\n * });\n * ```\n */\nexport function createWorkspaceGuardPlugin(config?: WorkspaceGuardConfig) {\n const enabled = config?.enabled ?? true;\n const whitelistedOperations = new Set(config?.whitelistedOperations ?? []);\n const allowPublicDirective = config?.allowPublicDirective ?? true;\n const errorMessage =\n config?.errorMessage ??\n 'Workspace context required. Ensure the request includes a valid workspace context (x-workspace-id header).';\n\n if (!enabled) {\n logger.info('[WorkspaceGuard] Workspace guard disabled');\n return {};\n }\n\n logger.info('[WorkspaceGuard] Workspace guard enabled', {\n whitelistedOperations: [...whitelistedOperations],\n allowPublicDirective,\n });\n\n return {\n onExecute({\n args,\n }: {\n args: {\n schema?: SchemaLike;\n document?: DocumentLike;\n operationName?: string | null;\n contextValue?: { workspace?: { id?: string }; request?: Request };\n };\n }) {\n // Extract operation name from args or document\n let operationName = args.operationName;\n\n if (!operationName && args.document?.definitions) {\n for (const def of args.document.definitions) {\n if (def.operation && def.name?.value) {\n operationName = def.name.value;\n break;\n }\n }\n }\n\n // Check if operation is whitelisted by name\n if (operationName && whitelistedOperations.has(operationName)) {\n return undefined;\n }\n\n // Check schema-directive-based public bypass (Option C)\n if (allowPublicDirective && allRootFieldsPublic(args.schema, args.document, operationName)) {\n return undefined;\n }\n\n // Check for workspace context\n const context = args.contextValue;\n const workspaceId = context?.workspace?.id;\n\n // Also check the raw header as a fallback\n const headerWorkspaceId = context?.request?.headers?.get?.('x-workspace-id');\n\n if (!workspaceId && !headerWorkspaceId) {\n logger.warn('[WorkspaceGuard] Blocked operation without workspace context', {\n operationName: operationName ?? '<anonymous>',\n });\n throw new WorkspaceRequiredError(errorMessage);\n }\n\n return undefined;\n },\n };\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { configureResourceCaps } from './chunk-XWVP4MC6.js';
1
+ import { configureResourceCaps } from './chunk-MZCBEJ67.js';
2
2
  import { createCounter } from './chunk-AWPNRV3L.js';
3
- import { GatewayClient } from './chunk-4X5WL6I3.js';
4
- import { LayerManager } from './chunk-7UJXIX4I.js';
5
- import { logger } from './chunk-CBZNP6RF.js';
3
+ import { GatewayClient } from './chunk-XYWLCNJH.js';
4
+ import { LayerManager } from './chunk-5NT2OEDQ.js';
5
+ import { logger } from './chunk-RU266375.js';
6
6
  import { __export, __name } from './chunk-XE4OXN2W.js';
7
7
 
8
8
  // src/init/index.ts
@@ -160,7 +160,7 @@ async function initializeEventQueue(_config) {
160
160
  return void 0;
161
161
  }
162
162
  try {
163
- const { EventQueueFactory } = await import('./EventQueueFactory-ELT7NDXK.js');
163
+ const { EventQueueFactory } = await import('./EventQueueFactory-J2XXPYXH.js');
164
164
  const publisher = EventQueueFactory.createPublisherFromEnv();
165
165
  await publisher.connect();
166
166
  logger.info("[SDK Init] Redis Streams event publisher connected");
@@ -267,5 +267,5 @@ async function initializeLayerStreams(config) {
267
267
  __name(initializeLayerStreams, "initializeLayerStreams");
268
268
 
269
269
  export { getSDKState, init_exports, initializeBurdenoffSDK, isSDKInitialized, resetSDK };
270
- //# sourceMappingURL=chunk-L3QCRJOA.js.map
271
- //# sourceMappingURL=chunk-L3QCRJOA.js.map
270
+ //# sourceMappingURL=chunk-74Y5YD3U.js.map
271
+ //# sourceMappingURL=chunk-74Y5YD3U.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/init/index.ts"],"names":["sdkState","isInitialized","initializeBurdenoffSDK","config","logger","warn","info","startTime","Date","now","initializeLogging","layerManager","gatewayClient","initializeLayer","layer","layerType","type","fallbackCounter","createCounter","configureResourceCaps","transport","query","variables","options","timeout","skipRetry","skipCircuitBreaker","response","internalQuery","crossLayerQuery","data","onFallback","inc","prisma","initializeDatabase","valkey","initializeCache","eventPublisher","initializeEventQueue","autoCreateStreams","initializeLayerStreams","graphSync","initializeGraphSync","clickhouse","initializeAnalytics","initializeObservability","graphSyncEnabled","graph","enabled","analyticsEnabled","analytics","observabilityEnabled","observability","metrics","layerAwareEnabled","duration","initializedState","serviceName","error","getSDKState","Error","isSDKInitialized","resetSDK","loggingConfig","logging","isDevelopment","app","nodeEnv","level","setLevel","console","setConsoleEnabled","format","database","url","maxConnections","enableQueryLogging","undefined","cacheConfig","cache","defaultTTL","_config","process","env","EventQueueFactory","publisher","createPublisherFromEnv","connect","message","String","note","eventsEnabled","productSource","streamName","syncInterval","batchSize","requestTimeout","openTelemetry","port","endpoint","samplingRate","LayerManager","serviceIdentity","GatewayClient","internalGatewayUrl","getInternalGatewayUrl","crossLayerGatewayUrl","getCrossLayerGatewayUrl","debug"],"mappings":"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","file":"chunk-L3QCRJOA.js","sourcesContent":["/**\n * Burdenoff SDK Initialization Module\n *\n * Provides a unified initialization function for all state services\n * including database, cache, analytics, event queue, and graph sync.\n *\n * @module init\n * @category Initialization\n */\n\nimport { logger } from '../logger/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { GatewayClient } from '../gateway/index.js';\nimport { configureResourceCaps } from '../resource-caps/index.js';\nimport { createCounter } from '../instrumentation/metrics-collector.js';\nimport type { BurdenoffSDKInitConfig, InitializedSDKState } from './types.js';\n\n/**\n * Global SDK state\n */\nlet sdkState: InitializedSDKState | null = null;\nlet isInitialized = false;\n\n/**\n * Initialize Burdenoff SDK with unified configuration\n *\n * This function initializes all configured state services in the correct order:\n * 1. Logging configuration\n * 2. Database (Prisma with PostgreSQL)\n * 3. Cache (Valkey)\n * 4. Event Queue (Redis Streams)\n * 5. Graph Sync (Redis Streams-based — Apache AGE writes happen inside wspace-graph-svc)\n * 6. Analytics (ClickHouse)\n * 7. Observability (Metrics, OpenTelemetry)\n *\n * @param config - SDK initialization configuration\n * @returns Initialized SDK state\n *\n * @example\n * ```typescript\n * import { initializeBurdenoffSDK } from '@burdenoff/be-sdk/init';\n *\n * const state = await initializeBurdenoffSDK({\n * database: {\n * url: process.env.DATABASE_URL!,\n * maxConnections: 20,\n * },\n * graph: {\n * enabled: true,\n * eventsEnabled: true,\n * },\n * cache: {\n * valkey: {\n * url: process.env.VALKEY_URL!,\n * },\n * },\n * });\n * ```\n */\nexport async function initializeBurdenoffSDK(config: BurdenoffSDKInitConfig): Promise<InitializedSDKState> {\n if (isInitialized && sdkState) {\n logger.warn('[SDK Init] SDK already initialized, returning existing state');\n return sdkState;\n }\n\n logger.info('[SDK Init] Starting SDK initialization...');\n const startTime = Date.now();\n\n try {\n // 1. Configure logging\n await initializeLogging(config);\n\n // 2. Initialize layer manager (if configured)\n const { layerManager, gatewayClient } = await initializeLayer(config);\n\n // 2b. Wire resource caps to billing so plan-based limits actually apply.\n // `userBillingPlan` lives in the GLOBAL layer: global services reach it\n // on their own internal gateway; wspace services go cross-layer via the\n // public global gateway (service JWT). Without this, every resource cap\n // silently collapses to the free-tier fallback regardless of the\n // customer's plan (BOFF-4805). Primes the process-wide singleton so all\n // existing `getResourceCaps()` call sites resolve real plans unchanged.\n if (gatewayClient && config.layer) {\n const layerType = config.layer.type;\n const fallbackCounter = createCounter(\n 'resource_caps.clientless_fallback_total',\n 'Total number of times resource caps fell back because no billing source was configured at bootstrap'\n );\n configureResourceCaps({\n transport: async (query, variables) => {\n // Cap checks run on entity-create paths and ALWAYS fall back to the\n // configured billing-failure tier on failure, so a billing outage\n // must degrade fast rather than stall writes. Bound the lookup with a\n // short timeout and no retries instead of the gateway defaults\n // (~30s × 3 ≈ 90s). Results are cached 60s, so healthy lookups rarely\n // hit the gateway anyway. `skipCircuitBreaker` keeps this best-effort\n // probe OUT of the shared gateway circuit: its failures already\n // degrade to the fallback here, so they must not count toward opening\n // the internal/cross-layer circuit and fail-fast unrelated M2M calls\n // during a billing outage.\n const options = { query, variables, timeout: 8000, skipRetry: true, skipCircuitBreaker: true };\n const response =\n layerType === 'global'\n ? await gatewayClient.internalQuery(options)\n : await gatewayClient.crossLayerQuery(options);\n return response?.data ?? null;\n },\n // Emitting a dedicated clientless-fallback counter at bootstrap means\n // a service that somehow starts without a billing transport is\n // immediately visible in metrics (BOFF-4809). The resource-caps module\n // itself also emits `resource_caps.plan_resolution_total`, but that\n // only fires on the first cap check; this counter fires at bootstrap.\n onFallback: () => fallbackCounter.inc(),\n });\n logger.info('[SDK Init] Resource caps wired to billing', { layer: layerType });\n } else {\n logger.warn('[SDK Init] No layer/gateway configured — resource caps will use free-tier fallbacks (BOFF-4805)');\n }\n\n // 3. Initialize database (required)\n const prisma = await initializeDatabase(config);\n\n // 4. Initialize cache (optional)\n const valkey = await initializeCache(config);\n\n // 5. Initialize event queue (optional) — Redis Streams via REDIS_URL\n const eventPublisher = await initializeEventQueue(config);\n\n // 6. Initialize layer streams (if layer configured)\n if (config.layer?.autoCreateStreams !== false && config.layer) {\n await initializeLayerStreams(config);\n }\n\n // 7. Initialize graph sync (optional) — publisher emits to Redis Streams,\n // never opens a graph-DB connection\n const graphSync = await initializeGraphSync(config);\n\n // 8. Initialize analytics (optional)\n const clickhouse = await initializeAnalytics(config);\n\n // 9. Initialize observability (optional)\n await initializeObservability(config);\n\n // Create SDK state\n // graphSync is a publisher-side placeholder; services emit Redis Streams\n // events and wspace-graph-svc owns the sole Apache AGE connection.\n void graphSync;\n sdkState = {\n prisma,\n valkey,\n clickhouse,\n eventPublisher,\n layerManager,\n gatewayClient,\n graphSyncEnabled: config.graph?.enabled ?? false,\n analyticsEnabled: !!config.analytics?.clickhouse,\n observabilityEnabled: config.observability?.metrics?.enabled ?? false,\n layerAwareEnabled: !!config.layer,\n };\n\n isInitialized = true;\n\n const duration = Date.now() - startTime;\n // sdkState is guaranteed non-null here since we just assigned it above\n const initializedState = sdkState;\n logger.info(`[SDK Init] SDK initialized successfully in ${duration}ms`, {\n graphSyncEnabled: initializedState.graphSyncEnabled,\n analyticsEnabled: initializedState.analyticsEnabled,\n observabilityEnabled: initializedState.observabilityEnabled,\n layerAwareEnabled: initializedState.layerAwareEnabled,\n layer: config.layer?.type,\n serviceName: config.layer?.serviceName,\n });\n\n return initializedState;\n } catch (error) {\n logger.error('[SDK Init] Failed to initialize SDK:', error);\n throw error;\n }\n}\n\n/**\n * Get current SDK state\n * @throws Error if SDK is not initialized\n */\nexport function getSDKState(): InitializedSDKState {\n if (!isInitialized || !sdkState) {\n throw new Error('SDK not initialized. Call initializeBurdenoffSDK() first.');\n }\n return sdkState;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isSDKInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset SDK state (useful for testing)\n */\nexport async function resetSDK(): Promise<void> {\n logger.info('[SDK Init] Resetting SDK state...');\n\n if (sdkState) {\n // Cleanup resources\n // Note: Individual cleanup will be handled by service-specific shutdown handlers\n sdkState = null;\n }\n\n isInitialized = false;\n logger.info('[SDK Init] SDK state reset');\n}\n\n/**\n * Initialize logging configuration\n */\nasync function initializeLogging(config: BurdenoffSDKInitConfig): Promise<void> {\n logger.info('[SDK Init] Configuring logging...');\n\n const loggingConfig = config.logging ?? {};\n const isDevelopment = config.app?.nodeEnv === 'development';\n\n // Set log level\n const level = loggingConfig.level ?? 'info';\n logger.setLevel(level);\n\n // Set console logging\n const console = loggingConfig.console ?? true;\n logger.setConsoleEnabled(console);\n\n logger.info('[SDK Init] Logging configured', {\n level,\n console,\n format: loggingConfig.format ?? (isDevelopment ? 'pretty' : 'json'),\n });\n}\n\n/**\n * Initialize database (Prisma with PostgreSQL)\n */\nasync function initializeDatabase(config: BurdenoffSDKInitConfig): Promise<unknown> {\n logger.info('[SDK Init] Initializing database...');\n\n // Note: Database initialization is handled by createPrismaClient in prisma/client.ts\n // This is called by the application (e.g., workspaces-backend)\n // We just validate the config here\n if (!config.database?.url) {\n throw new Error('Database URL is required');\n }\n\n logger.info('[SDK Init] Database configuration validated', {\n maxConnections: config.database.maxConnections ?? 20,\n enableQueryLogging: config.database.enableQueryLogging ?? false,\n });\n\n // Return undefined as database client is created separately\n return undefined;\n}\n\n/**\n * Initialize cache (Valkey)\n */\nasync function initializeCache(config: BurdenoffSDKInitConfig): Promise<unknown> {\n const cacheConfig = config.cache?.valkey;\n\n if (!cacheConfig) {\n logger.info('[SDK Init] Cache not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing Valkey cache...');\n\n // Note: Valkey initialization is handled by cache module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] Valkey cache configuration validated', {\n url: cacheConfig.url ? '***' : undefined,\n defaultTTL: cacheConfig.defaultTTL ?? 3600,\n });\n\n return undefined;\n}\n\n/**\n * Initialize event queue (Redis Streams).\n *\n * NATS was retired on 2026-05-16. The publisher is created from\n * `REDIS_URL` (set platform-wide in KV). Legacy `config.eventQueue.nats`\n * values are ignored — kept on the type only as a back-compat shim.\n */\nasync function initializeEventQueue(_config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!process.env['REDIS_URL']) {\n logger.info('[SDK Init] REDIS_URL not set, skipping event queue init');\n return undefined;\n }\n\n try {\n const { EventQueueFactory } = await import('../event-queue/factory/EventQueueFactory.js');\n const publisher = EventQueueFactory.createPublisherFromEnv();\n await publisher.connect();\n\n logger.info('[SDK Init] Redis Streams event publisher connected');\n\n return publisher;\n } catch (error) {\n logger.warn('[SDK Init] Failed to connect Redis Streams event publisher (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n note: 'Service will continue without event publishing. Use direct API calls as fallback.',\n });\n return undefined;\n }\n}\n\n/**\n * Initialize graph sync (Redis Streams publisher side).\n *\n * Services publish entity events to Redis Streams; the `wspace-graph-svc`\n * consumer (and only it) persists them into Apache AGE via Azure PG\n * sidecar. This SDK function does no DB work — it just validates that the\n * publisher-side config is sensible and logs it.\n */\nasync function initializeGraphSync(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.graph?.enabled) {\n logger.info('[SDK Init] Graph sync not enabled, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Graph sync enabled (publisher-only mode)', {\n eventsEnabled: config.graph.eventsEnabled ?? true,\n productSource: config.graph.productSource,\n streamName: config.graph.streamName ?? 'graph_events',\n syncInterval: config.graph.syncInterval ?? 1000,\n batchSize: config.graph.batchSize ?? 10,\n });\n\n return undefined;\n}\n\n/**\n * Initialize analytics (ClickHouse)\n */\nasync function initializeAnalytics(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.analytics?.clickhouse) {\n logger.info('[SDK Init] Analytics not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing ClickHouse for analytics...');\n\n // Note: ClickHouse initialization is handled by analytics module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] ClickHouse configuration validated', {\n url: config.analytics.clickhouse.url,\n database: config.analytics.clickhouse.database,\n requestTimeout: config.analytics.clickhouse.requestTimeout ?? 60000,\n });\n\n return undefined;\n}\n\n/**\n * Initialize observability (metrics, tracing)\n */\nasync function initializeObservability(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.observability?.metrics?.enabled && !config.observability?.openTelemetry?.enabled) {\n logger.info('[SDK Init] Observability not configured, skipping');\n return;\n }\n\n logger.info('[SDK Init] Initializing observability...');\n\n // Note: Observability initialization is handled by observability module\n // This is a placeholder for future implementation\n if (config.observability.metrics?.enabled) {\n logger.info('[SDK Init] Metrics configuration validated', {\n port: config.observability.metrics.port ?? 9090,\n endpoint: config.observability.metrics.endpoint ?? '/metrics',\n });\n }\n\n if (config.observability.openTelemetry?.enabled) {\n logger.info('[SDK Init] OpenTelemetry configuration validated', {\n serviceName: config.observability.openTelemetry.serviceName,\n samplingRate: config.observability.openTelemetry.samplingRate ?? 1.0,\n });\n }\n}\n\n/**\n * Initialize layer manager and gateway client\n */\nasync function initializeLayer(\n config: BurdenoffSDKInitConfig\n): Promise<{ layerManager?: LayerManager; gatewayClient?: GatewayClient }> {\n if (!config.layer) {\n logger.info('[SDK Init] Layer configuration not provided, skipping layer initialization');\n return {};\n }\n\n logger.info('[SDK Init] Initializing layer manager...', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n });\n\n // Create layer manager\n const layerManager = new LayerManager({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n });\n\n // Create gateway client\n const gatewayClient = new GatewayClient({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n logger.info('[SDK Init] Layer manager initialized', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n return { layerManager, gatewayClient };\n}\n\n/**\n * Initialize layer-specific Redis streams.\n *\n * No-op since the 2026-05-16 NATS retirement: Redis Streams are created\n * on demand by `XGROUP CREATE ... MKSTREAM` inside the consumer, so no\n * upfront connect-and-provision step is needed.\n */\nasync function initializeLayerStreams(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.layer) {\n return;\n }\n logger.debug('[SDK Init] Layer streams init is a no-op for Redis Streams (auto-created on first XADD/XGROUP)', {\n layer: config.layer.type,\n });\n}\n\n// Export types\nexport type * from './types.js';\n"]}
1
+ {"version":3,"sources":["../src/init/index.ts"],"names":["sdkState","isInitialized","initializeBurdenoffSDK","config","logger","warn","info","startTime","Date","now","initializeLogging","layerManager","gatewayClient","initializeLayer","layer","layerType","type","fallbackCounter","createCounter","configureResourceCaps","transport","query","variables","options","timeout","skipRetry","skipCircuitBreaker","response","internalQuery","crossLayerQuery","data","onFallback","inc","prisma","initializeDatabase","valkey","initializeCache","eventPublisher","initializeEventQueue","autoCreateStreams","initializeLayerStreams","graphSync","initializeGraphSync","clickhouse","initializeAnalytics","initializeObservability","graphSyncEnabled","graph","enabled","analyticsEnabled","analytics","observabilityEnabled","observability","metrics","layerAwareEnabled","duration","initializedState","serviceName","error","getSDKState","Error","isSDKInitialized","resetSDK","loggingConfig","logging","isDevelopment","app","nodeEnv","level","setLevel","console","setConsoleEnabled","format","database","url","maxConnections","enableQueryLogging","undefined","cacheConfig","cache","defaultTTL","_config","process","env","EventQueueFactory","publisher","createPublisherFromEnv","connect","message","String","note","eventsEnabled","productSource","streamName","syncInterval","batchSize","requestTimeout","openTelemetry","port","endpoint","samplingRate","LayerManager","serviceIdentity","GatewayClient","internalGatewayUrl","getInternalGatewayUrl","crossLayerGatewayUrl","getCrossLayerGatewayUrl","debug"],"mappings":"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","file":"chunk-74Y5YD3U.js","sourcesContent":["/**\n * Burdenoff SDK Initialization Module\n *\n * Provides a unified initialization function for all state services\n * including database, cache, analytics, event queue, and graph sync.\n *\n * @module init\n * @category Initialization\n */\n\nimport { logger } from '../logger/index.js';\nimport { LayerManager } from '../layer/index.js';\nimport { GatewayClient } from '../gateway/index.js';\nimport { configureResourceCaps } from '../resource-caps/index.js';\nimport { createCounter } from '../instrumentation/metrics-collector.js';\nimport type { BurdenoffSDKInitConfig, InitializedSDKState } from './types.js';\n\n/**\n * Global SDK state\n */\nlet sdkState: InitializedSDKState | null = null;\nlet isInitialized = false;\n\n/**\n * Initialize Burdenoff SDK with unified configuration\n *\n * This function initializes all configured state services in the correct order:\n * 1. Logging configuration\n * 2. Database (Prisma with PostgreSQL)\n * 3. Cache (Valkey)\n * 4. Event Queue (Redis Streams)\n * 5. Graph Sync (Redis Streams-based — Apache AGE writes happen inside wspace-graph-svc)\n * 6. Analytics (ClickHouse)\n * 7. Observability (Metrics, OpenTelemetry)\n *\n * @param config - SDK initialization configuration\n * @returns Initialized SDK state\n *\n * @example\n * ```typescript\n * import { initializeBurdenoffSDK } from '@burdenoff/be-sdk/init';\n *\n * const state = await initializeBurdenoffSDK({\n * database: {\n * url: process.env.DATABASE_URL!,\n * maxConnections: 20,\n * },\n * graph: {\n * enabled: true,\n * eventsEnabled: true,\n * },\n * cache: {\n * valkey: {\n * url: process.env.VALKEY_URL!,\n * },\n * },\n * });\n * ```\n */\nexport async function initializeBurdenoffSDK(config: BurdenoffSDKInitConfig): Promise<InitializedSDKState> {\n if (isInitialized && sdkState) {\n logger.warn('[SDK Init] SDK already initialized, returning existing state');\n return sdkState;\n }\n\n logger.info('[SDK Init] Starting SDK initialization...');\n const startTime = Date.now();\n\n try {\n // 1. Configure logging\n await initializeLogging(config);\n\n // 2. Initialize layer manager (if configured)\n const { layerManager, gatewayClient } = await initializeLayer(config);\n\n // 2b. Wire resource caps to billing so plan-based limits actually apply.\n // `userBillingPlan` lives in the GLOBAL layer: global services reach it\n // on their own internal gateway; wspace services go cross-layer via the\n // public global gateway (service JWT). Without this, every resource cap\n // silently collapses to the free-tier fallback regardless of the\n // customer's plan (BOFF-4805). Primes the process-wide singleton so all\n // existing `getResourceCaps()` call sites resolve real plans unchanged.\n if (gatewayClient && config.layer) {\n const layerType = config.layer.type;\n const fallbackCounter = createCounter(\n 'resource_caps.clientless_fallback_total',\n 'Total number of times resource caps fell back because no billing source was configured at bootstrap'\n );\n configureResourceCaps({\n transport: async (query, variables) => {\n // Cap checks run on entity-create paths and ALWAYS fall back to the\n // configured billing-failure tier on failure, so a billing outage\n // must degrade fast rather than stall writes. Bound the lookup with a\n // short timeout and no retries instead of the gateway defaults\n // (~30s × 3 ≈ 90s). Results are cached 60s, so healthy lookups rarely\n // hit the gateway anyway. `skipCircuitBreaker` keeps this best-effort\n // probe OUT of the shared gateway circuit: its failures already\n // degrade to the fallback here, so they must not count toward opening\n // the internal/cross-layer circuit and fail-fast unrelated M2M calls\n // during a billing outage.\n const options = { query, variables, timeout: 8000, skipRetry: true, skipCircuitBreaker: true };\n const response =\n layerType === 'global'\n ? await gatewayClient.internalQuery(options)\n : await gatewayClient.crossLayerQuery(options);\n return response?.data ?? null;\n },\n // Emitting a dedicated clientless-fallback counter at bootstrap means\n // a service that somehow starts without a billing transport is\n // immediately visible in metrics (BOFF-4809). The resource-caps module\n // itself also emits `resource_caps.plan_resolution_total`, but that\n // only fires on the first cap check; this counter fires at bootstrap.\n onFallback: () => fallbackCounter.inc(),\n });\n logger.info('[SDK Init] Resource caps wired to billing', { layer: layerType });\n } else {\n logger.warn('[SDK Init] No layer/gateway configured — resource caps will use free-tier fallbacks (BOFF-4805)');\n }\n\n // 3. Initialize database (required)\n const prisma = await initializeDatabase(config);\n\n // 4. Initialize cache (optional)\n const valkey = await initializeCache(config);\n\n // 5. Initialize event queue (optional) — Redis Streams via REDIS_URL\n const eventPublisher = await initializeEventQueue(config);\n\n // 6. Initialize layer streams (if layer configured)\n if (config.layer?.autoCreateStreams !== false && config.layer) {\n await initializeLayerStreams(config);\n }\n\n // 7. Initialize graph sync (optional) — publisher emits to Redis Streams,\n // never opens a graph-DB connection\n const graphSync = await initializeGraphSync(config);\n\n // 8. Initialize analytics (optional)\n const clickhouse = await initializeAnalytics(config);\n\n // 9. Initialize observability (optional)\n await initializeObservability(config);\n\n // Create SDK state\n // graphSync is a publisher-side placeholder; services emit Redis Streams\n // events and wspace-graph-svc owns the sole Apache AGE connection.\n void graphSync;\n sdkState = {\n prisma,\n valkey,\n clickhouse,\n eventPublisher,\n layerManager,\n gatewayClient,\n graphSyncEnabled: config.graph?.enabled ?? false,\n analyticsEnabled: !!config.analytics?.clickhouse,\n observabilityEnabled: config.observability?.metrics?.enabled ?? false,\n layerAwareEnabled: !!config.layer,\n };\n\n isInitialized = true;\n\n const duration = Date.now() - startTime;\n // sdkState is guaranteed non-null here since we just assigned it above\n const initializedState = sdkState;\n logger.info(`[SDK Init] SDK initialized successfully in ${duration}ms`, {\n graphSyncEnabled: initializedState.graphSyncEnabled,\n analyticsEnabled: initializedState.analyticsEnabled,\n observabilityEnabled: initializedState.observabilityEnabled,\n layerAwareEnabled: initializedState.layerAwareEnabled,\n layer: config.layer?.type,\n serviceName: config.layer?.serviceName,\n });\n\n return initializedState;\n } catch (error) {\n logger.error('[SDK Init] Failed to initialize SDK:', error);\n throw error;\n }\n}\n\n/**\n * Get current SDK state\n * @throws Error if SDK is not initialized\n */\nexport function getSDKState(): InitializedSDKState {\n if (!isInitialized || !sdkState) {\n throw new Error('SDK not initialized. Call initializeBurdenoffSDK() first.');\n }\n return sdkState;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isSDKInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Reset SDK state (useful for testing)\n */\nexport async function resetSDK(): Promise<void> {\n logger.info('[SDK Init] Resetting SDK state...');\n\n if (sdkState) {\n // Cleanup resources\n // Note: Individual cleanup will be handled by service-specific shutdown handlers\n sdkState = null;\n }\n\n isInitialized = false;\n logger.info('[SDK Init] SDK state reset');\n}\n\n/**\n * Initialize logging configuration\n */\nasync function initializeLogging(config: BurdenoffSDKInitConfig): Promise<void> {\n logger.info('[SDK Init] Configuring logging...');\n\n const loggingConfig = config.logging ?? {};\n const isDevelopment = config.app?.nodeEnv === 'development';\n\n // Set log level\n const level = loggingConfig.level ?? 'info';\n logger.setLevel(level);\n\n // Set console logging\n const console = loggingConfig.console ?? true;\n logger.setConsoleEnabled(console);\n\n logger.info('[SDK Init] Logging configured', {\n level,\n console,\n format: loggingConfig.format ?? (isDevelopment ? 'pretty' : 'json'),\n });\n}\n\n/**\n * Initialize database (Prisma with PostgreSQL)\n */\nasync function initializeDatabase(config: BurdenoffSDKInitConfig): Promise<unknown> {\n logger.info('[SDK Init] Initializing database...');\n\n // Note: Database initialization is handled by createPrismaClient in prisma/client.ts\n // This is called by the application (e.g., workspaces-backend)\n // We just validate the config here\n if (!config.database?.url) {\n throw new Error('Database URL is required');\n }\n\n logger.info('[SDK Init] Database configuration validated', {\n maxConnections: config.database.maxConnections ?? 20,\n enableQueryLogging: config.database.enableQueryLogging ?? false,\n });\n\n // Return undefined as database client is created separately\n return undefined;\n}\n\n/**\n * Initialize cache (Valkey)\n */\nasync function initializeCache(config: BurdenoffSDKInitConfig): Promise<unknown> {\n const cacheConfig = config.cache?.valkey;\n\n if (!cacheConfig) {\n logger.info('[SDK Init] Cache not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing Valkey cache...');\n\n // Note: Valkey initialization is handled by cache module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] Valkey cache configuration validated', {\n url: cacheConfig.url ? '***' : undefined,\n defaultTTL: cacheConfig.defaultTTL ?? 3600,\n });\n\n return undefined;\n}\n\n/**\n * Initialize event queue (Redis Streams).\n *\n * NATS was retired on 2026-05-16. The publisher is created from\n * `REDIS_URL` (set platform-wide in KV). Legacy `config.eventQueue.nats`\n * values are ignored — kept on the type only as a back-compat shim.\n */\nasync function initializeEventQueue(_config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!process.env['REDIS_URL']) {\n logger.info('[SDK Init] REDIS_URL not set, skipping event queue init');\n return undefined;\n }\n\n try {\n const { EventQueueFactory } = await import('../event-queue/factory/EventQueueFactory.js');\n const publisher = EventQueueFactory.createPublisherFromEnv();\n await publisher.connect();\n\n logger.info('[SDK Init] Redis Streams event publisher connected');\n\n return publisher;\n } catch (error) {\n logger.warn('[SDK Init] Failed to connect Redis Streams event publisher (non-fatal)', {\n error: error instanceof Error ? error.message : String(error),\n note: 'Service will continue without event publishing. Use direct API calls as fallback.',\n });\n return undefined;\n }\n}\n\n/**\n * Initialize graph sync (Redis Streams publisher side).\n *\n * Services publish entity events to Redis Streams; the `wspace-graph-svc`\n * consumer (and only it) persists them into Apache AGE via Azure PG\n * sidecar. This SDK function does no DB work — it just validates that the\n * publisher-side config is sensible and logs it.\n */\nasync function initializeGraphSync(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.graph?.enabled) {\n logger.info('[SDK Init] Graph sync not enabled, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Graph sync enabled (publisher-only mode)', {\n eventsEnabled: config.graph.eventsEnabled ?? true,\n productSource: config.graph.productSource,\n streamName: config.graph.streamName ?? 'graph_events',\n syncInterval: config.graph.syncInterval ?? 1000,\n batchSize: config.graph.batchSize ?? 10,\n });\n\n return undefined;\n}\n\n/**\n * Initialize analytics (ClickHouse)\n */\nasync function initializeAnalytics(config: BurdenoffSDKInitConfig): Promise<unknown> {\n if (!config.analytics?.clickhouse) {\n logger.info('[SDK Init] Analytics not configured, skipping');\n return undefined;\n }\n\n logger.info('[SDK Init] Initializing ClickHouse for analytics...');\n\n // Note: ClickHouse initialization is handled by analytics module\n // This is a placeholder for future implementation\n logger.info('[SDK Init] ClickHouse configuration validated', {\n url: config.analytics.clickhouse.url,\n database: config.analytics.clickhouse.database,\n requestTimeout: config.analytics.clickhouse.requestTimeout ?? 60000,\n });\n\n return undefined;\n}\n\n/**\n * Initialize observability (metrics, tracing)\n */\nasync function initializeObservability(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.observability?.metrics?.enabled && !config.observability?.openTelemetry?.enabled) {\n logger.info('[SDK Init] Observability not configured, skipping');\n return;\n }\n\n logger.info('[SDK Init] Initializing observability...');\n\n // Note: Observability initialization is handled by observability module\n // This is a placeholder for future implementation\n if (config.observability.metrics?.enabled) {\n logger.info('[SDK Init] Metrics configuration validated', {\n port: config.observability.metrics.port ?? 9090,\n endpoint: config.observability.metrics.endpoint ?? '/metrics',\n });\n }\n\n if (config.observability.openTelemetry?.enabled) {\n logger.info('[SDK Init] OpenTelemetry configuration validated', {\n serviceName: config.observability.openTelemetry.serviceName,\n samplingRate: config.observability.openTelemetry.samplingRate ?? 1.0,\n });\n }\n}\n\n/**\n * Initialize layer manager and gateway client\n */\nasync function initializeLayer(\n config: BurdenoffSDKInitConfig\n): Promise<{ layerManager?: LayerManager; gatewayClient?: GatewayClient }> {\n if (!config.layer) {\n logger.info('[SDK Init] Layer configuration not provided, skipping layer initialization');\n return {};\n }\n\n logger.info('[SDK Init] Initializing layer manager...', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n });\n\n // Create layer manager\n const layerManager = new LayerManager({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n });\n\n // Create gateway client\n const gatewayClient = new GatewayClient({\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n serviceIdentity: config.layer.serviceIdentity,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n logger.info('[SDK Init] Layer manager initialized', {\n layer: config.layer.type,\n serviceName: config.layer.serviceName,\n internalGatewayUrl: layerManager.getInternalGatewayUrl(),\n crossLayerGatewayUrl: layerManager.getCrossLayerGatewayUrl(),\n });\n\n return { layerManager, gatewayClient };\n}\n\n/**\n * Initialize layer-specific Redis streams.\n *\n * No-op since the 2026-05-16 NATS retirement: Redis Streams are created\n * on demand by `XGROUP CREATE ... MKSTREAM` inside the consumer, so no\n * upfront connect-and-provision step is needed.\n */\nasync function initializeLayerStreams(config: BurdenoffSDKInitConfig): Promise<void> {\n if (!config.layer) {\n return;\n }\n logger.debug('[SDK Init] Layer streams init is a no-op for Redis Streams (auto-created on first XADD/XGROUP)', {\n layer: config.layer.type,\n });\n}\n\n// Export types\nexport type * from './types.js';\n"]}
@@ -1,5 +1,5 @@
1
1
  import { defaultCollectorTracesEndpoint } from './chunk-FZRODKIN.js';
2
- import { logger } from './chunk-CBZNP6RF.js';
2
+ import { logger } from './chunk-RU266375.js';
3
3
  import { __export, __name } from './chunk-XE4OXN2W.js';
4
4
  import { GraphQLError, validate, Kind } from 'graphql';
5
5
 
@@ -1375,5 +1375,5 @@ var buildSecurityPlugins = /* @__PURE__ */ __name(async (options) => {
1375
1375
  }, "buildSecurityPlugins");
1376
1376
 
1377
1377
  export { DEFAULT_ARMOR_CONFIG, DEFAULT_COST_MAP, DEFAULT_TIERS, MemoryValkey, __resetMetricsForTest, __setSecurityValkeyForTest, buildSecurityPlugins, checkRateLimit, createArmorPlugins, createOperationTimeoutPlugin, createOtelPlugin, createQueryComplexityPlugin, createRateLimitPlugin, getMetrics, getSecurityValkey, initializeMetrics, initializeOtel, initializeSecurityValkey, mergeCostMap, resolveActor, resolveSecurityOptionsFromEnv, resolveTiersFromEnv, scrapeMetrics, security_exports, shutdownOtel };
1378
- //# sourceMappingURL=chunk-NVVWSOY7.js.map
1379
- //# sourceMappingURL=chunk-NVVWSOY7.js.map
1378
+ //# sourceMappingURL=chunk-AX3UF33H.js.map
1379
+ //# sourceMappingURL=chunk-AX3UF33H.js.map