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