@keboola/api-client 55.0.0 → 57.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/AGENTS.md +110 -229
  2. package/API-SURFACE.md +12 -2
  3. package/CHANGELOG.md +61 -0
  4. package/README.md +20 -133
  5. package/dist/{ManagementSessionMintError-Bc9bc7Ai.cjs → ManagementSessionMintError-BCOLLaJi.cjs} +3 -2
  6. package/dist/ManagementSessionMintError-BCOLLaJi.cjs.map +1 -0
  7. package/dist/{ManagementSessionMintError-BMHDcEqV.js → ManagementSessionMintError-KUX3utTV.js} +3 -2
  8. package/dist/ManagementSessionMintError-KUX3utTV.js.map +1 -0
  9. package/dist/{adminRoles-Cm513r1G.d.ts → adminRoles-CnfGDvjN.d.ts} +2 -2
  10. package/dist/{adminRoles-BTKVwEy8.d.cts → adminRoles-D6AS9Bzx.d.cts} +2 -2
  11. package/dist/ai/index.d.cts +2 -2
  12. package/dist/ai/index.d.ts +2 -2
  13. package/dist/ai/types.d.cts +1 -1
  14. package/dist/ai/types.d.ts +1 -1
  15. package/dist/apps/index.cjs +1 -1
  16. package/dist/apps/index.d.cts +2 -2
  17. package/dist/apps/index.d.ts +2 -2
  18. package/dist/apps/index.js +1 -1
  19. package/dist/apps/types.d.cts +2 -2
  20. package/dist/apps/types.d.ts +2 -2
  21. package/dist/{apps-C1x5IKNQ.cjs → apps-BA9JRLAZ.cjs} +55 -1
  22. package/dist/apps-BA9JRLAZ.cjs.map +1 -0
  23. package/dist/{apps-BN7fWtSm.js → apps-DDcguJ1i.js} +55 -1
  24. package/dist/apps-DDcguJ1i.js.map +1 -0
  25. package/dist/assets/index.d.cts +1 -1
  26. package/dist/assets/index.d.ts +1 -1
  27. package/dist/auth/index.cjs +1 -1
  28. package/dist/auth/index.d.cts +1 -1
  29. package/dist/auth/index.d.ts +1 -1
  30. package/dist/auth/index.js +1 -1
  31. package/dist/auth/types.d.cts +2 -2
  32. package/dist/auth/types.d.ts +2 -2
  33. package/dist/{authClient-BM4L8XEN.js → authClient-BKGpJI5L.js} +14 -45
  34. package/dist/authClient-BKGpJI5L.js.map +1 -0
  35. package/dist/{authClient-DspK50e7.cjs → authClient-C3KG9hXw.cjs} +15 -58
  36. package/dist/authClient-C3KG9hXw.cjs.map +1 -0
  37. package/dist/{authClient-ij_Rm2Yn.d.ts → authClient-CbWpMmdX.d.ts} +7 -4
  38. package/dist/{authClient-NBi0pqD5.d.cts → authClient-UKeopxZZ.d.cts} +7 -4
  39. package/dist/billing/index.d.cts +1 -1
  40. package/dist/billing/index.d.ts +1 -1
  41. package/dist/billing/types.d.cts +1 -1
  42. package/dist/billing/types.d.ts +1 -1
  43. package/dist/chat/index.d.cts +2 -2
  44. package/dist/chat/index.d.ts +2 -2
  45. package/dist/chat/types.d.cts +1 -1
  46. package/dist/chat/types.d.ts +1 -1
  47. package/dist/componentsMcp/index.d.cts +1 -1
  48. package/dist/componentsMcp/index.d.ts +1 -1
  49. package/dist/componentsMcp/types.d.cts +1 -1
  50. package/dist/componentsMcp/types.d.ts +1 -1
  51. package/dist/constants/index.cjs +2 -2
  52. package/dist/constants/index.d.cts +3 -3
  53. package/dist/constants/index.d.ts +3 -3
  54. package/dist/constants/index.js +2 -2
  55. package/dist/{constants-HccvU5kx.js → constants-CxEaHCyt.js} +4 -3
  56. package/dist/constants-CxEaHCyt.js.map +1 -0
  57. package/dist/{constants-V9hAyPTo.cjs → constants-fiyOLyZE.cjs} +4 -3
  58. package/dist/constants-fiyOLyZE.cjs.map +1 -0
  59. package/dist/dataScience/index.d.cts +3 -3
  60. package/dist/dataScience/index.d.ts +3 -3
  61. package/dist/dataScience/types.d.cts +1 -1
  62. package/dist/dataScience/types.d.ts +1 -1
  63. package/dist/developerPortal/index.cjs +1 -1
  64. package/dist/developerPortal/index.d.cts +3 -3
  65. package/dist/developerPortal/index.d.ts +3 -3
  66. package/dist/developerPortal/index.js +1 -1
  67. package/dist/developerPortal/types.d.cts +2 -2
  68. package/dist/developerPortal/types.d.ts +2 -2
  69. package/dist/{developerPortalClient-CzCJ5sE3.js → developerPortalClient-3Q7049-4.js} +19 -1
  70. package/dist/developerPortalClient-3Q7049-4.js.map +1 -0
  71. package/dist/{developerPortalClient-BcK9F-Fs.cjs → developerPortalClient-Cj9bStCS.cjs} +19 -1
  72. package/dist/developerPortalClient-Cj9bStCS.cjs.map +1 -0
  73. package/dist/domain/permissions/index.d.cts +1 -1
  74. package/dist/domain/permissions/index.d.ts +1 -1
  75. package/dist/editor/index.d.cts +2 -2
  76. package/dist/editor/index.d.ts +2 -2
  77. package/dist/editor/types.d.cts +1 -1
  78. package/dist/editor/types.d.ts +1 -1
  79. package/dist/{emitter-raKkIqRp.d.ts → emitter-yaYzJOdh.d.cts} +1 -2
  80. package/dist/{emitter-raKkIqRp.d.cts → emitter-yaYzJOdh.d.ts} +1 -2
  81. package/dist/encryption/index.d.cts +1 -1
  82. package/dist/encryption/index.d.ts +1 -1
  83. package/dist/encryption/types.d.cts +1 -1
  84. package/dist/encryption/types.d.ts +1 -1
  85. package/dist/import/index.d.cts +3 -3
  86. package/dist/import/index.d.ts +3 -3
  87. package/dist/{index-FrsEkDvX.d.cts → index-9p4O-clX.d.cts} +2035 -73
  88. package/dist/{index-FrsEkDvX.d.ts → index-9p4O-clX.d.ts} +2035 -73
  89. package/dist/{index-BGE3eZfd.d.cts → index-B-HCh7LL.d.cts} +3 -3
  90. package/dist/{index-D3hWR_e4.d.ts → index-B0e42GnK.d.cts} +4 -3
  91. package/dist/{index-DeWeUUfE.d.ts → index-BbXGsspe.d.ts} +4 -4
  92. package/dist/{index-CYk7Aa8u.d.cts → index-Bg9BWpIY.d.ts} +4 -3
  93. package/dist/{index-CmyFWQXn.d.cts → index-BgEu7wGk.d.cts} +2671 -7325
  94. package/dist/{index-B8K-Bbdq.d.cts → index-Btft3BFn.d.ts} +29 -3
  95. package/dist/{index-CNJBmCHM.d.cts → index-ByaAn_lm.d.cts} +4 -4
  96. package/dist/{index-DLWMm1-T.d.ts → index-C92Ct6K5.d.ts} +178 -4
  97. package/dist/{index-CEDjFidH.d.ts → index-CBq59Aif.d.ts} +3 -3
  98. package/dist/{index-CQNwp6wX.d.ts → index-CGUPsu_R.d.cts} +29 -3
  99. package/dist/{index-CZvBjQvl.d.ts → index-CIA6-x2Q.d.ts} +4 -4
  100. package/dist/{index-BVe4S2CK.d.ts → index-CeWVf3d1.d.ts} +4 -4
  101. package/dist/{index-CQPs3hrp.d.ts → index-Cj0l_DL_.d.ts} +2671 -7325
  102. package/dist/{index-BUZ-vTRt.d.ts → index-Ck0UPKMM.d.ts} +2 -2
  103. package/dist/{index-d9zxFmNI.d.cts → index-D0ACg_Pp.d.cts} +7 -4
  104. package/dist/{index-8QhOqFLY.d.cts → index-D8nMnVp1.d.cts} +4 -4
  105. package/dist/{index-24GpnYhn.d.cts → index-DENUPo51.d.cts} +2 -2
  106. package/dist/{index-iFCann29.d.cts → index-DGjxLWZ-.d.cts} +3 -3
  107. package/dist/{index-CdeWTy8t.d.ts → index-Dse6Psvc.d.ts} +7 -4
  108. package/dist/{index-DTGOEke4.d.ts → index-DxcaEIhU.d.ts} +3 -3
  109. package/dist/{index-BE6qM0vu.d.cts → index-OCEoQ1Y-.d.cts} +4 -4
  110. package/dist/{index-BXgjPlZN.d.cts → index-jR69kGUZ.d.cts} +178 -4
  111. package/dist/index.cjs +613 -865
  112. package/dist/index.cjs.map +1 -1
  113. package/dist/index.d.cts +9 -9
  114. package/dist/index.d.ts +9 -9
  115. package/dist/index.js +611 -860
  116. package/dist/index.js.map +1 -1
  117. package/dist/kaiAgent/index.cjs +1 -1
  118. package/dist/kaiAgent/index.d.cts +2 -2
  119. package/dist/kaiAgent/index.d.ts +2 -2
  120. package/dist/kaiAgent/index.js +1 -1
  121. package/dist/kaiAgent/types.d.cts +2 -2
  122. package/dist/kaiAgent/types.d.ts +2 -2
  123. package/dist/{kaiAgent-De2T6G4G.cjs → kaiAgent-Q00g6S1v.cjs} +16 -1
  124. package/dist/kaiAgent-Q00g6S1v.cjs.map +1 -0
  125. package/dist/{kaiAgent-D0MoKqXe.js → kaiAgent-aqylPZHY.js} +16 -1
  126. package/dist/kaiAgent-aqylPZHY.js.map +1 -0
  127. package/dist/management/index.cjs +1 -1
  128. package/dist/management/index.d.cts +1 -1
  129. package/dist/management/index.d.ts +1 -1
  130. package/dist/management/index.js +1 -1
  131. package/dist/management/types.d.cts +1 -1
  132. package/dist/management/types.d.ts +1 -1
  133. package/dist/{management-BlMQnPNS.js → management-CIK5-Aq5.js} +14 -7
  134. package/dist/management-CIK5-Aq5.js.map +1 -0
  135. package/dist/{management-dIMrTTpI.cjs → management-Dqrc516s.cjs} +14 -7
  136. package/dist/management-Dqrc516s.cjs.map +1 -0
  137. package/dist/{metaObject-ClvW342q.d.ts → metaObject-AQ7wKDOu.d.ts} +2 -2
  138. package/dist/{metaObject-D7oudegV.d.cts → metaObject-I35_krxf.d.cts} +2 -2
  139. package/dist/metastore/index.d.cts +1 -1
  140. package/dist/metastore/index.d.ts +1 -1
  141. package/dist/metastore/types.d.cts +1 -1
  142. package/dist/metastore/types.d.ts +1 -1
  143. package/dist/microsoftGraph/index.d.cts +3 -3
  144. package/dist/microsoftGraph/index.d.ts +3 -3
  145. package/dist/microsoftGraph/types.d.cts +2 -2
  146. package/dist/microsoftGraph/types.d.ts +2 -2
  147. package/dist/{middleware-DxGv7DG8.js → middleware-DWmhthX0.js} +2 -2
  148. package/dist/middleware-DWmhthX0.js.map +1 -0
  149. package/dist/{middleware-vIaPDtQI.cjs → middleware-DYdDD4O6.cjs} +2 -2
  150. package/dist/middleware-DYdDD4O6.cjs.map +1 -0
  151. package/dist/notifications/index.d.cts +2 -2
  152. package/dist/notifications/index.d.ts +2 -2
  153. package/dist/notifications/types.d.cts +1 -1
  154. package/dist/notifications/types.d.ts +1 -1
  155. package/dist/oauth/index.d.cts +2 -2
  156. package/dist/oauth/index.d.ts +2 -2
  157. package/dist/oauth/types.d.cts +1 -1
  158. package/dist/oauth/types.d.ts +1 -1
  159. package/dist/omnisearch/index.d.cts +2 -2
  160. package/dist/omnisearch/index.d.ts +2 -2
  161. package/dist/omnisearch/types.d.cts +1 -1
  162. package/dist/omnisearch/types.d.ts +1 -1
  163. package/dist/{project-DS0HOV3M.d.ts → project-DwRvx_zN.d.ts} +3 -3
  164. package/dist/{project-BGk9CtOq.d.cts → project-ERH0FTGW.d.cts} +3 -3
  165. package/dist/queryService/index.cjs +1 -1
  166. package/dist/queryService/index.d.cts +1 -1
  167. package/dist/queryService/index.d.ts +1 -1
  168. package/dist/queryService/index.js +1 -1
  169. package/dist/queryService/types.d.cts +1 -1
  170. package/dist/queryService/types.d.ts +1 -1
  171. package/dist/{queryService-C3BQ6GKW.cjs → queryService-CECWubS0.cjs} +2 -2
  172. package/dist/{queryService-C3BQ6GKW.cjs.map → queryService-CECWubS0.cjs.map} +1 -1
  173. package/dist/{queryService-DQHtHy2-.js → queryService-CIxb_mcP.js} +2 -2
  174. package/dist/{queryService-DQHtHy2-.js.map → queryService-CIxb_mcP.js.map} +1 -1
  175. package/dist/queue/index.cjs +1 -1
  176. package/dist/queue/index.d.cts +11 -4
  177. package/dist/queue/index.d.ts +11 -4
  178. package/dist/queue/index.js +1 -1
  179. package/dist/queue/types.d.cts +1 -1
  180. package/dist/queue/types.d.ts +1 -1
  181. package/dist/{queue-6cywDnA-.js → queue-BBihD5qQ.js} +2 -2
  182. package/dist/{queue-6cywDnA-.js.map → queue-BBihD5qQ.js.map} +1 -1
  183. package/dist/{queue-J2uXzXR9.cjs → queue-PmTfoniJ.cjs} +2 -2
  184. package/dist/{queue-J2uXzXR9.cjs.map → queue-PmTfoniJ.cjs.map} +1 -1
  185. package/dist/scheduler/index.d.cts +2 -2
  186. package/dist/scheduler/index.d.ts +2 -2
  187. package/dist/scheduler/types.d.cts +1 -1
  188. package/dist/scheduler/types.d.ts +1 -1
  189. package/dist/{schema-DLmBEgPM.d.cts → schema-CqzWi5cO.d.cts} +14 -4
  190. package/dist/{schema-DLmBEgPM.d.ts → schema-CqzWi5cO.d.ts} +14 -4
  191. package/dist/sdk/configurations/index.d.cts +2 -3
  192. package/dist/sdk/configurations/index.d.ts +2 -3
  193. package/dist/sdk/dataAppServer/index.cjs +3 -3
  194. package/dist/sdk/dataAppServer/index.d.cts +1 -1
  195. package/dist/sdk/dataAppServer/index.d.ts +1 -1
  196. package/dist/sdk/dataAppServer/index.js +3 -3
  197. package/dist/sdk/developerPortal/index.cjs +3 -3
  198. package/dist/sdk/developerPortal/index.cjs.map +1 -1
  199. package/dist/sdk/developerPortal/index.d.cts +178 -4
  200. package/dist/sdk/developerPortal/index.d.ts +178 -4
  201. package/dist/sdk/developerPortal/index.js +3 -3
  202. package/dist/sdk/developerPortal/index.js.map +1 -1
  203. package/dist/sdk/kaiMemory/index.d.cts +1 -1
  204. package/dist/sdk/kaiMemory/index.d.ts +1 -1
  205. package/dist/sdk/kaiMemory/types.d.cts +1 -1
  206. package/dist/sdk/kaiMemory/types.d.ts +1 -1
  207. package/dist/sdk/queryService/index.d.cts +1 -1
  208. package/dist/sdk/queryService/index.d.ts +1 -1
  209. package/dist/sdk/securityPolicy/index.d.cts +2 -2
  210. package/dist/sdk/securityPolicy/index.d.ts +2 -2
  211. package/dist/sdk/securityPolicy/types.d.cts +1 -1
  212. package/dist/sdk/securityPolicy/types.d.ts +1 -1
  213. package/dist/sdk/semanticLayer/index.d.cts +1 -1
  214. package/dist/sdk/semanticLayer/index.d.ts +1 -1
  215. package/dist/sdk/semanticLayer/types.d.cts +1 -1
  216. package/dist/sdk/semanticLayer/types.d.ts +1 -1
  217. package/dist/sdk/tag/index.d.cts +3 -3
  218. package/dist/sdk/tag/index.d.ts +3 -3
  219. package/dist/sdk/tag/types.d.cts +1 -1
  220. package/dist/sdk/tag/types.d.ts +1 -1
  221. package/dist/sdk/vault/index.d.cts +1 -1
  222. package/dist/sdk/vault/index.d.ts +1 -1
  223. package/dist/status/index.d.cts +1 -1
  224. package/dist/status/index.d.ts +1 -1
  225. package/dist/storage/index.cjs +3 -3
  226. package/dist/storage/index.d.cts +2 -3
  227. package/dist/storage/index.d.ts +2 -3
  228. package/dist/storage/index.js +3 -3
  229. package/dist/storage/types.d.cts +6 -6
  230. package/dist/storage/types.d.ts +6 -6
  231. package/dist/{storage-BL-TfHp8.cjs → storage-chxoWtAL.cjs} +83 -42
  232. package/dist/storage-chxoWtAL.cjs.map +1 -0
  233. package/dist/{storage-DEJN8sw-.js → storage-o9teEKl_.js} +83 -42
  234. package/dist/storage-o9teEKl_.js.map +1 -0
  235. package/dist/{store-2OyH1XOP.cjs → store-7xlVu4qF.cjs} +3 -14
  236. package/dist/store-7xlVu4qF.cjs.map +1 -0
  237. package/dist/{store-HP0zRcLz.js → store-DDUzPeCm.js} +3 -14
  238. package/dist/store-DDUzPeCm.js.map +1 -0
  239. package/dist/stream/index.d.cts +2 -2
  240. package/dist/stream/index.d.ts +2 -2
  241. package/dist/stream/types.d.cts +1 -1
  242. package/dist/stream/types.d.ts +1 -1
  243. package/dist/syncActions/index.d.cts +2 -2
  244. package/dist/syncActions/index.d.ts +2 -2
  245. package/dist/syncActions/types.d.cts +1 -1
  246. package/dist/syncActions/types.d.ts +1 -1
  247. package/dist/telemetry/index.d.cts +2 -2
  248. package/dist/telemetry/index.d.ts +2 -2
  249. package/dist/telemetry/types.d.cts +1 -1
  250. package/dist/telemetry/types.d.ts +1 -1
  251. package/dist/{transientRetries-BORv47mH.js → transientRetries-dssygpwU.js} +2 -2
  252. package/dist/{transientRetries-BORv47mH.js.map → transientRetries-dssygpwU.js.map} +1 -1
  253. package/dist/{transientRetries-CBorl4Ue.cjs → transientRetries-yVaQgKqP.cjs} +2 -2
  254. package/dist/{transientRetries-CBorl4Ue.cjs.map → transientRetries-yVaQgKqP.cjs.map} +1 -1
  255. package/dist/{types-BEw98Dd2.d.cts → types-B1kernzE.d.cts} +2 -2
  256. package/dist/{types-DjSjUKUl.d.ts → types-BBmS7-IS.d.ts} +151 -4
  257. package/dist/{types-DbthI3r-.d.ts → types-BJyWTgXX.d.ts} +2 -2
  258. package/dist/{types-DNwIMEuB.d.cts → types-BPNFTA63.d.cts} +21 -7
  259. package/dist/{types-Bv2Ds1hL.d.cts → types-BPSExpye.d.cts} +244 -4
  260. package/dist/{types-Dsf7CYmm.d.ts → types-BiXonOK6.d.ts} +2 -2
  261. package/dist/{types-BXKL0wTI.d.cts → types-BimRBONo.d.cts} +3 -3
  262. package/dist/{types-D2hhEGem.d.cts → types-BuEC58u3.d.cts} +2 -2
  263. package/dist/{types-dU3EA8gk.d.ts → types-BzHyi99r.d.cts} +5 -3
  264. package/dist/{types-J_dgwMjP.d.ts → types-C4T_2JdN.d.cts} +40 -27
  265. package/dist/{types-OHt0D_f2.d.ts → types-C53aKnWt.d.ts} +2 -2
  266. package/dist/{types-Do3__S4Q.d.cts → types-CEjgqmr2.d.cts} +2 -2
  267. package/dist/{types-CQYyULrw.d.ts → types-CGtpwTJk.d.ts} +2 -2
  268. package/dist/{types-D5bxXqEU.d.ts → types-CH1uguug.d.cts} +2 -163
  269. package/dist/{types-Tg3euEN_.d.ts → types-CP8-CssY.d.ts} +2 -2
  270. package/dist/{types-DX1Dz0xK.d.ts → types-CPQ6RkiZ.d.ts} +244 -4
  271. package/dist/{types-DSWIIMdv.d.ts → types-CPwofeyq.d.ts} +3 -3
  272. package/dist/{types-ChOJ-Az7.d.cts → types-CQAEOq-K.d.cts} +2 -2
  273. package/dist/{types-CKdNf_2k.d.cts → types-CVWoP_PC.d.cts} +3 -3
  274. package/dist/{types-B4ezB18r.d.cts → types-CbM2MApW.d.cts} +2 -2
  275. package/dist/{types-BD0B1KQ6.d.ts → types-CbOfT6lb.d.ts} +21 -7
  276. package/dist/{types-DMhgKHCP.d.cts → types-CcPpqVhm.d.cts} +2 -2
  277. package/dist/{types-d5Bt8Mr3.d.ts → types-CeqpzbBH.d.ts} +2 -2
  278. package/dist/{types-DU8aPTFW.d.cts → types-CjJYZaMO.d.cts} +2 -2
  279. package/dist/{types-B4Vwz45w.d.cts → types-CjP8RcFN.d.cts} +2 -2
  280. package/dist/{types-Rrcx-8LM.d.ts → types-CjfsPtwk.d.ts} +2 -2
  281. package/dist/{types-B6f6LpZ_.d.cts → types-CnSBLcZB.d.ts} +163 -3
  282. package/dist/{types-Bp8G9yta.d.ts → types-CsXLdnfV.d.ts} +2 -2
  283. package/dist/{types-Y4e8GGa3.d.cts → types-CzAh5-0z.d.cts} +2 -2
  284. package/dist/{types-BDgOF2WN.d.ts → types-D0F_c5KI.d.ts} +4 -4
  285. package/dist/{types-C5B3Pfob.d.cts → types-D3L3CqKl.d.cts} +151 -4
  286. package/dist/{types-CTYTMXXj.d.ts → types-D4oIei5M.d.cts} +163 -3
  287. package/dist/{types-CSE8bHiq.d.cts → types-D6ilG8sC.d.cts} +3 -3
  288. package/dist/{types-Cf0WE6qK.d.cts → types-DEGkXcw2.d.ts} +5 -3
  289. package/dist/{types-BynQKst1.d.cts → types-DEhAcO1Z.d.cts} +2 -2
  290. package/dist/{types-DCARsJWs.d.cts → types-DaIfg9Mb.d.cts} +4 -4
  291. package/dist/{types-p_lWvuQJ.d.ts → types-DhofEmWy.d.ts} +2 -2
  292. package/dist/{types-zlYUn0oi.d.ts → types-Dp61pYgP.d.ts} +3 -3
  293. package/dist/{types-CRC4lbPw.d.cts → types-Dteot3tT.d.ts} +757 -112
  294. package/dist/{types-DoSZQ1Bi.d.ts → types-K-JISUUI.d.cts} +757 -112
  295. package/dist/{types-Bwvss_gW.d.cts → types-TywAc1ow.d.ts} +40 -27
  296. package/dist/{types-B6JcEPEu.d.ts → types-UBpth6_9.d.ts} +2 -2
  297. package/dist/{types-DKKHKj19.d.cts → types-Vw-tduOH.d.ts} +2 -163
  298. package/dist/{types-CIlBSV99.d.cts → types-ZyLTqgpa.d.cts} +2 -2
  299. package/dist/{types-D-ufoskb.d.cts → types-aylD1zQz.d.cts} +17 -2
  300. package/dist/{types-BVJmcoqA.d.cts → types-fYY4q7dC.d.cts} +2 -2
  301. package/dist/{types-DK1bSUNr.d.ts → types-jYn3e3Du.d.ts} +3 -3
  302. package/dist/{types-CepTvkfm.d.ts → types-qXqJRPHj.d.ts} +2 -2
  303. package/dist/{types-kGZQQcIK.d.ts → types-r-Qa3y8e.d.ts} +2 -2
  304. package/dist/{types-Cr6WA6CN.d.ts → types-z82j5aNW.d.ts} +17 -2
  305. package/dist/validateConnectionStatus-DgJwuEy9.js +86 -0
  306. package/dist/validateConnectionStatus-DgJwuEy9.js.map +1 -0
  307. package/dist/validateConnectionStatus-DpYRsU-e.cjs +121 -0
  308. package/dist/validateConnectionStatus-DpYRsU-e.cjs.map +1 -0
  309. package/dist/vault/index.d.cts +1 -1
  310. package/dist/vault/index.d.ts +1 -1
  311. package/dist/vault/types.d.cts +1 -1
  312. package/dist/vault/types.d.ts +1 -1
  313. package/package.json +2 -2
  314. package/surface/apps.md +8 -3
  315. package/surface/auth.md +3 -2
  316. package/surface/chat.md +3 -3
  317. package/surface/dataScience.md +2 -2
  318. package/surface/kaiAgent.md +4 -3
  319. package/surface/management.md +4 -4
  320. package/surface/queue.md +7 -7
  321. package/surface/storage.md +32 -26
  322. package/dist/ManagementSessionMintError-BMHDcEqV.js.map +0 -1
  323. package/dist/ManagementSessionMintError-Bc9bc7Ai.cjs.map +0 -1
  324. package/dist/apps-BN7fWtSm.js.map +0 -1
  325. package/dist/apps-C1x5IKNQ.cjs.map +0 -1
  326. package/dist/authClient-BM4L8XEN.js.map +0 -1
  327. package/dist/authClient-DspK50e7.cjs.map +0 -1
  328. package/dist/constants-HccvU5kx.js.map +0 -1
  329. package/dist/constants-V9hAyPTo.cjs.map +0 -1
  330. package/dist/developerPortalClient-BcK9F-Fs.cjs.map +0 -1
  331. package/dist/developerPortalClient-CzCJ5sE3.js.map +0 -1
  332. package/dist/index-BGsP2QBc.d.ts +0 -10
  333. package/dist/index-CWowDl63.d.cts +0 -10
  334. package/dist/kaiAgent-D0MoKqXe.js.map +0 -1
  335. package/dist/kaiAgent-De2T6G4G.cjs.map +0 -1
  336. package/dist/management-BlMQnPNS.js.map +0 -1
  337. package/dist/management-dIMrTTpI.cjs.map +0 -1
  338. package/dist/middleware-DxGv7DG8.js.map +0 -1
  339. package/dist/middleware-vIaPDtQI.cjs.map +0 -1
  340. package/dist/storage-BL-TfHp8.cjs.map +0 -1
  341. package/dist/storage-DEJN8sw-.js.map +0 -1
  342. package/dist/store-2OyH1XOP.cjs.map +0 -1
  343. package/dist/store-HP0zRcLz.js.map +0 -1
  344. package/dist/validateConnectionStatus-DV00sDmu.js +0 -34
  345. package/dist/validateConnectionStatus-DV00sDmu.js.map +0 -1
  346. package/dist/validateConnectionStatus-ckaHcRx8.cjs +0 -51
  347. package/dist/validateConnectionStatus-ckaHcRx8.cjs.map +0 -1
