@keboola/api-client 19.0.0 → 21.0.0

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