@keboola/api-client 20.0.0 → 21.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/API-SURFACE.md +26 -3
- package/README.md +124 -24
- package/dist/{ManagementClientAuthError-BMOhz4mx.d.ts → ManagementClientAuthError-B3PZRWBU.d.ts} +1 -1
- package/dist/{ManagementClientAuthError-B7mGrnGn.d.cts → ManagementClientAuthError-CJu_hpGi.d.cts} +1 -1
- package/dist/ai/index.cjs +3 -3
- package/dist/ai/index.d.cts +1 -1
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.js +2 -2
- package/dist/assets/index.d.cts +1 -1
- package/dist/assets/index.d.ts +1 -1
- package/dist/auth/index.cjs +9 -9
- package/dist/auth/index.d.cts +81 -9
- package/dist/auth/index.d.ts +81 -9
- 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/chat/index.cjs +3 -3
- package/dist/chat/index.d.cts +1 -1
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +2 -2
- package/dist/chat/suggestions.d.cts +11 -11
- package/dist/chat/suggestions.d.ts +11 -11
- package/dist/{chunk-7ETZQGY7.js → chunk-2BOG5U7C.js} +3 -3
- package/dist/{chunk-7ETZQGY7.js.map → chunk-2BOG5U7C.js.map} +1 -1
- package/dist/{chunk-YLHZ2H7O.cjs → chunk-3GTRQFWA.cjs} +4 -4
- package/dist/{chunk-YLHZ2H7O.cjs.map → chunk-3GTRQFWA.cjs.map} +1 -1
- package/dist/{chunk-TTPJSPZA.cjs → chunk-3KEVPUSX.cjs} +10 -3
- package/dist/chunk-3KEVPUSX.cjs.map +1 -0
- package/dist/chunk-4HBUVR57.cjs +155 -0
- package/dist/chunk-4HBUVR57.cjs.map +1 -0
- package/dist/{chunk-YUTWLJBK.js → chunk-4IEIVLYT.js} +55 -5
- package/dist/chunk-4IEIVLYT.js.map +1 -0
- package/dist/{chunk-HEVDH4JQ.js → chunk-4WX5W7YU.js} +3 -3
- package/dist/{chunk-HEVDH4JQ.js.map → chunk-4WX5W7YU.js.map} +1 -1
- package/dist/{chunk-7KMFRSYA.js → chunk-5FDQYOJD.js} +3 -3
- package/dist/{chunk-7KMFRSYA.js.map → chunk-5FDQYOJD.js.map} +1 -1
- package/dist/{chunk-KQ2QNGRX.js → chunk-6BYHD5DG.js} +4 -4
- package/dist/chunk-6BYHD5DG.js.map +1 -0
- package/dist/{chunk-WJRHT346.js → chunk-6JXSO3AR.js} +3 -3
- package/dist/chunk-6JXSO3AR.js.map +1 -0
- package/dist/{chunk-4H2DDEUI.cjs → chunk-AFIQYB2O.cjs} +4 -4
- package/dist/{chunk-4H2DDEUI.cjs.map → chunk-AFIQYB2O.cjs.map} +1 -1
- package/dist/{chunk-IZWNTRMT.cjs → chunk-C5R6ITYD.cjs} +4 -4
- package/dist/{chunk-IZWNTRMT.cjs.map → chunk-C5R6ITYD.cjs.map} +1 -1
- package/dist/{chunk-AWRMGLMT.cjs → chunk-CBVGOANJ.cjs} +4 -4
- package/dist/chunk-CBVGOANJ.cjs.map +1 -0
- package/dist/{chunk-KDWIJTED.js → chunk-CWD66KRM.js} +3 -3
- package/dist/{chunk-KDWIJTED.js.map → chunk-CWD66KRM.js.map} +1 -1
- package/dist/{chunk-XISA4SYM.cjs → chunk-DAAHTUXU.cjs} +4 -4
- package/dist/{chunk-XISA4SYM.cjs.map → chunk-DAAHTUXU.cjs.map} +1 -1
- package/dist/{chunk-JIAMBOU7.cjs → chunk-DAS5UQN6.cjs} +4 -4
- package/dist/{chunk-JIAMBOU7.cjs.map → chunk-DAS5UQN6.cjs.map} +1 -1
- package/dist/{chunk-JURD5MC3.js → chunk-DHOVQ2TW.js} +15 -16
- package/dist/chunk-DHOVQ2TW.js.map +1 -0
- package/dist/{chunk-ISY2BOFY.js → chunk-DJ5LXAG3.js} +3 -3
- package/dist/{chunk-ISY2BOFY.js.map → chunk-DJ5LXAG3.js.map} +1 -1
- package/dist/chunk-EWMXK3EI.cjs +8 -0
- package/dist/chunk-EWMXK3EI.cjs.map +1 -0
- package/dist/{chunk-IWIN6HKU.cjs → chunk-EYIPM2XB.cjs} +4 -4
- package/dist/{chunk-IWIN6HKU.cjs.map → chunk-EYIPM2XB.cjs.map} +1 -1
- package/dist/{chunk-G7VCXMQB.cjs → chunk-FDISA5KO.cjs} +4 -4
- package/dist/{chunk-G7VCXMQB.cjs.map → chunk-FDISA5KO.cjs.map} +1 -1
- package/dist/{chunk-CVV4HROS.cjs → chunk-FMS5PNM2.cjs} +4 -4
- package/dist/chunk-FMS5PNM2.cjs.map +1 -0
- package/dist/{chunk-BR3SBEFE.cjs → chunk-FRLSKIUI.cjs} +19 -21
- package/dist/chunk-FRLSKIUI.cjs.map +1 -0
- package/dist/{chunk-MLCMKHMK.cjs → chunk-HHULC5GT.cjs} +4 -4
- package/dist/{chunk-MLCMKHMK.cjs.map → chunk-HHULC5GT.cjs.map} +1 -1
- package/dist/{chunk-STAQJVW4.cjs → chunk-HJQYMALV.cjs} +4 -4
- package/dist/{chunk-STAQJVW4.cjs.map → chunk-HJQYMALV.cjs.map} +1 -1
- package/dist/{chunk-QQJXXNUE.cjs → chunk-HUNYAVJJ.cjs} +4 -4
- package/dist/{chunk-QQJXXNUE.cjs.map → chunk-HUNYAVJJ.cjs.map} +1 -1
- package/dist/{chunk-6FE3CWV6.js → chunk-IWNJ47CV.js} +3 -3
- package/dist/{chunk-6FE3CWV6.js.map → chunk-IWNJ47CV.js.map} +1 -1
- package/dist/{chunk-4HJUQVXR.js → chunk-KF5EI2IB.js} +6 -7
- package/dist/chunk-KF5EI2IB.js.map +1 -0
- package/dist/{chunk-FPWOK2CR.js → chunk-LFLFNQMQ.js} +3 -3
- package/dist/chunk-LFLFNQMQ.js.map +1 -0
- package/dist/{chunk-ZLW3243Q.cjs → chunk-LGWRJM5X.cjs} +4 -4
- package/dist/chunk-LGWRJM5X.cjs.map +1 -0
- package/dist/chunk-M2LJZXVR.js +152 -0
- package/dist/chunk-M2LJZXVR.js.map +1 -0
- package/dist/{chunk-V4FLCCD4.js → chunk-MUC6XWII.js} +3 -3
- package/dist/{chunk-V4FLCCD4.js.map → chunk-MUC6XWII.js.map} +1 -1
- package/dist/{chunk-RHLDDKX6.js → chunk-NV3P6XBU.js} +98 -29
- package/dist/chunk-NV3P6XBU.js.map +1 -0
- package/dist/{chunk-YOPRPXER.cjs → chunk-NZN6OX4H.cjs} +4 -4
- package/dist/{chunk-YOPRPXER.cjs.map → chunk-NZN6OX4H.cjs.map} +1 -1
- package/dist/{chunk-EKWD4ODT.cjs → chunk-OZMUKLXN.cjs} +4 -4
- package/dist/{chunk-EKWD4ODT.cjs.map → chunk-OZMUKLXN.cjs.map} +1 -1
- package/dist/{chunk-K6E7LOWZ.js → chunk-P6OWDUN7.js} +3 -3
- package/dist/{chunk-K6E7LOWZ.js.map → chunk-P6OWDUN7.js.map} +1 -1
- package/dist/{chunk-PINOAERX.js → chunk-QNDU44PQ.js} +3 -3
- package/dist/{chunk-PINOAERX.js.map → chunk-QNDU44PQ.js.map} +1 -1
- package/dist/{chunk-KLVBTRLR.js → chunk-R2FAPJMZ.js} +84 -12
- package/dist/chunk-R2FAPJMZ.js.map +1 -0
- package/dist/{chunk-AKDJSXVJ.cjs → chunk-RTQEMQIC.cjs} +4 -4
- package/dist/{chunk-AKDJSXVJ.cjs.map → chunk-RTQEMQIC.cjs.map} +1 -1
- package/dist/{chunk-4JCVPUXF.cjs → chunk-S5XEXK36.cjs} +104 -35
- package/dist/chunk-S5XEXK36.cjs.map +1 -0
- package/dist/{chunk-JJXTE2SL.cjs → chunk-SB7AVZQU.cjs} +4 -4
- package/dist/{chunk-JJXTE2SL.cjs.map → chunk-SB7AVZQU.cjs.map} +1 -1
- package/dist/{chunk-EBCZUGUX.js → chunk-SJZ66FD5.js} +4 -4
- package/dist/chunk-SJZ66FD5.js.map +1 -0
- package/dist/chunk-T526LPBK.js +6 -0
- package/dist/chunk-T526LPBK.js.map +1 -0
- package/dist/{chunk-M3UUJIMO.js → chunk-U7CANHDD.js} +3 -3
- package/dist/{chunk-M3UUJIMO.js.map → chunk-U7CANHDD.js.map} +1 -1
- package/dist/{chunk-HNP33VR5.cjs → chunk-UQWVZTEA.cjs} +3 -3
- package/dist/chunk-UQWVZTEA.cjs.map +1 -0
- package/dist/{chunk-YOD5F25S.js → chunk-V6QQZLEU.js} +3 -3
- package/dist/{chunk-YOD5F25S.js.map → chunk-V6QQZLEU.js.map} +1 -1
- package/dist/{chunk-GENABZQ3.js → chunk-VTC3FL4B.js} +3 -3
- package/dist/{chunk-GENABZQ3.js.map → chunk-VTC3FL4B.js.map} +1 -1
- package/dist/{chunk-IBELIKBL.js → chunk-WXGYFLFX.js} +3 -3
- package/dist/{chunk-IBELIKBL.js.map → chunk-WXGYFLFX.js.map} +1 -1
- package/dist/{chunk-ANRUSNYD.cjs → chunk-X6BQTEIT.cjs} +4 -4
- package/dist/{chunk-ANRUSNYD.cjs.map → chunk-X6BQTEIT.cjs.map} +1 -1
- package/dist/{chunk-WFBQUWRC.js → chunk-XMC355U2.js} +10 -3
- package/dist/chunk-XMC355U2.js.map +1 -0
- package/dist/{chunk-N3GNUFMA.cjs → chunk-XPQBE77T.cjs} +6 -7
- package/dist/chunk-XPQBE77T.cjs.map +1 -0
- package/dist/{chunk-SWJHENEP.cjs → chunk-YHMW7CZF.cjs} +84 -11
- package/dist/chunk-YHMW7CZF.cjs.map +1 -0
- package/dist/{chunk-UREIP7XG.js → chunk-YVC4NGW2.js} +3 -3
- package/dist/{chunk-UREIP7XG.js.map → chunk-YVC4NGW2.js.map} +1 -1
- package/dist/{chunk-UFQVOZZ6.cjs → chunk-Z76DIRLA.cjs} +55 -5
- package/dist/chunk-Z76DIRLA.cjs.map +1 -0
- package/dist/{chunk-ZAPK7HZS.js → chunk-ZCODWFCC.js} +3 -3
- package/dist/{chunk-ZAPK7HZS.js.map → chunk-ZCODWFCC.js.map} +1 -1
- package/dist/constants/index.cjs +2 -2
- package/dist/constants/index.d.cts +7 -1
- package/dist/constants/index.d.ts +7 -1
- package/dist/constants/index.js +1 -1
- package/dist/{createGenericFetchClient-D4tfhW6Z.d.ts → createGenericFetchClient-B2Gp1a8f.d.ts} +1 -1
- package/dist/{createGenericFetchClient-CrB9cdk8.d.cts → createGenericFetchClient-DJ-oaxPj.d.cts} +1 -1
- package/dist/{createOpenapiFetchClient-DLA4-_yg.d.ts → createOpenapiFetchClient-BMaILWyq.d.ts} +1 -1
- package/dist/{createOpenapiFetchClient-zK2SckO2.d.cts → createOpenapiFetchClient-DQL2ZYNb.d.cts} +1 -1
- package/dist/dataScience/index.cjs +4 -4
- package/dist/dataScience/index.d.cts +1 -1
- package/dist/dataScience/index.d.ts +1 -1
- package/dist/dataScience/index.js +2 -2
- package/dist/domain/permissions/index.d.cts +3 -3
- package/dist/domain/permissions/index.d.ts +3 -3
- package/dist/editor/index.cjs +3 -3
- package/dist/editor/index.d.cts +1 -1
- package/dist/editor/index.d.ts +1 -1
- package/dist/editor/index.js +2 -2
- package/dist/encryption/index.d.cts +3 -3
- package/dist/encryption/index.d.ts +3 -3
- package/dist/encryption/types.d.cts +2 -2
- package/dist/encryption/types.d.ts +2 -2
- package/dist/import/index.cjs +3 -3
- package/dist/import/index.d.cts +1 -1
- package/dist/import/index.d.ts +1 -1
- package/dist/import/index.js +2 -2
- package/dist/index.cjs +1586 -893
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1410 -1029
- package/dist/index.d.ts +1410 -1029
- package/dist/index.js +1540 -878
- package/dist/index.js.map +1 -1
- package/dist/management/index.cjs +3 -3
- package/dist/management/index.d.cts +29 -41
- package/dist/management/index.d.ts +29 -41
- package/dist/management/index.js +1 -1
- package/dist/management/types.d.cts +3 -7
- package/dist/management/types.d.ts +3 -7
- package/dist/metastore/index.cjs +3 -3
- package/dist/metastore/index.d.cts +13 -32
- package/dist/metastore/index.d.ts +13 -32
- package/dist/metastore/index.js +2 -2
- package/dist/metastore/types.d.cts +1 -1
- package/dist/metastore/types.d.ts +1 -1
- package/dist/notifications/index.cjs +3 -3
- package/dist/notifications/index.d.cts +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/notifications/index.js +2 -2
- package/dist/oauth/index.cjs +3 -3
- package/dist/oauth/index.d.cts +1 -1
- package/dist/oauth/index.d.ts +1 -1
- package/dist/oauth/index.js +2 -2
- package/dist/{project-Bj7A_TSe.d.ts → project-BpTHlKfO.d.ts} +2 -2
- package/dist/{project-CX3TEH8A.d.cts → project-DEFMKeAm.d.cts} +2 -2
- package/dist/queryService/index.cjs +3 -3
- package/dist/queryService/index.d.cts +1 -1
- package/dist/queryService/index.d.ts +1 -1
- package/dist/queryService/index.js +2 -2
- package/dist/queue/index.cjs +3 -3
- package/dist/queue/index.d.cts +1 -1
- package/dist/queue/index.d.ts +1 -1
- package/dist/queue/index.js +2 -2
- package/dist/{registry-BLItWxbK.d.ts → registry-v_1krdcs.d.cts} +136 -1
- package/dist/{registry-BLItWxbK.d.cts → registry-v_1krdcs.d.ts} +136 -1
- package/dist/scheduler/index.cjs +3 -3
- package/dist/scheduler/index.d.cts +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/index.js +2 -2
- package/dist/sdk/configurations/index.cjs +3 -3
- package/dist/sdk/configurations/index.d.cts +417 -25
- package/dist/sdk/configurations/index.d.ts +417 -25
- package/dist/sdk/configurations/index.js +2 -2
- package/dist/sdk/semanticLayer/index.cjs +18 -0
- package/dist/sdk/semanticLayer/index.cjs.map +1 -0
- package/dist/sdk/semanticLayer/index.d.cts +36 -0
- package/dist/sdk/semanticLayer/index.d.ts +36 -0
- package/dist/sdk/semanticLayer/index.js +5 -0
- package/dist/sdk/semanticLayer/index.js.map +1 -0
- package/dist/sdk/semanticLayer/types.cjs +4 -0
- package/dist/sdk/semanticLayer/types.cjs.map +1 -0
- package/dist/sdk/semanticLayer/types.d.cts +132 -0
- package/dist/sdk/semanticLayer/types.d.ts +132 -0
- package/dist/sdk/semanticLayer/types.js +3 -0
- package/dist/sdk/semanticLayer/types.js.map +1 -0
- package/dist/sdk/storage/index.cjs +11 -11
- package/dist/sdk/storage/index.d.cts +7 -7
- package/dist/sdk/storage/index.d.ts +7 -7
- package/dist/sdk/storage/index.js +1 -1
- package/dist/sdk/tag/index.cjs +4 -3
- package/dist/sdk/tag/index.d.cts +6 -6
- package/dist/sdk/tag/index.d.ts +6 -6
- package/dist/sdk/tag/index.js +3 -2
- package/dist/sdk/tag/types.d.cts +4 -4
- package/dist/sdk/tag/types.d.ts +4 -4
- package/dist/sdk/vault/index.cjs +8 -8
- package/dist/sdk/vault/index.d.cts +4 -4
- package/dist/sdk/vault/index.d.ts +4 -4
- package/dist/sdk/vault/index.js +2 -2
- 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 +7 -7
- package/dist/storage/index.d.ts +7 -7
- package/dist/storage/index.js +3 -3
- package/dist/storage/types.d.cts +58 -5
- package/dist/storage/types.d.ts +58 -5
- package/dist/{storageClient-Cwr5Vl45.d.ts → storageClient-BONJnuhr.d.ts} +14 -7
- package/dist/{storageClient-D1USmiC5.d.cts → storageClient-BxgbulPW.d.cts} +14 -7
- package/dist/{storageSdk-Um7iSJMs.d.ts → storageSdk-CUnp67LN.d.ts} +1 -1
- package/dist/{storageSdk-MciYsR_e.d.cts → storageSdk-uCojVKkr.d.cts} +1 -1
- package/dist/stream/index.cjs +3 -3
- package/dist/stream/index.d.cts +1 -1
- package/dist/stream/index.d.ts +1 -1
- package/dist/stream/index.js +2 -2
- package/dist/syncActions/index.cjs +3 -3
- package/dist/syncActions/index.d.cts +2 -2
- package/dist/syncActions/index.d.ts +2 -2
- package/dist/syncActions/index.js +2 -2
- package/dist/telemetry/index.cjs +3 -3
- package/dist/telemetry/index.d.cts +2 -2
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.js +2 -2
- package/dist/{types-ClxrZC77.d.cts → types-B9SJ0cIc.d.cts} +2677 -813
- package/dist/{types-l_pP5J0H.d.ts → types-BM3xJvzM.d.ts} +1 -1
- package/dist/{types-59-LNg5i.d.cts → types-BjcRP8q1.d.cts} +1 -1
- package/dist/{types-o8eTf_G9.d.ts → types-BogOtZre.d.ts} +2677 -813
- package/dist/{types-DHCbX2uR.d.cts → types-C6gjiVpQ.d.cts} +1 -1
- package/dist/{types-oJnjpvPi.d.ts → types-CbEJaobw.d.ts} +1 -1
- package/dist/{types-YEfQ5pAy.d.cts → types-DJLceKR0.d.cts} +445 -137
- package/dist/{types-YEfQ5pAy.d.ts → types-DJLceKR0.d.ts} +445 -137
- package/dist/{types-BowqtZ7v.d.ts → types-Do0nBZbY.d.ts} +355 -108
- package/dist/{types-0yn6OefX.d.ts → types-DqxZDbM1.d.cts} +1 -1
- package/dist/{types-0yn6OefX.d.cts → types-DqxZDbM1.d.ts} +1 -1
- package/dist/{types-BCPmAXOQ.d.cts → types-VK3k4Z6R.d.cts} +355 -108
- package/dist/vault/index.cjs +3 -3
- package/dist/vault/index.d.cts +1 -1
- package/dist/vault/index.d.ts +1 -1
- package/dist/vault/index.js +2 -2
- package/package.json +28 -2
- package/surface/auth.md +2 -2
- package/surface/chat.md +1 -1
- package/surface/dataScience.md +1 -1
- package/surface/editor.md +5 -5
- package/surface/kaiAgent.md +1 -1
- package/surface/management.md +15 -4
- package/surface/metastore.md +10 -10
- package/surface/queue.md +1 -1
- package/surface/sdk.md +19 -6
- package/surface/storage.md +11 -3
- package/surface/stream.md +7 -7
- package/dist/authMiddleware-BcRYj3eQ.d.cts +0 -5
- package/dist/authMiddleware-CirRGURb.d.ts +0 -5
- package/dist/chunk-4HJUQVXR.js.map +0 -1
- package/dist/chunk-4JCVPUXF.cjs.map +0 -1
- package/dist/chunk-AWRMGLMT.cjs.map +0 -1
- package/dist/chunk-BR3SBEFE.cjs.map +0 -1
- package/dist/chunk-CVV4HROS.cjs.map +0 -1
- package/dist/chunk-EBCZUGUX.js.map +0 -1
- package/dist/chunk-FPWOK2CR.js.map +0 -1
- package/dist/chunk-HNP33VR5.cjs.map +0 -1
- package/dist/chunk-JURD5MC3.js.map +0 -1
- package/dist/chunk-KLVBTRLR.js.map +0 -1
- package/dist/chunk-KQ2QNGRX.js.map +0 -1
- package/dist/chunk-N3GNUFMA.cjs.map +0 -1
- package/dist/chunk-RHLDDKX6.js.map +0 -1
- package/dist/chunk-SWJHENEP.cjs.map +0 -1
- package/dist/chunk-TTPJSPZA.cjs.map +0 -1
- package/dist/chunk-UFQVOZZ6.cjs.map +0 -1
- package/dist/chunk-WFBQUWRC.js.map +0 -1
- package/dist/chunk-WJRHT346.js.map +0 -1
- package/dist/chunk-YUTWLJBK.js.map +0 -1
- package/dist/chunk-ZLW3243Q.cjs.map +0 -1
- package/dist/schemas-CraXbXke.d.cts +0 -74
- package/dist/schemas-CraXbXke.d.ts +0 -74
- package/dist/{backends-Bofq_Nr0.d.cts → adminRoles-Cil1lavB.d.cts} +6 -6
- package/dist/{backends-Bofq_Nr0.d.ts → adminRoles-Cil1lavB.d.ts} +6 -6
package/dist/index.js
CHANGED
|
@@ -1,276 +1,51 @@
|
|
|
1
|
+
import { createConfigurationSdk } from './chunk-4IEIVLYT.js';
|
|
2
|
+
export { isEmptyDeep, schemaGuidedMerge } from './chunk-4IEIVLYT.js';
|
|
3
|
+
import { createProject } from './chunk-UABYNGBZ.js';
|
|
1
4
|
import { createStorageTable } from './chunk-ZOREOLGE.js';
|
|
2
5
|
import { ProjectFeature } from './chunk-GM3AKU5T.js';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
export {
|
|
10
|
-
import './chunk-
|
|
11
|
-
|
|
12
|
-
import { createStorageClient, ServiceUnavailableError } from './chunk-
|
|
13
|
-
export { ServiceUnavailableError, series } from './chunk-
|
|
14
|
-
export { concurrent } from './chunk-
|
|
15
|
-
import { createStreamClient } from './chunk-
|
|
16
|
-
import { createSyncActionsClient } from './chunk-
|
|
17
|
-
import { createTelemetryClient } from './chunk-
|
|
18
|
-
import { createVaultClient } from './chunk-
|
|
6
|
+
import './chunk-XMC355U2.js';
|
|
7
|
+
import { createVaultSdk } from './chunk-2BOG5U7C.js';
|
|
8
|
+
import { createTagSdk } from './chunk-DHOVQ2TW.js';
|
|
9
|
+
export { keboolaUID } from './chunk-DHOVQ2TW.js';
|
|
10
|
+
import { createSemanticLayerSdk } from './chunk-M2LJZXVR.js';
|
|
11
|
+
import { generateUUID } from './chunk-T526LPBK.js';
|
|
12
|
+
export { generateUUID } from './chunk-T526LPBK.js';
|
|
13
|
+
import { delay, createStorageSdk } from './chunk-6BYHD5DG.js';
|
|
14
|
+
export { PollException, createStorageSdk, delay, poll } from './chunk-6BYHD5DG.js';
|
|
15
|
+
import { createStorageClient, ServiceUnavailableError } from './chunk-NV3P6XBU.js';
|
|
16
|
+
export { ServiceUnavailableError, series } from './chunk-NV3P6XBU.js';
|
|
17
|
+
export { concurrent } from './chunk-SJZ66FD5.js';
|
|
18
|
+
import { createStreamClient } from './chunk-DJ5LXAG3.js';
|
|
19
|
+
import { createSyncActionsClient } from './chunk-V6QQZLEU.js';
|
|
20
|
+
import { createTelemetryClient } from './chunk-ZCODWFCC.js';
|
|
21
|
+
import { createVaultClient } from './chunk-WXGYFLFX.js';
|
|
19
22
|
export { UserError } from './chunk-G3N5KDEY.js';
|
|
20
|
-
import { createImportClient } from './chunk-
|
|
21
|
-
import { createManagementClient } from './chunk-
|
|
22
|
-
export { isManagementClientAuthError } from './chunk-
|
|
23
|
+
import { createImportClient } from './chunk-MUC6XWII.js';
|
|
24
|
+
import { createManagementClient, dedupe } from './chunk-R2FAPJMZ.js';
|
|
25
|
+
export { dedupe, isManagementClientAuthError } from './chunk-R2FAPJMZ.js';
|
|
23
26
|
export { ManagementClientAuthError } from './chunk-ZHNOZHJG.js';
|
|
24
|
-
import { createMetastoreClient } from './chunk-
|
|
25
|
-
import { createNotificationsClient } from './chunk-
|
|
26
|
-
import { createOauthClient } from './chunk-
|
|
27
|
-
import { createSchedulerClient } from './chunk-
|
|
28
|
-
import { createQueryServiceClient } from './chunk-
|
|
29
|
-
import { createQueueClient } from './chunk-
|
|
30
|
-
import { createAiClient } from './chunk-
|
|
31
|
-
import { createAuthClient } from './chunk-
|
|
32
|
-
import { createChatClient } from './chunk-
|
|
27
|
+
import { createMetastoreClient } from './chunk-LFLFNQMQ.js';
|
|
28
|
+
import { createNotificationsClient } from './chunk-5FDQYOJD.js';
|
|
29
|
+
import { createOauthClient } from './chunk-VTC3FL4B.js';
|
|
30
|
+
import { createSchedulerClient } from './chunk-IWNJ47CV.js';
|
|
31
|
+
import { createQueryServiceClient } from './chunk-CWD66KRM.js';
|
|
32
|
+
import { createQueueClient } from './chunk-QNDU44PQ.js';
|
|
33
|
+
import { createAiClient } from './chunk-YVC4NGW2.js';
|
|
34
|
+
import { createAuthClient } from './chunk-KF5EI2IB.js';
|
|
35
|
+
import { createChatClient } from './chunk-U7CANHDD.js';
|
|
33
36
|
import './chunk-4RC5E3SL.js';
|
|
34
|
-
import { createDataScienceClient } from './chunk-
|
|
35
|
-
export { parseLogLines } from './chunk-
|
|
37
|
+
import { createDataScienceClient } from './chunk-4WX5W7YU.js';
|
|
38
|
+
export { parseLogLines } from './chunk-4WX5W7YU.js';
|
|
36
39
|
import { isPlainObject } from './chunk-MSI6FVGG.js';
|
|
37
40
|
export { isPlainObject } from './chunk-MSI6FVGG.js';
|
|
38
|
-
import { createEditorClient } from './chunk-
|
|
39
|
-
import { createAuthHeaders } from './chunk-
|
|
41
|
+
import { createEditorClient } from './chunk-P6OWDUN7.js';
|
|
42
|
+
import { createAuthHeaders } from './chunk-6JXSO3AR.js';
|
|
40
43
|
import { createEncryptionClient } from './chunk-EXNR4FGV.js';
|
|
41
|
-
import { KeboolaHttpHeader, HttpStatus, isApiError, ApiError, createOpenapiFetchClient, createGenericFetchClient } from './chunk-RK2VGHJE.js';
|
|
44
|
+
import { KeboolaHttpHeader, HttpStatus, isApiError, ApiError, HttpHeader, createOpenapiFetchClient, createGenericFetchClient } from './chunk-RK2VGHJE.js';
|
|
42
45
|
export { ApiError, HttpContentType, HttpHeader, KeboolaHttpHeader, createGenericFetchClient, isAbortError, isApiError, isFetchClientError } from './chunk-RK2VGHJE.js';
|
|
46
|
+
import * as z2 from 'zod';
|
|
43
47
|
import { z } from 'zod';
|
|
44
48
|
|
|
45
|
-
var agentSettingsSchema = z.object({
|
|
46
|
-
projectId: z.string(),
|
|
47
|
-
customInstructions: z.string().nullable(),
|
|
48
|
-
createdAt: z.string(),
|
|
49
|
-
updatedAt: z.string()
|
|
50
|
-
});
|
|
51
|
-
var toolPermissionValueSchema = z.enum(["always_allow", "always_ask", "blocked"]);
|
|
52
|
-
var userAgentSettingsSchema = z.object({
|
|
53
|
-
projectId: z.string(),
|
|
54
|
-
userId: z.string(),
|
|
55
|
-
customInstructions: z.string().nullable(),
|
|
56
|
-
toolPermissions: z.record(z.string(), toolPermissionValueSchema).nullable(),
|
|
57
|
-
createdAt: z.string(),
|
|
58
|
-
updatedAt: z.string()
|
|
59
|
-
});
|
|
60
|
-
var toolInfoSchema = z.object({
|
|
61
|
-
name: z.string(),
|
|
62
|
-
description: z.string(),
|
|
63
|
-
readOnly: z.boolean()
|
|
64
|
-
});
|
|
65
|
-
var toolsListResponseSchema = z.object({
|
|
66
|
-
tools: z.array(toolInfoSchema)
|
|
67
|
-
});
|
|
68
|
-
var skillInfoSchema = z.object({
|
|
69
|
-
name: z.string(),
|
|
70
|
-
description: z.string().nullable(),
|
|
71
|
-
source: z.enum(["first-party", "vendored", "project"])
|
|
72
|
-
});
|
|
73
|
-
var builtInCommandSchema = z.object({
|
|
74
|
-
name: z.string(),
|
|
75
|
-
description: z.string()
|
|
76
|
-
});
|
|
77
|
-
var skillsListResponseSchema = z.object({
|
|
78
|
-
skills: z.array(skillInfoSchema),
|
|
79
|
-
commands: z.array(builtInCommandSchema)
|
|
80
|
-
});
|
|
81
|
-
var sandboxFileEntrySchema = z.object({
|
|
82
|
-
name: z.string(),
|
|
83
|
-
path: z.string(),
|
|
84
|
-
type: z.enum(["file", "dir"]),
|
|
85
|
-
size: z.number().int().nonnegative().optional()
|
|
86
|
-
});
|
|
87
|
-
var sandboxFileListingSchema = z.object({
|
|
88
|
-
entries: z.array(sandboxFileEntrySchema)
|
|
89
|
-
});
|
|
90
|
-
var sandboxFileContentSchema = z.object({
|
|
91
|
-
content: z.string(),
|
|
92
|
-
encoding: z.enum(["utf-8", "binary"]),
|
|
93
|
-
truncated: z.boolean(),
|
|
94
|
-
size: z.number().int().nonnegative()
|
|
95
|
-
});
|
|
96
|
-
var sandboxGitBranchSchema = z.object({
|
|
97
|
-
branch: z.string().nullable()
|
|
98
|
-
});
|
|
99
|
-
var createKaiAgentClient = ({ baseUrl, middlewares, auth }) => {
|
|
100
|
-
const clientOptions = {
|
|
101
|
-
baseUrl,
|
|
102
|
-
middlewares,
|
|
103
|
-
headers: createAuthHeaders(auth)
|
|
104
|
-
};
|
|
105
|
-
const client = createOpenapiFetchClient(clientOptions);
|
|
106
|
-
const genericClient = createGenericFetchClient(clientOptions);
|
|
107
|
-
const getHistory = async (params) => {
|
|
108
|
-
const { data } = await client.get("/api/history", { query: params });
|
|
109
|
-
return data;
|
|
110
|
-
};
|
|
111
|
-
const getChat = async (chatId, signal) => {
|
|
112
|
-
const { data } = await client.get("/api/chat/{id}", { path: { id: chatId } }, { signal });
|
|
113
|
-
return data;
|
|
114
|
-
};
|
|
115
|
-
const deleteChat = async (chatId) => {
|
|
116
|
-
const { data } = await client.delete("/api/chat", { query: { id: chatId } });
|
|
117
|
-
return data;
|
|
118
|
-
};
|
|
119
|
-
const createChat = async (request) => {
|
|
120
|
-
const { response } = await client.post("/api/chat", { body: request });
|
|
121
|
-
return response;
|
|
122
|
-
};
|
|
123
|
-
const getVotes = async (chatId) => {
|
|
124
|
-
const { data } = await client.get("/api/vote", { query: { chatId } });
|
|
125
|
-
return data;
|
|
126
|
-
};
|
|
127
|
-
const submitVote = async (params) => {
|
|
128
|
-
await client.patch("/api/vote", { body: params });
|
|
129
|
-
};
|
|
130
|
-
const getUsage = async (signal) => {
|
|
131
|
-
const { data } = await client.get("/api/usage", {}, { signal });
|
|
132
|
-
return data;
|
|
133
|
-
};
|
|
134
|
-
const approveToolCall = async (chatId, body) => {
|
|
135
|
-
await client.post("/api/chat/{id}/approval", { path: { id: chatId }, body });
|
|
136
|
-
};
|
|
137
|
-
const submitToolOutput = async (chatId, body) => {
|
|
138
|
-
await client.post("/api/chat/{id}/ui-tool-result", { path: { id: chatId }, body });
|
|
139
|
-
};
|
|
140
|
-
const stopChat = async (chatId) => {
|
|
141
|
-
const { data } = await client.post("/api/chat/{id}/stop", { path: { id: chatId } });
|
|
142
|
-
return data;
|
|
143
|
-
};
|
|
144
|
-
const getSuggestions = async (request, signal) => {
|
|
145
|
-
const { data } = await client.post("/api/suggestions", { body: request }, { signal });
|
|
146
|
-
return data;
|
|
147
|
-
};
|
|
148
|
-
const getAgentSettings = async (signal) => {
|
|
149
|
-
const { data } = await genericClient.get("/api/settings", {}, { signal });
|
|
150
|
-
const result = agentSettingsSchema.safeParse(data);
|
|
151
|
-
if (!result.success) {
|
|
152
|
-
throw new Error("Invalid agent settings response format");
|
|
153
|
-
}
|
|
154
|
-
return result.data;
|
|
155
|
-
};
|
|
156
|
-
const updateAgentSettings = async (request, signal) => {
|
|
157
|
-
const { data } = await genericClient.patch(
|
|
158
|
-
"/api/settings",
|
|
159
|
-
{ body: request },
|
|
160
|
-
{ signal }
|
|
161
|
-
);
|
|
162
|
-
const result = agentSettingsSchema.safeParse(data);
|
|
163
|
-
if (!result.success) {
|
|
164
|
-
throw new Error("Invalid agent settings response format");
|
|
165
|
-
}
|
|
166
|
-
return result.data;
|
|
167
|
-
};
|
|
168
|
-
const getUserAgentSettings = async (signal) => {
|
|
169
|
-
const { data } = await genericClient.get(
|
|
170
|
-
"/api/settings/user",
|
|
171
|
-
{},
|
|
172
|
-
{ signal }
|
|
173
|
-
);
|
|
174
|
-
const result = userAgentSettingsSchema.safeParse(data);
|
|
175
|
-
if (!result.success) {
|
|
176
|
-
throw new Error("Invalid user agent settings response format");
|
|
177
|
-
}
|
|
178
|
-
return result.data;
|
|
179
|
-
};
|
|
180
|
-
const updateUserAgentSettings = async (request, signal) => {
|
|
181
|
-
const { data } = await genericClient.patch(
|
|
182
|
-
"/api/settings/user",
|
|
183
|
-
{ body: request },
|
|
184
|
-
{ signal }
|
|
185
|
-
);
|
|
186
|
-
const result = userAgentSettingsSchema.safeParse(data);
|
|
187
|
-
if (!result.success) {
|
|
188
|
-
throw new Error("Invalid user agent settings response format");
|
|
189
|
-
}
|
|
190
|
-
return result.data;
|
|
191
|
-
};
|
|
192
|
-
const getToolsList = async (signal) => {
|
|
193
|
-
const { data } = await genericClient.get(
|
|
194
|
-
"/api/settings/tools",
|
|
195
|
-
{},
|
|
196
|
-
{ signal }
|
|
197
|
-
);
|
|
198
|
-
const result = toolsListResponseSchema.safeParse(data);
|
|
199
|
-
if (!result.success) {
|
|
200
|
-
throw new Error("Invalid tools list response format");
|
|
201
|
-
}
|
|
202
|
-
return result.data;
|
|
203
|
-
};
|
|
204
|
-
const getSkillsList = async (signal) => {
|
|
205
|
-
const { data } = await genericClient.get("/api/skills", {}, { signal });
|
|
206
|
-
const result = skillsListResponseSchema.safeParse(data);
|
|
207
|
-
if (!result.success) {
|
|
208
|
-
throw new Error("Invalid skills list response format");
|
|
209
|
-
}
|
|
210
|
-
return result.data;
|
|
211
|
-
};
|
|
212
|
-
const listSandboxFiles = async (chatId, path, signal) => {
|
|
213
|
-
const { data } = await genericClient.get(
|
|
214
|
-
`/api/chat/${encodeURIComponent(chatId)}/sandbox/files`,
|
|
215
|
-
{ query: path ? { path } : void 0 },
|
|
216
|
-
{ signal }
|
|
217
|
-
);
|
|
218
|
-
const result = sandboxFileListingSchema.safeParse(data);
|
|
219
|
-
if (!result.success) {
|
|
220
|
-
throw new Error("Invalid sandbox files response format");
|
|
221
|
-
}
|
|
222
|
-
return result.data;
|
|
223
|
-
};
|
|
224
|
-
const readSandboxFile = async (chatId, path, signal) => {
|
|
225
|
-
const { data } = await genericClient.get(
|
|
226
|
-
`/api/chat/${encodeURIComponent(chatId)}/sandbox/file`,
|
|
227
|
-
{ query: { path } },
|
|
228
|
-
{ signal }
|
|
229
|
-
);
|
|
230
|
-
const result = sandboxFileContentSchema.safeParse(data);
|
|
231
|
-
if (!result.success) {
|
|
232
|
-
throw new Error("Invalid sandbox file response format");
|
|
233
|
-
}
|
|
234
|
-
return result.data;
|
|
235
|
-
};
|
|
236
|
-
const getSandboxGitBranch = async (chatId, signal) => {
|
|
237
|
-
const { data } = await genericClient.get(
|
|
238
|
-
`/api/chat/${encodeURIComponent(chatId)}/sandbox/git-branch`,
|
|
239
|
-
{},
|
|
240
|
-
{ signal }
|
|
241
|
-
);
|
|
242
|
-
const result = sandboxGitBranchSchema.safeParse(data);
|
|
243
|
-
if (!result.success) {
|
|
244
|
-
throw new Error("Invalid sandbox git-branch response format");
|
|
245
|
-
}
|
|
246
|
-
return result.data;
|
|
247
|
-
};
|
|
248
|
-
const chatStreamUrl = clientOptions.baseUrl + "/api/chat";
|
|
249
|
-
return {
|
|
250
|
-
getHistory,
|
|
251
|
-
getChat,
|
|
252
|
-
deleteChat,
|
|
253
|
-
createChat,
|
|
254
|
-
getVotes,
|
|
255
|
-
submitVote,
|
|
256
|
-
getUsage,
|
|
257
|
-
approveToolCall,
|
|
258
|
-
submitToolOutput,
|
|
259
|
-
stopChat,
|
|
260
|
-
getSuggestions,
|
|
261
|
-
getAgentSettings,
|
|
262
|
-
updateAgentSettings,
|
|
263
|
-
getUserAgentSettings,
|
|
264
|
-
updateUserAgentSettings,
|
|
265
|
-
getToolsList,
|
|
266
|
-
getSkillsList,
|
|
267
|
-
listSandboxFiles,
|
|
268
|
-
readSandboxFile,
|
|
269
|
-
getSandboxGitBranch,
|
|
270
|
-
chatStreamUrl
|
|
271
|
-
};
|
|
272
|
-
};
|
|
273
|
-
|
|
274
49
|
// src/utils/assert.ts
|
|
275
50
|
function assert(value, message) {
|
|
276
51
|
if (value == null) {
|
|
@@ -278,7 +53,7 @@ function assert(value, message) {
|
|
|
278
53
|
}
|
|
279
54
|
}
|
|
280
55
|
|
|
281
|
-
// src/utils/coalesce.ts
|
|
56
|
+
// src/utils/async/coalesce.ts
|
|
282
57
|
var coalesce = (task) => {
|
|
283
58
|
let running = false;
|
|
284
59
|
const waiters = [];
|
|
@@ -318,6 +93,10 @@ var createStore = (initial) => {
|
|
|
318
93
|
return () => {
|
|
319
94
|
listeners.delete(listener);
|
|
320
95
|
};
|
|
96
|
+
},
|
|
97
|
+
dispose: () => {
|
|
98
|
+
value = initial;
|
|
99
|
+
listeners.clear();
|
|
321
100
|
}
|
|
322
101
|
};
|
|
323
102
|
};
|
|
@@ -342,13 +121,84 @@ var createDerivedStore = ({
|
|
|
342
121
|
}) => {
|
|
343
122
|
let key = dependsOn(source.get());
|
|
344
123
|
const store = createStore(build(key));
|
|
345
|
-
source.subscribe((state) => {
|
|
124
|
+
const unsubscribe = source.subscribe((state) => {
|
|
346
125
|
const next = dependsOn(state);
|
|
347
126
|
if (keyEquals(key, next)) return;
|
|
348
127
|
key = next;
|
|
349
128
|
store.set(build(next));
|
|
350
129
|
});
|
|
351
|
-
return {
|
|
130
|
+
return {
|
|
131
|
+
get: store.get,
|
|
132
|
+
subscribe: store.subscribe,
|
|
133
|
+
dispose: () => {
|
|
134
|
+
unsubscribe();
|
|
135
|
+
store.dispose();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
var createDerivedAsyncStore = ({
|
|
140
|
+
source,
|
|
141
|
+
dependsOn,
|
|
142
|
+
build,
|
|
143
|
+
keyEquals = shallowEqual
|
|
144
|
+
}) => {
|
|
145
|
+
const store = createStore({ state: "idle" });
|
|
146
|
+
let currentKey = null;
|
|
147
|
+
let generation = 0;
|
|
148
|
+
let controller = null;
|
|
149
|
+
const run = (key) => {
|
|
150
|
+
controller?.abort();
|
|
151
|
+
controller = new AbortController();
|
|
152
|
+
const runGeneration = ++generation;
|
|
153
|
+
store.set({ state: "pending" });
|
|
154
|
+
build(key, controller.signal).then(
|
|
155
|
+
(value) => {
|
|
156
|
+
if (runGeneration === generation) store.set({ state: "ready", value });
|
|
157
|
+
},
|
|
158
|
+
(error) => {
|
|
159
|
+
if (runGeneration === generation) store.set({ state: "errored", error });
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
};
|
|
163
|
+
const sync = (state) => {
|
|
164
|
+
const next = dependsOn(state);
|
|
165
|
+
if (next === null) {
|
|
166
|
+
if (currentKey === null) return;
|
|
167
|
+
controller?.abort();
|
|
168
|
+
controller = null;
|
|
169
|
+
generation += 1;
|
|
170
|
+
currentKey = null;
|
|
171
|
+
store.set({ state: "idle" });
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (currentKey !== null && keyEquals(currentKey, next)) return;
|
|
175
|
+
currentKey = next;
|
|
176
|
+
run(next);
|
|
177
|
+
};
|
|
178
|
+
sync(source.get());
|
|
179
|
+
const unsubscribe = source.subscribe(sync);
|
|
180
|
+
const readable = {
|
|
181
|
+
get: store.get,
|
|
182
|
+
subscribe: store.subscribe,
|
|
183
|
+
dispose: () => {
|
|
184
|
+
controller?.abort();
|
|
185
|
+
unsubscribe();
|
|
186
|
+
store.dispose();
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
const settled = () => new Promise((resolve) => {
|
|
190
|
+
let unsubscribeSettled = () => {
|
|
191
|
+
};
|
|
192
|
+
const check = (state) => {
|
|
193
|
+
if (state.state === "ready" || state.state === "errored") {
|
|
194
|
+
unsubscribeSettled();
|
|
195
|
+
resolve(state);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
unsubscribeSettled = store.subscribe(check);
|
|
199
|
+
check(store.get());
|
|
200
|
+
});
|
|
201
|
+
return { store: readable, settled };
|
|
352
202
|
};
|
|
353
203
|
|
|
354
204
|
// src/utils/deepMerge.ts
|
|
@@ -362,285 +212,1383 @@ var deepMerge = (base, patch) => {
|
|
|
362
212
|
return out;
|
|
363
213
|
};
|
|
364
214
|
|
|
365
|
-
// src/
|
|
366
|
-
var
|
|
367
|
-
|
|
215
|
+
// src/utils/persistor/adapters.ts
|
|
216
|
+
var createNullStorage = () => ({
|
|
217
|
+
getItem: () => null,
|
|
218
|
+
setItem: () => {
|
|
219
|
+
},
|
|
220
|
+
removeItem: () => {
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
var createMemoryStorage = () => {
|
|
224
|
+
const store = /* @__PURE__ */ new Map();
|
|
225
|
+
return {
|
|
226
|
+
getItem: (key) => store.get(key) ?? null,
|
|
227
|
+
setItem: (key, value) => {
|
|
228
|
+
store.set(key, value);
|
|
229
|
+
},
|
|
230
|
+
removeItem: (key) => {
|
|
231
|
+
store.delete(key);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
};
|
|
235
|
+
var createWebStorage = (pick) => {
|
|
236
|
+
let web = null;
|
|
237
|
+
try {
|
|
238
|
+
web = pick();
|
|
239
|
+
if (web) {
|
|
240
|
+
const probe = "__keboola_storage_probe__";
|
|
241
|
+
web.setItem(probe, probe);
|
|
242
|
+
web.removeItem(probe);
|
|
243
|
+
}
|
|
244
|
+
} catch (err) {
|
|
245
|
+
console.warn("createWebStorage: web storage unavailable, falling back to memory", err);
|
|
246
|
+
web = null;
|
|
247
|
+
}
|
|
248
|
+
if (!web) return createMemoryStorage();
|
|
249
|
+
const storage = web;
|
|
250
|
+
return {
|
|
251
|
+
getItem: (key) => storage.getItem(key),
|
|
252
|
+
setItem: (key, value) => {
|
|
253
|
+
storage.setItem(key, value);
|
|
254
|
+
},
|
|
255
|
+
removeItem: (key) => {
|
|
256
|
+
storage.removeItem(key);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
var createLocalStorage = () => createWebStorage(() => "localStorage" in globalThis ? globalThis.localStorage : null);
|
|
261
|
+
var createSessionStorage = () => createWebStorage(() => "sessionStorage" in globalThis ? globalThis.sessionStorage : null);
|
|
262
|
+
|
|
263
|
+
// src/utils/persistor/persistor.ts
|
|
264
|
+
var createPersistor = ({
|
|
265
|
+
storage = createNullStorage(),
|
|
266
|
+
key,
|
|
267
|
+
schema,
|
|
268
|
+
defaultValue,
|
|
269
|
+
encode = JSON.stringify,
|
|
270
|
+
decode = JSON.parse
|
|
271
|
+
}) => {
|
|
272
|
+
const clear = () => {
|
|
273
|
+
try {
|
|
274
|
+
storage.removeItem(key);
|
|
275
|
+
} catch (err) {
|
|
276
|
+
console.warn(`createPersistor: failed to clear "${key}"`, err);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const hasPersistedValue = () => {
|
|
280
|
+
try {
|
|
281
|
+
return !!storage.getItem(key);
|
|
282
|
+
} catch (err) {
|
|
283
|
+
console.warn(`createPersistor: failed to read "${key}", assuming empty`, err);
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
const hydrate = () => {
|
|
288
|
+
let raw;
|
|
289
|
+
try {
|
|
290
|
+
raw = storage.getItem(key);
|
|
291
|
+
} catch (err) {
|
|
292
|
+
console.warn(`createPersistor: failed to read "${key}", using default`, err);
|
|
293
|
+
return defaultValue;
|
|
294
|
+
}
|
|
295
|
+
if (raw === null) return defaultValue;
|
|
296
|
+
let decoded;
|
|
297
|
+
try {
|
|
298
|
+
decoded = decode(raw);
|
|
299
|
+
} catch (err) {
|
|
300
|
+
console.warn(`createPersistor: failed to decode "${key}", resetting`, err);
|
|
301
|
+
clear();
|
|
302
|
+
return defaultValue;
|
|
303
|
+
}
|
|
304
|
+
const parsed = schema.safeParse(decoded);
|
|
305
|
+
if (parsed.success) return parsed.data;
|
|
306
|
+
clear();
|
|
307
|
+
return defaultValue;
|
|
308
|
+
};
|
|
309
|
+
const persist = (value) => {
|
|
310
|
+
let raw;
|
|
311
|
+
try {
|
|
312
|
+
raw = encode(value);
|
|
313
|
+
} catch (err) {
|
|
314
|
+
console.warn(`createPersistor: failed to encode "${key}", not persisting`, err);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
try {
|
|
318
|
+
storage.setItem(key, raw);
|
|
319
|
+
} catch (err) {
|
|
320
|
+
console.warn(`createPersistor: failed to write "${key}"`, err);
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
return { hydrate, persist, clear, hasPersistedValue };
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
// src/keboola/createLiveProject.ts
|
|
327
|
+
var STORAGE_TOKEN_MUTATING_PATTERNS = [
|
|
328
|
+
// Bucket lifecycle (create / delete / register) — changes token.bucketPermissions.
|
|
329
|
+
// At most one trailing segment, so sub-resources (tables, listing, metadata, refresh)
|
|
330
|
+
// under /buckets/{id}/... don't trigger a re-verify.
|
|
331
|
+
/\/buckets(\/[^/]+)?$/,
|
|
332
|
+
// Project feature toggles — changes token.owner.features. Anchored to
|
|
333
|
+
// /projects/{id}/features so /manage/features and /users/{id}/features don't match.
|
|
334
|
+
/\/projects\/[^/]+\/features(\/[^/]+)?$/
|
|
335
|
+
];
|
|
336
|
+
var isStorageTokenMutatingRequest = (request) => {
|
|
337
|
+
if (request.method === "GET") return false;
|
|
338
|
+
const { pathname } = new URL(request.url);
|
|
339
|
+
return STORAGE_TOKEN_MUTATING_PATTERNS.some((pattern) => pattern.test(pathname));
|
|
340
|
+
};
|
|
341
|
+
var createProjectRefreshMiddleware = (shouldRefresh, requestRefresh) => (next) => async (request) => {
|
|
342
|
+
const response = await next(request);
|
|
343
|
+
if (shouldRefresh(request.request)) await requestRefresh();
|
|
344
|
+
return response;
|
|
345
|
+
};
|
|
346
|
+
var createLiveProject = ({
|
|
347
|
+
initialToken,
|
|
348
|
+
verify
|
|
349
|
+
}) => {
|
|
350
|
+
const store = createStore(createProject({ sapiToken: initialToken }));
|
|
351
|
+
const refresh = coalesce(async () => store.set(createProject({ sapiToken: await verify() })));
|
|
352
|
+
const middleware = createProjectRefreshMiddleware(isStorageTokenMutatingRequest, refresh);
|
|
353
|
+
return { store, getProject: () => store.get(), subscribe: store.subscribe, middleware, refresh };
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
// src/keboola/errors.ts
|
|
357
|
+
var KeboolaErrorType = {
|
|
358
|
+
Unconfigured: "unconfigured",
|
|
359
|
+
NotAuthenticated: "not-authenticated",
|
|
360
|
+
AlreadyAuthenticated: "already-authenticated",
|
|
361
|
+
NoStorageToken: "no-storage-token",
|
|
362
|
+
NoManagementToken: "no-management-token",
|
|
363
|
+
MissingProject: "missing-project",
|
|
364
|
+
NotBearer: "not-bearer",
|
|
365
|
+
NotReady: "not-ready",
|
|
366
|
+
InvalidBuildTransition: "invalid-build-transition"
|
|
367
|
+
};
|
|
368
|
+
var MESSAGES = {
|
|
369
|
+
[KeboolaErrorType.Unconfigured]: "The session is not configured \u2014 set a baseUrl first.",
|
|
370
|
+
[KeboolaErrorType.NotAuthenticated]: "The session is not authenticated \u2014 sign in first.",
|
|
371
|
+
[KeboolaErrorType.AlreadyAuthenticated]: "The session is already authenticated \u2014 reset before authenticating again.",
|
|
372
|
+
[KeboolaErrorType.NoStorageToken]: "No storage token \u2014 authenticate the storage realm first.",
|
|
373
|
+
[KeboolaErrorType.NoManagementToken]: "No management token \u2014 authenticate the management realm first.",
|
|
374
|
+
[KeboolaErrorType.MissingProject]: "A bearer storage session requires a project \u2014 call setProject(projectId) first.",
|
|
375
|
+
[KeboolaErrorType.NotBearer]: "This operation requires a bearer (OAuth) session.",
|
|
376
|
+
[KeboolaErrorType.NotReady]: "The client is not ready \u2014 authenticate the storage realm first.",
|
|
377
|
+
[KeboolaErrorType.InvalidBuildTransition]: "Invalid storage build transition \u2014 the build goes idle \u2192 initializing \u2192 ready | failed."
|
|
378
|
+
};
|
|
379
|
+
var KeboolaError = class _KeboolaError extends Error {
|
|
380
|
+
type;
|
|
381
|
+
constructor(type) {
|
|
382
|
+
super(MESSAGES[type]);
|
|
383
|
+
this.type = type;
|
|
384
|
+
this.name = "KeboolaError";
|
|
385
|
+
Object.setPrototypeOf(this, _KeboolaError.prototype);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
var isKeboolaError = (error) => error instanceof KeboolaError;
|
|
389
|
+
function assert2(value, type) {
|
|
390
|
+
if (value == null) throw new KeboolaError(type);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// src/middlewares/loggingMiddleware.ts
|
|
394
|
+
var CORRELATION_ID_HEADER = "X-Correlation-ID";
|
|
395
|
+
var ALWAYS_REDACTED_HEADERS = [
|
|
396
|
+
KeboolaHttpHeader.MANAGEMENT_API_TOKEN,
|
|
397
|
+
KeboolaHttpHeader.STORAGE_API_TOKEN,
|
|
398
|
+
"authorization",
|
|
399
|
+
"cookie",
|
|
400
|
+
"set-cookie"
|
|
401
|
+
];
|
|
402
|
+
var ALWAYS_REDACTED_QUERY_PARAMS = /* @__PURE__ */ new Set([
|
|
403
|
+
"token",
|
|
404
|
+
"apikey",
|
|
405
|
+
"api_key",
|
|
406
|
+
"access_token",
|
|
407
|
+
"refresh_token",
|
|
408
|
+
"code",
|
|
409
|
+
"state",
|
|
410
|
+
"signature",
|
|
411
|
+
"sig",
|
|
412
|
+
"x-amz-signature",
|
|
413
|
+
"x-amz-credential",
|
|
414
|
+
"x-amz-security-token",
|
|
415
|
+
"password",
|
|
416
|
+
"secret"
|
|
417
|
+
]);
|
|
418
|
+
var REDACTED = "[REDACTED]";
|
|
419
|
+
var getRedactedUrl = (rawUrl) => {
|
|
420
|
+
const url = new URL(rawUrl);
|
|
421
|
+
if (url.username) url.username = REDACTED;
|
|
422
|
+
if (url.password) url.password = REDACTED;
|
|
423
|
+
url.searchParams.forEach((_value, key) => {
|
|
424
|
+
if (ALWAYS_REDACTED_QUERY_PARAMS.has(key.toLowerCase())) {
|
|
425
|
+
url.searchParams.set(key, REDACTED);
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
return url.toString();
|
|
429
|
+
};
|
|
430
|
+
var ensureCorrelationId = (request) => {
|
|
431
|
+
const correlationId = request.headers.get(CORRELATION_ID_HEADER) ?? generateUUID();
|
|
432
|
+
request.headers.set(CORRELATION_ID_HEADER, correlationId);
|
|
433
|
+
return correlationId;
|
|
434
|
+
};
|
|
435
|
+
var getRedactedHeaders = (headers, redacted) => {
|
|
436
|
+
const redactedSet = new Set(
|
|
437
|
+
[...ALWAYS_REDACTED_HEADERS, ...redacted].map((h) => h.toLowerCase())
|
|
438
|
+
);
|
|
439
|
+
const result = {};
|
|
440
|
+
headers.forEach((value, name) => {
|
|
441
|
+
result[name] = redactedSet.has(name.toLowerCase()) ? REDACTED : value;
|
|
442
|
+
});
|
|
443
|
+
return result;
|
|
444
|
+
};
|
|
445
|
+
var getRequestLog = (request, redactedHeaders) => ({
|
|
446
|
+
url: getRedactedUrl(request.url),
|
|
447
|
+
headers: getRedactedHeaders(request.headers, redactedHeaders)
|
|
448
|
+
});
|
|
449
|
+
var getResponseLog = (response, redactedHeaders) => ({
|
|
450
|
+
status: response.status,
|
|
451
|
+
statusText: response.statusText,
|
|
452
|
+
headers: getRedactedHeaders(response.headers, redactedHeaders)
|
|
453
|
+
});
|
|
454
|
+
var redactApiError = (error, redactedHeaders) => new ApiError({
|
|
455
|
+
request: new Request(getRedactedUrl(error.request.url), {
|
|
456
|
+
method: error.request.method,
|
|
457
|
+
headers: getRedactedHeaders(error.request.headers, redactedHeaders)
|
|
458
|
+
}),
|
|
459
|
+
response: new Response(null, {
|
|
460
|
+
status: error.response.status,
|
|
461
|
+
statusText: error.response.statusText,
|
|
462
|
+
headers: getRedactedHeaders(error.response.headers, redactedHeaders)
|
|
463
|
+
}),
|
|
464
|
+
data: error.data
|
|
465
|
+
});
|
|
466
|
+
var formatLog = (level, log) => {
|
|
467
|
+
const parts = [`[${level.toUpperCase()}]`, `${Math.round(log.durationMs)}ms`, log.method];
|
|
468
|
+
parts.push(log.request.url);
|
|
469
|
+
if ("response" in log) parts.push(String(log.response.status));
|
|
470
|
+
return parts.join(" ");
|
|
471
|
+
};
|
|
472
|
+
var createSafeLogger = (logger, level = "error-only") => {
|
|
473
|
+
return {
|
|
474
|
+
info: (log) => {
|
|
475
|
+
if (level !== "all") return;
|
|
476
|
+
try {
|
|
477
|
+
if (logger?.info) {
|
|
478
|
+
logger.info(log);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
console.info(formatLog("info", log));
|
|
482
|
+
} catch {
|
|
483
|
+
}
|
|
484
|
+
},
|
|
485
|
+
error: (log) => {
|
|
486
|
+
try {
|
|
487
|
+
if (logger?.error) {
|
|
488
|
+
logger.error(log);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
console.error(formatLog("error", log));
|
|
492
|
+
} catch {
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
};
|
|
497
|
+
var createLoggingMiddleware = (options = {}) => {
|
|
498
|
+
const safeLogger = createSafeLogger(options.logger, options.level);
|
|
499
|
+
const redactHeaders = options.redactHeaders ?? [];
|
|
500
|
+
return (next) => async (fetchRequest) => {
|
|
501
|
+
const correlationId = ensureCorrelationId(fetchRequest.request);
|
|
502
|
+
const start = performance.now();
|
|
503
|
+
const method = fetchRequest.request.method.toLowerCase();
|
|
504
|
+
const requestLog = getRequestLog(fetchRequest.request, redactHeaders);
|
|
505
|
+
try {
|
|
506
|
+
const result = await next(fetchRequest);
|
|
507
|
+
safeLogger.info({
|
|
508
|
+
correlationId,
|
|
509
|
+
method,
|
|
510
|
+
durationMs: performance.now() - start,
|
|
511
|
+
request: requestLog,
|
|
512
|
+
response: getResponseLog(result.response, redactHeaders)
|
|
513
|
+
});
|
|
514
|
+
return result;
|
|
515
|
+
} catch (error) {
|
|
516
|
+
if (error instanceof Error)
|
|
517
|
+
safeLogger.error({
|
|
518
|
+
correlationId,
|
|
519
|
+
method,
|
|
520
|
+
durationMs: performance.now() - start,
|
|
521
|
+
request: requestLog,
|
|
522
|
+
error: isApiError(error) ? redactApiError(error, redactHeaders) : error
|
|
523
|
+
});
|
|
524
|
+
throw error;
|
|
525
|
+
}
|
|
526
|
+
};
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
// src/middlewares/retryMiddleware.ts
|
|
530
|
+
var DEFAULT_MAX_RETRIES = 5;
|
|
531
|
+
var DEFAULT_RETRYABLE_STATUSES = [
|
|
532
|
+
HttpStatus.INTERNAL_SERVER_ERROR,
|
|
533
|
+
HttpStatus.BAD_GATEWAY,
|
|
534
|
+
HttpStatus.SERVICE_UNAVAILABLE,
|
|
535
|
+
HttpStatus.GATEWAY_TIMEOUT
|
|
536
|
+
];
|
|
537
|
+
var DEFAULT_BACKOFF_FACTOR = 0.3;
|
|
538
|
+
var defaultShouldRetry = (error) => error instanceof ApiError && DEFAULT_RETRYABLE_STATUSES.includes(error.response.status);
|
|
539
|
+
var createRetryMiddleware = (options) => {
|
|
540
|
+
const {
|
|
541
|
+
maxRetries = DEFAULT_MAX_RETRIES,
|
|
542
|
+
backoffFactor = DEFAULT_BACKOFF_FACTOR,
|
|
543
|
+
shouldRetry = defaultShouldRetry
|
|
544
|
+
} = options ?? {};
|
|
545
|
+
if (!Number.isInteger(maxRetries) || maxRetries < 0) {
|
|
546
|
+
throw new RangeError("maxRetries must be a non-negative integer");
|
|
547
|
+
}
|
|
548
|
+
if (!Number.isFinite(backoffFactor) || backoffFactor < 0) {
|
|
549
|
+
throw new RangeError("backoffFactor must be a finite non-negative number");
|
|
550
|
+
}
|
|
551
|
+
return (next) => async (request) => {
|
|
552
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
553
|
+
try {
|
|
554
|
+
return await next({ ...request, request: request.request.clone() });
|
|
555
|
+
} catch (error) {
|
|
556
|
+
if (attempt === maxRetries || !shouldRetry(error, attempt)) {
|
|
557
|
+
throw error;
|
|
558
|
+
}
|
|
559
|
+
const delayMs = backoffFactor * 1e3 * Math.pow(2, attempt);
|
|
560
|
+
await delay(delayMs, request.request.signal ?? void 0);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
throw new Error("unreachable");
|
|
564
|
+
};
|
|
565
|
+
};
|
|
566
|
+
|
|
567
|
+
// src/serviceClientRegistry/utils.ts
|
|
568
|
+
var isBuiltInProperty = (property) => typeof property === "symbol" || property === "then" || property === "constructor" || property === "toString" || property === "valueOf";
|
|
569
|
+
var createDummyClient = ({
|
|
570
|
+
onCall
|
|
571
|
+
}) => {
|
|
572
|
+
const createProxy = (path = []) => new Proxy(() => {
|
|
573
|
+
}, {
|
|
574
|
+
// Create a new proxy for nested property access
|
|
575
|
+
get: (_target, prop) => {
|
|
576
|
+
if (isBuiltInProperty(prop)) return void 0;
|
|
577
|
+
return createProxy([...path, prop]);
|
|
578
|
+
},
|
|
579
|
+
// When called as a function, invoke the interceptor
|
|
580
|
+
apply: (_target, _thisArgs, args) => onCall(path, args)
|
|
581
|
+
});
|
|
582
|
+
return createProxy();
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
// src/serviceClientRegistry/createServiceClientRegistry.ts
|
|
586
|
+
var createServiceClientRegistry = () => ({
|
|
587
|
+
getServiceBaseUrl,
|
|
588
|
+
onUnavailable
|
|
589
|
+
}) => {
|
|
590
|
+
const dummy = (serviceId, clientName) => createDummyClient({
|
|
591
|
+
onCall: (path, args) => {
|
|
592
|
+
onUnavailable?.({
|
|
593
|
+
serviceId,
|
|
594
|
+
path,
|
|
595
|
+
args,
|
|
596
|
+
clientName
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
const configs = [];
|
|
601
|
+
const resolveClient = ({
|
|
602
|
+
serviceId,
|
|
603
|
+
clientFn,
|
|
604
|
+
clientName
|
|
605
|
+
}) => {
|
|
606
|
+
const serviceBaseUrl = getServiceBaseUrl(serviceId);
|
|
607
|
+
return serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);
|
|
608
|
+
};
|
|
609
|
+
const registry = {
|
|
610
|
+
add: (config) => {
|
|
611
|
+
configs.push(config);
|
|
612
|
+
return registry;
|
|
613
|
+
},
|
|
614
|
+
build: () => {
|
|
615
|
+
const clientMap = {};
|
|
616
|
+
const clientMeta = [];
|
|
617
|
+
configs.forEach((config) => {
|
|
618
|
+
clientMap[config.clientName] = resolveClient(config);
|
|
619
|
+
clientMeta.push({
|
|
620
|
+
clientName: config.clientName,
|
|
621
|
+
serviceId: config.serviceId,
|
|
622
|
+
isAvailable: !!getServiceBaseUrl(config.serviceId)
|
|
623
|
+
});
|
|
624
|
+
});
|
|
625
|
+
return {
|
|
626
|
+
client: clientMap,
|
|
627
|
+
meta: clientMeta
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
};
|
|
631
|
+
return registry;
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
// src/keboola/createApi.ts
|
|
635
|
+
var createApi = (state) => new Proxy({}, {
|
|
636
|
+
get(_target, property) {
|
|
637
|
+
if (isBuiltInProperty(property)) return void 0;
|
|
638
|
+
if (property === "auth") {
|
|
639
|
+
const authClient = state.getAuthClient();
|
|
640
|
+
assert2(authClient, KeboolaErrorType.Unconfigured);
|
|
641
|
+
return authClient;
|
|
642
|
+
}
|
|
643
|
+
if (property === "management") {
|
|
644
|
+
const management = state.getManagementClient();
|
|
645
|
+
assert2(management, KeboolaErrorType.NoManagementToken);
|
|
646
|
+
return management;
|
|
647
|
+
}
|
|
648
|
+
const clients = state.getProjectClients();
|
|
649
|
+
assert2(clients, KeboolaErrorType.NotReady);
|
|
650
|
+
return clients[property];
|
|
651
|
+
}
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
// src/keboola/createMiddlewareFor.ts
|
|
655
|
+
var createMiddlewareFor = (middlewares) => {
|
|
656
|
+
return (target, baseline = []) => {
|
|
657
|
+
if (Array.isArray(middlewares)) return [...baseline, ...middlewares];
|
|
658
|
+
const all = middlewares?.all ?? [];
|
|
659
|
+
const targeted = middlewares?.[target] ?? [];
|
|
660
|
+
return [...baseline, ...all, ...targeted];
|
|
661
|
+
};
|
|
662
|
+
};
|
|
663
|
+
|
|
664
|
+
// src/keboola/bearer/createConfig.ts
|
|
665
|
+
var INITIAL = { status: "anonymous", baseUrl: null };
|
|
666
|
+
var stamp = (tokens) => ({ ...tokens, issuedAt: Date.now() });
|
|
667
|
+
var createConfig = (initial = INITIAL) => {
|
|
668
|
+
const store = createStore(initial);
|
|
669
|
+
let expiredNotified = false;
|
|
670
|
+
const setBaseUrl = (baseUrl) => {
|
|
671
|
+
if (store.get().status !== "anonymous")
|
|
672
|
+
throw new KeboolaError(KeboolaErrorType.AlreadyAuthenticated);
|
|
673
|
+
store.set({ status: "anonymous", baseUrl });
|
|
674
|
+
};
|
|
675
|
+
const authenticate = (tokens) => {
|
|
676
|
+
const state = store.get();
|
|
677
|
+
if (state.status !== "anonymous") throw new KeboolaError(KeboolaErrorType.AlreadyAuthenticated);
|
|
678
|
+
if (!state.baseUrl) throw new KeboolaError(KeboolaErrorType.Unconfigured);
|
|
679
|
+
expiredNotified = false;
|
|
680
|
+
store.set({ status: "authenticated", baseUrl: state.baseUrl, credential: stamp(tokens) });
|
|
681
|
+
};
|
|
682
|
+
const setProjectId = (projectId) => {
|
|
683
|
+
const state = store.get();
|
|
684
|
+
if (state.status === "anonymous") throw new KeboolaError(KeboolaErrorType.NotAuthenticated);
|
|
685
|
+
store.set({
|
|
686
|
+
status: "scoped",
|
|
687
|
+
baseUrl: state.baseUrl,
|
|
688
|
+
credential: state.credential,
|
|
689
|
+
projectId
|
|
690
|
+
});
|
|
691
|
+
};
|
|
692
|
+
const reset = () => {
|
|
693
|
+
store.set({ status: "anonymous", baseUrl: store.get().baseUrl });
|
|
694
|
+
};
|
|
695
|
+
const applyRefresh = (tokens) => {
|
|
696
|
+
const state = store.get();
|
|
697
|
+
if (state.status === "anonymous") return;
|
|
698
|
+
store.set({ ...state, credential: stamp(tokens) });
|
|
699
|
+
};
|
|
700
|
+
const forceExpire = () => {
|
|
701
|
+
const state = store.get();
|
|
702
|
+
if (state.status === "anonymous") return;
|
|
703
|
+
const issuedAt = Date.now() - state.credential.expiresIn * 1e3;
|
|
704
|
+
store.set({ ...state, credential: { ...state.credential, issuedAt } });
|
|
705
|
+
};
|
|
706
|
+
const requireCredential = () => {
|
|
707
|
+
const state = store.get();
|
|
708
|
+
if (state.status === "anonymous") throw new KeboolaError(KeboolaErrorType.NotAuthenticated);
|
|
709
|
+
return state.credential;
|
|
710
|
+
};
|
|
711
|
+
const getBaseUrl = () => store.get().baseUrl;
|
|
712
|
+
const notifyExpired = () => {
|
|
713
|
+
if (expiredNotified) return false;
|
|
714
|
+
expiredNotified = true;
|
|
715
|
+
return true;
|
|
716
|
+
};
|
|
717
|
+
const debug = () => store.get();
|
|
718
|
+
const readable = {
|
|
719
|
+
get: store.get,
|
|
720
|
+
subscribe: store.subscribe,
|
|
721
|
+
dispose: store.dispose
|
|
722
|
+
};
|
|
723
|
+
return {
|
|
724
|
+
store: readable,
|
|
725
|
+
setBaseUrl,
|
|
726
|
+
authenticate,
|
|
727
|
+
setProjectId,
|
|
728
|
+
reset,
|
|
729
|
+
applyRefresh,
|
|
730
|
+
forceExpire,
|
|
731
|
+
requireCredential,
|
|
732
|
+
getBaseUrl,
|
|
733
|
+
notifyExpired,
|
|
734
|
+
debug
|
|
735
|
+
};
|
|
736
|
+
};
|
|
737
|
+
|
|
738
|
+
// src/domain/defaultBranch.ts
|
|
739
|
+
var createDefaultBranch = ({ devBranches }) => {
|
|
740
|
+
const defaultBranch = devBranches.find((branch) => branch.isDefault);
|
|
368
741
|
assert(defaultBranch, "No default branch found for the project.");
|
|
369
742
|
const getType = (branchId) => {
|
|
370
743
|
if (branchId == null || branchId === "default") return "default";
|
|
371
744
|
return Number(branchId) === defaultBranch.id ? "default" : "dev";
|
|
372
745
|
};
|
|
373
746
|
return {
|
|
374
|
-
id: defaultBranch.id,
|
|
375
|
-
name: defaultBranch.name,
|
|
376
|
-
getType,
|
|
377
|
-
isDev: (branchId) => getType(branchId) === "dev",
|
|
378
|
-
isDefault: (branchId) => getType(branchId) === "default"
|
|
747
|
+
id: defaultBranch.id,
|
|
748
|
+
name: defaultBranch.name,
|
|
749
|
+
getType,
|
|
750
|
+
isDev: (branchId) => getType(branchId) === "dev",
|
|
751
|
+
isDefault: (branchId) => getType(branchId) === "default"
|
|
752
|
+
};
|
|
753
|
+
};
|
|
754
|
+
|
|
755
|
+
// src/domain/stack.ts
|
|
756
|
+
var SERVICE_URL_OVERRIDES = {
|
|
757
|
+
// The service URL for the Kai Assistant is incomplete; we need to add the `/api` suffix to get the full URL for the API.
|
|
758
|
+
// I assume the service is versioned.
|
|
759
|
+
"kai-assistant": (url) => `${url}/api`
|
|
760
|
+
};
|
|
761
|
+
var createStack = ({ stackInfo, clientServiceUrls }) => {
|
|
762
|
+
const { services, components, features, ...infoRest } = stackInfo;
|
|
763
|
+
const serviceMap = new Map(
|
|
764
|
+
services.map((service) => {
|
|
765
|
+
const devOverride = clientServiceUrls?.[service.id]?.(service.url);
|
|
766
|
+
const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
|
|
767
|
+
const url = devOverride ?? prodOverride ?? service.url;
|
|
768
|
+
return [service.id, url];
|
|
769
|
+
})
|
|
770
|
+
);
|
|
771
|
+
const componentMap = new Map(components.map((component) => [component.id, component]));
|
|
772
|
+
const featureSet = new Set(features);
|
|
773
|
+
const hasFeature = (...feature) => {
|
|
774
|
+
if (feature.length === 0) return false;
|
|
775
|
+
return feature.every((x) => featureSet.has(x));
|
|
776
|
+
};
|
|
777
|
+
const hasComponent = (...componentId) => {
|
|
778
|
+
if (componentId.length === 0) return false;
|
|
779
|
+
return componentId.every((x) => componentMap.has(x));
|
|
780
|
+
};
|
|
781
|
+
const getComponent = (componentId) => componentMap.get(componentId) ?? null;
|
|
782
|
+
const hasService = (serviceId) => serviceMap.has(serviceId);
|
|
783
|
+
const getServiceUrl = (serviceId) => serviceMap.get(serviceId) ?? null;
|
|
784
|
+
return {
|
|
785
|
+
...infoRest,
|
|
786
|
+
services,
|
|
787
|
+
features,
|
|
788
|
+
components,
|
|
789
|
+
hasFeature,
|
|
790
|
+
getServiceUrl,
|
|
791
|
+
hasService,
|
|
792
|
+
getComponent,
|
|
793
|
+
hasComponent
|
|
794
|
+
};
|
|
795
|
+
};
|
|
796
|
+
|
|
797
|
+
// src/sdks/variables/variablesSdk.ts
|
|
798
|
+
var VARIABLES_COMPONENT_ID = "keboola.variables";
|
|
799
|
+
var mergeVariableDefinitions = (target, source) => {
|
|
800
|
+
const targetNames = new Set(target.map((definition) => definition.name));
|
|
801
|
+
return [...target, ...source.filter((definition) => !targetNames.has(definition.name))];
|
|
802
|
+
};
|
|
803
|
+
var mergeVariableValues = (target, source) => {
|
|
804
|
+
const sourceByName = new Map(source.map((value) => [value.name, value.value]));
|
|
805
|
+
const targetNames = new Set(target.map((value) => value.name));
|
|
806
|
+
return [
|
|
807
|
+
...target.map(
|
|
808
|
+
(value) => sourceByName.has(value.name) ? { ...value, value: sourceByName.get(value.name) } : value
|
|
809
|
+
),
|
|
810
|
+
...source.filter((value) => !targetNames.has(value.name))
|
|
811
|
+
];
|
|
812
|
+
};
|
|
813
|
+
var createVariablesSdk = ({ storageClient }) => {
|
|
814
|
+
const configs = storageClient.componentsAndConfigurations;
|
|
815
|
+
const readVariables = async (configId, valuesRowId, branchId) => {
|
|
816
|
+
const config = await configs.getConfiguration({
|
|
817
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
818
|
+
configId,
|
|
819
|
+
branchId
|
|
820
|
+
});
|
|
821
|
+
const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];
|
|
822
|
+
const rawDefinitions = config.configuration?.variables;
|
|
823
|
+
const rawValues = row?.configuration?.values;
|
|
824
|
+
return {
|
|
825
|
+
definitions: Array.isArray(rawDefinitions) ? rawDefinitions : [],
|
|
826
|
+
values: Array.isArray(rawValues) ? rawValues : []
|
|
827
|
+
};
|
|
828
|
+
};
|
|
829
|
+
const createVariables = async (definitions, values, branchId) => {
|
|
830
|
+
const config = await configs.createConfiguration({
|
|
831
|
+
branchId,
|
|
832
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
833
|
+
name: "Variables definition",
|
|
834
|
+
configuration: { variables: definitions }
|
|
835
|
+
});
|
|
836
|
+
try {
|
|
837
|
+
const row = await configs.createConfigurationRow({
|
|
838
|
+
branchId,
|
|
839
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
840
|
+
configId: config.id,
|
|
841
|
+
name: "Default values",
|
|
842
|
+
configuration: { values }
|
|
843
|
+
});
|
|
844
|
+
return { variablesId: config.id, variablesValuesId: row.id };
|
|
845
|
+
} catch (error) {
|
|
846
|
+
await configs.deleteConfiguration({
|
|
847
|
+
branchId,
|
|
848
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
849
|
+
configId: config.id
|
|
850
|
+
}).catch((cleanupError) => {
|
|
851
|
+
if (error instanceof Error && error.cause === void 0) {
|
|
852
|
+
error.cause = cleanupError;
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
throw error;
|
|
856
|
+
}
|
|
857
|
+
};
|
|
858
|
+
return {
|
|
859
|
+
/** Copy a variables config into a fresh, independent config + values row. */
|
|
860
|
+
copy: async ({
|
|
861
|
+
variablesId,
|
|
862
|
+
variablesValuesId,
|
|
863
|
+
branchId = "default"
|
|
864
|
+
}) => {
|
|
865
|
+
const { definitions, values } = await readVariables(variablesId, variablesValuesId, branchId);
|
|
866
|
+
return createVariables(definitions, values, branchId);
|
|
867
|
+
},
|
|
868
|
+
/** Merge the source's variables into the target's and create a fresh merged config + values row. */
|
|
869
|
+
merge: async ({
|
|
870
|
+
targetVariablesId,
|
|
871
|
+
targetValuesId,
|
|
872
|
+
sourceVariablesId,
|
|
873
|
+
sourceValuesId,
|
|
874
|
+
branchId = "default"
|
|
875
|
+
}) => {
|
|
876
|
+
const [target, source] = await Promise.all([
|
|
877
|
+
readVariables(targetVariablesId, targetValuesId, branchId),
|
|
878
|
+
readVariables(sourceVariablesId, sourceValuesId, branchId)
|
|
879
|
+
]);
|
|
880
|
+
return createVariables(
|
|
881
|
+
mergeVariableDefinitions(target.definitions, source.definitions),
|
|
882
|
+
mergeVariableValues(target.values, source.values),
|
|
883
|
+
branchId
|
|
884
|
+
);
|
|
885
|
+
}
|
|
886
|
+
};
|
|
887
|
+
};
|
|
888
|
+
var agentSettingsSchema = z.object({
|
|
889
|
+
projectId: z.string(),
|
|
890
|
+
customInstructions: z.string().nullable(),
|
|
891
|
+
createdAt: z.string(),
|
|
892
|
+
updatedAt: z.string()
|
|
893
|
+
});
|
|
894
|
+
var toolPermissionValueSchema = z.enum(["always_allow", "always_ask", "blocked"]);
|
|
895
|
+
var userAgentSettingsSchema = z.object({
|
|
896
|
+
projectId: z.string(),
|
|
897
|
+
userId: z.string(),
|
|
898
|
+
customInstructions: z.string().nullable(),
|
|
899
|
+
toolPermissions: z.record(z.string(), toolPermissionValueSchema).nullable(),
|
|
900
|
+
createdAt: z.string(),
|
|
901
|
+
updatedAt: z.string()
|
|
902
|
+
});
|
|
903
|
+
var toolInfoSchema = z.object({
|
|
904
|
+
name: z.string(),
|
|
905
|
+
description: z.string(),
|
|
906
|
+
readOnly: z.boolean()
|
|
907
|
+
});
|
|
908
|
+
var toolsListResponseSchema = z.object({
|
|
909
|
+
tools: z.array(toolInfoSchema)
|
|
910
|
+
});
|
|
911
|
+
var skillInfoSchema = z.object({
|
|
912
|
+
name: z.string(),
|
|
913
|
+
description: z.string().nullable(),
|
|
914
|
+
source: z.enum(["first-party", "vendored", "project"])
|
|
915
|
+
});
|
|
916
|
+
var builtInCommandSchema = z.object({
|
|
917
|
+
name: z.string(),
|
|
918
|
+
description: z.string()
|
|
919
|
+
});
|
|
920
|
+
var skillsListResponseSchema = z.object({
|
|
921
|
+
skills: z.array(skillInfoSchema),
|
|
922
|
+
commands: z.array(builtInCommandSchema)
|
|
923
|
+
});
|
|
924
|
+
var sandboxFileEntrySchema = z.object({
|
|
925
|
+
name: z.string(),
|
|
926
|
+
path: z.string(),
|
|
927
|
+
type: z.enum(["file", "dir"]),
|
|
928
|
+
size: z.number().int().nonnegative().optional()
|
|
929
|
+
});
|
|
930
|
+
var sandboxFileListingSchema = z.object({
|
|
931
|
+
entries: z.array(sandboxFileEntrySchema)
|
|
932
|
+
});
|
|
933
|
+
var sandboxFileContentSchema = z.object({
|
|
934
|
+
content: z.string(),
|
|
935
|
+
encoding: z.enum(["utf-8", "binary"]),
|
|
936
|
+
truncated: z.boolean(),
|
|
937
|
+
size: z.number().int().nonnegative()
|
|
938
|
+
});
|
|
939
|
+
var sandboxGitBranchSchema = z.object({
|
|
940
|
+
branch: z.string().nullable()
|
|
941
|
+
});
|
|
942
|
+
var createKaiAgentClient = ({ baseUrl, middlewares, auth }) => {
|
|
943
|
+
const clientOptions = {
|
|
944
|
+
baseUrl,
|
|
945
|
+
middlewares,
|
|
946
|
+
headers: createAuthHeaders(auth)
|
|
947
|
+
};
|
|
948
|
+
const client = createOpenapiFetchClient(clientOptions);
|
|
949
|
+
const genericClient = createGenericFetchClient(clientOptions);
|
|
950
|
+
const getHistory = async (params) => {
|
|
951
|
+
const { data } = await client.get("/api/history", { query: params });
|
|
952
|
+
return data;
|
|
953
|
+
};
|
|
954
|
+
const getChat = async (chatId, signal) => {
|
|
955
|
+
const { data } = await client.get("/api/chat/{id}", { path: { id: chatId } }, { signal });
|
|
956
|
+
return data;
|
|
957
|
+
};
|
|
958
|
+
const deleteChat = async (chatId) => {
|
|
959
|
+
const { data } = await client.delete("/api/chat", { query: { id: chatId } });
|
|
960
|
+
return data;
|
|
961
|
+
};
|
|
962
|
+
const createChat = async (request) => {
|
|
963
|
+
const { response } = await client.post("/api/chat", { body: request });
|
|
964
|
+
return response;
|
|
965
|
+
};
|
|
966
|
+
const getVotes = async (chatId) => {
|
|
967
|
+
const { data } = await client.get("/api/vote", { query: { chatId } });
|
|
968
|
+
return data;
|
|
969
|
+
};
|
|
970
|
+
const submitVote = async (params) => {
|
|
971
|
+
await client.patch("/api/vote", { body: params });
|
|
972
|
+
};
|
|
973
|
+
const getUsage = async (signal) => {
|
|
974
|
+
const { data } = await client.get("/api/usage", {}, { signal });
|
|
975
|
+
return data;
|
|
976
|
+
};
|
|
977
|
+
const approveToolCall = async (chatId, body) => {
|
|
978
|
+
await client.post("/api/chat/{id}/approval", { path: { id: chatId }, body });
|
|
979
|
+
};
|
|
980
|
+
const submitToolOutput = async (chatId, body) => {
|
|
981
|
+
await client.post("/api/chat/{id}/ui-tool-result", { path: { id: chatId }, body });
|
|
982
|
+
};
|
|
983
|
+
const stopChat = async (chatId) => {
|
|
984
|
+
const { data } = await client.post("/api/chat/{id}/stop", { path: { id: chatId } });
|
|
985
|
+
return data;
|
|
986
|
+
};
|
|
987
|
+
const getSuggestions = async (request, signal) => {
|
|
988
|
+
const { data } = await client.post("/api/suggestions", { body: request }, { signal });
|
|
989
|
+
return data;
|
|
990
|
+
};
|
|
991
|
+
const getAgentSettings = async (signal) => {
|
|
992
|
+
const { data } = await genericClient.get("/api/settings", {}, { signal });
|
|
993
|
+
const result = agentSettingsSchema.safeParse(data);
|
|
994
|
+
if (!result.success) {
|
|
995
|
+
throw new Error("Invalid agent settings response format");
|
|
996
|
+
}
|
|
997
|
+
return result.data;
|
|
998
|
+
};
|
|
999
|
+
const updateAgentSettings = async (request, signal) => {
|
|
1000
|
+
const { data } = await genericClient.patch(
|
|
1001
|
+
"/api/settings",
|
|
1002
|
+
{ body: request },
|
|
1003
|
+
{ signal }
|
|
1004
|
+
);
|
|
1005
|
+
const result = agentSettingsSchema.safeParse(data);
|
|
1006
|
+
if (!result.success) {
|
|
1007
|
+
throw new Error("Invalid agent settings response format");
|
|
1008
|
+
}
|
|
1009
|
+
return result.data;
|
|
1010
|
+
};
|
|
1011
|
+
const getUserAgentSettings = async (signal) => {
|
|
1012
|
+
const { data } = await genericClient.get(
|
|
1013
|
+
"/api/settings/user",
|
|
1014
|
+
{},
|
|
1015
|
+
{ signal }
|
|
1016
|
+
);
|
|
1017
|
+
const result = userAgentSettingsSchema.safeParse(data);
|
|
1018
|
+
if (!result.success) {
|
|
1019
|
+
throw new Error("Invalid user agent settings response format");
|
|
1020
|
+
}
|
|
1021
|
+
return result.data;
|
|
1022
|
+
};
|
|
1023
|
+
const updateUserAgentSettings = async (request, signal) => {
|
|
1024
|
+
const { data } = await genericClient.patch(
|
|
1025
|
+
"/api/settings/user",
|
|
1026
|
+
{ body: request },
|
|
1027
|
+
{ signal }
|
|
1028
|
+
);
|
|
1029
|
+
const result = userAgentSettingsSchema.safeParse(data);
|
|
1030
|
+
if (!result.success) {
|
|
1031
|
+
throw new Error("Invalid user agent settings response format");
|
|
1032
|
+
}
|
|
1033
|
+
return result.data;
|
|
1034
|
+
};
|
|
1035
|
+
const getToolsList = async (signal) => {
|
|
1036
|
+
const { data } = await genericClient.get(
|
|
1037
|
+
"/api/settings/tools",
|
|
1038
|
+
{},
|
|
1039
|
+
{ signal }
|
|
1040
|
+
);
|
|
1041
|
+
const result = toolsListResponseSchema.safeParse(data);
|
|
1042
|
+
if (!result.success) {
|
|
1043
|
+
throw new Error("Invalid tools list response format");
|
|
1044
|
+
}
|
|
1045
|
+
return result.data;
|
|
1046
|
+
};
|
|
1047
|
+
const getSkillsList = async (signal) => {
|
|
1048
|
+
const { data } = await genericClient.get("/api/skills", {}, { signal });
|
|
1049
|
+
const result = skillsListResponseSchema.safeParse(data);
|
|
1050
|
+
if (!result.success) {
|
|
1051
|
+
throw new Error("Invalid skills list response format");
|
|
1052
|
+
}
|
|
1053
|
+
return result.data;
|
|
1054
|
+
};
|
|
1055
|
+
const listSandboxFiles = async (chatId, path, signal) => {
|
|
1056
|
+
const { data } = await genericClient.get(
|
|
1057
|
+
`/api/chat/${encodeURIComponent(chatId)}/sandbox/files`,
|
|
1058
|
+
{ query: path ? { path } : void 0 },
|
|
1059
|
+
{ signal }
|
|
1060
|
+
);
|
|
1061
|
+
const result = sandboxFileListingSchema.safeParse(data);
|
|
1062
|
+
if (!result.success) {
|
|
1063
|
+
throw new Error("Invalid sandbox files response format");
|
|
1064
|
+
}
|
|
1065
|
+
return result.data;
|
|
1066
|
+
};
|
|
1067
|
+
const readSandboxFile = async (chatId, path, signal) => {
|
|
1068
|
+
const { data } = await genericClient.get(
|
|
1069
|
+
`/api/chat/${encodeURIComponent(chatId)}/sandbox/file`,
|
|
1070
|
+
{ query: { path } },
|
|
1071
|
+
{ signal }
|
|
1072
|
+
);
|
|
1073
|
+
const result = sandboxFileContentSchema.safeParse(data);
|
|
1074
|
+
if (!result.success) {
|
|
1075
|
+
throw new Error("Invalid sandbox file response format");
|
|
1076
|
+
}
|
|
1077
|
+
return result.data;
|
|
1078
|
+
};
|
|
1079
|
+
const getSandboxGitBranch = async (chatId, signal) => {
|
|
1080
|
+
const { data } = await genericClient.get(
|
|
1081
|
+
`/api/chat/${encodeURIComponent(chatId)}/sandbox/git-branch`,
|
|
1082
|
+
{},
|
|
1083
|
+
{ signal }
|
|
1084
|
+
);
|
|
1085
|
+
const result = sandboxGitBranchSchema.safeParse(data);
|
|
1086
|
+
if (!result.success) {
|
|
1087
|
+
throw new Error("Invalid sandbox git-branch response format");
|
|
1088
|
+
}
|
|
1089
|
+
return result.data;
|
|
1090
|
+
};
|
|
1091
|
+
const chatStreamUrl = clientOptions.baseUrl + "/api/chat";
|
|
1092
|
+
return {
|
|
1093
|
+
getHistory,
|
|
1094
|
+
getChat,
|
|
1095
|
+
deleteChat,
|
|
1096
|
+
createChat,
|
|
1097
|
+
getVotes,
|
|
1098
|
+
submitVote,
|
|
1099
|
+
getUsage,
|
|
1100
|
+
approveToolCall,
|
|
1101
|
+
submitToolOutput,
|
|
1102
|
+
stopChat,
|
|
1103
|
+
getSuggestions,
|
|
1104
|
+
getAgentSettings,
|
|
1105
|
+
updateAgentSettings,
|
|
1106
|
+
getUserAgentSettings,
|
|
1107
|
+
updateUserAgentSettings,
|
|
1108
|
+
getToolsList,
|
|
1109
|
+
getSkillsList,
|
|
1110
|
+
listSandboxFiles,
|
|
1111
|
+
readSandboxFile,
|
|
1112
|
+
getSandboxGitBranch,
|
|
1113
|
+
chatStreamUrl
|
|
379
1114
|
};
|
|
380
1115
|
};
|
|
381
1116
|
|
|
382
|
-
// src/
|
|
383
|
-
var
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
)
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
1117
|
+
// src/keboola/createServiceClients.ts
|
|
1118
|
+
var createServiceClients = ({
|
|
1119
|
+
baseUrl,
|
|
1120
|
+
auth,
|
|
1121
|
+
getServiceBaseUrl,
|
|
1122
|
+
middlewareFor,
|
|
1123
|
+
attachTokenMiddleware
|
|
1124
|
+
}) => createServiceClientRegistry()({
|
|
1125
|
+
getServiceBaseUrl,
|
|
1126
|
+
onUnavailable: ({ serviceId, path, clientName }) => {
|
|
1127
|
+
throw new ServiceUnavailableError(serviceId, path, clientName);
|
|
1128
|
+
}
|
|
1129
|
+
}).add({
|
|
1130
|
+
serviceId: "vault",
|
|
1131
|
+
clientName: "vault",
|
|
1132
|
+
clientFn: (serviceBaseUrl) => createVaultClient({
|
|
1133
|
+
baseUrl: serviceBaseUrl,
|
|
1134
|
+
middlewares: middlewareFor("vault", [attachTokenMiddleware]),
|
|
1135
|
+
auth
|
|
1136
|
+
})
|
|
1137
|
+
}).add({
|
|
1138
|
+
serviceId: "data-science",
|
|
1139
|
+
clientName: "dataScience",
|
|
1140
|
+
clientFn: (serviceBaseUrl) => createDataScienceClient({
|
|
1141
|
+
baseUrl: serviceBaseUrl,
|
|
1142
|
+
middlewares: middlewareFor("dataScience", [attachTokenMiddleware]),
|
|
1143
|
+
auth
|
|
1144
|
+
})
|
|
1145
|
+
}).add({
|
|
1146
|
+
serviceId: "encryption",
|
|
1147
|
+
clientName: "encryption",
|
|
1148
|
+
clientFn: (serviceBaseUrl) => createEncryptionClient({
|
|
1149
|
+
baseUrl: serviceBaseUrl,
|
|
1150
|
+
middlewares: middlewareFor("encryption")
|
|
1151
|
+
})
|
|
1152
|
+
}).add({
|
|
1153
|
+
serviceId: "editor",
|
|
1154
|
+
clientName: "editor",
|
|
1155
|
+
clientFn: (serviceBaseUrl) => createEditorClient({
|
|
1156
|
+
baseUrl: serviceBaseUrl,
|
|
1157
|
+
middlewares: middlewareFor("editor", [attachTokenMiddleware]),
|
|
1158
|
+
auth
|
|
1159
|
+
})
|
|
1160
|
+
}).add({
|
|
1161
|
+
serviceId: "sync-actions",
|
|
1162
|
+
clientName: "syncActions",
|
|
1163
|
+
clientFn: (serviceBaseUrl) => createSyncActionsClient({
|
|
1164
|
+
baseUrl: serviceBaseUrl,
|
|
1165
|
+
middlewares: middlewareFor("syncActions", [attachTokenMiddleware]),
|
|
1166
|
+
auth
|
|
1167
|
+
})
|
|
1168
|
+
}).add({
|
|
1169
|
+
serviceId: "telemetry",
|
|
1170
|
+
clientName: "telemetry",
|
|
1171
|
+
clientFn: (serviceBaseUrl) => createTelemetryClient({
|
|
1172
|
+
baseUrl: serviceBaseUrl,
|
|
1173
|
+
middlewares: middlewareFor("telemetry", [attachTokenMiddleware]),
|
|
1174
|
+
auth
|
|
1175
|
+
})
|
|
1176
|
+
}).add({
|
|
1177
|
+
serviceId: "query",
|
|
1178
|
+
clientName: "queryService",
|
|
1179
|
+
clientFn: (serviceBaseUrl) => createQueryServiceClient({
|
|
1180
|
+
baseUrl: serviceBaseUrl,
|
|
1181
|
+
middlewares: middlewareFor("queryService", [attachTokenMiddleware]),
|
|
1182
|
+
auth
|
|
1183
|
+
})
|
|
1184
|
+
}).add({
|
|
1185
|
+
serviceId: "queue",
|
|
1186
|
+
clientName: "queue",
|
|
1187
|
+
clientFn: (serviceBaseUrl) => createQueueClient({
|
|
1188
|
+
baseUrl: serviceBaseUrl,
|
|
1189
|
+
middlewares: middlewareFor("queue", [attachTokenMiddleware]),
|
|
1190
|
+
auth
|
|
1191
|
+
})
|
|
1192
|
+
}).add({
|
|
1193
|
+
serviceId: "kai-assistant",
|
|
1194
|
+
clientName: "chat",
|
|
1195
|
+
clientFn: (serviceBaseUrl) => createChatClient({
|
|
1196
|
+
storageApiUrl: baseUrl,
|
|
1197
|
+
baseUrl: serviceBaseUrl,
|
|
1198
|
+
middlewares: middlewareFor("chat", [attachTokenMiddleware]),
|
|
1199
|
+
auth
|
|
1200
|
+
})
|
|
1201
|
+
}).add({
|
|
1202
|
+
serviceId: "ai",
|
|
1203
|
+
clientName: "ai",
|
|
1204
|
+
clientFn: (serviceBaseUrl) => createAiClient({
|
|
1205
|
+
baseUrl: serviceBaseUrl,
|
|
1206
|
+
middlewares: middlewareFor("ai", [attachTokenMiddleware]),
|
|
1207
|
+
auth
|
|
1208
|
+
})
|
|
1209
|
+
}).add({
|
|
1210
|
+
serviceId: "import",
|
|
1211
|
+
clientName: "import",
|
|
1212
|
+
clientFn: (serviceBaseUrl) => createImportClient({
|
|
1213
|
+
baseUrl: serviceBaseUrl,
|
|
1214
|
+
middlewares: middlewareFor("import", [attachTokenMiddleware]),
|
|
1215
|
+
auth
|
|
1216
|
+
})
|
|
1217
|
+
}).add({
|
|
1218
|
+
serviceId: "kai-agent",
|
|
1219
|
+
clientName: "kaiAgent",
|
|
1220
|
+
clientFn: (serviceBaseUrl) => createKaiAgentClient({
|
|
1221
|
+
baseUrl: serviceBaseUrl,
|
|
1222
|
+
middlewares: middlewareFor("kaiAgent", [attachTokenMiddleware]),
|
|
1223
|
+
auth
|
|
1224
|
+
})
|
|
1225
|
+
}).add({
|
|
1226
|
+
serviceId: "oauth",
|
|
1227
|
+
clientName: "oauth",
|
|
1228
|
+
clientFn: (serviceBaseUrl) => createOauthClient({
|
|
1229
|
+
baseUrl: serviceBaseUrl,
|
|
1230
|
+
middlewares: middlewareFor("oauth", [attachTokenMiddleware]),
|
|
1231
|
+
auth
|
|
1232
|
+
})
|
|
1233
|
+
}).add({
|
|
1234
|
+
serviceId: "scheduler",
|
|
1235
|
+
clientName: "scheduler",
|
|
1236
|
+
clientFn: (serviceBaseUrl) => createSchedulerClient({
|
|
1237
|
+
baseUrl: serviceBaseUrl,
|
|
1238
|
+
middlewares: middlewareFor("scheduler", [attachTokenMiddleware]),
|
|
1239
|
+
auth
|
|
1240
|
+
})
|
|
1241
|
+
}).add({
|
|
1242
|
+
serviceId: "stream",
|
|
1243
|
+
clientName: "stream",
|
|
1244
|
+
clientFn: (serviceBaseUrl) => createStreamClient({
|
|
1245
|
+
baseUrl: serviceBaseUrl,
|
|
1246
|
+
middlewares: middlewareFor("stream", [attachTokenMiddleware]),
|
|
1247
|
+
auth
|
|
1248
|
+
})
|
|
1249
|
+
}).add({
|
|
1250
|
+
serviceId: "notification",
|
|
1251
|
+
clientName: "notifications",
|
|
1252
|
+
clientFn: (serviceBaseUrl) => createNotificationsClient({
|
|
1253
|
+
baseUrl: serviceBaseUrl,
|
|
1254
|
+
middlewares: middlewareFor("notifications", [attachTokenMiddleware]),
|
|
1255
|
+
auth
|
|
1256
|
+
})
|
|
1257
|
+
}).add({
|
|
1258
|
+
serviceId: "metastore",
|
|
1259
|
+
clientName: "metastore",
|
|
1260
|
+
clientFn: (serviceBaseUrl) => createMetastoreClient({
|
|
1261
|
+
baseUrl: serviceBaseUrl,
|
|
1262
|
+
middlewares: middlewareFor("metastore", [attachTokenMiddleware]),
|
|
1263
|
+
auth
|
|
1264
|
+
})
|
|
1265
|
+
}).build();
|
|
1266
|
+
|
|
1267
|
+
// src/keboola/bearer/createProjectClients.ts
|
|
1268
|
+
var createProjectClients = async ({
|
|
1269
|
+
baseUrl,
|
|
1270
|
+
projectId,
|
|
1271
|
+
authMiddleware,
|
|
1272
|
+
middlewareFor,
|
|
1273
|
+
clientServiceUrls
|
|
1274
|
+
}) => {
|
|
1275
|
+
const auth = { type: "bearer", token: "", projectId };
|
|
1276
|
+
const projectIdMiddleware = (next) => (request) => {
|
|
1277
|
+
request.request.headers.set(KeboolaHttpHeader.PROJECT_ID, String(projectId));
|
|
1278
|
+
return next(request);
|
|
403
1279
|
};
|
|
404
|
-
const
|
|
405
|
-
|
|
406
|
-
|
|
1280
|
+
const attach = (next) => projectIdMiddleware(authMiddleware(next));
|
|
1281
|
+
const reader = createStorageClient({ baseUrl, auth, middlewares: [attach] });
|
|
1282
|
+
const [stackInfo, sapiToken, devBranches] = await Promise.all([
|
|
1283
|
+
reader.getStackInfo({ exclude: "componentDetails" }),
|
|
1284
|
+
reader.tokens.verify(),
|
|
1285
|
+
reader.branches.getDevBranches()
|
|
1286
|
+
]);
|
|
1287
|
+
const stack = createStack({ stackInfo, clientServiceUrls });
|
|
1288
|
+
const defaultBranch = createDefaultBranch({ devBranches });
|
|
1289
|
+
const liveProject = createLiveProject({
|
|
1290
|
+
initialToken: sapiToken,
|
|
1291
|
+
verify: () => reader.tokens.verify()
|
|
1292
|
+
});
|
|
1293
|
+
const storageTableStore = createDerivedStore({
|
|
1294
|
+
source: liveProject.store,
|
|
1295
|
+
build: createStorageTable,
|
|
1296
|
+
dependsOn: (project) => ({
|
|
1297
|
+
useLegacyBucketPrefix: !project.hasFeature(ProjectFeature.DisableLegacyBucketPrefix),
|
|
1298
|
+
hasProtectedDefaultBranch: project.hasFeature(ProjectFeature.SoxProtectedDefaultBranch),
|
|
1299
|
+
hasStorageBranches: project.hasFeature(ProjectFeature.StorageBranches)
|
|
1300
|
+
})
|
|
1301
|
+
});
|
|
1302
|
+
const context = {
|
|
1303
|
+
stack,
|
|
1304
|
+
defaultBranch,
|
|
1305
|
+
get project() {
|
|
1306
|
+
return liveProject.getProject();
|
|
1307
|
+
},
|
|
1308
|
+
get st() {
|
|
1309
|
+
return storageTableStore.get();
|
|
1310
|
+
}
|
|
407
1311
|
};
|
|
408
|
-
const
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
1312
|
+
const storage = createStorageClient({
|
|
1313
|
+
baseUrl,
|
|
1314
|
+
auth,
|
|
1315
|
+
middlewares: middlewareFor("storage", [attach, liveProject.middleware])
|
|
1316
|
+
});
|
|
1317
|
+
const { client: services, meta: serviceMeta } = createServiceClients({
|
|
1318
|
+
baseUrl,
|
|
1319
|
+
auth,
|
|
1320
|
+
getServiceBaseUrl: context.stack.getServiceUrl,
|
|
1321
|
+
middlewareFor,
|
|
1322
|
+
attachTokenMiddleware: attach
|
|
1323
|
+
});
|
|
1324
|
+
const sdk = {
|
|
1325
|
+
configuration: createConfigurationSdk({
|
|
1326
|
+
storageClient: storage,
|
|
1327
|
+
encryptionClient: services.encryption,
|
|
1328
|
+
context
|
|
1329
|
+
}),
|
|
1330
|
+
tag: createTagSdk({ metastoreClient: services.metastore }),
|
|
1331
|
+
semanticLayer: createSemanticLayerSdk({ metastoreClient: services.metastore }),
|
|
1332
|
+
storage: createStorageSdk({ storageClient: storage }),
|
|
1333
|
+
vault: createVaultSdk({ vaultClient: services.vault, encryptionClient: services.encryption }),
|
|
1334
|
+
variables: createVariablesSdk({ storageClient: storage })
|
|
421
1335
|
};
|
|
1336
|
+
return { context, serviceMeta, storage, ...services, sdk };
|
|
422
1337
|
};
|
|
423
1338
|
|
|
424
|
-
// src/
|
|
425
|
-
var
|
|
426
|
-
var
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
...target.map(
|
|
435
|
-
(value) => sourceByName.has(value.name) ? { ...value, value: sourceByName.get(value.name) } : value
|
|
436
|
-
),
|
|
437
|
-
...source.filter((value) => !targetNames.has(value.name))
|
|
438
|
-
];
|
|
439
|
-
};
|
|
440
|
-
var createVariablesSdk = ({ storageClient }) => {
|
|
441
|
-
const configs = storageClient.componentsAndConfigurations;
|
|
442
|
-
const readVariables = async (configId, valuesRowId, branchId) => {
|
|
443
|
-
const config = await configs.getConfiguration({
|
|
444
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
445
|
-
configId,
|
|
446
|
-
branchId
|
|
447
|
-
});
|
|
448
|
-
const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];
|
|
449
|
-
const rawDefinitions = config.configuration?.variables;
|
|
450
|
-
const rawValues = row?.configuration?.values;
|
|
451
|
-
return {
|
|
452
|
-
definitions: Array.isArray(rawDefinitions) ? rawDefinitions : [],
|
|
453
|
-
values: Array.isArray(rawValues) ? rawValues : []
|
|
454
|
-
};
|
|
455
|
-
};
|
|
456
|
-
const createVariables = async (definitions, values, branchId) => {
|
|
457
|
-
const config = await configs.createConfiguration({
|
|
458
|
-
branchId,
|
|
459
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
460
|
-
name: "Variables definition",
|
|
461
|
-
configuration: { variables: definitions }
|
|
462
|
-
});
|
|
1339
|
+
// src/keboola/bearer/credential.ts
|
|
1340
|
+
var DEFAULT_REFRESH_THRESHOLD = 0.9;
|
|
1341
|
+
var isUnauthorized = (error) => error instanceof ApiError && error.response.status === HttpStatus.UNAUTHORIZED;
|
|
1342
|
+
var createBearerCredential = ({
|
|
1343
|
+
refresh,
|
|
1344
|
+
getToken,
|
|
1345
|
+
onSessionExpired,
|
|
1346
|
+
refreshThreshold = DEFAULT_REFRESH_THRESHOLD
|
|
1347
|
+
}) => {
|
|
1348
|
+
const doRefresh = async () => {
|
|
463
1349
|
try {
|
|
464
|
-
|
|
465
|
-
branchId,
|
|
466
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
467
|
-
configId: config.id,
|
|
468
|
-
name: "Default values",
|
|
469
|
-
configuration: { values }
|
|
470
|
-
});
|
|
471
|
-
return { variablesId: config.id, variablesValuesId: row.id };
|
|
1350
|
+
return await refresh();
|
|
472
1351
|
} catch (error) {
|
|
473
|
-
|
|
474
|
-
branchId,
|
|
475
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
476
|
-
configId: config.id
|
|
477
|
-
}).catch((cleanupError) => {
|
|
478
|
-
if (error instanceof Error && error.cause === void 0) {
|
|
479
|
-
error.cause = cleanupError;
|
|
480
|
-
}
|
|
481
|
-
});
|
|
1352
|
+
if (isUnauthorized(error)) onSessionExpired?.();
|
|
482
1353
|
throw error;
|
|
483
1354
|
}
|
|
484
1355
|
};
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
},
|
|
495
|
-
/** Merge the source's variables into the target's and create a fresh merged config + values row. */
|
|
496
|
-
merge: async ({
|
|
497
|
-
targetVariablesId,
|
|
498
|
-
targetValuesId,
|
|
499
|
-
sourceVariablesId,
|
|
500
|
-
sourceValuesId,
|
|
501
|
-
branchId = "default"
|
|
502
|
-
}) => {
|
|
503
|
-
const [target, source] = await Promise.all([
|
|
504
|
-
readVariables(targetVariablesId, targetValuesId, branchId),
|
|
505
|
-
readVariables(sourceVariablesId, sourceValuesId, branchId)
|
|
506
|
-
]);
|
|
507
|
-
return createVariables(
|
|
508
|
-
mergeVariableDefinitions(target.definitions, source.definitions),
|
|
509
|
-
mergeVariableValues(target.values, source.values),
|
|
510
|
-
branchId
|
|
511
|
-
);
|
|
512
|
-
}
|
|
1356
|
+
const refreshShared = dedupe(doRefresh);
|
|
1357
|
+
const refreshAt = (timing) => timing.issuedAt + timing.expiresIn * 1e3 * refreshThreshold;
|
|
1358
|
+
const getAccessToken = async ({ forceRefresh = false } = {}) => {
|
|
1359
|
+
const snapshot = getToken();
|
|
1360
|
+
if (snapshot === null) return null;
|
|
1361
|
+
const { accessToken, timing } = snapshot;
|
|
1362
|
+
if (forceRefresh) return refreshShared();
|
|
1363
|
+
if (Date.now() < refreshAt(timing)) return accessToken;
|
|
1364
|
+
return refreshShared().catch(() => accessToken);
|
|
513
1365
|
};
|
|
1366
|
+
return { getAccessToken, notifyExpired: () => onSessionExpired?.() };
|
|
514
1367
|
};
|
|
515
1368
|
|
|
516
|
-
// src/
|
|
517
|
-
var
|
|
518
|
-
return (
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
const
|
|
522
|
-
|
|
1369
|
+
// src/keboola/bearer/middleware.ts
|
|
1370
|
+
var createBearerAuthMiddleware = (credential) => {
|
|
1371
|
+
return (next) => async (request) => {
|
|
1372
|
+
const token = await credential.getAccessToken({ forceRefresh: false });
|
|
1373
|
+
if (token === null) return next(request);
|
|
1374
|
+
const retryRequest = request.request.clone();
|
|
1375
|
+
request.request.headers.set(HttpHeader.AUTHORIZATION, `Bearer ${token}`);
|
|
1376
|
+
try {
|
|
1377
|
+
return await next(request);
|
|
1378
|
+
} catch (error) {
|
|
1379
|
+
if (!isUnauthorized(error)) throw error;
|
|
1380
|
+
const refreshed = await credential.getAccessToken({ forceRefresh: true });
|
|
1381
|
+
if (refreshed === null) throw error;
|
|
1382
|
+
retryRequest.headers.set(HttpHeader.AUTHORIZATION, `Bearer ${refreshed}`);
|
|
1383
|
+
try {
|
|
1384
|
+
return await next({ ...request, request: retryRequest });
|
|
1385
|
+
} catch (retryError) {
|
|
1386
|
+
if (isUnauthorized(retryError)) credential.notifyExpired();
|
|
1387
|
+
throw retryError;
|
|
1388
|
+
}
|
|
1389
|
+
}
|
|
523
1390
|
};
|
|
524
1391
|
};
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
})
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
if (isBuiltInProperty(prop)) return void 0;
|
|
536
|
-
return createProxy([...path, prop]);
|
|
537
|
-
},
|
|
538
|
-
// When called as a function, invoke the interceptor
|
|
539
|
-
apply: (_target, _thisArgs, args) => onCall(path, args)
|
|
540
|
-
});
|
|
541
|
-
return createProxy();
|
|
1392
|
+
var SESSION_KEY = "keboola:bearer-session";
|
|
1393
|
+
var persistedSessionSchema = z2.object({
|
|
1394
|
+
baseUrl: z2.string().nullable(),
|
|
1395
|
+
projectId: z2.number().nullable(),
|
|
1396
|
+
refreshToken: z2.string().nullable()
|
|
1397
|
+
});
|
|
1398
|
+
var EMPTY_PERSISTED_SESSION = {
|
|
1399
|
+
baseUrl: null,
|
|
1400
|
+
projectId: null,
|
|
1401
|
+
refreshToken: null
|
|
542
1402
|
};
|
|
1403
|
+
var createSessionPersistor = (storage) => createPersistor({
|
|
1404
|
+
storage,
|
|
1405
|
+
key: SESSION_KEY,
|
|
1406
|
+
schema: persistedSessionSchema,
|
|
1407
|
+
defaultValue: EMPTY_PERSISTED_SESSION
|
|
1408
|
+
});
|
|
543
1409
|
|
|
544
|
-
// src/
|
|
545
|
-
var
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
const
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
1410
|
+
// src/keboola/bearer/keboola.ts
|
|
1411
|
+
var createKeboola = (options = {}) => {
|
|
1412
|
+
const persistor = createSessionPersistor(options.storage);
|
|
1413
|
+
const config = createConfig();
|
|
1414
|
+
const middlewareFor = createMiddlewareFor(options.middlewares);
|
|
1415
|
+
const retryContention = createRetryMiddleware({
|
|
1416
|
+
shouldRetry: (error) => error instanceof ApiError && error.response.status === HttpStatus.SERVICE_UNAVAILABLE
|
|
1417
|
+
});
|
|
1418
|
+
const authClientBare = createDerivedStore({
|
|
1419
|
+
source: config.store,
|
|
1420
|
+
dependsOn: (state) => state.baseUrl,
|
|
1421
|
+
build: (baseUrl) => baseUrl ? createAuthClient({ baseUrl, middlewares: middlewareFor("auth", [retryContention]) }) : null
|
|
1422
|
+
});
|
|
1423
|
+
const refresh = async () => {
|
|
1424
|
+
const client = authClientBare.get();
|
|
1425
|
+
assert2(client, KeboolaErrorType.NotReady);
|
|
1426
|
+
const refreshed = await client.token.refresh(config.requireCredential().refreshToken);
|
|
1427
|
+
config.applyRefresh(refreshed);
|
|
1428
|
+
return refreshed.accessToken;
|
|
1429
|
+
};
|
|
1430
|
+
const getToken = () => {
|
|
1431
|
+
const state = config.store.get();
|
|
1432
|
+
if (state.status === "anonymous") return null;
|
|
1433
|
+
const { accessToken, issuedAt, expiresIn } = state.credential;
|
|
1434
|
+
return { accessToken, timing: { issuedAt, expiresIn } };
|
|
1435
|
+
};
|
|
1436
|
+
const signOut = () => {
|
|
1437
|
+
config.reset();
|
|
1438
|
+
persistor.clear();
|
|
1439
|
+
};
|
|
1440
|
+
const onSessionExpired = () => {
|
|
1441
|
+
if (config.notifyExpired()) signOut();
|
|
1442
|
+
};
|
|
1443
|
+
const credential = createBearerCredential({ refresh, getToken, onSessionExpired });
|
|
1444
|
+
const authMiddleware = createBearerAuthMiddleware(credential);
|
|
1445
|
+
const authClient = createDerivedStore({
|
|
1446
|
+
source: config.store,
|
|
1447
|
+
dependsOn: (state) => state.baseUrl,
|
|
1448
|
+
build: (baseUrl) => baseUrl ? createAuthClient({
|
|
1449
|
+
baseUrl,
|
|
1450
|
+
middlewares: middlewareFor("auth", [retryContention, authMiddleware])
|
|
1451
|
+
}) : null
|
|
1452
|
+
});
|
|
1453
|
+
const management = createDerivedStore({
|
|
1454
|
+
source: config.store,
|
|
1455
|
+
dependsOn: (state) => state.status === "anonymous" ? null : state.baseUrl,
|
|
1456
|
+
build: (baseUrl) => baseUrl ? createManagementClient({
|
|
1457
|
+
baseUrl,
|
|
1458
|
+
auth: { type: "bearer", token: "" },
|
|
1459
|
+
middlewares: middlewareFor("management", [authMiddleware])
|
|
1460
|
+
}) : null
|
|
1461
|
+
});
|
|
1462
|
+
const projectClientsAsync = createDerivedAsyncStore({
|
|
1463
|
+
source: config.store,
|
|
1464
|
+
// Keyed on baseUrl + projectId only — a rotation (new credential, same project) must not rebuild.
|
|
1465
|
+
dependsOn: (state) => state.status === "scoped" ? { baseUrl: state.baseUrl, projectId: state.projectId } : null,
|
|
1466
|
+
build: ({ baseUrl, projectId }) => {
|
|
1467
|
+
return createProjectClients({
|
|
1468
|
+
baseUrl,
|
|
1469
|
+
authMiddleware,
|
|
1470
|
+
projectId,
|
|
1471
|
+
middlewareFor,
|
|
1472
|
+
clientServiceUrls: options.clientServiceUrls
|
|
556
1473
|
});
|
|
557
1474
|
}
|
|
558
1475
|
});
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
};
|
|
568
|
-
const
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
1476
|
+
if (options.baseUrl) config.setBaseUrl(options.baseUrl);
|
|
1477
|
+
config.store.subscribe((state) => {
|
|
1478
|
+
if (state.status === "anonymous") return;
|
|
1479
|
+
persistor.persist({
|
|
1480
|
+
baseUrl: state.baseUrl,
|
|
1481
|
+
projectId: state.status === "scoped" ? state.projectId : null,
|
|
1482
|
+
refreshToken: state.credential.refreshToken
|
|
1483
|
+
});
|
|
1484
|
+
});
|
|
1485
|
+
const debug = () => ({
|
|
1486
|
+
type: "Bearer",
|
|
1487
|
+
config: config.debug(),
|
|
1488
|
+
authReady: authClient.get() !== null,
|
|
1489
|
+
managementReady: management.get() !== null,
|
|
1490
|
+
storage: projectClientsAsync.store.get().state
|
|
1491
|
+
});
|
|
1492
|
+
const session = {
|
|
1493
|
+
hasPersistedValue: persistor.hasPersistedValue,
|
|
1494
|
+
setBaseUrl: config.setBaseUrl,
|
|
1495
|
+
isStorageReady: () => projectClientsAsync.store.get().state === "ready",
|
|
1496
|
+
authenticate: (tokens) => config.authenticate(tokens),
|
|
1497
|
+
setProject: config.setProjectId,
|
|
1498
|
+
setProjectAsync: async (projectId) => {
|
|
1499
|
+
config.setProjectId(projectId);
|
|
1500
|
+
await projectClientsAsync.settled();
|
|
572
1501
|
},
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
1502
|
+
reset: signOut,
|
|
1503
|
+
/**
|
|
1504
|
+
* Dev/test only: mark the current access token as expired so the bearer credential rotates it on
|
|
1505
|
+
* the next request. Pair with any authenticated call (e.g. `api.storage.tokens.verify()`) to force
|
|
1506
|
+
* the rotation immediately and observe the new credential.
|
|
1507
|
+
*/
|
|
1508
|
+
debugForceRefresh: config.forceExpire,
|
|
1509
|
+
restore: async () => {
|
|
1510
|
+
const persisted = persistor.hydrate();
|
|
1511
|
+
if (!persisted.refreshToken || !persisted.baseUrl) return { status: "empty" };
|
|
1512
|
+
const configured = config.getBaseUrl();
|
|
1513
|
+
if (configured && configured !== persisted.baseUrl) {
|
|
1514
|
+
persistor.clear();
|
|
1515
|
+
return { status: "empty" };
|
|
1516
|
+
}
|
|
1517
|
+
if (!configured) config.setBaseUrl(persisted.baseUrl);
|
|
1518
|
+
const client = authClientBare.get();
|
|
1519
|
+
assert2(client, KeboolaErrorType.NotReady);
|
|
1520
|
+
try {
|
|
1521
|
+
const refreshed = await client.token.refresh(persisted.refreshToken);
|
|
1522
|
+
config.authenticate(refreshed);
|
|
1523
|
+
if (persisted.projectId !== null) {
|
|
1524
|
+
config.setProjectId(persisted.projectId);
|
|
1525
|
+
await projectClientsAsync.settled();
|
|
1526
|
+
}
|
|
1527
|
+
return { status: "restored" };
|
|
1528
|
+
} catch (err) {
|
|
1529
|
+
if (isUnauthorized(err)) {
|
|
1530
|
+
persistor.clear();
|
|
1531
|
+
return { status: "expired" };
|
|
1532
|
+
}
|
|
1533
|
+
throw err;
|
|
1534
|
+
}
|
|
1535
|
+
},
|
|
1536
|
+
subscribe: (listener) => {
|
|
1537
|
+
const unsubscribeConfig = config.store.subscribe(() => listener(debug()));
|
|
1538
|
+
const unsubscribeBuild = projectClientsAsync.store.subscribe(() => listener(debug()));
|
|
1539
|
+
return () => {
|
|
1540
|
+
unsubscribeConfig();
|
|
1541
|
+
unsubscribeBuild();
|
|
587
1542
|
};
|
|
1543
|
+
},
|
|
1544
|
+
debug
|
|
1545
|
+
};
|
|
1546
|
+
const api = createApi({
|
|
1547
|
+
getAuthClient: () => authClient.get(),
|
|
1548
|
+
getManagementClient: () => management.get(),
|
|
1549
|
+
getProjectClients: () => {
|
|
1550
|
+
const state = projectClientsAsync.store.get();
|
|
1551
|
+
return state.state === "ready" ? state.value : null;
|
|
588
1552
|
}
|
|
1553
|
+
});
|
|
1554
|
+
return { api, session };
|
|
1555
|
+
};
|
|
1556
|
+
|
|
1557
|
+
// src/keboola/legacy/createConfig.ts
|
|
1558
|
+
var createConfig2 = () => {
|
|
1559
|
+
const store = createStore({ baseUrl: null, sapiToken: null, managementToken: null });
|
|
1560
|
+
const setBaseUrl = (baseUrl) => {
|
|
1561
|
+
store.set({ ...store.get(), baseUrl });
|
|
589
1562
|
};
|
|
590
|
-
|
|
1563
|
+
const authenticate = (tokens) => {
|
|
1564
|
+
const current = store.get();
|
|
1565
|
+
store.set({
|
|
1566
|
+
...current,
|
|
1567
|
+
sapiToken: tokens.sapiToken ?? current.sapiToken,
|
|
1568
|
+
managementToken: tokens.managementToken ?? current.managementToken
|
|
1569
|
+
});
|
|
1570
|
+
};
|
|
1571
|
+
const getStorageToken = () => store.get().sapiToken ?? "";
|
|
1572
|
+
const setStorageToken = (sapiToken) => store.set({ ...store.get(), sapiToken });
|
|
1573
|
+
const debug = () => store.get();
|
|
1574
|
+
return { store, setBaseUrl, authenticate, getStorageToken, setStorageToken, debug };
|
|
591
1575
|
};
|
|
592
1576
|
|
|
593
|
-
// src/
|
|
594
|
-
var
|
|
1577
|
+
// src/keboola/legacy/createProjectClients.ts
|
|
1578
|
+
var createAttachStorageToken = (getToken) => (next) => (request) => {
|
|
595
1579
|
request.request.headers.set(KeboolaHttpHeader.STORAGE_API_TOKEN, getToken());
|
|
596
1580
|
return next(request);
|
|
597
1581
|
};
|
|
598
|
-
var
|
|
599
|
-
// Bucket lifecycle (create / delete / register) — changes token.bucketPermissions.
|
|
600
|
-
// At most one trailing segment, so sub-resources (tables, listing, metadata, refresh)
|
|
601
|
-
// under /buckets/{id}/... don't trigger a re-verify.
|
|
602
|
-
/\/buckets(\/[^/]+)?$/,
|
|
603
|
-
// Project feature toggles — changes token.owner.features. Anchored to
|
|
604
|
-
// /projects/{id}/features so /manage/features and /users/{id}/features don't match.
|
|
605
|
-
/\/projects\/[^/]+\/features(\/[^/]+)?$/
|
|
606
|
-
];
|
|
607
|
-
var isStorageTokenMutatingRequest = (request) => {
|
|
608
|
-
if (request.method === "GET") return false;
|
|
609
|
-
const { pathname } = new URL(request.url);
|
|
610
|
-
return STORAGE_TOKEN_MUTATING_PATTERNS.some((pattern) => pattern.test(pathname));
|
|
611
|
-
};
|
|
612
|
-
var createProjectRefreshMiddleware = (shouldRefresh, requestRefresh) => (next) => async (request) => {
|
|
613
|
-
const response = await next(request);
|
|
614
|
-
if (shouldRefresh(request.request)) await requestRefresh();
|
|
615
|
-
return response;
|
|
616
|
-
};
|
|
617
|
-
var createLiveProject = ({
|
|
618
|
-
initialToken,
|
|
619
|
-
verify
|
|
620
|
-
}) => {
|
|
621
|
-
const store = createStore(createProject({ sapiToken: initialToken }));
|
|
622
|
-
const refresh = coalesce(async () => store.set(createProject({ sapiToken: await verify() })));
|
|
623
|
-
const middleware = createProjectRefreshMiddleware(isStorageTokenMutatingRequest, refresh);
|
|
624
|
-
return { store, getProject: () => store.get(), subscribe: store.subscribe, middleware };
|
|
625
|
-
};
|
|
626
|
-
var createLiveToken = ({ initialToken }) => {
|
|
627
|
-
const store = createStore(initialToken);
|
|
628
|
-
const attachTokenMiddleware = createAttachTokenMiddleware(() => store.get());
|
|
629
|
-
return { attachTokenMiddleware, set: store.set };
|
|
630
|
-
};
|
|
631
|
-
var createClients = async ({
|
|
1582
|
+
var createProjectClients2 = async ({
|
|
632
1583
|
baseUrl,
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
1584
|
+
getStorageToken,
|
|
1585
|
+
onStorageTokenRefreshed,
|
|
1586
|
+
middlewareFor,
|
|
1587
|
+
clientServiceUrls
|
|
636
1588
|
}) => {
|
|
637
|
-
const
|
|
638
|
-
const
|
|
639
|
-
const _storage = createStorageClient({
|
|
640
|
-
baseUrl,
|
|
641
|
-
auth: { type: "sapi-token", token: token.storageApi },
|
|
642
|
-
middlewares: [liveToken.attachTokenMiddleware]
|
|
643
|
-
});
|
|
1589
|
+
const auth = { type: "sapi-token", token: getStorageToken() };
|
|
1590
|
+
const attach = createAttachStorageToken(getStorageToken);
|
|
1591
|
+
const _storage = createStorageClient({ baseUrl, auth, middlewares: [attach] });
|
|
644
1592
|
const [stackInfo, sapiToken, devBranches] = await Promise.all([
|
|
645
1593
|
_storage.getStackInfo({ exclude: "componentDetails" }),
|
|
646
1594
|
_storage.tokens.verify(),
|
|
@@ -661,176 +1609,6 @@ var createClients = async ({
|
|
|
661
1609
|
hasStorageBranches: project.hasFeature(ProjectFeature.StorageBranches)
|
|
662
1610
|
})
|
|
663
1611
|
});
|
|
664
|
-
const storage = createStorageClient({
|
|
665
|
-
baseUrl,
|
|
666
|
-
auth: { type: "sapi-token", token: token.storageApi },
|
|
667
|
-
middlewares: middlewareFor("storage", [liveProject.middleware]),
|
|
668
|
-
onRefreshToken: liveToken.set
|
|
669
|
-
});
|
|
670
|
-
const management = createManagementClient({
|
|
671
|
-
baseUrl,
|
|
672
|
-
auth: { type: "management-token", token: token.managementApi },
|
|
673
|
-
middlewares: middlewareFor("management", [liveProject.middleware])
|
|
674
|
-
});
|
|
675
|
-
const auth = createAuthClient({
|
|
676
|
-
baseUrl,
|
|
677
|
-
middlewares: middlewareFor("auth")
|
|
678
|
-
});
|
|
679
|
-
const { client, meta } = createServiceClientRegistry()({
|
|
680
|
-
getServiceBaseUrl: (serviceId) => stack.getServiceUrl(serviceId),
|
|
681
|
-
onUnavailable: ({ serviceId, path, clientName }) => {
|
|
682
|
-
throw new ServiceUnavailableError(serviceId, path, clientName);
|
|
683
|
-
}
|
|
684
|
-
}).add({
|
|
685
|
-
serviceId: "vault",
|
|
686
|
-
clientName: "vault",
|
|
687
|
-
clientFn: (serviceBaseUrl) => createVaultClient({
|
|
688
|
-
baseUrl: serviceBaseUrl,
|
|
689
|
-
middlewares: middlewareFor("vault", [liveToken.attachTokenMiddleware]),
|
|
690
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
691
|
-
})
|
|
692
|
-
}).add({
|
|
693
|
-
serviceId: "data-science",
|
|
694
|
-
clientName: "dataScience",
|
|
695
|
-
clientFn: (serviceBaseUrl) => createDataScienceClient({
|
|
696
|
-
baseUrl: serviceBaseUrl,
|
|
697
|
-
middlewares: middlewareFor("dataScience", [liveToken.attachTokenMiddleware]),
|
|
698
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
699
|
-
})
|
|
700
|
-
}).add({
|
|
701
|
-
serviceId: "encryption",
|
|
702
|
-
clientName: "encryption",
|
|
703
|
-
clientFn: (serviceBaseUrl) => createEncryptionClient({
|
|
704
|
-
baseUrl: serviceBaseUrl,
|
|
705
|
-
middlewares: middlewareFor("encryption")
|
|
706
|
-
})
|
|
707
|
-
}).add({
|
|
708
|
-
serviceId: "editor",
|
|
709
|
-
clientName: "editor",
|
|
710
|
-
clientFn: (serviceBaseUrl) => createEditorClient({
|
|
711
|
-
baseUrl: serviceBaseUrl,
|
|
712
|
-
middlewares: middlewareFor("editor", [liveToken.attachTokenMiddleware]),
|
|
713
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
714
|
-
})
|
|
715
|
-
}).add({
|
|
716
|
-
serviceId: "sync-actions",
|
|
717
|
-
clientName: "syncActions",
|
|
718
|
-
clientFn: (serviceBaseUrl) => createSyncActionsClient({
|
|
719
|
-
baseUrl: serviceBaseUrl,
|
|
720
|
-
middlewares: middlewareFor("syncActions", [liveToken.attachTokenMiddleware]),
|
|
721
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
722
|
-
})
|
|
723
|
-
}).add({
|
|
724
|
-
serviceId: "telemetry",
|
|
725
|
-
clientName: "telemetry",
|
|
726
|
-
clientFn: (serviceBaseUrl) => createTelemetryClient({
|
|
727
|
-
baseUrl: serviceBaseUrl,
|
|
728
|
-
middlewares: middlewareFor("telemetry", [liveToken.attachTokenMiddleware]),
|
|
729
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
730
|
-
})
|
|
731
|
-
}).add({
|
|
732
|
-
serviceId: "query",
|
|
733
|
-
clientName: "queryService",
|
|
734
|
-
clientFn: (serviceBaseUrl) => createQueryServiceClient({
|
|
735
|
-
baseUrl: serviceBaseUrl,
|
|
736
|
-
middlewares: middlewareFor("queryService", [liveToken.attachTokenMiddleware]),
|
|
737
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
738
|
-
})
|
|
739
|
-
}).add({
|
|
740
|
-
serviceId: "queue",
|
|
741
|
-
clientName: "queue",
|
|
742
|
-
clientFn: (serviceBaseUrl) => createQueueClient({
|
|
743
|
-
baseUrl: serviceBaseUrl,
|
|
744
|
-
middlewares: middlewareFor("queue", [liveToken.attachTokenMiddleware]),
|
|
745
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
746
|
-
})
|
|
747
|
-
}).add({
|
|
748
|
-
serviceId: "kai-assistant",
|
|
749
|
-
clientName: "chat",
|
|
750
|
-
clientFn: (serviceBaseUrl) => createChatClient({
|
|
751
|
-
storageApiUrl: baseUrl,
|
|
752
|
-
baseUrl: serviceBaseUrl,
|
|
753
|
-
middlewares: middlewareFor("chat", [liveToken.attachTokenMiddleware]),
|
|
754
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
755
|
-
})
|
|
756
|
-
}).add({
|
|
757
|
-
serviceId: "ai",
|
|
758
|
-
clientName: "ai",
|
|
759
|
-
clientFn: (serviceBaseUrl) => createAiClient({
|
|
760
|
-
baseUrl: serviceBaseUrl,
|
|
761
|
-
middlewares: middlewareFor("ai", [liveToken.attachTokenMiddleware]),
|
|
762
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
763
|
-
})
|
|
764
|
-
}).add({
|
|
765
|
-
serviceId: "import",
|
|
766
|
-
clientName: "import",
|
|
767
|
-
clientFn: (serviceBaseUrl) => createImportClient({
|
|
768
|
-
baseUrl: serviceBaseUrl,
|
|
769
|
-
middlewares: middlewareFor("import", [liveToken.attachTokenMiddleware]),
|
|
770
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
771
|
-
})
|
|
772
|
-
}).add({
|
|
773
|
-
serviceId: "kai-agent",
|
|
774
|
-
clientName: "kaiAgent",
|
|
775
|
-
clientFn: (serviceBaseUrl) => createKaiAgentClient({
|
|
776
|
-
baseUrl: serviceBaseUrl,
|
|
777
|
-
middlewares: middlewareFor("kaiAgent", [liveToken.attachTokenMiddleware]),
|
|
778
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
779
|
-
})
|
|
780
|
-
}).add({
|
|
781
|
-
serviceId: "oauth",
|
|
782
|
-
clientName: "oauth",
|
|
783
|
-
clientFn: (serviceBaseUrl) => createOauthClient({
|
|
784
|
-
baseUrl: serviceBaseUrl,
|
|
785
|
-
middlewares: middlewareFor("oauth", [liveToken.attachTokenMiddleware]),
|
|
786
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
787
|
-
})
|
|
788
|
-
}).add({
|
|
789
|
-
serviceId: "scheduler",
|
|
790
|
-
clientName: "scheduler",
|
|
791
|
-
clientFn: (serviceBaseUrl) => createSchedulerClient({
|
|
792
|
-
baseUrl: serviceBaseUrl,
|
|
793
|
-
middlewares: middlewareFor("scheduler", [liveToken.attachTokenMiddleware]),
|
|
794
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
795
|
-
})
|
|
796
|
-
}).add({
|
|
797
|
-
serviceId: "stream",
|
|
798
|
-
clientName: "stream",
|
|
799
|
-
clientFn: (serviceBaseUrl) => createStreamClient({
|
|
800
|
-
baseUrl: serviceBaseUrl,
|
|
801
|
-
middlewares: middlewareFor("stream", [liveToken.attachTokenMiddleware]),
|
|
802
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
803
|
-
})
|
|
804
|
-
}).add({
|
|
805
|
-
serviceId: "notification",
|
|
806
|
-
clientName: "notifications",
|
|
807
|
-
clientFn: (serviceBaseUrl) => createNotificationsClient({
|
|
808
|
-
baseUrl: serviceBaseUrl,
|
|
809
|
-
middlewares: middlewareFor("notifications", [liveToken.attachTokenMiddleware]),
|
|
810
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
811
|
-
})
|
|
812
|
-
}).add({
|
|
813
|
-
serviceId: "metastore",
|
|
814
|
-
clientName: "metastore",
|
|
815
|
-
clientFn: (serviceBaseUrl) => createMetastoreClient({
|
|
816
|
-
baseUrl: serviceBaseUrl,
|
|
817
|
-
middlewares: middlewareFor("metastore", [liveToken.attachTokenMiddleware]),
|
|
818
|
-
auth: { type: "sapi-token", token: token.storageApi }
|
|
819
|
-
})
|
|
820
|
-
}).build();
|
|
821
|
-
const tag = createTagSdk({
|
|
822
|
-
metastoreClient: client.metastore
|
|
823
|
-
});
|
|
824
|
-
const storageSdk = createStorageSdk({
|
|
825
|
-
storageClient: storage
|
|
826
|
-
});
|
|
827
|
-
const vault = createVaultSdk({
|
|
828
|
-
vaultClient: client.vault,
|
|
829
|
-
encryptionClient: client.encryption
|
|
830
|
-
});
|
|
831
|
-
const variables = createVariablesSdk({
|
|
832
|
-
storageClient: storage
|
|
833
|
-
});
|
|
834
1612
|
const context = {
|
|
835
1613
|
stack,
|
|
836
1614
|
defaultBranch,
|
|
@@ -839,222 +1617,106 @@ var createClients = async ({
|
|
|
839
1617
|
},
|
|
840
1618
|
get st() {
|
|
841
1619
|
return storageTableStore.get();
|
|
842
|
-
}
|
|
843
|
-
serviceMeta: meta
|
|
1620
|
+
}
|
|
844
1621
|
};
|
|
845
|
-
const
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
1622
|
+
const storage = createStorageClient({
|
|
1623
|
+
baseUrl,
|
|
1624
|
+
auth,
|
|
1625
|
+
middlewares: middlewareFor("storage", [liveProject.middleware]),
|
|
1626
|
+
onRefreshToken: onStorageTokenRefreshed
|
|
849
1627
|
});
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
// clients
|
|
853
|
-
storage,
|
|
854
|
-
management,
|
|
1628
|
+
const { client: services, meta: serviceMeta } = createServiceClients({
|
|
1629
|
+
baseUrl,
|
|
855
1630
|
auth,
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
}
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
};
|
|
872
|
-
const result = { init };
|
|
873
|
-
const handler = {
|
|
874
|
-
get(_, property) {
|
|
875
|
-
if (isBuiltInProperty(property)) return void 0;
|
|
876
|
-
if (property === "init") return init;
|
|
877
|
-
assert(clients, `API is not initialized. Call init() before accessing ${String(property)}`);
|
|
878
|
-
return clients[property];
|
|
879
|
-
}
|
|
1631
|
+
getServiceBaseUrl: context.stack.getServiceUrl,
|
|
1632
|
+
middlewareFor,
|
|
1633
|
+
attachTokenMiddleware: attach
|
|
1634
|
+
});
|
|
1635
|
+
const sdk = {
|
|
1636
|
+
configuration: createConfigurationSdk({
|
|
1637
|
+
storageClient: storage,
|
|
1638
|
+
encryptionClient: services.encryption,
|
|
1639
|
+
context
|
|
1640
|
+
}),
|
|
1641
|
+
tag: createTagSdk({ metastoreClient: services.metastore }),
|
|
1642
|
+
semanticLayer: createSemanticLayerSdk({ metastoreClient: services.metastore }),
|
|
1643
|
+
storage: createStorageSdk({ storageClient: storage }),
|
|
1644
|
+
vault: createVaultSdk({ vaultClient: services.vault, encryptionClient: services.encryption }),
|
|
1645
|
+
variables: createVariablesSdk({ storageClient: storage })
|
|
880
1646
|
};
|
|
881
|
-
return
|
|
1647
|
+
return { context, serviceMeta, storage, ...services, sdk };
|
|
882
1648
|
};
|
|
883
1649
|
|
|
884
|
-
// src/
|
|
885
|
-
var
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
];
|
|
893
|
-
var ALWAYS_REDACTED_QUERY_PARAMS = /* @__PURE__ */ new Set([
|
|
894
|
-
"token",
|
|
895
|
-
"apikey",
|
|
896
|
-
"api_key",
|
|
897
|
-
"access_token",
|
|
898
|
-
"refresh_token",
|
|
899
|
-
"code",
|
|
900
|
-
"state",
|
|
901
|
-
"signature",
|
|
902
|
-
"sig",
|
|
903
|
-
"x-amz-signature",
|
|
904
|
-
"x-amz-credential",
|
|
905
|
-
"x-amz-security-token",
|
|
906
|
-
"password",
|
|
907
|
-
"secret"
|
|
908
|
-
]);
|
|
909
|
-
var REDACTED = "[REDACTED]";
|
|
910
|
-
var getRedactedUrl = (rawUrl) => {
|
|
911
|
-
const url = new URL(rawUrl);
|
|
912
|
-
if (url.username) url.username = REDACTED;
|
|
913
|
-
if (url.password) url.password = REDACTED;
|
|
914
|
-
url.searchParams.forEach((_value, key) => {
|
|
915
|
-
if (ALWAYS_REDACTED_QUERY_PARAMS.has(key.toLowerCase())) {
|
|
916
|
-
url.searchParams.set(key, REDACTED);
|
|
917
|
-
}
|
|
1650
|
+
// src/keboola/legacy/keboola.ts
|
|
1651
|
+
var createLegacyKeboola = (options = {}) => {
|
|
1652
|
+
const config = createConfig2();
|
|
1653
|
+
const middlewareFor = createMiddlewareFor(options.middlewares);
|
|
1654
|
+
const authClient = createDerivedStore({
|
|
1655
|
+
source: config.store,
|
|
1656
|
+
dependsOn: (state) => state.baseUrl,
|
|
1657
|
+
build: (baseUrl) => baseUrl ? createAuthClient({ baseUrl, middlewares: middlewareFor("auth", []) }) : null
|
|
918
1658
|
});
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
const redactedSet = new Set(
|
|
928
|
-
[...ALWAYS_REDACTED_HEADERS, ...redacted].map((h) => h.toLowerCase())
|
|
929
|
-
);
|
|
930
|
-
const result = {};
|
|
931
|
-
headers.forEach((value, name) => {
|
|
932
|
-
result[name] = redactedSet.has(name.toLowerCase()) ? REDACTED : value;
|
|
1659
|
+
const management = createDerivedStore({
|
|
1660
|
+
source: config.store,
|
|
1661
|
+
dependsOn: (state) => ({ baseUrl: state.baseUrl, token: state.managementToken }),
|
|
1662
|
+
build: ({ baseUrl, token }) => baseUrl ? createManagementClient({
|
|
1663
|
+
baseUrl,
|
|
1664
|
+
auth: token ? { type: "management-token", token } : { type: "management-token" },
|
|
1665
|
+
middlewares: middlewareFor("management", [])
|
|
1666
|
+
}) : null
|
|
933
1667
|
});
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
});
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
data: error.data
|
|
956
|
-
});
|
|
957
|
-
var formatLog = (level, log) => {
|
|
958
|
-
const parts = [`[${level.toUpperCase()}]`, `${Math.round(log.durationMs)}ms`, log.method];
|
|
959
|
-
parts.push(log.request.url);
|
|
960
|
-
if ("response" in log) parts.push(String(log.response.status));
|
|
961
|
-
return parts.join(" ");
|
|
962
|
-
};
|
|
963
|
-
var createSafeLogger = (logger, level = "error-only") => {
|
|
964
|
-
return {
|
|
965
|
-
info: (log) => {
|
|
966
|
-
if (level !== "all") return;
|
|
967
|
-
try {
|
|
968
|
-
if (logger?.info) {
|
|
969
|
-
logger.info(log);
|
|
970
|
-
return;
|
|
971
|
-
}
|
|
972
|
-
console.info(formatLog("info", log));
|
|
973
|
-
} catch {
|
|
974
|
-
}
|
|
975
|
-
},
|
|
976
|
-
error: (log) => {
|
|
977
|
-
try {
|
|
978
|
-
if (logger?.error) {
|
|
979
|
-
logger.error(log);
|
|
980
|
-
return;
|
|
981
|
-
}
|
|
982
|
-
console.error(formatLog("error", log));
|
|
983
|
-
} catch {
|
|
984
|
-
}
|
|
985
|
-
}
|
|
1668
|
+
const build = createDerivedAsyncStore({
|
|
1669
|
+
source: config.store,
|
|
1670
|
+
dependsOn: (state) => state.sapiToken && state.baseUrl ? state.baseUrl : null,
|
|
1671
|
+
build: (baseUrl) => createProjectClients2({
|
|
1672
|
+
baseUrl,
|
|
1673
|
+
getStorageToken: config.getStorageToken,
|
|
1674
|
+
onStorageTokenRefreshed: config.setStorageToken,
|
|
1675
|
+
middlewareFor,
|
|
1676
|
+
clientServiceUrls: options.clientServiceUrls
|
|
1677
|
+
})
|
|
1678
|
+
});
|
|
1679
|
+
if (options.baseUrl) config.setBaseUrl(options.baseUrl);
|
|
1680
|
+
const debug = () => {
|
|
1681
|
+
const info = config.debug();
|
|
1682
|
+
return {
|
|
1683
|
+
type: "Sapi",
|
|
1684
|
+
config: info,
|
|
1685
|
+
authReady: authClient.get() !== null,
|
|
1686
|
+
managementReady: !!info.managementToken,
|
|
1687
|
+
storage: build.store.get().state
|
|
1688
|
+
};
|
|
986
1689
|
};
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
const
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
return result;
|
|
1006
|
-
} catch (error) {
|
|
1007
|
-
if (error instanceof Error)
|
|
1008
|
-
safeLogger.error({
|
|
1009
|
-
correlationId,
|
|
1010
|
-
method,
|
|
1011
|
-
durationMs: performance.now() - start,
|
|
1012
|
-
request: requestLog,
|
|
1013
|
-
error: isApiError(error) ? redactApiError(error, redactHeaders) : error
|
|
1014
|
-
});
|
|
1015
|
-
throw error;
|
|
1016
|
-
}
|
|
1690
|
+
const session = {
|
|
1691
|
+
setBaseUrl: config.setBaseUrl,
|
|
1692
|
+
isStorageReady: () => build.store.get().state === "ready",
|
|
1693
|
+
authenticateStorage: (sapiToken) => config.authenticate({ sapiToken }),
|
|
1694
|
+
authenticateStorageAsync: async (sapiToken) => {
|
|
1695
|
+
config.authenticate({ sapiToken });
|
|
1696
|
+
await build.settled();
|
|
1697
|
+
},
|
|
1698
|
+
authenticateManagement: (managementToken) => config.authenticate({ managementToken }),
|
|
1699
|
+
subscribe: (listener) => {
|
|
1700
|
+
const unsubscribeConfig = config.store.subscribe(() => listener(debug()));
|
|
1701
|
+
const unsubscribeBuild = build.store.subscribe(() => listener(debug()));
|
|
1702
|
+
return () => {
|
|
1703
|
+
unsubscribeConfig();
|
|
1704
|
+
unsubscribeBuild();
|
|
1705
|
+
};
|
|
1706
|
+
},
|
|
1707
|
+
debug
|
|
1017
1708
|
};
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
HttpStatus.BAD_GATEWAY,
|
|
1025
|
-
HttpStatus.SERVICE_UNAVAILABLE,
|
|
1026
|
-
HttpStatus.GATEWAY_TIMEOUT
|
|
1027
|
-
];
|
|
1028
|
-
var DEFAULT_BACKOFF_FACTOR = 0.3;
|
|
1029
|
-
var defaultShouldRetry = (error) => error instanceof ApiError && DEFAULT_RETRYABLE_STATUSES.includes(error.response.status);
|
|
1030
|
-
var createRetryMiddleware = (options) => {
|
|
1031
|
-
const {
|
|
1032
|
-
maxRetries = DEFAULT_MAX_RETRIES,
|
|
1033
|
-
backoffFactor = DEFAULT_BACKOFF_FACTOR,
|
|
1034
|
-
shouldRetry = defaultShouldRetry
|
|
1035
|
-
} = options ?? {};
|
|
1036
|
-
if (!Number.isInteger(maxRetries) || maxRetries < 0) {
|
|
1037
|
-
throw new RangeError("maxRetries must be a non-negative integer");
|
|
1038
|
-
}
|
|
1039
|
-
if (!Number.isFinite(backoffFactor) || backoffFactor < 0) {
|
|
1040
|
-
throw new RangeError("backoffFactor must be a finite non-negative number");
|
|
1041
|
-
}
|
|
1042
|
-
return (next) => async (request) => {
|
|
1043
|
-
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
1044
|
-
try {
|
|
1045
|
-
return await next({ ...request, request: request.request.clone() });
|
|
1046
|
-
} catch (error) {
|
|
1047
|
-
if (attempt === maxRetries || !shouldRetry(error, attempt)) {
|
|
1048
|
-
throw error;
|
|
1049
|
-
}
|
|
1050
|
-
const delayMs = backoffFactor * 1e3 * Math.pow(2, attempt);
|
|
1051
|
-
await delay(delayMs, request.request.signal ?? void 0);
|
|
1052
|
-
}
|
|
1709
|
+
const api = createApi({
|
|
1710
|
+
getAuthClient: () => authClient.get(),
|
|
1711
|
+
getManagementClient: () => management.get(),
|
|
1712
|
+
getProjectClients: () => {
|
|
1713
|
+
const state = build.store.get();
|
|
1714
|
+
return state.state === "ready" ? state.value : null;
|
|
1053
1715
|
}
|
|
1054
|
-
|
|
1055
|
-
};
|
|
1716
|
+
});
|
|
1717
|
+
return { api, session };
|
|
1056
1718
|
};
|
|
1057
1719
|
|
|
1058
|
-
export { assert, coalesce,
|
|
1720
|
+
export { KeboolaError, KeboolaErrorType, assert, coalesce, createDerivedAsyncStore, createDerivedStore, createKeboola, createLegacyKeboola, createLocalStorage, createLoggingMiddleware, createMemoryStorage, createNullStorage, createPersistor, createRetryMiddleware, createSessionStorage, createStore, deepMerge, isKeboolaError, isStorageTokenMutatingRequest, shallowEqual };
|
|
1059
1721
|
//# sourceMappingURL=index.js.map
|
|
1060
1722
|
//# sourceMappingURL=index.js.map
|