package/dist/index.cjs CHANGED
@@ -2,51 +2,51 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("./rolldown-runtime-CmQyd0Gu.cjs");
3
3
  const require_UserError = require("./UserError-D4P9Tbhf.cjs");
4
4
  const require_createFetchClient = require("./createFetchClient-CDKSkd7i.cjs");
5
- const require_validateConnectionStatus = require("./validateConnectionStatus-ckaHcRx8.cjs");
6
- const require_storage = require("./storage-BL-TfHp8.cjs");
7
- const require_ManagementSessionMintError = require("./ManagementSessionMintError-Bc9bc7Ai.cjs");
5
+ const require_validateConnectionStatus = require("./validateConnectionStatus-DpYRsU-e.cjs");
6
+ const require_storage = require("./storage-chxoWtAL.cjs");
7
+ const require_ManagementSessionMintError = require("./ManagementSessionMintError-BCOLLaJi.cjs");
8
8
  const require_RowLevelSecurityError = require("./RowLevelSecurityError-RK_NhhAx.cjs");
9
9
  const require_QueueJobError = require("./QueueJobError-DruZK3tc.cjs");
10
10
  const require_SyncActionError = require("./SyncActionError-mbpVg63X.cjs");
11
11
  const require_ValidationError = require("./ValidationError-BXcFX4nD.cjs");
