@keboola/api-client 56.0.0 → 57.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +110 -229
- package/API-SURFACE.md +10 -2
- package/CHANGELOG.md +45 -0
- package/README.md +20 -133
- package/dist/{ManagementSessionMintError-Bc9bc7Ai.cjs → ManagementSessionMintError-BCOLLaJi.cjs} +3 -2
- package/dist/ManagementSessionMintError-BCOLLaJi.cjs.map +1 -0
- package/dist/{ManagementSessionMintError-BMHDcEqV.js → ManagementSessionMintError-KUX3utTV.js} +3 -2
- package/dist/ManagementSessionMintError-KUX3utTV.js.map +1 -0
- package/dist/{adminRoles-CUB0JddB.d.ts → adminRoles-CnfGDvjN.d.ts} +2 -2
- package/dist/{adminRoles-BFOPSedO.d.cts → adminRoles-D6AS9Bzx.d.cts} +2 -2
- package/dist/ai/index.d.cts +2 -2
- package/dist/ai/index.d.ts +2 -2
- package/dist/ai/types.d.cts +1 -1
- package/dist/ai/types.d.ts +1 -1
- package/dist/apps/index.cjs +1 -1
- package/dist/apps/index.d.cts +2 -2
- package/dist/apps/index.d.ts +2 -2
- package/dist/apps/index.js +1 -1
- package/dist/apps/types.d.cts +2 -2
- package/dist/apps/types.d.ts +2 -2
- package/dist/{apps-C1x5IKNQ.cjs → apps-BA9JRLAZ.cjs} +55 -1
- package/dist/apps-BA9JRLAZ.cjs.map +1 -0
- package/dist/{apps-BN7fWtSm.js → apps-DDcguJ1i.js} +55 -1
- package/dist/apps-DDcguJ1i.js.map +1 -0
- package/dist/assets/index.d.cts +1 -1
- package/dist/assets/index.d.ts +1 -1
- package/dist/auth/index.cjs +1 -1
- package/dist/auth/index.d.cts +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/types.d.cts +2 -2
- package/dist/auth/types.d.ts +2 -2
- package/dist/{authClient-B_Mb4Vzs.js → authClient-BKGpJI5L.js} +13 -2
- package/dist/authClient-BKGpJI5L.js.map +1 -0
- package/dist/{authClient-C9QqhT2M.cjs → authClient-C3KG9hXw.cjs} +17 -6
- package/dist/authClient-C3KG9hXw.cjs.map +1 -0
- package/dist/{authClient-Dgyb0EFi.d.ts → authClient-CbWpMmdX.d.ts} +7 -4
- package/dist/{authClient-DOetdp2k.d.cts → authClient-UKeopxZZ.d.cts} +7 -4
- package/dist/billing/index.d.cts +1 -1
- package/dist/billing/index.d.ts +1 -1
- package/dist/billing/types.d.cts +1 -1
- package/dist/billing/types.d.ts +1 -1
- package/dist/chat/index.d.cts +2 -2
- package/dist/chat/index.d.ts +2 -2
- package/dist/chat/types.d.cts +1 -1
- package/dist/chat/types.d.ts +1 -1
- package/dist/componentsMcp/index.d.cts +1 -1
- package/dist/componentsMcp/index.d.ts +1 -1
- package/dist/componentsMcp/types.d.cts +1 -1
- package/dist/componentsMcp/types.d.ts +1 -1
- package/dist/constants/index.cjs +2 -2
- package/dist/constants/index.d.cts +3 -3
- package/dist/constants/index.d.ts +3 -3
- package/dist/constants/index.js +2 -2
- package/dist/{constants-HccvU5kx.js → constants-CxEaHCyt.js} +4 -3
- package/dist/constants-CxEaHCyt.js.map +1 -0
- package/dist/{constants-V9hAyPTo.cjs → constants-fiyOLyZE.cjs} +4 -3
- package/dist/constants-fiyOLyZE.cjs.map +1 -0
- package/dist/dataScience/index.d.cts +3 -3
- package/dist/dataScience/index.d.ts +3 -3
- package/dist/dataScience/types.d.cts +1 -1
- package/dist/dataScience/types.d.ts +1 -1
- package/dist/developerPortal/index.cjs +1 -1
- package/dist/developerPortal/index.d.cts +3 -3
- package/dist/developerPortal/index.d.ts +3 -3
- package/dist/developerPortal/index.js +1 -1
- package/dist/developerPortal/types.d.cts +2 -2
- package/dist/developerPortal/types.d.ts +2 -2
- package/dist/{developerPortalClient-CzCJ5sE3.js → developerPortalClient-3Q7049-4.js} +19 -1
- package/dist/developerPortalClient-3Q7049-4.js.map +1 -0
- package/dist/{developerPortalClient-BcK9F-Fs.cjs → developerPortalClient-Cj9bStCS.cjs} +19 -1
- package/dist/developerPortalClient-Cj9bStCS.cjs.map +1 -0
- package/dist/domain/permissions/index.d.cts +1 -1
- package/dist/domain/permissions/index.d.ts +1 -1
- package/dist/editor/index.d.cts +2 -2
- package/dist/editor/index.d.ts +2 -2
- package/dist/editor/types.d.cts +1 -1
- package/dist/editor/types.d.ts +1 -1
- package/dist/{emitter-raKkIqRp.d.ts → emitter-yaYzJOdh.d.cts} +1 -2
- package/dist/{emitter-raKkIqRp.d.cts → emitter-yaYzJOdh.d.ts} +1 -2
- package/dist/encryption/index.d.cts +1 -1
- package/dist/encryption/index.d.ts +1 -1
- package/dist/encryption/types.d.cts +1 -1
- package/dist/encryption/types.d.ts +1 -1
- package/dist/import/index.d.cts +3 -3
- package/dist/import/index.d.ts +3 -3
- package/dist/{index-DcKc3_Y1.d.cts → index-9p4O-clX.d.cts} +2033 -72
- package/dist/{index-DcKc3_Y1.d.ts → index-9p4O-clX.d.ts} +2033 -72
- package/dist/{index-CLqZfRpv.d.cts → index-B-HCh7LL.d.cts} +3 -3
- package/dist/{index-CxoJuIzB.d.cts → index-B0e42GnK.d.cts} +4 -3
- package/dist/{index-Bgu3hnMO.d.ts → index-BbXGsspe.d.ts} +4 -4
- package/dist/{index-B7Ogo2SK.d.ts → index-Bg9BWpIY.d.ts} +4 -3
- package/dist/{index-DPhGNQC5.d.cts → index-BgEu7wGk.d.cts} +2559 -7319
- package/dist/{index-C_A0JS9s.d.ts → index-Btft3BFn.d.ts} +29 -3
- package/dist/{index-DXNRd61K.d.cts → index-ByaAn_lm.d.cts} +4 -4
- package/dist/{index-A8udJCGv.d.ts → index-C92Ct6K5.d.ts} +178 -4
- package/dist/{index-B30dBBBH.d.ts → index-CBq59Aif.d.ts} +3 -3
- package/dist/{index-DAb1g6je.d.cts → index-CGUPsu_R.d.cts} +29 -3
- package/dist/{index-CLxvW_pn.d.ts → index-CIA6-x2Q.d.ts} +4 -4
- package/dist/{index-B2YNTI4p.d.ts → index-CeWVf3d1.d.ts} +4 -4
- package/dist/{index-GlHJ4j3a.d.ts → index-Cj0l_DL_.d.ts} +2559 -7319
- package/dist/{index-BUZ-vTRt.d.ts → index-Ck0UPKMM.d.ts} +2 -2
- package/dist/{index-B-HhOTVk.d.cts → index-D0ACg_Pp.d.cts} +7 -4
- package/dist/{index-Dx02AUpZ.d.cts → index-D8nMnVp1.d.cts} +4 -4
- package/dist/{index-24GpnYhn.d.cts → index-DENUPo51.d.cts} +2 -2
- package/dist/{index-RHYdFrfn.d.cts → index-DGjxLWZ-.d.cts} +3 -3
- package/dist/{index-BH1jo-bb.d.ts → index-Dse6Psvc.d.ts} +7 -4
- package/dist/{index-BaJ-GMa7.d.ts → index-DxcaEIhU.d.ts} +3 -3
- package/dist/{index-CpidrJQc.d.cts → index-OCEoQ1Y-.d.cts} +4 -4
- package/dist/{index-DxbqDi_0.d.cts → index-jR69kGUZ.d.cts} +178 -4
- package/dist/index.cjs +615 -867
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +611 -860
- package/dist/index.js.map +1 -1
- package/dist/kaiAgent/index.cjs +1 -1
- package/dist/kaiAgent/index.d.cts +2 -2
- package/dist/kaiAgent/index.d.ts +2 -2
- package/dist/kaiAgent/index.js +1 -1
- package/dist/kaiAgent/types.d.cts +2 -2
- package/dist/kaiAgent/types.d.ts +2 -2
- package/dist/{kaiAgent-De2T6G4G.cjs → kaiAgent-Q00g6S1v.cjs} +16 -1
- package/dist/kaiAgent-Q00g6S1v.cjs.map +1 -0
- package/dist/{kaiAgent-D0MoKqXe.js → kaiAgent-aqylPZHY.js} +16 -1
- package/dist/kaiAgent-aqylPZHY.js.map +1 -0
- package/dist/management/index.cjs +1 -1
- package/dist/management/index.d.cts +1 -1
- package/dist/management/index.d.ts +1 -1
- package/dist/management/index.js +1 -1
- package/dist/management/types.d.cts +1 -1
- package/dist/management/types.d.ts +1 -1
- package/dist/{management-BlMQnPNS.js → management-CIK5-Aq5.js} +14 -7
- package/dist/management-CIK5-Aq5.js.map +1 -0
- package/dist/{management-dIMrTTpI.cjs → management-Dqrc516s.cjs} +14 -7
- package/dist/management-Dqrc516s.cjs.map +1 -0
- package/dist/{metaObject-qWyZAD-5.d.ts → metaObject-AQ7wKDOu.d.ts} +2 -2
- package/dist/{metaObject-BsBMgWRt.d.cts → metaObject-I35_krxf.d.cts} +2 -2
- package/dist/metastore/index.d.cts +1 -1
- package/dist/metastore/index.d.ts +1 -1
- package/dist/metastore/types.d.cts +1 -1
- package/dist/metastore/types.d.ts +1 -1
- package/dist/microsoftGraph/index.d.cts +3 -3
- package/dist/microsoftGraph/index.d.ts +3 -3
- package/dist/microsoftGraph/types.d.cts +2 -2
- package/dist/microsoftGraph/types.d.ts +2 -2
- package/dist/{middleware-DxGv7DG8.js → middleware-DWmhthX0.js} +2 -2
- package/dist/middleware-DWmhthX0.js.map +1 -0
- package/dist/{middleware-vIaPDtQI.cjs → middleware-DYdDD4O6.cjs} +2 -2
- package/dist/middleware-DYdDD4O6.cjs.map +1 -0
- package/dist/notifications/index.d.cts +2 -2
- package/dist/notifications/index.d.ts +2 -2
- package/dist/notifications/types.d.cts +1 -1
- package/dist/notifications/types.d.ts +1 -1
- package/dist/oauth/index.d.cts +2 -2
- package/dist/oauth/index.d.ts +2 -2
- package/dist/oauth/types.d.cts +1 -1
- package/dist/oauth/types.d.ts +1 -1
- package/dist/omnisearch/index.d.cts +2 -2
- package/dist/omnisearch/index.d.ts +2 -2
- package/dist/omnisearch/types.d.cts +1 -1
- package/dist/omnisearch/types.d.ts +1 -1
- package/dist/{project-CmV1OhK4.d.ts → project-DwRvx_zN.d.ts} +3 -3
- package/dist/{project-F6eHCACz.d.cts → project-ERH0FTGW.d.cts} +3 -3
- package/dist/queryService/index.cjs +1 -1
- package/dist/queryService/index.d.cts +1 -1
- package/dist/queryService/index.d.ts +1 -1
- package/dist/queryService/index.js +1 -1
- package/dist/queryService/types.d.cts +1 -1
- package/dist/queryService/types.d.ts +1 -1
- package/dist/{queryService-C3BQ6GKW.cjs → queryService-CECWubS0.cjs} +2 -2
- package/dist/{queryService-C3BQ6GKW.cjs.map → queryService-CECWubS0.cjs.map} +1 -1
- package/dist/{queryService-DQHtHy2-.js → queryService-CIxb_mcP.js} +2 -2
- package/dist/{queryService-DQHtHy2-.js.map → queryService-CIxb_mcP.js.map} +1 -1
- package/dist/queue/index.cjs +1 -1
- package/dist/queue/index.d.cts +11 -4
- package/dist/queue/index.d.ts +11 -4
- package/dist/queue/index.js +1 -1
- package/dist/queue/types.d.cts +1 -1
- package/dist/queue/types.d.ts +1 -1
- package/dist/{queue-6cywDnA-.js → queue-BBihD5qQ.js} +2 -2
- package/dist/{queue-6cywDnA-.js.map → queue-BBihD5qQ.js.map} +1 -1
- package/dist/{queue-J2uXzXR9.cjs → queue-PmTfoniJ.cjs} +2 -2
- package/dist/{queue-J2uXzXR9.cjs.map → queue-PmTfoniJ.cjs.map} +1 -1
- package/dist/scheduler/index.d.cts +2 -2
- package/dist/scheduler/index.d.ts +2 -2
- package/dist/scheduler/types.d.cts +1 -1
- package/dist/scheduler/types.d.ts +1 -1
- package/dist/{schema-DLmBEgPM.d.cts → schema-CqzWi5cO.d.cts} +14 -4
- package/dist/{schema-DLmBEgPM.d.ts → schema-CqzWi5cO.d.ts} +14 -4
- package/dist/sdk/configurations/index.d.cts +2 -3
- package/dist/sdk/configurations/index.d.ts +2 -3
- package/dist/sdk/dataAppServer/index.cjs +3 -3
- package/dist/sdk/dataAppServer/index.d.cts +1 -1
- package/dist/sdk/dataAppServer/index.d.ts +1 -1
- package/dist/sdk/dataAppServer/index.js +3 -3
- package/dist/sdk/developerPortal/index.cjs +3 -3
- package/dist/sdk/developerPortal/index.cjs.map +1 -1
- package/dist/sdk/developerPortal/index.d.cts +178 -4
- package/dist/sdk/developerPortal/index.d.ts +178 -4
- package/dist/sdk/developerPortal/index.js +3 -3
- package/dist/sdk/developerPortal/index.js.map +1 -1
- package/dist/sdk/kaiMemory/index.d.cts +1 -1
- package/dist/sdk/kaiMemory/index.d.ts +1 -1
- package/dist/sdk/kaiMemory/types.d.cts +1 -1
- package/dist/sdk/kaiMemory/types.d.ts +1 -1
- package/dist/sdk/queryService/index.d.cts +1 -1
- package/dist/sdk/queryService/index.d.ts +1 -1
- package/dist/sdk/securityPolicy/index.d.cts +2 -2
- package/dist/sdk/securityPolicy/index.d.ts +2 -2
- package/dist/sdk/securityPolicy/types.d.cts +1 -1
- package/dist/sdk/securityPolicy/types.d.ts +1 -1
- package/dist/sdk/semanticLayer/index.d.cts +1 -1
- package/dist/sdk/semanticLayer/index.d.ts +1 -1
- package/dist/sdk/semanticLayer/types.d.cts +1 -1
- package/dist/sdk/semanticLayer/types.d.ts +1 -1
- package/dist/sdk/tag/index.d.cts +3 -3
- package/dist/sdk/tag/index.d.ts +3 -3
- package/dist/sdk/tag/types.d.cts +1 -1
- package/dist/sdk/tag/types.d.ts +1 -1
- package/dist/sdk/vault/index.d.cts +1 -1
- package/dist/sdk/vault/index.d.ts +1 -1
- package/dist/status/index.d.cts +1 -1
- package/dist/status/index.d.ts +1 -1
- package/dist/storage/index.cjs +5 -5
- package/dist/storage/index.d.cts +2 -3
- package/dist/storage/index.d.ts +2 -3
- package/dist/storage/index.js +3 -3
- package/dist/storage/types.d.cts +5 -5
- package/dist/storage/types.d.ts +5 -5
- package/dist/{storage-jLhVrKZh.cjs → storage-chxoWtAL.cjs} +44 -56
- package/dist/storage-chxoWtAL.cjs.map +1 -0
- package/dist/{storage-Bw-HSnPp.js → storage-o9teEKl_.js} +42 -54
- package/dist/storage-o9teEKl_.js.map +1 -0
- package/dist/{store-2OyH1XOP.cjs → store-7xlVu4qF.cjs} +3 -14
- package/dist/store-7xlVu4qF.cjs.map +1 -0
- package/dist/{store-HP0zRcLz.js → store-DDUzPeCm.js} +3 -14
- package/dist/store-DDUzPeCm.js.map +1 -0
- package/dist/stream/index.d.cts +2 -2
- package/dist/stream/index.d.ts +2 -2
- package/dist/stream/types.d.cts +1 -1
- package/dist/stream/types.d.ts +1 -1
- package/dist/syncActions/index.d.cts +2 -2
- package/dist/syncActions/index.d.ts +2 -2
- package/dist/syncActions/types.d.cts +1 -1
- package/dist/syncActions/types.d.ts +1 -1
- package/dist/telemetry/index.d.cts +2 -2
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/types.d.cts +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/{transientRetries-BORv47mH.js → transientRetries-dssygpwU.js} +2 -2
- package/dist/{transientRetries-BORv47mH.js.map → transientRetries-dssygpwU.js.map} +1 -1
- package/dist/{transientRetries-CBorl4Ue.cjs → transientRetries-yVaQgKqP.cjs} +2 -2
- package/dist/{transientRetries-CBorl4Ue.cjs.map → transientRetries-yVaQgKqP.cjs.map} +1 -1
- package/dist/{types-LOf_GCej.d.cts → types-B1kernzE.d.cts} +2 -2
- package/dist/{types-Cvbcjdgf.d.ts → types-BBmS7-IS.d.ts} +151 -4
- package/dist/{types-DaRxZt3v.d.ts → types-BJyWTgXX.d.ts} +2 -2
- package/dist/{types-CnKiVVb8.d.ts → types-BPNFTA63.d.cts} +21 -7
- package/dist/{types-BJRRAQ9R.d.cts → types-BPSExpye.d.cts} +244 -4
- package/dist/{types-Cg_66Toy.d.ts → types-BiXonOK6.d.ts} +2 -2
- package/dist/{types-CNDemlfn.d.cts → types-BimRBONo.d.cts} +3 -3
- package/dist/{types-CrXoqs8E.d.cts → types-BuEC58u3.d.cts} +2 -2
- package/dist/{types-BnkHyxdp.d.ts → types-BzHyi99r.d.cts} +5 -3
- package/dist/{types-2CMPwArl.d.ts → types-C4T_2JdN.d.cts} +40 -27
- package/dist/{types-lZRyNwOH.d.ts → types-C53aKnWt.d.ts} +2 -2
- package/dist/{types-6oLbURTK.d.cts → types-CEjgqmr2.d.cts} +2 -2
- package/dist/{types-BEEGI4aq.d.ts → types-CGtpwTJk.d.ts} +2 -2
- package/dist/{types-B_yv00AL.d.ts → types-CH1uguug.d.cts} +2 -163
- package/dist/{types-DMEl2iet.d.ts → types-CP8-CssY.d.ts} +2 -2
- package/dist/{types-DgAMVyiT.d.ts → types-CPQ6RkiZ.d.ts} +244 -4
- package/dist/{types-EdL0Eb0B.d.ts → types-CPwofeyq.d.ts} +3 -3
- package/dist/{types-CFuT8zr3.d.cts → types-CQAEOq-K.d.cts} +2 -2
- package/dist/{types-DslO1S5E.d.cts → types-CVWoP_PC.d.cts} +3 -3
- package/dist/{types-BqJycQNM.d.cts → types-CbM2MApW.d.cts} +2 -2
- package/dist/{types-BDGkMVWf.d.cts → types-CbOfT6lb.d.ts} +21 -7
- package/dist/{types-B6OG1lLf.d.cts → types-CcPpqVhm.d.cts} +2 -2
- package/dist/{types-D2J3SaoY.d.ts → types-CeqpzbBH.d.ts} +2 -2
- package/dist/{types-C_JO7FI9.d.cts → types-CjJYZaMO.d.cts} +2 -2
- package/dist/{types-D0Gqu-Xz.d.cts → types-CjP8RcFN.d.cts} +2 -2
- package/dist/{types-CUovU--e.d.ts → types-CjfsPtwk.d.ts} +2 -2
- package/dist/{types-DPFG6AAA.d.ts → types-CnSBLcZB.d.ts} +163 -3
- package/dist/{types-D4knWlwr.d.ts → types-CsXLdnfV.d.ts} +2 -2
- package/dist/{types-C3Kf_ggm.d.cts → types-CzAh5-0z.d.cts} +2 -2
- package/dist/{types-D6Fbf_y3.d.ts → types-D0F_c5KI.d.ts} +4 -4
- package/dist/{types-DykEfF2N.d.cts → types-D3L3CqKl.d.cts} +151 -4
- package/dist/{types--mz2z0Zm.d.cts → types-D4oIei5M.d.cts} +163 -3
- package/dist/{types-Cm1iOHE5.d.cts → types-D6ilG8sC.d.cts} +3 -3
- package/dist/{types-DtS7qAdz.d.cts → types-DEGkXcw2.d.ts} +5 -3
- package/dist/{types-DQguGTlM.d.cts → types-DEhAcO1Z.d.cts} +2 -2
- package/dist/{types-CuYaiy4R.d.cts → types-DaIfg9Mb.d.cts} +4 -4
- package/dist/{types-ByKSM08P.d.ts → types-DhofEmWy.d.ts} +2 -2
- package/dist/{types-B5FgsIiY.d.ts → types-Dp61pYgP.d.ts} +3 -3
- package/dist/{types-BhGr9OQ4.d.ts → types-Dteot3tT.d.ts} +757 -112
- package/dist/{types-3ZE32k8V.d.cts → types-K-JISUUI.d.cts} +757 -112
- package/dist/{types-CjqFLXVx.d.cts → types-TywAc1ow.d.ts} +40 -27
- package/dist/{types-DiXeO0yB.d.ts → types-UBpth6_9.d.ts} +2 -2
- package/dist/{types-D0BOES7q.d.cts → types-Vw-tduOH.d.ts} +2 -163
- package/dist/{types-CF5ZROX5.d.cts → types-ZyLTqgpa.d.cts} +2 -2
- package/dist/{types-BmcZyKgM.d.cts → types-aylD1zQz.d.cts} +3 -3
- package/dist/{types-CbPO9cGq.d.cts → types-fYY4q7dC.d.cts} +2 -2
- package/dist/{types-Foy0RnqF.d.ts → types-jYn3e3Du.d.ts} +3 -3
- package/dist/{types-p6UYqJo_.d.ts → types-qXqJRPHj.d.ts} +2 -2
- package/dist/{types-B452bFfS.d.ts → types-r-Qa3y8e.d.ts} +2 -2
- package/dist/{types-DhE7iY90.d.ts → types-z82j5aNW.d.ts} +3 -3
- package/dist/{collectByCursor-2-8SuJ-8.js → validateConnectionStatus-DgJwuEy9.js} +32 -22
- package/dist/validateConnectionStatus-DgJwuEy9.js.map +1 -0
- package/dist/{collectByCursor-D58__WD1.cjs → validateConnectionStatus-DpYRsU-e.cjs} +37 -21
- package/dist/validateConnectionStatus-DpYRsU-e.cjs.map +1 -0
- package/dist/vault/index.d.cts +1 -1
- package/dist/vault/index.d.ts +1 -1
- package/dist/vault/types.d.cts +1 -1
- package/dist/vault/types.d.ts +1 -1
- package/package.json +2 -2
- package/surface/apps.md +8 -3
- package/surface/auth.md +3 -2
- package/surface/chat.md +3 -3
- package/surface/dataScience.md +2 -2
- package/surface/kaiAgent.md +4 -3
- package/surface/management.md +4 -4
- package/surface/queue.md +7 -7
- package/surface/storage.md +27 -26
- package/dist/ManagementSessionMintError-BMHDcEqV.js.map +0 -1
- package/dist/ManagementSessionMintError-Bc9bc7Ai.cjs.map +0 -1
- package/dist/apps-BN7fWtSm.js.map +0 -1
- package/dist/apps-C1x5IKNQ.cjs.map +0 -1
- package/dist/authClient-B_Mb4Vzs.js.map +0 -1
- package/dist/authClient-C9QqhT2M.cjs.map +0 -1
- package/dist/collectByCursor-2-8SuJ-8.js.map +0 -1
- package/dist/collectByCursor-D58__WD1.cjs.map +0 -1
- package/dist/constants-HccvU5kx.js.map +0 -1
- package/dist/constants-V9hAyPTo.cjs.map +0 -1
- package/dist/developerPortalClient-BcK9F-Fs.cjs.map +0 -1
- package/dist/developerPortalClient-CzCJ5sE3.js.map +0 -1
- package/dist/index-C6FI_Lc7.d.ts +0 -10
- package/dist/index-CmtqbTse.d.cts +0 -10
- package/dist/kaiAgent-D0MoKqXe.js.map +0 -1
- package/dist/kaiAgent-De2T6G4G.cjs.map +0 -1
- package/dist/management-BlMQnPNS.js.map +0 -1
- package/dist/management-dIMrTTpI.cjs.map +0 -1
- package/dist/middleware-DxGv7DG8.js.map +0 -1
- package/dist/middleware-vIaPDtQI.cjs.map +0 -1
- package/dist/storage-Bw-HSnPp.js.map +0 -1
- package/dist/storage-jLhVrKZh.cjs.map +0 -1
- package/dist/store-2OyH1XOP.cjs.map +0 -1
- package/dist/store-HP0zRcLz.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["assert","createStore","createStore","createStore","clamp","finiteOr","isPlainObject","createStore","ServiceId","createTagSdk","createSemanticLayerSdk","createKaiMemorySdk","createVaultSdk","ServiceUnavailableError","createVaultClient","createDataScienceClient","createAppsClient","createEncryptionClient","createEditorClient","createSyncActionsClient","createTelemetryClient","createQueryServiceClient","createQueueClient","createChatClient","createAiClient","createOmnisearchClient","createImportClient","createKaiAgentClient","createComponentsMcpClient","createOauthClient","createSchedulerClient","createStreamClient","createNotificationsClient","createBillingClient","createMetastoreClient","KeboolaHttpHeader","createStorageClient","normalizeBaseUrl","createAuthClient","createManagementClient","Result","Result","createStore","Result","createAuthClient","isUnauthorized","dedupe","createBearerAuthMiddleware","KeboolaHttpHeader","createStorageClient","z","createStorageClient","createAuthClient","createManagementClient","normalizeBaseUrl","Result","HttpHeader","KeboolaHttpHeader","lazy","CREDENTIAL_HEADERS","REDACTED","generateUUID","redactHeaders","ApiError","isApiError","HttpStatus","ApiError","delay","KeboolaHttpHeader"],"sources":["../src/keboola/errors.ts","../src/utils/assert.ts","../src/utils/ensure.ts","../src/utils/async/coalesce.ts","../src/utils/store/derivedStore.ts","../src/utils/store/derivedAsyncStore.ts","../src/utils/async/poll/registry.ts","../src/utils/async/queueSeries.ts","../src/utils/deepMerge.ts","../src/utils/persistor/adapters.ts","../src/utils/persistor/persistor.ts","../src/serviceClientRegistry/utils.ts","../src/serviceClientRegistry/createServiceClientRegistry.ts","../src/keboola/createApi.ts","../src/keboola/createMiddlewareFor.ts","../src/keboola/legacy/createConfig.ts","../src/domain/stack.ts","../src/sdks/variables/variablesSdk.ts","../src/keboola/createSdk.ts","../src/keboola/createServiceClients.ts","../src/keboola/legacy/createProjectClients.ts","../src/keboola/legacy/keboola.ts","../src/keboola/bearer/state/auth.ts","../src/keboola/bearer/state/stacks.ts","../src/keboola/bearer/state/state.ts","../src/keboola/bearer/credentials/credentials.ts","../src/keboola/bearer/perProject.ts","../src/keboola/bearer/persistor.ts","../src/keboola/bearer/context.ts","../src/keboola/bearer/perStack.ts","../src/keboola/bearer/keboola.ts","../src/middlewares/loggingMiddleware.ts","../src/middlewares/retryMiddleware.ts","../src/middlewares/uiVersionMiddleware.ts","../src/domain/adminAccount.ts","../src/domain/branchRefs.ts"],"sourcesContent":["/**\n * The single error the keboola client / session throws. It carries a stable `type` (the switchable\n * contract) and a human-readable message derived from that type — no per-call message strings.\n */\nexport const KeboolaErrorType = {\n Unconfigured: 'unconfigured',\n NotAuthenticated: 'not-authenticated',\n SignInEnded: 'sign-in-ended',\n AlreadyAuthenticated: 'already-authenticated',\n NoStorageToken: 'no-storage-token',\n NoManagementToken: 'no-management-token',\n MissingProject: 'missing-project',\n NotBearer: 'not-bearer',\n NotReady: 'not-ready',\n InvalidBuildTransition: 'invalid-build-transition',\n} as const;\n\nexport type KeboolaErrorType = (typeof KeboolaErrorType)[keyof typeof KeboolaErrorType];\n\nconst MESSAGES: Record<KeboolaErrorType, string> = {\n [KeboolaErrorType.Unconfigured]: 'The session is not configured — set a baseUrl first.',\n [KeboolaErrorType.NotAuthenticated]: 'The session is not authenticated — sign in first.',\n [KeboolaErrorType.SignInEnded]:\n 'The sign-in this operation started under has ended — its result belongs to nobody.',\n [KeboolaErrorType.AlreadyAuthenticated]:\n 'The session is already authenticated — reset before authenticating again.',\n [KeboolaErrorType.NoStorageToken]: 'No storage token — authenticate the storage realm first.',\n [KeboolaErrorType.NoManagementToken]:\n 'No management token — authenticate the management realm first.',\n [KeboolaErrorType.MissingProject]:\n 'A bearer storage session requires a project — call setProject(projectId) first.',\n [KeboolaErrorType.NotBearer]: 'This operation requires a bearer (OAuth) session.',\n [KeboolaErrorType.NotReady]: 'The client is not ready — authenticate the storage realm first.',\n [KeboolaErrorType.InvalidBuildTransition]:\n 'Invalid storage build transition — the build goes idle → initializing → ready | failed.',\n};\n\nexport class KeboolaError extends Error {\n readonly type: KeboolaErrorType;\n\n constructor(type: KeboolaErrorType) {\n super(MESSAGES[type]);\n this.type = type;\n this.name = 'KeboolaError';\n Object.setPrototypeOf(this, KeboolaError.prototype);\n }\n}\n\nexport const isKeboolaError = (error: unknown): error is KeboolaError =>\n error instanceof KeboolaError;\n\n/** Throw a {@link KeboolaError} of `type` when `value` is null/undefined; otherwise narrow it. */\nexport function assert<T>(value: T | null | undefined, type: KeboolaErrorType): asserts value is T {\n if (value == null) throw new KeboolaError(type);\n}\n","export function assert<T>(value: T | undefined | null, message: string): asserts value is T {\n if (value == null) {\n throw new Error(message);\n }\n}\n","/**\n * Read a key, or build its value and keep it.\n *\n * `Map.prototype.getOrInsertComputed` is this natively — swap to it once it clears the app's\n * `baseline-widely-available` build target. Vite transpiles syntax, not methods, so adopting it\n * early fails in the browser rather than at build.\n */\nexport const ensure = <K, V extends NonNullable<unknown>>(\n map: Map<K, V>,\n key: K,\n build: () => V,\n): V => {\n const existing = map.get(key);\n if (existing !== undefined) return existing;\n\n const created = build();\n map.set(key, created);\n\n return created;\n};\n","import type { TaskFn } from './types';\n\n/**\n * Coalesces concurrent triggers onto a single, never-parallel run of `task`.\n *\n * - Triggers fired while a run is busy collapse into one trailing run.\n * - Each trigger resolves with the first run started after it, so it never sees stale state.\n * - The returned promise rejects with whatever `task` throws.\n */\nexport const coalesce = <T>(task: TaskFn<T>): (() => Promise<Awaited<T>>) => {\n let running = false;\n const waiters: PromiseWithResolvers<Awaited<T>>[] = [];\n\n const drain = async () => {\n running = true;\n const batch = waiters.splice(0);\n\n try {\n const result = await task();\n batch.forEach((waiter) => waiter.resolve(result));\n } catch (error) {\n batch.forEach((waiter) => waiter.reject(error));\n }\n // Tail call, so draining mid-run triggers never grows the stack.\n if (waiters.length > 0) return drain();\n running = false;\n };\n\n return () => {\n const waiter = Promise.withResolvers<Awaited<T>>();\n waiters.push(waiter);\n if (!running) void drain();\n return waiter.promise;\n };\n};\n","import { createStore, type ReadableStore } from './store';\n\nconst isPlainObjectOrArray = (value: unknown): boolean => {\n if (Array.isArray(value)) return true;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n};\n\nexport const shallowEqual = <T>(a: T, b: T): boolean => {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) return false;\n if (!isPlainObjectOrArray(a) || !isPlainObjectOrArray(b)) return false;\n const aKeys = Object.keys(a) as (keyof T)[];\n const bKeys = Object.keys(b) as (keyof T)[];\n return aKeys.length === bKeys.length && aKeys.every((key) => Object.is(a[key], b[key]));\n};\n\ntype DerivedStoreOptions<S, K, T> = {\n source: ReadableStore<S>;\n dependsOn: (state: S) => K;\n build: (key: K) => T;\n keyEquals?: (a: K, b: K) => boolean;\n};\n\nexport const createDerivedStore = <S, K, T>({\n source,\n dependsOn,\n build,\n keyEquals = shallowEqual,\n}: DerivedStoreOptions<S, K, T>): ReadableStore<T> => {\n let key = dependsOn(source.get());\n const store = createStore(build(key));\n\n // The source subscription lives for the derived store's lifetime (both normally live as long as\n // the client). `dispose()` tears down both it and the derived store, so a short-lived derived\n // store can be cleaned up without leaking the source subscription or taking stale updates.\n const unsubscribe = source.subscribe((state) => {\n const next = dependsOn(state);\n if (keyEquals(key, next)) return;\n key = next;\n store.set(build(next));\n });\n\n const get = store.get;\n\n const subscribe = store.subscribe;\n\n const dispose = () => {\n unsubscribe();\n store.dispose();\n };\n\n return { get, subscribe, dispose };\n};\n","import { shallowEqual } from './derivedStore';\nimport { createStore, type ReadableStore } from './store';\n\nexport type AsyncState<T> =\n | { state: 'idle' }\n | { state: 'pending' }\n | { state: 'ready'; value: T }\n | { state: 'errored'; error: unknown };\n\n// The terminal states `settled()` resolves with.\ntype SettledState<T> = Extract<AsyncState<T>, { state: 'ready' } | { state: 'errored' }>;\n\ntype DerivedAsyncStoreOptions<S, K, T> = {\n source: ReadableStore<S>;\n dependsOn: (state: S) => K | null;\n build: (key: K, signal: AbortSignal) => Promise<T>;\n keyEquals?: (a: K, b: K) => boolean;\n};\n\n// Async sibling of `createDerivedStore`: an `AsyncState<T>` cell for a value that arrives later.\n// - Only the latest run writes state; a re-key or `null` key aborts the previous run's `signal`.\n// - `dependsOn` returning `null` means nothing to build → `idle`.\n// - The source subscription is permanent for the store's lifetime.\n// - `settled()` resolves with the next `ready`/`errored` state (at once if terminal); never rejects.\nexport const createDerivedAsyncStore = <S, K, T>({\n source,\n dependsOn,\n build,\n keyEquals = shallowEqual,\n}: DerivedAsyncStoreOptions<S, K, T>): {\n store: ReadableStore<AsyncState<T>>;\n settled: () => Promise<SettledState<T>>;\n} => {\n const store = createStore<AsyncState<T>>({ state: 'idle' });\n let currentKey: K | null = null;\n let generation = 0;\n let controller: AbortController | null = null;\n\n const run = (key: K) => {\n controller?.abort();\n controller = new AbortController();\n const runGeneration = ++generation;\n store.set({ state: 'pending' });\n // The reject handler consumes every rejection, including a superseded run's AbortError.\n build(key, controller.signal).then(\n (value) => {\n if (runGeneration === generation) store.set({ state: 'ready', value });\n },\n (error) => {\n if (runGeneration === generation) store.set({ state: 'errored', error });\n },\n );\n };\n\n const sync = (state: S) => {\n const next = dependsOn(state);\n if (next === null) {\n if (currentKey === null) return;\n controller?.abort();\n controller = null;\n generation += 1;\n currentKey = null;\n store.set({ state: 'idle' });\n return;\n }\n if (currentKey !== null && keyEquals(currentKey, next)) return;\n currentKey = next;\n run(next);\n };\n sync(source.get());\n\n const unsubscribe = source.subscribe(sync);\n\n const get = store.get;\n\n const subscribe = store.subscribe;\n\n const dispose = () => {\n controller?.abort();\n unsubscribe();\n store.dispose();\n };\n\n const readable: ReadableStore<AsyncState<T>> = { get, subscribe, dispose };\n\n const settled = (): Promise<SettledState<T>> =>\n new Promise<SettledState<T>>((resolve) => {\n let unsubscribeSettled = () => {};\n const check = (state: AsyncState<T>) => {\n if (state.state === 'ready' || state.state === 'errored') {\n unsubscribeSettled();\n resolve(state);\n }\n };\n unsubscribeSettled = store.subscribe(check);\n check(store.get());\n });\n\n return { store: readable, settled };\n};\n","import { createStore } from '../../store';\n\nimport { emitter, type ObservedPoller, type Poller, type PollSnapshot } from './poll';\nimport { clamp, finiteOr } from './utils';\n\nconst DEFAULT_LIMIT = 50;\n\nexport type PollEntry = {\n /** Monotonic, so a list has a key that outlives a re-render. */\n key: number;\n startedAt: number;\n snapshot: PollSnapshot;\n stop: Poller<unknown>['stop'];\n start: Poller<unknown>['start'];\n};\n\nexport type PollRegistry = {\n list: () => PollEntry[];\n subscribe: (listener: () => void) => () => void;\n clear: () => void;\n stopAll: (reason?: string) => void;\n collect: () => void;\n};\n\nconst isFinished = ({ snapshot }: PollEntry) =>\n snapshot.state !== 'idle' && snapshot.state !== 'requesting' && snapshot.state !== 'polling';\n\nexport const createPollRegistry = ({ limit = DEFAULT_LIMIT } = {}): PollRegistry => {\n const entries = createStore<PollEntry[]>([]);\n const unsubscribes = new Map<number, () => void>();\n\n const maxEntries = clamp(finiteOr(limit, DEFAULT_LIMIT), 1);\n let nextKey = 1;\n\n const forget = (key: number) => {\n unsubscribes.get(key)?.();\n unsubscribes.delete(key);\n };\n\n const trim = (list: PollEntry[]) => {\n let kept = list;\n\n while (kept.length > maxEntries) {\n const dropped = kept.findLast(isFinished) ?? kept.at(-1);\n\n if (!dropped) break;\n\n forget(dropped.key);\n kept = kept.filter((entry) => entry !== dropped);\n }\n\n return kept;\n };\n\n const replace = (key: number, snapshot: PollSnapshot) =>\n entries.set(entries.get().map((entry) => (entry.key === key ? { ...entry, snapshot } : entry)));\n\n const register = (poller: ObservedPoller) => {\n const key = nextKey++;\n const entry: PollEntry = {\n key,\n startedAt: Date.now(),\n snapshot: poller.debug(),\n stop: poller.stop,\n start: poller.start,\n };\n\n unsubscribes.set(\n key,\n poller.subscribe((snapshot) => replace(key, snapshot)),\n );\n entries.set(trim([entry, ...entries.get()]));\n };\n\n const collect = () => {\n emitter.subscribe(register);\n };\n\n return {\n list: entries.get,\n collect,\n subscribe: (listener) => entries.subscribe(() => listener()),\n clear: () => {\n entries.get().forEach(({ key }) => forget(key));\n entries.set([]);\n },\n stopAll: (reason) => entries.get().forEach((entry) => entry.stop(reason)),\n };\n};\n","type Task<T> = () => T | PromiseLike<T>;\n\nconst isPromiseLike = <T>(value: T | PromiseLike<T>): value is PromiseLike<T> =>\n ((typeof value === 'object' && value !== null) || typeof value === 'function') &&\n 'then' in value &&\n typeof value.then === 'function';\n\n/**\n * Queues tasks added over time so a slower earlier task cannot finish after and overwrite a later one.\n * Each `add` returns its task's result; a rejection does not stop the remaining queue.\n */\nexport const queueSeries = () => {\n let tail: Promise<void> | null = null;\n\n const add = <T>(task: Task<T>): Promise<T> => {\n if (tail !== null) {\n const result = tail.then(task);\n tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n let value: T | PromiseLike<T>;\n try {\n value = task();\n } catch (error) {\n return Promise.reject(error);\n }\n\n if (!isPromiseLike(value)) return Promise.resolve(value);\n\n const result = Promise.resolve(value);\n tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n const onIdle = async (): Promise<void> => {\n while (tail !== null) {\n const current = tail;\n await current;\n if (tail === current) {\n tail = null;\n return;\n }\n }\n };\n\n return { add, onIdle };\n};\n","import { isPlainObject } from './isPlainObject';\n\n/**\n * Recursively merge `patch` into `base`. Plain-object values are merged key-by-key; every\n * other value (primitives, arrays, or a type mismatch between the two sides) replaces the\n * base value. `undefined` patch values are skipped, so a partial patch leaves untouched\n * fields alone. Pure — neither argument is mutated; the result preserves `base`'s type.\n */\nexport const deepMerge = <T extends Record<string, unknown>>(\n base: T,\n patch: Record<string, unknown>,\n): T => {\n const out: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n const current = out[key];\n out[key] = isPlainObject(current) && isPlainObject(value) ? deepMerge(current, value) : value;\n }\n\n return out as T;\n};\n","// Minimal key/value contract — the Web Storage shape (`localStorage`/`sessionStorage`) narrowed to\n// what a persistor needs. Framework- and environment-agnostic; a method may answer with a promise.\nexport type StorageAdapter = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n removeItem: (key: string) => void | Promise<void>;\n withLock?: <T>(name: string, task: () => Promise<T>) => Promise<T>;\n};\n\n// Persist nowhere: reads always miss, writes are dropped. The default when no storage is configured,\n// so a persistor is always constructable and simply becomes a no-op.\nexport const createNullStorage = (): StorageAdapter => ({\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n});\n\n// In-process Map, living for the lifetime of the process. The Node default and the fallback the\n// Web Storage adapters degrade to when `localStorage`/`sessionStorage` is unavailable (SSR).\nexport const createMemoryStorage = (): StorageAdapter => {\n const store = new Map<string, string>();\n return {\n getItem: (key) => store.get(key) ?? null,\n setItem: (key, value) => {\n store.set(key, value);\n },\n removeItem: (key) => {\n store.delete(key);\n },\n };\n};\n\n// Wrap a Web Storage instance, degrading to memory when it is absent OR unusable. Merely accessing\n// the global (sandboxed iframe) or calling its methods (privacy mode, disabled/blocked storage) can\n// throw, so a canary write probes real usability at construction; any failure falls back to an\n// in-memory store so persistence never crashes the caller. Resolution happens when the factory is\n// called (not at import), so importing this module never touches browser globals.\nconst createWebStorage = (pick: () => Storage | null): StorageAdapter => {\n let web: Storage | null = null;\n try {\n web = pick();\n if (web) {\n const probe = '__keboola_storage_probe__';\n web.setItem(probe, probe);\n web.removeItem(probe);\n }\n } catch (err) {\n console.warn('createWebStorage: web storage unavailable, falling back to memory', err);\n web = null;\n }\n if (!web) return createMemoryStorage();\n\n const storage = web;\n return {\n getItem: (key) => storage.getItem(key),\n setItem: (key, value) => {\n storage.setItem(key, value);\n },\n removeItem: (key) => {\n storage.removeItem(key);\n },\n withLock: async <T>(name: string, task: () => Promise<T>): Promise<T> => {\n if (typeof navigator === 'undefined' || !('locks' in navigator)) return task();\n return navigator.locks.request(`keboola:${name}`, { mode: 'exclusive' }, task);\n },\n };\n};\n\nexport const createLocalStorage = (): StorageAdapter =>\n createWebStorage(() => ('localStorage' in globalThis ? globalThis.localStorage : null));\n\nexport const createSessionStorage = (): StorageAdapter =>\n createWebStorage(() => ('sessionStorage' in globalThis ? globalThis.sessionStorage : null));\n","import { queueSeries } from '../async';\n\nimport { createNullStorage, type StorageAdapter } from './adapters';\n\n// Structural so this package needs no zod dependency; any schema with `safeParse` fits.\ntype Schema<T> = {\n safeParse: (value: unknown) => { success: true; data: T } | { success: false };\n};\n\nexport type Cell<T> = {\n /**\n * The stored value, `defaultValue` when empty or corrupt. Rejects when the adapter cannot be read:\n * unreadable is not empty, and a caller taking it for empty would write over what is there.\n */\n read: () => Promise<T>;\n write: (value: T) => Promise<void>;\n /** Read, change and write as one step: no other write lands between the read and the write. */\n modify: (change: (current: T) => T) => Promise<void>;\n remove: () => Promise<void>;\n};\n\nexport type Persistor<T> = Cell<T> & {\n // The verbs with the adapter's lock for this key held across `task`; a lock, not a rollback.\n // Not reentrant: pass the cell down rather than nesting. Runs directly without an adapter lock.\n locked: <R>(task: (cell: Cell<T>) => Promise<R>) => Promise<R>;\n};\n\ntype PersistorOptions<T> = {\n storage?: StorageAdapter;\n key: string;\n schema: Schema<T>;\n defaultValue: T;\n encode?: (value: T) => string;\n decode?: (raw: string) => unknown;\n};\n\n// A durable cell over a `StorageAdapter`: one key, encoded on write, validated on read.\n// - Writes run in call order and each resolves once its own write has landed; a failed write\n// rejects and the ones after it still run. `read` waits for every write already queued.\n// - Give schema fields `.default(...)` to patch partial blobs instead of discarding them.\nexport const createPersistor = <T>({\n storage = createNullStorage(),\n key,\n schema,\n defaultValue,\n encode = JSON.stringify,\n decode = JSON.parse,\n}: PersistorOptions<T>): Persistor<T> => {\n const writes = queueSeries();\n\n const _load = async () => {\n const raw = await storage.getItem(key);\n if (raw === null) return { value: defaultValue, corrupt: false };\n\n let decoded: unknown;\n try {\n decoded = decode(raw);\n } catch (err) {\n console.warn(`createPersistor: failed to decode \"${key}\"`, err);\n return { value: defaultValue, corrupt: true };\n }\n\n const parsed = schema.safeParse(decoded);\n return parsed.success\n ? { value: parsed.data, corrupt: false }\n : { value: defaultValue, corrupt: true };\n };\n\n const remove = () => writes.add(() => storage.removeItem(key));\n const write = (value: T) => writes.add(() => storage.setItem(key, encode(value)));\n\n const read = async (): Promise<T> => {\n await writes.onIdle();\n const parsed = await _load();\n if (parsed.corrupt) {\n remove().catch((err: unknown) => {\n console.warn(`createPersistor: failed to drop the corrupt \"${key}\"`, err);\n });\n }\n return parsed.value;\n };\n const modify = (change: (current: T) => T) =>\n writes.add(async () => {\n const parsed = await _load();\n const next = change(parsed.value);\n await storage.setItem(key, encode(next));\n });\n\n const cell: Cell<T> = { read, write, modify, remove };\n\n const locked = <R>(task: (cell: Cell<T>) => Promise<R>): Promise<R> =>\n storage.withLock ? storage.withLock(key, () => task(cell)) : task(cell);\n\n return { ...cell, locked };\n};\n","export const isBuiltInProperty = (property: string | symbol) =>\n typeof property === 'symbol' ||\n property === 'then' ||\n property === 'constructor' ||\n property === 'toString' ||\n property === 'valueOf';\n\n/**\n * Creates a dummy client that intercepts method calls and invokes the provided onCall callback.\n */\nexport const createDummyClient = <T extends Record<string, unknown>>({\n onCall,\n}: {\n onCall: (path: string[], args: unknown[]) => void;\n}): T => {\n const createProxy = (path: string[] = []) =>\n new Proxy(() => {}, {\n // Create a new proxy for nested property access\n get: (_target, prop) => {\n // Don't intercept Symbol properties or special methods\n if (isBuiltInProperty(prop)) return undefined;\n return createProxy([...path, prop]);\n },\n // When called as a function, invoke the interceptor\n apply: (_target, _thisArgs, args) => onCall(path, args),\n });\n\n return createProxy() as unknown as T;\n};\n","import { createDummyClient } from './utils';\n\ntype OnUnavailableFn = (info: {\n serviceId: string;\n path: string[];\n args: unknown[];\n clientName: string;\n}) => void;\n\n/**\n * A service's base URL, or a resolver for one that is not known yet — the stack index it comes from\n * may still be in flight. Declared here rather than taken from `fetchClient`, so the registry stays\n * independent of the transport its clients happen to use.\n */\nexport type ServiceUrl = string | (() => Promise<string>);\n\ntype ClientConfig<ServiceId extends string, ClientName extends string> = {\n serviceId: ServiceId;\n clientName: ClientName;\n clientFn: (serviceUrl: ServiceUrl) => unknown;\n};\n\ntype ClientMeta<ServiceId extends string> = {\n clientName: string;\n serviceId: ServiceId;\n isAvailable: boolean;\n};\n\ntype Options<ServiceId extends string> = {\n getServiceBaseUrl: (serviceId: ServiceId) => ServiceUrl | null;\n onUnavailable?: OnUnavailableFn;\n};\n\ntype BuildResult<\n ServiceId extends string,\n ClientName extends string,\n Configs extends ClientConfig<ServiceId, ClientName>[],\n> = {\n client: {\n [Config in Configs[number] as Config['clientName']]: ReturnType<Config['clientFn']>;\n };\n meta: ClientMeta<ServiceId>[];\n};\n\ntype Registry<\n ServiceId extends string,\n ClientName extends string,\n Configs extends ClientConfig<ServiceId, ClientName>[],\n> = {\n add: <const Config extends ClientConfig<ServiceId, ClientName>>(\n config: Config,\n ) => Registry<ServiceId, ClientName, [...Configs, Config]>;\n build: () => BuildResult<ServiceId, ClientName, Configs>;\n};\n\nexport const createServiceClientRegistry =\n <ServiceId extends string, ClientName extends string = string>() =>\n ({\n getServiceBaseUrl,\n onUnavailable,\n }: Options<ServiceId>): Registry<ServiceId, ClientName, []> => {\n const dummy = (serviceId: string, clientName: string) =>\n createDummyClient({\n onCall: (path, args) => {\n onUnavailable?.({\n serviceId,\n path,\n args,\n clientName,\n });\n },\n });\n\n const configs: ClientConfig<ServiceId, ClientName>[] = [];\n\n const resolveClient = ({\n serviceId,\n clientFn,\n clientName,\n }: ClientConfig<ServiceId, ClientName>) => {\n const serviceBaseUrl = getServiceBaseUrl(serviceId);\n return serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);\n };\n\n type AnyConfig = ClientConfig<ServiceId, ClientName>;\n const registry: Registry<ServiceId, ClientName, AnyConfig[]> = {\n add: (config) => {\n configs.push(config);\n return registry;\n },\n build: () => {\n const clientMap: Record<string, unknown> = {};\n const clientMeta: ClientMeta<ServiceId>[] = [];\n\n configs.forEach((config) => {\n clientMap[config.clientName] = resolveClient(config);\n clientMeta.push({\n clientName: config.clientName,\n serviceId: config.serviceId,\n isAvailable: !!getServiceBaseUrl(config.serviceId),\n });\n });\n\n // The dynamically-built map can't be statically proven against the\n // per-config mapped type; the public key safety comes from the fluent\n // `add` chain asserted at the bottom of this factory.\n return {\n client: clientMap,\n meta: clientMeta,\n } as BuildResult<ServiceId, ClientName, AnyConfig[]>;\n },\n };\n\n return registry as Registry<ServiceId, ClientName, []>;\n };\n","import type { createAuthClient } from '../clients/auth/authClient';\nimport type { createManagementClient } from '../clients/management';\nimport { isBuiltInProperty } from '../serviceClientRegistry';\n\nimport type { createProjectClients } from './legacy/createProjectClients';\nimport { assert, KeboolaErrorType } from './errors';\n\ntype AuthClient = ReturnType<typeof createAuthClient>;\ntype ManagementClient = ReturnType<typeof createManagementClient>;\n\n/**\n * Everything on a `ProjectApi` except `auth` and `management` — its project-scoped half.\n *\n * - Holds no credential; the token and its refresh loop live on the session that built it.\n */\nexport type ProjectClients = Awaited<ReturnType<typeof createProjectClients>>;\n\n/** One stack: what is there before a project — signing in, the account, the project list. */\nexport type StackApi = Pick<ProjectClients, 'baseUrl' | 'stack'> & {\n auth: AuthClient;\n management: ManagementClient;\n};\n\n/** One project, on its stack: every namespace. */\nexport type ProjectApi = ProjectClients & StackApi;\n\ntype ApiState = {\n getAuthClient: () => AuthClient | null;\n getManagementClient: () => ManagementClient | null;\n getProjectClients: () => ProjectClients | null;\n};\n\nexport const createApi = (state: ApiState) =>\n new Proxy({} as ProjectApi, {\n get(_target, property) {\n if (isBuiltInProperty(property)) return undefined;\n\n if (property === 'auth') {\n const authClient = state.getAuthClient();\n assert(authClient, KeboolaErrorType.Unconfigured);\n return authClient;\n }\n\n if (property === 'management') {\n const management = state.getManagementClient();\n assert(management, KeboolaErrorType.NoManagementToken);\n return management;\n }\n\n const clients = state.getProjectClients();\n assert(clients, KeboolaErrorType.NotReady);\n\n return clients[property as keyof ProjectClients];\n },\n });\n","import type { MiddlewareFn } from '../fetchClient';\n\n/**\n * Service clients reached through the registry — the key is the `clientName`\n * the user accesses them by (e.g. `api.dataScience`), not the `serviceId`.\n */\nexport type ServiceClientName =\n | 'vault'\n | 'dataScience'\n | 'apps'\n | 'encryption'\n | 'editor'\n | 'syncActions'\n | 'telemetry'\n | 'queryService'\n | 'queue'\n | 'chat'\n | 'ai'\n | 'import'\n | 'kaiAgent'\n | 'componentsMcp'\n | 'oauth'\n | 'omnisearch'\n | 'stream'\n | 'notifications'\n | 'scheduler'\n | 'metastore'\n | 'billing';\n\n/** Clients instantiated directly (not stack-discovered), keyed by their property name. */\ntype NonServiceClientName = 'storage' | 'management' | 'auth';\n\nexport type MiddlewareTarget = ServiceClientName | NonServiceClientName;\n\nexport type Middlewares =\n | MiddlewareFn[]\n | ({ all?: MiddlewareFn[] } & Partial<Record<MiddlewareTarget, MiddlewareFn[]>>);\n\nexport const createMiddlewareFor = (middlewares: Middlewares | undefined) => {\n return (target: MiddlewareTarget, baseline: MiddlewareFn[] = []): MiddlewareFn[] => {\n if (Array.isArray(middlewares)) return [...baseline, ...middlewares];\n\n const all = middlewares?.all ?? [];\n const targeted = middlewares?.[target] ?? [];\n return [...baseline, ...all, ...targeted];\n };\n};\n\nexport type MiddlewareFor = ReturnType<typeof createMiddlewareFor>;\n","import { createStore } from '../../utils';\n\nexport type State = {\n baseUrl: string | null;\n sapiToken: string | null;\n managementToken: string | null;\n};\n\n// The legacy config is a plain observable state store: the host injects the baseUrl and tokens, and\n// consumers derive their clients from `store` (see `keboola.ts`). No lifecycle events — the derived\n// stores react to state changes directly.\nexport const createConfig = () => {\n const store = createStore<State>({ baseUrl: null, sapiToken: null, managementToken: null });\n\n const setBaseUrl = (baseUrl: string) => {\n store.set({ ...store.get(), baseUrl });\n };\n\n const authenticate = (tokens: { sapiToken?: string; managementToken?: string }) => {\n const current = store.get();\n store.set({\n ...current,\n sapiToken: tokens.sapiToken ?? current.sapiToken,\n managementToken: tokens.managementToken ?? current.managementToken,\n });\n };\n\n // SAPI token accessors over the config store — the single source of truth. The storage build reads\n // `getStorageToken` on every request; in-band rotations write back via `setStorageToken`, which\n // surfaces to observers as an ordinary store change.\n const getStorageToken = () => store.get().sapiToken ?? '';\n const setStorageToken = (sapiToken: string) => store.set({ ...store.get(), sapiToken });\n\n /** Current state, for diagnostics. */\n const debug = (): State => store.get();\n\n return { store, setBaseUrl, authenticate, getStorageToken, setStorageToken, debug };\n};\n","import type { StackInfo } from '../clients/storage/types';\nimport { ServiceId } from '../constants/serviceIds';\n\nexport type ServiceUrls = Partial<Record<ServiceId, (url: string) => string | undefined | null>>;\n\nconst isServiceId = (id: string): id is ServiceId => Object.values<string>(ServiceId).includes(id);\n\nconst SERVICE_URL_OVERRIDES: ServiceUrls = {\n // The advertised Kai Assistant URL lacks the `/api` suffix.\n 'kai-assistant': (url) => `${url}/api`,\n};\n\ntype Options = {\n stackInfo: StackInfo;\n clientServiceUrls?: ServiceUrls;\n};\n\nexport type Stack = ReturnType<typeof createStack>;\n\nexport const createStack = ({ stackInfo, clientServiceUrls }: Options) => {\n const { services, components, features, ...infoRest } = stackInfo;\n\n const serviceMap = new Map(\n services.map((service) => {\n if (!isServiceId(service.id)) return [service.id, service.url];\n const devOverride = clientServiceUrls?.[service.id]?.(service.url);\n const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);\n const url = devOverride ?? prodOverride ?? service.url;\n return [service.id, url];\n }),\n );\n\n const componentMap = new Map(components.map((component) => [component.id, component]));\n const featureSet = new Set(features);\n\n const hasFeature = (...feature: string[]) => {\n if (feature.length === 0) return false;\n return feature.every((x) => featureSet.has(x));\n };\n\n const hasComponent = (...componentId: string[]) => {\n if (componentId.length === 0) return false;\n return componentId.every((x) => componentMap.has(x));\n };\n\n const getComponent = (componentId: string) => componentMap.get(componentId) ?? null;\n\n const hasService = (serviceId: ServiceId) => serviceMap.has(serviceId);\n\n const getServiceUrl = (serviceId: ServiceId) => serviceMap.get(serviceId) ?? null;\n\n return {\n ...infoRest,\n services,\n features,\n components,\n hasFeature,\n getServiceUrl,\n hasService,\n getComponent,\n hasComponent,\n };\n};\n","import type * as storage from '../../clients/storage';\n\nconst VARIABLES_COMPONENT_ID = 'keboola.variables';\n\n// The storage client takes the branch as the string the spec declares.\ntype BranchId = string;\n\ntype VariableDefinition = { name: string; type?: string };\ntype VariableValue = { name: string; value?: unknown };\n\n/** Reference to a `keboola.variables` config + the values row a config points at. */\ntype VariablesRef = { variablesId: string; variablesValuesId: string };\n\ntype Options = {\n storageClient: ReturnType<typeof storage.createStorageClient>;\n};\n\n/** Union the definitions by name; on a name conflict the target's definition is kept. */\nexport const mergeVariableDefinitions = (\n target: VariableDefinition[],\n source: VariableDefinition[],\n): VariableDefinition[] => {\n const targetNames = new Set(target.map((definition) => definition.name));\n\n return [...target, ...source.filter((definition) => !targetNames.has(definition.name))];\n};\n\n/** Add values missing in the target; on a name conflict the value is updated to the source's. */\nexport const mergeVariableValues = (\n target: VariableValue[],\n source: VariableValue[],\n): VariableValue[] => {\n const sourceByName = new Map(source.map((value) => [value.name, value.value]));\n const targetNames = new Set(target.map((value) => value.name));\n\n return [\n ...target.map((value) =>\n sourceByName.has(value.name) ? { ...value, value: sourceByName.get(value.name) } : value,\n ),\n ...source.filter((value) => !targetNames.has(value.name)),\n ];\n};\n\n/**\n * Orchestration for `keboola.variables` configs: copy a config, or merge two configs into a fresh\n * one (union definitions, upsert values — source wins on a name conflict). Each result is a brand\n * new config + values row, so the caller can reference it without sharing lineage with the source.\n */\nexport const createVariablesSdk = ({ storageClient }: Options) => {\n const configs = storageClient.configurations;\n const rows = storageClient.configurationRows;\n\n const readVariables = async (\n configId: string,\n valuesRowId: string | undefined,\n branchId: BranchId,\n ) => {\n const config = await configs.getConfiguration({\n componentId: VARIABLES_COMPONENT_ID,\n configId,\n branchId,\n });\n // variables configs carry a single values row — read the referenced one, or the only one\n const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];\n\n const rawDefinitions = config.configuration?.variables;\n const rawValues = row?.configuration?.values;\n\n // guard the array shape — a non-array from Storage would throw in the merge helpers' .map()\n return {\n definitions: (Array.isArray(rawDefinitions) ? rawDefinitions : []) as VariableDefinition[],\n values: (Array.isArray(rawValues) ? rawValues : []) as VariableValue[],\n };\n };\n\n const createVariables = async (\n definitions: VariableDefinition[],\n values: VariableValue[],\n branchId: BranchId,\n ): Promise<VariablesRef> => {\n const config = await configs.createConfiguration({\n branchId,\n componentId: VARIABLES_COMPONENT_ID,\n name: 'Variables definition',\n configuration: { variables: definitions },\n });\n\n try {\n const row = await rows.createConfigurationRow({\n branchId: String(branchId),\n componentId: VARIABLES_COMPONENT_ID,\n configurationId: config.id,\n name: 'Default values',\n configuration: { values },\n });\n\n return { variablesId: config.id, variablesValuesId: row.id };\n } catch (error) {\n // the values row failed — best-effort drop the orphaned config, but always surface the original error\n await configs\n .deleteConfiguration({\n branchId,\n componentId: VARIABLES_COMPONENT_ID,\n configId: config.id,\n })\n .catch((cleanupError: unknown) => {\n // keep the cleanup failure on the original error rather than letting it mask the real cause\n if (error instanceof Error && error.cause === undefined) {\n error.cause = cleanupError;\n }\n });\n throw error;\n }\n };\n\n return {\n /** Copy a variables config into a fresh, independent config + values row. */\n copy: async ({\n variablesId,\n variablesValuesId,\n branchId = 'default',\n }: {\n variablesId: string;\n variablesValuesId?: string;\n branchId?: BranchId;\n }): Promise<VariablesRef> => {\n const { definitions, values } = await readVariables(variablesId, variablesValuesId, branchId);\n\n return createVariables(definitions, values, branchId);\n },\n\n /** Merge the source's variables into the target's and create a fresh merged config + values row. */\n merge: async ({\n targetVariablesId,\n targetValuesId,\n sourceVariablesId,\n sourceValuesId,\n branchId = 'default',\n }: {\n targetVariablesId: string;\n targetValuesId?: string;\n sourceVariablesId: string;\n sourceValuesId?: string;\n branchId?: BranchId;\n }): Promise<VariablesRef> => {\n const [target, source] = await Promise.all([\n readVariables(targetVariablesId, targetValuesId, branchId),\n readVariables(sourceVariablesId, sourceValuesId, branchId),\n ]);\n\n return createVariables(\n mergeVariableDefinitions(target.definitions, source.definitions),\n mergeVariableValues(target.values, source.values),\n branchId,\n );\n },\n };\n};\n","import type { createStorageClient } from '../clients/storage';\nimport { createKaiMemorySdk } from '../sdks/kaiMemory';\nimport { createSemanticLayerSdk } from '../sdks/semanticLayer';\nimport { createTagSdk } from '../sdks/tag';\nimport { createVariablesSdk } from '../sdks/variables';\nimport { createVaultSdk } from '../sdks/vault';\n\nimport type { createServiceClients } from './createServiceClients';\n\ntype Options = {\n storage: ReturnType<typeof createStorageClient>;\n services: ReturnType<typeof createServiceClients>['client'];\n};\n\nexport const createSdk = ({ storage, services }: Options) => ({\n tag: createTagSdk({ metastoreClient: services.metastore }),\n semanticLayer: createSemanticLayerSdk({ metastoreClient: services.metastore }),\n kaiMemory: createKaiMemorySdk({ metastoreClient: services.metastore }),\n vault: createVaultSdk({ vaultClient: services.vault, encryptionClient: services.encryption }),\n variables: createVariablesSdk({ storageClient: storage }),\n});\n","import { createAiClient } from '../clients/ai';\nimport { createAppsClient } from '../clients/apps';\nimport type { AuthStrategy } from '../clients/auth';\nimport { createBillingClient } from '../clients/billing';\nimport { createChatClient } from '../clients/chat';\nimport { createComponentsMcpClient } from '../clients/componentsMcp';\nimport { createDataScienceClient } from '../clients/dataScience';\nimport { createEditorClient } from '../clients/editor';\nimport { createEncryptionClient } from '../clients/encryption';\nimport { createImportClient } from '../clients/import';\nimport { createKaiAgentClient } from '../clients/kaiAgent';\nimport { createMetastoreClient } from '../clients/metastore';\nimport { createNotificationsClient } from '../clients/notifications';\nimport { createOauthClient } from '../clients/oauth';\nimport { createOmnisearchClient } from '../clients/omnisearch';\nimport { createQueryServiceClient } from '../clients/queryService';\nimport { createQueueClient } from '../clients/queue';\nimport { createSchedulerClient } from '../clients/scheduler';\nimport type { ServiceId } from '../clients/storage/types';\nimport { createStreamClient } from '../clients/stream';\nimport { createSyncActionsClient } from '../clients/syncActions';\nimport { createTelemetryClient } from '../clients/telemetry';\nimport { createVaultClient } from '../clients/vault';\nimport { ServiceUnavailableError } from '../errors';\nimport type { MiddlewareFn } from '../fetchClient';\nimport { createServiceClientRegistry, type ServiceUrl } from '../serviceClientRegistry';\n\nimport { type MiddlewareFor, type ServiceClientName } from './createMiddlewareFor';\n\ntype Options = {\n baseUrl: string;\n auth: AuthStrategy;\n getServiceBaseUrl: (serviceId: ServiceId) => ServiceUrl | null;\n middlewareFor: MiddlewareFor;\n attachTokenMiddleware: MiddlewareFn;\n};\n\n// A service whose URL is still being resolved cannot have a path appended to it as a string.\nconst withPath = (serviceBaseUrl: ServiceUrl, path: string): ServiceUrl =>\n typeof serviceBaseUrl === 'string'\n ? `${serviceBaseUrl}${path}`\n : async () => `${await serviceBaseUrl()}${path}`;\n\nexport const createServiceClients = ({\n baseUrl,\n auth,\n getServiceBaseUrl,\n middlewareFor,\n attachTokenMiddleware,\n}: Options) =>\n createServiceClientRegistry<ServiceId, ServiceClientName>()({\n getServiceBaseUrl,\n onUnavailable: ({ serviceId, path, clientName }) => {\n throw new ServiceUnavailableError(serviceId, path, clientName);\n },\n })\n .add({\n serviceId: 'vault',\n clientName: 'vault',\n clientFn: (serviceBaseUrl) =>\n createVaultClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('vault', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'data-science',\n clientName: 'dataScience',\n clientFn: (serviceBaseUrl) =>\n createDataScienceClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('dataScience', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n // `/v2` App Deployments live on the sandboxes deployment; the `apps.<stack>` host is absent\n // from the service index. At a third prefixed client, give `.add()` a `pathPrefix`.\n serviceId: 'data-science',\n clientName: 'apps',\n clientFn: (serviceBaseUrl) =>\n createAppsClient({\n baseUrl: withPath(serviceBaseUrl, '/v2'),\n middlewares: middlewareFor('apps', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'encryption',\n clientName: 'encryption',\n clientFn: (serviceBaseUrl) =>\n createEncryptionClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('encryption'),\n }),\n })\n .add({\n serviceId: 'editor',\n clientName: 'editor',\n clientFn: (serviceBaseUrl) =>\n createEditorClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('editor', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'sync-actions',\n clientName: 'syncActions',\n clientFn: (serviceBaseUrl) =>\n createSyncActionsClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('syncActions', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'telemetry',\n clientName: 'telemetry',\n clientFn: (serviceBaseUrl) =>\n createTelemetryClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('telemetry', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'query',\n clientName: 'queryService',\n clientFn: (serviceBaseUrl) =>\n createQueryServiceClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('queryService', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'queue',\n clientName: 'queue',\n clientFn: (serviceBaseUrl) =>\n createQueueClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('queue', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'kai-assistant',\n clientName: 'chat',\n clientFn: (serviceBaseUrl) =>\n createChatClient({\n storageApiUrl: baseUrl,\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('chat', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'ai',\n clientName: 'ai',\n clientFn: (serviceBaseUrl) =>\n createAiClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('ai', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n // The ai-service ingress exposes omnisearch under `/omnisearch`, like the `kai-assistant`\n // `/api` override in `domain/stack.ts`.\n serviceId: 'ai',\n clientName: 'omnisearch',\n clientFn: (serviceBaseUrl) =>\n createOmnisearchClient({\n baseUrl: withPath(serviceBaseUrl, '/omnisearch'),\n middlewares: middlewareFor('omnisearch', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'import',\n clientName: 'import',\n clientFn: (serviceBaseUrl) =>\n createImportClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('import', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'kai-agent',\n clientName: 'kaiAgent',\n clientFn: (serviceBaseUrl) =>\n createKaiAgentClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('kaiAgent', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'components-mcp',\n clientName: 'componentsMcp',\n clientFn: (serviceBaseUrl) =>\n createComponentsMcpClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('componentsMcp', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'oauth',\n clientName: 'oauth',\n clientFn: (serviceBaseUrl) =>\n createOauthClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('oauth', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'scheduler',\n clientName: 'scheduler',\n clientFn: (serviceBaseUrl) =>\n createSchedulerClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('scheduler', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'stream',\n clientName: 'stream',\n clientFn: (serviceBaseUrl) =>\n createStreamClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('stream', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'notification',\n clientName: 'notifications',\n clientFn: (serviceBaseUrl) =>\n createNotificationsClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('notifications', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'billing',\n clientName: 'billing',\n clientFn: (serviceBaseUrl) =>\n createBillingClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('billing', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'metastore',\n clientName: 'metastore',\n clientFn: (serviceBaseUrl) =>\n createMetastoreClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('metastore', [attachTokenMiddleware]),\n auth,\n }),\n })\n .build();\n","import type { AuthStrategy } from '../../clients/auth';\nimport { createStorageClient } from '../../clients/storage';\nimport { createStack, type ServiceUrls } from '../../domain/stack';\nimport { type MiddlewareFn, normalizeBaseUrl } from '../../fetchClient';\nimport { KeboolaHttpHeader } from '../../internal';\nimport { type MiddlewareFor } from '../createMiddlewareFor';\nimport { createSdk } from '../createSdk';\nimport { createServiceClients } from '../createServiceClients';\n\nconst createAttachStorageToken =\n (getToken: () => string): MiddlewareFn =>\n (next) =>\n (request) => {\n request.request.headers.set(KeboolaHttpHeader.STORAGE_API_TOKEN, getToken());\n return next(request);\n };\n\ntype Options = {\n baseUrl: string;\n getStorageToken: () => string;\n onStorageTokenRefreshed: (token: string) => void;\n middlewareFor: MiddlewareFor;\n clientServiceUrls?: ServiceUrls;\n};\n\nexport const createProjectClients = async ({\n baseUrl,\n getStorageToken,\n onStorageTokenRefreshed,\n middlewareFor,\n clientServiceUrls,\n}: Options) => {\n const auth: AuthStrategy = { type: 'sapi-token', token: getStorageToken() };\n const attach = createAttachStorageToken(getStorageToken);\n\n // The stack index is public: the token is sent, but nothing here verifies it.\n const stackInfo = await createStorageClient({\n baseUrl,\n auth,\n middlewares: [attach],\n }).getStackInfo({ exclude: 'componentDetails' });\n\n const stack = createStack({ stackInfo, clientServiceUrls });\n\n // Static storage-token header + in-band refresh (onRefreshToken rotates the shared liveToken store).\n const storage = createStorageClient({\n baseUrl,\n auth,\n middlewares: middlewareFor('storage', []),\n onRefreshToken: onStorageTokenRefreshed,\n });\n\n const { client: services, meta: serviceMeta } = createServiceClients({\n baseUrl,\n auth,\n getServiceBaseUrl: stack.getServiceUrl,\n middlewareFor,\n attachTokenMiddleware: attach,\n });\n\n return {\n // Canonical: a trailing slash the caller passed is stripped, so `${baseUrl}/manage/...` is safe.\n baseUrl: normalizeBaseUrl(baseUrl),\n stack,\n serviceMeta,\n storage,\n ...services,\n sdk: createSdk({ storage, services }),\n };\n};\n","import { createAuthClient } from '../../clients/auth/authClient';\nimport { createManagementClient } from '../../clients/management';\nimport { createDerivedAsyncStore, createDerivedStore } from '../../utils';\nimport { createApi } from '../createApi';\nimport { createMiddlewareFor } from '../createMiddlewareFor';\nimport type { LegacyKeboolaOptions } from '../types';\n\nimport { createConfig, type State } from './createConfig';\nimport { createProjectClients } from './createProjectClients';\nimport type { SessionSnapshot } from './types';\n\ntype ProjectClients = Awaited<ReturnType<typeof createProjectClients>>;\n\nexport const createLegacyKeboola = (options: LegacyKeboolaOptions = {}) => {\n const config = createConfig();\n const middlewareFor = createMiddlewareFor(options.middlewares);\n\n // The clients are derived from config state: each rebuilds only when the slice it depends on\n // changes. auth needs a baseUrl; management builds token-less up front and upgrades once a manage\n // token lands; storage builds once the SAPI token arrives (a later in-band rotation keeps the same\n // baseUrl key, so it does not rebuild).\n const authClient = createDerivedStore({\n source: config.store,\n dependsOn: (state) => state.baseUrl,\n build: (baseUrl) =>\n baseUrl ? createAuthClient({ baseUrl, middlewares: middlewareFor('auth', []) }) : null,\n });\n\n const management = createDerivedStore({\n source: config.store,\n dependsOn: (state) => ({ baseUrl: state.baseUrl, token: state.managementToken }),\n build: ({ baseUrl, token }) =>\n baseUrl\n ? createManagementClient({\n baseUrl,\n auth: token ? { type: 'management-token', token } : { type: 'management-token' },\n middlewares: middlewareFor('management', []),\n })\n : null,\n });\n\n const build = createDerivedAsyncStore<State, string, ProjectClients>({\n source: config.store,\n dependsOn: (state) => (state.sapiToken && state.baseUrl ? state.baseUrl : null),\n build: (baseUrl) =>\n createProjectClients({\n baseUrl,\n getStorageToken: config.getStorageToken,\n onStorageTokenRefreshed: config.setStorageToken,\n middlewareFor,\n clientServiceUrls: options.clientServiceUrls,\n }),\n });\n\n if (options.baseUrl) config.setBaseUrl(options.baseUrl);\n\n const debug = (): SessionSnapshot => {\n const info = config.debug();\n return {\n type: 'Sapi',\n config: info,\n authReady: authClient.get() !== null,\n managementReady: !!info.managementToken,\n storage: build.store.get().state,\n };\n };\n\n const session = {\n setBaseUrl: config.setBaseUrl,\n isStorageReady: () => build.store.get().state === 'ready',\n authenticateStorage: (sapiToken: string) => config.authenticate({ sapiToken }),\n authenticateStorageAsync: async (sapiToken: string) => {\n config.authenticate({ sapiToken });\n // `authenticate` mutates synchronously, so the build is already pending; `settled` awaits it.\n await build.settled();\n },\n authenticateManagement: (managementToken: string) => config.authenticate({ managementToken }),\n subscribe: (listener: (snapshot: SessionSnapshot) => void) => {\n // Fire on both config mutations and storage-build transitions, so `ready` is observable.\n const unsubscribeConfig = config.store.subscribe(() => listener(debug()));\n const unsubscribeBuild = build.store.subscribe(() => listener(debug()));\n return () => {\n unsubscribeConfig();\n unsubscribeBuild();\n };\n },\n debug,\n };\n\n const api = createApi({\n getAuthClient: () => authClient.get(),\n getManagementClient: () => management.get(),\n getProjectClients: () => {\n const state = build.store.get();\n return state.state === 'ready' ? state.value : null;\n },\n });\n\n return { api, session };\n};\n","import { Result } from '../../../utils';\nimport { KeboolaError, KeboolaErrorType } from '../../errors';\n\nimport type { Stacks } from './stacks';\nimport type { Auth, BaseUrl, Credential, CredentialInput, Grant, Retained } from './types';\n\nexport type SignOutOptions = {\n /** Keep the grant on the stack for `restoreRetained`; the sign-in still ends. */\n retain?: boolean;\n};\n\n// The part that renews the credential; the access token is never carried over.\nexport const grantOf = (credential: Credential): Grant =>\n credential.type === 'token'\n ? { type: 'token', refreshToken: credential.refreshToken }\n : { type: 'cookie', sessionId: credential.sessionId };\n\n// Stamps the issue time the credential's lifetime is measured from.\nconst stamped = (input: CredentialInput): Credential => ({ ...input, issuedAt: Date.now() });\n\nconst credentialOf = (auth: Auth): Result<Credential> =>\n auth.status === 'authenticated'\n ? Result.success(auth.credential)\n : Result.failure(new KeboolaError(KeboolaErrorType.NotAuthenticated));\n\n/**\n * The stack's credential and its sign-in pin.\n *\n * - `epoch` moves on `authenticate` and `signOut` and never on a rotation, so it is exactly \"which\n * sign-in is this\" — what an in-flight exchange compares itself against.\n */\nexport const createAuth = (stacks: Stacks) => {\n // Stacks whose dead credential was reported; `authenticate` re-arms one, once per sign-in.\n const expired = new Set<BaseUrl>();\n\n // What authorizes a request to this stack; every project under it borrows the same one.\n const requireCredential = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) => credentialOf(stack.auth));\n\n // Nothing signed in yet: `anonymous` or `restoring` pass.\n const requireUnauthenticated = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) =>\n stack.auth.status === 'authenticated'\n ? Result.failure(new KeboolaError(KeboolaErrorType.AlreadyAuthenticated))\n : Result.success(stack),\n );\n\n // Strictly `anonymous`: a restore in flight is refused too, with its own reason.\n const requireAnonymous = (baseUrl: BaseUrl) =>\n Result.andThen(requireUnauthenticated(baseUrl), (stack) =>\n stack.auth.status === 'restoring'\n ? Result.failure(new Error(`Stack \"${baseUrl}\" is already being restored`))\n : Result.success(stack),\n );\n\n const requireRestoring = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) =>\n stack.auth.status === 'restoring'\n ? Result.success(stack)\n : Result.failure(new Error(`Stack \"${baseUrl}\" is not being restored`)),\n );\n\n const startRestore = (baseUrl: BaseUrl) =>\n Result.map(requireAnonymous(baseUrl), (stack) =>\n stacks.set({ ...stack, auth: { status: 'restoring' } }),\n );\n\n // A restore that failed or was abandoned: back to anonymous, no sign-in ended.\n const cancelRestore = (baseUrl: BaseUrl) =>\n Result.map(requireRestoring(baseUrl), (stack) =>\n stacks.set({ ...stack, auth: { status: 'anonymous' } }),\n );\n\n // Completes a restore too: `restoring` is the one non-anonymous phase this accepts.\n const authenticate = (baseUrl: BaseUrl, input: CredentialInput) =>\n Result.map(requireUnauthenticated(baseUrl), (stack) => {\n expired.delete(baseUrl);\n\n return stacks.set({\n ...stack,\n epoch: stack.epoch + 1,\n auth: { status: 'authenticated', credential: stamped(input) },\n retained: null,\n });\n });\n\n const applyRefresh = (baseUrl: BaseUrl, input: CredentialInput) =>\n Result.andThen(requireCredential(baseUrl), (credential) =>\n credential.type !== input.type\n ? Result.failure(new Error(`A ${credential.type} grant cannot become ${input.type}`))\n : Result.map(stacks.get(baseUrl), (stack) =>\n stacks.set({ ...stack, auth: { status: 'authenticated', credential: stamped(input) } }),\n ),\n );\n\n // Backdates the issue time by a full lifetime, so the credential reads as expired right now.\n const forceExpire = (baseUrl: BaseUrl) =>\n Result.andThen(requireCredential(baseUrl), (credential) =>\n Result.map(stacks.get(baseUrl), (stack) =>\n stacks.set({\n ...stack,\n auth: {\n status: 'authenticated',\n credential: { ...credential, issuedAt: Date.now() - credential.expiresIn * 1000 },\n },\n }),\n ),\n );\n\n // Drops the credential; the stack stays, anonymous. With `retain`, the credential's grant moves\n // into the slot instead; a stack with nothing to move keeps what the slot already holds.\n const signOut = (baseUrl: BaseUrl, { retain = false }: SignOutOptions = {}) =>\n Result.map(stacks.get(baseUrl), (stack) => {\n const retained = retain\n ? Result.unwrapOr(\n Result.map(credentialOf(stack.auth), (credential): Retained => ({\n grant: grantOf(credential),\n })),\n stack.retained,\n )\n : null;\n\n return stacks.set({\n ...stack,\n epoch: stack.epoch + 1,\n auth: { status: 'anonymous' },\n retained,\n });\n });\n\n const retain = (baseUrl: BaseUrl, retained: Retained) =>\n Result.map(stacks.get(baseUrl), (stack) => stacks.set({ ...stack, retained }));\n\n const dropRetained = (baseUrl: BaseUrl) =>\n Result.map(stacks.get(baseUrl), (stack) => stacks.set({ ...stack, retained: null }));\n\n const requireRetained = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) =>\n stack.retained\n ? Result.success(stack.retained)\n : Result.failure(new Error(`Stack \"${baseUrl}\" retains no credential`)),\n );\n\n const notifyExpired = (baseUrl: BaseUrl): boolean => {\n if (expired.has(baseUrl)) return false;\n expired.add(baseUrl);\n return true;\n };\n\n const getEpoch = (baseUrl: BaseUrl) => Result.map(stacks.get(baseUrl), (stack) => stack.epoch);\n\n // `null` rather than a failure: an anonymous request goes out without an `Authorization` header.\n const getAccessToken = (baseUrl: BaseUrl): string | null =>\n Result.unwrapOr(\n Result.map(requireCredential(baseUrl), ({ accessToken }) => accessToken),\n null,\n );\n\n return {\n startRestore,\n cancelRestore,\n authenticate,\n applyRefresh,\n forceExpire,\n signOut,\n retain,\n dropRetained,\n requireRetained,\n notifyExpired,\n requireCredential,\n getEpoch,\n getAccessToken,\n };\n};\n","import { Result } from '../../../utils';\nimport { KeboolaError, KeboolaErrorType } from '../../errors';\n\nimport type { BaseUrl, FetchStatus, Stack, Store } from './types';\n\nexport const newStack = (baseUrl: BaseUrl): Stack => ({\n baseUrl,\n context: 'idle',\n epoch: 0,\n auth: { status: 'anonymous' },\n retained: null,\n});\n\n/** One entry per stack, and the verbs that open and select them. */\nexport const createStacks = (store: Store) => {\n const get = (baseUrl: BaseUrl) => {\n const stack = store.get().stacks[baseUrl];\n return stack\n ? Result.success(stack)\n : Result.failure(new KeboolaError(KeboolaErrorType.Unconfigured));\n };\n const set = (stack: Stack): Stack => {\n const state = store.get();\n store.set({ ...state, stacks: { ...state.stacks, [stack.baseUrl]: stack } });\n return stack;\n };\n const update = (baseUrl: BaseUrl, updater: (stack: Stack) => Stack) =>\n Result.map(get(baseUrl), (stack) => set(updater(stack)));\n\n // --- verbs ---\n\n const ensure = (baseUrl: BaseUrl) => {\n const existing = get(baseUrl);\n if (existing.success) return existing.data;\n return set(newStack(baseUrl));\n };\n\n // The table always names an active row: it starts on one, and rows are never removed.\n const getActive = (): Stack => {\n const { active } = store.get();\n const stack = get(active);\n if (!stack.success) throw new Error(`The active stack has no row: ${active}`);\n return stack.data;\n };\n\n // Re-selecting the active stack is not a change. Without this a component that selects on every\n // render — the backend flow, handed its stack by the server — is notified back into another\n // render, forever.\n const select = (baseUrl: BaseUrl): Stack => {\n const stack = ensure(baseUrl);\n const state = store.get();\n if (state.active !== baseUrl) store.set({ ...state, active: baseUrl });\n return stack;\n };\n\n const updateContext = (baseUrl: BaseUrl, context: FetchStatus) =>\n update(baseUrl, (stack) => ({ ...stack, context }));\n\n return { get, set, update, ensure, getActive, select, updateContext };\n};\n\nexport type Stacks = ReturnType<typeof createStacks>;\n","import { createStore } from '../../../utils';\n\nimport { createAuth } from './auth';\nimport { createStacks, newStack } from './stacks';\nimport type { BaseUrl, State } from './types';\n\n/**\n * The stack table and the rules over it, one namespace per concern.\n *\n * - Starts active on its default stack, which is its one row.\n */\nexport const createState = (defaultBaseUrl: BaseUrl) => {\n const store = createStore<State>({\n active: defaultBaseUrl,\n stacks: { [defaultBaseUrl]: newStack(defaultBaseUrl) },\n });\n\n const stacks = createStacks(store);\n const auth = createAuth(stacks);\n\n return { store: store.asReadable(), stacks, auth };\n};\n\nexport type StateApi = ReturnType<typeof createState>;\n","import { createAuthClient } from '../../../clients/auth/authClient';\nimport type { MiddlewareFn } from '../../../fetchClient';\nimport { dedupe, ensure, Result } from '../../../utils';\nimport { KeboolaError, KeboolaErrorType } from '../../errors';\nimport type { createSessionPersistor, Locked, PersistedSession } from '../persistor';\nimport { type createState, grantOf, type SignOutOptions } from '../state';\nimport type { BaseUrl, Credential, CredentialInput, Grant } from '../state/types';\n\nimport { createBearerAuthMiddleware, isUnauthorized } from './middleware';\n\ntype Options = {\n state: ReturnType<typeof createState>;\n persistor: ReturnType<typeof createSessionPersistor>;\n middlewares: MiddlewareFn[];\n refreshThreshold?: number;\n /** Also fires when a refused refresh expires the sign-in. */\n onSignedOut?: (baseUrl: BaseUrl) => void;\n /** Only for a refused refresh, never for a caller's own `signOut`. */\n onExpired?: (baseUrl: BaseUrl) => void;\n};\n\nconst DEFAULT_REFRESH_THRESHOLD = 0.9;\n\n/**\n * What a boot-time restore found.\n *\n * - `expired`: the server refused the refresh token.\n * - `unreachable`: no answer; the stored token is still good — retry, never log in.\n */\nexport type RestoreStatus = 'restored' | 'expired' | 'unreachable' | 'empty';\n\n/** `skipped`: the caller signed this stack in or out before the restore reached it. */\nexport type StackRestore = 'restored' | 'refused' | 'unreachable' | 'skipped';\n\nconst signInEnded = () => new KeboolaError(KeboolaErrorType.SignInEnded);\n\nconst toRestoreStatus = (outcome: StackRestore | undefined): RestoreStatus => {\n if (outcome === undefined || outcome === 'skipped') return 'empty';\n if (outcome === 'refused') return 'expired';\n return outcome;\n};\n\nconst renew = async (\n client: ReturnType<typeof createAuthClient>,\n grant: Grant,\n): Promise<CredentialInput> => {\n if (grant.type === 'cookie') {\n const { accessToken, expiresIn, sessionId } = await client.token.refreshWithSession({\n sessionId: grant.sessionId,\n });\n return { type: 'cookie', accessToken, expiresIn, sessionId };\n }\n\n const { accessToken, expiresIn, refreshToken } = await client.token.refreshWithToken({\n refreshToken: grant.refreshToken,\n });\n if (!refreshToken) throw new KeboolaError(KeboolaErrorType.NotAuthenticated);\n return { type: 'token', accessToken, expiresIn, refreshToken };\n};\n\nexport const createCredentials = ({\n state,\n persistor,\n middlewares,\n refreshThreshold = DEFAULT_REFRESH_THRESHOLD,\n onSignedOut,\n onExpired,\n}: Options) => {\n const rotationMap = new Map<BaseUrl, () => Promise<Result<string>>>();\n\n const markSignIn = (baseUrl: BaseUrl) => {\n const epoch = Result.unwrap(state.auth.getEpoch(baseUrl));\n return () => Result.unwrapOr(state.auth.getEpoch(baseUrl), -1) === epoch;\n };\n\n // No bearer middleware on this client: the cookie refresh is rejected outright if it carries one.\n const refresh = async (baseUrl: BaseUrl, grant: Grant): Promise<Result<CredentialInput>> => {\n const client = createAuthClient({ baseUrl, middlewares });\n const isSameSignIn = markSignIn(baseUrl);\n const refreshed = await Result.tryCatchAsync(() => renew(client, grant));\n return isSameSignIn() ? refreshed : Result.failure(signInEnded());\n };\n\n const getGrantForRotation = async (\n store: Locked,\n baseUrl: BaseUrl,\n credential: Credential,\n ): Promise<Result<Grant>> => {\n const isSameSignIn = markSignIn(baseUrl);\n const hydrated = await Result.tryCatchAsync(() => store.read());\n if (!hydrated.success) return hydrated;\n if (!isSameSignIn()) return Result.failure(signInEnded());\n\n const persistedStack = hydrated.data.stacks.find((stack) => stack.baseUrl === baseUrl);\n if (persistedStack && persistedStack.credential === null) {\n return Result.failure(signInEnded());\n }\n return Result.success(persistedStack?.credential ?? grantOf(credential));\n };\n\n const rotateOnce = async (baseUrl: BaseUrl): Promise<Result<string>> =>\n persistor.locked(async (store) => {\n const credential = state.auth.requireCredential(baseUrl);\n if (!credential.success) return credential;\n const grant = await getGrantForRotation(store, baseUrl, credential.data);\n if (!grant.success) return grant;\n\n const refreshed = await refresh(baseUrl, grant.data);\n if (!refreshed.success) {\n if (isUnauthorized(refreshed.error)) await expire(baseUrl, store);\n return refreshed;\n }\n\n const accessToken = Result.map(\n state.auth.applyRefresh(baseUrl, refreshed.data),\n () => refreshed.data.accessToken,\n );\n await store.persistStack(baseUrl, state.store.get());\n return accessToken;\n });\n\n const rotate = (baseUrl: BaseUrl): Promise<Result<string>> =>\n ensure(rotationMap, baseUrl, () => dedupe(() => rotateOnce(baseUrl)))();\n\n // A cookie grant is dead off the stack's own origin: the browser sends no session cookie there.\n const restoreStack = async (\n baseUrl: BaseUrl,\n grant: Grant,\n retained = false,\n ): Promise<StackRestore> =>\n persistor.locked(async (store) => {\n const session = await store.read();\n const storedStack = session.stacks.find((stack) => stack.baseUrl === baseUrl);\n const latestGrant = retained ? storedStack?.retained?.grant : storedStack?.credential;\n if (storedStack && !latestGrant) return 'skipped';\n\n const restoring = state.auth.startRestore(baseUrl);\n if (!restoring.success) return 'unreachable';\n\n const refreshed = await refresh(baseUrl, latestGrant ?? grant);\n if (!refreshed.success) {\n state.auth.cancelRestore(baseUrl);\n if (isUnauthorized(refreshed.error)) {\n if (retained) state.auth.dropRetained(baseUrl);\n await store.persistStack(baseUrl, state.store.get());\n return 'refused';\n }\n return 'unreachable';\n }\n\n state.auth.authenticate(baseUrl, refreshed.data);\n if (!state.auth.requireCredential(baseUrl).success) return 'unreachable';\n if (retained) state.auth.dropRetained(baseUrl);\n await store.persistStack(baseUrl, state.store.get());\n return 'restored';\n });\n\n // Never writes the scope: `lastActive` is the caller's to select.\n const restore = async (): Promise<{\n lastActive: PersistedSession['current'];\n status: RestoreStatus;\n }> => {\n // An unreadable store is `unreachable`: what it holds is still good, so persistence waits\n // for a sign-in to replace it.\n const hydrated = await persistor\n .locked((store) => store.read())\n .catch((error: unknown) => {\n console.warn('createCredentials: the stored session could not be read', error);\n return null;\n });\n if (hydrated === null) return { lastActive: null, status: 'unreachable' };\n const { stacks, current } = hydrated;\n const scoped = stacks.find(({ baseUrl }) => baseUrl === current?.baseUrl);\n\n const restored = stacks.map(\n async ({ baseUrl, credential, retained }): Promise<StackRestore> => {\n state.stacks.ensure(baseUrl);\n if (!credential && !retained) return 'unreachable';\n if (Result.unwrapOr(state.auth.getEpoch(baseUrl), 0) > 0) return 'skipped';\n // A retained sign-out stays signed out across reloads.\n if (retained) state.auth.retain(baseUrl, retained);\n if (!credential) return 'unreachable';\n return restoreStack(baseUrl, credential);\n },\n );\n\n const results = await Promise.all(restored);\n const scopedOutcome = scoped?.credential ? results[stacks.indexOf(scoped)] : undefined;\n\n return { lastActive: current, status: toRestoreStatus(scopedOutcome) };\n };\n\n const restoreRetained = async (baseUrl: BaseUrl): Promise<StackRestore> => {\n const { grant } = Result.unwrap(state.auth.requireRetained(baseUrl));\n return restoreStack(baseUrl, grant, true);\n };\n\n /**\n * - Drops the rotation, so the next sign-in's requests don't join the dying one.\n * - Writes nothing: the caller persists the stack, under the lock it holds or takes.\n */\n const signOut = (baseUrl: BaseUrl, options?: SignOutOptions) => {\n rotationMap.delete(baseUrl);\n const signedOut = state.auth.signOut(baseUrl, options);\n onSignedOut?.(baseUrl);\n\n return signedOut;\n };\n\n // One expiry per sign-in: the latch re-arms on `authenticate`. `onExpired` fires after the\n // write, so a listener may leave the document at once.\n const expire = async (baseUrl: BaseUrl, store: Locked) => {\n if (!state.auth.notifyExpired(baseUrl)) return;\n signOut(baseUrl);\n await store.persistStack(baseUrl, state.store.get());\n onExpired?.(baseUrl);\n };\n\n // Best-effort: on failure keep the token in hand; a real 401 drives the mandatory rotation.\n const renewIfStale = async (baseUrl: BaseUrl, threshold = refreshThreshold): Promise<void> => {\n const isStale = Result.map(\n state.auth.requireCredential(baseUrl),\n ({ issuedAt, expiresIn }) => Date.now() >= issuedAt + expiresIn * 1000 * threshold,\n );\n if (Result.unwrapOr(isStale, false)) await rotate(baseUrl);\n };\n\n const middleware = (baseUrl: BaseUrl): MiddlewareFn =>\n createBearerAuthMiddleware({\n getAccessToken: async ({ forceRefresh = false } = {}) => {\n if (forceRefresh) {\n // `null`, not a rejection: nothing to rotate, so the caller keeps its original 401.\n if (!state.auth.requireCredential(baseUrl).success) return null;\n return Result.unwrap(await rotate(baseUrl));\n }\n\n await renewIfStale(baseUrl);\n return state.auth.getAccessToken(baseUrl);\n },\n });\n\n return { middleware, rotate, renewIfStale, restore, restoreRetained, signOut };\n};\n","import type { AuthStrategy } from '../../clients/auth';\nimport { createStorageClient } from '../../clients/storage';\nimport type { ServiceId } from '../../clients/storage/types';\nimport type { MiddlewareFn } from '../../fetchClient';\nimport { KeboolaHttpHeader } from '../../internal';\nimport { isBuiltInProperty } from '../../serviceClientRegistry';\nimport { ensure, Result } from '../../utils';\nimport type { ProjectApi } from '../createApi';\nimport type { createMiddlewareFor } from '../createMiddlewareFor';\nimport { createSdk } from '../createSdk';\nimport { createServiceClients } from '../createServiceClients';\nimport { assert, KeboolaError, KeboolaErrorType } from '../errors';\n\nimport type { BaseUrl } from './state/types';\nimport type { createCredentials } from './credentials';\nimport type { PerStack } from './perStack';\nimport type { StateApi } from './state';\n\nexport type ProjectId = number;\n\n/** A project: addressed only inside its own stack, whose credential it borrows via a header. */\nexport type ProjectAddress = { baseUrl: BaseUrl; projectId: ProjectId };\n\n// A project id is unique only within its stack.\ntype ProjectKey = `${BaseUrl}#${ProjectId}`;\n\nconst projectKey = ({ baseUrl, projectId }: ProjectAddress): ProjectKey =>\n `${baseUrl}#${projectId}`;\n\ntype ServiceClients = ReturnType<typeof createServiceClients>['client'];\n\ntype Options = {\n state: StateApi;\n credentials: ReturnType<typeof createCredentials>;\n middlewareFor: ReturnType<typeof createMiddlewareFor>;\n stack: PerStack;\n};\n\n/**\n * One handle per project, and the one call that drops it.\n *\n * Every client belongs to the credential that built it — a client set carries its middleware\n * chain — so the handle dies with the sign-in, and `forgetUnder` is the only thing that ends one.\n */\nexport const createPerProject = ({ state, credentials, middlewareFor, stack }: Options) => {\n // The project-id header outside the auth middleware, so it is set before the 401 replay clones\n // the request.\n const attachFor = ({ baseUrl, projectId }: ProjectAddress): MiddlewareFn => {\n const withProjectId: MiddlewareFn = (next) => (request) => {\n request.request.headers.set(KeboolaHttpHeader.PROJECT_ID, String(projectId));\n return next(request);\n };\n\n return (next) => withProjectId(credentials.middleware(baseUrl)(next));\n };\n\n // No static header: the auth middleware stamps the live token, so this never reaches the wire.\n const authFor = ({ projectId }: ProjectAddress): AuthStrategy => ({\n type: 'bearer',\n token: '',\n projectId,\n });\n\n /**\n * One project's surface: the stack's fields from `perStack`, the rest built for the project.\n *\n * - Checked per property read but `baseUrl`: `SignInEnded` once the sign-in it was built under\n * ends, and `NotAuthenticated` before one lands.\n */\n const build = (project: ProjectAddress) => {\n let isLive = true;\n const attach = attachFor(project);\n const storage = createStorageClient({\n baseUrl: project.baseUrl,\n auth: authFor(project),\n middlewares: middlewareFor('storage', [attach]),\n });\n const { client, meta } = createServiceClients({\n baseUrl: project.baseUrl,\n auth: authFor(project),\n // A resolver rather than a URL: the first request awaits the stack index if it is still in\n // flight.\n getServiceBaseUrl: (serviceId: ServiceId) => async () => {\n const serviceUrl = (await stack.context.getAsync(project.baseUrl)).getServiceUrl(serviceId);\n\n assert(serviceUrl, KeboolaErrorType.NotReady);\n return serviceUrl;\n },\n middlewareFor,\n attachTokenMiddleware: attach,\n });\n const sdk = createSdk({ storage, services: client });\n\n const api = new Proxy({} as ProjectApi, {\n get: (_target, property) => {\n if (isBuiltInProperty(property)) return undefined;\n // The address needs no sign-in: a query key names the project before one lands.\n if (property === 'baseUrl') return project.baseUrl;\n\n if (!isLive) throw new KeboolaError(KeboolaErrorType.SignInEnded);\n Result.unwrap(state.auth.requireCredential(project.baseUrl));\n\n if (property === 'stack' || property === 'auth' || property === 'management') {\n return stack.get(project.baseUrl)[property];\n }\n if (property === 'storage') return storage;\n if (property === 'sdk') return sdk;\n if (property === 'serviceMeta') return meta;\n\n return client[property as keyof ServiceClients];\n },\n });\n\n return {\n api,\n end: () => {\n isLive = false;\n },\n };\n };\n\n const derived = new Map<ProjectKey, ReturnType<typeof build>>();\n\n const get = (project: ProjectAddress): ProjectApi =>\n ensure(derived, projectKey(project), () => build(project)).api;\n\n const forgetUnder = (baseUrl: BaseUrl) => {\n for (const [key, record] of derived) {\n if (!key.startsWith(`${baseUrl}#`)) continue;\n record.end();\n derived.delete(key);\n }\n };\n\n return { get, forgetUnder };\n};\n","import * as z from 'zod';\n\nimport { type Cell, createPersistor } from '../../utils/persistor';\nimport type { StorageAdapter } from '../types';\n\nimport type { BaseUrl, Stack } from './state/types';\nimport { grantOf, type State } from './state';\n\n/**\n * Where a bearer session is persisted, under whichever adapter the client was given.\n *\n * Exported because a consumer sometimes has to drop a session a client cannot reach: the adapter is\n * chosen at construction, so a client built without one holds no handle to the storage its own\n * session is sitting in. `AppAuthStrategy` in kbc-ui is that case.\n */\nexport const SESSION_STORAGE_KEY = 'keboola:session';\n\n/**\n * What survives a reload, per grant type.\n *\n * - Written under `credential`: the key every blob already stored carries.\n *\n * - `token`: the refresh token. It rotates, is single-use and is server-revocable, so a leaked\n * snapshot has limited and revocable value. The access token is never written.\n * - `cookie`: the session id. The session cookie is the durable half and the browser keeps it;\n * the id alone renews nothing.\n */\nconst persistedGrantSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('token'), refreshToken: z.string() }),\n z.object({ type: z.literal('cookie'), sessionId: z.string() }),\n]);\n\nconst persistedStackSchema = z.object({\n baseUrl: z.string(),\n // A kind this build does not know costs that stack its sign-in, not the whole table.\n credential: persistedGrantSchema.nullable().catch(null),\n retained: z.object({ grant: persistedGrantSchema }).nullable().default(null).catch(null),\n /**\n * Written empty, never read.\n * - An older build parses a stack without it as corrupt, and signs out.\n */\n projects: z.array(z.unknown()),\n});\n\nconst persistedSessionSchema = z.object({\n current: z\n .object({\n baseUrl: z.string(),\n /**\n * Written `null`, never read: the project is the app's to keep.\n * - An older build parses a `current` without it as corrupt, and signs out.\n */\n projectId: z.number().nullable(),\n })\n .nullable(),\n stacks: z.array(persistedStackSchema),\n});\n\nexport type PersistedSession = z.infer<typeof persistedSessionSchema>;\ntype PersistedStack = z.infer<typeof persistedStackSchema>;\n\nconst EMPTY_PERSISTED_SESSION: PersistedSession = { current: null, stacks: [] };\n\nconst grantsOf = (stack: Stack): Pick<PersistedStack, 'credential' | 'retained'> => ({\n credential: stack.auth.status === 'authenticated' ? grantOf(stack.auth.credential) : null,\n retained: stack.retained,\n});\n\n/**\n * The stored session, rewritten from the table except for the grants.\n *\n * - Scope and stack list come from memory.\n * - `credential` and `retained` stay as stored: a grant another document rotated must not be put\n * back by a snapshot of this one's older table.\n */\nconst mergeSnapshot = (stored: PersistedSession, { active, stacks }: State): PersistedSession => ({\n current: { baseUrl: active, projectId: null },\n stacks: Object.values(stacks).map(({ baseUrl }) => {\n const kept = stored.stacks.find((stack) => stack.baseUrl === baseUrl);\n return {\n baseUrl,\n credential: kept?.credential ?? null,\n retained: kept?.retained ?? null,\n projects: [],\n };\n }),\n});\n\nconst upsertStack = (stored: PersistedSession, row: PersistedStack): PersistedSession => {\n const index = stored.stacks.findIndex((stack) => stack.baseUrl === row.baseUrl);\n const stacks = [...stored.stacks];\n if (index < 0) stacks.push(row);\n else stacks[index] = row;\n return { ...stored, stacks };\n};\n\n/** What a caller may do while it holds the session lock. */\nexport type Locked = {\n read: () => Promise<PersistedSession>;\n /** One stack's grants as the table holds them. */\n persistStack: (baseUrl: BaseUrl, state: State) => Promise<void>;\n};\n\n/**\n * The stored session, reached in two ways.\n *\n * - `locked`: the only way to read, and the only way to a grant write. Rotation and restore hold\n * it across the refresh; sign-in, sign-out and the boot restore open it for one step.\n * - `snapshot`: the table minus its grants, under the lock, coalesced; what the store subscription\n * feeds, and what a scope change awaits before the document leaves.\n */\nexport const createSessionPersistor = (storage?: StorageAdapter) => {\n const persistor = createPersistor<PersistedSession>({\n storage,\n key: SESSION_STORAGE_KEY,\n schema: persistedSessionSchema,\n defaultValue: EMPTY_PERSISTED_SESSION,\n });\n\n const persistStack = (\n cell: Cell<PersistedSession>,\n baseUrl: BaseUrl,\n { stacks }: State,\n ): Promise<void> => {\n const stack: Stack | undefined = stacks[baseUrl];\n if (stack === undefined) return Promise.resolve();\n\n return cell.modify((stored) =>\n upsertStack(stored, { baseUrl, ...grantsOf(stack), projects: [] }),\n );\n };\n\n const locked = <R>(task: (store: Locked) => Promise<R>): Promise<R> =>\n persistor.locked((cell) =>\n task({\n read: cell.read,\n persistStack: (baseUrl, state) => persistStack(cell, baseUrl, state),\n }),\n );\n\n let latest: State | null = null;\n let pending: Promise<void> | null = null;\n // Resolves once a write holding `state` (or a later one) has landed; calls made while a write\n // waits for the lock share it.\n const snapshot = (state: State): Promise<void> => {\n latest = state;\n if (pending) return pending;\n const write = persistor.locked((cell) => {\n pending = null;\n const table = latest ?? state;\n return cell.modify((stored) => mergeSnapshot(stored, table));\n });\n pending = write;\n return write;\n };\n\n return { locked, snapshot };\n};\n","import { createStorageClient } from '../../clients/storage';\nimport { createStack, type ServiceUrls, type Stack } from '../../domain/stack';\n\nimport type { BaseUrl, State } from './state/types';\nimport type { StateApi } from './state';\n\nconst STACK_INDEX_TIMEOUT_MS = 30_000;\n\ntype Settled = { status: 'ready'; value: Stack } | { status: 'errored'; error: unknown };\ntype Entry = { status: 'pending'; settled: Promise<Settled> } | Settled;\n\ntype Options = {\n state: StateApi;\n clientServiceUrls?: ServiceUrls;\n};\n\n/**\n * One parsed stack index per stack; `createStack` applies the dev and production overrides.\n *\n * - One fetch per stack: concurrent askers share it, a landed index is never refetched.\n * - A failure is held until a retry; nothing here needs a rejection handler.\n * - Every status change is copied onto the stack's row, for the consumers that render it.\n */\nexport const createStackContext = ({ state, clientServiceUrls }: Options) => {\n const entries = new Map<BaseUrl, Entry>();\n\n const set = (baseUrl: BaseUrl, entry: Entry) => {\n entries.set(baseUrl, entry);\n state.stacks.updateContext(baseUrl, entry.status);\n };\n\n const fetchStack = async (baseUrl: BaseUrl) => {\n const stackInfo = await createStorageClient({\n baseUrl,\n auth: { type: 'sapi-token', token: '' },\n }).getStackInfo({ exclude: 'componentDetails' }, AbortSignal.timeout(STACK_INDEX_TIMEOUT_MS));\n return createStack({ stackInfo, clientServiceUrls });\n };\n\n const run = (baseUrl: BaseUrl): Entry => {\n const settle = (next: Settled): Settled => {\n set(baseUrl, next);\n return next;\n };\n\n const entry: Entry = {\n status: 'pending',\n settled: fetchStack(baseUrl).then(\n (value) => settle({ status: 'ready', value }),\n (error: unknown) => settle({ status: 'errored', error }),\n ),\n };\n\n set(baseUrl, entry);\n return entry;\n };\n\n const get = (baseUrl: BaseUrl): Stack | null => {\n const entry = entries.get(baseUrl);\n return entry?.status === 'ready' ? entry.value : null;\n };\n\n const getAsync = async (baseUrl: BaseUrl): Promise<Stack> => {\n const cached = entries.get(baseUrl);\n const entry = cached === undefined || cached.status === 'errored' ? run(baseUrl) : cached;\n const settled = entry.status === 'pending' ? await entry.settled : entry;\n\n if (settled.status === 'errored') throw settled.error;\n return settled.value;\n };\n\n const subscriber = ({ stacks }: State) => {\n for (const { baseUrl } of Object.values(stacks)) if (!entries.has(baseUrl)) run(baseUrl);\n };\n\n return { subscriber, get, getAsync };\n};\n","import { createAuthClient } from '../../clients/auth/authClient';\nimport { createManagementClient } from '../../clients/management';\nimport { ensure } from '../../utils';\nimport type { StackApi } from '../createApi';\nimport type { createMiddlewareFor } from '../createMiddlewareFor';\nimport { assert, KeboolaErrorType } from '../errors';\nimport type { KeboolaOptions } from '../types';\n\nimport type { BaseUrl } from './state/types';\nimport { createStackContext } from './context';\nimport type { createCredentials } from './credentials';\nimport type { StateApi } from './state';\n\ntype Options = {\n state: StateApi;\n credentials: ReturnType<typeof createCredentials>;\n middlewareFor: ReturnType<typeof createMiddlewareFor>;\n clientServiceUrls?: KeboolaOptions['clientServiceUrls'];\n};\n\n/**\n * Everything one stack derives.\n *\n * Outlives a sign-out, unlike anything in `perProject`: both clients read the credential live per\n * request, so neither belongs to one sign-in, and the stack index is public.\n */\nexport const createPerStack = ({\n state,\n credentials,\n middlewareFor,\n clientServiceUrls,\n}: Options) => {\n const context = createStackContext({ state, clientServiceUrls });\n const derived = new Map<BaseUrl, StackApi>();\n\n const get = (baseUrl: BaseUrl): StackApi =>\n ensure(derived, baseUrl, () => ({\n baseUrl,\n // `NotReady` until the stack index lands.\n get stack() {\n const parsed = context.get(baseUrl);\n assert(parsed, KeboolaErrorType.NotReady);\n return parsed;\n },\n auth: createAuthClient({\n baseUrl,\n middlewares: middlewareFor('auth', [credentials.middleware(baseUrl)]),\n }),\n management: createManagementClient({\n baseUrl,\n auth: { type: 'bearer', token: '' },\n middlewares: middlewareFor('management', [credentials.middleware(baseUrl)]),\n }),\n }));\n\n return { context, get };\n};\n\nexport type PerStack = ReturnType<typeof createPerStack>;\n","import { HttpHeader, normalizeBaseUrl } from '../../fetchClient';\nimport { KeboolaHttpHeader } from '../../internal';\nimport { lazy, Result } from '../../utils';\nimport type { ProjectApi, StackApi } from '../createApi';\nimport { createMiddlewareFor } from '../createMiddlewareFor';\nimport { KeboolaError, KeboolaErrorType } from '../errors';\nimport type { KeboolaOptions } from '../types';\n\nimport type { BaseUrl, CredentialInput, Stack, State, TokenCredentialInput } from './state/types';\nimport { createCredentials, type RestoreStatus } from './credentials';\nimport { createPerProject, type ProjectAddress, type ProjectId } from './perProject';\nimport { createSessionPersistor } from './persistor';\nimport { createPerStack } from './perStack';\nimport { createState, type SignOutOptions } from './state';\n\n/**\n * The bearer client: the session table, its two scopes, and the surface they back.\n *\n * - Credential-derived state is owned by the scope whose end ends it (`perStack`, `perProject`).\n */\nexport const createKeboola = ({\n defaultBaseUrl,\n storage,\n middlewares,\n clientServiceUrls,\n onExpired,\n}: KeboolaOptions) => {\n const state = createState(normalizeBaseUrl(defaultBaseUrl));\n const persistor = createSessionPersistor(storage);\n const middlewareFor = createMiddlewareFor(middlewares);\n const credentials = createCredentials({\n state,\n persistor,\n middlewares: middlewareFor('auth'),\n // Read at call time, so it reaches the `perProject` built below.\n onSignedOut: (baseUrl) => perProject.forgetUnder(baseUrl),\n onExpired,\n });\n\n const perStack = createPerStack({ state, credentials, middlewareFor, clientServiceUrls });\n const perProject = createPerProject({ state, credentials, middlewareFor, stack: perStack });\n\n state.store.subscribe(perStack.context.subscriber);\n // The default stack is in the table from the start, so no change announces it.\n perStack.context.subscriber(state.store.get());\n\n const selectStack = (baseUrl: string): Stack => state.stacks.select(normalizeBaseUrl(baseUrl));\n\n /** The active stack, or a named one — normalised to key like `select`. */\n const requireStackUrl = (baseUrl?: string): BaseUrl =>\n baseUrl === undefined ? state.stacks.getActive().baseUrl : normalizeBaseUrl(baseUrl);\n\n /** A project id is unique only within its stack: it always names one on the active stack. */\n const onActiveStack = (projectId: ProjectId): ProjectAddress => ({\n baseUrl: requireStackUrl(),\n projectId,\n });\n\n /**\n * Auth headers for a non-fetch transport (the chat stream), renewed first once near expiry.\n *\n * - `refreshThreshold` renews earlier: the share of the token's lifetime it may have used.\n * - No middleware recovers a 401 there.\n * - Pinned to the stack active at the call: a stack switch mid-renewal does not re-point it.\n * - Throws `NotAuthenticated` if that stack signed out meanwhile.\n */\n const getAuthHeadersAsync = async (\n projectId: ProjectId,\n { refreshThreshold }: { refreshThreshold?: number } = {},\n ): Promise<Record<string, string>> => {\n const { baseUrl } = onActiveStack(projectId);\n await credentials.renewIfStale(baseUrl, refreshThreshold);\n\n const credential = Result.unwrap(state.auth.requireCredential(baseUrl));\n return {\n [HttpHeader.AUTHORIZATION]: `Bearer ${credential.accessToken}`,\n [KeboolaHttpHeader.PROJECT_ID]: String(projectId),\n };\n };\n\n /**\n * A login or MFA-verify response, taken as the credential it carries.\n *\n * - Either grant type: the credential names what renews it (`refreshToken` or `sessionId`).\n * - `refreshToken` is optional: a browser-mode login omits it, and MFA verify can't tell.\n * - A `token` credential without one is refused here — it would die at its first refresh.\n */\n type AuthenticateInput =\n | (Omit<TokenCredentialInput, 'refreshToken'> & { refreshToken?: string | null })\n | Exclude<CredentialInput, { type: 'token' }>;\n\n const toCredential = (input: AuthenticateInput): CredentialInput => {\n if (input.type !== 'token') return input;\n\n const { refreshToken } = input;\n if (!refreshToken) throw new KeboolaError(KeboolaErrorType.NotAuthenticated);\n return { ...input, refreshToken };\n };\n\n const authenticate = (input: AuthenticateInput): Stack => {\n const { baseUrl } = state.stacks.getActive();\n const signedIn = Result.unwrap(state.auth.authenticate(baseUrl, toCredential(input)));\n persistor\n .locked((store) => store.persistStack(baseUrl, state.store.get()))\n .catch((error: unknown) => {\n console.warn('createKeboola: the sign-in could not be stored', error);\n });\n return signedIn;\n };\n\n // Getters: each read resolves against the stack active at that moment.\n const active = () => perStack.get(state.stacks.getActive().baseUrl);\n const stackApi: StackApi = {\n get baseUrl() {\n return active().baseUrl;\n },\n get stack() {\n return active().stack;\n },\n get auth() {\n return active().auth;\n },\n get management() {\n return active().management;\n },\n };\n\n const getStackApi = (): StackApi => stackApi;\n\n const getProjectApi = (projectId: ProjectId): ProjectApi =>\n perProject.get(onActiveStack(projectId));\n\n /**\n * The scope's sign-in, or a named stack's — and everything that sign-in derived.\n *\n * - `retain` keeps the grant on the stack, persisted beside the sign-in it ended, for\n * `restoreRetained`; the next sign-in on the stack replaces it.\n * - The table is signed out on return; the promise resolves once that is stored, so a caller\n * leaving the document waits for it.\n */\n const signOut = ({\n baseUrl,\n ...options\n }: SignOutOptions & { baseUrl?: string } = {}): Promise<Stack> => {\n const target = requireStackUrl(baseUrl);\n\n // Teardown rides `credentials.signOut`: an expiry skips this path.\n const signedOut = Result.unwrap(credentials.signOut(target, options));\n return persistor\n .locked((store) => store.persistStack(target, state.store.get()))\n .then(() => signedOut);\n };\n\n /** Signs a stack back in from what a retained sign-out kept; `unreachable` leaves it to retry. */\n const restoreRetained = (baseUrl: string) =>\n credentials.restoreRetained(normalizeBaseUrl(baseUrl));\n\n /**\n * `input` replaces the active stack's sign-in, whatever it holds.\n *\n * - Signs out first, always: a sign-out moves the epoch even on an anonymous stack, so a stored\n * session still being restored cannot land on top of this one.\n */\n const replace = (input: AuthenticateInput): Stack => {\n void signOut();\n return authenticate(input);\n };\n\n let persisting = false;\n /**\n * Persistence starts only once the restore has settled.\n *\n * - Mid-hydration an unexchanged stack is `anonymous`; the persistor would erase the\n * refresh token the exchange is about to spend.\n * - Writes the settled table once: the subscription fires only on the next change.\n */\n const enablePersistence = () => {\n // A failed resume is retried, and each attempt lands here again.\n if (persisting) return;\n persisting = true;\n\n snapshot(state.store.get());\n state.store.subscribe(snapshot);\n };\n\n const snapshot = (table: State): void => {\n persistor.snapshot(table).catch((error: unknown) => {\n console.warn('createKeboola: the session could not be stored', error);\n });\n };\n\n // What a scope change resolves with: its write, once persistence has started; nothing before.\n const persistScope = (): Promise<void> =>\n persisting ? persistor.snapshot(state.store.get()) : Promise.resolve();\n\n /**\n * The same, deferred until a sign-in.\n *\n * - After an unreachable restore the table is anonymous but the stored token is still good;\n * writing earlier would drop it.\n */\n const enablePersistenceOnSignIn = () => {\n const stop = state.store.subscribe((next) => {\n if (!Object.values(next.stacks).some(({ auth }) => auth.status === 'authenticated')) return;\n\n stop();\n enablePersistence();\n });\n };\n\n // Rebuilds the stored stacks and credentials; `lastActive` is the scope they were stored under,\n // `null` only when nothing was.\n const restore = lazy(() =>\n credentials.restore().then(\n (restored) => {\n if (restored.status === 'unreachable') enablePersistenceOnSignIn();\n else enablePersistence();\n\n return restored;\n },\n (error: unknown) => {\n // Not `enablePersistence`: writing the half-restored table now would erase the very session\n // the retry `lazy` allows is meant to read.\n enablePersistenceOnSignIn();\n throw error;\n },\n ),\n );\n\n const getActiveStack = state.stacks.getActive;\n\n const isAuthenticated = () => getActiveStack().auth.status === 'authenticated';\n\n /**\n * Picks up where the stored session left off, once.\n *\n * 1. The stored stack becomes active again.\n * 2. Nothing stored, or the restore failed: `defaultBaseUrl` stays active; a failure rethrows.\n * 3. The caller got there first (a select, sign-in or sign-out): its scope and sign-ins stand.\n *\n * - Resolves with the stored credential's fate — only this tells `expired` from `empty`.\n * - Other stacks still come back, persistence still starts; repeat calls share one promise.\n */\n const resume = lazy(() =>\n restore().then(({ lastActive, status }): RestoreStatus => {\n if (lastActive && !callerScoped) selectStack(lastActive.baseUrl);\n\n return status;\n }),\n );\n\n // Set by the public verbs that pick a scope or change a sign-in — the default the table starts on,\n // the resume's own re-scope and the restore's sign-ins are not a caller's choice.\n let callerScoped = false;\n const byCaller =\n <A extends unknown[], R>(verb: (...args: A) => R) =>\n (...args: A): R => {\n callerScoped = true;\n return verb(...args);\n };\n\n return {\n getStackApi,\n getProjectApi,\n session: {\n getState: state.store.get,\n subscribe: state.store.subscribe,\n resume,\n\n stack: {\n getActive: getActiveStack,\n /** Scoped on return; resolves once that is stored, for a caller leaving the document. */\n select: byCaller((baseUrl: string): Promise<Stack> => {\n const stack = selectStack(baseUrl);\n return persistScope().then(() => stack);\n }),\n getContext: (baseUrl?: string) => perStack.context.get(requireStackUrl(baseUrl)),\n getContextAsync: (baseUrl?: string) => perStack.context.getAsync(requireStackUrl(baseUrl)),\n },\n\n auth: {\n authenticate: byCaller(authenticate),\n replace: byCaller(replace),\n signOut: byCaller(signOut),\n restoreRetained: byCaller(restoreRetained),\n /** Whether the active stack holds a credential — `restoring` is not one yet. */\n isAuthenticated,\n isAuthenticatedAsync: () => resume().then(isAuthenticated),\n getHeadersAsync: getAuthHeadersAsync,\n },\n },\n };\n};\n","import { ApiError } from '../errors';\nimport { type HttpMethod, isApiError, type MiddlewareFn } from '../fetchClient';\nimport { CREDENTIAL_HEADERS, REDACTED, redactHeaders } from '../internal';\nimport { generateUUID } from '../utils';\n\nconst CORRELATION_ID_HEADER = 'X-Correlation-ID';\n\nconst ALWAYS_REDACTED_HEADERS = [...CREDENTIAL_HEADERS, 'set-cookie'];\n\nconst ALWAYS_REDACTED_QUERY_PARAMS = new Set([\n 'token',\n 'apikey',\n 'api_key',\n 'access_token',\n 'refresh_token',\n 'code',\n 'state',\n 'signature',\n 'sig',\n 'x-amz-signature',\n 'x-amz-credential',\n 'x-amz-security-token',\n 'password',\n 'secret',\n]);\n\nconst getRedactedUrl = (rawUrl: string): string => {\n const url = new URL(rawUrl);\n if (url.username) url.username = REDACTED;\n if (url.password) url.password = REDACTED;\n\n url.searchParams.forEach((_value, key) => {\n if (ALWAYS_REDACTED_QUERY_PARAMS.has(key.toLowerCase())) {\n url.searchParams.set(key, REDACTED);\n }\n });\n return url.toString();\n};\n\n// Returns the request's correlation ID, generating and attaching one if missing.\n//\n// Forwarded via the X-Correlation-ID header so downstream services log the same ID,\n// letting all log lines for a single user action be stitched together across service\n// boundaries. Reuse when the caller already set one (preserves the chain inside a\n// larger trace); otherwise mint a fresh UUID to start a new trace.\nconst ensureCorrelationId = (request: Request): string => {\n const correlationId = request.headers.get(CORRELATION_ID_HEADER) ?? generateUUID();\n request.headers.set(CORRELATION_ID_HEADER, correlationId);\n return correlationId;\n};\n\nconst getRedactedHeaders = (headers: Headers, redacted: string[]): Record<string, string> =>\n redactHeaders(headers, [...ALWAYS_REDACTED_HEADERS, ...redacted]);\n\nexport type RequestLog = {\n url: string;\n headers: Record<string, string>;\n};\n\nexport type ResponseLog = {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n};\n\ntype BaseLog = {\n correlationId: string;\n method: HttpMethod;\n durationMs: number;\n request: RequestLog;\n};\n\ntype SuccessLog = BaseLog & {\n response: ResponseLog;\n};\n\ntype ErrorLog = BaseLog & {\n error: Error;\n};\n\nexport type Log = SuccessLog | ErrorLog;\n\nexport type Logger = {\n info?: (log: SuccessLog) => void;\n error?: (log: ErrorLog) => void;\n};\n\nexport type LogLevel = 'error-only' | 'all';\n\nexport type LoggingOptions = {\n logger?: Logger;\n level?: LogLevel;\n redactHeaders?: string[];\n};\n\nconst getRequestLog = (request: Request, redactedHeaders: string[]): RequestLog => ({\n url: getRedactedUrl(request.url),\n headers: getRedactedHeaders(request.headers, redactedHeaders),\n});\n\nconst getResponseLog = (response: Response, redactedHeaders: string[]): ResponseLog => ({\n status: response.status,\n statusText: response.statusText,\n headers: getRedactedHeaders(response.headers, redactedHeaders),\n});\n\n// On failure the logger receives the thrown error itself. An ApiError masks only credential\n// request headers; its URL, its response headers and the caller's `redactHeaders` are left as\n// sent. Hand the logger a copy with the middleware's full redaction applied; the original error\n// is still thrown untouched.\nconst redactApiError = (error: ApiError, redactedHeaders: string[]): ApiError =>\n new ApiError({\n request: new Request(getRedactedUrl(error.request.url), {\n method: error.request.method,\n headers: getRedactedHeaders(error.request.headers, redactedHeaders),\n }),\n response: new Response(null, {\n status: error.response.status,\n statusText: error.response.statusText,\n headers: getRedactedHeaders(error.response.headers, redactedHeaders),\n }),\n data: error.data,\n });\n\nconst formatLog = (level: 'info' | 'error', log: Log): string => {\n const parts = [`[${level.toUpperCase()}]`, `${Math.round(log.durationMs)}ms`, log.method];\n parts.push(log.request.url);\n if ('response' in log) parts.push(String(log.response.status));\n return parts.join(' ');\n};\n\nconst createSafeLogger = (logger?: Logger, level: LogLevel = 'error-only'): Required<Logger> => {\n return {\n info: (log) => {\n if (level !== 'all') return;\n try {\n if (logger?.info) {\n logger.info(log);\n return;\n }\n\n console.info(formatLog('info', log));\n } catch {\n /* never let logging break the request */\n }\n },\n error: (log) => {\n try {\n if (logger?.error) {\n logger.error(log);\n return;\n }\n\n console.error(formatLog('error', log));\n } catch {\n /* never let logging break the request */\n }\n },\n };\n};\n\nexport const createLoggingMiddleware = (options: LoggingOptions = {}): MiddlewareFn => {\n const safeLogger = createSafeLogger(options.logger, options.level);\n const redactHeaders = options.redactHeaders ?? [];\n\n return (next) => async (fetchRequest) => {\n const correlationId = ensureCorrelationId(fetchRequest.request);\n const start = performance.now();\n const method = fetchRequest.request.method.toLowerCase() as HttpMethod;\n const requestLog = getRequestLog(fetchRequest.request, redactHeaders);\n\n try {\n const result = await next(fetchRequest);\n safeLogger.info({\n correlationId,\n method,\n durationMs: performance.now() - start,\n request: requestLog,\n response: getResponseLog(result.response, redactHeaders),\n });\n return result;\n } catch (error) {\n if (error instanceof Error)\n safeLogger.error({\n correlationId,\n method,\n durationMs: performance.now() - start,\n request: requestLog,\n error: isApiError(error) ? redactApiError(error, redactHeaders) : error,\n });\n\n throw error;\n }\n };\n};\n","import { ApiError } from '../errors';\nimport type { MiddlewareFn } from '../fetchClient';\nimport { HttpStatus } from '../internal';\nimport { delay } from '../utils';\n\nconst DEFAULT_MAX_RETRIES = 5;\nconst DEFAULT_RETRYABLE_STATUSES: number[] = [\n HttpStatus.INTERNAL_SERVER_ERROR,\n HttpStatus.BAD_GATEWAY,\n HttpStatus.SERVICE_UNAVAILABLE,\n HttpStatus.GATEWAY_TIMEOUT,\n];\nconst DEFAULT_BACKOFF_FACTOR = 0.3;\n\nexport type RetryOptions = {\n maxRetries?: number;\n backoffFactor?: number;\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n};\n\nconst defaultShouldRetry = (error: unknown): boolean =>\n error instanceof ApiError && DEFAULT_RETRYABLE_STATUSES.includes(error.response.status);\n\nexport const createRetryMiddleware = (options?: RetryOptions): MiddlewareFn => {\n const {\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffFactor = DEFAULT_BACKOFF_FACTOR,\n shouldRetry = defaultShouldRetry,\n } = options ?? {};\n\n if (!Number.isInteger(maxRetries) || maxRetries < 0) {\n throw new RangeError('maxRetries must be a non-negative integer');\n }\n if (!Number.isFinite(backoffFactor) || backoffFactor < 0) {\n throw new RangeError('backoffFactor must be a finite non-negative number');\n }\n\n return (next) => async (request) => {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await next({ ...request, request: request.request.clone() });\n } catch (error) {\n if (attempt === maxRetries || !shouldRetry(error, attempt)) {\n throw error;\n }\n\n const delayMs = backoffFactor * 1000 * Math.pow(2, attempt);\n await delay(delayMs, request.request.signal ?? undefined);\n }\n }\n\n throw new Error('unreachable');\n };\n};\n","import type { MiddlewareFn } from '../fetchClient';\nimport { KeboolaHttpHeader } from '../internal';\n\n/** Stamps `X-KBC-Ui-Version`; an empty `uiVersion` sends no header. */\nexport const createUiVersionMiddleware = (uiVersion: string | null | undefined): MiddlewareFn => {\n if (!uiVersion) return (next) => next;\n\n return (next) => async (request) => {\n request.request.headers.set(KeboolaHttpHeader.UI_VERSION, uiVersion);\n return next(request);\n };\n};\n","import type { ManagementSessionToken } from '../clients/management/tokenTypes';\n\ntype Options = {\n managementToken: ManagementSessionToken;\n};\n\n/** The admin behind a Manage token: `GET /manage/tokens/verify`, with the admin-level helpers. */\nexport const createAdminAccount = ({ managementToken }: Options) => {\n const { user } = managementToken;\n const adminFeatureSet = new Set(user.features);\n\n const hasAdminFeature = (...feature: string[]) => {\n if (feature.length === 0) return false;\n return feature.every((x) => adminFeatureSet.has(x));\n };\n\n const hasAnyAdminFeature = (...feature: string[]) => feature.some((x) => adminFeatureSet.has(x));\n\n return {\n isSuperAdmin: user.isSuperAdmin,\n hasAdminFeature,\n hasAnyAdminFeature,\n user,\n managementToken,\n };\n};\n\nexport type AdminAccount = ReturnType<typeof createAdminAccount>;\n","import type { DevBranch } from '../clients/storage/branches/types';\nimport { assert } from '../utils';\n\ntype BranchType = 'default' | 'dev';\n\ntype Options = {\n devBranches: DevBranch[];\n};\n\n/**\n * Reads a branch ref — the `default` alias or a branch id — against the project's default branch.\n *\n * - A missing ref is the default branch.\n */\nexport const createBranchRefs = ({ devBranches }: Options) => {\n const defaultBranch = devBranches.find((branch) => branch.isDefault);\n assert(defaultBranch, 'No default branch found for the project.');\n\n const getType = (ref?: string | number): BranchType => {\n if (ref == null || ref === 'default') return 'default';\n return Number(ref) === defaultBranch.id ? 'default' : 'dev';\n };\n\n return {\n defaultId: defaultBranch.id,\n defaultName: defaultBranch.name,\n getType,\n isDev: (ref?: string | number) => getType(ref) === 'dev',\n isDefault: (ref?: string | number) => getType(ref) === 'default',\n resolve: (ref?: string | number) =>\n getType(ref) === 'default' ? defaultBranch.id : Number(ref),\n };\n};\n\nexport type BranchRefs = ReturnType<typeof createBranchRefs>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["assert","createStore","clamp","finiteOr","isPlainObject","Result","Result","createStore","Result","createAuthClient","isUnauthorized","dedupe","createBearerAuthMiddleware","createTagSdk","createSemanticLayerSdk","createKaiMemorySdk","createVaultSdk","ServiceUnavailableError","createVaultClient","createDataScienceClient","createAppsClient","createEncryptionClient","createEditorClient","createSyncActionsClient","createTelemetryClient","createQueryServiceClient","createQueueClient","createChatClient","createAiClient","createOmnisearchClient","createImportClient","createKaiAgentClient","createComponentsMcpClient","createOauthClient","createSchedulerClient","createStreamClient","createNotificationsClient","createBillingClient","createMetastoreClient","KeboolaHttpHeader","createStorageClient","ServiceUnavailableError","z","ServiceId","createStorageClient","createAuthClient","createManagementClient","normalizeBaseUrl","Result","HttpHeader","KeboolaHttpHeader","lazy","CREDENTIAL_HEADERS","REDACTED","generateUUID","redactHeaders","ApiError","isApiError","HttpStatus","ApiError","delay","KeboolaHttpHeader"],"sources":["../src/keboola/errors.ts","../src/utils/assert.ts","../src/utils/ensure.ts","../src/utils/async/coalesce.ts","../src/utils/async/poll/registry.ts","../src/utils/async/queueSeries.ts","../src/utils/deepMerge.ts","../src/utils/persistor/adapters.ts","../src/utils/persistor/persistor.ts","../src/keboola/createMiddlewareFor.ts","../src/keboola/state/auth.ts","../src/keboola/state/stacks.ts","../src/keboola/state/state.ts","../src/keboola/credentials/credentials.ts","../src/serviceClientRegistry/utils.ts","../src/serviceClientRegistry/createServiceClientRegistry.ts","../src/sdks/variables/variablesSdk.ts","../src/keboola/createSdk.ts","../src/keboola/createServiceClients.ts","../src/keboola/perProject.ts","../src/keboola/persistor.ts","../src/domain/stack.ts","../src/keboola/context.ts","../src/keboola/perStack.ts","../src/keboola/keboola.ts","../src/middlewares/loggingMiddleware.ts","../src/middlewares/retryMiddleware.ts","../src/middlewares/uiVersionMiddleware.ts","../src/domain/adminAccount.ts","../src/domain/branchRefs.ts"],"sourcesContent":["/**\n * The single error the keboola client / session throws. It carries a stable `type` (the switchable\n * contract) and a human-readable message derived from that type — no per-call message strings.\n */\nexport const KeboolaErrorType = {\n Unconfigured: 'unconfigured',\n NotAuthenticated: 'not-authenticated',\n SignInEnded: 'sign-in-ended',\n AlreadyAuthenticated: 'already-authenticated',\n NotReady: 'not-ready',\n} as const;\n\nexport type KeboolaErrorType = (typeof KeboolaErrorType)[keyof typeof KeboolaErrorType];\n\nconst MESSAGES: Record<KeboolaErrorType, string> = {\n [KeboolaErrorType.Unconfigured]:\n 'This stack has not been selected — call session.stack.select(baseUrl) first.',\n [KeboolaErrorType.NotAuthenticated]: 'The session is not authenticated — sign in first.',\n [KeboolaErrorType.SignInEnded]:\n 'The sign-in this operation started under has ended — its result belongs to nobody.',\n [KeboolaErrorType.AlreadyAuthenticated]:\n 'This stack is already signed in — sign out or use auth.replace first.',\n [KeboolaErrorType.NotReady]: 'The stack index has not loaded yet.',\n};\n\nexport class KeboolaError extends Error {\n readonly type: KeboolaErrorType;\n\n constructor(type: KeboolaErrorType) {\n super(MESSAGES[type]);\n this.type = type;\n this.name = 'KeboolaError';\n Object.setPrototypeOf(this, KeboolaError.prototype);\n }\n}\n\nexport const isKeboolaError = (error: unknown): error is KeboolaError =>\n error instanceof KeboolaError;\n\n/** Throw a {@link KeboolaError} of `type` when `value` is null/undefined; otherwise narrow it. */\nexport function assert<T>(value: T | null | undefined, type: KeboolaErrorType): asserts value is T {\n if (value == null) throw new KeboolaError(type);\n}\n","export function assert<T>(value: T | undefined | null, message: string): asserts value is T {\n if (value == null) {\n throw new Error(message);\n }\n}\n","/**\n * Read a key, or build its value and keep it.\n *\n * `Map.prototype.getOrInsertComputed` is this natively — swap to it once it clears the app's\n * `baseline-widely-available` build target. Vite transpiles syntax, not methods, so adopting it\n * early fails in the browser rather than at build.\n */\nexport const ensure = <K, V extends NonNullable<unknown>>(\n map: Map<K, V>,\n key: K,\n build: () => V,\n): V => {\n const existing = map.get(key);\n if (existing !== undefined) return existing;\n\n const created = build();\n map.set(key, created);\n\n return created;\n};\n","import type { TaskFn } from './types';\n\n/**\n * Coalesces concurrent triggers onto a single, never-parallel run of `task`.\n *\n * - Triggers fired while a run is busy collapse into one trailing run.\n * - Each trigger resolves with the first run started after it, so it never sees stale state.\n * - The returned promise rejects with whatever `task` throws.\n */\nexport const coalesce = <T>(task: TaskFn<T>): (() => Promise<Awaited<T>>) => {\n let running = false;\n const waiters: PromiseWithResolvers<Awaited<T>>[] = [];\n\n const drain = async () => {\n running = true;\n const batch = waiters.splice(0);\n\n try {\n const result = await task();\n batch.forEach((waiter) => waiter.resolve(result));\n } catch (error) {\n batch.forEach((waiter) => waiter.reject(error));\n }\n // Tail call, so draining mid-run triggers never grows the stack.\n if (waiters.length > 0) return drain();\n running = false;\n };\n\n return () => {\n const waiter = Promise.withResolvers<Awaited<T>>();\n waiters.push(waiter);\n if (!running) void drain();\n return waiter.promise;\n };\n};\n","import { createStore } from '../../store';\n\nimport { emitter, type ObservedPoller, type Poller, type PollSnapshot } from './poll';\nimport { clamp, finiteOr } from './utils';\n\nconst DEFAULT_LIMIT = 50;\n\nexport type PollEntry = {\n /** Monotonic, so a list has a key that outlives a re-render. */\n key: number;\n startedAt: number;\n snapshot: PollSnapshot;\n stop: Poller<unknown>['stop'];\n start: Poller<unknown>['start'];\n};\n\nexport type PollRegistry = {\n list: () => PollEntry[];\n subscribe: (listener: () => void) => () => void;\n clear: () => void;\n stopAll: (reason?: string) => void;\n collect: () => void;\n};\n\nconst isFinished = ({ snapshot }: PollEntry) =>\n snapshot.state !== 'idle' && snapshot.state !== 'requesting' && snapshot.state !== 'polling';\n\nexport const createPollRegistry = ({ limit = DEFAULT_LIMIT } = {}): PollRegistry => {\n const entries = createStore<PollEntry[]>([]);\n const unsubscribes = new Map<number, () => void>();\n\n const maxEntries = clamp(finiteOr(limit, DEFAULT_LIMIT), 1);\n let nextKey = 1;\n\n const forget = (key: number) => {\n unsubscribes.get(key)?.();\n unsubscribes.delete(key);\n };\n\n const trim = (list: PollEntry[]) => {\n let kept = list;\n\n while (kept.length > maxEntries) {\n const dropped = kept.findLast(isFinished) ?? kept.at(-1);\n\n if (!dropped) break;\n\n forget(dropped.key);\n kept = kept.filter((entry) => entry !== dropped);\n }\n\n return kept;\n };\n\n const replace = (key: number, snapshot: PollSnapshot) =>\n entries.set(entries.get().map((entry) => (entry.key === key ? { ...entry, snapshot } : entry)));\n\n const register = (poller: ObservedPoller) => {\n const key = nextKey++;\n const entry: PollEntry = {\n key,\n startedAt: Date.now(),\n snapshot: poller.debug(),\n stop: poller.stop,\n start: poller.start,\n };\n\n unsubscribes.set(\n key,\n poller.subscribe((snapshot) => replace(key, snapshot)),\n );\n entries.set(trim([entry, ...entries.get()]));\n };\n\n const collect = () => {\n emitter.subscribe(register);\n };\n\n return {\n list: entries.get,\n collect,\n subscribe: (listener) => entries.subscribe(() => listener()),\n clear: () => {\n entries.get().forEach(({ key }) => forget(key));\n entries.set([]);\n },\n stopAll: (reason) => entries.get().forEach((entry) => entry.stop(reason)),\n };\n};\n","type Task<T> = () => T | PromiseLike<T>;\n\nconst isPromiseLike = <T>(value: T | PromiseLike<T>): value is PromiseLike<T> =>\n ((typeof value === 'object' && value !== null) || typeof value === 'function') &&\n 'then' in value &&\n typeof value.then === 'function';\n\n/**\n * Queues tasks added over time so a slower earlier task cannot finish after and overwrite a later one.\n * Each `add` returns its task's result; a rejection does not stop the remaining queue.\n */\nexport const queueSeries = () => {\n let tail: Promise<void> | null = null;\n\n const add = <T>(task: Task<T>): Promise<T> => {\n if (tail !== null) {\n const result = tail.then(task);\n tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n let value: T | PromiseLike<T>;\n try {\n value = task();\n } catch (error) {\n return Promise.reject(error);\n }\n\n if (!isPromiseLike(value)) return Promise.resolve(value);\n\n const result = Promise.resolve(value);\n tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n const onIdle = async (): Promise<void> => {\n while (tail !== null) {\n const current = tail;\n await current;\n if (tail === current) {\n tail = null;\n return;\n }\n }\n };\n\n return { add, onIdle };\n};\n","import { isPlainObject } from './isPlainObject';\n\n/**\n * Recursively merge `patch` into `base`. Plain-object values are merged key-by-key; every\n * other value (primitives, arrays, or a type mismatch between the two sides) replaces the\n * base value. `undefined` patch values are skipped, so a partial patch leaves untouched\n * fields alone. Pure — neither argument is mutated; the result preserves `base`'s type.\n */\nexport const deepMerge = <T extends Record<string, unknown>>(\n base: T,\n patch: Record<string, unknown>,\n): T => {\n const out: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n const current = out[key];\n out[key] = isPlainObject(current) && isPlainObject(value) ? deepMerge(current, value) : value;\n }\n\n return out as T;\n};\n","// Minimal key/value contract — the Web Storage shape (`localStorage`/`sessionStorage`) narrowed to\n// what a persistor needs. Framework- and environment-agnostic; a method may answer with a promise.\nexport type StorageAdapter = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n removeItem: (key: string) => void | Promise<void>;\n withLock?: <T>(name: string, task: () => Promise<T>) => Promise<T>;\n};\n\n// Persist nowhere: reads always miss, writes are dropped. The default when no storage is configured,\n// so a persistor is always constructable and simply becomes a no-op.\nexport const createNullStorage = (): StorageAdapter => ({\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n});\n\n// In-process Map, living for the lifetime of the process. The Node default and the fallback the\n// Web Storage adapters degrade to when `localStorage`/`sessionStorage` is unavailable (SSR).\nexport const createMemoryStorage = (): StorageAdapter => {\n const store = new Map<string, string>();\n return {\n getItem: (key) => store.get(key) ?? null,\n setItem: (key, value) => {\n store.set(key, value);\n },\n removeItem: (key) => {\n store.delete(key);\n },\n };\n};\n\n// Wrap a Web Storage instance, degrading to memory when it is absent OR unusable. Merely accessing\n// the global (sandboxed iframe) or calling its methods (privacy mode, disabled/blocked storage) can\n// throw, so a canary write probes real usability at construction; any failure falls back to an\n// in-memory store so persistence never crashes the caller. Resolution happens when the factory is\n// called (not at import), so importing this module never touches browser globals.\nconst createWebStorage = (pick: () => Storage | null): StorageAdapter => {\n let web: Storage | null = null;\n try {\n web = pick();\n if (web) {\n const probe = '__keboola_storage_probe__';\n web.setItem(probe, probe);\n web.removeItem(probe);\n }\n } catch (err) {\n console.warn('createWebStorage: web storage unavailable, falling back to memory', err);\n web = null;\n }\n if (!web) return createMemoryStorage();\n\n const storage = web;\n return {\n getItem: (key) => storage.getItem(key),\n setItem: (key, value) => {\n storage.setItem(key, value);\n },\n removeItem: (key) => {\n storage.removeItem(key);\n },\n withLock: async <T>(name: string, task: () => Promise<T>): Promise<T> => {\n if (typeof navigator === 'undefined' || !('locks' in navigator)) return task();\n return navigator.locks.request(`keboola:${name}`, { mode: 'exclusive' }, task);\n },\n };\n};\n\nexport const createLocalStorage = (): StorageAdapter =>\n createWebStorage(() => ('localStorage' in globalThis ? globalThis.localStorage : null));\n\nexport const createSessionStorage = (): StorageAdapter =>\n createWebStorage(() => ('sessionStorage' in globalThis ? globalThis.sessionStorage : null));\n","import { queueSeries } from '../async';\n\nimport { createNullStorage, type StorageAdapter } from './adapters';\n\n// Structural so this package needs no zod dependency; any schema with `safeParse` fits.\ntype Schema<T> = {\n safeParse: (value: unknown) => { success: true; data: T } | { success: false };\n};\n\nexport type Cell<T> = {\n /**\n * The stored value, `defaultValue` when empty or corrupt. Rejects when the adapter cannot be read:\n * unreadable is not empty, and a caller taking it for empty would write over what is there.\n */\n read: () => Promise<T>;\n write: (value: T) => Promise<void>;\n /** Read, change and write as one step: no other write lands between the read and the write. */\n modify: (change: (current: T) => T) => Promise<void>;\n remove: () => Promise<void>;\n};\n\nexport type Persistor<T> = Cell<T> & {\n // The verbs with the adapter's lock for this key held across `task`; a lock, not a rollback.\n // Not reentrant: pass the cell down rather than nesting. Runs directly without an adapter lock.\n locked: <R>(task: (cell: Cell<T>) => Promise<R>) => Promise<R>;\n};\n\ntype PersistorOptions<T> = {\n storage?: StorageAdapter;\n key: string;\n schema: Schema<T>;\n defaultValue: T;\n encode?: (value: T) => string;\n decode?: (raw: string) => unknown;\n};\n\n// A durable cell over a `StorageAdapter`: one key, encoded on write, validated on read.\n// - Writes run in call order and each resolves once its own write has landed; a failed write\n// rejects and the ones after it still run. `read` waits for every write already queued.\n// - Give schema fields `.default(...)` to patch partial blobs instead of discarding them.\nexport const createPersistor = <T>({\n storage = createNullStorage(),\n key,\n schema,\n defaultValue,\n encode = JSON.stringify,\n decode = JSON.parse,\n}: PersistorOptions<T>): Persistor<T> => {\n const writes = queueSeries();\n\n const _load = async () => {\n const raw = await storage.getItem(key);\n if (raw === null) return { value: defaultValue, corrupt: false };\n\n let decoded: unknown;\n try {\n decoded = decode(raw);\n } catch (err) {\n console.warn(`createPersistor: failed to decode \"${key}\"`, err);\n return { value: defaultValue, corrupt: true };\n }\n\n const parsed = schema.safeParse(decoded);\n return parsed.success\n ? { value: parsed.data, corrupt: false }\n : { value: defaultValue, corrupt: true };\n };\n\n const remove = () => writes.add(() => storage.removeItem(key));\n const write = (value: T) => writes.add(() => storage.setItem(key, encode(value)));\n\n const read = async (): Promise<T> => {\n await writes.onIdle();\n const parsed = await _load();\n if (parsed.corrupt) {\n remove().catch((err: unknown) => {\n console.warn(`createPersistor: failed to drop the corrupt \"${key}\"`, err);\n });\n }\n return parsed.value;\n };\n const modify = (change: (current: T) => T) =>\n writes.add(async () => {\n const parsed = await _load();\n const next = change(parsed.value);\n await storage.setItem(key, encode(next));\n });\n\n const cell: Cell<T> = { read, write, modify, remove };\n\n const locked = <R>(task: (cell: Cell<T>) => Promise<R>): Promise<R> =>\n storage.withLock ? storage.withLock(key, () => task(cell)) : task(cell);\n\n return { ...cell, locked };\n};\n","import type { MiddlewareFn } from '../fetchClient';\n\n/**\n * Service clients reached through the registry — the key is the `clientName`\n * the user accesses them by (e.g. `api.dataScience`), not the `serviceId`.\n */\nexport type ServiceClientName =\n | 'vault'\n | 'dataScience'\n | 'apps'\n | 'encryption'\n | 'editor'\n | 'syncActions'\n | 'telemetry'\n | 'queryService'\n | 'queue'\n | 'chat'\n | 'ai'\n | 'import'\n | 'kaiAgent'\n | 'componentsMcp'\n | 'oauth'\n | 'omnisearch'\n | 'stream'\n | 'notifications'\n | 'scheduler'\n | 'metastore'\n | 'billing';\n\n/** Clients instantiated directly (not stack-discovered), keyed by their property name. */\ntype NonServiceClientName = 'storage' | 'management' | 'auth';\n\nexport type MiddlewareTarget = ServiceClientName | NonServiceClientName;\n\nexport type Middlewares = MiddlewareFn[] | Partial<Record<MiddlewareTarget, MiddlewareFn[]>>;\n\nexport const createMiddlewareFor = (middlewares: Middlewares | undefined) => {\n return (target: MiddlewareTarget, baseline: MiddlewareFn[] = []): MiddlewareFn[] => {\n if (Array.isArray(middlewares)) return [...baseline, ...middlewares];\n\n return [...baseline, ...(middlewares?.[target] ?? [])];\n };\n};\n\nexport type MiddlewareFor = ReturnType<typeof createMiddlewareFor>;\n","import { Result } from '../../utils';\nimport { KeboolaError, KeboolaErrorType } from '../errors';\n\nimport type { Stacks } from './stacks';\nimport type { Auth, BaseUrl, Credential, CredentialInput, Grant, Retained } from './types';\n\nexport type SignOutOptions = {\n /** Keep the grant on the stack for `restoreRetained`; the sign-in still ends. */\n retain?: boolean;\n};\n\n// The part that renews the credential; the access token is never carried over.\nexport const grantOf = (credential: Credential): Grant =>\n credential.type === 'token'\n ? { type: 'token', refreshToken: credential.refreshToken }\n : { type: 'cookie', sessionId: credential.sessionId };\n\n// Stamps the issue time the credential's lifetime is measured from.\nconst stamped = (input: CredentialInput): Credential => ({ ...input, issuedAt: Date.now() });\n\nconst credentialOf = (auth: Auth): Result<Credential> =>\n auth.status === 'authenticated'\n ? Result.success(auth.credential)\n : Result.failure(new KeboolaError(KeboolaErrorType.NotAuthenticated));\n\n/**\n * The stack's credential and its sign-in pin.\n *\n * - `epoch` moves on `authenticate` and `signOut` and never on a rotation, so it is exactly \"which\n * sign-in is this\" — what an in-flight exchange compares itself against.\n */\nexport const createAuth = (stacks: Stacks) => {\n // Stacks whose dead credential was reported; `authenticate` re-arms one, once per sign-in.\n const expired = new Set<BaseUrl>();\n\n // What authorizes a request to this stack; every project under it borrows the same one.\n const requireCredential = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) => credentialOf(stack.auth));\n\n // Nothing signed in yet: `anonymous` or `restoring` pass.\n const requireUnauthenticated = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) =>\n stack.auth.status === 'authenticated'\n ? Result.failure(new KeboolaError(KeboolaErrorType.AlreadyAuthenticated))\n : Result.success(stack),\n );\n\n // Strictly `anonymous`: a restore in flight is refused too, with its own reason.\n const requireAnonymous = (baseUrl: BaseUrl) =>\n Result.andThen(requireUnauthenticated(baseUrl), (stack) =>\n stack.auth.status === 'restoring'\n ? Result.failure(new Error(`Stack \"${baseUrl}\" is already being restored`))\n : Result.success(stack),\n );\n\n const requireRestoring = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) =>\n stack.auth.status === 'restoring'\n ? Result.success(stack)\n : Result.failure(new Error(`Stack \"${baseUrl}\" is not being restored`)),\n );\n\n const startRestore = (baseUrl: BaseUrl) =>\n Result.map(requireAnonymous(baseUrl), (stack) =>\n stacks.set({ ...stack, auth: { status: 'restoring' } }),\n );\n\n // A restore that failed or was abandoned: back to anonymous, no sign-in ended.\n const cancelRestore = (baseUrl: BaseUrl) =>\n Result.map(requireRestoring(baseUrl), (stack) =>\n stacks.set({ ...stack, auth: { status: 'anonymous' } }),\n );\n\n // Completes a restore too: `restoring` is the one non-anonymous phase this accepts.\n const authenticate = (baseUrl: BaseUrl, input: CredentialInput) =>\n Result.map(requireUnauthenticated(baseUrl), (stack) => {\n expired.delete(baseUrl);\n\n return stacks.set({\n ...stack,\n epoch: stack.epoch + 1,\n auth: { status: 'authenticated', credential: stamped(input) },\n retained: null,\n });\n });\n\n const applyRefresh = (baseUrl: BaseUrl, input: CredentialInput) =>\n Result.andThen(requireCredential(baseUrl), (credential) =>\n credential.type !== input.type\n ? Result.failure(new Error(`A ${credential.type} grant cannot become ${input.type}`))\n : Result.map(stacks.get(baseUrl), (stack) =>\n stacks.set({ ...stack, auth: { status: 'authenticated', credential: stamped(input) } }),\n ),\n );\n\n // Backdates the issue time by a full lifetime, so the credential reads as expired right now.\n const forceExpire = (baseUrl: BaseUrl) =>\n Result.andThen(requireCredential(baseUrl), (credential) =>\n Result.map(stacks.get(baseUrl), (stack) =>\n stacks.set({\n ...stack,\n auth: {\n status: 'authenticated',\n credential: { ...credential, issuedAt: Date.now() - credential.expiresIn * 1000 },\n },\n }),\n ),\n );\n\n // Drops the credential; the stack stays, anonymous. With `retain`, the credential's grant moves\n // into the slot instead; a stack with nothing to move keeps what the slot already holds.\n const signOut = (baseUrl: BaseUrl, { retain = false }: SignOutOptions = {}) =>\n Result.map(stacks.get(baseUrl), (stack) => {\n const retained = retain\n ? Result.unwrapOr(\n Result.map(credentialOf(stack.auth), (credential): Retained => ({\n grant: grantOf(credential),\n })),\n stack.retained,\n )\n : null;\n\n return stacks.set({\n ...stack,\n epoch: stack.epoch + 1,\n auth: { status: 'anonymous' },\n retained,\n });\n });\n\n const retain = (baseUrl: BaseUrl, retained: Retained) =>\n Result.map(stacks.get(baseUrl), (stack) => stacks.set({ ...stack, retained }));\n\n const dropRetained = (baseUrl: BaseUrl) =>\n Result.map(stacks.get(baseUrl), (stack) => stacks.set({ ...stack, retained: null }));\n\n const requireRetained = (baseUrl: BaseUrl) =>\n Result.andThen(stacks.get(baseUrl), (stack) =>\n stack.retained\n ? Result.success(stack.retained)\n : Result.failure(new Error(`Stack \"${baseUrl}\" retains no credential`)),\n );\n\n const notifyExpired = (baseUrl: BaseUrl): boolean => {\n if (expired.has(baseUrl)) return false;\n expired.add(baseUrl);\n return true;\n };\n\n const getEpoch = (baseUrl: BaseUrl) => Result.map(stacks.get(baseUrl), (stack) => stack.epoch);\n\n // `null` rather than a failure: an anonymous request goes out without an `Authorization` header.\n const getAccessToken = (baseUrl: BaseUrl): string | null =>\n Result.unwrapOr(\n Result.map(requireCredential(baseUrl), ({ accessToken }) => accessToken),\n null,\n );\n\n return {\n startRestore,\n cancelRestore,\n authenticate,\n applyRefresh,\n forceExpire,\n signOut,\n retain,\n dropRetained,\n requireRetained,\n notifyExpired,\n requireCredential,\n getEpoch,\n getAccessToken,\n };\n};\n","import { Result } from '../../utils';\nimport { KeboolaError, KeboolaErrorType } from '../errors';\n\nimport type { BaseUrl, FetchStatus, Stack, Store } from './types';\n\nexport const newStack = (baseUrl: BaseUrl): Stack => ({\n baseUrl,\n context: 'idle',\n epoch: 0,\n auth: { status: 'anonymous' },\n retained: null,\n});\n\n/** One entry per stack, and the verbs that open and select them. */\nexport const createStacks = (store: Store) => {\n const get = (baseUrl: BaseUrl) => {\n const stack = store.get().stacks[baseUrl];\n return stack\n ? Result.success(stack)\n : Result.failure(new KeboolaError(KeboolaErrorType.Unconfigured));\n };\n const set = (stack: Stack): Stack => {\n const state = store.get();\n store.set({ ...state, stacks: { ...state.stacks, [stack.baseUrl]: stack } });\n return stack;\n };\n\n // --- verbs ---\n\n const ensure = (baseUrl: BaseUrl) => {\n const existing = get(baseUrl);\n if (existing.success) return existing.data;\n return set(newStack(baseUrl));\n };\n\n // The table always names an active row: it starts on one, and rows are never removed.\n const getActive = (): Stack => {\n const { active } = store.get();\n const stack = get(active);\n if (!stack.success) throw new Error(`The active stack has no row: ${active}`);\n return stack.data;\n };\n\n // Re-selecting the active stack is not a change. Without this a component that selects on every\n // render — the backend flow, handed its stack by the server — is notified back into another\n // render, forever.\n const select = (baseUrl: BaseUrl): Stack => {\n const stack = ensure(baseUrl);\n const state = store.get();\n if (state.active !== baseUrl) store.set({ ...state, active: baseUrl });\n return stack;\n };\n\n const updateContext = (baseUrl: BaseUrl, context: FetchStatus) =>\n Result.map(get(baseUrl), (stack) => set({ ...stack, context }));\n\n return { get, set, ensure, getActive, select, updateContext };\n};\n\nexport type Stacks = ReturnType<typeof createStacks>;\n","import { createStore } from '../../utils';\n\nimport { createAuth } from './auth';\nimport { createStacks, newStack } from './stacks';\nimport type { BaseUrl, State } from './types';\n\n/**\n * The stack table and the rules over it, one namespace per concern.\n *\n * - Starts active on its default stack, which is its one row.\n */\nexport const createState = (defaultBaseUrl: BaseUrl) => {\n const store = createStore<State>({\n active: defaultBaseUrl,\n stacks: { [defaultBaseUrl]: newStack(defaultBaseUrl) },\n });\n\n const stacks = createStacks(store);\n const auth = createAuth(stacks);\n\n return { store: store.asReadable(), stacks, auth };\n};\n\nexport type StateApi = ReturnType<typeof createState>;\n","import { createAuthClient } from '../../clients/auth/authClient';\nimport type { MiddlewareFn } from '../../fetchClient';\nimport { dedupe, ensure, Result } from '../../utils';\nimport { KeboolaError, KeboolaErrorType } from '../errors';\nimport type { createSessionPersistor, Locked, PersistedSession } from '../persistor';\nimport { type createState, grantOf, type SignOutOptions } from '../state';\nimport type { BaseUrl, Credential, CredentialInput, Grant, Retained } from '../state/types';\n\nimport { createBearerAuthMiddleware, isUnauthorized } from './middleware';\n\ntype Options = {\n state: ReturnType<typeof createState>;\n persistor: ReturnType<typeof createSessionPersistor>;\n middlewares: MiddlewareFn[];\n refreshThreshold?: number;\n /** Also fires when a refused refresh expires the sign-in. */\n onSignedOut?: (baseUrl: BaseUrl) => void;\n /** A refused refresh, or another tab's sign-out found in storage; never a caller's own `signOut`. */\n onExpired?: (baseUrl: BaseUrl) => void;\n};\n\nconst DEFAULT_REFRESH_THRESHOLD = 0.9;\n\n// A sign-out waits this long for the server session to end before it resolves anyway.\nconst END_SESSION_TIMEOUT_MS = 10_000;\n\n/**\n * What a boot-time restore found.\n *\n * - `expired`: the server refused the refresh token.\n * - `unreachable`: no answer; the stored token is still good — retry, never log in.\n */\nexport type RestoreStatus = 'restored' | 'expired' | 'unreachable' | 'empty';\n\n/** `skipped`: the caller signed this stack in or out before the restore reached it. */\nexport type StackRestore = 'restored' | 'refused' | 'unreachable' | 'skipped';\n\nconst signInEnded = () => new KeboolaError(KeboolaErrorType.SignInEnded);\n\nconst toRestoreStatus = (outcome: StackRestore | undefined): RestoreStatus => {\n if (outcome === undefined || outcome === 'skipped') return 'empty';\n if (outcome === 'refused') return 'expired';\n return outcome;\n};\n\nconst renew = async (\n client: ReturnType<typeof createAuthClient>,\n grant: Grant,\n): Promise<CredentialInput> => {\n if (grant.type === 'cookie') {\n const { accessToken, expiresIn, sessionId } = await client.token.refreshWithSession({\n sessionId: grant.sessionId,\n });\n return { type: 'cookie', accessToken, expiresIn, sessionId };\n }\n\n const { accessToken, expiresIn, refreshToken } = await client.token.refreshWithToken({\n refreshToken: grant.refreshToken,\n });\n if (!refreshToken) throw new KeboolaError(KeboolaErrorType.NotAuthenticated);\n return { type: 'token', accessToken, expiresIn, refreshToken };\n};\n\nexport const createCredentials = ({\n state,\n persistor,\n middlewares,\n refreshThreshold = DEFAULT_REFRESH_THRESHOLD,\n onSignedOut,\n onExpired,\n}: Options) => {\n const rotationMap = new Map<BaseUrl, () => Promise<Result<string>>>();\n\n const markSignIn = (baseUrl: BaseUrl) => {\n const epoch = Result.unwrap(state.auth.getEpoch(baseUrl));\n return () => Result.unwrapOr(state.auth.getEpoch(baseUrl), -1) === epoch;\n };\n\n // No bearer middleware on this client: the cookie refresh is rejected outright if it carries one.\n const refresh = async (baseUrl: BaseUrl, grant: Grant): Promise<Result<CredentialInput>> => {\n const client = createAuthClient({ baseUrl, middlewares });\n const isSameSignIn = markSignIn(baseUrl);\n const refreshed = await Result.tryCatchAsync(() => renew(client, grant));\n return isSameSignIn() ? refreshed : Result.failure(signInEnded());\n };\n\n /**\n * The grant to rotate, or the sign-out another tab stored.\n *\n * - `{ retained }`: the stored sign-in ended; `retained` is what a retained sign-out kept.\n */\n const getGrantForRotation = async (\n store: Locked,\n baseUrl: BaseUrl,\n credential: Credential,\n ): Promise<Result<Grant | { retained: Retained | null }>> => {\n const isSameSignIn = markSignIn(baseUrl);\n const hydrated = await Result.tryCatchAsync(() => store.read());\n if (!hydrated.success) return hydrated;\n if (!isSameSignIn()) return Result.failure(signInEnded());\n\n const persistedStack = hydrated.data.stacks.find((stack) => stack.baseUrl === baseUrl);\n if (persistedStack && persistedStack.credential === null) {\n return Result.success({ retained: persistedStack.retained ?? null });\n }\n return Result.success(persistedStack?.credential ?? grantOf(credential));\n };\n\n const rotateOnce = async (baseUrl: BaseUrl): Promise<Result<string>> =>\n persistor.locked(async (store) => {\n const credential = state.auth.requireCredential(baseUrl);\n if (!credential.success) return credential;\n const grant = await getGrantForRotation(store, baseUrl, credential.data);\n if (!grant.success) return grant;\n // Another tab signed out, so this tab's sign-in is over too; a retained grant is kept.\n if ('retained' in grant.data) {\n await expire(baseUrl, store, grant.data.retained);\n return Result.failure(signInEnded());\n }\n\n const refreshed = await refresh(baseUrl, grant.data);\n if (!refreshed.success) {\n if (isUnauthorized(refreshed.error)) await expire(baseUrl, store);\n return refreshed;\n }\n\n const accessToken = Result.map(\n state.auth.applyRefresh(baseUrl, refreshed.data),\n () => refreshed.data.accessToken,\n );\n await store.persistStack(baseUrl, state.store.get());\n return accessToken;\n });\n\n const rotate = (baseUrl: BaseUrl): Promise<Result<string>> =>\n ensure(rotationMap, baseUrl, () => dedupe(() => rotateOnce(baseUrl)))();\n\n // A cookie grant is dead off the stack's own origin: the browser sends no session cookie there.\n const restoreStack = async (\n baseUrl: BaseUrl,\n grant: Grant,\n retained = false,\n ): Promise<StackRestore> =>\n persistor.locked(async (store) => {\n const session = await store.read();\n const storedStack = session.stacks.find((stack) => stack.baseUrl === baseUrl);\n const latestGrant = retained ? storedStack?.retained?.grant : storedStack?.credential;\n if (storedStack && !latestGrant) return 'skipped';\n\n const restoring = state.auth.startRestore(baseUrl);\n if (!restoring.success) return 'unreachable';\n\n const refreshed = await refresh(baseUrl, latestGrant ?? grant);\n if (!refreshed.success) {\n state.auth.cancelRestore(baseUrl);\n if (isUnauthorized(refreshed.error)) {\n if (retained) state.auth.dropRetained(baseUrl);\n await store.persistStack(baseUrl, state.store.get());\n return 'refused';\n }\n return 'unreachable';\n }\n\n state.auth.authenticate(baseUrl, refreshed.data);\n if (!state.auth.requireCredential(baseUrl).success) return 'unreachable';\n if (retained) state.auth.dropRetained(baseUrl);\n await store.persistStack(baseUrl, state.store.get());\n return 'restored';\n });\n\n // Never writes the scope: `lastActive` is the caller's to select.\n const restore = async (): Promise<{\n lastActive: PersistedSession['current'];\n status: RestoreStatus;\n }> => {\n // An unreadable store is `unreachable`: what it holds is still good, so persistence waits\n // for a sign-in to replace it.\n const hydrated = await persistor\n .locked((store) => store.read())\n .catch((error: unknown) => {\n console.warn('createCredentials: the stored session could not be read', error);\n return null;\n });\n if (hydrated === null) return { lastActive: null, status: 'unreachable' };\n const { stacks, current } = hydrated;\n const scoped = stacks.find(({ baseUrl }) => baseUrl === current?.baseUrl);\n\n const restored = stacks.map(\n async ({ baseUrl, credential, retained }): Promise<StackRestore> => {\n state.stacks.ensure(baseUrl);\n if (!credential && !retained) return 'unreachable';\n if (Result.unwrapOr(state.auth.getEpoch(baseUrl), 0) > 0) return 'skipped';\n // A retained sign-out stays signed out across reloads.\n if (retained) state.auth.retain(baseUrl, retained);\n if (!credential) return 'unreachable';\n return restoreStack(baseUrl, credential);\n },\n );\n\n const results = await Promise.all(restored);\n const scopedOutcome = scoped?.credential ? results[stacks.indexOf(scoped)] : undefined;\n\n return { lastActive: current, status: toRestoreStatus(scopedOutcome) };\n };\n\n const restoreRetained = async (baseUrl: BaseUrl): Promise<StackRestore> => {\n const { grant } = Result.unwrap(state.auth.requireRetained(baseUrl));\n return restoreStack(baseUrl, grant, true);\n };\n\n /**\n * - Drops the rotation, so the next sign-in's requests don't join the dying one.\n * - Writes nothing: the caller persists the stack, under the lock it holds or takes.\n */\n const signOut = (baseUrl: BaseUrl, options?: SignOutOptions) => {\n rotationMap.delete(baseUrl);\n const signedOut = state.auth.signOut(baseUrl, options);\n onSignedOut?.(baseUrl);\n\n return signedOut;\n };\n\n // One expiry per sign-in: the latch re-arms on `authenticate`. `onExpired` fires after the\n // write, so a listener may leave the document at once.\n const expire = async (baseUrl: BaseUrl, store: Locked, retained: Retained | null = null) => {\n if (!state.auth.notifyExpired(baseUrl)) return;\n signOut(baseUrl);\n // What another tab's retained sign-out kept: written back, not wiped.\n if (retained) state.auth.retain(baseUrl, retained);\n await store.persistStack(baseUrl, state.store.get());\n onExpired?.(baseUrl);\n };\n\n // Best-effort: on failure keep the token in hand; a real 401 drives the mandatory rotation.\n const renewIfStale = async (baseUrl: BaseUrl, threshold = refreshThreshold): Promise<void> => {\n const isStale = Result.map(\n state.auth.requireCredential(baseUrl),\n ({ issuedAt, expiresIn }) => Date.now() >= issuedAt + expiresIn * 1000 * threshold,\n );\n if (Result.unwrapOr(isStale, false)) await rotate(baseUrl);\n };\n\n const middleware = (baseUrl: BaseUrl): MiddlewareFn =>\n createBearerAuthMiddleware({\n getAccessToken: async ({ forceRefresh = false } = {}) => {\n if (forceRefresh) {\n // `null`, not a rejection: nothing to rotate, so the caller keeps its original 401.\n if (!state.auth.requireCredential(baseUrl).success) return null;\n return Result.unwrap(await rotate(baseUrl));\n }\n\n await renewIfStale(baseUrl);\n return state.auth.getAccessToken(baseUrl);\n },\n });\n\n /**\n * Ends a signed-out grant's server session: its refresh, derived PATs and paired browser session.\n *\n * 1. `token`: revokes the refresh token; the server also takes the one before the last rotation.\n * 2. `cookie`: renews off the session cookie, then revokes that fresh access token.\n * - Never an access token held from before: one rotation later the server no longer knows it.\n * - Best effort, bounded by `END_SESSION_TIMEOUT_MS`: a failure is logged, the sign-out stands.\n */\n const endSession = async (baseUrl: BaseUrl, grant: Grant) => {\n const client = createAuthClient({ baseUrl, middlewares });\n const signal = AbortSignal.timeout(END_SESSION_TIMEOUT_MS);\n try {\n const body =\n grant.type === 'token'\n ? { token: grant.refreshToken, tokenTypeHint: 'refreshToken' as const }\n : {\n token: (await client.token.refreshWithSession({ sessionId: grant.sessionId }, signal))\n .accessToken,\n tokenTypeHint: 'accessToken' as const,\n };\n await client.token.revoke(body, signal);\n } catch (error) {\n console.warn('createCredentials: the session could not be ended', error);\n }\n };\n\n return { middleware, rotate, renewIfStale, restore, restoreRetained, signOut, endSession };\n};\n","export const isBuiltInProperty = (property: string | symbol) =>\n typeof property === 'symbol' ||\n property === 'then' ||\n property === 'constructor' ||\n property === 'toString' ||\n property === 'valueOf';\n\n/**\n * Creates a dummy client that intercepts method calls and invokes the provided onCall callback.\n */\nexport const createDummyClient = <T extends Record<string, unknown>>({\n onCall,\n}: {\n onCall: (path: string[], args: unknown[]) => void;\n}): T => {\n const createProxy = (path: string[] = []) =>\n new Proxy(() => {}, {\n // Create a new proxy for nested property access\n get: (_target, prop) => {\n // Don't intercept Symbol properties or special methods\n if (isBuiltInProperty(prop)) return undefined;\n return createProxy([...path, prop]);\n },\n // When called as a function, invoke the interceptor\n apply: (_target, _thisArgs, args) => onCall(path, args),\n });\n\n return createProxy() as unknown as T;\n};\n","import { createDummyClient } from './utils';\n\ntype OnUnavailableFn = (info: {\n serviceId: string;\n path: string[];\n args: unknown[];\n clientName: string;\n}) => void;\n\n/**\n * A service's base URL, or a resolver for one that is not known yet — the stack index it comes from\n * may still be in flight. Declared here rather than taken from `fetchClient`, so the registry stays\n * independent of the transport its clients happen to use.\n */\nexport type ServiceUrl = string | (() => Promise<string>);\n\ntype ClientConfig<ServiceId extends string, ClientName extends string> = {\n serviceId: ServiceId;\n clientName: ClientName;\n clientFn: (serviceUrl: ServiceUrl) => unknown;\n};\n\ntype Options<ServiceId extends string> = {\n getServiceBaseUrl: (serviceId: ServiceId) => ServiceUrl | null;\n onUnavailable?: OnUnavailableFn;\n};\n\ntype BuildResult<\n ServiceId extends string,\n ClientName extends string,\n Configs extends ClientConfig<ServiceId, ClientName>[],\n> = {\n client: {\n [Config in Configs[number] as Config['clientName']]: ReturnType<Config['clientFn']>;\n };\n};\n\ntype Registry<\n ServiceId extends string,\n ClientName extends string,\n Configs extends ClientConfig<ServiceId, ClientName>[],\n> = {\n add: <const Config extends ClientConfig<ServiceId, ClientName>>(\n config: Config,\n ) => Registry<ServiceId, ClientName, [...Configs, Config]>;\n build: () => BuildResult<ServiceId, ClientName, Configs>;\n};\n\nexport const createServiceClientRegistry =\n <ServiceId extends string, ClientName extends string = string>() =>\n ({\n getServiceBaseUrl,\n onUnavailable,\n }: Options<ServiceId>): Registry<ServiceId, ClientName, []> => {\n const dummy = (serviceId: string, clientName: string) =>\n createDummyClient({\n onCall: (path, args) => {\n onUnavailable?.({\n serviceId,\n path,\n args,\n clientName,\n });\n },\n });\n\n const configs: ClientConfig<ServiceId, ClientName>[] = [];\n\n const resolveClient = ({\n serviceId,\n clientFn,\n clientName,\n }: ClientConfig<ServiceId, ClientName>) => {\n const serviceBaseUrl = getServiceBaseUrl(serviceId);\n return serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);\n };\n\n type AnyConfig = ClientConfig<ServiceId, ClientName>;\n const registry: Registry<ServiceId, ClientName, AnyConfig[]> = {\n add: (config) => {\n configs.push(config);\n return registry;\n },\n build: () => {\n const clientMap: Record<string, unknown> = {};\n\n configs.forEach((config) => {\n clientMap[config.clientName] = resolveClient(config);\n });\n\n // The dynamically-built map can't be statically proven against the\n // per-config mapped type; the public key safety comes from the fluent\n // `add` chain asserted at the bottom of this factory.\n return { client: clientMap } as BuildResult<ServiceId, ClientName, AnyConfig[]>;\n },\n };\n\n return registry as Registry<ServiceId, ClientName, []>;\n };\n","import type * as storage from '../../clients/storage';\n\nconst VARIABLES_COMPONENT_ID = 'keboola.variables';\n\n// The storage client takes the branch as the string the spec declares.\ntype BranchId = string;\n\ntype VariableDefinition = { name: string; type?: string };\ntype VariableValue = { name: string; value?: unknown };\n\n/** Reference to a `keboola.variables` config + the values row a config points at. */\ntype VariablesRef = { variablesId: string; variablesValuesId: string };\n\ntype Options = {\n storageClient: ReturnType<typeof storage.createStorageClient>;\n};\n\n/** Union the definitions by name; on a name conflict the target's definition is kept. */\nexport const mergeVariableDefinitions = (\n target: VariableDefinition[],\n source: VariableDefinition[],\n): VariableDefinition[] => {\n const targetNames = new Set(target.map((definition) => definition.name));\n\n return [...target, ...source.filter((definition) => !targetNames.has(definition.name))];\n};\n\n/** Add values missing in the target; on a name conflict the value is updated to the source's. */\nexport const mergeVariableValues = (\n target: VariableValue[],\n source: VariableValue[],\n): VariableValue[] => {\n const sourceByName = new Map(source.map((value) => [value.name, value.value]));\n const targetNames = new Set(target.map((value) => value.name));\n\n return [\n ...target.map((value) =>\n sourceByName.has(value.name) ? { ...value, value: sourceByName.get(value.name) } : value,\n ),\n ...source.filter((value) => !targetNames.has(value.name)),\n ];\n};\n\n/**\n * Orchestration for `keboola.variables` configs: copy a config, or merge two configs into a fresh\n * one (union definitions, upsert values — source wins on a name conflict). Each result is a brand\n * new config + values row, so the caller can reference it without sharing lineage with the source.\n */\nexport const createVariablesSdk = ({ storageClient }: Options) => {\n const configs = storageClient.configurations;\n const rows = storageClient.configurationRows;\n\n const readVariables = async (\n configId: string,\n valuesRowId: string | undefined,\n branchId: BranchId,\n ) => {\n const config = await configs.getConfiguration({\n componentId: VARIABLES_COMPONENT_ID,\n configId,\n branchId,\n });\n // variables configs carry a single values row — read the referenced one, or the only one\n const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];\n\n const rawDefinitions = config.configuration?.variables;\n const rawValues = row?.configuration?.values;\n\n // guard the array shape — a non-array from Storage would throw in the merge helpers' .map()\n return {\n definitions: (Array.isArray(rawDefinitions) ? rawDefinitions : []) as VariableDefinition[],\n values: (Array.isArray(rawValues) ? rawValues : []) as VariableValue[],\n };\n };\n\n const createVariables = async (\n definitions: VariableDefinition[],\n values: VariableValue[],\n branchId: BranchId,\n ): Promise<VariablesRef> => {\n const config = await configs.createConfiguration({\n branchId,\n componentId: VARIABLES_COMPONENT_ID,\n name: 'Variables definition',\n configuration: { variables: definitions },\n });\n\n try {\n const row = await rows.createConfigurationRow({\n branchId: String(branchId),\n componentId: VARIABLES_COMPONENT_ID,\n configurationId: config.id,\n name: 'Default values',\n configuration: { values },\n });\n\n return { variablesId: config.id, variablesValuesId: row.id };\n } catch (error) {\n // the values row failed — best-effort drop the orphaned config, but always surface the original error\n await configs\n .deleteConfiguration({\n branchId,\n componentId: VARIABLES_COMPONENT_ID,\n configId: config.id,\n })\n .catch((cleanupError: unknown) => {\n // keep the cleanup failure on the original error rather than letting it mask the real cause\n if (error instanceof Error && error.cause === undefined) {\n error.cause = cleanupError;\n }\n });\n throw error;\n }\n };\n\n return {\n /** Copy a variables config into a fresh, independent config + values row. */\n copy: async ({\n variablesId,\n variablesValuesId,\n branchId = 'default',\n }: {\n variablesId: string;\n variablesValuesId?: string;\n branchId?: BranchId;\n }): Promise<VariablesRef> => {\n const { definitions, values } = await readVariables(variablesId, variablesValuesId, branchId);\n\n return createVariables(definitions, values, branchId);\n },\n\n /** Merge the source's variables into the target's and create a fresh merged config + values row. */\n merge: async ({\n targetVariablesId,\n targetValuesId,\n sourceVariablesId,\n sourceValuesId,\n branchId = 'default',\n }: {\n targetVariablesId: string;\n targetValuesId?: string;\n sourceVariablesId: string;\n sourceValuesId?: string;\n branchId?: BranchId;\n }): Promise<VariablesRef> => {\n const [target, source] = await Promise.all([\n readVariables(targetVariablesId, targetValuesId, branchId),\n readVariables(sourceVariablesId, sourceValuesId, branchId),\n ]);\n\n return createVariables(\n mergeVariableDefinitions(target.definitions, source.definitions),\n mergeVariableValues(target.values, source.values),\n branchId,\n );\n },\n };\n};\n","import type { createStorageClient } from '../clients/storage';\nimport { createKaiMemorySdk } from '../sdks/kaiMemory';\nimport { createSemanticLayerSdk } from '../sdks/semanticLayer';\nimport { createTagSdk } from '../sdks/tag';\nimport { createVariablesSdk } from '../sdks/variables';\nimport { createVaultSdk } from '../sdks/vault';\n\nimport type { createServiceClients } from './createServiceClients';\n\ntype Options = {\n storage: ReturnType<typeof createStorageClient>;\n services: ReturnType<typeof createServiceClients>['client'];\n};\n\nexport const createSdk = ({ storage, services }: Options) => ({\n tag: createTagSdk({ metastoreClient: services.metastore }),\n semanticLayer: createSemanticLayerSdk({ metastoreClient: services.metastore }),\n kaiMemory: createKaiMemorySdk({ metastoreClient: services.metastore }),\n vault: createVaultSdk({ vaultClient: services.vault, encryptionClient: services.encryption }),\n variables: createVariablesSdk({ storageClient: storage }),\n});\n","import { createAiClient } from '../clients/ai';\nimport { createAppsClient } from '../clients/apps';\nimport type { AuthStrategy } from '../clients/auth';\nimport { createBillingClient } from '../clients/billing';\nimport { createChatClient } from '../clients/chat';\nimport { createComponentsMcpClient } from '../clients/componentsMcp';\nimport { createDataScienceClient } from '../clients/dataScience';\nimport { createEditorClient } from '../clients/editor';\nimport { createEncryptionClient } from '../clients/encryption';\nimport { createImportClient } from '../clients/import';\nimport { createKaiAgentClient } from '../clients/kaiAgent';\nimport { createMetastoreClient } from '../clients/metastore';\nimport { createNotificationsClient } from '../clients/notifications';\nimport { createOauthClient } from '../clients/oauth';\nimport { createOmnisearchClient } from '../clients/omnisearch';\nimport { createQueryServiceClient } from '../clients/queryService';\nimport { createQueueClient } from '../clients/queue';\nimport { createSchedulerClient } from '../clients/scheduler';\nimport type { ServiceId } from '../clients/storage/types';\nimport { createStreamClient } from '../clients/stream';\nimport { createSyncActionsClient } from '../clients/syncActions';\nimport { createTelemetryClient } from '../clients/telemetry';\nimport { createVaultClient } from '../clients/vault';\nimport { ServiceUnavailableError } from '../errors';\nimport type { MiddlewareFn } from '../fetchClient';\nimport { createServiceClientRegistry, type ServiceUrl } from '../serviceClientRegistry';\n\nimport { type MiddlewareFor, type ServiceClientName } from './createMiddlewareFor';\n\ntype Options = {\n baseUrl: string;\n auth: AuthStrategy;\n getServiceBaseUrl: (serviceId: ServiceId) => ServiceUrl | null;\n middlewareFor: MiddlewareFor;\n attachTokenMiddleware: MiddlewareFn;\n};\n\n// A service whose URL is still being resolved cannot have a path appended to it as a string.\nconst withPath = (serviceBaseUrl: ServiceUrl, path: string): ServiceUrl =>\n typeof serviceBaseUrl === 'string'\n ? `${serviceBaseUrl}${path}`\n : async () => `${await serviceBaseUrl()}${path}`;\n\nexport const createServiceClients = ({\n baseUrl,\n auth,\n getServiceBaseUrl,\n middlewareFor,\n attachTokenMiddleware,\n}: Options) =>\n createServiceClientRegistry<ServiceId, ServiceClientName>()({\n getServiceBaseUrl,\n onUnavailable: ({ serviceId, path, clientName }) => {\n throw new ServiceUnavailableError(serviceId, path, clientName);\n },\n })\n .add({\n serviceId: 'vault',\n clientName: 'vault',\n clientFn: (serviceBaseUrl) =>\n createVaultClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('vault', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'data-science',\n clientName: 'dataScience',\n clientFn: (serviceBaseUrl) =>\n createDataScienceClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('dataScience', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n // `/v2` App Deployments live on the sandboxes deployment; the `apps.<stack>` host is absent\n // from the service index. At a third prefixed client, give `.add()` a `pathPrefix`.\n serviceId: 'data-science',\n clientName: 'apps',\n clientFn: (serviceBaseUrl) =>\n createAppsClient({\n baseUrl: withPath(serviceBaseUrl, '/v2'),\n middlewares: middlewareFor('apps', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'encryption',\n clientName: 'encryption',\n clientFn: (serviceBaseUrl) =>\n createEncryptionClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('encryption'),\n }),\n })\n .add({\n serviceId: 'editor',\n clientName: 'editor',\n clientFn: (serviceBaseUrl) =>\n createEditorClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('editor', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'sync-actions',\n clientName: 'syncActions',\n clientFn: (serviceBaseUrl) =>\n createSyncActionsClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('syncActions', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'telemetry',\n clientName: 'telemetry',\n clientFn: (serviceBaseUrl) =>\n createTelemetryClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('telemetry', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'query',\n clientName: 'queryService',\n clientFn: (serviceBaseUrl) =>\n createQueryServiceClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('queryService', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'queue',\n clientName: 'queue',\n clientFn: (serviceBaseUrl) =>\n createQueueClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('queue', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'kai-assistant',\n clientName: 'chat',\n clientFn: (serviceBaseUrl) =>\n createChatClient({\n storageApiUrl: baseUrl,\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('chat', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'ai',\n clientName: 'ai',\n clientFn: (serviceBaseUrl) =>\n createAiClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('ai', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n // The ai-service ingress exposes omnisearch under `/omnisearch`, like the `kai-assistant`\n // `/api` override in `domain/stack.ts`.\n serviceId: 'ai',\n clientName: 'omnisearch',\n clientFn: (serviceBaseUrl) =>\n createOmnisearchClient({\n baseUrl: withPath(serviceBaseUrl, '/omnisearch'),\n middlewares: middlewareFor('omnisearch', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'import',\n clientName: 'import',\n clientFn: (serviceBaseUrl) =>\n createImportClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('import', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'kai-agent',\n clientName: 'kaiAgent',\n clientFn: (serviceBaseUrl) =>\n createKaiAgentClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('kaiAgent', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'components-mcp',\n clientName: 'componentsMcp',\n clientFn: (serviceBaseUrl) =>\n createComponentsMcpClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('componentsMcp', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'oauth',\n clientName: 'oauth',\n clientFn: (serviceBaseUrl) =>\n createOauthClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('oauth', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'scheduler',\n clientName: 'scheduler',\n clientFn: (serviceBaseUrl) =>\n createSchedulerClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('scheduler', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'stream',\n clientName: 'stream',\n clientFn: (serviceBaseUrl) =>\n createStreamClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('stream', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'notification',\n clientName: 'notifications',\n clientFn: (serviceBaseUrl) =>\n createNotificationsClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('notifications', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'billing',\n clientName: 'billing',\n clientFn: (serviceBaseUrl) =>\n createBillingClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('billing', [attachTokenMiddleware]),\n auth,\n }),\n })\n .add({\n serviceId: 'metastore',\n clientName: 'metastore',\n clientFn: (serviceBaseUrl) =>\n createMetastoreClient({\n baseUrl: serviceBaseUrl,\n middlewares: middlewareFor('metastore', [attachTokenMiddleware]),\n auth,\n }),\n })\n .build();\n","import type { AuthStrategy } from '../clients/auth';\nimport { createStorageClient } from '../clients/storage';\nimport type { ServiceId } from '../clients/storage/types';\nimport { ServiceUnavailableError } from '../errors';\nimport type { MiddlewareFn } from '../fetchClient';\nimport { KeboolaHttpHeader } from '../internal';\nimport { isBuiltInProperty } from '../serviceClientRegistry';\nimport { ensure, Result } from '../utils';\n\nimport type { BaseUrl } from './state/types';\nimport type { createMiddlewareFor } from './createMiddlewareFor';\nimport { createSdk } from './createSdk';\nimport { createServiceClients } from './createServiceClients';\nimport type { createCredentials } from './credentials';\nimport { KeboolaError, KeboolaErrorType } from './errors';\nimport type { PerStack } from './perStack';\nimport type { StateApi } from './state';\nimport type { ProjectApi } from './types';\n\nexport type ProjectId = number;\n\n/** A project: addressed only inside its own stack, whose credential it borrows via a header. */\nexport type ProjectAddress = { baseUrl: BaseUrl; projectId: ProjectId };\n\n// A project id is unique only within its stack.\ntype ProjectKey = `${BaseUrl}#${ProjectId}`;\n\nconst projectKey = ({ baseUrl, projectId }: ProjectAddress): ProjectKey =>\n `${baseUrl}#${projectId}`;\n\ntype ServiceClients = ReturnType<typeof createServiceClients>['client'];\n\ntype Options = {\n state: StateApi;\n credentials: ReturnType<typeof createCredentials>;\n middlewareFor: ReturnType<typeof createMiddlewareFor>;\n stack: PerStack;\n};\n\n/**\n * One handle per project, and the one call that drops it.\n *\n * Every client belongs to the credential that built it — a client set carries its middleware\n * chain — so the handle dies with the sign-in, and `forgetUnder` is the only thing that ends one.\n */\nexport const createPerProject = ({ state, credentials, middlewareFor, stack }: Options) => {\n // The project-id header outside the auth middleware, so it is set before the 401 replay clones\n // the request.\n const attachFor = ({ baseUrl, projectId }: ProjectAddress): MiddlewareFn => {\n const withProjectId: MiddlewareFn = (next) => (request) => {\n request.request.headers.set(KeboolaHttpHeader.PROJECT_ID, String(projectId));\n return next(request);\n };\n\n return (next) => withProjectId(credentials.middleware(baseUrl)(next));\n };\n\n // No static header: the auth middleware stamps the live token, so this never reaches the wire.\n const authFor = ({ projectId }: ProjectAddress): AuthStrategy => ({\n type: 'bearer',\n token: '',\n projectId,\n });\n\n /**\n * One project's surface: the stack's fields from `perStack`, the rest built for the project.\n *\n * - Checked per property read but `baseUrl`: `SignInEnded` once the sign-in it was built under\n * ends, and `NotAuthenticated` before one lands.\n */\n const build = (project: ProjectAddress) => {\n let isLive = true;\n const attach = attachFor(project);\n const storage = createStorageClient({\n baseUrl: project.baseUrl,\n auth: authFor(project),\n middlewares: middlewareFor('storage', [attach]),\n });\n const { client } = createServiceClients({\n baseUrl: project.baseUrl,\n auth: authFor(project),\n // A resolver rather than a URL: the first request awaits the stack index if it is still in\n // flight.\n getServiceBaseUrl: (serviceId: ServiceId) => async () => {\n const serviceUrl = (await stack.context.getAsync(project.baseUrl)).getServiceUrl(serviceId);\n if (!serviceUrl) throw new ServiceUnavailableError(serviceId);\n\n return serviceUrl;\n },\n middlewareFor,\n attachTokenMiddleware: attach,\n });\n const sdk = createSdk({ storage, services: client });\n\n const api = new Proxy({} as ProjectApi, {\n get: (_target, property) => {\n if (isBuiltInProperty(property)) return undefined;\n // The address needs no sign-in: a query key names the project before one lands.\n if (property === 'baseUrl') return project.baseUrl;\n\n if (!isLive) throw new KeboolaError(KeboolaErrorType.SignInEnded);\n Result.unwrap(state.auth.requireCredential(project.baseUrl));\n\n if (property === 'stack' || property === 'auth' || property === 'management') {\n return stack.get(project.baseUrl)[property];\n }\n if (property === 'storage') return storage;\n if (property === 'sdk') return sdk;\n\n return client[property as keyof ServiceClients];\n },\n });\n\n return {\n api,\n end: () => {\n isLive = false;\n },\n };\n };\n\n const derived = new Map<ProjectKey, ReturnType<typeof build>>();\n\n const get = (project: ProjectAddress): ProjectApi =>\n ensure(derived, projectKey(project), () => build(project)).api;\n\n const forgetUnder = (baseUrl: BaseUrl) => {\n for (const [key, record] of derived) {\n if (!key.startsWith(`${baseUrl}#`)) continue;\n record.end();\n derived.delete(key);\n }\n };\n\n return { get, forgetUnder };\n};\n","import * as z from 'zod';\n\nimport { type Cell, createPersistor } from '../utils/persistor';\n\nimport type { BaseUrl, Stack } from './state/types';\nimport { grantOf, type State } from './state';\nimport type { StorageAdapter } from './types';\n\n/**\n * Where a bearer session is persisted, under whichever adapter the client was given.\n *\n * Exported because a consumer sometimes has to drop a session a client cannot reach: the adapter is\n * chosen at construction, so a client built without one holds no handle to the storage its own\n * session is sitting in.\n */\nexport const SESSION_STORAGE_KEY = 'keboola:session';\n\n/**\n * What survives a reload, per grant type.\n *\n * - Written under `credential`: the key every blob already stored carries.\n *\n * - `token`: the refresh token. It rotates, is single-use and is server-revocable, so a leaked\n * snapshot has limited and revocable value. The access token is never written.\n * - `cookie`: the session id. The session cookie is the durable half and the browser keeps it;\n * the id alone renews nothing.\n */\nconst persistedGrantSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('token'), refreshToken: z.string() }),\n z.object({ type: z.literal('cookie'), sessionId: z.string() }),\n]);\n\nconst persistedStackSchema = z.object({\n baseUrl: z.string(),\n // A kind this build does not know costs that stack its sign-in, not the whole table.\n credential: persistedGrantSchema.nullable().catch(null),\n retained: z.object({ grant: persistedGrantSchema }).nullable().default(null).catch(null),\n /**\n * Written empty, never read.\n * - An older build parses a stack without it as corrupt, and signs out.\n */\n projects: z.array(z.unknown()),\n});\n\nconst persistedSessionSchema = z.object({\n current: z\n .object({\n baseUrl: z.string(),\n /**\n * Written `null`, never read: the project is the app's to keep.\n * - An older build parses a `current` without it as corrupt, and signs out.\n */\n projectId: z.number().nullable(),\n })\n .nullable(),\n stacks: z.array(persistedStackSchema),\n});\n\nexport type PersistedSession = z.infer<typeof persistedSessionSchema>;\ntype PersistedStack = z.infer<typeof persistedStackSchema>;\n\nconst EMPTY_PERSISTED_SESSION: PersistedSession = { current: null, stacks: [] };\n\nconst grantsOf = (stack: Stack): Pick<PersistedStack, 'credential' | 'retained'> => ({\n credential: stack.auth.status === 'authenticated' ? grantOf(stack.auth.credential) : null,\n retained: stack.retained,\n});\n\n/**\n * The stored session, rewritten from the table except for the grants.\n *\n * - Scope and stack list come from memory.\n * - `credential` and `retained` stay as stored: a grant another document rotated must not be put\n * back by a snapshot of this one's older table.\n */\nconst mergeSnapshot = (stored: PersistedSession, { active, stacks }: State): PersistedSession => ({\n current: { baseUrl: active, projectId: null },\n stacks: Object.values(stacks).map(({ baseUrl }) => {\n const kept = stored.stacks.find((stack) => stack.baseUrl === baseUrl);\n return {\n baseUrl,\n credential: kept?.credential ?? null,\n retained: kept?.retained ?? null,\n projects: [],\n };\n }),\n});\n\nconst upsertStack = (stored: PersistedSession, row: PersistedStack): PersistedSession => {\n const index = stored.stacks.findIndex((stack) => stack.baseUrl === row.baseUrl);\n const stacks = [...stored.stacks];\n if (index < 0) stacks.push(row);\n else stacks[index] = row;\n return { ...stored, stacks };\n};\n\n/** What a caller may do while it holds the session lock. */\nexport type Locked = {\n read: () => Promise<PersistedSession>;\n /** One stack's grants as the table holds them. */\n persistStack: (baseUrl: BaseUrl, state: State) => Promise<void>;\n};\n\n/**\n * The stored session, reached in two ways.\n *\n * - `locked`: the only way to read, and the only way to a grant write. Rotation and restore hold\n * it across the refresh; sign-in, sign-out and the boot restore open it for one step.\n * - `snapshot`: the table minus its grants, under the lock, coalesced; what the store subscription\n * feeds, and what a scope change awaits before the document leaves.\n */\nexport const createSessionPersistor = (storage?: StorageAdapter) => {\n const persistor = createPersistor<PersistedSession>({\n storage,\n key: SESSION_STORAGE_KEY,\n schema: persistedSessionSchema,\n defaultValue: EMPTY_PERSISTED_SESSION,\n });\n\n const persistStack = (\n cell: Cell<PersistedSession>,\n baseUrl: BaseUrl,\n { stacks }: State,\n ): Promise<void> => {\n const stack: Stack | undefined = stacks[baseUrl];\n if (stack === undefined) return Promise.resolve();\n\n return cell.modify((stored) =>\n upsertStack(stored, { baseUrl, ...grantsOf(stack), projects: [] }),\n );\n };\n\n const locked = <R>(task: (store: Locked) => Promise<R>): Promise<R> =>\n persistor.locked((cell) =>\n task({\n read: cell.read,\n persistStack: (baseUrl, state) => persistStack(cell, baseUrl, state),\n }),\n );\n\n let latest: State | null = null;\n let pending: Promise<void> | null = null;\n // Resolves once a write holding `state` (or a later one) has landed; calls made while a write\n // waits for the lock share it.\n const snapshot = (state: State): Promise<void> => {\n latest = state;\n if (pending) return pending;\n const write = persistor.locked((cell) => {\n pending = null;\n const table = latest ?? state;\n return cell.modify((stored) => mergeSnapshot(stored, table));\n });\n pending = write;\n return write;\n };\n\n return { locked, snapshot };\n};\n","import type { StackInfo } from '../clients/storage/types';\nimport { ServiceId } from '../constants/serviceIds';\n\nexport type ServiceUrls = Partial<Record<ServiceId, (url: string) => string | undefined | null>>;\n\nconst isServiceId = (id: string): id is ServiceId => Object.values<string>(ServiceId).includes(id);\n\nconst SERVICE_URL_OVERRIDES: ServiceUrls = {\n // The advertised Kai Assistant URL lacks the `/api` suffix.\n 'kai-assistant': (url) => `${url}/api`,\n};\n\ntype Options = {\n stackInfo: StackInfo;\n clientServiceUrls?: ServiceUrls;\n};\n\nexport type Stack = ReturnType<typeof createStack>;\n\nexport const createStack = ({ stackInfo, clientServiceUrls }: Options) => {\n const { services, components, features, ...infoRest } = stackInfo;\n\n const serviceMap = new Map(\n services.map((service) => {\n if (!isServiceId(service.id)) return [service.id, service.url];\n const devOverride = clientServiceUrls?.[service.id]?.(service.url);\n const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);\n const url = devOverride ?? prodOverride ?? service.url;\n return [service.id, url];\n }),\n );\n\n const componentMap = new Map(components.map((component) => [component.id, component]));\n const featureSet = new Set(features);\n\n const hasFeature = (...feature: string[]) => {\n if (feature.length === 0) return false;\n return feature.every((x) => featureSet.has(x));\n };\n\n const hasComponent = (...componentId: string[]) => {\n if (componentId.length === 0) return false;\n return componentId.every((x) => componentMap.has(x));\n };\n\n const getComponent = (componentId: string) => componentMap.get(componentId) ?? null;\n\n const hasService = (serviceId: ServiceId) => serviceMap.has(serviceId);\n\n const getServiceUrl = (serviceId: ServiceId) => serviceMap.get(serviceId) ?? null;\n\n return {\n ...infoRest,\n services,\n features,\n components,\n hasFeature,\n getServiceUrl,\n hasService,\n getComponent,\n hasComponent,\n };\n};\n","import { createStorageClient } from '../clients/storage';\nimport { createStack, type ServiceUrls, type Stack } from '../domain/stack';\n\nimport type { BaseUrl, State } from './state/types';\nimport type { StateApi } from './state';\n\nconst STACK_INDEX_TIMEOUT_MS = 30_000;\n\ntype Settled = { status: 'ready'; value: Stack } | { status: 'errored'; error: unknown };\ntype Entry = { status: 'pending'; settled: Promise<Settled> } | Settled;\n\ntype Options = {\n state: StateApi;\n clientServiceUrls?: ServiceUrls;\n};\n\n/**\n * One parsed stack index per stack; `createStack` applies the dev and production overrides.\n *\n * - One fetch per stack: concurrent askers share it, a landed index is never refetched.\n * - A failure is held until a retry; nothing here needs a rejection handler.\n * - Every status change is copied onto the stack's row, for the consumers that render it.\n */\nexport const createStackContext = ({ state, clientServiceUrls }: Options) => {\n const entries = new Map<BaseUrl, Entry>();\n\n const set = (baseUrl: BaseUrl, entry: Entry) => {\n entries.set(baseUrl, entry);\n state.stacks.updateContext(baseUrl, entry.status);\n };\n\n const fetchStack = async (baseUrl: BaseUrl) => {\n const stackInfo = await createStorageClient({\n baseUrl,\n auth: { type: 'sapi-token', token: '' },\n }).getStackInfo({ exclude: 'componentDetails' }, AbortSignal.timeout(STACK_INDEX_TIMEOUT_MS));\n return createStack({ stackInfo, clientServiceUrls });\n };\n\n const run = (baseUrl: BaseUrl): Entry => {\n const settle = (next: Settled): Settled => {\n set(baseUrl, next);\n return next;\n };\n\n const entry: Entry = {\n status: 'pending',\n settled: fetchStack(baseUrl).then(\n (value) => settle({ status: 'ready', value }),\n (error: unknown) => settle({ status: 'errored', error }),\n ),\n };\n\n set(baseUrl, entry);\n return entry;\n };\n\n const get = (baseUrl: BaseUrl): Stack | null => {\n const entry = entries.get(baseUrl);\n return entry?.status === 'ready' ? entry.value : null;\n };\n\n const getAsync = async (baseUrl: BaseUrl): Promise<Stack> => {\n const cached = entries.get(baseUrl);\n const entry = cached === undefined || cached.status === 'errored' ? run(baseUrl) : cached;\n const settled = entry.status === 'pending' ? await entry.settled : entry;\n\n if (settled.status === 'errored') throw settled.error;\n return settled.value;\n };\n\n const subscriber = ({ stacks }: State) => {\n for (const { baseUrl } of Object.values(stacks)) if (!entries.has(baseUrl)) run(baseUrl);\n };\n\n return { subscriber, get, getAsync };\n};\n","import { createAuthClient } from '../clients/auth/authClient';\nimport { createManagementClient } from '../clients/management';\nimport { ensure } from '../utils';\n\nimport type { BaseUrl } from './state/types';\nimport { createStackContext } from './context';\nimport type { createMiddlewareFor } from './createMiddlewareFor';\nimport type { createCredentials } from './credentials';\nimport { assert, KeboolaErrorType } from './errors';\nimport type { StateApi } from './state';\nimport type { KeboolaOptions, StackApi } from './types';\n\ntype Options = {\n state: StateApi;\n credentials: ReturnType<typeof createCredentials>;\n middlewareFor: ReturnType<typeof createMiddlewareFor>;\n clientServiceUrls?: KeboolaOptions['clientServiceUrls'];\n};\n\n/**\n * Everything one stack derives.\n *\n * Outlives a sign-out, unlike anything in `perProject`: both clients read the credential live per\n * request, so neither belongs to one sign-in, and the stack index is public.\n */\nexport const createPerStack = ({\n state,\n credentials,\n middlewareFor,\n clientServiceUrls,\n}: Options) => {\n const context = createStackContext({ state, clientServiceUrls });\n const derived = new Map<BaseUrl, StackApi>();\n\n const get = (baseUrl: BaseUrl): StackApi =>\n ensure(derived, baseUrl, () => ({\n baseUrl,\n // `NotReady` until the stack index lands.\n get stack() {\n const parsed = context.get(baseUrl);\n assert(parsed, KeboolaErrorType.NotReady);\n return parsed;\n },\n auth: createAuthClient({\n baseUrl,\n middlewares: middlewareFor('auth', [credentials.middleware(baseUrl)]),\n }),\n management: createManagementClient({\n baseUrl,\n auth: { type: 'bearer', token: '' },\n middlewares: middlewareFor('management', [credentials.middleware(baseUrl)]),\n }),\n }));\n\n return { context, get };\n};\n\nexport type PerStack = ReturnType<typeof createPerStack>;\n","import { HttpHeader, normalizeBaseUrl } from '../fetchClient';\nimport { KeboolaHttpHeader } from '../internal';\nimport { lazy, Result } from '../utils';\n\nimport type {\n BaseUrl,\n CredentialInput,\n Grant,\n Stack,\n State,\n TokenCredentialInput,\n} from './state/types';\nimport { createMiddlewareFor } from './createMiddlewareFor';\nimport { createCredentials, type RestoreStatus } from './credentials';\nimport { KeboolaError, KeboolaErrorType } from './errors';\nimport { createPerProject, type ProjectAddress, type ProjectId } from './perProject';\nimport { createSessionPersistor } from './persistor';\nimport { createPerStack } from './perStack';\nimport { createState, grantOf, type SignOutOptions } from './state';\nimport type { KeboolaOptions, ProjectApi, StackApi } from './types';\n\n/**\n * The bearer client: the session table, its two scopes, and the surface they back.\n *\n * - Credential-derived state is owned by the scope whose end ends it (`perStack`, `perProject`).\n */\nexport const createKeboola = ({\n defaultBaseUrl,\n storage,\n middlewares,\n clientServiceUrls,\n onExpired,\n}: KeboolaOptions) => {\n const state = createState(normalizeBaseUrl(defaultBaseUrl));\n const persistor = createSessionPersistor(storage);\n const middlewareFor = createMiddlewareFor(middlewares);\n const credentials = createCredentials({\n state,\n persistor,\n middlewares: middlewareFor('auth'),\n // Read at call time, so it reaches the `perProject` built below.\n onSignedOut: (baseUrl) => perProject.forgetUnder(baseUrl),\n onExpired,\n });\n\n const perStack = createPerStack({ state, credentials, middlewareFor, clientServiceUrls });\n const perProject = createPerProject({ state, credentials, middlewareFor, stack: perStack });\n\n state.store.subscribe(perStack.context.subscriber);\n // The default stack is in the table from the start, so no change announces it.\n perStack.context.subscriber(state.store.get());\n\n const selectStack = (baseUrl: string): Stack => state.stacks.select(normalizeBaseUrl(baseUrl));\n\n /** The active stack, or a named one — normalised to key like `select`. */\n const requireStackUrl = (baseUrl?: string): BaseUrl =>\n baseUrl === undefined ? state.stacks.getActive().baseUrl : normalizeBaseUrl(baseUrl);\n\n /** A project id is unique only within its stack: it always names one on the active stack. */\n const onActiveStack = (projectId: ProjectId): ProjectAddress => ({\n baseUrl: requireStackUrl(),\n projectId,\n });\n\n /**\n * Auth headers for a non-fetch transport (the chat stream), renewed first once near expiry.\n *\n * - `refreshThreshold` renews earlier: the share of the token's lifetime it may have used.\n * - No middleware recovers a 401 there.\n * - Pinned to the stack active at the call: a stack switch mid-renewal does not re-point it.\n * - Throws `NotAuthenticated` if that stack signed out meanwhile.\n */\n const getAuthHeadersAsync = async (\n projectId: ProjectId,\n { refreshThreshold }: { refreshThreshold?: number } = {},\n ): Promise<Record<string, string>> => {\n const { baseUrl } = onActiveStack(projectId);\n await credentials.renewIfStale(baseUrl, refreshThreshold);\n\n const credential = Result.unwrap(state.auth.requireCredential(baseUrl));\n return {\n [HttpHeader.AUTHORIZATION]: `Bearer ${credential.accessToken}`,\n [KeboolaHttpHeader.PROJECT_ID]: String(projectId),\n };\n };\n\n /**\n * A login or MFA-verify response, taken as the credential it carries.\n *\n * - Either grant type: the credential names what renews it (`refreshToken` or `sessionId`).\n * - `refreshToken` is optional: a browser-mode login omits it, and MFA verify can't tell.\n * - A `token` credential without one is refused here — it would die at its first refresh.\n */\n type AuthenticateInput =\n | (Omit<TokenCredentialInput, 'refreshToken'> & { refreshToken?: string | null })\n | Exclude<CredentialInput, { type: 'token' }>;\n\n const toCredential = (input: AuthenticateInput): CredentialInput => {\n if (input.type !== 'token') return input;\n\n const { refreshToken } = input;\n if (!refreshToken) throw new KeboolaError(KeboolaErrorType.NotAuthenticated);\n return { ...input, refreshToken };\n };\n\n const authenticate = (input: AuthenticateInput): Stack => {\n const { baseUrl } = state.stacks.getActive();\n const signedIn = Result.unwrap(state.auth.authenticate(baseUrl, toCredential(input)));\n persistor\n .locked((store) => store.persistStack(baseUrl, state.store.get()))\n .catch((error: unknown) => {\n console.warn('createKeboola: the sign-in could not be stored', error);\n });\n return signedIn;\n };\n\n // Getters: each read resolves against the stack active at that moment.\n const active = () => perStack.get(state.stacks.getActive().baseUrl);\n const stackApi: StackApi = {\n get baseUrl() {\n return active().baseUrl;\n },\n get stack() {\n return active().stack;\n },\n get auth() {\n return active().auth;\n },\n get management() {\n return active().management;\n },\n };\n\n const projectApi = (projectId: ProjectId): ProjectApi => perProject.get(onActiveStack(projectId));\n\n /**\n * The scope's sign-in, or a named stack's — and everything that sign-in derived.\n *\n * - Ends the server session too (`credentials.endSession`).\n * - `retain` keeps the grant on the stack, persisted beside the sign-in it ended, for\n * `restoreRetained`, and so leaves the server session live; the next sign-in replaces it.\n * - The table is signed out on return; the promise resolves once that is stored and the\n * session's end was attempted, so a caller leaving the document waits for both.\n */\n const signOut = ({\n baseUrl,\n ...options\n }: SignOutOptions & { baseUrl?: string } = {}): Promise<Stack> =>\n endSignIn(requireStackUrl(baseUrl), options, !options.retain);\n\n // Sessions being ended, per stack: a later sign-out there (a double click) waits for it too.\n const endingSessions = new Map<BaseUrl, Promise<void>>();\n\n /** `signOut`; `endSession: false` leaves the server session alone. */\n const endSignIn = (\n target: BaseUrl,\n options: SignOutOptions,\n endSession: boolean,\n ): Promise<Stack> => {\n // Read before the sign-out drops it.\n const held = endSession ? Result.unwrapOr(state.auth.requireCredential(target), null) : null;\n\n // Teardown rides `credentials.signOut`: an expiry skips this path.\n const signedOut = Result.unwrap(credentials.signOut(target, options));\n // The grant to revoke: another tab may have rotated it, so a stored one is the newest.\n // - A stored `null` proves nothing: a sign-in's write can still be queued behind it.\n // - Revoke is idempotent, so ending an ended session costs one logged 401.\n let newest: Grant | null = held && grantOf(held);\n const ended = persistor\n .locked(async (store) => {\n if (held !== null) {\n const stored = (await store.read()).stacks.find((stack) => stack.baseUrl === target);\n newest = stored?.credential ?? newest;\n }\n await store.persistStack(target, state.store.get());\n })\n .then(\n () => (newest ? credentials.endSession(target, newest) : undefined),\n // The sign-out is in memory but not stored; the session still ends, or no retry could.\n async (error: unknown) => {\n if (newest) await credentials.endSession(target, newest);\n throw error;\n },\n );\n\n const earlier = endingSessions.get(target);\n if (held !== null) {\n endingSessions.set(target, ended);\n const forget = () => {\n if (endingSessions.get(target) === ended) endingSessions.delete(target);\n };\n ended.then(forget, forget);\n }\n return Promise.all([ended, earlier]).then(() => signedOut);\n };\n\n /** Signs a stack back in from what a retained sign-out kept; `unreachable` leaves it to retry. */\n const restoreRetained = (baseUrl: string) =>\n credentials.restoreRetained(normalizeBaseUrl(baseUrl));\n\n /**\n * `input` replaces the active stack's sign-in, whatever it holds.\n *\n * - Signs out first, always: a sign-out moves the epoch even on an anonymous stack, so a stored\n * session still being restored cannot land on top of this one.\n * - Locally only: the replaced sign-in can share a browser session with `input`.\n */\n const replace = (input: AuthenticateInput): Stack => {\n // A failure here is the replaced sign-in's, or an earlier sign-out's this one waited for.\n endSignIn(requireStackUrl(), {}, false).catch((error: unknown) => {\n console.warn('createKeboola: the replaced sign-in could not be stored', error);\n });\n return authenticate(input);\n };\n\n let persisting = false;\n /**\n * Persistence starts only once the restore has settled.\n *\n * - Mid-hydration an unexchanged stack is `anonymous`; the persistor would erase the\n * refresh token the exchange is about to spend.\n * - Writes the settled table once: the subscription fires only on the next change.\n */\n const enablePersistence = () => {\n // A failed resume is retried, and each attempt lands here again.\n if (persisting) return;\n persisting = true;\n\n snapshot(state.store.get());\n state.store.subscribe(snapshot);\n };\n\n const snapshot = (table: State): void => {\n persistor.snapshot(table).catch((error: unknown) => {\n console.warn('createKeboola: the session could not be stored', error);\n });\n };\n\n // What a scope change resolves with: its write, once persistence has started; nothing before.\n const persistScope = (): Promise<void> =>\n persisting ? persistor.snapshot(state.store.get()) : Promise.resolve();\n\n /**\n * The same, deferred until a sign-in.\n *\n * - After an unreachable restore the table is anonymous but the stored token is still good;\n * writing earlier would drop it.\n */\n const enablePersistenceOnSignIn = () => {\n const stop = state.store.subscribe((next) => {\n if (!Object.values(next.stacks).some(({ auth }) => auth.status === 'authenticated')) return;\n\n stop();\n enablePersistence();\n });\n };\n\n // Rebuilds the stored stacks and credentials; `lastActive` is the scope they were stored under,\n // `null` only when nothing was.\n const restore = lazy(() =>\n credentials.restore().then(\n (restored) => {\n if (restored.status === 'unreachable') enablePersistenceOnSignIn();\n else enablePersistence();\n\n return restored;\n },\n (error: unknown) => {\n // Not `enablePersistence`: writing the half-restored table now would erase the very session\n // the retry `lazy` allows is meant to read.\n enablePersistenceOnSignIn();\n throw error;\n },\n ),\n );\n\n const getActiveStack = state.stacks.getActive;\n\n const isAuthenticated = () => getActiveStack().auth.status === 'authenticated';\n\n /**\n * Picks up where the stored session left off, once.\n *\n * 1. The stored stack becomes active again.\n * 2. Nothing stored, or the restore failed: `defaultBaseUrl` stays active; a failure rethrows.\n * 3. The caller got there first (a select, sign-in or sign-out): its scope and sign-ins stand.\n *\n * - Resolves with the stored credential's fate — only this tells `expired` from `empty`.\n * - Other stacks still come back, persistence still starts; repeat calls share one promise.\n */\n const resume = lazy(() =>\n restore().then(({ lastActive, status }): RestoreStatus => {\n if (lastActive && !callerScoped) selectStack(lastActive.baseUrl);\n\n return status;\n }),\n );\n\n // Set by the public verbs that pick a scope or change a sign-in — the default the table starts on,\n // the resume's own re-scope and the restore's sign-ins are not a caller's choice.\n let callerScoped = false;\n const byCaller =\n <A extends unknown[], R>(verb: (...args: A) => R) =>\n (...args: A): R => {\n callerScoped = true;\n return verb(...args);\n };\n\n return {\n stackApi,\n projectApi,\n session: {\n getState: state.store.get,\n subscribe: state.store.subscribe,\n resume,\n\n stack: {\n getActive: getActiveStack,\n /** Scoped on return; resolves once that is stored, for a caller leaving the document. */\n select: byCaller((baseUrl: string): Promise<Stack> => {\n const stack = selectStack(baseUrl);\n return persistScope().then(() => stack);\n }),\n getContext: (baseUrl?: string) => perStack.context.get(requireStackUrl(baseUrl)),\n getContextAsync: (baseUrl?: string) => perStack.context.getAsync(requireStackUrl(baseUrl)),\n },\n\n auth: {\n authenticate: byCaller(authenticate),\n replace: byCaller(replace),\n signOut: byCaller(signOut),\n restoreRetained: byCaller(restoreRetained),\n /** Whether the active stack holds a credential — `restoring` is not one yet. */\n isAuthenticated,\n isAuthenticatedAsync: () => resume().then(isAuthenticated),\n getHeadersAsync: getAuthHeadersAsync,\n },\n },\n };\n};\n","import { ApiError } from '../errors';\nimport { type HttpMethod, isApiError, type MiddlewareFn } from '../fetchClient';\nimport { CREDENTIAL_HEADERS, REDACTED, redactHeaders } from '../internal';\nimport { generateUUID } from '../utils';\n\nconst CORRELATION_ID_HEADER = 'X-Correlation-ID';\n\nconst ALWAYS_REDACTED_HEADERS = [...CREDENTIAL_HEADERS, 'set-cookie'];\n\nconst ALWAYS_REDACTED_QUERY_PARAMS = new Set([\n 'token',\n 'apikey',\n 'api_key',\n 'access_token',\n 'refresh_token',\n 'code',\n 'state',\n 'signature',\n 'sig',\n 'x-amz-signature',\n 'x-amz-credential',\n 'x-amz-security-token',\n 'password',\n 'secret',\n]);\n\nconst getRedactedUrl = (rawUrl: string): string => {\n const url = new URL(rawUrl);\n if (url.username) url.username = REDACTED;\n if (url.password) url.password = REDACTED;\n\n url.searchParams.forEach((_value, key) => {\n if (ALWAYS_REDACTED_QUERY_PARAMS.has(key.toLowerCase())) {\n url.searchParams.set(key, REDACTED);\n }\n });\n return url.toString();\n};\n\n// Returns the request's correlation ID, generating and attaching one if missing.\n//\n// Forwarded via the X-Correlation-ID header so downstream services log the same ID,\n// letting all log lines for a single user action be stitched together across service\n// boundaries. Reuse when the caller already set one (preserves the chain inside a\n// larger trace); otherwise mint a fresh UUID to start a new trace.\nconst ensureCorrelationId = (request: Request): string => {\n const correlationId = request.headers.get(CORRELATION_ID_HEADER) ?? generateUUID();\n request.headers.set(CORRELATION_ID_HEADER, correlationId);\n return correlationId;\n};\n\nconst getRedactedHeaders = (headers: Headers, redacted: string[]): Record<string, string> =>\n redactHeaders(headers, [...ALWAYS_REDACTED_HEADERS, ...redacted]);\n\nexport type RequestLog = {\n url: string;\n headers: Record<string, string>;\n};\n\nexport type ResponseLog = {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n};\n\ntype BaseLog = {\n correlationId: string;\n method: HttpMethod;\n durationMs: number;\n request: RequestLog;\n};\n\ntype SuccessLog = BaseLog & {\n response: ResponseLog;\n};\n\ntype ErrorLog = BaseLog & {\n error: Error;\n};\n\nexport type Log = SuccessLog | ErrorLog;\n\nexport type Logger = {\n info?: (log: SuccessLog) => void;\n error?: (log: ErrorLog) => void;\n};\n\nexport type LogLevel = 'error-only' | 'all';\n\nexport type LoggingOptions = {\n logger?: Logger;\n level?: LogLevel;\n redactHeaders?: string[];\n};\n\nconst getRequestLog = (request: Request, redactedHeaders: string[]): RequestLog => ({\n url: getRedactedUrl(request.url),\n headers: getRedactedHeaders(request.headers, redactedHeaders),\n});\n\nconst getResponseLog = (response: Response, redactedHeaders: string[]): ResponseLog => ({\n status: response.status,\n statusText: response.statusText,\n headers: getRedactedHeaders(response.headers, redactedHeaders),\n});\n\n// On failure the logger receives the thrown error itself. An ApiError masks only credential\n// request headers; its URL, its response headers and the caller's `redactHeaders` are left as\n// sent. Hand the logger a copy with the middleware's full redaction applied; the original error\n// is still thrown untouched.\nconst redactApiError = (error: ApiError, redactedHeaders: string[]): ApiError =>\n new ApiError({\n request: new Request(getRedactedUrl(error.request.url), {\n method: error.request.method,\n headers: getRedactedHeaders(error.request.headers, redactedHeaders),\n }),\n response: new Response(null, {\n status: error.response.status,\n statusText: error.response.statusText,\n headers: getRedactedHeaders(error.response.headers, redactedHeaders),\n }),\n data: error.data,\n });\n\nconst formatLog = (level: 'info' | 'error', log: Log): string => {\n const parts = [`[${level.toUpperCase()}]`, `${Math.round(log.durationMs)}ms`, log.method];\n parts.push(log.request.url);\n if ('response' in log) parts.push(String(log.response.status));\n return parts.join(' ');\n};\n\nconst createSafeLogger = (logger?: Logger, level: LogLevel = 'error-only'): Required<Logger> => {\n return {\n info: (log) => {\n if (level !== 'all') return;\n try {\n if (logger?.info) {\n logger.info(log);\n return;\n }\n\n console.info(formatLog('info', log));\n } catch {\n /* never let logging break the request */\n }\n },\n error: (log) => {\n try {\n if (logger?.error) {\n logger.error(log);\n return;\n }\n\n console.error(formatLog('error', log));\n } catch {\n /* never let logging break the request */\n }\n },\n };\n};\n\nexport const createLoggingMiddleware = (options: LoggingOptions = {}): MiddlewareFn => {\n const safeLogger = createSafeLogger(options.logger, options.level);\n const redactHeaders = options.redactHeaders ?? [];\n\n return (next) => async (fetchRequest) => {\n const correlationId = ensureCorrelationId(fetchRequest.request);\n const start = performance.now();\n const method = fetchRequest.request.method.toLowerCase() as HttpMethod;\n const requestLog = getRequestLog(fetchRequest.request, redactHeaders);\n\n try {\n const result = await next(fetchRequest);\n safeLogger.info({\n correlationId,\n method,\n durationMs: performance.now() - start,\n request: requestLog,\n response: getResponseLog(result.response, redactHeaders),\n });\n return result;\n } catch (error) {\n if (error instanceof Error)\n safeLogger.error({\n correlationId,\n method,\n durationMs: performance.now() - start,\n request: requestLog,\n error: isApiError(error) ? redactApiError(error, redactHeaders) : error,\n });\n\n throw error;\n }\n };\n};\n","import { ApiError } from '../errors';\nimport type { MiddlewareFn } from '../fetchClient';\nimport { HttpStatus } from '../internal';\nimport { delay } from '../utils';\n\nconst DEFAULT_MAX_RETRIES = 5;\nconst DEFAULT_RETRYABLE_STATUSES: number[] = [\n HttpStatus.INTERNAL_SERVER_ERROR,\n HttpStatus.BAD_GATEWAY,\n HttpStatus.SERVICE_UNAVAILABLE,\n HttpStatus.GATEWAY_TIMEOUT,\n];\nconst DEFAULT_BACKOFF_FACTOR = 0.3;\n\nexport type RetryOptions = {\n maxRetries?: number;\n backoffFactor?: number;\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n};\n\nconst defaultShouldRetry = (error: unknown): boolean =>\n error instanceof ApiError && DEFAULT_RETRYABLE_STATUSES.includes(error.response.status);\n\nexport const createRetryMiddleware = (options?: RetryOptions): MiddlewareFn => {\n const {\n maxRetries = DEFAULT_MAX_RETRIES,\n backoffFactor = DEFAULT_BACKOFF_FACTOR,\n shouldRetry = defaultShouldRetry,\n } = options ?? {};\n\n if (!Number.isInteger(maxRetries) || maxRetries < 0) {\n throw new RangeError('maxRetries must be a non-negative integer');\n }\n if (!Number.isFinite(backoffFactor) || backoffFactor < 0) {\n throw new RangeError('backoffFactor must be a finite non-negative number');\n }\n\n return (next) => async (request) => {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await next({ ...request, request: request.request.clone() });\n } catch (error) {\n if (attempt === maxRetries || !shouldRetry(error, attempt)) {\n throw error;\n }\n\n const delayMs = backoffFactor * 1000 * Math.pow(2, attempt);\n await delay(delayMs, request.request.signal ?? undefined);\n }\n }\n\n throw new Error('unreachable');\n };\n};\n","import type { MiddlewareFn } from '../fetchClient';\nimport { KeboolaHttpHeader } from '../internal';\n\n/** Stamps `X-KBC-Ui-Version`; an empty `uiVersion` sends no header. */\nexport const createUiVersionMiddleware = (uiVersion: string | null | undefined): MiddlewareFn => {\n if (!uiVersion) return (next) => next;\n\n return (next) => async (request) => {\n request.request.headers.set(KeboolaHttpHeader.UI_VERSION, uiVersion);\n return next(request);\n };\n};\n","import type { ManagementSessionToken } from '../clients/management/tokenTypes';\n\ntype Options = {\n managementToken: ManagementSessionToken;\n};\n\n/** The admin behind a Manage token: `GET /manage/tokens/verify`, with the admin-level helpers. */\nexport const createAdminAccount = ({ managementToken }: Options) => {\n const { user } = managementToken;\n const adminFeatureSet = new Set(user.features);\n\n const hasAdminFeature = (...feature: string[]) => {\n if (feature.length === 0) return false;\n return feature.every((x) => adminFeatureSet.has(x));\n };\n\n const hasAnyAdminFeature = (...feature: string[]) => feature.some((x) => adminFeatureSet.has(x));\n\n return {\n isSuperAdmin: user.isSuperAdmin,\n hasAdminFeature,\n hasAnyAdminFeature,\n user,\n managementToken,\n };\n};\n\nexport type AdminAccount = ReturnType<typeof createAdminAccount>;\n","import type { DevBranch } from '../clients/storage/branches/types';\nimport { assert } from '../utils';\n\ntype BranchType = 'default' | 'dev';\n\ntype Options = {\n devBranches: DevBranch[];\n};\n\n/**\n * Reads a branch ref — the `default` alias or a branch id — against the project's default branch.\n *\n * - A missing ref is the default branch.\n */\nexport const createBranchRefs = ({ devBranches }: Options) => {\n const defaultBranch = devBranches.find((branch) => branch.isDefault);\n assert(defaultBranch, 'No default branch found for the project.');\n\n const getType = (ref?: string | number): BranchType => {\n if (ref == null || ref === 'default') return 'default';\n return Number(ref) === defaultBranch.id ? 'default' : 'dev';\n };\n\n return {\n defaultId: defaultBranch.id,\n defaultName: defaultBranch.name,\n getType,\n isDev: (ref?: string | number) => getType(ref) === 'dev',\n isDefault: (ref?: string | number) => getType(ref) === 'default',\n resolve: (ref?: string | number) =>\n getType(ref) === 'default' ? defaultBranch.id : Number(ref),\n };\n};\n\nexport type BranchRefs = ReturnType<typeof createBranchRefs>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAa,mBAAmB;CAC9B,cAAc;CACd,kBAAkB;CAClB,aAAa;CACb,sBAAsB;CACtB,UAAU;AACZ;AAIA,MAAM,WAA6C;EAChD,iBAAiB,eAChB;EACD,iBAAiB,mBAAmB;EACpC,iBAAiB,cAChB;EACD,iBAAiB,uBAChB;EACD,iBAAiB,WAAW;AAC/B;AAEA,IAAa,eAAb,MAAa,qBAAqB,MAAM;CACtC;CAEA,YAAY,MAAwB;EAClC,MAAM,SAAS,KAAK;EACpB,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,OAAO,eAAe,MAAM,aAAa,SAAS;CACpD;AACF;AAEA,MAAa,kBAAkB,UAC7B,iBAAiB;;AAGnB,SAAgBA,SAAU,OAA6B,MAA4C;CACjG,IAAI,SAAS,MAAM,MAAM,IAAI,aAAa,IAAI;AAChD;;AC1CA,SAAgB,OAAU,OAA6B,SAAqC;CAC1F,IAAI,SAAS,MACX,MAAM,IAAI,MAAM,OAAO;AAE3B;;;;;;;;;ACGA,MAAa,UACX,KACA,KACA,UACM;CACN,MAAM,WAAW,IAAI,IAAI,GAAG;CAC5B,IAAI,aAAa,KAAA,GAAW,OAAO;CAEnC,MAAM,UAAU,MAAM;CACtB,IAAI,IAAI,KAAK,OAAO;CAEpB,OAAO;AACT;;;;;;;;;ACVA,MAAa,YAAe,SAAiD;CAC3E,IAAI,UAAU;CACd,MAAM,UAA8C,CAAC;CAErD,MAAM,QAAQ,YAAY;EACxB,UAAU;EACV,MAAM,QAAQ,QAAQ,OAAO,CAAC;EAE9B,IAAI;GACF,MAAM,SAAS,MAAM,KAAK;GAC1B,MAAM,SAAS,WAAW,OAAO,QAAQ,MAAM,CAAC;EAClD,SAAS,OAAO;GACd,MAAM,SAAS,WAAW,OAAO,OAAO,KAAK,CAAC;EAChD;EAEA,IAAI,QAAQ,SAAS,GAAG,OAAO,MAAM;EACrC,UAAU;CACZ;CAEA,aAAa;EACX,MAAM,SAAS,QAAQ,cAA0B;EACjD,QAAQ,KAAK,MAAM;EACnB,IAAI,CAAC,SAAS,MAAW;EACzB,OAAO,OAAO;CAChB;AACF;;AC7BA,MAAM,gBAAgB;AAmBtB,MAAM,cAAc,EAAE,eACpB,SAAS,UAAU,UAAU,SAAS,UAAU,gBAAgB,SAAS,UAAU;AAErF,MAAa,sBAAsB,EAAE,QAAQ,kBAAkB,CAAC,MAAoB;CAClF,MAAM,UAAUC,cAAAA,YAAyB,CAAC,CAAC;CAC3C,MAAM,+BAAe,IAAI,IAAwB;CAEjD,MAAM,aAAaC,yBAAAA,MAAMC,yBAAAA,SAAS,OAAO,aAAa,GAAG,CAAC;CAC1D,IAAI,UAAU;CAEd,MAAM,UAAU,QAAgB;EAC9B,aAAa,IAAI,GAAG,CAAC,GAAG;EACxB,aAAa,OAAO,GAAG;CACzB;CAEA,MAAM,QAAQ,SAAsB;EAClC,IAAI,OAAO;EAEX,OAAO,KAAK,SAAS,YAAY;GAC/B,MAAM,UAAU,KAAK,SAAS,UAAU,KAAK,KAAK,GAAG,EAAE;GAEvD,IAAI,CAAC,SAAS;GAEd,OAAO,QAAQ,GAAG;GAClB,OAAO,KAAK,QAAQ,UAAU,UAAU,OAAO;EACjD;EAEA,OAAO;CACT;CAEA,MAAM,WAAW,KAAa,aAC5B,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,UAAW,MAAM,QAAQ,MAAM;EAAE,GAAG;EAAO;CAAS,IAAI,KAAM,CAAC;CAEhG,MAAM,YAAY,WAA2B;EAC3C,MAAM,MAAM;EACZ,MAAM,QAAmB;GACvB;GACA,WAAW,KAAK,IAAI;GACpB,UAAU,OAAO,MAAM;GACvB,MAAM,OAAO;GACb,OAAO,OAAO;EAChB;EAEA,aAAa,IACX,KACA,OAAO,WAAW,aAAa,QAAQ,KAAK,QAAQ,CAAC,CACvD;EACA,QAAQ,IAAI,KAAK,CAAC,OAAO,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC;CAC7C;CAEA,MAAM,gBAAgB;EACpB,yBAAA,QAAQ,UAAU,QAAQ;CAC5B;CAEA,OAAO;EACL,MAAM,QAAQ;EACd;EACA,YAAY,aAAa,QAAQ,gBAAgB,SAAS,CAAC;EAC3D,aAAa;GACX,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,OAAO,GAAG,CAAC;GAC9C,QAAQ,IAAI,CAAC,CAAC;EAChB;EACA,UAAU,WAAW,QAAQ,IAAI,CAAC,CAAC,SAAS,UAAU,MAAM,KAAK,MAAM,CAAC;CAC1E;AACF;;ACtFA,MAAM,iBAAoB,WACtB,OAAO,UAAU,YAAY,UAAU,QAAS,OAAO,UAAU,eACnE,UAAU,SACV,OAAO,MAAM,SAAS;;;;;AAMxB,MAAa,oBAAoB;CAC/B,IAAI,OAA6B;CAEjC,MAAM,OAAU,SAA8B;EAC5C,IAAI,SAAS,MAAM;GACjB,MAAM,SAAS,KAAK,KAAK,IAAI;GAC7B,OAAO,OAAO,WACN,KAAA,SACA,KAAA,CACR;GACA,OAAO;EACT;EAEA,IAAI;EACJ,IAAI;GACF,QAAQ,KAAK;EACf,SAAS,OAAO;GACd,OAAO,QAAQ,OAAO,KAAK;EAC7B;EAEA,IAAI,CAAC,cAAc,KAAK,GAAG,OAAO,QAAQ,QAAQ,KAAK;EAEvD,MAAM,SAAS,QAAQ,QAAQ,KAAK;EACpC,OAAO,OAAO,WACN,KAAA,SACA,KAAA,CACR;EACA,OAAO;CACT;CAEA,MAAM,SAAS,YAA2B;EACxC,OAAO,SAAS,MAAM;GACpB,MAAM,UAAU;GAChB,MAAM;GACN,IAAI,SAAS,SAAS;IACpB,OAAO;IACP;GACF;EACF;CACF;CAEA,OAAO;EAAE;EAAK;CAAO;AACvB;;;;;;;;AC7CA,MAAa,aACX,MACA,UACM;CACN,MAAM,MAA+B,EAAE,GAAG,KAAK;CAE/C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,UAAU,KAAA,GAAW;EACzB,MAAM,UAAU,IAAI;EACpB,IAAI,OAAOC,sBAAAA,cAAc,OAAO,KAAKA,sBAAAA,cAAc,KAAK,IAAI,UAAU,SAAS,KAAK,IAAI;CAC1F;CAEA,OAAO;AACT;;ACVA,MAAa,2BAA2C;CACtD,eAAe;CACf,eAAe,CAAC;CAChB,kBAAkB,CAAC;AACrB;AAIA,MAAa,4BAA4C;CACvD,MAAM,wBAAQ,IAAI,IAAoB;CACtC,OAAO;EACL,UAAU,QAAQ,MAAM,IAAI,GAAG,KAAK;EACpC,UAAU,KAAK,UAAU;GACvB,MAAM,IAAI,KAAK,KAAK;EACtB;EACA,aAAa,QAAQ;GACnB,MAAM,OAAO,GAAG;EAClB;CACF;AACF;AAOA,MAAM,oBAAoB,SAA+C;CACvE,IAAI,MAAsB;CAC1B,IAAI;EACF,MAAM,KAAK;EACX,IAAI,KAAK;GACP,MAAM,QAAQ;GACd,IAAI,QAAQ,OAAO,KAAK;GACxB,IAAI,WAAW,KAAK;EACtB;CACF,SAAS,KAAK;EACZ,QAAQ,KAAK,qEAAqE,GAAG;EACrF,MAAM;CACR;CACA,IAAI,CAAC,KAAK,OAAO,oBAAoB;CAErC,MAAM,UAAU;CAChB,OAAO;EACL,UAAU,QAAQ,QAAQ,QAAQ,GAAG;EACrC,UAAU,KAAK,UAAU;GACvB,QAAQ,QAAQ,KAAK,KAAK;EAC5B;EACA,aAAa,QAAQ;GACnB,QAAQ,WAAW,GAAG;EACxB;EACA,UAAU,OAAU,MAAc,SAAuC;GACvE,IAAI,OAAO,cAAc,eAAe,EAAE,WAAW,YAAY,OAAO,KAAK;GAC7E,OAAO,UAAU,MAAM,QAAQ,WAAW,QAAQ,EAAE,MAAM,YAAY,GAAG,IAAI;EAC/E;CACF;AACF;AAEA,MAAa,2BACX,uBAAwB,kBAAkB,aAAa,WAAW,eAAe,IAAK;AAExF,MAAa,6BACX,uBAAwB,oBAAoB,aAAa,WAAW,iBAAiB,IAAK;;AChC5F,MAAa,mBAAsB,EACjC,UAAU,kBAAkB,GAC5B,KACA,QACA,cACA,SAAS,KAAK,WACd,SAAS,KAAK,YACyB;CACvC,MAAM,SAAS,YAAY;CAE3B,MAAM,QAAQ,YAAY;EACxB,MAAM,MAAM,MAAM,QAAQ,QAAQ,GAAG;EACrC,IAAI,QAAQ,MAAM,OAAO;GAAE,OAAO;GAAc,SAAS;EAAM;EAE/D,IAAI;EACJ,IAAI;GACF,UAAU,OAAO,GAAG;EACtB,SAAS,KAAK;GACZ,QAAQ,KAAK,sCAAsC,IAAI,IAAI,GAAG;GAC9D,OAAO;IAAE,OAAO;IAAc,SAAS;GAAK;EAC9C;EAEA,MAAM,SAAS,OAAO,UAAU,OAAO;EACvC,OAAO,OAAO,UACV;GAAE,OAAO,OAAO;GAAM,SAAS;EAAM,IACrC;GAAE,OAAO;GAAc,SAAS;EAAK;CAC3C;CAEA,MAAM,eAAe,OAAO,UAAU,QAAQ,WAAW,GAAG,CAAC;CAC7D,MAAM,SAAS,UAAa,OAAO,UAAU,QAAQ,QAAQ,KAAK,OAAO,KAAK,CAAC,CAAC;CAEhF,MAAM,OAAO,YAAwB;EACnC,MAAM,OAAO,OAAO;EACpB,MAAM,SAAS,MAAM,MAAM;EAC3B,IAAI,OAAO,SACT,OAAO,CAAC,CAAC,OAAO,QAAiB;GAC/B,QAAQ,KAAK,gDAAgD,IAAI,IAAI,GAAG;EAC1E,CAAC;EAEH,OAAO,OAAO;CAChB;CACA,MAAM,UAAU,WACd,OAAO,IAAI,YAAY;EAErB,MAAM,OAAO,QAAO,MADC,MAAM,EAAA,CACA,KAAK;EAChC,MAAM,QAAQ,QAAQ,KAAK,OAAO,IAAI,CAAC;CACzC,CAAC;CAEH,MAAM,OAAgB;EAAE;EAAM;EAAO;EAAQ;CAAO;CAEpD,MAAM,UAAa,SACjB,QAAQ,WAAW,QAAQ,SAAS,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI;CAExE,OAAO;EAAE,GAAG;EAAM;CAAO;AAC3B;;AC1DA,MAAa,uBAAuB,gBAAyC;CAC3E,QAAQ,QAA0B,WAA2B,CAAC,MAAsB;EAClF,IAAI,MAAM,QAAQ,WAAW,GAAG,OAAO,CAAC,GAAG,UAAU,GAAG,WAAW;EAEnE,OAAO,CAAC,GAAG,UAAU,GAAI,cAAc,WAAW,CAAC,CAAE;CACvD;AACF;;AC9BA,MAAa,WAAW,eACtB,WAAW,SAAS,UAChB;CAAE,MAAM;CAAS,cAAc,WAAW;AAAa,IACvD;CAAE,MAAM;CAAU,WAAW,WAAW;AAAU;AAGxD,MAAM,WAAW,WAAwC;CAAE,GAAG;CAAO,UAAU,KAAK,IAAI;AAAE;AAE1F,MAAM,gBAAgB,SACpB,KAAK,WAAW,kBACZC,yBAAAA,OAAO,QAAQ,KAAK,UAAU,IAC9BA,yBAAAA,OAAO,QAAQ,IAAI,aAAa,iBAAiB,gBAAgB,CAAC;;;;;;;AAQxE,MAAa,cAAc,WAAmB;CAE5C,MAAM,0BAAU,IAAI,IAAa;CAGjC,MAAM,qBAAqB,YACzBA,yBAAAA,OAAO,QAAQ,OAAO,IAAI,OAAO,IAAI,UAAU,aAAa,MAAM,IAAI,CAAC;CAGzE,MAAM,0BAA0B,YAC9BA,yBAAAA,OAAO,QAAQ,OAAO,IAAI,OAAO,IAAI,UACnC,MAAM,KAAK,WAAW,kBAClBA,yBAAAA,OAAO,QAAQ,IAAI,aAAa,iBAAiB,oBAAoB,CAAC,IACtEA,yBAAAA,OAAO,QAAQ,KAAK,CAC1B;CAGF,MAAM,oBAAoB,YACxBA,yBAAAA,OAAO,QAAQ,uBAAuB,OAAO,IAAI,UAC/C,MAAM,KAAK,WAAW,cAClBA,yBAAAA,OAAO,wBAAQ,IAAI,MAAM,UAAU,QAAQ,4BAA4B,CAAC,IACxEA,yBAAAA,OAAO,QAAQ,KAAK,CAC1B;CAEF,MAAM,oBAAoB,YACxBA,yBAAAA,OAAO,QAAQ,OAAO,IAAI,OAAO,IAAI,UACnC,MAAM,KAAK,WAAW,cAClBA,yBAAAA,OAAO,QAAQ,KAAK,IACpBA,yBAAAA,OAAO,wBAAQ,IAAI,MAAM,UAAU,QAAQ,wBAAwB,CAAC,CAC1E;CAEF,MAAM,gBAAgB,YACpBA,yBAAAA,OAAO,IAAI,iBAAiB,OAAO,IAAI,UACrC,OAAO,IAAI;EAAE,GAAG;EAAO,MAAM,EAAE,QAAQ,YAAY;CAAE,CAAC,CACxD;CAGF,MAAM,iBAAiB,YACrBA,yBAAAA,OAAO,IAAI,iBAAiB,OAAO,IAAI,UACrC,OAAO,IAAI;EAAE,GAAG;EAAO,MAAM,EAAE,QAAQ,YAAY;CAAE,CAAC,CACxD;CAGF,MAAM,gBAAgB,SAAkB,UACtCA,yBAAAA,OAAO,IAAI,uBAAuB,OAAO,IAAI,UAAU;EACrD,QAAQ,OAAO,OAAO;EAEtB,OAAO,OAAO,IAAI;GAChB,GAAG;GACH,OAAO,MAAM,QAAQ;GACrB,MAAM;IAAE,QAAQ;IAAiB,YAAY,QAAQ,KAAK;GAAE;GAC5D,UAAU;EACZ,CAAC;CACH,CAAC;CAEH,MAAM,gBAAgB,SAAkB,UACtCA,yBAAAA,OAAO,QAAQ,kBAAkB,OAAO,IAAI,eAC1C,WAAW,SAAS,MAAM,OACtBA,yBAAAA,OAAO,wBAAQ,IAAI,MAAM,KAAK,WAAW,KAAK,uBAAuB,MAAM,MAAM,CAAC,IAClFA,yBAAAA,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,UAC/B,OAAO,IAAI;EAAE,GAAG;EAAO,MAAM;GAAE,QAAQ;GAAiB,YAAY,QAAQ,KAAK;EAAE;CAAE,CAAC,CACxF,CACN;CAGF,MAAM,eAAe,YACnBA,yBAAAA,OAAO,QAAQ,kBAAkB,OAAO,IAAI,eAC1CA,yBAAAA,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,UAC/B,OAAO,IAAI;EACT,GAAG;EACH,MAAM;GACJ,QAAQ;GACR,YAAY;IAAE,GAAG;IAAY,UAAU,KAAK,IAAI,IAAI,WAAW,YAAY;GAAK;EAClF;CACF,CAAC,CACH,CACF;CAIF,MAAM,WAAW,SAAkB,EAAE,SAAS,UAA0B,CAAC,MACvEA,yBAAAA,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,UAAU;EACzC,MAAM,WAAW,SACbA,yBAAAA,OAAO,SACLA,yBAAAA,OAAO,IAAI,aAAa,MAAM,IAAI,IAAI,gBAA0B,EAC9D,OAAO,QAAQ,UAAU,EAC3B,EAAE,GACF,MAAM,QACR,IACA;EAEJ,OAAO,OAAO,IAAI;GAChB,GAAG;GACH,OAAO,MAAM,QAAQ;GACrB,MAAM,EAAE,QAAQ,YAAY;GAC5B;EACF,CAAC;CACH,CAAC;CAEH,MAAM,UAAU,SAAkB,aAChCA,yBAAAA,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,UAAU,OAAO,IAAI;EAAE,GAAG;EAAO;CAAS,CAAC,CAAC;CAE/E,MAAM,gBAAgB,YACpBA,yBAAAA,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,UAAU,OAAO,IAAI;EAAE,GAAG;EAAO,UAAU;CAAK,CAAC,CAAC;CAErF,MAAM,mBAAmB,YACvBA,yBAAAA,OAAO,QAAQ,OAAO,IAAI,OAAO,IAAI,UACnC,MAAM,WACFA,yBAAAA,OAAO,QAAQ,MAAM,QAAQ,IAC7BA,yBAAAA,OAAO,wBAAQ,IAAI,MAAM,UAAU,QAAQ,wBAAwB,CAAC,CAC1E;CAEF,MAAM,iBAAiB,YAA8B;EACnD,IAAI,QAAQ,IAAI,OAAO,GAAG,OAAO;EACjC,QAAQ,IAAI,OAAO;EACnB,OAAO;CACT;CAEA,MAAM,YAAY,YAAqBA,yBAAAA,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,UAAU,MAAM,KAAK;CAG7F,MAAM,kBAAkB,YACtBA,yBAAAA,OAAO,SACLA,yBAAAA,OAAO,IAAI,kBAAkB,OAAO,IAAI,EAAE,kBAAkB,WAAW,GACvE,IACF;CAEF,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;ACxKA,MAAa,YAAY,aAA6B;CACpD;CACA,SAAS;CACT,OAAO;CACP,MAAM,EAAE,QAAQ,YAAY;CAC5B,UAAU;AACZ;;AAGA,MAAa,gBAAgB,UAAiB;CAC5C,MAAM,OAAO,YAAqB;EAChC,MAAM,QAAQ,MAAM,IAAI,CAAC,CAAC,OAAO;EACjC,OAAO,QACHC,yBAAAA,OAAO,QAAQ,KAAK,IACpBA,yBAAAA,OAAO,QAAQ,IAAI,aAAa,iBAAiB,YAAY,CAAC;CACpE;CACA,MAAM,OAAO,UAAwB;EACnC,MAAM,QAAQ,MAAM,IAAI;EACxB,MAAM,IAAI;GAAE,GAAG;GAAO,QAAQ;IAAE,GAAG,MAAM;KAAS,MAAM,UAAU;GAAM;EAAE,CAAC;EAC3E,OAAO;CACT;CAIA,MAAM,UAAU,YAAqB;EACnC,MAAM,WAAW,IAAI,OAAO;EAC5B,IAAI,SAAS,SAAS,OAAO,SAAS;EACtC,OAAO,IAAI,SAAS,OAAO,CAAC;CAC9B;CAGA,MAAM,kBAAyB;EAC7B,MAAM,EAAE,WAAW,MAAM,IAAI;EAC7B,MAAM,QAAQ,IAAI,MAAM;EACxB,IAAI,CAAC,MAAM,SAAS,MAAM,IAAI,MAAM,gCAAgC,QAAQ;EAC5E,OAAO,MAAM;CACf;CAKA,MAAM,UAAU,YAA4B;EAC1C,MAAM,QAAQ,OAAO,OAAO;EAC5B,MAAM,QAAQ,MAAM,IAAI;EACxB,IAAI,MAAM,WAAW,SAAS,MAAM,IAAI;GAAE,GAAG;GAAO,QAAQ;EAAQ,CAAC;EACrE,OAAO;CACT;CAEA,MAAM,iBAAiB,SAAkB,YACvCA,yBAAAA,OAAO,IAAI,IAAI,OAAO,IAAI,UAAU,IAAI;EAAE,GAAG;EAAO;CAAQ,CAAC,CAAC;CAEhE,OAAO;EAAE;EAAK;EAAK;EAAQ;EAAW;EAAQ;CAAc;AAC9D;;;;;;;AC9CA,MAAa,eAAe,mBAA4B;CACtD,MAAM,QAAQC,cAAAA,YAAmB;EAC/B,QAAQ;EACR,QAAQ,GAAG,iBAAiB,SAAS,cAAc,EAAE;CACvD,CAAC;CAED,MAAM,SAAS,aAAa,KAAK;CACjC,MAAM,OAAO,WAAW,MAAM;CAE9B,OAAO;EAAE,OAAO,MAAM,WAAW;EAAG;EAAQ;CAAK;AACnD;;ACAA,MAAM,4BAA4B;AAGlC,MAAM,yBAAyB;AAa/B,MAAM,oBAAoB,IAAI,aAAa,iBAAiB,WAAW;AAEvE,MAAM,mBAAmB,YAAqD;CAC5E,IAAI,YAAY,KAAA,KAAa,YAAY,WAAW,OAAO;CAC3D,IAAI,YAAY,WAAW,OAAO;CAClC,OAAO;AACT;AAEA,MAAM,QAAQ,OACZ,QACA,UAC6B;CAC7B,IAAI,MAAM,SAAS,UAAU;EAC3B,MAAM,EAAE,aAAa,WAAW,cAAc,MAAM,OAAO,MAAM,mBAAmB,EAClF,WAAW,MAAM,UACnB,CAAC;EACD,OAAO;GAAE,MAAM;GAAU;GAAa;GAAW;EAAU;CAC7D;CAEA,MAAM,EAAE,aAAa,WAAW,iBAAiB,MAAM,OAAO,MAAM,iBAAiB,EACnF,cAAc,MAAM,aACtB,CAAC;CACD,IAAI,CAAC,cAAc,MAAM,IAAI,aAAa,iBAAiB,gBAAgB;CAC3E,OAAO;EAAE,MAAM;EAAS;EAAa;EAAW;CAAa;AAC/D;AAEA,MAAa,qBAAqB,EAChC,OACA,WACA,aACA,mBAAmB,2BACnB,aACA,gBACa;CACb,MAAM,8BAAc,IAAI,IAA4C;CAEpE,MAAM,cAAc,YAAqB;EACvC,MAAM,QAAQC,yBAAAA,OAAO,OAAO,MAAM,KAAK,SAAS,OAAO,CAAC;EACxD,aAAaA,yBAAAA,OAAO,SAAS,MAAM,KAAK,SAAS,OAAO,GAAG,EAAE,MAAM;CACrE;CAGA,MAAM,UAAU,OAAO,SAAkB,UAAmD;EAC1F,MAAM,SAASC,mBAAAA,iBAAiB;GAAE;GAAS;EAAY,CAAC;EACxD,MAAM,eAAe,WAAW,OAAO;EACvC,MAAM,YAAY,MAAMD,yBAAAA,OAAO,oBAAoB,MAAM,QAAQ,KAAK,CAAC;EACvE,OAAO,aAAa,IAAI,YAAYA,yBAAAA,OAAO,QAAQ,YAAY,CAAC;CAClE;;;;;;CAOA,MAAM,sBAAsB,OAC1B,OACA,SACA,eAC2D;EAC3D,MAAM,eAAe,WAAW,OAAO;EACvC,MAAM,WAAW,MAAMA,yBAAAA,OAAO,oBAAoB,MAAM,KAAK,CAAC;EAC9D,IAAI,CAAC,SAAS,SAAS,OAAO;EAC9B,IAAI,CAAC,aAAa,GAAG,OAAOA,yBAAAA,OAAO,QAAQ,YAAY,CAAC;EAExD,MAAM,iBAAiB,SAAS,KAAK,OAAO,MAAM,UAAU,MAAM,YAAY,OAAO;EACrF,IAAI,kBAAkB,eAAe,eAAe,MAClD,OAAOA,yBAAAA,OAAO,QAAQ,EAAE,UAAU,eAAe,YAAY,KAAK,CAAC;EAErE,OAAOA,yBAAAA,OAAO,QAAQ,gBAAgB,cAAc,QAAQ,UAAU,CAAC;CACzE;CAEA,MAAM,aAAa,OAAO,YACxB,UAAU,OAAO,OAAO,UAAU;EAChC,MAAM,aAAa,MAAM,KAAK,kBAAkB,OAAO;EACvD,IAAI,CAAC,WAAW,SAAS,OAAO;EAChC,MAAM,QAAQ,MAAM,oBAAoB,OAAO,SAAS,WAAW,IAAI;EACvE,IAAI,CAAC,MAAM,SAAS,OAAO;EAE3B,IAAI,cAAc,MAAM,MAAM;GAC5B,MAAM,OAAO,SAAS,OAAO,MAAM,KAAK,QAAQ;GAChD,OAAOA,yBAAAA,OAAO,QAAQ,YAAY,CAAC;EACrC;EAEA,MAAM,YAAY,MAAM,QAAQ,SAAS,MAAM,IAAI;EACnD,IAAI,CAAC,UAAU,SAAS;GACtB,IAAIE,mBAAAA,eAAe,UAAU,KAAK,GAAG,MAAM,OAAO,SAAS,KAAK;GAChE,OAAO;EACT;EAEA,MAAM,cAAcF,yBAAAA,OAAO,IACzB,MAAM,KAAK,aAAa,SAAS,UAAU,IAAI,SACzC,UAAU,KAAK,WACvB;EACA,MAAM,MAAM,aAAa,SAAS,MAAM,MAAM,IAAI,CAAC;EACnD,OAAO;CACT,CAAC;CAEH,MAAM,UAAU,YACd,OAAO,aAAa,eAAeG,eAAAA,aAAa,WAAW,OAAO,CAAC,CAAC,CAAC,CAAC;CAGxE,MAAM,eAAe,OACnB,SACA,OACA,WAAW,UAEX,UAAU,OAAO,OAAO,UAAU;EAEhC,MAAM,eAAc,MADE,MAAM,KAAK,EAAA,CACL,OAAO,MAAM,UAAU,MAAM,YAAY,OAAO;EAC5E,MAAM,cAAc,WAAW,aAAa,UAAU,QAAQ,aAAa;EAC3E,IAAI,eAAe,CAAC,aAAa,OAAO;EAGxC,IAAI,CADc,MAAM,KAAK,aAAa,OAC7B,CAAC,CAAC,SAAS,OAAO;EAE/B,MAAM,YAAY,MAAM,QAAQ,SAAS,eAAe,KAAK;EAC7D,IAAI,CAAC,UAAU,SAAS;GACtB,MAAM,KAAK,cAAc,OAAO;GAChC,IAAID,mBAAAA,eAAe,UAAU,KAAK,GAAG;IACnC,IAAI,UAAU,MAAM,KAAK,aAAa,OAAO;IAC7C,MAAM,MAAM,aAAa,SAAS,MAAM,MAAM,IAAI,CAAC;IACnD,OAAO;GACT;GACA,OAAO;EACT;EAEA,MAAM,KAAK,aAAa,SAAS,UAAU,IAAI;EAC/C,IAAI,CAAC,MAAM,KAAK,kBAAkB,OAAO,CAAC,CAAC,SAAS,OAAO;EAC3D,IAAI,UAAU,MAAM,KAAK,aAAa,OAAO;EAC7C,MAAM,MAAM,aAAa,SAAS,MAAM,MAAM,IAAI,CAAC;EACnD,OAAO;CACT,CAAC;CAGH,MAAM,UAAU,YAGV;EAGJ,MAAM,WAAW,MAAM,UACpB,QAAQ,UAAU,MAAM,KAAK,CAAC,CAAC,CAC/B,OAAO,UAAmB;GACzB,QAAQ,KAAK,2DAA2D,KAAK;GAC7E,OAAO;EACT,CAAC;EACH,IAAI,aAAa,MAAM,OAAO;GAAE,YAAY;GAAM,QAAQ;EAAc;EACxE,MAAM,EAAE,QAAQ,YAAY;EAC5B,MAAM,SAAS,OAAO,MAAM,EAAE,cAAc,YAAY,SAAS,OAAO;EAExE,MAAM,WAAW,OAAO,IACtB,OAAO,EAAE,SAAS,YAAY,eAAsC;GAClE,MAAM,OAAO,OAAO,OAAO;GAC3B,IAAI,CAAC,cAAc,CAAC,UAAU,OAAO;GACrC,IAAIF,yBAAAA,OAAO,SAAS,MAAM,KAAK,SAAS,OAAO,GAAG,CAAC,IAAI,GAAG,OAAO;GAEjE,IAAI,UAAU,MAAM,KAAK,OAAO,SAAS,QAAQ;GACjD,IAAI,CAAC,YAAY,OAAO;GACxB,OAAO,aAAa,SAAS,UAAU;EACzC,CACF;EAEA,MAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ;EAC1C,MAAM,gBAAgB,QAAQ,aAAa,QAAQ,OAAO,QAAQ,MAAM,KAAK,KAAA;EAE7E,OAAO;GAAE,YAAY;GAAS,QAAQ,gBAAgB,aAAa;EAAE;CACvE;CAEA,MAAM,kBAAkB,OAAO,YAA4C;EACzE,MAAM,EAAE,UAAUA,yBAAAA,OAAO,OAAO,MAAM,KAAK,gBAAgB,OAAO,CAAC;EACnE,OAAO,aAAa,SAAS,OAAO,IAAI;CAC1C;;;;;CAMA,MAAM,WAAW,SAAkB,YAA6B;EAC9D,YAAY,OAAO,OAAO;EAC1B,MAAM,YAAY,MAAM,KAAK,QAAQ,SAAS,OAAO;EACrD,cAAc,OAAO;EAErB,OAAO;CACT;CAIA,MAAM,SAAS,OAAO,SAAkB,OAAe,WAA4B,SAAS;EAC1F,IAAI,CAAC,MAAM,KAAK,cAAc,OAAO,GAAG;EACxC,QAAQ,OAAO;EAEf,IAAI,UAAU,MAAM,KAAK,OAAO,SAAS,QAAQ;EACjD,MAAM,MAAM,aAAa,SAAS,MAAM,MAAM,IAAI,CAAC;EACnD,YAAY,OAAO;CACrB;CAGA,MAAM,eAAe,OAAO,SAAkB,YAAY,qBAAoC;EAC5F,MAAM,UAAUA,yBAAAA,OAAO,IACrB,MAAM,KAAK,kBAAkB,OAAO,IACnC,EAAE,UAAU,gBAAgB,KAAK,IAAI,KAAK,WAAW,YAAY,MAAO,SAC3E;EACA,IAAIA,yBAAAA,OAAO,SAAS,SAAS,KAAK,GAAG,MAAM,OAAO,OAAO;CAC3D;CAEA,MAAM,cAAc,YAClBI,mBAAAA,2BAA2B,EACzB,gBAAgB,OAAO,EAAE,eAAe,UAAU,CAAC,MAAM;EACvD,IAAI,cAAc;GAEhB,IAAI,CAAC,MAAM,KAAK,kBAAkB,OAAO,CAAC,CAAC,SAAS,OAAO;GAC3D,OAAOJ,yBAAAA,OAAO,OAAO,MAAM,OAAO,OAAO,CAAC;EAC5C;EAEA,MAAM,aAAa,OAAO;EAC1B,OAAO,MAAM,KAAK,eAAe,OAAO;CAC1C,EACF,CAAC;;;;;;;;;CAUH,MAAM,aAAa,OAAO,SAAkB,UAAiB;EAC3D,MAAM,SAASC,mBAAAA,iBAAiB;GAAE;GAAS;EAAY,CAAC;EACxD,MAAM,SAAS,YAAY,QAAQ,sBAAsB;EACzD,IAAI;GACF,MAAM,OACJ,MAAM,SAAS,UACX;IAAE,OAAO,MAAM;IAAc,eAAe;GAAwB,IACpE;IACE,QAAQ,MAAM,OAAO,MAAM,mBAAmB,EAAE,WAAW,MAAM,UAAU,GAAG,MAAM,EAAA,CACjF;IACH,eAAe;GACjB;GACN,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM;EACxC,SAAS,OAAO;GACd,QAAQ,KAAK,qDAAqD,KAAK;EACzE;CACF;CAEA,OAAO;EAAE;EAAY;EAAQ;EAAc;EAAS;EAAiB;EAAS;CAAW;AAC3F;;AC3RA,MAAa,qBAAqB,aAChC,OAAO,aAAa,YACpB,aAAa,UACb,aAAa,iBACb,aAAa,cACb,aAAa;;;;AAKf,MAAa,qBAAwD,EACnE,aAGO;CACP,MAAM,eAAe,OAAiB,CAAC,MACrC,IAAI,YAAY,CAAC,GAAG;EAElB,MAAM,SAAS,SAAS;GAEtB,IAAI,kBAAkB,IAAI,GAAG,OAAO,KAAA;GACpC,OAAO,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC;EACpC;EAEA,QAAQ,SAAS,WAAW,SAAS,OAAO,MAAM,IAAI;CACxD,CAAC;CAEH,OAAO,YAAY;AACrB;;ACoBA,MAAa,qCAEV,EACC,mBACA,oBAC6D;CAC7D,MAAM,SAAS,WAAmB,eAChC,kBAAkB,EAChB,SAAS,MAAM,SAAS;EACtB,gBAAgB;GACd;GACA;GACA;GACA;EACF,CAAC;CACH,EACF,CAAC;CAEH,MAAM,UAAiD,CAAC;CAExD,MAAM,iBAAiB,EACrB,WACA,UACA,iBACyC;EACzC,MAAM,iBAAiB,kBAAkB,SAAS;EAClD,OAAO,iBAAiB,SAAS,cAAc,IAAI,MAAM,WAAW,UAAU;CAChF;CAGA,MAAM,WAAyD;EAC7D,MAAM,WAAW;GACf,QAAQ,KAAK,MAAM;GACnB,OAAO;EACT;EACA,aAAa;GACX,MAAM,YAAqC,CAAC;GAE5C,QAAQ,SAAS,WAAW;IAC1B,UAAU,OAAO,cAAc,cAAc,MAAM;GACrD,CAAC;GAKD,OAAO,EAAE,QAAQ,UAAU;EAC7B;CACF;CAEA,OAAO;AACT;;AChGF,MAAM,yBAAyB;;AAgB/B,MAAa,4BACX,QACA,WACyB;CACzB,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,eAAe,WAAW,IAAI,CAAC;CAEvE,OAAO,CAAC,GAAG,QAAQ,GAAG,OAAO,QAAQ,eAAe,CAAC,YAAY,IAAI,WAAW,IAAI,CAAC,CAAC;AACxF;;AAGA,MAAa,uBACX,QACA,WACoB;CACpB,MAAM,eAAe,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC;CAC7E,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,UAAU,MAAM,IAAI,CAAC;CAE7D,OAAO,CACL,GAAG,OAAO,KAAK,UACb,aAAa,IAAI,MAAM,IAAI,IAAI;EAAE,GAAG;EAAO,OAAO,aAAa,IAAI,MAAM,IAAI;CAAE,IAAI,KACrF,GACA,GAAG,OAAO,QAAQ,UAAU,CAAC,YAAY,IAAI,MAAM,IAAI,CAAC,CAC1D;AACF;;;;;;AAOA,MAAa,sBAAsB,EAAE,oBAA6B;CAChE,MAAM,UAAU,cAAc;CAC9B,MAAM,OAAO,cAAc;CAE3B,MAAM,gBAAgB,OACpB,UACA,aACA,aACG;EACH,MAAM,SAAS,MAAM,QAAQ,iBAAiB;GAC5C,aAAa;GACb;GACA;EACF,CAAC;EAED,MAAM,MAAM,OAAO,KAAK,MAAM,cAAc,UAAU,OAAO,WAAW,KAAK,OAAO,KAAK;EAEzF,MAAM,iBAAiB,OAAO,eAAe;EAC7C,MAAM,YAAY,KAAK,eAAe;EAGtC,OAAO;GACL,aAAc,MAAM,QAAQ,cAAc,IAAI,iBAAiB,CAAC;GAChE,QAAS,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC;EACnD;CACF;CAEA,MAAM,kBAAkB,OACtB,aACA,QACA,aAC0B;EAC1B,MAAM,SAAS,MAAM,QAAQ,oBAAoB;GAC/C;GACA,aAAa;GACb,MAAM;GACN,eAAe,EAAE,WAAW,YAAY;EAC1C,CAAC;EAED,IAAI;GACF,MAAM,MAAM,MAAM,KAAK,uBAAuB;IAC5C,UAAU,OAAO,QAAQ;IACzB,aAAa;IACb,iBAAiB,OAAO;IACxB,MAAM;IACN,eAAe,EAAE,OAAO;GAC1B,CAAC;GAED,OAAO;IAAE,aAAa,OAAO;IAAI,mBAAmB,IAAI;GAAG;EAC7D,SAAS,OAAO;GAEd,MAAM,QACH,oBAAoB;IACnB;IACA,aAAa;IACb,UAAU,OAAO;GACnB,CAAC,CAAC,CACD,OAAO,iBAA0B;IAEhC,IAAI,iBAAiB,SAAS,MAAM,UAAU,KAAA,GAC5C,MAAM,QAAQ;GAElB,CAAC;GACH,MAAM;EACR;CACF;CAEA,OAAO;;EAEL,MAAM,OAAO,EACX,aACA,mBACA,WAAW,gBAKgB;GAC3B,MAAM,EAAE,aAAa,WAAW,MAAM,cAAc,aAAa,mBAAmB,QAAQ;GAE5F,OAAO,gBAAgB,aAAa,QAAQ,QAAQ;EACtD;;EAGA,OAAO,OAAO,EACZ,mBACA,gBACA,mBACA,gBACA,WAAW,gBAOgB;GAC3B,MAAM,CAAC,QAAQ,UAAU,MAAM,QAAQ,IAAI,CACzC,cAAc,mBAAmB,gBAAgB,QAAQ,GACzD,cAAc,mBAAmB,gBAAgB,QAAQ,CAC3D,CAAC;GAED,OAAO,gBACL,yBAAyB,OAAO,aAAa,OAAO,WAAW,GAC/D,oBAAoB,OAAO,QAAQ,OAAO,MAAM,GAChD,QACF;EACF;CACF;AACF;;AC/IA,MAAa,aAAa,EAAE,SAAS,gBAAyB;CAC5D,KAAKI,YAAAA,aAAa,EAAE,iBAAiB,SAAS,UAAU,CAAC;CACzD,eAAeC,sBAAAA,uBAAuB,EAAE,iBAAiB,SAAS,UAAU,CAAC;CAC7E,WAAWC,kBAAAA,mBAAmB,EAAE,iBAAiB,SAAS,UAAU,CAAC;CACrE,OAAOC,wBAAAA,eAAe;EAAE,aAAa,SAAS;EAAO,kBAAkB,SAAS;CAAW,CAAC;CAC5F,WAAW,mBAAmB,EAAE,eAAe,QAAQ,CAAC;AAC1D;;ACkBA,MAAM,YAAY,gBAA4B,SAC5C,OAAO,mBAAmB,WACtB,GAAG,iBAAiB,SACpB,YAAY,GAAG,MAAM,eAAe,IAAI;AAE9C,MAAa,wBAAwB,EACnC,SACA,MACA,mBACA,eACA,4BAEA,4BAA0D,CAAC,CAAC;CAC1D;CACA,gBAAgB,EAAE,WAAW,MAAM,iBAAiB;EAClD,MAAM,IAAIC,gBAAAA,wBAAwB,WAAW,MAAM,UAAU;CAC/D;AACF,CAAC,CAAC,CACC,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,oBAAAA,kBAAkB;EAChB,SAAS;EACT,aAAa,cAAc,SAAS,CAAC,qBAAqB,CAAC;EAC3D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,0BAAAA,wBAAwB;EACtB,SAAS;EACT,aAAa,cAAc,eAAe,CAAC,qBAAqB,CAAC;EACjE;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CAGH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,aAAAA,iBAAiB;EACf,SAAS,SAAS,gBAAgB,KAAK;EACvC,aAAa,cAAc,QAAQ,CAAC,qBAAqB,CAAC;EAC1D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,yBAAAA,uBAAuB;EACrB,SAAS;EACT,aAAa,cAAc,YAAY;CACzC,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,qBAAAA,mBAAmB;EACjB,SAAS;EACT,aAAa,cAAc,UAAU,CAAC,qBAAqB,CAAC;EAC5D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,oBAAAA,wBAAwB;EACtB,SAAS;EACT,aAAa,cAAc,eAAe,CAAC,qBAAqB,CAAC;EACjE;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,wBAAAA,sBAAsB;EACpB,SAAS;EACT,aAAa,cAAc,aAAa,CAAC,qBAAqB,CAAC;EAC/D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,qBAAAA,yBAAyB;EACvB,SAAS;EACT,aAAa,cAAc,gBAAgB,CAAC,qBAAqB,CAAC;EAClE;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,cAAAA,kBAAkB;EAChB,SAAS;EACT,aAAa,cAAc,SAAS,CAAC,qBAAqB,CAAC;EAC3D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,mBAAAA,iBAAiB;EACf,eAAe;EACf,SAAS;EACT,aAAa,cAAc,QAAQ,CAAC,qBAAqB,CAAC;EAC1D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,iBAAAA,eAAe;EACb,SAAS;EACT,aAAa,cAAc,MAAM,CAAC,qBAAqB,CAAC;EACxD;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CAGH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,yBAAAA,uBAAuB;EACrB,SAAS,SAAS,gBAAgB,aAAa;EAC/C,aAAa,cAAc,cAAc,CAAC,qBAAqB,CAAC;EAChE;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,eAAAA,mBAAmB;EACjB,SAAS;EACT,aAAa,cAAc,UAAU,CAAC,qBAAqB,CAAC;EAC5D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,iBAAAA,qBAAqB;EACnB,SAAS;EACT,aAAa,cAAc,YAAY,CAAC,qBAAqB,CAAC;EAC9D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,sBAAAA,0BAA0B;EACxB,SAAS;EACT,aAAa,cAAc,iBAAiB,CAAC,qBAAqB,CAAC;EACnE;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,cAAAA,kBAAkB;EAChB,SAAS;EACT,aAAa,cAAc,SAAS,CAAC,qBAAqB,CAAC;EAC3D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,wBAAAA,sBAAsB;EACpB,SAAS;EACT,aAAa,cAAc,aAAa,CAAC,qBAAqB,CAAC;EAC/D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,qBAAAA,mBAAmB;EACjB,SAAS;EACT,aAAa,cAAc,UAAU,CAAC,qBAAqB,CAAC;EAC5D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,4BAAAA,0BAA0B;EACxB,SAAS;EACT,aAAa,cAAc,iBAAiB,CAAC,qBAAqB,CAAC;EACnE;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,sBAAAA,oBAAoB;EAClB,SAAS;EACT,aAAa,cAAc,WAAW,CAAC,qBAAqB,CAAC;EAC7D;CACF,CAAC;AACL,CAAC,CAAC,CACD,IAAI;CACH,WAAW;CACX,YAAY;CACZ,WAAW,mBACTC,kBAAAA,sBAAsB;EACpB,SAAS;EACT,aAAa,cAAc,aAAa,CAAC,qBAAqB,CAAC;EAC/D;CACF,CAAC;AACL,CAAC,CAAC,CACD,MAAM;;ACnPX,MAAM,cAAc,EAAE,SAAS,gBAC7B,GAAG,QAAQ,GAAG;;;;;;;AAiBhB,MAAa,oBAAoB,EAAE,OAAO,aAAa,eAAe,YAAqB;CAGzF,MAAM,aAAa,EAAE,SAAS,gBAA8C;EAC1E,MAAM,iBAA+B,UAAU,YAAY;GACzD,QAAQ,QAAQ,QAAQ,IAAIC,0BAAAA,kBAAkB,YAAY,OAAO,SAAS,CAAC;GAC3E,OAAO,KAAK,OAAO;EACrB;EAEA,QAAQ,SAAS,cAAc,YAAY,WAAW,OAAO,CAAC,CAAC,IAAI,CAAC;CACtE;CAGA,MAAM,WAAW,EAAE,iBAA+C;EAChE,MAAM;EACN,OAAO;EACP;CACF;;;;;;;CAQA,MAAM,SAAS,YAA4B;EACzC,IAAI,SAAS;EACb,MAAM,SAAS,UAAU,OAAO;EAChC,MAAM,UAAUC,gBAAAA,oBAAoB;GAClC,SAAS,QAAQ;GACjB,MAAM,QAAQ,OAAO;GACrB,aAAa,cAAc,WAAW,CAAC,MAAM,CAAC;EAChD,CAAC;EACD,MAAM,EAAE,WAAW,qBAAqB;GACtC,SAAS,QAAQ;GACjB,MAAM,QAAQ,OAAO;GAGrB,oBAAoB,cAAyB,YAAY;IACvD,MAAM,cAAc,MAAM,MAAM,QAAQ,SAAS,QAAQ,OAAO,EAAA,CAAG,cAAc,SAAS;IAC1F,IAAI,CAAC,YAAY,MAAM,IAAIC,gBAAAA,wBAAwB,SAAS;IAE5D,OAAO;GACT;GACA;GACA,uBAAuB;EACzB,CAAC;EACD,MAAM,MAAM,UAAU;GAAE;GAAS,UAAU;EAAO,CAAC;EAqBnD,OAAO;GACL,KAAA,IApBc,MAAM,CAAC,GAAiB,EACtC,MAAM,SAAS,aAAa;IAC1B,IAAI,kBAAkB,QAAQ,GAAG,OAAO,KAAA;IAExC,IAAI,aAAa,WAAW,OAAO,QAAQ;IAE3C,IAAI,CAAC,QAAQ,MAAM,IAAI,aAAa,iBAAiB,WAAW;IAChE,yBAAA,OAAO,OAAO,MAAM,KAAK,kBAAkB,QAAQ,OAAO,CAAC;IAE3D,IAAI,aAAa,WAAW,aAAa,UAAU,aAAa,cAC9D,OAAO,MAAM,IAAI,QAAQ,OAAO,CAAC,CAAC;IAEpC,IAAI,aAAa,WAAW,OAAO;IACnC,IAAI,aAAa,OAAO,OAAO;IAE/B,OAAO,OAAO;GAChB,EACF,CAGI;GACF,WAAW;IACT,SAAS;GACX;EACF;CACF;CAEA,MAAM,0BAAU,IAAI,IAA0C;CAE9D,MAAM,OAAO,YACX,OAAO,SAAS,WAAW,OAAO,SAAS,MAAM,OAAO,CAAC,CAAC,CAAC;CAE7D,MAAM,eAAe,YAAqB;EACxC,KAAK,MAAM,CAAC,KAAK,WAAW,SAAS;GACnC,IAAI,CAAC,IAAI,WAAW,GAAG,QAAQ,EAAE,GAAG;GACpC,OAAO,IAAI;GACX,QAAQ,OAAO,GAAG;EACpB;CACF;CAEA,OAAO;EAAE;EAAK;CAAY;AAC5B;;;;;;;;;ACxHA,MAAa,sBAAsB;;;;;;;;;;;AAYnC,MAAM,uBAAuBC,IAAE,mBAAmB,QAAQ,CACxDA,IAAE,OAAO;CAAE,MAAMA,IAAE,QAAQ,OAAO;CAAG,cAAcA,IAAE,OAAO;AAAE,CAAC,GAC/DA,IAAE,OAAO;CAAE,MAAMA,IAAE,QAAQ,QAAQ;CAAG,WAAWA,IAAE,OAAO;AAAE,CAAC,CAC/D,CAAC;AAED,MAAM,uBAAuBA,IAAE,OAAO;CACpC,SAASA,IAAE,OAAO;CAElB,YAAY,qBAAqB,SAAS,CAAC,CAAC,MAAM,IAAI;CACtD,UAAUA,IAAE,OAAO,EAAE,OAAO,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI;;;;;CAKvF,UAAUA,IAAE,MAAMA,IAAE,QAAQ,CAAC;AAC/B,CAAC;AAED,MAAM,yBAAyBA,IAAE,OAAO;CACtC,SAASA,IACN,OAAO;EACN,SAASA,IAAE,OAAO;;;;;EAKlB,WAAWA,IAAE,OAAO,CAAC,CAAC,SAAS;CACjC,CAAC,CAAC,CACD,SAAS;CACZ,QAAQA,IAAE,MAAM,oBAAoB;AACtC,CAAC;AAKD,MAAM,0BAA4C;CAAE,SAAS;CAAM,QAAQ,CAAC;AAAE;AAE9E,MAAM,YAAY,WAAmE;CACnF,YAAY,MAAM,KAAK,WAAW,kBAAkB,QAAQ,MAAM,KAAK,UAAU,IAAI;CACrF,UAAU,MAAM;AAClB;;;;;;;;AASA,MAAM,iBAAiB,QAA0B,EAAE,QAAQ,cAAuC;CAChG,SAAS;EAAE,SAAS;EAAQ,WAAW;CAAK;CAC5C,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC,KAAK,EAAE,cAAc;EACjD,MAAM,OAAO,OAAO,OAAO,MAAM,UAAU,MAAM,YAAY,OAAO;EACpE,OAAO;GACL;GACA,YAAY,MAAM,cAAc;GAChC,UAAU,MAAM,YAAY;GAC5B,UAAU,CAAC;EACb;CACF,CAAC;AACH;AAEA,MAAM,eAAe,QAA0B,QAA0C;CACvF,MAAM,QAAQ,OAAO,OAAO,WAAW,UAAU,MAAM,YAAY,IAAI,OAAO;CAC9E,MAAM,SAAS,CAAC,GAAG,OAAO,MAAM;CAChC,IAAI,QAAQ,GAAG,OAAO,KAAK,GAAG;MACzB,OAAO,SAAS;CACrB,OAAO;EAAE,GAAG;EAAQ;CAAO;AAC7B;;;;;;;;;AAiBA,MAAa,0BAA0B,YAA6B;CAClE,MAAM,YAAY,gBAAkC;EAClD;EACA,KAAK;EACL,QAAQ;EACR,cAAc;CAChB,CAAC;CAED,MAAM,gBACJ,MACA,SACA,EAAE,aACgB;EAClB,MAAM,QAA2B,OAAO;EACxC,IAAI,UAAU,KAAA,GAAW,OAAO,QAAQ,QAAQ;EAEhD,OAAO,KAAK,QAAQ,WAClB,YAAY,QAAQ;GAAE;GAAS,GAAG,SAAS,KAAK;GAAG,UAAU,CAAC;EAAE,CAAC,CACnE;CACF;CAEA,MAAM,UAAa,SACjB,UAAU,QAAQ,SAChB,KAAK;EACH,MAAM,KAAK;EACX,eAAe,SAAS,UAAU,aAAa,MAAM,SAAS,KAAK;CACrE,CAAC,CACH;CAEF,IAAI,SAAuB;CAC3B,IAAI,UAAgC;CAGpC,MAAM,YAAY,UAAgC;EAChD,SAAS;EACT,IAAI,SAAS,OAAO;EACpB,MAAM,QAAQ,UAAU,QAAQ,SAAS;GACvC,UAAU;GACV,MAAM,QAAQ,UAAU;GACxB,OAAO,KAAK,QAAQ,WAAW,cAAc,QAAQ,KAAK,CAAC;EAC7D,CAAC;EACD,UAAU;EACV,OAAO;CACT;CAEA,OAAO;EAAE;EAAQ;CAAS;AAC5B;;ACxJA,MAAM,eAAe,OAAgC,OAAO,OAAeC,mBAAAA,SAAS,CAAC,CAAC,SAAS,EAAE;AAEjG,MAAM,wBAAqC,EAEzC,kBAAkB,QAAQ,GAAG,IAAI,MACnC;AASA,MAAa,eAAe,EAAE,WAAW,wBAAiC;CACxE,MAAM,EAAE,UAAU,YAAY,UAAU,GAAG,aAAa;CAExD,MAAM,aAAa,IAAI,IACrB,SAAS,KAAK,YAAY;EACxB,IAAI,CAAC,YAAY,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,GAAG;EAC7D,MAAM,cAAc,oBAAoB,QAAQ,GAAG,GAAG,QAAQ,GAAG;EACjE,MAAM,eAAe,sBAAsB,QAAQ,GAAG,GAAG,QAAQ,GAAG;EACpE,MAAM,MAAM,eAAe,gBAAgB,QAAQ;EACnD,OAAO,CAAC,QAAQ,IAAI,GAAG;CACzB,CAAC,CACH;CAEA,MAAM,eAAe,IAAI,IAAI,WAAW,KAAK,cAAc,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;CACrF,MAAM,aAAa,IAAI,IAAI,QAAQ;CAEnC,MAAM,cAAc,GAAG,YAAsB;EAC3C,IAAI,QAAQ,WAAW,GAAG,OAAO;EACjC,OAAO,QAAQ,OAAO,MAAM,WAAW,IAAI,CAAC,CAAC;CAC/C;CAEA,MAAM,gBAAgB,GAAG,gBAA0B;EACjD,IAAI,YAAY,WAAW,GAAG,OAAO;EACrC,OAAO,YAAY,OAAO,MAAM,aAAa,IAAI,CAAC,CAAC;CACrD;CAEA,MAAM,gBAAgB,gBAAwB,aAAa,IAAI,WAAW,KAAK;CAE/E,MAAM,cAAc,cAAyB,WAAW,IAAI,SAAS;CAErE,MAAM,iBAAiB,cAAyB,WAAW,IAAI,SAAS,KAAK;CAE7E,OAAO;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;ACxDA,MAAM,yBAAyB;;;;;;;;AAiB/B,MAAa,sBAAsB,EAAE,OAAO,wBAAiC;CAC3E,MAAM,0BAAU,IAAI,IAAoB;CAExC,MAAM,OAAO,SAAkB,UAAiB;EAC9C,QAAQ,IAAI,SAAS,KAAK;EAC1B,MAAM,OAAO,cAAc,SAAS,MAAM,MAAM;CAClD;CAEA,MAAM,aAAa,OAAO,YAAqB;EAC7C,MAAM,YAAY,MAAMC,gBAAAA,oBAAoB;GAC1C;GACA,MAAM;IAAE,MAAM;IAAc,OAAO;GAAG;EACxC,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,mBAAmB,GAAG,YAAY,QAAQ,sBAAsB,CAAC;EAC5F,OAAO,YAAY;GAAE;GAAW;EAAkB,CAAC;CACrD;CAEA,MAAM,OAAO,YAA4B;EACvC,MAAM,UAAU,SAA2B;GACzC,IAAI,SAAS,IAAI;GACjB,OAAO;EACT;EAEA,MAAM,QAAe;GACnB,QAAQ;GACR,SAAS,WAAW,OAAO,CAAC,CAAC,MAC1B,UAAU,OAAO;IAAE,QAAQ;IAAS;GAAM,CAAC,IAC3C,UAAmB,OAAO;IAAE,QAAQ;IAAW;GAAM,CAAC,CACzD;EACF;EAEA,IAAI,SAAS,KAAK;EAClB,OAAO;CACT;CAEA,MAAM,OAAO,YAAmC;EAC9C,MAAM,QAAQ,QAAQ,IAAI,OAAO;EACjC,OAAO,OAAO,WAAW,UAAU,MAAM,QAAQ;CACnD;CAEA,MAAM,WAAW,OAAO,YAAqC;EAC3D,MAAM,SAAS,QAAQ,IAAI,OAAO;EAClC,MAAM,QAAQ,WAAW,KAAA,KAAa,OAAO,WAAW,YAAY,IAAI,OAAO,IAAI;EACnF,MAAM,UAAU,MAAM,WAAW,YAAY,MAAM,MAAM,UAAU;EAEnE,IAAI,QAAQ,WAAW,WAAW,MAAM,QAAQ;EAChD,OAAO,QAAQ;CACjB;CAEA,MAAM,cAAc,EAAE,aAAoB;EACxC,KAAK,MAAM,EAAE,aAAa,OAAO,OAAO,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,GAAG,IAAI,OAAO;CACzF;CAEA,OAAO;EAAE;EAAY;EAAK;CAAS;AACrC;;;;;;;;ACnDA,MAAa,kBAAkB,EAC7B,OACA,aACA,eACA,wBACa;CACb,MAAM,UAAU,mBAAmB;EAAE;EAAO;CAAkB,CAAC;CAC/D,MAAM,0BAAU,IAAI,IAAuB;CAE3C,MAAM,OAAO,YACX,OAAO,SAAS,gBAAgB;EAC9B;EAEA,IAAI,QAAQ;GACV,MAAM,SAAS,QAAQ,IAAI,OAAO;GAClC,SAAO,QAAQ,iBAAiB,QAAQ;GACxC,OAAO;EACT;EACA,MAAMC,mBAAAA,iBAAiB;GACrB;GACA,aAAa,cAAc,QAAQ,CAAC,YAAY,WAAW,OAAO,CAAC,CAAC;EACtE,CAAC;EACD,YAAYC,mBAAAA,uBAAuB;GACjC;GACA,MAAM;IAAE,MAAM;IAAU,OAAO;GAAG;GAClC,aAAa,cAAc,cAAc,CAAC,YAAY,WAAW,OAAO,CAAC,CAAC;EAC5E,CAAC;CACH,EAAE;CAEJ,OAAO;EAAE;EAAS;CAAI;AACxB;;;;;;;AC7BA,MAAa,iBAAiB,EAC5B,gBACA,SACA,aACA,mBACA,gBACoB;CACpB,MAAM,QAAQ,YAAYC,0BAAAA,iBAAiB,cAAc,CAAC;CAC1D,MAAM,YAAY,uBAAuB,OAAO;CAChD,MAAM,gBAAgB,oBAAoB,WAAW;CACrD,MAAM,cAAc,kBAAkB;EACpC;EACA;EACA,aAAa,cAAc,MAAM;EAEjC,cAAc,YAAY,WAAW,YAAY,OAAO;EACxD;CACF,CAAC;CAED,MAAM,WAAW,eAAe;EAAE;EAAO;EAAa;EAAe;CAAkB,CAAC;CACxF,MAAM,aAAa,iBAAiB;EAAE;EAAO;EAAa;EAAe,OAAO;CAAS,CAAC;CAE1F,MAAM,MAAM,UAAU,SAAS,QAAQ,UAAU;CAEjD,SAAS,QAAQ,WAAW,MAAM,MAAM,IAAI,CAAC;CAE7C,MAAM,eAAe,YAA2B,MAAM,OAAO,OAAOA,0BAAAA,iBAAiB,OAAO,CAAC;;CAG7F,MAAM,mBAAmB,YACvB,YAAY,KAAA,IAAY,MAAM,OAAO,UAAU,CAAC,CAAC,UAAUA,0BAAAA,iBAAiB,OAAO;;CAGrF,MAAM,iBAAiB,eAA0C;EAC/D,SAAS,gBAAgB;EACzB;CACF;;;;;;;;;CAUA,MAAM,sBAAsB,OAC1B,WACA,EAAE,qBAAoD,CAAC,MACnB;EACpC,MAAM,EAAE,YAAY,cAAc,SAAS;EAC3C,MAAM,YAAY,aAAa,SAAS,gBAAgB;EAExD,MAAM,aAAaC,yBAAAA,OAAO,OAAO,MAAM,KAAK,kBAAkB,OAAO,CAAC;EACtE,OAAO;IACJC,0BAAAA,WAAW,gBAAgB,UAAU,WAAW;IAChDC,0BAAAA,kBAAkB,aAAa,OAAO,SAAS;EAClD;CACF;CAaA,MAAM,gBAAgB,UAA8C;EAClE,IAAI,MAAM,SAAS,SAAS,OAAO;EAEnC,MAAM,EAAE,iBAAiB;EACzB,IAAI,CAAC,cAAc,MAAM,IAAI,aAAa,iBAAiB,gBAAgB;EAC3E,OAAO;GAAE,GAAG;GAAO;EAAa;CAClC;CAEA,MAAM,gBAAgB,UAAoC;EACxD,MAAM,EAAE,YAAY,MAAM,OAAO,UAAU;EAC3C,MAAM,WAAWF,yBAAAA,OAAO,OAAO,MAAM,KAAK,aAAa,SAAS,aAAa,KAAK,CAAC,CAAC;EACpF,UACG,QAAQ,UAAU,MAAM,aAAa,SAAS,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,CACjE,OAAO,UAAmB;GACzB,QAAQ,KAAK,kDAAkD,KAAK;EACtE,CAAC;EACH,OAAO;CACT;CAGA,MAAM,eAAe,SAAS,IAAI,MAAM,OAAO,UAAU,CAAC,CAAC,OAAO;CAClE,MAAM,WAAqB;EACzB,IAAI,UAAU;GACZ,OAAO,OAAO,CAAC,CAAC;EAClB;EACA,IAAI,QAAQ;GACV,OAAO,OAAO,CAAC,CAAC;EAClB;EACA,IAAI,OAAO;GACT,OAAO,OAAO,CAAC,CAAC;EAClB;EACA,IAAI,aAAa;GACf,OAAO,OAAO,CAAC,CAAC;EAClB;CACF;CAEA,MAAM,cAAc,cAAqC,WAAW,IAAI,cAAc,SAAS,CAAC;;;;;;;;;;CAWhG,MAAM,WAAW,EACf,SACA,GAAG,YACsC,CAAC,MAC1C,UAAU,gBAAgB,OAAO,GAAG,SAAS,CAAC,QAAQ,MAAM;CAG9D,MAAM,iCAAiB,IAAI,IAA4B;;CAGvD,MAAM,aACJ,QACA,SACA,eACmB;EAEnB,MAAM,OAAO,aAAaA,yBAAAA,OAAO,SAAS,MAAM,KAAK,kBAAkB,MAAM,GAAG,IAAI,IAAI;EAGxF,MAAM,YAAYA,yBAAAA,OAAO,OAAO,YAAY,QAAQ,QAAQ,OAAO,CAAC;EAIpE,IAAI,SAAuB,QAAQ,QAAQ,IAAI;EAC/C,MAAM,QAAQ,UACX,OAAO,OAAO,UAAU;GACvB,IAAI,SAAS,MAEX,UADgB,MAAM,MAAM,KAAK,EAAA,CAAG,OAAO,MAAM,UAAU,MAAM,YAAY,MAC/D,CAAC,EAAE,cAAc;GAEjC,MAAM,MAAM,aAAa,QAAQ,MAAM,MAAM,IAAI,CAAC;EACpD,CAAC,CAAC,CACD,WACQ,SAAS,YAAY,WAAW,QAAQ,MAAM,IAAI,KAAA,GAEzD,OAAO,UAAmB;GACxB,IAAI,QAAQ,MAAM,YAAY,WAAW,QAAQ,MAAM;GACvD,MAAM;EACR,CACF;EAEF,MAAM,UAAU,eAAe,IAAI,MAAM;EACzC,IAAI,SAAS,MAAM;GACjB,eAAe,IAAI,QAAQ,KAAK;GAChC,MAAM,eAAe;IACnB,IAAI,eAAe,IAAI,MAAM,MAAM,OAAO,eAAe,OAAO,MAAM;GACxE;GACA,MAAM,KAAK,QAAQ,MAAM;EAC3B;EACA,OAAO,QAAQ,IAAI,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,WAAW,SAAS;CAC3D;;CAGA,MAAM,mBAAmB,YACvB,YAAY,gBAAgBD,0BAAAA,iBAAiB,OAAO,CAAC;;;;;;;;CASvD,MAAM,WAAW,UAAoC;EAEnD,UAAU,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,UAAmB;GAChE,QAAQ,KAAK,2DAA2D,KAAK;EAC/E,CAAC;EACD,OAAO,aAAa,KAAK;CAC3B;CAEA,IAAI,aAAa;;;;;;;;CAQjB,MAAM,0BAA0B;EAE9B,IAAI,YAAY;EAChB,aAAa;EAEb,SAAS,MAAM,MAAM,IAAI,CAAC;EAC1B,MAAM,MAAM,UAAU,QAAQ;CAChC;CAEA,MAAM,YAAY,UAAuB;EACvC,UAAU,SAAS,KAAK,CAAC,CAAC,OAAO,UAAmB;GAClD,QAAQ,KAAK,kDAAkD,KAAK;EACtE,CAAC;CACH;CAGA,MAAM,qBACJ,aAAa,UAAU,SAAS,MAAM,MAAM,IAAI,CAAC,IAAI,QAAQ,QAAQ;;;;;;;CAQvE,MAAM,kCAAkC;EACtC,MAAM,OAAO,MAAM,MAAM,WAAW,SAAS;GAC3C,IAAI,CAAC,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,WAAW,KAAK,WAAW,eAAe,GAAG;GAErF,KAAK;GACL,kBAAkB;EACpB,CAAC;CACH;CAIA,MAAM,UAAUI,yBAAAA,WACd,YAAY,QAAQ,CAAC,CAAC,MACnB,aAAa;EACZ,IAAI,SAAS,WAAW,eAAe,0BAA0B;OAC5D,kBAAkB;EAEvB,OAAO;CACT,IACC,UAAmB;EAGlB,0BAA0B;EAC1B,MAAM;CACR,CACF,CACF;CAEA,MAAM,iBAAiB,MAAM,OAAO;CAEpC,MAAM,wBAAwB,eAAe,CAAC,CAAC,KAAK,WAAW;;;;;;;;;;;CAY/D,MAAM,SAASA,yBAAAA,WACb,QAAQ,CAAC,CAAC,MAAM,EAAE,YAAY,aAA4B;EACxD,IAAI,cAAc,CAAC,cAAc,YAAY,WAAW,OAAO;EAE/D,OAAO;CACT,CAAC,CACH;CAIA,IAAI,eAAe;CACnB,MAAM,YACqB,UACxB,GAAG,SAAe;EACjB,eAAe;EACf,OAAO,KAAK,GAAG,IAAI;CACrB;CAEF,OAAO;EACL;EACA;EACA,SAAS;GACP,UAAU,MAAM,MAAM;GACtB,WAAW,MAAM,MAAM;GACvB;GAEA,OAAO;IACL,WAAW;;IAEX,QAAQ,UAAU,YAAoC;KACpD,MAAM,QAAQ,YAAY,OAAO;KACjC,OAAO,aAAa,CAAC,CAAC,WAAW,KAAK;IACxC,CAAC;IACD,aAAa,YAAqB,SAAS,QAAQ,IAAI,gBAAgB,OAAO,CAAC;IAC/E,kBAAkB,YAAqB,SAAS,QAAQ,SAAS,gBAAgB,OAAO,CAAC;GAC3F;GAEA,MAAM;IACJ,cAAc,SAAS,YAAY;IACnC,SAAS,SAAS,OAAO;IACzB,SAAS,SAAS,OAAO;IACzB,iBAAiB,SAAS,eAAe;;IAEzC;IACA,4BAA4B,OAAO,CAAC,CAAC,KAAK,eAAe;IACzD,iBAAiB;GACnB;EACF;CACF;AACF;;AC9UA,MAAM,wBAAwB;AAE9B,MAAM,0BAA0B,CAAC,GAAGC,0BAAAA,oBAAoB,YAAY;AAEpE,MAAM,+CAA+B,IAAI,IAAI;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,kBAAkB,WAA2B;CACjD,MAAM,MAAM,IAAI,IAAI,MAAM;CAC1B,IAAI,IAAI,UAAU,IAAI,WAAWC,0BAAAA;CACjC,IAAI,IAAI,UAAU,IAAI,WAAWA,0BAAAA;CAEjC,IAAI,aAAa,SAAS,QAAQ,QAAQ;EACxC,IAAI,6BAA6B,IAAI,IAAI,YAAY,CAAC,GACpD,IAAI,aAAa,IAAI,KAAKA,0BAAAA,QAAQ;CAEtC,CAAC;CACD,OAAO,IAAI,SAAS;AACtB;AAQA,MAAM,uBAAuB,YAA6B;CACxD,MAAM,gBAAgB,QAAQ,QAAQ,IAAI,qBAAqB,KAAKC,qBAAAA,aAAa;CACjF,QAAQ,QAAQ,IAAI,uBAAuB,aAAa;CACxD,OAAO;AACT;AAEA,MAAM,sBAAsB,SAAkB,aAC5CC,0BAAAA,cAAc,SAAS,CAAC,GAAG,yBAAyB,GAAG,QAAQ,CAAC;AA2ClE,MAAM,iBAAiB,SAAkB,qBAA2C;CAClF,KAAK,eAAe,QAAQ,GAAG;CAC/B,SAAS,mBAAmB,QAAQ,SAAS,eAAe;AAC9D;AAEA,MAAM,kBAAkB,UAAoB,qBAA4C;CACtF,QAAQ,SAAS;CACjB,YAAY,SAAS;CACrB,SAAS,mBAAmB,SAAS,SAAS,eAAe;AAC/D;AAMA,MAAM,kBAAkB,OAAiB,oBACvC,IAAIC,0BAAAA,SAAS;CACX,SAAS,IAAI,QAAQ,eAAe,MAAM,QAAQ,GAAG,GAAG;EACtD,QAAQ,MAAM,QAAQ;EACtB,SAAS,mBAAmB,MAAM,QAAQ,SAAS,eAAe;CACpE,CAAC;CACD,UAAU,IAAI,SAAS,MAAM;EAC3B,QAAQ,MAAM,SAAS;EACvB,YAAY,MAAM,SAAS;EAC3B,SAAS,mBAAmB,MAAM,SAAS,SAAS,eAAe;CACrE,CAAC;CACD,MAAM,MAAM;AACd,CAAC;AAEH,MAAM,aAAa,OAAyB,QAAqB;CAC/D,MAAM,QAAQ;EAAC,IAAI,MAAM,YAAY,EAAE;EAAI,GAAG,KAAK,MAAM,IAAI,UAAU,EAAE;EAAK,IAAI;CAAM;CACxF,MAAM,KAAK,IAAI,QAAQ,GAAG;CAC1B,IAAI,cAAc,KAAK,MAAM,KAAK,OAAO,IAAI,SAAS,MAAM,CAAC;CAC7D,OAAO,MAAM,KAAK,GAAG;AACvB;AAEA,MAAM,oBAAoB,QAAiB,QAAkB,iBAAmC;CAC9F,OAAO;EACL,OAAO,QAAQ;GACb,IAAI,UAAU,OAAO;GACrB,IAAI;IACF,IAAI,QAAQ,MAAM;KAChB,OAAO,KAAK,GAAG;KACf;IACF;IAEA,QAAQ,KAAK,UAAU,QAAQ,GAAG,CAAC;GACrC,QAAQ,CAER;EACF;EACA,QAAQ,QAAQ;GACd,IAAI;IACF,IAAI,QAAQ,OAAO;KACjB,OAAO,MAAM,GAAG;KAChB;IACF;IAEA,QAAQ,MAAM,UAAU,SAAS,GAAG,CAAC;GACvC,QAAQ,CAER;EACF;CACF;AACF;AAEA,MAAa,2BAA2B,UAA0B,CAAC,MAAoB;CACrF,MAAM,aAAa,iBAAiB,QAAQ,QAAQ,QAAQ,KAAK;CACjE,MAAM,gBAAgB,QAAQ,iBAAiB,CAAC;CAEhD,QAAQ,SAAS,OAAO,iBAAiB;EACvC,MAAM,gBAAgB,oBAAoB,aAAa,OAAO;EAC9D,MAAM,QAAQ,YAAY,IAAI;EAC9B,MAAM,SAAS,aAAa,QAAQ,OAAO,YAAY;EACvD,MAAM,aAAa,cAAc,aAAa,SAAS,aAAa;EAEpE,IAAI;GACF,MAAM,SAAS,MAAM,KAAK,YAAY;GACtC,WAAW,KAAK;IACd;IACA;IACA,YAAY,YAAY,IAAI,IAAI;IAChC,SAAS;IACT,UAAU,eAAe,OAAO,UAAU,aAAa;GACzD,CAAC;GACD,OAAO;EACT,SAAS,OAAO;GACd,IAAI,iBAAiB,OACnB,WAAW,MAAM;IACf;IACA;IACA,YAAY,YAAY,IAAI,IAAI;IAChC,SAAS;IACT,OAAOC,0BAAAA,WAAW,KAAK,IAAI,eAAe,OAAO,aAAa,IAAI;GACpE,CAAC;GAEH,MAAM;EACR;CACF;AACF;;AC7LA,MAAM,sBAAsB;AAC5B,MAAM,6BAAuC;CAC3CC,0BAAAA,WAAW;CACXA,0BAAAA,WAAW;CACXA,0BAAAA,WAAW;CACXA,0BAAAA,WAAW;AACb;AACA,MAAM,yBAAyB;AAQ/B,MAAM,sBAAsB,UAC1B,iBAAiBC,0BAAAA,YAAY,2BAA2B,SAAS,MAAM,SAAS,MAAM;AAExF,MAAa,yBAAyB,YAAyC;CAC7E,MAAM,EACJ,aAAa,qBACb,gBAAgB,wBAChB,cAAc,uBACZ,WAAW,CAAC;CAEhB,IAAI,CAAC,OAAO,UAAU,UAAU,KAAK,aAAa,GAChD,MAAM,IAAI,WAAW,2CAA2C;CAElE,IAAI,CAAC,OAAO,SAAS,aAAa,KAAK,gBAAgB,GACrD,MAAM,IAAI,WAAW,oDAAoD;CAG3E,QAAQ,SAAS,OAAO,YAAY;EAClC,KAAK,IAAI,UAAU,GAAG,WAAW,YAAY,WAC3C,IAAI;GACF,OAAO,MAAM,KAAK;IAAE,GAAG;IAAS,SAAS,QAAQ,QAAQ,MAAM;GAAE,CAAC;EACpE,SAAS,OAAO;GACd,IAAI,YAAY,cAAc,CAAC,YAAY,OAAO,OAAO,GACvD,MAAM;GAGR,MAAM,UAAU,gBAAgB,MAAO,KAAK,IAAI,GAAG,OAAO;GAC1D,MAAMC,yBAAAA,MAAM,SAAS,QAAQ,QAAQ,UAAU,KAAA,CAAS;EAC1D;EAGF,MAAM,IAAI,MAAM,aAAa;CAC/B;AACF;;;ACjDA,MAAa,6BAA6B,cAAuD;CAC/F,IAAI,CAAC,WAAW,QAAQ,SAAS;CAEjC,QAAQ,SAAS,OAAO,YAAY;EAClC,QAAQ,QAAQ,QAAQ,IAAIC,0BAAAA,kBAAkB,YAAY,SAAS;EACnE,OAAO,KAAK,OAAO;CACrB;AACF;;;ACJA,MAAa,sBAAsB,EAAE,sBAA+B;CAClE,MAAM,EAAE,SAAS;CACjB,MAAM,kBAAkB,IAAI,IAAI,KAAK,QAAQ;CAE7C,MAAM,mBAAmB,GAAG,YAAsB;EAChD,IAAI,QAAQ,WAAW,GAAG,OAAO;EACjC,OAAO,QAAQ,OAAO,MAAM,gBAAgB,IAAI,CAAC,CAAC;CACpD;CAEA,MAAM,sBAAsB,GAAG,YAAsB,QAAQ,MAAM,MAAM,gBAAgB,IAAI,CAAC,CAAC;CAE/F,OAAO;EACL,cAAc,KAAK;EACnB;EACA;EACA;EACA;CACF;AACF;;;;;;;ACXA,MAAa,oBAAoB,EAAE,kBAA2B;CAC5D,MAAM,gBAAgB,YAAY,MAAM,WAAW,OAAO,SAAS;CACnE,OAAO,eAAe,0CAA0C;CAEhE,MAAM,WAAW,QAAsC;EACrD,IAAI,OAAO,QAAQ,QAAQ,WAAW,OAAO;EAC7C,OAAO,OAAO,GAAG,MAAM,cAAc,KAAK,YAAY;CACxD;CAEA,OAAO;EACL,WAAW,cAAc;EACzB,aAAa,cAAc;EAC3B;EACA,QAAQ,QAA0B,QAAQ,GAAG,MAAM;EACnD,YAAY,QAA0B,QAAQ,GAAG,MAAM;EACvD,UAAU,QACR,QAAQ,GAAG,MAAM,YAAY,cAAc,KAAK,OAAO,GAAG;CAC9D;AACF"}
|