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