12
12
  const require_createGenericFetchClient = require("./createGenericFetchClient-BuYzzV_D.cjs");
13
13
  const require_import = require("./import-DHq6q3Fm.cjs");
14
- const require_authClient = require("./authClient-DspK50e7.cjs");
15
14
  const require_collectByOffset = require("./collectByOffset-DgxJ3zT9.cjs");
16
15
  const require_concurrent = require("./concurrent-DnTV_ppY.cjs");
17
16
  const require_dedupe = require("./dedupe-Bf0gl9TJ.cjs");
18
- const require_transientRetries = require("./transientRetries-CBorl4Ue.cjs");
19
- const require_store = require("./store-2OyH1XOP.cjs");
17
+ const require_transientRetries = require("./transientRetries-yVaQgKqP.cjs");
18
+ const require_store = require("./store-7xlVu4qF.cjs");
20
19
  const require_tag = require("./tag-A5z4tJn1.cjs");
21
20
  const require_generateUUID = require("./generateUUID-DbSTmvVP.cjs");
22
21
  const require_isPlainObject = require("./isPlainObject-CcvQt0qB.cjs");
23
22
  const require_schemaGuidedMerge = require("./schemaGuidedMerge-C8CqrNGe.cjs");
24
- const require_management = require("./management-dIMrTTpI.cjs");
25
- const require_serviceIds = require("./serviceIds-Bg1pWiPE.cjs");
23
+ const require_authClient = require("./authClient-C3KG9hXw.cjs");
24
+ const require_middleware = require("./middleware-DYdDD4O6.cjs");
26
25
  const require_kaiMemory = require("./kaiMemory-DZ6hXni_.cjs");
27
26
  const require_semanticLayer = require("./semanticLayer-BVpdWKJn.cjs");
28
27
  const require_sdk_vault_index = require("./sdk/vault/index.cjs");
29
28
  const require_ai_index = require("./ai/index.cjs");
30
- const require_apps = require("./apps-C1x5IKNQ.cjs");
29
+ const require_apps = require("./apps-BA9JRLAZ.cjs");
31
30
  const require_billing_index = require("./billing/index.cjs");
32
31
  const require_chat_index = require("./chat/index.cjs");
33
32
  const require_componentsMcp = require("./componentsMcp-DXu-0Qt-.cjs");
34
33
  const require_dataScience_index = require("./dataScience/index.cjs");
35
34
  const require_editor_index = require("./editor/index.cjs");
36
35
  const require_encryption_index = require("./encryption/index.cjs");
37
- const require_kaiAgent = require("./kaiAgent-De2T6G4G.cjs");
36
+ const require_kaiAgent = require("./kaiAgent-Q00g6S1v.cjs");
38
37
  const require_metastore = require("./metastore-CV4DUDxP.cjs");
39
38
  const require_notifications_index = require("./notifications/index.cjs");
40
39
  const require_oauth = require("./oauth-CEW2AvDV.cjs");
41
40
  const require_omnisearch_index = require("./omnisearch/index.cjs");
42
- const require_queryService = require("./queryService-C3BQ6GKW.cjs");
43
- const require_queue = require("./queue-J2uXzXR9.cjs");
41
+ const require_queryService = require("./queryService-CECWubS0.cjs");
42
+ const require_queue = require("./queue-PmTfoniJ.cjs");
44
43
  const require_scheduler_index = require("./scheduler/index.cjs");
45
44
  const require_stream_index = require("./stream/index.cjs");
46
45
  const require_syncActions = require("./syncActions-B9JTiSao.cjs");
46
+ const require_serviceIds = require("./serviceIds-Bg1pWiPE.cjs");
47
47
  const require_telemetry_index = require("./telemetry/index.cjs");
48
48
  const require_vault_index = require("./vault/index.cjs");
49
- const require_middleware = require("./middleware-vIaPDtQI.cjs");
49
+ const require_management = require("./management-Dqrc516s.cjs");
50
50
  const require_project = require("./project-BQ2oD6IW.cjs");
51
51
  const require_queryService$1 = require("./queryService-B4h1Ez44.cjs");
52
52
  let zod = require("zod");
@@ -61,24 +61,14 @@ const KeboolaErrorType = {
61
61
  NotAuthenticated: "not-authenticated",
62
62
  SignInEnded: "sign-in-ended",
63
63
  AlreadyAuthenticated: "already-authenticated",
64
- NoStorageToken: "no-storage-token",
65
- NoManagementToken: "no-management-token",
66
- MissingProject: "missing-project",
67
- NotBearer: "not-bearer",
68
- NotReady: "not-ready",
69
- InvalidBuildTransition: "invalid-build-transition"
64
+ NotReady: "not-ready"
70
65
  };
71
66
  const MESSAGES = {
72
- [KeboolaErrorType.Unconfigured]: "The session is not configured — set a baseUrl first.",
67
+ [KeboolaErrorType.Unconfigured]: "This stack has not been selected — call session.stack.select(baseUrl) first.",
73
68
  [KeboolaErrorType.NotAuthenticated]: "The session is not authenticated — sign in first.",
74
69
  [KeboolaErrorType.SignInEnded]: "The sign-in this operation started under has ended — its result belongs to nobody.",
75
- [KeboolaErrorType.AlreadyAuthenticated]: "The session is already authenticated — reset before authenticating again.",
76
- [KeboolaErrorType.NoStorageToken]: "No storage token — authenticate the storage realm first.",
77
- [KeboolaErrorType.NoManagementToken]: "No management token — authenticate the management realm first.",
78
- [KeboolaErrorType.MissingProject]: "A bearer storage session requires a project — call setProject(projectId) first.",
79
- [KeboolaErrorType.NotBearer]: "This operation requires a bearer (OAuth) session.",
80
- [KeboolaErrorType.NotReady]: "The client is not ready — authenticate the storage realm first.",
81
- [KeboolaErrorType.InvalidBuildTransition]: "Invalid storage build transition — the build goes idle → initializing → ready | failed."
70
+ [KeboolaErrorType.AlreadyAuthenticated]: "This stack is already signed in — sign out or use auth.replace first.",
71
+ [KeboolaErrorType.NotReady]: "The stack index has not loaded yet."
82
72
  };
83
73
  var KeboolaError = class KeboolaError extends Error {
84
74
  type;
@@ -143,109 +133,6 @@ const coalesce = (task) => {
143
133
  return waiter.promise;
144
134
  };
145
135
  };
146
- // src/utils/store/derivedStore.ts
147
- const isPlainObjectOrArray = (value) => {
148
- if (Array.isArray(value)) return true;
149
- const proto = Object.getPrototypeOf(value);
150
- return proto === Object.prototype || proto === null;
151
- };
152
- const shallowEqual = (a, b) => {
153
- if (Object.is(a, b)) return true;
154
- if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) return false;
155
- if (!isPlainObjectOrArray(a) || !isPlainObjectOrArray(b)) return false;
156
- const aKeys = Object.keys(a);
157
- const bKeys = Object.keys(b);
158
- return aKeys.length === bKeys.length && aKeys.every((key) => Object.is(a[key], b[key]));
159
- };
160
- const createDerivedStore = ({ source, dependsOn, build, keyEquals = shallowEqual }) => {
161
- let key = dependsOn(source.get());
162
- const store = require_store.createStore(build(key));
163
- const unsubscribe = source.subscribe((state) => {
164
- const next = dependsOn(state);
165
- if (keyEquals(key, next)) return;
166
- key = next;
167
- store.set(build(next));
168
- });
169
- const get = store.get;
170
- const subscribe = store.subscribe;
171
- const dispose = () => {
172
- unsubscribe();
173
- store.dispose();
174
- };
175
- return {
176
- get,
177
- subscribe,
178
- dispose
179
- };
180
- };
181
- // src/utils/store/derivedAsyncStore.ts
182
- const createDerivedAsyncStore = ({ source, dependsOn, build, keyEquals = shallowEqual }) => {
183
- const store = require_store.createStore({ state: "idle" });
184
- let currentKey = null;
185
- let generation = 0;
186
- let controller = null;
187
- const run = (key) => {
188
- controller?.abort();
189
- controller = new AbortController();
190
- const runGeneration = ++generation;
191
- store.set({ state: "pending" });
192
- build(key, controller.signal).then((value) => {
193
- if (runGeneration === generation) store.set({
194
- state: "ready",
195
- value
196
- });
197
- }, (error) => {
198
- if (runGeneration === generation) store.set({
199
- state: "errored",
200
- error
201
- });
202
- });
203
- };
204
- const sync = (state) => {
205
- const next = dependsOn(state);
206
- if (next === null) {
207
- if (currentKey === null) return;
208
- controller?.abort();
209
- controller = null;
210
- generation += 1;
211
- currentKey = null;
212
- store.set({ state: "idle" });
213
- return;
214
- }
215
- if (currentKey !== null && keyEquals(currentKey, next)) return;
216
- currentKey = next;
217
- run(next);
218
- };
219
- sync(source.get());
220
- const unsubscribe = source.subscribe(sync);
221
- const get = store.get;
222
- const subscribe = store.subscribe;
223
- const dispose = () => {
224
- controller?.abort();
225
- unsubscribe();
226
- store.dispose();
227
- };
228
- const readable = {
229
- get,
230
- subscribe,
231
- dispose
232
- };
233
- const settled = () => new Promise((resolve) => {
234
- let unsubscribeSettled = () => {};
235
- const check = (state) => {
236
- if (state.state === "ready" || state.state === "errored") {
237
- unsubscribeSettled();
238
- resolve(state);
239
- }
240
- };
241
- unsubscribeSettled = store.subscribe(check);
242
- check(store.get());
243
- });
244
- return {
245
- store: readable,
246
- settled
247
- };
248
- };
249
136
  // src/utils/async/poll/registry.ts
250
137
  const DEFAULT_LIMIT = 50;
251
138
  const isFinished = ({ snapshot }) => snapshot.state !== "idle" && snapshot.state !== "requesting" && snapshot.state !== "polling";
@@ -457,721 +344,175 @@ const createPersistor = ({ storage = createNullStorage(), key, schema, defaultVa
457
344
  locked
458
345
  };
459
346
  };
460
- // src/serviceClientRegistry/utils.ts
461
- const isBuiltInProperty = (property) => typeof property === "symbol" || property === "then" || property === "constructor" || property === "toString" || property === "valueOf";
462
- /**
463
- * Creates a dummy client that intercepts method calls and invokes the provided onCall callback.
464
- */
465
- const createDummyClient = ({ onCall }) => {
466
- const createProxy = (path = []) => new Proxy(() => {}, {
467
- get: (_target, prop) => {
468
- if (isBuiltInProperty(prop)) return void 0;
469
- return createProxy([...path, prop]);
470
- },
471
- apply: (_target, _thisArgs, args) => onCall(path, args)
472
- });
473
- return createProxy();
474
- };
475
- // src/serviceClientRegistry/createServiceClientRegistry.ts
476
- const createServiceClientRegistry = () => ({ getServiceBaseUrl, onUnavailable }) => {
477
- const dummy = (serviceId, clientName) => createDummyClient({ onCall: (path, args) => {
478
- onUnavailable?.({
479
- serviceId,
480
- path,
481
- args,
482
- clientName
483
- });
484
- } });
485
- const configs = [];
486
- const resolveClient = ({ serviceId, clientFn, clientName }) => {
487
- const serviceBaseUrl = getServiceBaseUrl(serviceId);
488
- return serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);
489
- };
490
- const registry = {
491
- add: (config) => {
492
- configs.push(config);
493
- return registry;
494
- },
495
- build: () => {
496
- const clientMap = {};
497
- const clientMeta = [];
498
- configs.forEach((config) => {
499
- clientMap[config.clientName] = resolveClient(config);
500
- clientMeta.push({
501
- clientName: config.clientName,
502
- serviceId: config.serviceId,
503
- isAvailable: !!getServiceBaseUrl(config.serviceId)
504
- });
505
- });
506
- return {
507
- client: clientMap,
508
- meta: clientMeta
509
- };
510
- }
511
- };
512
- return registry;
513
- };
514
- // src/keboola/createApi.ts
515
- const createApi = (state) => new Proxy({}, { get(_target, property) {
516
- if (isBuiltInProperty(property)) return void 0;
517
- if (property === "auth") {
518
- const authClient = state.getAuthClient();
519
- assert$1(authClient, KeboolaErrorType.Unconfigured);
520
- return authClient;
521
- }
522
- if (property === "management") {
523
- const management = state.getManagementClient();
524
- assert$1(management, KeboolaErrorType.NoManagementToken);
525
- return management;
526
- }
527
- const clients = state.getProjectClients();
528
- assert$1(clients, KeboolaErrorType.NotReady);
529
- return clients[property];
530
- } });
531
347
  // src/keboola/createMiddlewareFor.ts
532
348
  const createMiddlewareFor = (middlewares) => {
533
349
  return (target, baseline = []) => {
534
350
  if (Array.isArray(middlewares)) return [...baseline, ...middlewares];
535
- const all = middlewares?.all ?? [];
536
- const targeted = middlewares?.[target] ?? [];
537
- return [
538
- ...baseline,
539
- ...all,
540
- ...targeted
541
- ];
351
+ return [...baseline, ...middlewares?.[target] ?? []];
542
352
  };
543
353
  };
544
- // src/keboola/legacy/createConfig.ts
545
- const createConfig = () => {
546
- const store = require_store.createStore({
547
- baseUrl: null,
548
- sapiToken: null,
549
- managementToken: null
550
- });
551
- const setBaseUrl = (baseUrl) => {
552
- store.set({
553
- ...store.get(),
554
- baseUrl
354
+ // src/keboola/state/auth.ts
355
+ const grantOf = (credential) => credential.type === "token" ? {
356
+ type: "token",
357
+ refreshToken: credential.refreshToken
358
+ } : {
359
+ type: "cookie",
360
+ sessionId: credential.sessionId
361
+ };
362
+ const stamped = (input) => ({
363
+ ...input,
364
+ issuedAt: Date.now()
365
+ });
366
+ const credentialOf = (auth) => auth.status === "authenticated" ? require_transientRetries.Result.success(auth.credential) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.NotAuthenticated));
367
+ /**
368
+ * The stack's credential and its sign-in pin.
369
+ *
370
+ * - `epoch` moves on `authenticate` and `signOut` and never on a rotation, so it is exactly "which
371
+ * sign-in is this" — what an in-flight exchange compares itself against.
372
+ */
373
+ const createAuth = (stacks) => {
374
+ const expired = /* @__PURE__ */ new Set();
375
+ const requireCredential = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => credentialOf(stack.auth));
376
+ const requireUnauthenticated = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "authenticated" ? require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.AlreadyAuthenticated)) : require_transientRetries.Result.success(stack));
377
+ const requireAnonymous = (baseUrl) => require_transientRetries.Result.andThen(requireUnauthenticated(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is already being restored`)) : require_transientRetries.Result.success(stack));
378
+ const requireRestoring = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is not being restored`)));
379
+ const startRestore = (baseUrl) => require_transientRetries.Result.map(requireAnonymous(baseUrl), (stack) => stacks.set({
380
+ ...stack,
381
+ auth: { status: "restoring" }
382
+ }));
383
+ const cancelRestore = (baseUrl) => require_transientRetries.Result.map(requireRestoring(baseUrl), (stack) => stacks.set({
384
+ ...stack,
385
+ auth: { status: "anonymous" }
386
+ }));
387
+ const authenticate = (baseUrl, input) => require_transientRetries.Result.map(requireUnauthenticated(baseUrl), (stack) => {
388
+ expired.delete(baseUrl);
389
+ return stacks.set({
390
+ ...stack,
391
+ epoch: stack.epoch + 1,
392
+ auth: {
393
+ status: "authenticated",
394
+ credential: stamped(input)
395
+ },
396
+ retained: null
555
397
  });
556
- };
557
- const authenticate = (tokens) => {
558
- const current = store.get();
559
- store.set({
560
- ...current,
561
- sapiToken: tokens.sapiToken ?? current.sapiToken,
562
- managementToken: tokens.managementToken ?? current.managementToken
398
+ });
399
+ const applyRefresh = (baseUrl, input) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => credential.type !== input.type ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`A ${credential.type} grant cannot become ${input.type}`)) : require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
400
+ ...stack,
401
+ auth: {
402
+ status: "authenticated",
403
+ credential: stamped(input)
404
+ }
405
+ })));
406
+ const forceExpire = (baseUrl) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
407
+ ...stack,
408
+ auth: {
409
+ status: "authenticated",
410
+ credential: {
411
+ ...credential,
412
+ issuedAt: Date.now() - credential.expiresIn * 1e3
413
+ }
414
+ }
415
+ })));
416
+ const signOut = (baseUrl, { retain = false } = {}) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => {
417
+ const retained = retain ? require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(credentialOf(stack.auth), (credential) => ({ grant: grantOf(credential) })), stack.retained) : null;
418
+ return stacks.set({
419
+ ...stack,
420
+ epoch: stack.epoch + 1,
421
+ auth: { status: "anonymous" },
422
+ retained
563
423
  });
564
- };
565
- const getStorageToken = () => store.get().sapiToken ?? "";
566
- const setStorageToken = (sapiToken) => store.set({
567
- ...store.get(),
568
- sapiToken
569
424
  });
570
- /** Current state, for diagnostics. */
571
- const debug = () => store.get();
425
+ const retain = (baseUrl, retained) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
426
+ ...stack,
427
+ retained
428
+ }));
429
+ const dropRetained = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
430
+ ...stack,
431
+ retained: null
432
+ }));
433
+ const requireRetained = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.retained ? require_transientRetries.Result.success(stack.retained) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" retains no credential`)));
434
+ const notifyExpired = (baseUrl) => {
435
+ if (expired.has(baseUrl)) return false;
436
+ expired.add(baseUrl);
437
+ return true;
438
+ };
439
+ const getEpoch = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stack.epoch);
440
+ const getAccessToken = (baseUrl) => require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(requireCredential(baseUrl), ({ accessToken }) => accessToken), null);
572
441
  return {
573
- store,
574
- setBaseUrl,
442
+ startRestore,
443
+ cancelRestore,
575
444
  authenticate,
576
- getStorageToken,
577
- setStorageToken,
578
- debug
445
+ applyRefresh,
446
+ forceExpire,
447
+ signOut,
448
+ retain,
449
+ dropRetained,
450
+ requireRetained,
451
+ notifyExpired,
452
+ requireCredential,
453
+ getEpoch,
454
+ getAccessToken
579
455
  };
580
456
  };
581
- // src/domain/stack.ts
582
- const isServiceId = (id) => Object.values(require_serviceIds.ServiceId).includes(id);
583
- const SERVICE_URL_OVERRIDES = { "kai-assistant": (url) => `${url}/api` };
584
- const createStack = ({ stackInfo, clientServiceUrls }) => {
585
- const { services, components, features, ...infoRest } = stackInfo;
586
- const serviceMap = new Map(services.map((service) => {
587
- if (!isServiceId(service.id)) return [service.id, service.url];
588
- const devOverride = clientServiceUrls?.[service.id]?.(service.url);
589
- const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
590
- const url = devOverride ?? prodOverride ?? service.url;
591
- return [service.id, url];
592
- }));
593
- const componentMap = new Map(components.map((component) => [component.id, component]));
594
- const featureSet = new Set(features);
595
- const hasFeature = (...feature) => {
596
- if (feature.length === 0) return false;
597
- return feature.every((x) => featureSet.has(x));
457
+ // src/keboola/state/stacks.ts
458
+ const newStack = (baseUrl) => ({
459
+ baseUrl,
460
+ context: "idle",
461
+ epoch: 0,
462
+ auth: { status: "anonymous" },
463
+ retained: null
464
+ });
465
+ /** One entry per stack, and the verbs that open and select them. */
466
+ const createStacks = (store) => {
467
+ const get = (baseUrl) => {
468
+ const stack = store.get().stacks[baseUrl];
469
+ return stack ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.Unconfigured));
598
470
  };
599
- const hasComponent = (...componentId) => {
600
- if (componentId.length === 0) return false;
601
- return componentId.every((x) => componentMap.has(x));
471
+ const set = (stack) => {
472
+ const state = store.get();
473
+ store.set({
474
+ ...state,
475
+ stacks: {
476
+ ...state.stacks,
477
+ [stack.baseUrl]: stack
478
+ }
479
+ });
480
+ return stack;
602
481
  };
603
- const getComponent = (componentId) => componentMap.get(componentId) ?? null;
604
- const hasService = (serviceId) => serviceMap.has(serviceId);
605
- const getServiceUrl = (serviceId) => serviceMap.get(serviceId) ?? null;
482
+ const ensure = (baseUrl) => {
483
+ const existing = get(baseUrl);
484
+ if (existing.success) return existing.data;
485
+ return set(newStack(baseUrl));
486
+ };
487
+ const getActive = () => {
488
+ const { active } = store.get();
489
+ const stack = get(active);
490
+ if (!stack.success) throw new Error(`The active stack has no row: ${active}`);
491
+ return stack.data;
492
+ };
493
+ const select = (baseUrl) => {
494
+ const stack = ensure(baseUrl);
495
+ const state = store.get();
496
+ if (state.active !== baseUrl) store.set({
497
+ ...state,
498
+ active: baseUrl
499
+ });
500
+ return stack;
501
+ };
502
+ const updateContext = (baseUrl, context) => require_transientRetries.Result.map(get(baseUrl), (stack) => set({
503
+ ...stack,
504
+ context
505
+ }));
606
506
  return {
607
- ...infoRest,
608
- services,
609
- features,
610
- components,
611
- hasFeature,
612
- getServiceUrl,
613
- hasService,
614
- getComponent,
615
- hasComponent
507
+ get,
508
+ set,
509
+ ensure,
510
+ getActive,
511
+ select,
512
+ updateContext
616
513
  };
617
514
  };
618
- // src/sdks/variables/variablesSdk.ts
619
- const VARIABLES_COMPONENT_ID = "keboola.variables";
620
- /** Union the definitions by name; on a name conflict the target's definition is kept. */
621
- const mergeVariableDefinitions = (target, source) => {
622
- const targetNames = new Set(target.map((definition) => definition.name));
623
- return [...target, ...source.filter((definition) => !targetNames.has(definition.name))];
624
- };
625
- /** Add values missing in the target; on a name conflict the value is updated to the source's. */
626
- const mergeVariableValues = (target, source) => {
627
- const sourceByName = new Map(source.map((value) => [value.name, value.value]));
628
- const targetNames = new Set(target.map((value) => value.name));
629
- return [...target.map((value) => sourceByName.has(value.name) ? {
630
- ...value,
631
- value: sourceByName.get(value.name)
632
- } : value), ...source.filter((value) => !targetNames.has(value.name))];
633
- };
634
- /**
635
- * Orchestration for `keboola.variables` configs: copy a config, or merge two configs into a fresh
636
- * one (union definitions, upsert values — source wins on a name conflict). Each result is a brand
637
- * new config + values row, so the caller can reference it without sharing lineage with the source.
638
- */
639
- const createVariablesSdk = ({ storageClient }) => {
640
- const configs = storageClient.configurations;
641
- const rows = storageClient.configurationRows;
642
- const readVariables = async (configId, valuesRowId, branchId) => {
643
- const config = await configs.getConfiguration({
644
- componentId: VARIABLES_COMPONENT_ID,
645
- configId,
646
- branchId
647
- });
648
- const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];
649
- const rawDefinitions = config.configuration?.variables;
650
- const rawValues = row?.configuration?.values;
651
- return {
652
- definitions: Array.isArray(rawDefinitions) ? rawDefinitions : [],
653
- values: Array.isArray(rawValues) ? rawValues : []
654
- };
655
- };
656
- const createVariables = async (definitions, values, branchId) => {
657
- const config = await configs.createConfiguration({
658
- branchId,
659
- componentId: VARIABLES_COMPONENT_ID,
660
- name: "Variables definition",
661
- configuration: { variables: definitions }
662
- });
663
- try {
664
- const row = await rows.createConfigurationRow({
665
- branchId: String(branchId),
666
- componentId: VARIABLES_COMPONENT_ID,
667
- configurationId: config.id,
668
- name: "Default values",
669
- configuration: { values }
670
- });
671
- return {
672
- variablesId: config.id,
673
- variablesValuesId: row.id
674
- };
675
- } catch (error) {
676
- await configs.deleteConfiguration({
677
- branchId,
678
- componentId: VARIABLES_COMPONENT_ID,
679
- configId: config.id
680
- }).catch((cleanupError) => {
681
- if (error instanceof Error && error.cause === void 0) error.cause = cleanupError;
682
- });
683
- throw error;
684
- }
685
- };
686
- return {
687
- /** Copy a variables config into a fresh, independent config + values row. */
688
- copy: async ({ variablesId, variablesValuesId, branchId = "default" }) => {
689
- const { definitions, values } = await readVariables(variablesId, variablesValuesId, branchId);
690
- return createVariables(definitions, values, branchId);
691
- },
692
- /** Merge the source's variables into the target's and create a fresh merged config + values row. */
693
- merge: async ({ targetVariablesId, targetValuesId, sourceVariablesId, sourceValuesId, branchId = "default" }) => {
694
- const [target, source] = await Promise.all([readVariables(targetVariablesId, targetValuesId, branchId), readVariables(sourceVariablesId, sourceValuesId, branchId)]);
695
- return createVariables(mergeVariableDefinitions(target.definitions, source.definitions), mergeVariableValues(target.values, source.values), branchId);
696
- }
697
- };
698
- };
699
- // src/keboola/createSdk.ts
700
- const createSdk = ({ storage, services }) => ({
701
- tag: require_tag.createTagSdk({ metastoreClient: services.metastore }),
702
- semanticLayer: require_semanticLayer.createSemanticLayerSdk({ metastoreClient: services.metastore }),
703
- kaiMemory: require_kaiMemory.createKaiMemorySdk({ metastoreClient: services.metastore }),
704
- vault: require_sdk_vault_index.createVaultSdk({
705
- vaultClient: services.vault,
706
- encryptionClient: services.encryption
707
- }),
708
- variables: createVariablesSdk({ storageClient: storage })
709
- });
710
- // src/keboola/createServiceClients.ts
711
- const withPath = (serviceBaseUrl, path) => typeof serviceBaseUrl === "string" ? `${serviceBaseUrl}${path}` : async () => `${await serviceBaseUrl()}${path}`;
712
- const createServiceClients = ({ baseUrl, auth, getServiceBaseUrl, middlewareFor, attachTokenMiddleware }) => createServiceClientRegistry()({
713
- getServiceBaseUrl,
714
- onUnavailable: ({ serviceId, path, clientName }) => {
715
- throw new require_storage.ServiceUnavailableError(serviceId, path, clientName);
716
- }
717
- }).add({
718
- serviceId: "vault",
719
- clientName: "vault",
720
- clientFn: (serviceBaseUrl) => require_vault_index.createVaultClient({
721
- baseUrl: serviceBaseUrl,
722
- middlewares: middlewareFor("vault", [attachTokenMiddleware]),
723
- auth
724
- })
725
- }).add({
726
- serviceId: "data-science",
727
- clientName: "dataScience",
728
- clientFn: (serviceBaseUrl) => require_dataScience_index.createDataScienceClient({
729
- baseUrl: serviceBaseUrl,
730
- middlewares: middlewareFor("dataScience", [attachTokenMiddleware]),
731
- auth
732
- })
733
- }).add({
734
- serviceId: "data-science",
735
- clientName: "apps",
736
- clientFn: (serviceBaseUrl) => require_apps.createAppsClient({
737
- baseUrl: withPath(serviceBaseUrl, "/v2"),
738
- middlewares: middlewareFor("apps", [attachTokenMiddleware]),
739
- auth
740
- })
741
- }).add({
742
- serviceId: "encryption",
743
- clientName: "encryption",
744
- clientFn: (serviceBaseUrl) => require_encryption_index.createEncryptionClient({
745
- baseUrl: serviceBaseUrl,
746
- middlewares: middlewareFor("encryption")
747
- })
748
- }).add({
749
- serviceId: "editor",
750
- clientName: "editor",
751
- clientFn: (serviceBaseUrl) => require_editor_index.createEditorClient({
752
- baseUrl: serviceBaseUrl,
753
- middlewares: middlewareFor("editor", [attachTokenMiddleware]),
754
- auth
755
- })
756
- }).add({
757
- serviceId: "sync-actions",
758
- clientName: "syncActions",
759
- clientFn: (serviceBaseUrl) => require_syncActions.createSyncActionsClient({
760
- baseUrl: serviceBaseUrl,
761
- middlewares: middlewareFor("syncActions", [attachTokenMiddleware]),
762
- auth
763
- })
764
- }).add({
765
- serviceId: "telemetry",
766
- clientName: "telemetry",
767
- clientFn: (serviceBaseUrl) => require_telemetry_index.createTelemetryClient({
768
- baseUrl: serviceBaseUrl,
769
- middlewares: middlewareFor("telemetry", [attachTokenMiddleware]),
770
- auth
771
- })
772
- }).add({
773
- serviceId: "query",
774
- clientName: "queryService",
775
- clientFn: (serviceBaseUrl) => require_queryService.createQueryServiceClient({
776
- baseUrl: serviceBaseUrl,
777
- middlewares: middlewareFor("queryService", [attachTokenMiddleware]),
778
- auth
779
- })
780
- }).add({
781
- serviceId: "queue",
782
- clientName: "queue",
783
- clientFn: (serviceBaseUrl) => require_queue.createQueueClient({
784
- baseUrl: serviceBaseUrl,
785
- middlewares: middlewareFor("queue", [attachTokenMiddleware]),
786
- auth
787
- })
788
- }).add({
789
- serviceId: "kai-assistant",
790
- clientName: "chat",
791
- clientFn: (serviceBaseUrl) => require_chat_index.createChatClient({
792
- storageApiUrl: baseUrl,
793
- baseUrl: serviceBaseUrl,
794
- middlewares: middlewareFor("chat", [attachTokenMiddleware]),
795
- auth
796
- })
797
- }).add({
798
- serviceId: "ai",
799
- clientName: "ai",
800
- clientFn: (serviceBaseUrl) => require_ai_index.createAiClient({
801
- baseUrl: serviceBaseUrl,
802
- middlewares: middlewareFor("ai", [attachTokenMiddleware]),
803
- auth
804
- })
805
- }).add({
806
- serviceId: "ai",
807
- clientName: "omnisearch",
808
- clientFn: (serviceBaseUrl) => require_omnisearch_index.createOmnisearchClient({
809
- baseUrl: withPath(serviceBaseUrl, "/omnisearch"),
810
- middlewares: middlewareFor("omnisearch", [attachTokenMiddleware]),
811
- auth
812
- })
813
- }).add({
814
- serviceId: "import",
815
- clientName: "import",
816
- clientFn: (serviceBaseUrl) => require_import.createImportClient({
817
- baseUrl: serviceBaseUrl,
818
- middlewares: middlewareFor("import", [attachTokenMiddleware]),
819
- auth
820
- })
821
- }).add({
822
- serviceId: "kai-agent",
823
- clientName: "kaiAgent",
824
- clientFn: (serviceBaseUrl) => require_kaiAgent.createKaiAgentClient({
825
- baseUrl: serviceBaseUrl,
826
- middlewares: middlewareFor("kaiAgent", [attachTokenMiddleware]),
827
- auth
828
- })
829
- }).add({
830
- serviceId: "components-mcp",
831
- clientName: "componentsMcp",
832
- clientFn: (serviceBaseUrl) => require_componentsMcp.createComponentsMcpClient({
833
- baseUrl: serviceBaseUrl,
834
- middlewares: middlewareFor("componentsMcp", [attachTokenMiddleware]),
835
- auth
836
- })
837
- }).add({
838
- serviceId: "oauth",
839
- clientName: "oauth",
840
- clientFn: (serviceBaseUrl) => require_oauth.createOauthClient({
841
- baseUrl: serviceBaseUrl,
842
- middlewares: middlewareFor("oauth", [attachTokenMiddleware]),
843
- auth
844
- })
845
- }).add({
846
- serviceId: "scheduler",
847
- clientName: "scheduler",
848
- clientFn: (serviceBaseUrl) => require_scheduler_index.createSchedulerClient({
849
- baseUrl: serviceBaseUrl,
850
- middlewares: middlewareFor("scheduler", [attachTokenMiddleware]),
851
- auth
852
- })
853
- }).add({
854
- serviceId: "stream",
855
- clientName: "stream",
856
- clientFn: (serviceBaseUrl) => require_stream_index.createStreamClient({
857
- baseUrl: serviceBaseUrl,
858
- middlewares: middlewareFor("stream", [attachTokenMiddleware]),
859
- auth
860
- })
861
- }).add({
862
- serviceId: "notification",
863
- clientName: "notifications",
864
- clientFn: (serviceBaseUrl) => require_notifications_index.createNotificationsClient({
865
- baseUrl: serviceBaseUrl,
866
- middlewares: middlewareFor("notifications", [attachTokenMiddleware]),
867
- auth
868
- })
869
- }).add({
870
- serviceId: "billing",
871
- clientName: "billing",
872
- clientFn: (serviceBaseUrl) => require_billing_index.createBillingClient({
873
- baseUrl: serviceBaseUrl,
874
- middlewares: middlewareFor("billing", [attachTokenMiddleware]),
875
- auth
876
- })
877
- }).add({
878
- serviceId: "metastore",
879
- clientName: "metastore",
880
- clientFn: (serviceBaseUrl) => require_metastore.createMetastoreClient({
881
- baseUrl: serviceBaseUrl,
882
- middlewares: middlewareFor("metastore", [attachTokenMiddleware]),
883
- auth
884
- })
885
- }).build();
886
- // src/keboola/legacy/createProjectClients.ts
887
- const createAttachStorageToken = (getToken) => (next) => (request) => {
888
- request.request.headers.set(require_createFetchClient.KeboolaHttpHeader.STORAGE_API_TOKEN, getToken());
889
- return next(request);
890
- };
891
- const createProjectClients = async ({ baseUrl, getStorageToken, onStorageTokenRefreshed, middlewareFor, clientServiceUrls }) => {
892
- const auth = {
893
- type: "sapi-token",
894
- token: getStorageToken()
895
- };
896
- const attach = createAttachStorageToken(getStorageToken);
897
- const stackInfo = await require_storage.createStorageClient({
898
- baseUrl,
899
- auth,
900
- middlewares: [attach]
901
- }).getStackInfo({ exclude: "componentDetails" });
902
- const stack = createStack({
903
- stackInfo,
904
- clientServiceUrls
905
- });
906
- const storage = require_storage.createStorageClient({
907
- baseUrl,
908
- auth,
909
- middlewares: middlewareFor("storage", []),
910
- onRefreshToken: onStorageTokenRefreshed
911
- });
912
- const { client: services, meta: serviceMeta } = createServiceClients({
913
- baseUrl,
914
- auth,
915
- getServiceBaseUrl: stack.getServiceUrl,
916
- middlewareFor,
917
- attachTokenMiddleware: attach
918
- });
919
- return {
920
- baseUrl: require_createFetchClient.normalizeBaseUrl(baseUrl),
921
- stack,
922
- serviceMeta,
923
- storage,
924
- ...services,
925
- sdk: createSdk({
926
- storage,
927
- services
928
- })
929
- };
930
- };
931
- // src/keboola/legacy/keboola.ts
932
- const createLegacyKeboola = (options = {}) => {
933
- const config = createConfig();
934
- const middlewareFor = createMiddlewareFor(options.middlewares);
935
- const authClient = createDerivedStore({
936
- source: config.store,
937
- dependsOn: (state) => state.baseUrl,
938
- build: (baseUrl) => baseUrl ? require_authClient.createAuthClient({
939
- baseUrl,
940
- middlewares: middlewareFor("auth", [])
941
- }) : null
942
- });
943
- const management = createDerivedStore({
944
- source: config.store,
945
- dependsOn: (state) => ({
946
- baseUrl: state.baseUrl,
947
- token: state.managementToken
948
- }),
949
- build: ({ baseUrl, token }) => baseUrl ? require_management.createManagementClient({
950
- baseUrl,
951
- auth: token ? {
952
- type: "management-token",
953
- token
954
- } : { type: "management-token" },
955
- middlewares: middlewareFor("management", [])
956
- }) : null
957
- });
958
- const build = createDerivedAsyncStore({
959
- source: config.store,
960
- dependsOn: (state) => state.sapiToken && state.baseUrl ? state.baseUrl : null,
961
- build: (baseUrl) => createProjectClients({
962
- baseUrl,
963
- getStorageToken: config.getStorageToken,
964
- onStorageTokenRefreshed: config.setStorageToken,
965
- middlewareFor,
966
- clientServiceUrls: options.clientServiceUrls
967
- })
968
- });
969
- if (options.baseUrl) config.setBaseUrl(options.baseUrl);
970
- const debug = () => {
971
- const info = config.debug();
972
- return {
973
- type: "Sapi",
974
- config: info,
975
- authReady: authClient.get() !== null,
976
- managementReady: !!info.managementToken,
977
- storage: build.store.get().state
978
- };
979
- };
980
- const session = {
981
- setBaseUrl: config.setBaseUrl,
982
- isStorageReady: () => build.store.get().state === "ready",
983
- authenticateStorage: (sapiToken) => config.authenticate({ sapiToken }),
984
- authenticateStorageAsync: async (sapiToken) => {
985
- config.authenticate({ sapiToken });
986
- await build.settled();
987
- },
988
- authenticateManagement: (managementToken) => config.authenticate({ managementToken }),
989
- subscribe: (listener) => {
990
- const unsubscribeConfig = config.store.subscribe(() => listener(debug()));
991
- const unsubscribeBuild = build.store.subscribe(() => listener(debug()));
992
- return () => {
993
- unsubscribeConfig();
994
- unsubscribeBuild();
995
- };
996
- },
997
- debug
998
- };
999
- return {
1000
- api: createApi({
1001
- getAuthClient: () => authClient.get(),
1002
- getManagementClient: () => management.get(),
1003
- getProjectClients: () => {
1004
- const state = build.store.get();
1005
- return state.state === "ready" ? state.value : null;
1006
- }
1007
- }),
1008
- session
1009
- };
1010
- };
1011
- // src/keboola/bearer/state/auth.ts
1012
- const grantOf = (credential) => credential.type === "token" ? {
1013
- type: "token",
1014
- refreshToken: credential.refreshToken
1015
- } : {
1016
- type: "cookie",
1017
- sessionId: credential.sessionId
1018
- };
1019
- const stamped = (input) => ({
1020
- ...input,
1021
- issuedAt: Date.now()
1022
- });
1023
- const credentialOf = (auth) => auth.status === "authenticated" ? require_transientRetries.Result.success(auth.credential) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.NotAuthenticated));
1024
- /**
1025
- * The stack's credential and its sign-in pin.
1026
- *
1027
- * - `epoch` moves on `authenticate` and `signOut` and never on a rotation, so it is exactly "which
1028
- * sign-in is this" — what an in-flight exchange compares itself against.
1029
- */
1030
- const createAuth = (stacks) => {
1031
- const expired = /* @__PURE__ */ new Set();
1032
- const requireCredential = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => credentialOf(stack.auth));
1033
- const requireUnauthenticated = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "authenticated" ? require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.AlreadyAuthenticated)) : require_transientRetries.Result.success(stack));
1034
- const requireAnonymous = (baseUrl) => require_transientRetries.Result.andThen(requireUnauthenticated(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is already being restored`)) : require_transientRetries.Result.success(stack));
1035
- const requireRestoring = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is not being restored`)));
1036
- const startRestore = (baseUrl) => require_transientRetries.Result.map(requireAnonymous(baseUrl), (stack) => stacks.set({
1037
- ...stack,
1038
- auth: { status: "restoring" }
1039
- }));
1040
- const cancelRestore = (baseUrl) => require_transientRetries.Result.map(requireRestoring(baseUrl), (stack) => stacks.set({
1041
- ...stack,
1042
- auth: { status: "anonymous" }
1043
- }));
1044
- const authenticate = (baseUrl, input) => require_transientRetries.Result.map(requireUnauthenticated(baseUrl), (stack) => {
1045
- expired.delete(baseUrl);
1046
- return stacks.set({
1047
- ...stack,
1048
- epoch: stack.epoch + 1,
1049
- auth: {
1050
- status: "authenticated",
1051
- credential: stamped(input)
1052
- },
1053
- retained: null
1054
- });
1055
- });
1056
- const applyRefresh = (baseUrl, input) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => credential.type !== input.type ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`A ${credential.type} grant cannot become ${input.type}`)) : require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
1057
- ...stack,
1058
- auth: {
1059
- status: "authenticated",
1060
- credential: stamped(input)
1061
- }
1062
- })));
1063
- const forceExpire = (baseUrl) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
1064
- ...stack,
1065
- auth: {
1066
- status: "authenticated",
1067
- credential: {
1068
- ...credential,
1069
- issuedAt: Date.now() - credential.expiresIn * 1e3
1070
- }
1071
- }
1072
- })));
1073
- const signOut = (baseUrl, { retain = false } = {}) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => {
1074
- const retained = retain ? require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(credentialOf(stack.auth), (credential) => ({ grant: grantOf(credential) })), stack.retained) : null;
1075
- return stacks.set({
1076
- ...stack,
1077
- epoch: stack.epoch + 1,
1078
- auth: { status: "anonymous" },
1079
- retained
1080
- });
1081
- });
1082
- const retain = (baseUrl, retained) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
1083
- ...stack,
1084
- retained
1085
- }));
1086
- const dropRetained = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
1087
- ...stack,
1088
- retained: null
1089
- }));
1090
- const requireRetained = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.retained ? require_transientRetries.Result.success(stack.retained) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" retains no credential`)));
1091
- const notifyExpired = (baseUrl) => {
1092
- if (expired.has(baseUrl)) return false;
1093
- expired.add(baseUrl);
1094
- return true;
1095
- };
1096
- const getEpoch = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stack.epoch);
1097
- const getAccessToken = (baseUrl) => require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(requireCredential(baseUrl), ({ accessToken }) => accessToken), null);
1098
- return {
1099
- startRestore,
1100
- cancelRestore,
1101
- authenticate,
1102
- applyRefresh,
1103
- forceExpire,
1104
- signOut,
1105
- retain,
1106
- dropRetained,
1107
- requireRetained,
1108
- notifyExpired,
1109
- requireCredential,
1110
- getEpoch,
1111
- getAccessToken
1112
- };
1113
- };
1114
- // src/keboola/bearer/state/stacks.ts
1115
- const newStack = (baseUrl) => ({
1116
- baseUrl,
1117
- context: "idle",
1118
- epoch: 0,
1119
- auth: { status: "anonymous" },
1120
- retained: null
1121
- });
1122
- /** One entry per stack, and the verbs that open and select them. */
1123
- const createStacks = (store) => {
1124
- const get = (baseUrl) => {
1125
- const stack = store.get().stacks[baseUrl];
1126
- return stack ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.Unconfigured));
1127
- };
1128
- const set = (stack) => {
1129
- const state = store.get();
1130
- store.set({
1131
- ...state,
1132
- stacks: {
1133
- ...state.stacks,
1134
- [stack.baseUrl]: stack
1135
- }
1136
- });
1137
- return stack;
1138
- };
1139
- const update = (baseUrl, updater) => require_transientRetries.Result.map(get(baseUrl), (stack) => set(updater(stack)));
1140
- const ensure = (baseUrl) => {
1141
- const existing = get(baseUrl);
1142
- if (existing.success) return existing.data;
1143
- return set(newStack(baseUrl));
1144
- };
1145
- const getActive = () => {
1146
- const { active } = store.get();
1147
- const stack = get(active);
1148
- if (!stack.success) throw new Error(`The active stack has no row: ${active}`);
1149
- return stack.data;
1150
- };
1151
- const select = (baseUrl) => {
1152
- const stack = ensure(baseUrl);
1153
- const state = store.get();
1154
- if (state.active !== baseUrl) store.set({
1155
- ...state,
1156
- active: baseUrl
1157
- });
1158
- return stack;
1159
- };
1160
- const updateContext = (baseUrl, context) => update(baseUrl, (stack) => ({
1161
- ...stack,
1162
- context
1163
- }));
1164
- return {
1165
- get,
1166
- set,
1167
- update,
1168
- ensure,
1169
- getActive,
1170
- select,
1171
- updateContext
1172
- };
1173
- };
1174
- // src/keboola/bearer/state/state.ts
515
+ // src/keboola/state/state.ts
1175
516
  /**
1176
517
  * The stack table and the rules over it, one namespace per concern.
1177
518
  *
@@ -1190,8 +531,9 @@ const createState = (defaultBaseUrl) => {
1190
531
  auth
1191
532
  };
1192
533
  };
1193
- // src/keboola/bearer/credentials/credentials.ts
534
+ // src/keboola/credentials/credentials.ts
1194
535
  const DEFAULT_REFRESH_THRESHOLD = .9;
536
+ const END_SESSION_TIMEOUT_MS = 1e4;
1195
537
  const signInEnded = () => new KeboolaError(KeboolaErrorType.SignInEnded);
1196
538
  const toRestoreStatus = (outcome) => {
1197
539
  if (outcome === void 0 || outcome === "skipped") return "empty";
@@ -1232,13 +574,18 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
1232
574
  const refreshed = await require_transientRetries.Result.tryCatchAsync(() => renew(client, grant));
1233
575
  return isSameSignIn() ? refreshed : require_transientRetries.Result.failure(signInEnded());
1234
576
  };
577
+ /**
578
+ * The grant to rotate, or the sign-out another tab stored.
579
+ *
580
+ * - `{ retained }`: the stored sign-in ended; `retained` is what a retained sign-out kept.
581
+ */
1235
582
  const getGrantForRotation = async (store, baseUrl, credential) => {
1236
583
  const isSameSignIn = markSignIn(baseUrl);
1237
584
  const hydrated = await require_transientRetries.Result.tryCatchAsync(() => store.read());
1238
585
  if (!hydrated.success) return hydrated;
1239
586
  if (!isSameSignIn()) return require_transientRetries.Result.failure(signInEnded());
1240
587
  const persistedStack = hydrated.data.stacks.find((stack) => stack.baseUrl === baseUrl);
1241
- if (persistedStack && persistedStack.credential === null) return require_transientRetries.Result.failure(signInEnded());
588
+ if (persistedStack && persistedStack.credential === null) return require_transientRetries.Result.success({ retained: persistedStack.retained ?? null });
1242
589
  return require_transientRetries.Result.success(persistedStack?.credential ?? grantOf(credential));
1243
590
  };
1244
591
  const rotateOnce = async (baseUrl) => persistor.locked(async (store) => {
@@ -1246,6 +593,10 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
1246
593
  if (!credential.success) return credential;
1247
594
  const grant = await getGrantForRotation(store, baseUrl, credential.data);
1248
595
  if (!grant.success) return grant;
596
+ if ("retained" in grant.data) {
597
+ await expire(baseUrl, store, grant.data.retained);
598
+ return require_transientRetries.Result.failure(signInEnded());
599
+ }
1249
600
  const refreshed = await refresh(baseUrl, grant.data);
1250
601
  if (!refreshed.success) {
1251
602
  if (require_middleware.isUnauthorized(refreshed.error)) await expire(baseUrl, store);
@@ -1317,9 +668,10 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
1317
668
  onSignedOut?.(baseUrl);
1318
669
  return signedOut;
1319
670
  };
1320
- const expire = async (baseUrl, store) => {
671
+ const expire = async (baseUrl, store, retained = null) => {
1321
672
  if (!state.auth.notifyExpired(baseUrl)) return;
1322
673
  signOut(baseUrl);
674
+ if (retained) state.auth.retain(baseUrl, retained);
1323
675
  await store.persistStack(baseUrl, state.store.get());
1324
676
  onExpired?.(baseUrl);
1325
677
  };
@@ -1332,19 +684,360 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
1332
684
  if (!state.auth.requireCredential(baseUrl).success) return null;
1333
685
  return require_transientRetries.Result.unwrap(await rotate(baseUrl));
1334
686
  }
1335
- await renewIfStale(baseUrl);
1336
- return state.auth.getAccessToken(baseUrl);
1337
- } });
687
+ await renewIfStale(baseUrl);
688
+ return state.auth.getAccessToken(baseUrl);
689
+ } });
690
+ /**
691
+ * Ends a signed-out grant's server session: its refresh, derived PATs and paired browser session.
692
+ *
693
+ * 1. `token`: revokes the refresh token; the server also takes the one before the last rotation.
694
+ * 2. `cookie`: renews off the session cookie, then revokes that fresh access token.
695
+ * - Never an access token held from before: one rotation later the server no longer knows it.
696
+ * - Best effort, bounded by `END_SESSION_TIMEOUT_MS`: a failure is logged, the sign-out stands.
697
+ */
698
+ const endSession = async (baseUrl, grant) => {
699
+ const client = require_authClient.createAuthClient({
700
+ baseUrl,
701
+ middlewares
702
+ });
703
+ const signal = AbortSignal.timeout(END_SESSION_TIMEOUT_MS);
704
+ try {
705
+ const body = grant.type === "token" ? {
706
+ token: grant.refreshToken,
707
+ tokenTypeHint: "refreshToken"
708
+ } : {
709
+ token: (await client.token.refreshWithSession({ sessionId: grant.sessionId }, signal)).accessToken,
710
+ tokenTypeHint: "accessToken"
711
+ };
712
+ await client.token.revoke(body, signal);
713
+ } catch (error) {
714
+ console.warn("createCredentials: the session could not be ended", error);
715
+ }
716
+ };
717
+ return {
718
+ middleware,
719
+ rotate,
720
+ renewIfStale,
721
+ restore,
722
+ restoreRetained,
723
+ signOut,
724
+ endSession
725
+ };
726
+ };
727
+ // src/serviceClientRegistry/utils.ts
728
+ const isBuiltInProperty = (property) => typeof property === "symbol" || property === "then" || property === "constructor" || property === "toString" || property === "valueOf";
729
+ /**
730
+ * Creates a dummy client that intercepts method calls and invokes the provided onCall callback.
731
+ */
732
+ const createDummyClient = ({ onCall }) => {
733
+ const createProxy = (path = []) => new Proxy(() => {}, {
734
+ get: (_target, prop) => {
735
+ if (isBuiltInProperty(prop)) return void 0;
736
+ return createProxy([...path, prop]);
737
+ },
738
+ apply: (_target, _thisArgs, args) => onCall(path, args)
739
+ });
740
+ return createProxy();
741
+ };
742
+ // src/serviceClientRegistry/createServiceClientRegistry.ts
743
+ const createServiceClientRegistry = () => ({ getServiceBaseUrl, onUnavailable }) => {
744
+ const dummy = (serviceId, clientName) => createDummyClient({ onCall: (path, args) => {
745
+ onUnavailable?.({
746
+ serviceId,
747
+ path,
748
+ args,
749
+ clientName
750
+ });
751
+ } });
752
+ const configs = [];
753
+ const resolveClient = ({ serviceId, clientFn, clientName }) => {
754
+ const serviceBaseUrl = getServiceBaseUrl(serviceId);
755
+ return serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);
756
+ };
757
+ const registry = {
758
+ add: (config) => {
759
+ configs.push(config);
760
+ return registry;
761
+ },
762
+ build: () => {
763
+ const clientMap = {};
764
+ configs.forEach((config) => {
765
+ clientMap[config.clientName] = resolveClient(config);
766
+ });
767
+ return { client: clientMap };
768
+ }
769
+ };
770
+ return registry;
771
+ };
772
+ // src/sdks/variables/variablesSdk.ts
773
+ const VARIABLES_COMPONENT_ID = "keboola.variables";
774
+ /** Union the definitions by name; on a name conflict the target's definition is kept. */
775
+ const mergeVariableDefinitions = (target, source) => {
776
+ const targetNames = new Set(target.map((definition) => definition.name));
777
+ return [...target, ...source.filter((definition) => !targetNames.has(definition.name))];
778
+ };
779
+ /** Add values missing in the target; on a name conflict the value is updated to the source's. */
780
+ const mergeVariableValues = (target, source) => {
781
+ const sourceByName = new Map(source.map((value) => [value.name, value.value]));
782
+ const targetNames = new Set(target.map((value) => value.name));
783
+ return [...target.map((value) => sourceByName.has(value.name) ? {
784
+ ...value,
785
+ value: sourceByName.get(value.name)
786
+ } : value), ...source.filter((value) => !targetNames.has(value.name))];
787
+ };
788
+ /**
789
+ * Orchestration for `keboola.variables` configs: copy a config, or merge two configs into a fresh
790
+ * one (union definitions, upsert values — source wins on a name conflict). Each result is a brand
791
+ * new config + values row, so the caller can reference it without sharing lineage with the source.
792
+ */
793
+ const createVariablesSdk = ({ storageClient }) => {
794
+ const configs = storageClient.configurations;
795
+ const rows = storageClient.configurationRows;
796
+ const readVariables = async (configId, valuesRowId, branchId) => {
797
+ const config = await configs.getConfiguration({
798
+ componentId: VARIABLES_COMPONENT_ID,
799
+ configId,
800
+ branchId
801
+ });
802
+ const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];
803
+ const rawDefinitions = config.configuration?.variables;
804
+ const rawValues = row?.configuration?.values;
805
+ return {
806
+ definitions: Array.isArray(rawDefinitions) ? rawDefinitions : [],
807
+ values: Array.isArray(rawValues) ? rawValues : []
808
+ };
809
+ };
810
+ const createVariables = async (definitions, values, branchId) => {
811
+ const config = await configs.createConfiguration({
812
+ branchId,
813
+ componentId: VARIABLES_COMPONENT_ID,
814
+ name: "Variables definition",
815
+ configuration: { variables: definitions }
816
+ });
817
+ try {
818
+ const row = await rows.createConfigurationRow({
819
+ branchId: String(branchId),
820
+ componentId: VARIABLES_COMPONENT_ID,
821
+ configurationId: config.id,
822
+ name: "Default values",
823
+ configuration: { values }
824
+ });
825
+ return {
826
+ variablesId: config.id,
827
+ variablesValuesId: row.id
828
+ };
829
+ } catch (error) {
830
+ await configs.deleteConfiguration({
831
+ branchId,
832
+ componentId: VARIABLES_COMPONENT_ID,
833
+ configId: config.id
834
+ }).catch((cleanupError) => {
835
+ if (error instanceof Error && error.cause === void 0) error.cause = cleanupError;
836
+ });
837
+ throw error;
838
+ }
839
+ };
1338
840
  return {
1339
- middleware,
1340
- rotate,
1341
- renewIfStale,
1342
- restore,
1343
- restoreRetained,
1344
- signOut
841
+ /** Copy a variables config into a fresh, independent config + values row. */
842
+ copy: async ({ variablesId, variablesValuesId, branchId = "default" }) => {
843
+ const { definitions, values } = await readVariables(variablesId, variablesValuesId, branchId);
844
+ return createVariables(definitions, values, branchId);
845
+ },
846
+ /** Merge the source's variables into the target's and create a fresh merged config + values row. */
847
+ merge: async ({ targetVariablesId, targetValuesId, sourceVariablesId, sourceValuesId, branchId = "default" }) => {
848
+ const [target, source] = await Promise.all([readVariables(targetVariablesId, targetValuesId, branchId), readVariables(sourceVariablesId, sourceValuesId, branchId)]);
849
+ return createVariables(mergeVariableDefinitions(target.definitions, source.definitions), mergeVariableValues(target.values, source.values), branchId);
850
+ }
1345
851
  };
1346
852
  };
1347
- // src/keboola/bearer/perProject.ts
853
+ // src/keboola/createSdk.ts
854
+ const createSdk = ({ storage, services }) => ({
855
+ tag: require_tag.createTagSdk({ metastoreClient: services.metastore }),
856
+ semanticLayer: require_semanticLayer.createSemanticLayerSdk({ metastoreClient: services.metastore }),
857
+ kaiMemory: require_kaiMemory.createKaiMemorySdk({ metastoreClient: services.metastore }),
858
+ vault: require_sdk_vault_index.createVaultSdk({
859
+ vaultClient: services.vault,
860
+ encryptionClient: services.encryption
861
+ }),
862
+ variables: createVariablesSdk({ storageClient: storage })
863
+ });
864
+ // src/keboola/createServiceClients.ts
865
+ const withPath = (serviceBaseUrl, path) => typeof serviceBaseUrl === "string" ? `${serviceBaseUrl}${path}` : async () => `${await serviceBaseUrl()}${path}`;
866
+ const createServiceClients = ({ baseUrl, auth, getServiceBaseUrl, middlewareFor, attachTokenMiddleware }) => createServiceClientRegistry()({
867
+ getServiceBaseUrl,
868
+ onUnavailable: ({ serviceId, path, clientName }) => {
869
+ throw new require_storage.ServiceUnavailableError(serviceId, path, clientName);
870
+ }
871
+ }).add({
872
+ serviceId: "vault",
873
+ clientName: "vault",
874
+ clientFn: (serviceBaseUrl) => require_vault_index.createVaultClient({
875
+ baseUrl: serviceBaseUrl,
876
+ middlewares: middlewareFor("vault", [attachTokenMiddleware]),
877
+ auth
878
+ })
879
+ }).add({
880
+ serviceId: "data-science",
881
+ clientName: "dataScience",
882
+ clientFn: (serviceBaseUrl) => require_dataScience_index.createDataScienceClient({
883
+ baseUrl: serviceBaseUrl,
884
+ middlewares: middlewareFor("dataScience", [attachTokenMiddleware]),
885
+ auth
886
+ })
887
+ }).add({
888
+ serviceId: "data-science",
889
+ clientName: "apps",
890
+ clientFn: (serviceBaseUrl) => require_apps.createAppsClient({
891
+ baseUrl: withPath(serviceBaseUrl, "/v2"),
892
+ middlewares: middlewareFor("apps", [attachTokenMiddleware]),
893
+ auth
894
+ })
895
+ }).add({
896
+ serviceId: "encryption",
897
+ clientName: "encryption",
898
+ clientFn: (serviceBaseUrl) => require_encryption_index.createEncryptionClient({
899
+ baseUrl: serviceBaseUrl,
900
+ middlewares: middlewareFor("encryption")
901
+ })
902
+ }).add({
903
+ serviceId: "editor",
904
+ clientName: "editor",
905
+ clientFn: (serviceBaseUrl) => require_editor_index.createEditorClient({
906
+ baseUrl: serviceBaseUrl,
907
+ middlewares: middlewareFor("editor", [attachTokenMiddleware]),
908
+ auth
909
+ })
910
+ }).add({
911
+ serviceId: "sync-actions",
912
+ clientName: "syncActions",
913
+ clientFn: (serviceBaseUrl) => require_syncActions.createSyncActionsClient({
914
+ baseUrl: serviceBaseUrl,
915
+ middlewares: middlewareFor("syncActions", [attachTokenMiddleware]),
916
+ auth
917
+ })
918
+ }).add({
919
+ serviceId: "telemetry",
920
+ clientName: "telemetry",
921
+ clientFn: (serviceBaseUrl) => require_telemetry_index.createTelemetryClient({
922
+ baseUrl: serviceBaseUrl,
923
+ middlewares: middlewareFor("telemetry", [attachTokenMiddleware]),
924
+ auth
925
+ })
926
+ }).add({
927
+ serviceId: "query",
928
+ clientName: "queryService",
929
+ clientFn: (serviceBaseUrl) => require_queryService.createQueryServiceClient({
930
+ baseUrl: serviceBaseUrl,
931
+ middlewares: middlewareFor("queryService", [attachTokenMiddleware]),
932
+ auth
933
+ })
934
+ }).add({
935
+ serviceId: "queue",
936
+ clientName: "queue",
937
+ clientFn: (serviceBaseUrl) => require_queue.createQueueClient({
938
+ baseUrl: serviceBaseUrl,
939
+ middlewares: middlewareFor("queue", [attachTokenMiddleware]),
940
+ auth
941
+ })
942
+ }).add({
943
+ serviceId: "kai-assistant",
944
+ clientName: "chat",
945
+ clientFn: (serviceBaseUrl) => require_chat_index.createChatClient({
946
+ storageApiUrl: baseUrl,
947
+ baseUrl: serviceBaseUrl,
948
+ middlewares: middlewareFor("chat", [attachTokenMiddleware]),
949
+ auth
950
+ })
951
+ }).add({
952
+ serviceId: "ai",
953
+ clientName: "ai",
954
+ clientFn: (serviceBaseUrl) => require_ai_index.createAiClient({
955
+ baseUrl: serviceBaseUrl,
956
+ middlewares: middlewareFor("ai", [attachTokenMiddleware]),
957
+ auth
958
+ })
959
+ }).add({
960
+ serviceId: "ai",
961
+ clientName: "omnisearch",
962
+ clientFn: (serviceBaseUrl) => require_omnisearch_index.createOmnisearchClient({
963
+ baseUrl: withPath(serviceBaseUrl, "/omnisearch"),
964
+ middlewares: middlewareFor("omnisearch", [attachTokenMiddleware]),
965
+ auth
966
+ })
967
+ }).add({
968
+ serviceId: "import",
969
+ clientName: "import",
970
+ clientFn: (serviceBaseUrl) => require_import.createImportClient({
971
+ baseUrl: serviceBaseUrl,
972
+ middlewares: middlewareFor("import", [attachTokenMiddleware]),
973
+ auth
974
+ })
975
+ }).add({
976
+ serviceId: "kai-agent",
977
+ clientName: "kaiAgent",
978
+ clientFn: (serviceBaseUrl) => require_kaiAgent.createKaiAgentClient({
979
+ baseUrl: serviceBaseUrl,
980
+ middlewares: middlewareFor("kaiAgent", [attachTokenMiddleware]),
981
+ auth
982
+ })
983
+ }).add({
984
+ serviceId: "components-mcp",
985
+ clientName: "componentsMcp",
986
+ clientFn: (serviceBaseUrl) => require_componentsMcp.createComponentsMcpClient({
987
+ baseUrl: serviceBaseUrl,
988
+ middlewares: middlewareFor("componentsMcp", [attachTokenMiddleware]),
989
+ auth
990
+ })
991
+ }).add({
992
+ serviceId: "oauth",
993
+ clientName: "oauth",
994
+ clientFn: (serviceBaseUrl) => require_oauth.createOauthClient({
995
+ baseUrl: serviceBaseUrl,
996
+ middlewares: middlewareFor("oauth", [attachTokenMiddleware]),
997
+ auth
998
+ })
999
+ }).add({
1000
+ serviceId: "scheduler",
1001
+ clientName: "scheduler",
1002
+ clientFn: (serviceBaseUrl) => require_scheduler_index.createSchedulerClient({
1003
+ baseUrl: serviceBaseUrl,
1004
+ middlewares: middlewareFor("scheduler", [attachTokenMiddleware]),
1005
+ auth
1006
+ })
1007
+ }).add({
1008
+ serviceId: "stream",
1009
+ clientName: "stream",
1010
+ clientFn: (serviceBaseUrl) => require_stream_index.createStreamClient({
1011
+ baseUrl: serviceBaseUrl,
1012
+ middlewares: middlewareFor("stream", [attachTokenMiddleware]),
1013
+ auth
1014
+ })
1015
+ }).add({
1016
+ serviceId: "notification",
1017
+ clientName: "notifications",
1018
+ clientFn: (serviceBaseUrl) => require_notifications_index.createNotificationsClient({
1019
+ baseUrl: serviceBaseUrl,
1020
+ middlewares: middlewareFor("notifications", [attachTokenMiddleware]),
1021
+ auth
1022
+ })
1023
+ }).add({
1024
+ serviceId: "billing",
1025
+ clientName: "billing",
1026
+ clientFn: (serviceBaseUrl) => require_billing_index.createBillingClient({
1027
+ baseUrl: serviceBaseUrl,
1028
+ middlewares: middlewareFor("billing", [attachTokenMiddleware]),
1029
+ auth
1030
+ })
1031
+ }).add({
1032
+ serviceId: "metastore",
1033
+ clientName: "metastore",
1034
+ clientFn: (serviceBaseUrl) => require_metastore.createMetastoreClient({
1035
+ baseUrl: serviceBaseUrl,
1036
+ middlewares: middlewareFor("metastore", [attachTokenMiddleware]),
1037
+ auth
1038
+ })
1039
+ }).build();
1040
+ // src/keboola/perProject.ts
1348
1041
  const projectKey = ({ baseUrl, projectId }) => `${baseUrl}#${projectId}`;
1349
1042
  /**
1350
1043
  * One handle per project, and the one call that drops it.
@@ -1379,12 +1072,12 @@ const createPerProject = ({ state, credentials, middlewareFor, stack }) => {
1379
1072
  auth: authFor(project),
1380
1073
  middlewares: middlewareFor("storage", [attach])
1381
1074
  });
1382
- const { client, meta } = createServiceClients({
1075
+ const { client } = createServiceClients({
1383
1076
  baseUrl: project.baseUrl,
1384
1077
  auth: authFor(project),
1385
1078
  getServiceBaseUrl: (serviceId) => async () => {
1386
1079
  const serviceUrl = (await stack.context.getAsync(project.baseUrl)).getServiceUrl(serviceId);
1387
- assert$1(serviceUrl, KeboolaErrorType.NotReady);
1080
+ if (!serviceUrl) throw new require_storage.ServiceUnavailableError(serviceId);
1388
1081
  return serviceUrl;
1389
1082
  },
1390
1083
  middlewareFor,
@@ -1403,7 +1096,6 @@ const createPerProject = ({ state, credentials, middlewareFor, stack }) => {
1403
1096
  if (property === "stack" || property === "auth" || property === "management") return stack.get(project.baseUrl)[property];
1404
1097
  if (property === "storage") return storage;
1405
1098
  if (property === "sdk") return sdk;
1406
- if (property === "serviceMeta") return meta;
1407
1099
  return client[property];
1408
1100
  } }),
1409
1101
  end: () => {
@@ -1425,13 +1117,13 @@ const createPerProject = ({ state, credentials, middlewareFor, stack }) => {
1425
1117
  forgetUnder
1426
1118
  };
1427
1119
  };
1428
- // src/keboola/bearer/persistor.ts
1120
+ // src/keboola/persistor.ts
1429
1121
  /**
1430
1122
  * Where a bearer session is persisted, under whichever adapter the client was given.
1431
1123
  *
1432
1124
  * Exported because a consumer sometimes has to drop a session a client cannot reach: the adapter is
1433
1125
  * chosen at construction, so a client built without one holds no handle to the storage its own
1434
- * session is sitting in. `AppAuthStrategy` in kbc-ui is that case.
1126
+ * session is sitting in.
1435
1127
  */
1436
1128
  const SESSION_STORAGE_KEY = "keboola:session";
1437
1129
  /**
@@ -1558,7 +1250,44 @@ const createSessionPersistor = (storage) => {
1558
1250
  snapshot
1559
1251
  };
1560
1252
  };
1561
- // src/keboola/bearer/context.ts
1253
+ // src/domain/stack.ts
1254
+ const isServiceId = (id) => Object.values(require_serviceIds.ServiceId).includes(id);
1255
+ const SERVICE_URL_OVERRIDES = { "kai-assistant": (url) => `${url}/api` };
1256
+ const createStack = ({ stackInfo, clientServiceUrls }) => {
1257
+ const { services, components, features, ...infoRest } = stackInfo;
1258
+ const serviceMap = new Map(services.map((service) => {
1259
+ if (!isServiceId(service.id)) return [service.id, service.url];
1260
+ const devOverride = clientServiceUrls?.[service.id]?.(service.url);
1261
+ const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
1262
+ const url = devOverride ?? prodOverride ?? service.url;
1263
+ return [service.id, url];
1264
+ }));
1265
+ const componentMap = new Map(components.map((component) => [component.id, component]));
1266
+ const featureSet = new Set(features);
1267
+ const hasFeature = (...feature) => {
1268
+ if (feature.length === 0) return false;
1269
+ return feature.every((x) => featureSet.has(x));
1270
+ };
1271
+ const hasComponent = (...componentId) => {
1272
+ if (componentId.length === 0) return false;
1273
+ return componentId.every((x) => componentMap.has(x));
1274
+ };
1275
+ const getComponent = (componentId) => componentMap.get(componentId) ?? null;
1276
+ const hasService = (serviceId) => serviceMap.has(serviceId);
1277
+ const getServiceUrl = (serviceId) => serviceMap.get(serviceId) ?? null;
1278
+ return {
1279
+ ...infoRest,
1280
+ services,
1281
+ features,
1282
+ components,
1283
+ hasFeature,
1284
+ getServiceUrl,
1285
+ hasService,
1286
+ getComponent,
1287
+ hasComponent
1288
+ };
1289
+ };
1290
+ // src/keboola/context.ts
1562
1291
  const STACK_INDEX_TIMEOUT_MS = 3e4;
1563
1292
  /**
1564
1293
  * One parsed stack index per stack; `createStack` applies the dev and production overrides.
@@ -1624,7 +1353,7 @@ const createStackContext = ({ state, clientServiceUrls }) => {
1624
1353
  getAsync
1625
1354
  };
1626
1355
  };
1627
- // src/keboola/bearer/perStack.ts
1356
+ // src/keboola/perStack.ts
1628
1357
  /**
1629
1358
  * Everything one stack derives.
1630
1359
  *
@@ -1662,7 +1391,7 @@ const createPerStack = ({ state, credentials, middlewareFor, clientServiceUrls }
1662
1391
  get
1663
1392
  };
1664
1393
  };
1665
- // src/keboola/bearer/keboola.ts
1394
+ // src/keboola/keboola.ts
1666
1395
  /**
1667
1396
  * The bearer client: the session table, its two scopes, and the surface they back.
1668
1397
  *
@@ -1750,20 +1479,39 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
1750
1479
  return active().management;
1751
1480
  }
1752
1481
  };
1753
- const getStackApi = () => stackApi;
1754
- const getProjectApi = (projectId) => perProject.get(onActiveStack(projectId));
1482
+ const projectApi = (projectId) => perProject.get(onActiveStack(projectId));
1755
1483
  /**
1756
1484
  * The scope's sign-in, or a named stack's — and everything that sign-in derived.
1757
1485
  *
1486
+ * - Ends the server session too (`credentials.endSession`).
1758
1487
  * - `retain` keeps the grant on the stack, persisted beside the sign-in it ended, for
1759
- * `restoreRetained`; the next sign-in on the stack replaces it.
1760
- * - The table is signed out on return; the promise resolves once that is stored, so a caller
1761
- * leaving the document waits for it.
1488
+ * `restoreRetained`, and so leaves the server session live; the next sign-in replaces it.
1489
+ * - The table is signed out on return; the promise resolves once that is stored and the
1490
+ * session's end was attempted, so a caller leaving the document waits for both.
1762
1491
  */
1763
- const signOut = ({ baseUrl, ...options } = {}) => {
1764
- const target = requireStackUrl(baseUrl);
1492
+ const signOut = ({ baseUrl, ...options } = {}) => endSignIn(requireStackUrl(baseUrl), options, !options.retain);
1493
+ const endingSessions = /* @__PURE__ */ new Map();
1494
+ /** `signOut`; `endSession: false` leaves the server session alone. */
1495
+ const endSignIn = (target, options, endSession) => {
1496
+ const held = endSession ? require_transientRetries.Result.unwrapOr(state.auth.requireCredential(target), null) : null;
1765
1497
  const signedOut = require_transientRetries.Result.unwrap(credentials.signOut(target, options));
1766
- return persistor.locked((store) => store.persistStack(target, state.store.get())).then(() => signedOut);
1498
+ let newest = held && grantOf(held);
1499
+ const ended = persistor.locked(async (store) => {
1500
+ if (held !== null) newest = (await store.read()).stacks.find((stack) => stack.baseUrl === target)?.credential ?? newest;
1501
+ await store.persistStack(target, state.store.get());
1502
+ }).then(() => newest ? credentials.endSession(target, newest) : void 0, async (error) => {
1503
+ if (newest) await credentials.endSession(target, newest);
1504
+ throw error;
1505
+ });
1506
+ const earlier = endingSessions.get(target);
1507
+ if (held !== null) {
1508
+ endingSessions.set(target, ended);
1509
+ const forget = () => {
1510
+ if (endingSessions.get(target) === ended) endingSessions.delete(target);
1511
+ };
1512
+ ended.then(forget, forget);
1513
+ }
1514
+ return Promise.all([ended, earlier]).then(() => signedOut);
1767
1515
  };
1768
1516
  /** Signs a stack back in from what a retained sign-out kept; `unreachable` leaves it to retry. */
1769
1517
  const restoreRetained = (baseUrl) => credentials.restoreRetained(require_createFetchClient.normalizeBaseUrl(baseUrl));
@@ -1772,9 +1520,12 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
1772
1520
  *
1773
1521
  * - Signs out first, always: a sign-out moves the epoch even on an anonymous stack, so a stored
1774
1522
  * session still being restored cannot land on top of this one.
1523
+ * - Locally only: the replaced sign-in can share a browser session with `input`.
1775
1524
  */
1776
1525
  const replace = (input) => {
1777
- signOut();
1526
+ endSignIn(requireStackUrl(), {}, false).catch((error) => {
1527
+ console.warn("createKeboola: the replaced sign-in could not be stored", error);
1528
+ });
1778
1529
  return authenticate(input);
1779
1530
  };
1780
1531
  let persisting = false;
@@ -1840,8 +1591,8 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
1840
1591
  return verb(...args);
1841
1592
  };
1842
1593
  return {
1843
- getStackApi,
1844
- getProjectApi,
1594
+ stackApi,
1595
+ projectApi,
1845
1596
  session: {
1846
1597
  getState: state.store.get,
1847
1598
  subscribe: state.store.subscribe,
@@ -2086,17 +1837,14 @@ exports.ValidationError = require_ValidationError.ValidationError;
2086
1837
  exports.asError = require_transientRetries.asError;
2087
1838
  exports.assert = assert;
2088
1839
  exports.coalesce = coalesce;
2089
- exports.collectByCursor = require_authClient.collectByCursor;
1840
+ exports.collectByCursor = require_validateConnectionStatus.collectByCursor;
2090
1841
  exports.collectByOffset = require_collectByOffset.collectByOffset;
2091
1842
  exports.concurrent = require_concurrent.concurrent;
2092
1843
  exports.createAdminAccount = createAdminAccount;
2093
1844
  exports.createBranchRefs = createBranchRefs;
2094
- exports.createDerivedAsyncStore = createDerivedAsyncStore;
2095
- exports.createDerivedStore = createDerivedStore;
2096
1845
  exports.createEmitter = require_store.createEmitter;
2097
1846
  exports.createGenericFetchClient = require_createGenericFetchClient.createGenericFetchClient;
2098
1847
  exports.createKeboola = createKeboola;
2099
- exports.createLegacyKeboola = createLegacyKeboola;
2100
1848
  exports.createLocalStorage = createLocalStorage;
2101
1849
  exports.createLoggingMiddleware = createLoggingMiddleware;
2102
1850
  exports.createMemoryStorage = createMemoryStorage;
@@ -2134,11 +1882,12 @@ exports.isStorageJobError = require_storage.isStorageJobError;
2134
1882
  exports.isSyncActionError = require_SyncActionError.isSyncActionError;
2135
1883
  exports.isTimeoutError = require_createFetchClient.isTimeoutError;
2136
1884
  exports.isValidationError = require_ValidationError.isValidationError;
1885
+ exports.iterateByCursor = require_validateConnectionStatus.iterateByCursor;
2137
1886
  exports.jobStatus = require_transientRetries.jobStatus;
2138
1887
  exports.keboolaUID = require_tag.keboolaUID;
2139
1888
  exports.lazy = require_transientRetries.lazy;
2140
1889
  exports.manageErrorCode = require_storage.manageErrorCode;
2141
- exports.nextCursorOf = require_authClient.nextCursorOf;
1890
+ exports.nextCursorOf = require_validateConnectionStatus.nextCursorOf;
2142
1891
  exports.parseLogLines = require_apps.parseLogLines;
2143
1892
  exports.parseOrThrow = require_ValidationError.parseOrThrow;
2144
1893
  exports.poller = require_transientRetries.poller;
@@ -2147,6 +1896,5 @@ exports.readableReason = require_storage.readableReason;
2147
1896
  exports.retryAfterSeconds = require_storage.retryAfterSeconds;
2148
1897
  exports.schemaGuidedMerge = require_schemaGuidedMerge.schemaGuidedMerge;
2149
1898
  exports.series = require_storage.series;
2150
- exports.shallowEqual = shallowEqual;
2151
1899
 
2152
1900
  //# sourceMappingURL=index.cjs.map