@keboola/api-client 27.0.0 → 31.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 (844) hide show
  1. package/AGENTS.md +145 -11
  2. package/API-SURFACE.md +13 -1
  3. package/CHANGELOG.md +1785 -0
  4. package/README.md +53 -18
  5. package/dist/ManagementClientAuthError-90pvsej0.js +15 -0
  6. package/dist/ManagementClientAuthError-90pvsej0.js.map +1 -0
  7. package/dist/ManagementClientAuthError-DFhi5yxe.cjs +20 -0
  8. package/dist/ManagementClientAuthError-DFhi5yxe.cjs.map +1 -0
  9. package/dist/QueryJobTimeoutError-C7JbNGOM.js +38 -0
  10. package/dist/QueryJobTimeoutError-C7JbNGOM.js.map +1 -0
  11. package/dist/QueryJobTimeoutError-CVNPdCWX.cjs +61 -0
  12. package/dist/QueryJobTimeoutError-CVNPdCWX.cjs.map +1 -0
  13. package/dist/SyncActionError-BG0zwchi.cjs +35 -0
  14. package/dist/SyncActionError-BG0zwchi.cjs.map +1 -0
  15. package/dist/SyncActionError-CoZFsdUk.js +24 -0
  16. package/dist/SyncActionError-CoZFsdUk.js.map +1 -0
  17. package/dist/UserError-By_Zckmc.js +10 -0
  18. package/dist/UserError-By_Zckmc.js.map +1 -0
  19. package/dist/UserError-CSGO1qII.cjs +15 -0
  20. package/dist/UserError-CSGO1qII.cjs.map +1 -0
  21. package/dist/ValidationError-CzPWydEb.js +44 -0
  22. package/dist/ValidationError-CzPWydEb.js.map +1 -0
  23. package/dist/ValidationError-h5qvwahi.cjs +61 -0
  24. package/dist/ValidationError-h5qvwahi.cjs.map +1 -0
  25. package/dist/adminRoles-B40yBcmq.js +14 -0
  26. package/dist/adminRoles-B40yBcmq.js.map +1 -0
  27. package/dist/adminRoles-C696kD_U.d.cts +14 -0
  28. package/dist/adminRoles-C696kD_U.d.ts +14 -0
  29. package/dist/adminRoles-CO7J5qAy.cjs +19 -0
  30. package/dist/adminRoles-CO7J5qAy.cjs.map +1 -0
  31. package/dist/ai/index.cjs +62 -12
  32. package/dist/ai/index.cjs.map +1 -1
  33. package/dist/ai/index.d.cts +52 -53
  34. package/dist/ai/index.d.ts +52 -53
  35. package/dist/ai/index.js +62 -4
  36. package/dist/ai/index.js.map +1 -1
  37. package/dist/ai/types.cjs +0 -4
  38. package/dist/ai/types.d.cts +2 -2
  39. package/dist/ai/types.d.ts +2 -2
  40. package/dist/ai/types.js +1 -3
  41. package/dist/appLogs-BCCi02w6.cjs +153 -0
  42. package/dist/appLogs-BCCi02w6.cjs.map +1 -0
  43. package/dist/appLogs-BdMG6Cvn.d.ts +10 -0
  44. package/dist/appLogs-CLHhkQJn.js +132 -0
  45. package/dist/appLogs-CLHhkQJn.js.map +1 -0
  46. package/dist/appLogs-hQdKt_8J.d.cts +10 -0
  47. package/dist/apps/index.cjs +229 -14
  48. package/dist/apps/index.cjs.map +1 -1
  49. package/dist/apps/index.d.cts +219 -220
  50. package/dist/apps/index.d.ts +219 -220
  51. package/dist/apps/index.js +229 -6
  52. package/dist/apps/index.js.map +1 -1
  53. package/dist/apps/types.cjs +0 -4
  54. package/dist/apps/types.d.cts +3 -3
  55. package/dist/apps/types.d.ts +3 -3
  56. package/dist/apps/types.js +1 -3
  57. package/dist/assets/index.cjs +33 -38
  58. package/dist/assets/index.cjs.map +1 -1
  59. package/dist/assets/index.d.cts +22 -22
  60. package/dist/assets/index.d.ts +22 -22
  61. package/dist/assets/index.js +32 -36
  62. package/dist/assets/index.js.map +1 -1
  63. package/dist/assets/schema.cjs +23 -13
  64. package/dist/assets/schema.cjs.map +1 -1
  65. package/dist/assets/schema.d.cts +29 -28
  66. package/dist/assets/schema.d.ts +29 -28
  67. package/dist/assets/schema.js +21 -2
  68. package/dist/assets/schema.js.map +1 -1
  69. package/dist/auth/index.cjs +15 -57
  70. package/dist/auth/index.d.cts +2 -318
  71. package/dist/auth/index.d.ts +2 -318
  72. package/dist/auth/index.js +2 -4
  73. package/dist/auth/types.cjs +0 -4
  74. package/dist/auth/types.d.cts +2 -7
  75. package/dist/auth/types.d.ts +2 -7
  76. package/dist/auth/types.js +1 -3
  77. package/dist/auth-CE6Hlc9W.js +13 -0
  78. package/dist/{chunk-5A3AQIXR.js.map → auth-CE6Hlc9W.js.map} +1 -1
  79. package/dist/auth-DmgTH0uY.cjs +18 -0
  80. package/dist/auth-DmgTH0uY.cjs.map +1 -0
  81. package/dist/authClient-BL6h78Q1.d.cts +367 -0
  82. package/dist/authClient-Bc_bDisO.d.ts +367 -0
  83. package/dist/authClient-Cixa8_L1.cjs +476 -0
  84. package/dist/authClient-Cixa8_L1.cjs.map +1 -0
  85. package/dist/authClient-XBAUz9g-.js +397 -0
  86. package/dist/authClient-XBAUz9g-.js.map +1 -0
  87. package/dist/backends-DKBz5OxE.d.cts +9 -0
  88. package/dist/backends-DKBz5OxE.d.ts +9 -0
  89. package/dist/chat/index.cjs +134 -13
  90. package/dist/chat/index.cjs.map +1 -1
  91. package/dist/chat/index.d.cts +49 -51
  92. package/dist/chat/index.d.ts +49 -51
  93. package/dist/chat/index.js +134 -5
  94. package/dist/chat/index.js.map +1 -1
  95. package/dist/chat/suggestions.cjs +152 -74
  96. package/dist/chat/suggestions.cjs.map +1 -1
  97. package/dist/chat/suggestions.d.cts +2 -437
  98. package/dist/chat/suggestions.d.ts +2 -437
  99. package/dist/chat/suggestions.js +136 -2
  100. package/dist/chat/suggestions.js.map +1 -1
  101. package/dist/chat/types.cjs +6 -8
  102. package/dist/chat/types.cjs.map +1 -1
  103. package/dist/chat/types.d.cts +2 -3
  104. package/dist/chat/types.d.ts +2 -3
  105. package/dist/chat/types.js +5 -6
  106. package/dist/chat/types.js.map +1 -1
  107. package/dist/componentId-DkyQ8PM0.cjs +73 -0
  108. package/dist/componentId-DkyQ8PM0.cjs.map +1 -0
  109. package/dist/componentId-vJz-kWs6.js +68 -0
  110. package/dist/componentId-vJz-kWs6.js.map +1 -0
  111. package/dist/concurrent-CH9fbNr3.js +34 -0
  112. package/dist/concurrent-CH9fbNr3.js.map +1 -0
  113. package/dist/concurrent-tbiIa0UL.cjs +39 -0
  114. package/dist/concurrent-tbiIa0UL.cjs.map +1 -0
  115. package/dist/configurations-Byt59bIa.js +726 -0
  116. package/dist/configurations-Byt59bIa.js.map +1 -0
  117. package/dist/configurations-CujCwDcB.cjs +743 -0
  118. package/dist/configurations-CujCwDcB.cjs.map +1 -0
  119. package/dist/configurations-DCOJONZZ.cjs +313 -0
  120. package/dist/configurations-DCOJONZZ.cjs.map +1 -0
  121. package/dist/configurations-iCbhe0tb.js +158 -0
  122. package/dist/configurations-iCbhe0tb.js.map +1 -0
  123. package/dist/constants/index.cjs +12 -34
  124. package/dist/constants/index.d.cts +4 -104
  125. package/dist/constants/index.d.ts +4 -104
  126. package/dist/constants/index.js +4 -5
  127. package/dist/constants-CkAVvuUq.cjs +219 -0
  128. package/dist/constants-CkAVvuUq.cjs.map +1 -0
  129. package/dist/constants-qeWGfk_7.js +184 -0
  130. package/dist/constants-qeWGfk_7.js.map +1 -0
  131. package/dist/createFetchClient-B1h3-p65.js +192 -0
  132. package/dist/createFetchClient-B1h3-p65.js.map +1 -0
  133. package/dist/createFetchClient-B9Cv0W9f.cjs +277 -0
  134. package/dist/createFetchClient-B9Cv0W9f.cjs.map +1 -0
  135. package/dist/createGenericFetchClient-BWoSkTki.cjs +12 -0
  136. package/dist/createGenericFetchClient-BWoSkTki.cjs.map +1 -0
  137. package/dist/createGenericFetchClient-DhpvUSlX.js +7 -0
  138. package/dist/createGenericFetchClient-DhpvUSlX.js.map +1 -0
  139. package/dist/createOpenapiFetchClient-0_oqhdPv.js +7 -0
  140. package/dist/createOpenapiFetchClient-0_oqhdPv.js.map +1 -0
  141. package/dist/createOpenapiFetchClient-yirrW6Tg.cjs +12 -0
  142. package/dist/createOpenapiFetchClient-yirrW6Tg.cjs.map +1 -0
  143. package/dist/createStore-BNiCRQXa.js +148 -0
  144. package/dist/createStore-BNiCRQXa.js.map +1 -0
  145. package/dist/createStore-MQbboXcB.cjs +177 -0
  146. package/dist/createStore-MQbboXcB.cjs.map +1 -0
  147. package/dist/credential-D-tX9gP4.cjs +44 -0
  148. package/dist/credential-D-tX9gP4.cjs.map +1 -0
  149. package/dist/credential-dKxArMic.js +33 -0
  150. package/dist/credential-dKxArMic.js.map +1 -0
  151. package/dist/dataScience/index.cjs +5 -20
  152. package/dist/dataScience/index.d.cts +3 -209
  153. package/dist/dataScience/index.d.ts +3 -209
  154. package/dist/dataScience/index.js +3 -7
  155. package/dist/dataScience/types.cjs +0 -4
  156. package/dist/dataScience/types.d.cts +3 -2172
  157. package/dist/dataScience/types.d.ts +3 -2172
  158. package/dist/dataScience/types.js +1 -3
  159. package/dist/dataScience-BqNWX-Gr.cjs +114 -0
  160. package/dist/dataScience-BqNWX-Gr.cjs.map +1 -0
  161. package/dist/dataScience-jdbSSPYF.js +109 -0
  162. package/dist/dataScience-jdbSSPYF.js.map +1 -0
  163. package/dist/dedupe-CiskLkGR.cjs +30 -0
  164. package/dist/dedupe-CiskLkGR.cjs.map +1 -0
  165. package/dist/dedupe-DYIHgZoG.js +25 -0
  166. package/dist/dedupe-DYIHgZoG.js.map +1 -0
  167. package/dist/developerPortal/index.cjs +6 -0
  168. package/dist/developerPortal/index.d.cts +3 -0
  169. package/dist/developerPortal/index.d.ts +3 -0
  170. package/dist/developerPortal/index.js +2 -0
  171. package/dist/developerPortal/types.cjs +0 -0
  172. package/dist/developerPortal/types.d.cts +2 -0
  173. package/dist/developerPortal/types.d.ts +2 -0
  174. package/dist/developerPortal/types.js +1 -0
  175. package/dist/developerPortalClient-5ABcxz1U.js +485 -0
  176. package/dist/developerPortalClient-5ABcxz1U.js.map +1 -0
  177. package/dist/developerPortalClient-B7lNR5q0.cjs +508 -0
  178. package/dist/developerPortalClient-B7lNR5q0.cjs.map +1 -0
  179. package/dist/domain/permissions/index.cjs +31 -122
  180. package/dist/domain/permissions/index.d.cts +19 -52
  181. package/dist/domain/permissions/index.d.ts +19 -52
  182. package/dist/domain/permissions/index.js +3 -5
  183. package/dist/domain/storageTable/index.cjs +4 -16
  184. package/dist/domain/storageTable/index.d.cts +2 -131
  185. package/dist/domain/storageTable/index.d.ts +2 -131
  186. package/dist/domain/storageTable/index.js +2 -3
  187. package/dist/editor/index.cjs +96 -12
  188. package/dist/editor/index.cjs.map +1 -1
  189. package/dist/editor/index.d.cts +163 -164
  190. package/dist/editor/index.d.ts +163 -164
  191. package/dist/editor/index.js +96 -4
  192. package/dist/editor/index.js.map +1 -1
  193. package/dist/editor/types.cjs +0 -4
  194. package/dist/editor/types.d.cts +2 -2
  195. package/dist/editor/types.d.ts +2 -2
  196. package/dist/editor/types.js +1 -3
  197. package/dist/encryption/index.cjs +58 -11
  198. package/dist/encryption/index.cjs.map +1 -1
  199. package/dist/encryption/index.d.cts +2 -20
  200. package/dist/encryption/index.d.ts +2 -20
  201. package/dist/encryption/index.js +58 -3
  202. package/dist/encryption/index.js.map +1 -1
  203. package/dist/encryption/types.cjs +0 -4
  204. package/dist/encryption/types.d.cts +2 -69
  205. package/dist/encryption/types.d.ts +2 -69
  206. package/dist/encryption/types.js +1 -3
  207. package/dist/generateUUID-C6qKBPIv.cjs +11 -0
  208. package/dist/generateUUID-C6qKBPIv.cjs.map +1 -0
  209. package/dist/generateUUID-Dr8l-aoc.js +6 -0
  210. package/dist/generateUUID-Dr8l-aoc.js.map +1 -0
  211. package/dist/import/index.cjs +3 -14
  212. package/dist/import/index.d.cts +41 -41
  213. package/dist/import/index.d.ts +41 -41
  214. package/dist/import/index.js +2 -5
  215. package/dist/import-CExRbskw.js +116 -0
  216. package/dist/import-CExRbskw.js.map +1 -0
  217. package/dist/import-CXHppAxd.cjs +121 -0
  218. package/dist/import-CXHppAxd.cjs.map +1 -0
  219. package/dist/index--pxLseaw.d.cts +125 -0
  220. package/dist/index--pxLseaw.d.ts +125 -0
  221. package/dist/index-7RvXnXmd.d.ts +77 -0
  222. package/dist/index-B-frWtGW.d.cts +235 -0
  223. package/dist/index-B6q7HxKJ.d.cts +1075 -0
  224. package/dist/index-BMqLPS6S.d.cts +135 -0
  225. package/dist/index-BMqLPS6S.d.ts +135 -0
  226. package/dist/index-BR2Fu-Wo.d.ts +19883 -0
  227. package/dist/index-BSjfVDTr.d.cts +208 -0
  228. package/dist/index-BfVv8isU.d.cts +1388 -0
  229. package/dist/index-C9mAoXF6.d.cts +77 -0
  230. package/dist/index-CMb0ygwb.d.ts +26 -0
  231. package/dist/index-CR9LsDaG.d.cts +65 -0
  232. package/dist/index-CW4VC9oN.d.ts +65 -0
  233. package/dist/index-CYMAwD3E.d.ts +1388 -0
  234. package/dist/index-Cpjh05sx.d.cts +31 -0
  235. package/dist/index-CwJE18PJ.d.cts +26 -0
  236. package/dist/index-D_TnbEtp.d.cts +16 -0
  237. package/dist/index-Daks5CeX.d.ts +31 -0
  238. package/dist/index-DeMDxHTz.d.ts +1075 -0
  239. package/dist/index-Ds8e0l7-.d.ts +235 -0
  240. package/dist/index-J1I2HlSm.d.ts +208 -0
  241. package/dist/index-NC1dXRTD.d.cts +40 -0
  242. package/dist/index-NC1dXRTD.d.ts +40 -0
  243. package/dist/index-NicJZIzu.d.ts +16 -0
  244. package/dist/index-cu8THqZV.d.cts +19883 -0
  245. package/dist/index.cjs +1735 -1884
  246. package/dist/index.cjs.map +1 -1
  247. package/dist/index.d.cts +7 -15778
  248. package/dist/index.d.ts +7 -15778
  249. package/dist/index.js +1683 -1724
  250. package/dist/index.js.map +1 -1
  251. package/dist/isPlainObject-BB3iy87C.cjs +16 -0
  252. package/dist/isPlainObject-BB3iy87C.cjs.map +1 -0
  253. package/dist/isPlainObject-LYW-03uB.js +11 -0
  254. package/dist/isPlainObject-LYW-03uB.js.map +1 -0
  255. package/dist/jobStatus-DbMupQEK.js +423 -0
  256. package/dist/jobStatus-DbMupQEK.js.map +1 -0
  257. package/dist/jobStatus-kQ9JqF8t.cjs +494 -0
  258. package/dist/jobStatus-kQ9JqF8t.cjs.map +1 -0
  259. package/dist/management/index.cjs +4 -18
  260. package/dist/management/index.d.cts +2 -1076
  261. package/dist/management/index.d.ts +2 -1076
  262. package/dist/management/index.js +2 -5
  263. package/dist/management/types.cjs +0 -4
  264. package/dist/management/types.d.cts +2 -12
  265. package/dist/management/types.d.ts +2 -12
  266. package/dist/management/types.js +1 -3
  267. package/dist/management-Cc8mKfnf.js +1064 -0
  268. package/dist/management-Cc8mKfnf.js.map +1 -0
  269. package/dist/management-DlVdxzPw.cjs +1075 -0
  270. package/dist/management-DlVdxzPw.cjs.map +1 -0
  271. package/dist/metastore/index.cjs +3 -14
  272. package/dist/metastore/index.d.cts +2 -32
  273. package/dist/metastore/index.d.ts +2 -32
  274. package/dist/metastore/index.js +2 -5
  275. package/dist/metastore/types.cjs +0 -4
  276. package/dist/metastore/types.d.cts +2 -2
  277. package/dist/metastore/types.d.ts +2 -2
  278. package/dist/metastore/types.js +1 -3
  279. package/dist/metastore-CNf1412Z.js +134 -0
  280. package/dist/metastore-CNf1412Z.js.map +1 -0
  281. package/dist/metastore-DbsxqjhS.cjs +139 -0
  282. package/dist/metastore-DbsxqjhS.cjs.map +1 -0
  283. package/dist/notifications/index.cjs +67 -13
  284. package/dist/notifications/index.cjs.map +1 -1
  285. package/dist/notifications/index.d.cts +56 -57
  286. package/dist/notifications/index.d.ts +56 -57
  287. package/dist/notifications/index.js +67 -5
  288. package/dist/notifications/index.js.map +1 -1
  289. package/dist/notifications/types.cjs +0 -4
  290. package/dist/notifications/types.d.cts +2 -2
  291. package/dist/notifications/types.d.ts +2 -2
  292. package/dist/notifications/types.js +1 -3
  293. package/dist/oauth/index.cjs +3 -14
  294. package/dist/oauth/index.d.cts +49 -50
  295. package/dist/oauth/index.d.ts +49 -50
  296. package/dist/oauth/index.js +2 -5
  297. package/dist/oauth/types.cjs +0 -4
  298. package/dist/oauth/types.d.cts +2 -725
  299. package/dist/oauth/types.d.ts +2 -725
  300. package/dist/oauth/types.js +1 -3
  301. package/dist/oauth-ClksaYRY.js +83 -0
  302. package/dist/oauth-ClksaYRY.js.map +1 -0
  303. package/dist/oauth-DsZgmtPj.cjs +88 -0
  304. package/dist/oauth-DsZgmtPj.cjs.map +1 -0
  305. package/dist/omnisearch/index.cjs +47 -12
  306. package/dist/omnisearch/index.cjs.map +1 -1
  307. package/dist/omnisearch/index.d.cts +12 -14
  308. package/dist/omnisearch/index.d.ts +12 -14
  309. package/dist/omnisearch/index.js +47 -4
  310. package/dist/omnisearch/index.js.map +1 -1
  311. package/dist/omnisearch/types.cjs +0 -4
  312. package/dist/omnisearch/types.d.cts +2 -3
  313. package/dist/omnisearch/types.d.ts +2 -3
  314. package/dist/omnisearch/types.js +1 -3
  315. package/dist/project-5SLw86eZ.d.ts +18 -0
  316. package/dist/project-BvFi19K_.cjs +56 -0
  317. package/dist/project-BvFi19K_.cjs.map +1 -0
  318. package/dist/project-CRrsxSAK.d.cts +18 -0
  319. package/dist/project-DWwZv66D.js +39 -0
  320. package/dist/project-DWwZv66D.js.map +1 -0
  321. package/dist/queryService/index.cjs +3 -14
  322. package/dist/queryService/index.d.cts +2 -40
  323. package/dist/queryService/index.d.ts +2 -40
  324. package/dist/queryService/index.js +2 -5
  325. package/dist/queryService/types.cjs +0 -4
  326. package/dist/queryService/types.d.cts +2 -2
  327. package/dist/queryService/types.d.ts +2 -2
  328. package/dist/queryService/types.js +1 -3
  329. package/dist/queryService-BlyAcBxP.js +114 -0
  330. package/dist/queryService-BlyAcBxP.js.map +1 -0
  331. package/dist/queryService-DxUUkTcy.cjs +119 -0
  332. package/dist/queryService-DxUUkTcy.cjs.map +1 -0
  333. package/dist/queue/index.cjs +3 -15
  334. package/dist/queue/index.d.cts +411 -340
  335. package/dist/queue/index.d.ts +411 -340
  336. package/dist/queue/index.js +2 -6
  337. package/dist/queue/types.cjs +0 -4
  338. package/dist/queue/types.d.cts +2 -2
  339. package/dist/queue/types.d.ts +2 -2
  340. package/dist/queue/types.js +1 -3
  341. package/dist/queue-CpcqeMPz.cjs +137 -0
  342. package/dist/queue-CpcqeMPz.cjs.map +1 -0
  343. package/dist/queue-DpZTm7U7.js +126 -0
  344. package/dist/queue-DpZTm7U7.js.map +1 -0
  345. package/dist/rolldown-runtime-VH7oDXx4.cjs +28 -0
  346. package/dist/scheduler/index.cjs +61 -13
  347. package/dist/scheduler/index.cjs.map +1 -1
  348. package/dist/scheduler/index.d.cts +73 -74
  349. package/dist/scheduler/index.d.ts +73 -74
  350. package/dist/scheduler/index.js +61 -5
  351. package/dist/scheduler/index.js.map +1 -1
  352. package/dist/scheduler/types.cjs +0 -4
  353. package/dist/scheduler/types.d.cts +2 -372
  354. package/dist/scheduler/types.d.ts +2 -372
  355. package/dist/scheduler/types.js +1 -3
  356. package/dist/sdk/configurations/index.cjs +3 -16
  357. package/dist/sdk/configurations/index.d.cts +3066 -3078
  358. package/dist/sdk/configurations/index.d.ts +3066 -3078
  359. package/dist/sdk/configurations/index.js +2 -7
  360. package/dist/sdk/developerPortal/index.cjs +203 -0
  361. package/dist/sdk/developerPortal/index.cjs.map +1 -0
  362. package/dist/sdk/developerPortal/index.d.cts +1371 -0
  363. package/dist/sdk/developerPortal/index.d.ts +1371 -0
  364. package/dist/sdk/developerPortal/index.js +202 -0
  365. package/dist/sdk/developerPortal/index.js.map +1 -0
  366. package/dist/sdk/queryService/index.cjs +91 -14
  367. package/dist/sdk/queryService/index.cjs.map +1 -1
  368. package/dist/sdk/queryService/index.d.cts +2 -35
  369. package/dist/sdk/queryService/index.d.ts +2 -35
  370. package/dist/sdk/queryService/index.js +91 -6
  371. package/dist/sdk/queryService/index.js.map +1 -1
  372. package/dist/sdk/semanticLayer/index.cjs +352 -54
  373. package/dist/sdk/semanticLayer/index.cjs.map +1 -1
  374. package/dist/sdk/semanticLayer/index.d.cts +95 -99
  375. package/dist/sdk/semanticLayer/index.d.ts +95 -99
  376. package/dist/sdk/semanticLayer/index.js +346 -4
  377. package/dist/sdk/semanticLayer/index.js.map +1 -1
  378. package/dist/sdk/semanticLayer/types.cjs +0 -4
  379. package/dist/sdk/semanticLayer/types.d.cts +2 -152
  380. package/dist/sdk/semanticLayer/types.d.ts +2 -152
  381. package/dist/sdk/semanticLayer/types.js +1 -3
  382. package/dist/sdk/storage/index.cjs +267 -48
  383. package/dist/sdk/storage/index.cjs.map +1 -1
  384. package/dist/sdk/storage/index.d.cts +2 -120
  385. package/dist/sdk/storage/index.d.ts +2 -120
  386. package/dist/sdk/storage/index.js +258 -4
  387. package/dist/sdk/storage/index.js.map +1 -1
  388. package/dist/sdk/tag/index.cjs +3 -14
  389. package/dist/sdk/tag/index.d.cts +16 -20
  390. package/dist/sdk/tag/index.d.ts +16 -20
  391. package/dist/sdk/tag/index.js +2 -5
  392. package/dist/sdk/tag/types.cjs +0 -4
  393. package/dist/sdk/tag/types.d.cts +2 -36
  394. package/dist/sdk/tag/types.d.ts +2 -36
  395. package/dist/sdk/tag/types.js +1 -3
  396. package/dist/sdk/vault/index.cjs +93 -31
  397. package/dist/sdk/vault/index.cjs.map +1 -1
  398. package/dist/sdk/vault/index.d.cts +2 -73
  399. package/dist/sdk/vault/index.d.ts +2 -73
  400. package/dist/sdk/vault/index.js +88 -3
  401. package/dist/sdk/vault/index.js.map +1 -1
  402. package/dist/status/index.cjs +16 -20
  403. package/dist/status/index.cjs.map +1 -1
  404. package/dist/status/index.d.cts +8 -9
  405. package/dist/status/index.d.ts +8 -9
  406. package/dist/status/index.js +15 -18
  407. package/dist/status/index.js.map +1 -1
  408. package/dist/status/types.cjs +0 -6
  409. package/dist/status/types.d.cts +17 -15
  410. package/dist/status/types.d.ts +17 -15
  411. package/dist/status/types.js +1 -3
  412. package/dist/storage/index.cjs +30 -92
  413. package/dist/storage/index.d.cts +3 -24
  414. package/dist/storage/index.d.ts +3 -24
  415. package/dist/storage/index.js +9 -11
  416. package/dist/storage/types.cjs +0 -4
  417. package/dist/storage/types.d.cts +5 -1949
  418. package/dist/storage/types.d.ts +5 -1949
  419. package/dist/storage/types.js +1 -3
  420. package/dist/storage-CQxu0EY3.js +2432 -0
  421. package/dist/storage-CQxu0EY3.js.map +1 -0
  422. package/dist/storage-vnH64B_Q.cjs +2461 -0
  423. package/dist/storage-vnH64B_Q.cjs.map +1 -0
  424. package/dist/storageTable-C9crh4Ef.cjs +310 -0
  425. package/dist/storageTable-C9crh4Ef.cjs.map +1 -0
  426. package/dist/storageTable-DslXtqNL.js +299 -0
  427. package/dist/storageTable-DslXtqNL.js.map +1 -0
  428. package/dist/stream/index.cjs +363 -12
  429. package/dist/stream/index.cjs.map +1 -1
  430. package/dist/stream/index.d.cts +345 -346
  431. package/dist/stream/index.d.ts +345 -346
  432. package/dist/stream/index.js +363 -4
  433. package/dist/stream/index.js.map +1 -1
  434. package/dist/stream/types.cjs +0 -4
  435. package/dist/stream/types.d.cts +2 -2
  436. package/dist/stream/types.d.ts +2 -2
  437. package/dist/stream/types.js +1 -3
  438. package/dist/suggestions-BH3x7xU7.d.cts +438 -0
  439. package/dist/suggestions-BH3x7xU7.d.ts +438 -0
  440. package/dist/syncActions/index.cjs +3 -19
  441. package/dist/syncActions/index.d.cts +2 -67
  442. package/dist/syncActions/index.d.ts +2 -67
  443. package/dist/syncActions/index.js +2 -10
  444. package/dist/syncActions/types.cjs +0 -4
  445. package/dist/syncActions/types.d.cts +2 -614
  446. package/dist/syncActions/types.d.ts +2 -614
  447. package/dist/syncActions/types.js +1 -3
  448. package/dist/syncActions-AgFiMjRS.js +497 -0
  449. package/dist/syncActions-AgFiMjRS.js.map +1 -0
  450. package/dist/syncActions-DPcAPYgJ.cjs +504 -0
  451. package/dist/syncActions-DPcAPYgJ.cjs.map +1 -0
  452. package/dist/tag-CsoOZWB_.cjs +175 -0
  453. package/dist/tag-CsoOZWB_.cjs.map +1 -0
  454. package/dist/tag-DCsoewjL.js +164 -0
  455. package/dist/{chunk-WUFODWZV.js.map → tag-DCsoewjL.js.map} +1 -1
  456. package/dist/telemetry/index.cjs +3 -14
  457. package/dist/telemetry/index.d.cts +10 -10
  458. package/dist/telemetry/index.d.ts +10 -10
  459. package/dist/telemetry/index.js +2 -5
  460. package/dist/telemetry/types.cjs +0 -4
  461. package/dist/telemetry/types.d.cts +2 -12
  462. package/dist/telemetry/types.d.ts +2 -12
  463. package/dist/telemetry/types.js +1 -3
  464. package/dist/telemetry-BLgaYEvi.cjs +29 -0
  465. package/dist/telemetry-BLgaYEvi.cjs.map +1 -0
  466. package/dist/telemetry-CPiGWpLi.js +24 -0
  467. package/dist/telemetry-CPiGWpLi.js.map +1 -0
  468. package/dist/{types-DM1glEQI.d.ts → types-056giLrn.d.cts} +8 -10
  469. package/dist/types-B1S60aS2.d.ts +373 -0
  470. package/dist/{types-Dpwb4dD0.d.ts → types-B2Al1BNh.d.ts} +8 -13
  471. package/dist/types-B2El99VY.d.cts +2835 -0
  472. package/dist/types-BHCigZFc.d.ts +32 -0
  473. package/dist/{types-ebolWqn1.d.ts → types-BIAP4CYp.d.cts} +27 -16
  474. package/dist/types-BJLRgXw0.d.ts +726 -0
  475. package/dist/types-BMsK6T5k.d.ts +2835 -0
  476. package/dist/types-BV74LS5r.d.ts +148 -0
  477. package/dist/types-BXnUqdBB.d.cts +621 -0
  478. package/dist/{types-nt7I4XNc.d.cts → types-Bc3-a3DT.d.cts} +7 -6
  479. package/dist/types-BdKtW2Ml.d.cts +23 -0
  480. package/dist/types-Bv5vw2dc.d.cts +726 -0
  481. package/dist/{types-BALUbGA5.d.ts → types-BvXODdf5.d.ts} +48 -80
  482. package/dist/types-By47HWwB.d.cts +386 -0
  483. package/dist/{types-DOc5_aYZ.d.ts → types-C0bGZqFI.d.cts} +16 -21
  484. package/dist/types-C2p7JYQ3.d.cts +373 -0
  485. package/dist/types-CFhAduFK.d.cts +2162 -0
  486. package/dist/{types-EZBBpiFU.d.ts → types-CIJAtX8q.d.cts} +238 -349
  487. package/dist/types-CIybfUJ9.d.cts +66 -0
  488. package/dist/{types-CFeOCzzg.d.cts → types-COFrOmuO.d.ts} +27 -16
  489. package/dist/{types-D2qGShlS.d.ts → types-CQd9PuKY.d.cts} +31 -106
  490. package/dist/{types-COti0FGo.d.ts → types-CgF9R0Na.d.ts} +9 -12
  491. package/dist/types-Co8WobOo.d.ts +2162 -0
  492. package/dist/{types-D6dnnju2.d.ts → types-CuAoZH8w.d.cts} +32 -30
  493. package/dist/{types-BsejtGjZ.d.ts → types-Culr5v8R.d.ts} +9 -15
  494. package/dist/{types-Y1ynT2PH.d.cts → types-D5VvEdOv.d.ts} +31 -106
  495. package/dist/{types-BuEkMmKT.d.ts → types-D7YGPUsm.d.ts} +219 -234
  496. package/dist/types-DG_FlLJt.d.cts +2088 -0
  497. package/dist/{types-BcaALDYY.d.cts → types-DLazCdFR.d.cts} +9 -15
  498. package/dist/types-DMMMQuNt.d.ts +2088 -0
  499. package/dist/{types-Bp8d9PJf.d.cts → types-DN7RWWBw.d.ts} +16 -21
  500. package/dist/{types-DNyZ0z3L.d.cts → types-DQOOWgLt.d.cts} +219 -234
  501. package/dist/{types-DrGnvgkB.d.ts → types-DSBNqF1J.d.cts} +9 -14
  502. package/dist/{types-BCBF_5cU.d.cts → types-DWUd__fe.d.ts} +32 -30
  503. package/dist/types-DdeZK3BO.d.ts +386 -0
  504. package/dist/types-Dirp9mni.d.ts +66 -0
  505. package/dist/{types-CfzHhZVG.d.ts → types-DkoyCUqv.d.ts} +7 -6
  506. package/dist/{types-Cffam0Nw.d.ts → types-DnOGCb-p.d.cts} +105 -80
  507. package/dist/{types-CniF_D1P.d.cts → types-Drk7PEhk.d.ts} +8 -10
  508. package/dist/types-DyIKgbGB.d.ts +621 -0
  509. package/dist/{types-qvle4Ydu.d.cts → types-RmbvQimP.d.ts} +105 -80
  510. package/dist/types-SX78XZZ0.d.ts +23 -0
  511. package/dist/{types-cxk-0ftN.d.cts → types-X-gQF8F8.d.ts} +238 -349
  512. package/dist/types-ca-YNg1r.d.cts +148 -0
  513. package/dist/{types-CwAYn1EJ.d.cts → types-eP06LqcE.d.cts} +48 -80
  514. package/dist/types-lFsTSkhe.d.cts +14 -0
  515. package/dist/types-lFsTSkhe.d.ts +14 -0
  516. package/dist/{types-Bom93Zx2.d.cts → types-lVXf05pr.d.ts} +9 -14
  517. package/dist/types-mXM8MrYS.d.cts +32 -0
  518. package/dist/{types-BPKQRahf.d.cts → types-sTH4KiPc.d.cts} +8 -13
  519. package/dist/{types-CxAH36ip.d.cts → types-uP64XthM.d.cts} +9 -12
  520. package/dist/validateConnectionStatus-CBhXmvWC.js +38 -0
  521. package/dist/validateConnectionStatus-CBhXmvWC.js.map +1 -0
  522. package/dist/validateConnectionStatus-DVHXGTdi.cjs +55 -0
  523. package/dist/validateConnectionStatus-DVHXGTdi.cjs.map +1 -0
  524. package/dist/vault/index.cjs +49 -13
  525. package/dist/vault/index.cjs.map +1 -1
  526. package/dist/vault/index.d.cts +2 -27
  527. package/dist/vault/index.d.ts +2 -27
  528. package/dist/vault/index.js +49 -5
  529. package/dist/vault/index.js.map +1 -1
  530. package/dist/vault/types.cjs +0 -4
  531. package/dist/vault/types.d.cts +2 -385
  532. package/dist/vault/types.d.ts +2 -385
  533. package/dist/vault/types.js +1 -3
  534. package/package.json +46 -7
  535. package/surface/apps.md +2 -2
  536. package/surface/auth.md +9 -2
  537. package/surface/chat.md +2 -2
  538. package/surface/dataScience.md +2 -2
  539. package/surface/kaiAgent.md +2 -1
  540. package/surface/queryService.md +4 -3
  541. package/surface/queue.md +2 -1
  542. package/surface/sdk.md +8 -8
  543. package/surface/storage.md +40 -35
  544. package/surface/syncActions.md +2 -2
  545. package/dist/ManagementClientAuthError-4J0S5tV-.d.ts +0 -9
  546. package/dist/ManagementClientAuthError-CyDpa4NS.d.cts +0 -9
  547. package/dist/adminRoles-BSUPLfNf.d.cts +0 -12
  548. package/dist/adminRoles-BSUPLfNf.d.ts +0 -12
  549. package/dist/ai/types.cjs.map +0 -1
  550. package/dist/ai/types.js.map +0 -1
  551. package/dist/appLogs-BbgAJ5I8.d.cts +0 -7
  552. package/dist/appLogs-BbgAJ5I8.d.ts +0 -7
  553. package/dist/apps/types.cjs.map +0 -1
  554. package/dist/apps/types.js.map +0 -1
  555. package/dist/auth/index.cjs.map +0 -1
  556. package/dist/auth/index.js.map +0 -1
  557. package/dist/auth/types.cjs.map +0 -1
  558. package/dist/auth/types.js.map +0 -1
  559. package/dist/backends-UNp_e5y9.d.cts +0 -7
  560. package/dist/backends-UNp_e5y9.d.ts +0 -7
  561. package/dist/chunk-22E6IGXR.js +0 -6
  562. package/dist/chunk-22E6IGXR.js.map +0 -1
  563. package/dist/chunk-24YVNNAG.js +0 -83
  564. package/dist/chunk-24YVNNAG.js.map +0 -1
  565. package/dist/chunk-255CHZ3U.js +0 -200
  566. package/dist/chunk-255CHZ3U.js.map +0 -1
  567. package/dist/chunk-2BCH2U57.js +0 -67
  568. package/dist/chunk-2BCH2U57.js.map +0 -1
  569. package/dist/chunk-2BQBKU6E.js +0 -270
  570. package/dist/chunk-2BQBKU6E.js.map +0 -1
  571. package/dist/chunk-2JKTV7UG.cjs +0 -35
  572. package/dist/chunk-2JKTV7UG.cjs.map +0 -1
  573. package/dist/chunk-3UBGQFBU.js +0 -29
  574. package/dist/chunk-3UBGQFBU.js.map +0 -1
  575. package/dist/chunk-4RC5E3SL.js +0 -140
  576. package/dist/chunk-4RC5E3SL.js.map +0 -1
  577. package/dist/chunk-552FC4ZV.js +0 -14
  578. package/dist/chunk-552FC4ZV.js.map +0 -1
  579. package/dist/chunk-57Q4CY4H.js +0 -190
  580. package/dist/chunk-57Q4CY4H.js.map +0 -1
  581. package/dist/chunk-5A3AQIXR.js +0 -14
  582. package/dist/chunk-5HEIR4DC.js +0 -39
  583. package/dist/chunk-5HEIR4DC.js.map +0 -1
  584. package/dist/chunk-5SR2L35Y.cjs +0 -1828
  585. package/dist/chunk-5SR2L35Y.cjs.map +0 -1
  586. package/dist/chunk-62LG5KPI.js +0 -285
  587. package/dist/chunk-62LG5KPI.js.map +0 -1
  588. package/dist/chunk-67P5UI6H.js +0 -58
  589. package/dist/chunk-67P5UI6H.js.map +0 -1
  590. package/dist/chunk-6PVEHUJL.cjs +0 -1308
  591. package/dist/chunk-6PVEHUJL.cjs.map +0 -1
  592. package/dist/chunk-6XFXU5N4.js +0 -119
  593. package/dist/chunk-6XFXU5N4.js.map +0 -1
  594. package/dist/chunk-6YZQIMML.cjs +0 -163
  595. package/dist/chunk-6YZQIMML.cjs.map +0 -1
  596. package/dist/chunk-6ZQBFK2Y.js +0 -24
  597. package/dist/chunk-6ZQBFK2Y.js.map +0 -1
  598. package/dist/chunk-7J2R6XHB.js +0 -3
  599. package/dist/chunk-7J2R6XHB.js.map +0 -1
  600. package/dist/chunk-AJ3SCWUB.cjs +0 -69
  601. package/dist/chunk-AJ3SCWUB.cjs.map +0 -1
  602. package/dist/chunk-AXYNFDUI.cjs +0 -43
  603. package/dist/chunk-AXYNFDUI.cjs.map +0 -1
  604. package/dist/chunk-B45B4AYG.js +0 -272
  605. package/dist/chunk-B45B4AYG.js.map +0 -1
  606. package/dist/chunk-B4T4QCLB.js +0 -116
  607. package/dist/chunk-B4T4QCLB.js.map +0 -1
  608. package/dist/chunk-BCZPCMGL.cjs +0 -49
  609. package/dist/chunk-BCZPCMGL.cjs.map +0 -1
  610. package/dist/chunk-BGJWHTBJ.js +0 -66
  611. package/dist/chunk-BGJWHTBJ.js.map +0 -1
  612. package/dist/chunk-BVRPZKRE.cjs +0 -147
  613. package/dist/chunk-BVRPZKRE.cjs.map +0 -1
  614. package/dist/chunk-BZB4UVQA.cjs +0 -192
  615. package/dist/chunk-BZB4UVQA.cjs.map +0 -1
  616. package/dist/chunk-CHRBWCL7.cjs +0 -472
  617. package/dist/chunk-CHRBWCL7.cjs.map +0 -1
  618. package/dist/chunk-CPZME73I.js +0 -16
  619. package/dist/chunk-CPZME73I.js.map +0 -1
  620. package/dist/chunk-DVV35AIS.js +0 -468
  621. package/dist/chunk-DVV35AIS.js.map +0 -1
  622. package/dist/chunk-E7GGDLAH.cjs +0 -202
  623. package/dist/chunk-E7GGDLAH.cjs.map +0 -1
  624. package/dist/chunk-EQPBR3BE.cjs +0 -85
  625. package/dist/chunk-EQPBR3BE.cjs.map +0 -1
  626. package/dist/chunk-ERZEQ5JR.js +0 -40
  627. package/dist/chunk-ERZEQ5JR.js.map +0 -1
  628. package/dist/chunk-ES3ADC2G.cjs +0 -18
  629. package/dist/chunk-ES3ADC2G.cjs.map +0 -1
  630. package/dist/chunk-EWMXK3EI.cjs +0 -8
  631. package/dist/chunk-EWMXK3EI.cjs.map +0 -1
  632. package/dist/chunk-FEAE6L3K.cjs +0 -60
  633. package/dist/chunk-FEAE6L3K.cjs.map +0 -1
  634. package/dist/chunk-FPB6OGTV.js +0 -26
  635. package/dist/chunk-FPB6OGTV.js.map +0 -1
  636. package/dist/chunk-FVU7WU2H.cjs +0 -66
  637. package/dist/chunk-FVU7WU2H.cjs.map +0 -1
  638. package/dist/chunk-FW5GBBKL.js +0 -67
  639. package/dist/chunk-FW5GBBKL.js.map +0 -1
  640. package/dist/chunk-G2SWCC3X.js +0 -90
  641. package/dist/chunk-G2SWCC3X.js.map +0 -1
  642. package/dist/chunk-G3JHVIDZ.cjs +0 -286
  643. package/dist/chunk-G3JHVIDZ.cjs.map +0 -1
  644. package/dist/chunk-G3N5KDEY.js +0 -10
  645. package/dist/chunk-G3N5KDEY.js.map +0 -1
  646. package/dist/chunk-HGKDXF35.js +0 -301
  647. package/dist/chunk-HGKDXF35.js.map +0 -1
  648. package/dist/chunk-HITKHHWN.cjs +0 -174
  649. package/dist/chunk-HITKHHWN.cjs.map +0 -1
  650. package/dist/chunk-HQO572JW.cjs +0 -34
  651. package/dist/chunk-HQO572JW.cjs.map +0 -1
  652. package/dist/chunk-HUQ5ATIL.cjs +0 -290
  653. package/dist/chunk-HUQ5ATIL.cjs.map +0 -1
  654. package/dist/chunk-HZDVMHU6.js +0 -344
  655. package/dist/chunk-HZDVMHU6.js.map +0 -1
  656. package/dist/chunk-ICWUR5WA.cjs +0 -68
  657. package/dist/chunk-ICWUR5WA.cjs.map +0 -1
  658. package/dist/chunk-IQFNHQWP.cjs +0 -47
  659. package/dist/chunk-IQFNHQWP.cjs.map +0 -1
  660. package/dist/chunk-IZ4QM7O4.js +0 -1304
  661. package/dist/chunk-IZ4QM7O4.js.map +0 -1
  662. package/dist/chunk-J5JCXSAS.cjs +0 -117
  663. package/dist/chunk-J5JCXSAS.cjs.map +0 -1
  664. package/dist/chunk-JI7HLIDL.cjs +0 -119
  665. package/dist/chunk-JI7HLIDL.cjs.map +0 -1
  666. package/dist/chunk-JWISA775.cjs +0 -92
  667. package/dist/chunk-JWISA775.cjs.map +0 -1
  668. package/dist/chunk-K3BLXPLA.cjs +0 -16
  669. package/dist/chunk-K3BLXPLA.cjs.map +0 -1
  670. package/dist/chunk-KATUDT3E.js +0 -45
  671. package/dist/chunk-KATUDT3E.js.map +0 -1
  672. package/dist/chunk-KGBWWS6I.js +0 -32
  673. package/dist/chunk-KGBWWS6I.js.map +0 -1
  674. package/dist/chunk-KQENBXPS.cjs +0 -34
  675. package/dist/chunk-KQENBXPS.cjs.map +0 -1
  676. package/dist/chunk-KTKJD4DM.js +0 -60
  677. package/dist/chunk-KTKJD4DM.js.map +0 -1
  678. package/dist/chunk-LNZP2O4P.js +0 -169
  679. package/dist/chunk-LNZP2O4P.js.map +0 -1
  680. package/dist/chunk-LWQP7OWA.js +0 -75
  681. package/dist/chunk-LWQP7OWA.js.map +0 -1
  682. package/dist/chunk-MRHQJNWF.cjs +0 -8
  683. package/dist/chunk-MRHQJNWF.cjs.map +0 -1
  684. package/dist/chunk-MSI6FVGG.js +0 -6
  685. package/dist/chunk-MSI6FVGG.js.map +0 -1
  686. package/dist/chunk-N4COL54U.cjs +0 -22
  687. package/dist/chunk-N4COL54U.cjs.map +0 -1
  688. package/dist/chunk-NFJKJGXR.js +0 -397
  689. package/dist/chunk-NFJKJGXR.js.map +0 -1
  690. package/dist/chunk-NH2TQGRL.cjs +0 -28
  691. package/dist/chunk-NH2TQGRL.cjs.map +0 -1
  692. package/dist/chunk-NHYL5QPM.js +0 -74
  693. package/dist/chunk-NHYL5QPM.js.map +0 -1
  694. package/dist/chunk-ON4ILCHP.js +0 -1822
  695. package/dist/chunk-ON4ILCHP.js.map +0 -1
  696. package/dist/chunk-PLF4JX5B.cjs +0 -155
  697. package/dist/chunk-PLF4JX5B.cjs.map +0 -1
  698. package/dist/chunk-PSR3N4NC.js +0 -136
  699. package/dist/chunk-PSR3N4NC.js.map +0 -1
  700. package/dist/chunk-QHD4LPAQ.cjs +0 -8
  701. package/dist/chunk-QHD4LPAQ.cjs.map +0 -1
  702. package/dist/chunk-QNF3L4B7.js +0 -115
  703. package/dist/chunk-QNF3L4B7.js.map +0 -1
  704. package/dist/chunk-RBN3ITTM.js +0 -153
  705. package/dist/chunk-RBN3ITTM.js.map +0 -1
  706. package/dist/chunk-RRC5RKF7.cjs +0 -12
  707. package/dist/chunk-RRC5RKF7.cjs.map +0 -1
  708. package/dist/chunk-RXYT7EMN.cjs +0 -318
  709. package/dist/chunk-RXYT7EMN.cjs.map +0 -1
  710. package/dist/chunk-S46FMY4G.cjs +0 -64
  711. package/dist/chunk-S46FMY4G.cjs.map +0 -1
  712. package/dist/chunk-S6BWQKHJ.cjs +0 -116
  713. package/dist/chunk-S6BWQKHJ.cjs.map +0 -1
  714. package/dist/chunk-SFTI6QFB.cjs +0 -85
  715. package/dist/chunk-SFTI6QFB.cjs.map +0 -1
  716. package/dist/chunk-SNP577FA.cjs +0 -346
  717. package/dist/chunk-SNP577FA.cjs.map +0 -1
  718. package/dist/chunk-SUVM3S2T.cjs +0 -69
  719. package/dist/chunk-SUVM3S2T.cjs.map +0 -1
  720. package/dist/chunk-SYZ5OFNT.js +0 -114
  721. package/dist/chunk-SYZ5OFNT.js.map +0 -1
  722. package/dist/chunk-SZBW4EE2.cjs +0 -180
  723. package/dist/chunk-SZBW4EE2.cjs.map +0 -1
  724. package/dist/chunk-T526LPBK.js +0 -6
  725. package/dist/chunk-T526LPBK.js.map +0 -1
  726. package/dist/chunk-TBHJQCAE.js +0 -64
  727. package/dist/chunk-TBHJQCAE.js.map +0 -1
  728. package/dist/chunk-U3E5YMLO.cjs +0 -82
  729. package/dist/chunk-U3E5YMLO.cjs.map +0 -1
  730. package/dist/chunk-U5SE6W5M.cjs +0 -158
  731. package/dist/chunk-U5SE6W5M.cjs.map +0 -1
  732. package/dist/chunk-UUY6LQT6.cjs +0 -267
  733. package/dist/chunk-UUY6LQT6.cjs.map +0 -1
  734. package/dist/chunk-UVX733BX.js +0 -83
  735. package/dist/chunk-UVX733BX.js.map +0 -1
  736. package/dist/chunk-V6FT3RTU.cjs +0 -42
  737. package/dist/chunk-V6FT3RTU.cjs.map +0 -1
  738. package/dist/chunk-VB56OVFM.cjs +0 -312
  739. package/dist/chunk-VB56OVFM.cjs.map +0 -1
  740. package/dist/chunk-WQ7NNIJ3.js +0 -33
  741. package/dist/chunk-WQ7NNIJ3.js.map +0 -1
  742. package/dist/chunk-WUFODWZV.js +0 -177
  743. package/dist/chunk-WUJ53PP7.cjs +0 -76
  744. package/dist/chunk-WUJ53PP7.cjs.map +0 -1
  745. package/dist/chunk-XPDEQND7.cjs +0 -4
  746. package/dist/chunk-XPDEQND7.cjs.map +0 -1
  747. package/dist/chunk-YDOSWWE4.cjs +0 -419
  748. package/dist/chunk-YDOSWWE4.cjs.map +0 -1
  749. package/dist/chunk-YGEJDWGG.js +0 -19
  750. package/dist/chunk-YGEJDWGG.js.map +0 -1
  751. package/dist/chunk-YXGBD4WP.cjs +0 -16
  752. package/dist/chunk-YXGBD4WP.cjs.map +0 -1
  753. package/dist/chunk-ZOREOLGE.js +0 -264
  754. package/dist/chunk-ZOREOLGE.js.map +0 -1
  755. package/dist/constants/index.cjs.map +0 -1
  756. package/dist/constants/index.js.map +0 -1
  757. package/dist/createFetchClient-BHAsPDgF.d.cts +0 -86
  758. package/dist/createFetchClient-CFIwc6Lh.d.ts +0 -86
  759. package/dist/createGenericFetchClient-JcbIIqwF.d.cts +0 -18
  760. package/dist/createGenericFetchClient-ZGG5wbAC.d.ts +0 -18
  761. package/dist/createOpenapiFetchClient-CduEua6F.d.cts +0 -24
  762. package/dist/createOpenapiFetchClient-wLlVgp3k.d.ts +0 -24
  763. package/dist/dataScience/index.cjs.map +0 -1
  764. package/dist/dataScience/index.js.map +0 -1
  765. package/dist/dataScience/types.cjs.map +0 -1
  766. package/dist/dataScience/types.js.map +0 -1
  767. package/dist/domain/permissions/index.cjs.map +0 -1
  768. package/dist/domain/permissions/index.js.map +0 -1
  769. package/dist/domain/storageTable/index.cjs.map +0 -1
  770. package/dist/domain/storageTable/index.js.map +0 -1
  771. package/dist/editor/types.cjs.map +0 -1
  772. package/dist/editor/types.js.map +0 -1
  773. package/dist/encryption/types.cjs.map +0 -1
  774. package/dist/encryption/types.js.map +0 -1
  775. package/dist/import/index.cjs.map +0 -1
  776. package/dist/import/index.js.map +0 -1
  777. package/dist/keboolaUID-D1DGSbge.d.cts +0 -19
  778. package/dist/keboolaUID-D1DGSbge.d.ts +0 -19
  779. package/dist/management/index.cjs.map +0 -1
  780. package/dist/management/index.js.map +0 -1
  781. package/dist/management/types.cjs.map +0 -1
  782. package/dist/management/types.js.map +0 -1
  783. package/dist/metastore/index.cjs.map +0 -1
  784. package/dist/metastore/index.js.map +0 -1
  785. package/dist/metastore/types.cjs.map +0 -1
  786. package/dist/metastore/types.js.map +0 -1
  787. package/dist/notifications/types.cjs.map +0 -1
  788. package/dist/notifications/types.js.map +0 -1
  789. package/dist/oauth/index.cjs.map +0 -1
  790. package/dist/oauth/index.js.map +0 -1
  791. package/dist/oauth/types.cjs.map +0 -1
  792. package/dist/oauth/types.js.map +0 -1
  793. package/dist/omnisearch/types.cjs.map +0 -1
  794. package/dist/omnisearch/types.js.map +0 -1
  795. package/dist/project-Dmr-zrQG.d.ts +0 -17
  796. package/dist/project-DstzWVMN.d.cts +0 -17
  797. package/dist/queryService/index.cjs.map +0 -1
  798. package/dist/queryService/index.js.map +0 -1
  799. package/dist/queryService/types.cjs.map +0 -1
  800. package/dist/queryService/types.js.map +0 -1
  801. package/dist/queue/index.cjs.map +0 -1
  802. package/dist/queue/index.js.map +0 -1
  803. package/dist/queue/types.cjs.map +0 -1
  804. package/dist/queue/types.js.map +0 -1
  805. package/dist/registry-CcKlB-yY.d.ts +0 -1046
  806. package/dist/registry-Cg0Yng1z.d.cts +0 -1046
  807. package/dist/scheduler/types.cjs.map +0 -1
  808. package/dist/scheduler/types.js.map +0 -1
  809. package/dist/sdk/configurations/index.cjs.map +0 -1
  810. package/dist/sdk/configurations/index.js.map +0 -1
  811. package/dist/sdk/semanticLayer/types.cjs.map +0 -1
  812. package/dist/sdk/semanticLayer/types.js.map +0 -1
  813. package/dist/sdk/tag/index.cjs.map +0 -1
  814. package/dist/sdk/tag/index.js.map +0 -1
  815. package/dist/sdk/tag/types.cjs.map +0 -1
  816. package/dist/sdk/tag/types.js.map +0 -1
  817. package/dist/status/types.cjs.map +0 -1
  818. package/dist/status/types.js.map +0 -1
  819. package/dist/storage/index.cjs.map +0 -1
  820. package/dist/storage/index.js.map +0 -1
  821. package/dist/storage/types.cjs.map +0 -1
  822. package/dist/storage/types.js.map +0 -1
  823. package/dist/storageClient-BAid0vi2.d.cts +0 -1750
  824. package/dist/storageClient-BX50Attd.d.ts +0 -1750
  825. package/dist/storageSdk-BS5982c_.d.cts +0 -753
  826. package/dist/storageSdk-BeJcnEIO.d.ts +0 -753
  827. package/dist/stream/types.cjs.map +0 -1
  828. package/dist/stream/types.js.map +0 -1
  829. package/dist/syncActions/index.cjs.map +0 -1
  830. package/dist/syncActions/index.js.map +0 -1
  831. package/dist/syncActions/types.cjs.map +0 -1
  832. package/dist/syncActions/types.js.map +0 -1
  833. package/dist/telemetry/index.cjs.map +0 -1
  834. package/dist/telemetry/index.js.map +0 -1
  835. package/dist/telemetry/types.cjs.map +0 -1
  836. package/dist/telemetry/types.js.map +0 -1
  837. package/dist/types-C5DdOzx8.d.cts +0 -12
  838. package/dist/types-C_jxWM7A.d.ts +0 -12
  839. package/dist/types-UwuKN9Kx.d.cts +0 -60
  840. package/dist/types-UwuKN9Kx.d.ts +0 -60
  841. package/dist/types-f8dUjMX4.d.cts +0 -90
  842. package/dist/types-f8dUjMX4.d.ts +0 -90
  843. package/dist/vault/types.cjs.map +0 -1
  844. package/dist/vault/types.js.map +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,1785 @@
1
+ # @keboola/api-client
2
+
3
+ ## 31.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add `URLS.CLIENT_CHATGPT_DOWNLOAD` to `@keboola/api-client/constants`. The connect surfaces send a reader to the ChatGPT app itself now that its plugins view is where the Keboola plugin is installed, so the "do not have it yet?" link needs a download page alongside the existing `CLIENT_CODEX_QUICKSTART`, which points at the Codex CLI docs and is still the right link for the CLI.
8
+
9
+ - The storage and auth clients reject a successful response that carries an HTML page instead of data.
10
+
11
+ Connection serves the storage, management and auth APIs off one host, and answers an expired session with a redirect to the login screen. `fetch` follows it, so the request resolves `200 text/html` — a success as far as the status code goes. `parseData` hands a non-JSON body back as a string, and `createOpenapiFetchClient` asserts its return type (`createFetchClient(...) as FetchClient<Paths>`), so that string reached the caller typed as the endpoint's DTO. Nothing failed at the request; the first Immutable accessor to read the value did, modules away and with no trace of the response that caused it.
12
+
13
+ Such a response is now an `HtmlResponseError` (an `ApiError`, with an `isHtmlResponseError` guard), raised where the request completes. HTML on a _failed_ response stays an ordinary `ApiError`: that is a real error page, such as a proxy's 502, and reading it as a broken payload would relabel a transient upstream blip.
14
+
15
+ What this buys is diagnosability, not a new recovery path. The user-facing outcome on an expired session is unchanged in kind — a generic error toast — but the error now names the request instead of surfacing as a `TypeError` in an unrelated module.
16
+
17
+ The check is opted into per client rather than added to `defaultValidateStatus`, because some APIs do serve HTML from a 200 on purpose: the Swagger documentation pages, and developer-portal's `acceptVendorInvitation`. The management client already guarded this condition; the check it used is now `isHtmlResponse`, shared from the fetch client, and management keeps its own `ManagementClientAuthError` and the session-expiry handling that goes with it.
18
+
19
+ Still reachable, and not addressed here: `parseData` returns `null` for a 204 and for an empty JSON body, which the same type assertion turns into a DTO.
20
+
21
+ - Carry a login MFA challenge's passkey options through `login.withPassword` / `login.withOidc`.
22
+
23
+ `mfaChallengeSchema` gained a `webauthn` field, so the serialized `PublicKeyCredentialRequestOptionsJSON` the auth service inlines for a passkey challenge survive parsing instead of being stripped. It is typed `unknown` on purpose: the field sits inside a union the client hard-parses, so validating its shape here would let one unexpected key fail both branches and block sign-in entirely rather than just the passkey path — whoever runs the ceremony validates it instead.
24
+
25
+ Also exported: `MFA_METHOD` (`totp` / `webauthn` / `recovery_code`, bound to the generated spec with `satisfies`) and the `MfaChallenge` type, so callers can branch on `mfaType` and `allowedMethods` rather than assuming TOTP.
26
+
27
+ - kai-agent grows `GET /api/chat/{id}/sandbox/file/download` — the binary counterpart of the `/sandbox/file` text preview, for deliverables the agent renders in its sandbox (a `.docx`, a `.pptx`) that the preview returns as empty `encoding: "binary"` content. Same three-layer path policy as the preview (normalize + ignored-segment filter + parent-listing allowlist, now shared via the extracted `assertListedInParent`/`readFileBytes` helpers), with two download-only tightenings: `.env*` files are refused (a raw env download is a credential-exfiltration primitive even where the text preview stays convenient), and files over a 50 MiB ceiling are refused with 413 rather than silently truncated. Responses are always `application/octet-stream` + `Content-Disposition: attachment` (RFC 5987 for non-ASCII names) + `nosniff`. `api-client` adds the matching `kaiAgent.downloadSandboxFile(chatId, path)` returning a `Blob`, riding the normal fetch pipeline (auth middlewares, refresh+replay) — `parseData` now hands a declared `application/octet-stream` body back as a `Blob` instead of UTF-8-decoding it via `text()`.
28
+
29
+ Alongside it, session-token chat binding: `Principal` gains optional `boundChatId`, the jwt host sets it from its `scope_id` claim (which is the chat id its host minted the token for), and a `requireChatScope` middleware on every `/api/chat/{id}*` route (plus `POST /api/chat`'s `body.id`) refuses a token bound to one chat acting on another — previously `scope_id` was attribution only, so a session token for chat A could stop, approve, or browse the sandbox of chat B owned by the same user. The Keboola host never sets the binding (its token id is a Storage token id), so Keboola-host behavior is unchanged.
30
+
31
+ Also fixes the sandbox file service's E2B connect to pass `E2B_DOMAIN`, matching the orchestrator — on a non-default E2B domain the file browser previously targeted the wrong control plane.
32
+
33
+ ## 30.0.0
34
+
35
+ ### Minor Changes
36
+
37
+ - Add passkey (WebAuthn) enrollment for the signed-in admin.
38
+
39
+ `@keboola/api-client` gains `api.auth.webauthn` — `getAll()`, `registerOptions()`, `register({ credential, deviceName?, revokeOtherSessions? })` and `remove({ id, revokeOtherSessions? })` over `/v1/auth/webauthn*`. `registerOptions()` widens the spec's free-form `options` object (which the generator flattens to `Record<string, never>`) so callers can read the serialized `PublicKeyCredentialCreationOptions` out of it.
40
+
41
+ `@keboola/auth` gains `PasskeyList` — a card listing the admin's registered passkeys with add and remove, host-agnostic like its siblings: the browser ceremony (`navigator.credentials.create()`) runs behind the `onRegister` prop. It reveals the recovery codes once when the passkey enabled the account's first MFA factor.
42
+
43
+ `MfaCard` takes a new optional `hasMfaFactor` prop. The card cannot read whether the account has a factor, so it used to offer "Regenerate recovery codes" only in the just-enrolled state — unreachable for an admin whose only factor is a passkey, whose codes are shown exactly once. A host that knows a factor exists (a non-empty passkey list is proof) now unlocks the button up front. Regeneration also actually renders its codes again: it answers `codes`, not the `recoveryCodes` the payload guard read, so a regenerated set was dropped while the server had already invalidated the previous one.
44
+
45
+ The create modals in `PasskeyList` and `PatList` no longer dismiss on an outside interaction. A host's step-up prompt is a sibling dialog layer, so cancelling it reached these modals as an outside click — after their in-flight guard had cleared, since Radix defers that decision to the document `click` — discarding the typed name.
46
+
47
+ - Export `Provider` and `Continent` from `@keboola/api-client/constants` as const objects, not only as types. Both were union type aliases, so a consumer that needed the runtime values — validating that an authored string names a real cloud, say — had to retype the vocabulary and let the two copies drift. They now follow the same const-object-plus-derived-type shape as `Backend` and `AdminRole`, so `Object.values(Provider)` is the single source and `Provider.Azure` is available at call sites. Type-only usage (`provider?: Provider`) is unchanged.
48
+
49
+ ### Patch Changes
50
+
51
+ - The published tarball now carries a `CHANGELOG.md`, so a consumer can read what changed in a release — breaking changes included — without leaving their `node_modules`.
52
+
53
+ It could not simply be added to `files`. This repo is private, so every reference `@changesets/changelog-github` emits is a dead link for anyone reading from npm: PR links, commit SHAs, author handles, and the Linear and cross-repo links that changeset prose carries. Across the publishable packages that came to 490 PR links, 863 commit links, 490 author credits and 102 dependency-bump blocks.
54
+
55
+ The published file is generated, not maintained. `scripts/public-changelog.mjs` removes those links ahead of the publish and leaves the prose. An identifier the author typed themselves stays as text — `UT-4009`, `connection#8040` — because it is part of the sentence and, without its URL, resolves to nothing outside Keboola. The repo-side `CHANGELOG.md` keeps every link, because that is how a release gets traced internally. It is rewritten only for the moment the tarballs are packed, then restored — which the release also depends on: `changesets/action` reads each changelog back off disk _after_ the publish command returns, to build that version's GitHub Release body, so without the restore the internal releases would carry the public text. A reference the rules do not cover fails the publish rather than shipping.
56
+
57
+ One incidental fix: a hex colour written as `#222529` in changeset prose had been autolinked into a link to issue 222529. Unwrapping restores the colour, so the published notes read as the author wrote them.
58
+
59
+ - Correct the `QueueJobStatus` documentation: `terminating` **is** a member of the union.
60
+
61
+ The generated `JobStatus` enum lists it, but the doc comment claimed it was only a `desiredStatus`
62
+ value. Reading it that way makes the natural "terminal or killable" split look exhaustive, so a
63
+ caller waiting for a job to stop treats `terminating` as an end state and continues while the
64
+ daemon is still shutting the job down. The comment now names it as the third case — neither
65
+ terminal nor killable — and separates it from the same-named `desiredStatus` value.
66
+
67
+ Comment only; no type or runtime change.
68
+
69
+ ## 29.0.0
70
+
71
+ ### Major Changes
72
+
73
+ - Model job statuses per service and add `jobStatus`.
74
+
75
+ The three services that expose jobs use separate status vocabularies, which
76
+ overlap by label only (`processing` belongs to all three), and the storage
77
+ client's `JobStatus` conflated them — it carried the queue's nine values, five of
78
+ which a storage job cannot report. It is replaced by `StorageJobStatus`,
79
+ `QueueJobStatus` and `QueryJobStatus`, the latter two derived from their specs.
80
+
81
+ `jobStatus.storage` / `.queue` / `.query` answer `isRunning(status)` /
82
+ `isTerminal` / `isSuccessful` / `isFailed` about one job, over that service's
83
+ `statuses.running` / `.successful` / `.failed` / `.terminal` — so a poll loop or a
84
+ UI check no longer restates a status list at every call site. A warning queue job
85
+ counts as successful: the run produced its output and only added a non-fatal
86
+ notice. `describe(status)` answers all four at once. Spread a group where an array is
87
+ wanted (an API `status` filter), `named.SUCCESS` gives a status by name, and
88
+ `isKnown` narrows an untyped string to a status of that service.
89
+
90
+ **Breaking:** `JobStatus` is gone from `@keboola/api-client/storage/types`; use
91
+ the per-service type. `JobResult` and the `storage_job_status` /
92
+ `excluded_storage_job_status` filters on `GetJobsQuery` are narrowed to
93
+ `StorageJobStatus`, so a queue-only value such as `terminated` or `cancelled` no
94
+ longer type-checks against a storage job.
95
+
96
+ - One poll engine, and a registry of what a client is waiting on.
97
+
98
+ `poll` replaces the previous engine and answers with a `PollResult` rather than
99
+ throwing: `done`, `timedOut`, `exhausted`, `aborted` or `errored`, each carrying
100
+ the attempt it ended on, the time it took, and the last answer it saw. A caller
101
+ whose contract is to throw calls `.unwrap()`, optionally with a mapper for an
102
+ error of its own.
103
+ - `isDone` becomes `until`, which is also the tick a subscriber reads; `interval`
104
+ becomes `backoff` (`constant`, `linear` or `exponential`, with jitter and a
105
+ ceiling, floored at 500ms and bounded by what a timer can hold); `isFailed` has
106
+ no equivalent — a failure state ends the wait like any other terminal one, and
107
+ the caller raises the error it deserves.
108
+ - `timeout` is a deadline rather than a check between attempts: it is linked into
109
+ the signal `pollFn` receives and raced against the request, so a request that
110
+ ignores its signal cannot outlast it.
111
+ - `isRetryable` decides whether a failed request ends the poll or spends an
112
+ attempt; it defaults to ending, as before.
113
+ - `poller` is the same poll before it runs, for a caller that starts it later or
114
+ watches it from elsewhere; `pollRegistry` lists every poll a client has going,
115
+ and is optional — collecting starts when a client asks for it.
116
+ - `PollException` is gone, along with `poll`'s result envelope: `{ data }` is now
117
+ `result.data` on `done`, or `await poll(…).unwrap()`.
118
+
119
+ `Result` gains a namespace over the same `{ success, data | error }` shape:
120
+ `Result.tryCatch`, `Result.tryCatchAsync`, `Result.fromThrowable` and
121
+ `Result.fromThrowableAsync`, with `createEmitter` beside `createStore` as the
122
+ half of it that announces.
123
+
124
+ ### Minor Changes
125
+
126
+ - New **Developer Portal** support for `apps-api.keboola.com` — the backend behind `components.keboola.com`. Paths and types are generated from the published spec (`https://apps-api.keboola.com/docs/openapi.yaml`, now registered in `redocly.yaml`), so `pnpm gen:types` refreshes them like every other client.
127
+
128
+ Two layers, matching the rest of the package:
129
+
130
+ ```ts
131
+ // The client plus the session that keeps it authenticated. Start here.
132
+ import { createDeveloperPortalSdk } from "@keboola/api-client/sdk/developerPortal";
133
+ // The pure client: one method per endpoint, no state. Enough for every `security: []` operation.
134
+ import { createDeveloperPortalClient } from "@keboola/api-client/developerPortal";
135
+ import type { App, Vendor } from "@keboola/api-client/developerPortal/types";
136
+ ```
137
+
138
+ Covers all 58 spec operations across four namespaces — `auth`, `vendors`, `apps`, `admin` — flat inside each, named `get*` / `create*` / `update*` / `delete*` with the noun on the method (`apps.getPublishedApps`, `admin.approveVendor`), matching `management` and `storage`. `createDeveloperPortalSdk` returns `{ api, session }` the way `createKeboola` does, and for the same reason — the credential is stateful. It stays separate from `createKeboola` because apps-api is its own identity domain (its own Cognito pool, its own token trio), so it is absent from `createServiceClients.ts` and never appears on the `api` proxy.
139
+
140
+ Three properties worth knowing:
141
+ - `Authorization` carries the **raw token with no `Bearer` prefix** — the spec's security schemes are `type: apiKey`, so `createBearerAuthMiddleware` is not reusable and the SDK ships its own.
142
+ - **Two fetch clients.** The authenticated one stamps the id token; the other carries no auth and backs the operations the spec marks `security: []`, plus the four calls that supply their own `Authorization`: `GET /auth/token` (refresh token), `POST /auth/logout` (access token), and `POST /auth/mfa` + `POST /auth/mfa/confirm` (id token, alongside an access token in the body). Those four take the token as an argument, and the SDK binds them from the session, so `api.auth.logout()` needs nothing from the caller.
143
+ - **The spec is the source of truth.** `types.ts` derives every shape from the generated schema, with no hand-written overlay. Two vendor shapes fall out of that: `GET /vendors` returns `isTrusted` as the raw MySQL tinyint (`VendorListItem`), every other vendor endpoint converts it to a boolean (`Vendor`). Outgoing payloads are no longer validated at runtime — the generated request types replace the zod schemas, which is how every other client in the package works.
144
+
145
+ `@keboola/api-fixtures` gains `fixtures.developerPortal` — apps across every publishing state, vendors including a pending `_v`-prefixed one, users, service accounts, and an app change log. Each is `satisfies`-checked against the generated types, so a fixture cannot carry a field the API does not return.
146
+
147
+ ### Patch Changes
148
+
149
+ - `syncActions.git` no longer demands a `username` alongside an SSH key. The component clones
150
+ `git@host:path` and never reads one on that path, so a deploy key has none to be sent with —
151
+ requiring it made the branch and entrypoint listings clone a private repository anonymously.
152
+ A password still requires its username, which it genuinely cannot authenticate without.
153
+
154
+ ## 28.0.0
155
+
156
+ ### Major Changes
157
+
158
+ - Move `storage.events`, `storage.files`, `storage.jobs` and `storage.workspaces` onto the OpenAPI
159
+ client and derive their request and response types from the generated schema, so a field the backend
160
+ adds arrives with `pnpm gen:types` instead of being transcribed by hand.
161
+
162
+ Every path these namespaces hit is in the document, so the generic client is now confined to
163
+ `storage.buckets`, `storage.tables` and the host-level `healthCheck` — the one storage path the
164
+ document does not declare. `getStackInfo` moved too. Both clients are the same fetch client at
165
+ runtime, and every path string, params object and request option is unchanged, so this release is a
166
+ change of types and signatures rather than of behaviour.
167
+
168
+ Each operation now has its own `Path` / `Query` / `Body` alias derived over an inlined
169
+ `paths['…']`, composed into the `*Input` the method takes. Hand-authored types are left only where
170
+ the document is wrong or silent, each naming the defect it works around:
171
+ - `Workspace`, `StorageToken` and `StorageEvent` derive from a new `WorkspaceRaw` / `StorageTokenRaw`
172
+ / `StorageEventRaw` and override only the fields the document models badly. `Workspace` gains
173
+ `configurationVersion` and the document's `type: 'file' | 'table'`, which is stricter than the
174
+ `string` it replaces; `StorageEvent` gains a typed `attachments` and `project`.
175
+ - `WorkspaceConnection` stays hand-authored: the document's union carries neither `password`,
176
+ `account`, `port` nor `container`, which a workspace created through
177
+ `configurationWorkspaces.createConfigurationWorkspace` returns.
178
+ - `File`, `PreparedFile` and `CreatedEvent` stay hand-authored — no file or create-event operation
179
+ declares a response body, and no component schema describes one.
180
+ - Where the document types one id two ways, the aliases normalise to the number the payloads return
181
+ and the client stringifies for the operations whose segment is a `string`: `fileId` on the detail,
182
+ tag-create and tag-delete, `jobId` on the job detail, `workspaceId` on the delete, password and
183
+ public-key operations.
184
+ - `storage.tokens` no longer reaches into `components['schemas']`, and `CreateTokenBody` picks its
185
+ arm out of the operation's union by a field only the full request declares.
186
+
187
+ `storage.events` exposes only the branch-scoped endpoints. The unbranched twins answer the same
188
+ payloads and addressing one branch is the narrower request, so `getEvents`, `getEvent` and
189
+ `createEvent` all call `/v2/storage/branch/{branchId}/events…`. `branchId` is required on both reads;
190
+ `createEvent` keeps it optional and falls back to `default`, for writers that have no branch to
191
+ resolve.
192
+
193
+ Breaking, by namespace:
194
+ - **events** — `getEvents` and `getEvent` take a required `branchId`; `getEvents` no longer defaults
195
+ its argument. `TableEvent` is removed: one `StorageEvent` now types every feed, and the old
196
+ `StorageEvent` (the create response, keyed by `id` and `createdTime`) is `CreatedEvent`.
197
+ `GetObjectEventsQuery` splits into `GetTableEventsQuery` and `GetBucketEventsQuery`; `EventPath`
198
+ and `EventsPath` give way to per-endpoint `GetEventPath` / `GetEventsPath` / `CreateEventPath`.
199
+ - **files** — `DeleteFileTagPath` names the tag `tagName`, as the document's path segment does, and
200
+ `deleteFileTag`'s second parameter follows. `FilePath` splits into `GetFilePath`,
201
+ `DeleteFilePath`, `GetFileContentPath` and `AddFileTagPath`; `AddFileTagInput` is new.
202
+ - **jobs** — `GetJobPath` names the id `jobId`, as the document does, and `getJob`'s parameter
203
+ follows. `GetJobsQuery` derives every filter but the two repeatable ones, whose document names
204
+ carry the `[]` the serializer appends.
205
+ - **workspaces** — `getWorkspaces` takes `{ branchId }` rather than a positional id. `WorkspacePath`
206
+ and `WorkspacesPath` give way to per-endpoint paths (`GetWorkspacePath`,
207
+ `GetWorkspaceObjectsPath`, `DeleteWorkspacePath`, …), and `branchId` narrows from `number | string`
208
+ to the document's `string`, so the exported `BranchId` and `DeleteWorkspaceQuery` are gone.
209
+ - **mergeRequests** — `CreateMergeRequestParams` and `UpdateMergeRequestParams` are
210
+ `CreateMergeRequestBody` and `UpdateMergeRequestBody`, and `updateMergeRequest` takes one
211
+ `UpdateMergeRequestInput` (`{ id, ...body }`) rather than a positional id plus a body, matching its
212
+ siblings in `tokens` and `buckets`.
213
+ - **tokens** — `CreateTokenRequestSchema`, `UpdateTokenRequestSchema` and `ShareTokenRequestSchema`
214
+ are `CreateTokenSchemaBody`, `UpdateTokenSchemaBody` and `ShareTokenSchemaBody`, matching every
215
+ other spec-derived body in the client. `getTokenEvents` is new.
216
+
217
+ - Make the `storage.tables` and `storage.columns` writes branch-aware, and fill the gaps the kbc-ui
218
+ table migration surfaced.
219
+
220
+ Every method whose operation the Storage document declares under `/v2/storage/branch/{branchId}/`
221
+ now takes an explicit `branchId` and calls that path instead of the unbranched one, so a dev-branch
222
+ write no longer depends on a caller-side URL rewrite: `createTableAsync`,
223
+ `createTableDefinitionAsync`, `importAsync`, `deleteTable`, `deleteTables`, `deleteTableRows`,
224
+ `columns.addTableColumnAsync`, `columns.deleteTableColumnAsync`,
225
+ `columns.createTablePrimaryKeyAsync` and `columns.removeTablePrimaryKeyAsync`. `updateTable`,
226
+ `createAliasTable`, `setAliasTableFilter` and `removeAliasTableFilter` stay unbranched — the
227
+ document declares no branch-scoped variant for them (and for `updateTable` / `createAliasTable`, no
228
+ operation at all). `exportAsync` is the one exception that _does_ have a branch-scoped path in the
229
+ document but keeps the unbranched one: export sits outside this migration's scope, so moving it
230
+ would change behaviour for a flow nothing else here touches. It is called out in place as a
231
+ follow-up.
232
+
233
+ Every `*Input` in `storage.tables` now derives its path parameters from the document with
234
+ `OpenapiPathType` instead of hand-writing them, and keeps the document's own parameter names, as
235
+ `columns` already did — so the table id is `id` on `getTable`, `deleteTable`, `deleteTableRows`,
236
+ `importAsync`, `pullTableAsync` and the two metadata methods, `tableId` on `getDataPreview`,
237
+ `exportAsync`, `setAliasTableFilter` and `updateTableDefinition`, and the bucket id is `id` on
238
+ `createTableAsync` but `bucketId` on `createTableDefinitionAsync`. The document is inconsistent and
239
+ mirroring it is deliberate: a call site stays diffable against the endpoint it hits. `deleteTables`
240
+ takes `ids`. That caught three
241
+ paths whose templates had drifted from the document — `createTableAsync`, `exportAsync` and the two
242
+ `alias-filter` methods — all of which went through the generic client, where the template is not
243
+ checked. The URLs they build are unchanged; only the placeholder names were wrong. Those four have
244
+ now moved onto the OpenAPI client, leaving `updateTable` and `createAliasTable` as the only generic
245
+ calls in the namespace — the two the document has no operation for.
246
+
247
+ Signature changes beyond the added `branchId`:
248
+ - `deleteTable` takes a `DeleteTableInput` (`{ branchId, id, force? }`) instead of a positional id,
249
+ so a table with aliases or links pointing at it can be dropped the way the API allows.
250
+ `deleteTables` takes `{ branchId, ids, force? }`.
251
+ - `removeTablePrimaryKeyAsync` takes `{ branchId, tableId }` instead of a positional id.
252
+ - `pullTableAsync` and `updateTableDefinition` require `branchId` — it used to default to `'default'`
253
+ inside the method. A path parameter is part of the URL, so which branch is addressed is the
254
+ caller's call, not a default the client picks for them.
255
+ - `deleteTableRows` accepts `allowTruncate`, which the endpoint requires when no filter is given —
256
+ without it a filterless delete is refused as an `unintendedTruncation` instead of truncating.
257
+ - `GetTablesQuery.include` accepts `sourceMetadata` and `sourceColumnMetadata`, both of which the
258
+ endpoint documents and kbc-ui asks for.
259
+ - `CreateTableAsyncBody` is now derived per variant, each correcting the document the same way the
260
+ hand-authored file variant already did: `primaryKey` and `distributionKey` are optional
261
+ comma-separated **strings**, not required `string[]` (the backend rejects an array), and
262
+ `timestampType` is optional. `CreateTableAsyncFromWorkspaceBody` additionally requires one of
263
+ `dataObject` / `dataTableName`. Verified against connection's `Storage/Tables/Create/Request`.
264
+ - `CreateTableAsyncBody` and `TableImportAsyncBody` allow exactly one source key. Both endpoints pick
265
+ the variant from whichever of `dataFileId` / `snapshotId` / `sourceTableId` / `dataWorkspaceId` is
266
+ populated and reject more than one ("Only one source can be provided"), which a union of
267
+ standalone per-variant schemas otherwise permits together.
268
+ - `deleteTableRows` resolves to `Job<'tableRowsDelete'>` rather than a bare `Job` (which widened to
269
+ `JobUnion`), so its `results.deletedRows` is typed. The operation joins `JobOperation`.
270
+ - `TableCreateJob`, `TableExportJob` and `TableImportJob` are no longer exported — the namespace
271
+ spells every job return `Job<'operationName'>`, as the rest of the storage client already did, and
272
+ these three were the only aliases used directly. `Job<'tableCreate'>` and friends resolve to the
273
+ identical types, so this is a rename of the import, not a change of shape.
274
+ - `sdk.storage.createTable`, `createTableDefinition`, `importFromFile`, `addTableColumn`,
275
+ `deleteTableColumn`, `createTablePrimaryKey` and `removeTablePrimaryKey` take a single `*Input`
276
+ object rather than positional ids plus a body, matching `createSnapshot` / `pullTable`.
277
+
278
+ ### Minor Changes
279
+
280
+ - Add `configurations.rebaseConfigurationToDeleted({ branchId, componentId, configId, version })` — resolves a merge conflict by deleting the configuration (posts the empty `diff` envelope to the same rebase endpoint; the new head version is a tombstone). Closes the "delete resolution not modeled in the SDK" gap left by the `diff`-envelope changeset (connection#8040, DMD-1890).
281
+
282
+ - `CreateTokenBody.bucketPermissions` is now typed as a map of bucket id to permission, which is what the API actually takes.
283
+
284
+ The OpenAPI spec declares `string[]`. Every real caller sends a map: kbc-ui's token form builds one in `tokenEditor/BucketsSelector` and submits it through `toJS()`, and a live create against a stack confirms the map is what the API accepts. The wrong type forced each caller into an `as unknown as string[]` cast, which hid the mismatch rather than recording it — so it is corrected here instead, alongside the two other spec corrections this file already carries for `admin` and `adminOwner`.
285
+
286
+ `UpdateTokenBody` shares the shape and moves with it. The integration smoke test's `bucketPermissions: []` becomes `{}` — the same "no bucket access" intent, in the shape the API expects.
287
+
288
+ ### Patch Changes
289
+
290
+ - Add `URLS.CLI` for the public Keboola CLI product page, alongside the existing `URLS.MCP`.
291
+
292
+ - Add `URLS.CLIENT_*` entries for the vendor client setup pages (Claude Code, Claude.ai, Claude Desktop, Cursor, VS Code, Codex, Make, Devin Desktop) linked from the connect surfaces.
293
+
294
+ - Build with tsdown (rolldown) instead of tsup; declarations are emitted by the native TS 7 compiler per entry. Peak build memory drops from ~7GB to ~0.8GB, so the `DTS=false` opt-out and the inflated `--max-old-space-size` are gone — every consumer, including Docker image builds on standard runners, now gets complete declarations. Output layout, `exports` map, and shipped types are unchanged (attw-verified); `build:check` now also fails if any manifest-referenced build output or declaration is missing from the pack.
295
+
296
+ ## 27.0.0
297
+
298
+ ### Major Changes
299
+
300
+ - `api.storage.bucketListings.getListing` / `getListings` now resolve to the spec's own response shapes
301
+ — `BucketListingDetail` and `ProjectBucketListing` — instead of a client-built `BucketListing` view
302
+ model. The mapping that
303
+ flattened `bigquery.*` up a level, injected `bucketId` and decoded subscribers is gone from the
304
+ client; **`BucketListing`, `RawBucketListingResponse` and `RawBucketListingRow` are removed** from
305
+ `@keboola/api-client/storage/types`.
306
+
307
+ Both listing endpoints are properly typed in the Storage spec, so the hand-authored `Raw*` types were
308
+ duplicating it — and they were duplicating it _wrongly_: they declared `bigquery` required where the
309
+ spec has `bigquery?: … | null` ("present only for BigQuery buckets"), so the mapper's
310
+ `raw.bigquery.listingId` was an unguarded read that a response without that section would have thrown
311
+ on. Reading `bigquery` as optional is now the caller's job, which is the point.
312
+
313
+ The subscriber codec stays here, because `user:`/`group:`-prefixed IAM principals are the wire format
314
+ rather than presentation, and the write path already had to know it. `toBackendSubscribers` and
315
+ `fromBackendSubscribers` are now **exported from `@keboola/api-client/storage`** so a consumer
316
+ rendering or editing subscribers decodes with the same function the writes encode with:
317
+
318
+ ```ts
319
+ import { fromBackendSubscribers } from "@keboola/api-client/storage";
320
+
321
+ const listing = await api.storage.bucketListings.getListing(bucketId);
322
+ const subscribers = fromBackendSubscribers(
323
+ listing?.bigquery?.subscribers ?? [],
324
+ );
325
+ ```
326
+
327
+ `fromBackendSubscribers` keeps skipping entries with an unknown prefix or an empty local part, so a
328
+ principal type the SDK doesn't model (`serviceAccount:`) reads as absent rather than breaking the
329
+ whole decode. That is a tolerance a caller now opts into explicitly instead of inheriting from a read.
330
+
331
+ `Subscriber`, `CreateBucketListingInput` and `UpdateBucketListingInput` are unchanged: the write
332
+ methods still take `{ type, email }` and encode on the way out.
333
+
334
+ - Split `storage.buckets` into four namespaces and fill in the gaps the kbc-ui migration surfaced.
335
+ - `storage.bucketSharing` — share/unshare/link/unlink plus `sharedBuckets`, and a new
336
+ `linkBucketAsync` for the link half of `POST /v2/storage/buckets` (which the client could not
337
+ express before), with the `bucketLink` job type behind it.
338
+ - `storage.bucketListings` — marketplace exposures and the `bigquery.subscribers` codec.
339
+ `listListings` is now `getListings`, and `create`/`updateListingAsync` take a single `*Input`.
340
+ - `storage.bucketExternal` — register, refresh and scheduled refresh.
341
+ - `storage.buckets` keeps CRUD, owner and metadata.
342
+
343
+ Method names are otherwise unchanged, but every method taking a path plus a body or query now takes
344
+ one `*Input` object, so positional call sites need updating: `getBuckets`, `updateBucket`,
345
+ `deleteBucketAsync`, `updateBucketOwner`, `shareBucketToProjectsAsync`, `shareBucketToUsersAsync`,
346
+ `forceUnlinkBucketAsync`, `refreshExternalBucketAsync`.
347
+
348
+ Also: `GetBucketsQuery.include` accepts `linkedBuckets`, `UpdateBucketBody` accepts `color`, the
349
+ `bucketRegister` / `bucketRefresh` jobs carry typed `results` instead of `null`, and
350
+ `register-guide` takes a plain `path: string[]` and serializes it as the repeatable `path[]` key the
351
+ API expects. `sdk.storage.getBucketListing` / `listBucketListings` are removed — call
352
+ `storage.bucketListings.getListing` / `.getListings` directly.
353
+
354
+ - Make `storage.bucketSharing`'s share/unshare/unlink operations branch-aware — they now hit
355
+ `/v2/storage/branch/{branchId}/buckets/…` and every one takes a single `*Input` object carrying
356
+ `branchId`:
357
+ - `shareBucketToOrganizationAsync({ branchId, bucketId })`
358
+ - `shareBucketToOrganizationProjectAsync({ branchId, bucketId })`
359
+ - `shareBucketToProjectsAsync({ branchId, bucketId, targetProjectIds })`
360
+ - `shareBucketToUsersAsync({ branchId, bucketId, targetUsers })`
361
+ - `unshareBucketAsync({ branchId, bucketId })`
362
+ - `forceUnlinkBucketAsync({ branchId, bucketId, linkedProjectId })`
363
+
364
+ `sdk.storage.shareBucketToOrganization` / `…OrganizationProject` / `…ToProjects` / `…ToUsers` /
365
+ `unshareBucket` / `forceUnlinkBucket` follow, each taking the same `*Input` in place of its
366
+ positional `bucketId` (+ body) arguments.
367
+
368
+ `linkBucketAsync` and `sharedBuckets` are unchanged.
369
+
370
+ The two stubbed request bodies are also typed from what the API accepts rather than the spec's
371
+ `Record<string, never>`: `targetProjectIds` is `number[]` and `targetUsers` is `(number | string)[]`
372
+ (admin ids or e-mails), where both were previously `string[]`.
373
+
374
+ - `api.storage.configurations.updateConfiguration` now resolves to `{ configuration, syncJobId }`, takes an optional `workspaceId`, and no longer JSON-encodes `configuration` itself.
375
+
376
+ Storage syncs a workspace's output mapping in a background job when a configuration update carries a `workspaceId`, and reports that job in an `X-StorageApi-Job-Id` response header. `updateConfiguration` resolved to the configuration alone and discarded the rest of the response, so there was no way to know whether a sync had been enqueued — let alone whether it had landed.
377
+
378
+ ```ts
379
+ const { configuration, syncJobId } =
380
+ await api.storage.configurations.updateConfiguration({
381
+ branchId,
382
+ componentId,
383
+ configId,
384
+ configuration: { parameters },
385
+ workspaceId, // optional; must be linked to this component and configuration
386
+ });
387
+
388
+ // The configuration write is done. The output-mapping sync is not.
389
+ if (syncJobId)
390
+ await poll({ pollFn: () => api.storage.jobs.getJob(syncJobId), isDone });
391
+ ```
392
+
393
+ **Breaking:** callers reading the configuration off the result destructure it instead.
394
+
395
+ ```diff
396
+ -const config = await api.storage.configurations.updateConfiguration(input);
397
+ +const { configuration: config } = await api.storage.configurations.updateConfiguration(input);
398
+ ```
399
+
400
+ `syncJobId` is `null` whenever no `workspaceId` was sent, and also for components outside Storage's sync allow-list, which ignore the parameter entirely — neither is a failed write. A `workspaceId` not linked to the given component and configuration is rejected with 400, before the configuration is written. `'workspaceOutputMappingSync'` joins `JobOperation` for typing the poll.
401
+
402
+ `configuration` is sent as the object it is, rather than being JSON-stringified into a string field first. Connection accepts both forms — its request extractor re-encodes an embedded object for exactly these fields — and the object form is the one that keeps `{}` an object instead of collapsing it to `[]`. It also makes update consistent with create, which has always passed the object through.
403
+
404
+ `CreateConfigurationBody` gains the optional `configurationId` Storage has always accepted, for callers mirroring an id from elsewhere — the same configuration in another branch, or a fixed id for a first-run flow — instead of letting Storage generate one. `configuration` becomes optional on create too: omitting it creates the configuration empty, which is what a "new configuration" flow with nothing filled in yet does.
405
+
406
+ - `api.syncActions.gitRepository` is replaced by `api.syncActions.git`, which covers **both** component families that serve a git repository action — the data apps (`git-repository`, settings under `parameters.dataApp.git.repository`) and the dbt transformations (`gitRepository`, under `parameters.git.repo`). Which action name and payload path a call uses is resolved from `componentId`, so a caller no longer picks a method per family:
407
+
408
+ ```ts
409
+ api.syncActions.git.getBranches(input, signal?); // -> GitBranch[]
410
+ api.syncActions.git.getEntrypoints(input, signal?); // -> GitEntrypoints
411
+ ```
412
+
413
+ The five previous methods (`getPublicGitRepository`, `getPrivateGitRepository`, `getDataAppPublicGitRepository`, `getDataAppPasswordPrivateGitRepository`, `getDataAppSSHKeyPrivateGitRepository`) collapse into `getBranches` because the credential is now a discriminated `auth` union rather than a method name. It keeps the components' own `#`-prefixed secret keys, so it is already the `configData` shape:
414
+
415
+ ```ts
416
+ type GitAuth =
417
+ | { type: "public" } // the default when `auth` is omitted
418
+ | { type: "password"; username: string; "#password": string }
419
+ | { type: "sshKey"; username: string; "#sshKey": string };
420
+ ```
421
+
422
+ `componentId` is a literal union of the ids that serve these actions, not `string` — an unsupported id is rejected before any request. The set is deliberately closed: `listBranches` / `list_branches` / `checkBranches` also exist on unrelated third-party components under a different contract, and those stay on `sendSyncAction`.
423
+
424
+ Two constraints the types cannot carry are enforced when parsing. dbt clones over HTTPS with a username and password and has no SSH key field, so `{ type: 'sshKey' }` is refused outside the data-app family. And `getBranches` accepts no `branch` at all: the component feeds one to `git clone -b <branch>`, so a stale or renamed value would fail the very call made to discover the valid branches. `getEntrypoints` does take an optional `branch`, which selects whose revision's files are enumerated; omit it for the repository's default branch.
425
+
426
+ `getBranches` resolves to the branch array directly. The components return the list both at the top level and nested under `repository`, and as an object keyed by stringified indices with gaps rather than an array — a PHP array whose integer keys are no longer contiguous serializes as an object. All of those normalise to one array, and the previous `getBranches(repository)` reader is gone. Only `branch` is required on an entry; `sha`, `date`, `comment` and `author` fall back to an empty string, so one commit with no message does not cost the caller the whole list. `GitRepository`, `GitRepositoryBranch`, `GitEntrypoints` and the five `Get*Input` types are replaced by `GitBranch`, `GitEntrypoints`, `GitAuth`, `GetBranchesInput`, `GetEntrypointsInput`, `GitComponentId` and `DataAppComponentId`.
427
+
428
+ **New: `ValidationError`, `isValidationError` and `parseOrThrow`.** A `ZodError` no longer escapes the package. Its `message` is `JSON.stringify` of the issue list — over a kilobyte for two problems — so any consumer that renders a caught error's message was putting that blob in front of a user. `parseOrThrow(schema, value)` converts it into a `ValidationError` whose `message` is one line per issue prefixed by its field (`repositoryUrl: Required`), with the structured `issues` kept for inspection rather than display. Every sync-action parse site goes through it; the rest of the package still calls `schema.parse()` directly and can migrate as it is touched.
429
+
430
+ - Send the rebase request body in the new `diff` envelope (connection#8040, DMD-1890).
431
+ - **Breaking:** `RebaseConfigurationBody` is now `{ version, diff }` — the resolved content fields (`name`, `description`, `changeDescription`, `isDisabled`, `configuration`, `rows`) move from the top level into a `diff` object (new `RebaseConfigurationDiff` type), mirroring the shape the `/diff` endpoint returns its sides in. Callers of `rebaseConfiguration` must wrap the resolved content: `rebaseConfiguration({ ...path, version, diff: { name, rows, ... } })`.
432
+ - The backend accepts the new shape only (the old flat body returns a 400) and additionally supports delete resolution via an empty `diff` — not modeled in the SDK types yet.
433
+
434
+ - Table snapshots move out of `api.storage.tables` into their own `api.storage.snapshots` namespace, matching how every other storage sub-resource is shaped (`columns`, `configurationRows`, `configurationVersions`, …). The delete endpoint was the tell: `DELETE /v2/storage/snapshots/{snapshotId}` is not table-scoped at all, so it never belonged under `tables`.
435
+
436
+ Every method is renamed as it moves. The two that only enqueue a storage job pick up the `Async` suffix the package requires of anything returning a `Job`; the reader takes the `get*` prefix the rest of the storage client uses:
437
+ - `tables.createSnapshot` → `snapshots.createSnapshotAsync`
438
+ - `tables.deleteSnapshot` → `snapshots.deleteSnapshotAsync`
439
+ - `tables.loadTableSnapshots` → `snapshots.getTableSnapshots`
440
+
441
+ `snapshots.getSnapshot(snapshotId)` is new — it reads a single snapshot off `GET /v2/storage/snapshots/{snapshotId}`, the one snapshot operation the spec documents that the client had no method for.
442
+
443
+ Signatures, endpoints and return types of the moved methods are unchanged; only the namespace and the names move. `LoadTableSnapshotsInput` is renamed `GetTableSnapshotsInput` to follow its method. `CreateSnapshotInput`, `CreateSnapshotBody`, `GetSnapshotsQuery` and `Snapshot` keep their names and are still exported from `@keboola/api-client/storage/types`.
444
+
445
+ `api.sdk.storage.createSnapshot` — which polls the job to completion — is untouched.
446
+
447
+ - `api.storage.componentsAndConfigurations` is replaced by four namespaces. It carried 21 methods over four unrelated entities — the name said so out loud, and the factory's own return object already grouped its exports under four comments. Nothing about a call site told you which of the four a line touched.
448
+
449
+ **Method names and endpoints are unchanged.** For `components` and `configurations` the migration is a substitution on the namespace segment alone; `configurationRows` and `configurationWorkspaces` additionally rename the configuration path parameter (see below).
450
+
451
+ | Was `componentsAndConfigurations.…` | Now |
452
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------- |
453
+ | `getComponent`, `getComponents` | `api.storage.components` |
454
+ | `createConfiguration`, `updateConfiguration`, `getConfiguration`, `getConfigurations`, `deleteConfiguration`, `deleteConfigurations`, `restoreConfiguration`, `resetConfigurationToDefault`, `rebaseConfiguration`, `getConfigurationDiff`, `getConfigurationRowDiff`, `searchComponentConfigurations` | `api.storage.configurations` |
455
+ | `createConfigurationRow`, `createConfigurationRows`, `deleteConfigurationRow`, `deleteConfigurationRows` | `api.storage.configurationRows` |
456
+ | `getConfigurationWorkspaces`, `createConfigurationWorkspace`, `createConfigurationWorkspaceJob` | `api.storage.configurationWorkspaces` |
457
+
458
+ ```ts
459
+ // before
460
+ await api.storage.componentsAndConfigurations.getConfiguration({
461
+ componentId,
462
+ configId,
463
+ branchId,
464
+ });
465
+ await api.storage.componentsAndConfigurations.createConfigurationRow({
466
+ componentId,
467
+ configId,
468
+ });
469
+
470
+ // after
471
+ await api.storage.configurations.getConfiguration({
472
+ componentId,
473
+ configId,
474
+ branchId,
475
+ });
476
+ await api.storage.configurationRows.createConfigurationRow({
477
+ componentId,
478
+ configurationId,
479
+ }); // ← renamed
480
+ ```
481
+
482
+ **`configId` becomes `configurationId` on four namespaces.** Every namespace moved onto the OpenAPI
483
+ client now takes its path parameters from the generated schema, and the Storage document calls that
484
+ segment `configurationId`. This affects `configurationRows.*`, `configurationWorkspaces.*`,
485
+ `configurationMetadata.saveConfigurationMetadata` and all four `configurationVersions.*` methods.
486
+ `components.*` and `configurations.*` keep `configId`: `ConfigurationPath` is shared with the
487
+ `scheduler` client, so renaming it there is a separate change.
488
+
489
+ `configurationWorkspaces.getConfigurationWorkspaces` additionally requires `branchId`, which the old
490
+ `ConfigurationPath` left optional. The other methods keep it optional, defaulting to `default`.
491
+
492
+ **`searchComponentConfigurations` takes one object instead of two.** Its path and query arguments
493
+ collapse into a single `SearchComponentConfigurationsInput`, matching every other method in these
494
+ namespaces:
495
+
496
+ ```ts
497
+ // before
498
+ await api.storage.componentsAndConfigurations.searchComponentConfigurations(
499
+ { branchId },
500
+ { componentId },
501
+ );
502
+
503
+ // after
504
+ await api.storage.configurations.searchComponentConfigurations({
505
+ branchId,
506
+ componentId,
507
+ });
508
+ ```
509
+
510
+ Two allocations are worth knowing because they are not where the old comment grouping put them. `searchComponentConfigurations` moves to `configurations` rather than `components`: it resolves to `SearchComponentConfiguration[]`, and grouping by what a method returns is what keeps every `components` method resolving to a `Component`. `getConfigurationRowDiff` stays in `configurations` beside `getConfigurationDiff` rather than moving to `configurationRows` — the two share the `ConfigurationDiff*` type family and the same merge-request callers, so splitting them would force those callers to reach into two namespaces to render one diff view.
511
+
512
+ Configuration rows get their own namespace instead of folding into `configurations`, which would have left one namespace holding 16 of the 21 methods — the imbalance the split exists to remove. `configurationRows` also matches the sibling naming already in `configurationMetadata` and `configurationVersions`.
513
+
514
+ **No type import changes.** The types move with their methods into four per-namespace `types.ts` files, but `@keboola/api-client/storage/types` re-exports all four, so every existing `import type { Component, ComponentConfig, Row, WrDbRow, BackendType, … } from '@keboola/api-client/storage/types'` resolves exactly as before. `CreatorToken` — previously module-private and inlined into both `Row` and `BaseComponentConfig`, which now live in different files — becomes a public export as a consequence; that is additive.
515
+
516
+ - Fix seven Storage client contracts that the nightly live smoke proved wrong. Three are return types
517
+ that promised a full configuration where the API answers with a minimal acknowledgement, two are
518
+ requests the client built wrong, one is a query field the API rejects, and one is a dead method.
519
+ - `storage.configurations.resetConfigurationToDefault` — was `Promise<ComponentConfig>`, the endpoint
520
+ answers with an **empty body**. Now `Promise<void>`; re-read the configuration to observe the reset.
521
+ (It is dev-branch only — the API answers 501 on `default`.) This settles the `UNVERIFIED RETURN`
522
+ question the namespace split left on the method: the spec was right.
523
+ - `storage.configurationVersions.rollbackConfigurationToVersion` — was `Promise<ComponentConfig>`, the
524
+ endpoint answers `{ version }` carrying only the new version number, **as a string** (the same field
525
+ is a number on `ConfigurationVersion`; the inconsistency is the API's and is now mirrored rather
526
+ than hidden). Now `Promise<RollbackConfigurationToVersionResult>`.
527
+ - `storage.configurationVersions.copyConfigurationFromVersion` — was `Promise<ComponentConfig>`, the
528
+ endpoint answers `{ id }` carrying only the new configuration's id. Now
529
+ `Promise<CopyConfigurationFromVersionResult>`.
530
+ - `storage.tables.pullTable` — called the unbranched `/v2/storage/tables/{id}/pull`, which is absent
531
+ from the Storage document and 404s for every table, because nothing in that path says which branch
532
+ to pull into. Now `storage.tables.pullTableAsync({ branchId, tableId })`, calling the branch-scoped
533
+ path the spec does define, moved onto the OpenAPI client with the rest of the migrated operations
534
+ and renamed per the job-returning `Async` rule in `AGENTS.md`. `sdk.storage.pullTable` keeps its
535
+ bare name (it awaits the job) but takes the same input.
536
+ - `storage.configurations.searchComponentConfigurations` — the component filter was named
537
+ `componentId`, which the API rejects with "This field was not expected"; it is `idComponent`.
538
+ `include` was typed as an array while the spec types it comma-separated, so the whole query was
539
+ pinned to `queryArrayFormat: 'comma'` — and that pin then destroyed `metadataKeys`, which the API
540
+ wants as a real array. `include` is now comma-joined by the client and the pin is gone, so all
541
+ three narrowing fields work.
542
+ - `storage.configurations.getConfigurationRowDiff` — **removed**, along with `ConfigurationRowDiff`,
543
+ `ConfigurationRowDiffSide` and `ConfigurationRowDiffPath`. Its path is absent from the spec and the
544
+ API answers 404 for every row state, and it was redundant: `ConfigurationDiffData.rows` carries each
545
+ row's full content, so `getConfigurationDiff` already covers the case.
546
+ - `storage.buckets.getBucketRegistrationGuide` — the request serialized `path[]` with the default
547
+ `indices` array format, producing `path[][0]=…&path[][1]=…` for an already-bracketed key, which the
548
+ API rejected with a 400 ("This value should be of type string"). Pinned to `repeat`, so it now sends
549
+ `path[]=db&path[]=schema`. No signature change; the call simply works now.
550
+
551
+ **Breaking**, in the order you are likely to hit them:
552
+ 1. Code reading `ComponentConfig` fields off the three version/reset results stops compiling. That
553
+ code was already wrong at runtime — the fields were never in the response, so a read on the two
554
+ version methods yielded `undefined` rather than raising, and the reset's result isn't an object at
555
+ all. The break replaces a silent wrong value with a compile error; there is nothing to stage a
556
+ deprecation on, since the removed fields never existed in a response. Re-read the configuration
557
+ with `getConfiguration` for its body.
558
+ 2. `tables.pullTable(tableId, signal)` becomes `tables.pullTableAsync({ branchId, tableId }, signal)`.
559
+ `branchId` defaults to `default`, where a pull is a no-op — pass the dev branch you are pulling
560
+ into. `sdk.storage.pullTable(input, options)` is the awaiting wrapper and keeps its name.
561
+ 3. `searchComponentConfigurations({ componentId })` becomes `{ idComponent }`. Calls that passed
562
+ `componentId` were being rejected by the API, so this fixes them rather than changing them.
563
+ 4. `getConfigurationRowDiff` and its three types are gone. Use `getConfigurationDiff` and read
564
+ `diff.rows`.
565
+
566
+ `RollbackConfigurationToVersionResult`, `CopyConfigurationFromVersionResult` and `PullTableAsyncInput` are
567
+ exported from `@keboola/api-client/storage/types`.
568
+
569
+ - `api.storage.branches`, `buckets`, `columns`, `tables`, `search` and `stats` move onto the storage
570
+ OpenAPI client, so request and response types come from the spec instead of being restated as a type
571
+ argument per call. Where the spec is wrong or absent the types stay hand-authored and are asserted in at
572
+ one line, so a defect is recorded rather than spread through consumers. Each client file carries a block
573
+ comment listing what the Storage spec owes, per operation.
574
+
575
+ The generic client survives only where the spec declares **no such operation** — a missing endpoint, not
576
+ a mistyped one: `buckets.updateBucket` (no `put` on `/v2/storage/buckets/{bucketId}`, nor on the branch
577
+ variant), and `tables.createTableAsync`, `exportAsync`, `pullTable`, `createAliasTable`,
578
+ `setAliasTableFilter` / `removeAliasTableFilter` and `updateTable`. Namespaces that keep both clients now
579
+ take the OpenAPI one **first** — `createBuckets(openApiClient, client)`, `createTables(openApiClient,
580
+ client)` — which only affects a caller constructing a namespace by hand.
581
+
582
+ ### Metadata is branch-aware
583
+
584
+ The six object-metadata methods call `/v2/storage/branch/{branchId}/…` instead of the unbranched path
585
+ and take a single `*Input`:
586
+ - `buckets.saveBucketMetadata({ branchId, bucketId, provider, metadata })` /
587
+ `buckets.deleteBucketMetadata({ branchId, bucketId, metadataId })`
588
+ - `tables.saveTableMetadata({ branchId, tableId, provider, metadata })` /
589
+ `tables.deleteTableMetadata({ branchId, tableId, metadataId })`
590
+ - `columns.saveColumnMetadata({ branchId, columnId, provider, metadata })` /
591
+ `columns.deleteColumnMetadata({ branchId, columnId, metadataId })`
592
+
593
+ A dev branch physically contains only the objects created or pulled into it, so the branch an object
594
+ lives in is the caller's to supply — reading or writing metadata on a production object through a dev
595
+ branch is a 404, never a fallback.
596
+
597
+ **`tables.saveTableMetadata`'s return type was wrong and is now correct.** It was declared `Metadata[]`,
598
+ but the endpoint answers `{ metadata, columnsMetadata }` — the table's own records plus the records of
599
+ any column the payload named. Callers reading the result as an array were reading `undefined`; they now
600
+ get `TableMetadataResponse` and must pick `.metadata`.
601
+
602
+ ### A method that returns a job ends in `Async`
603
+
604
+ `AGENTS.md` gains the rule: if the resolved value is a `Job`, the name ends in `Async` — never `*Job`
605
+ (that names the return type, not what the call does) and never a bare verb, which reads like the work is
606
+ finished when the promise resolves. The suffix is the only thing at a call site that says "poll this."
607
+
608
+ | before | after |
609
+ | ------------------------------------------ | ----------------------------------------------- |
610
+ | `branches.createDevBranchJob` | `branches.createDevBranchAsync` |
611
+ | `branches.deleteDevBranchJob` | `branches.deleteDevBranchAsync` |
612
+ | `buckets.createListing` | `buckets.createListingAsync` |
613
+ | `buckets.updateListing` | `buckets.updateListingAsync` |
614
+ | `buckets.deleteListing` | `buckets.deleteListingAsync` |
615
+ | `buckets.forceUnlinkBucket` | `buckets.forceUnlinkBucketAsync` |
616
+ | `buckets.refreshExternalBucket` | `buckets.refreshExternalBucketAsync` |
617
+ | `buckets.registerBucket` | `buckets.registerBucketAsync` |
618
+ | `buckets.shareBucketToOrganization` | `buckets.shareBucketToOrganizationAsync` |
619
+ | `buckets.shareBucketToOrganizationProject` | `buckets.shareBucketToOrganizationProjectAsync` |
620
+ | `buckets.shareBucketToProjects` | `buckets.shareBucketToProjectsAsync` |
621
+ | `buckets.shareBucketToUsers` | `buckets.shareBucketToUsersAsync` |
622
+ | `buckets.unshareBucket` | `buckets.unshareBucketAsync` |
623
+ | `columns.addTableColumn` | `columns.addTableColumnAsync` |
624
+ | `columns.deleteTableColumn` | `columns.deleteTableColumnAsync` |
625
+ | `columns.createTablePrimaryKey` | `columns.createTablePrimaryKeyAsync` |
626
+ | `columns.removeTablePrimaryKey` | `columns.removeTablePrimaryKeyAsync` |
627
+
628
+ `api.sdk.storage` is deliberately **not** renamed: its wrappers `await waitForJob(...)`, so they resolve
629
+ the finished resource and the bare name is correct there. `api.sdk.storage.registerBucket` and
630
+ `api.storage.buckets.registerBucketAsync` now differ by suffix precisely because they differ in what they
631
+ resolve to.
632
+
633
+ ### A method takes one `*Input` object
634
+
635
+ Methods that previously spread a path parameter and a body across positional arguments now take one
636
+ object, composed from the spec's path and body aliases:
637
+ - **branches** — `updateDevBranch(UpdateDevBranchInput)`,
638
+ `saveDevBranchMetadata(SaveDevBranchMetadataInput, signal?)`,
639
+ `deleteDevBranchMetadata(DeleteDevBranchMetadataPath, signal?)` (a `Path`, not an `Input` — a delete
640
+ has no body)
641
+ - **columns** — `addTableColumnAsync(AddTableColumnInput, signal?)`,
642
+ `deleteTableColumnAsync(DeleteTableColumnInput, signal?)`,
643
+ `createTablePrimaryKeyAsync(CreateTablePrimaryKeyInput, signal?)`
644
+ - **tables** — `getTables`, `deleteTableRows`, `exportAsync`, `importAsync`, `updateTable`,
645
+ `createTableAsync`, `createTableDefinitionAsync`, `createAliasTable` and `setAliasTableFilter` all take
646
+ their `*Input`
647
+
648
+ `tables`' `*Input` types name their path parameters `branchId` / `bucketId` / `tableId` rather than
649
+ taking the spec's own names, because the spec calls the same table id `id` on some paths and `tableId` on
650
+ others; the namespace had already settled on `tableId`, and matching the document per-endpoint would make
651
+ sibling methods disagree with each other. `columns` does follow the spec's names, which is why
652
+ `addTableColumnAsync` takes `id` while its two siblings take `tableId`.
653
+
654
+ Methods taking a single scalar and no body keep it positional: `branches.getDevBranchMetadata`,
655
+ `columns.removeTablePrimaryKeyAsync`, `tables.deleteTable` / `pullTable` / `removeAliasTableFilter`,
656
+ `snapshots.deleteSnapshotAsync` / `getSnapshot`.
657
+
658
+ ### Removed and renamed types
659
+ - **`mapBranchMetadata` and `BranchMetadata` are gone.** The mapper only converted `timestamp` to a
660
+ `Date`, and nothing read that field. `branches.getDevBranchMetadata` and `saveDevBranchMetadata` now
661
+ hand back `BranchMetadataRaw[]`, with `timestamp` as the API's `string` — which also stops a
662
+ non-serialisable `Date` reaching consumers that put the result into a store.
663
+ - `CreateDevBranchJobBody` → `CreateDevBranchBody`, since the method is no longer `…Job`.
664
+ - `DeleteTableColumnQuery` was hand-authored as `{ force?: boolean }`, which is exactly what the spec
665
+ declares, so it is now derived from it.
666
+ - `TableImportAsyncBody` and a duplicate spec alias for the same path were collapsed into one.
667
+
668
+ ### Spec defects behind the assertions
669
+
670
+ Two recur and account for most of them. The generated `JobResponse` is a flat shape with
671
+ `status: string` while `Job<T>` is a discriminated union over `status` carrying typed `results`, so every
672
+ job return is asserted whether or not the operation declares a response body. And six bucket operations
673
+ are invoked with `async: true` but declare `query: never`.
674
+
675
+ The rest are per-operation and listed in the client files. The ones worth knowing here:
676
+ - `POST …/tables/{id}/metadata` declares its body as `CreateTableMetadataRequest`, defined as
677
+ `Record<string, never>` — an empty object, so it cannot describe the provider plus key/value items the
678
+ endpoint requires.
679
+ - Every `{metadataId}` path parameter is declared a `number`, while the id in a response is a `string` on
680
+ the branch endpoints and a `number` on the object ones — the three cannot all hold. The new
681
+ `MetadataId` (`string | number`) lets a record round-trip from any of them; the id is interpolated into
682
+ the URL, so nothing changes on the wire.
683
+ - Every `/v2/storage/dev-branches` operation declares a single contentless `default` response, so the
684
+ generated return type is the response envelope rather than a payload; both its request bodies are
685
+ `Record<string, never>`; and `POST` is declared twice, on `/dev-branches` and `/dev-branches/`.
686
+ - The add-column request variants omit `basetype` and type `definition.length` as a `number`, where the
687
+ UI really sends a string (a decimal length is `'38,0'`).
688
+ - `CreatePrimaryKeyRequest.skipDuplicatesCheck` is required despite a documented `@default false`.
689
+
690
+ One response is deliberately **not** asserted: `GET /v2/storage/shared-buckets` is typed
691
+ `Record<string, never>[]`, so `SharedBuckets` is an empty-object array and `buckets.sharedBuckets()` gives
692
+ callers nothing useful. Asserting it would have meant inventing a shape.
693
+
694
+ ### Still to standardise
695
+
696
+ `api.storage.buckets` keeps positional arguments (`getListing`, `createListingAsync`,
697
+ `shareBucketToProjectsAsync`, `updateBucketOwner`, `refreshExternalBucketAsync` and the rest), and job
698
+ returns on bare names remain in `tables` (`deleteTableRows`, `pullTable`, `updateTableDefinition`),
699
+ `workspaces.deleteWorkspaceJob` and `configurationWorkspaces.createConfigurationWorkspaceJob`. Those
700
+ follow in their own PRs.
701
+
702
+ - `StorageToken` is now derived from the generated `TokenVerifyResponse` instead of being hand-written, overriding only the fields the spec models badly. 22 of its 26 fields track `pnpm gen:types`, so a flag the backend adds arrives with the schema rather than being transcribed.
703
+ - **Breaking:** the type gains three required fields — `creatorToken`, `canReadAllProjectEvents` and `canManageDevBranches`. Anything constructing a `StorageToken` literal (test fixtures, mocks) must supply them.
704
+ - **Breaking:** `description` is now `string | null | undefined`, matching what the API actually returns for a token created without one. Readers that assumed a non-null string need a fallback; this was previously a latent crash the type hid.
705
+ - `token` is added as optional. `verify` and `refresh` do return the secret, and the old type omitted it entirely. It is optional rather than required because the spec marks it required while its own description says "provided only in specific cases" — tighten once that is confirmed against a live stack.
706
+ - `expires` is now optional as well as nullable.
707
+
708
+ `owner`, `admin`, `adminOwner` and `organization` keep their hand-authored shapes: the spec models the first three as near-empty objects (`adminOwner` as `Record<string, never>`, which types every property access as an error), and `organization.id` conflicts between the two with no consumer to arbitrate it.
709
+
710
+ **Breaking: `updateToken` and `shareToken` take a single `*Input` object**, matching `GetBucketInput` and the rest of the package:
711
+
712
+ ```ts
713
+ api.storage.tokens.updateToken({ id, ...body }, signal?);
714
+ api.storage.tokens.shareToken({ id, recipientEmail, message }, signal?);
715
+ ```
716
+
717
+ The whole tokens client also moves onto the OpenAPI fetch client. Where the generated schema is wrong the call sites cast, with the four defects documented once above `createTokens`: id path params typed `number` though every returned id is a `string`; `UpdateTokenRequest` / `ShareTokenRequest` modelled as empty objects; the update `200` declaring no response body; and the create body marking defaulted fields required. Each cast is written to be deleted as the backend corrects the corresponding part of the spec.
718
+
719
+ - `api.storage.triggers` moves onto the storage OpenAPI client, so request and response types are
720
+ inferred from the spec instead of being restated as a type argument per call. Two signature changes
721
+ come with it:
722
+ - `listTriggers` is renamed to `getTriggers`, matching the `get*` reader convention the rest of the
723
+ storage client follows (`getTables`, `getBuckets`, `getTokens`). `ListTriggersQuery` is renamed to
724
+ `GetTriggersQuery`. Otherwise unchanged.
725
+ - `updateTrigger` takes a single `UpdateTriggerInput` — `{ triggerId }` merged with the body — rather
726
+ than `(triggerId, body)`, following the same `*Input` shape as `updateTableDefinition` and
727
+ `snapshots.createSnapshotAsync`.
728
+
729
+ Two spec deviations are hand-rolled, both narrowed to the call site in the client:
730
+ - `PUT /v2/storage/triggers/{triggerId}` patches only the fields it receives, but the spec marks all
731
+ five of `UpdateTriggerRequest` `required` — which would force a caller changing a trigger's watched
732
+ tables to resend `component`, `configurationId` and `runWithTokenId`, and so to overwrite the
733
+ trigger's token with whatever id it last read. `UpdateTriggerInput` therefore carries a `Partial` of
734
+ the generated body; the spec's own shape stays exported as `UpdateTriggerRequest`.
735
+ - The `{triggerId}` path parameter is declared a `number` on both `put` and `delete` while
736
+ `TriggerResponse.id` is a `string`. The two cannot both hold, and taking the path at face value
737
+ makes `createTrigger` → `updateTrigger`/`deleteTrigger` fail to compile on the id it just returned.
738
+ Both methods therefore take `Trigger['id']` and cast the path object, so a fetched trigger round-trips
739
+ without the caller coercing. The id is interpolated into the URL, so nothing changes on the wire.
740
+
741
+ Both casts go away once the Storage spec is corrected and `pnpm gen:types` is re-run.
742
+
743
+ ### Minor Changes
744
+
745
+ - Add an `apps` client for the sandboxes-service `/v2` App Deployments API, reachable as `api.apps` and as the `@keboola/api-client/apps` + `@keboola/api-client/apps/types` sub-paths. It covers apps (`getApps`, `getApp`, `createApp`, `deleteApp`), the deployment lifecycle (`createDeployment`, `getDeployments`, `getDeployment`, `promoteDeployment`, `deleteDeployment`), the app action verbs (`unpublishApp`, `suspendApp`, `resumeApp`), runs (`getAppRuns`, `getAppRun`), logs for both an app and a single deployment (`getAppLogsTail` / `getAppLogsDownload`, `getDeploymentLogsTail` / `getDeploymentLogsDownload`), the app password (`getAppPassword`, `resetAppPassword`) and the app's Git repository with its credentials (`getAppGitRepo`, `getAppGitRepoCredentials`, `getAppGitRepoCredential`, `createAppGitRepoCredential`, `deleteAppGitRepoCredential`).
746
+
747
+ It resolves off the already-advertised `data-science` service and the registry appends `/v2`, the same shape as `omnisearch` on the `ai` service. The `apps.<stack>` host serves the identical routes at its root — it is a vanity alias that strips the prefix — but it is absent from the stack's service index, so nothing can resolve it and no new service id is needed. `createAppsClient` therefore expects a `baseUrl` that already points past the prefix (`https://<data-science-host>/v2`).
748
+
749
+ This is a separate client from `dataScience` rather than more methods on it: the two surfaces share path names with different shapes — a `/v2` app carries `production` (`desiredId`/`actualId` and their number twins) and `undeployedChanges` — and `/v1`'s workspace endpoints (`/sandboxes`, `/runtimes`) have no `/v2` counterpart. Note that a `/v2` app carries neither `name` nor `description`: both are create-only and live in the app's Storage configuration, so a list page resolves its labels with one bulk `listComponentConfigurations` call against the `componentId`/`branchId`/`configId` each app points at.
750
+
751
+ Three behaviours worth knowing before calling it:
752
+ - **Creates are not idempotent, and cannot be made so.** The spec still documents an `Idempotency-Key` header that turns a replayed create into a no-op, and the service did honour it — but support was dropped on 17 Aug 2026 and the spec has yet to catch up. It was unusable from a browser in any case: the service's `Access-Control-Allow-Headers` never listed the header, so sending it failed the CORS preflight and the request never left the page. So `createApp`, `createDeployment` and `createAppGitRepoCredential` take no key, every retry is a genuine create, and a caller that retries one owns the duplicate it may produce. That matters most for `createAppGitRepoCredential`, whose one-time `secret` is returned only at creation — a duplicate there is a credential nobody knows the secret for.
753
+ - **The action verbs resolve to `null` on a no-op.** `promoteDeployment`, `unpublishApp`, `suspendApp` and `resumeApp` answer `202` with the updated app when they change something and `204` when there was nothing to do (already production, already suspended, never deployed), so their return type is `App | null`.
754
+ - **Log tails keep the `dataScience` shape** — `{ entries, nextLogTimestamp }` — and read "nothing is running" as an empty tail rather than an error, in both scopes: `400 apps.appNotRunning` for an idle app, `400 apps.deploymentNotRunning` for a deployment that isn't the one serving (the normal state of a staged or retired one). The downloads still throw there, matching `/v1` — a caller asking for a file is better off with the error than with an empty one. Runs, by contrast, are returned exactly as the service types them, `state: null` included; `/v1`'s "no state means running" fallback would mislabel a `/v2` run that never started.
755
+
756
+ `PATCH /apps/{appId}` and `POST /apps/{appId}/activity` are deliberately not exposed. The former has no patchable field yet (`name`/`description` are create-only, so `{}` is the only accepted body). The latter is apps-proxy's own heartbeat and takes a Manage API token carrying the `apps:proxy` scope, which this storage-token client cannot supply.
757
+
758
+ The spec is registered in `redocly.yaml` and pointed at canary (`https://apps.canary-orion.keboola.dev/docs/swagger.yaml`), the only stack that hosts `/v2` today; it is flagged experimental upstream, so shapes may still move. Repoint the root at the production host once `/v2` ships there.
759
+
760
+ Two changes outside the new client come with it.
761
+
762
+ `OpenapiSuccessType` now prefers a `202` that carries a body over a `204` that carries none. An endpoint declaring both used to resolve its data to `never` and hide the payload; endpoints declaring only one are unaffected. Besides the apps action verbs this also reaches storage's `202`+`204` bucket and file deletes, with no practical effect — those are called through the generic client with explicit type arguments. A `types.test.ts` now pins the precedence for every success-status combination.
763
+
764
+ Reading a data app's logs moved into one shared module (`domain/appLogs`) that both sandboxes-service surfaces call: the line parsing, where the next poll resumes, the `apps.appNotRunning` rule and the download's `Content-Disposition` filename now exist once instead of once per client. A tail is also parsed once rather than twice per poll — `parseLastLogTimestamp` used to re-parse the whole log to find its last timestamp, which cost a second pass and a second `LogEntry` array (~1 MB on a 10k-line tail) on the polled endpoint.
765
+
766
+ - Add `auth.login.methods()` for `GET /v1/auth/methods` — the stack's login-methods discovery.
767
+
768
+ It answers what a visitor may sign in with on that stack: `methods` is a union discriminated on `type` (`password` with its `passwordResetEnabled`, `oidc` with its `provider` and public `clientId`, `saml` with its `customerSlug` and `displayName`), alongside `restriction` (`ssoEnforced` / `stackSsoOnly` / `null`), `emailDiscoveryEnabled` and `signUpUrl`.
769
+
770
+ The `clientId` is the reason a client needs this: `auth.login.withOidc` takes an `idToken` the browser has to mint against the provider first, and the OAuth client ID to mint it with is per-stack configuration that no other endpoint returns — so without discovery a frontend has to hardcode one per stack.
771
+
772
+ Unauthenticated, like the rest of the login surface, so it can be called on a client built for a stack the session is not (yet) pointed at.
773
+
774
+ `POST /v1/auth/methods` — the identifier-first narrowing for a given email address — is not wired yet.
775
+
776
+ - `api.storage.configurations` gains `purgeConfiguration` / `purgeConfigurations`, and `deleteConfiguration` takes an optional `expectedVersion`.
777
+
778
+ Permanently removing a configuration used to mean sending `DELETE` twice: the first call trashes it, the second one — because the configuration is already in the trash — purges it. That made destructive intent implicit, so a `DELETE` from a stale view could purge a configuration another tab had just trashed (SUPPORT-16506). Storage now exposes an explicit `POST .../configs/{id}/purge` and accepts the RFC 9110 `If-Match` precondition on both endpoints.
779
+
780
+ ```ts
781
+ // Permanent removal, stated as such — never falls back to a soft delete.
782
+ await api.storage.configurations.purgeConfiguration({
783
+ componentId,
784
+ configId,
785
+ expectedVersion: config.version, // from the trash listing
786
+ });
787
+
788
+ // Trash a configuration, but only while it is still at the version the user acted on.
789
+ await api.storage.configurations.deleteConfiguration({
790
+ branchId,
791
+ componentId,
792
+ configId,
793
+ expectedVersion: config.version,
794
+ });
795
+ ```
796
+
797
+ `expectedVersion` is the configuration's `version`; the client wraps it into the entity-tag form the API expects. On purge it is mandatory (Storage answers 428 without it) and a configuration that moved on since it was read is rejected with 412 instead of being destroyed. Purge is default-branch only and needs the `canPurgeTrash` token permission. `deleteConfiguration` without `expectedVersion` behaves exactly as before.
798
+
799
+ - Four configuration-row and configuration-state endpoints join the storage client: `configurationRows.getConfigurationRow`, `configurationRows.updateConfigurationRow`, `configurationRows.updateConfigurationRowState` and `configurations.updateConfigurationState`. All four are branch-aware, take the usual single `*Input` object with `branchId` defaulting to `default`, and forward an optional `signal`.
800
+
801
+ The spec stubs every one of these request bodies as `Record<string, never>` and every success response as `content?: never`, so the payloads stay hand-authored and bridge with a cast at the call site, matching the existing `createConfigurationRow` / `deleteConfigurationRow` pair.
802
+
803
+ `CreateConfigurationRowBody` widens `configuration` and `state` to `string | Record<string, unknown>` and `isDisabled` to `boolean | number`. Storage accepts both forms and both are in use; the value reaches the wire exactly as passed, since the client never re-encodes it. Existing callers passing objects are unaffected.
804
+
805
+ - `api.storage.configurationVersions` gains the row-level counterparts of the four configuration-level
806
+ methods, and `api.storage.configurationMetadata` gains the two reads/writes the spec documents but the
807
+ client did not expose. Both namespaces now cover their full OpenAPI surface.
808
+
809
+ ```ts
810
+ // Row versions mirror the configuration-level methods, taking a `rowId` alongside the config path.
811
+ const rowPath = { branchId, componentId, configurationId, rowId };
812
+
813
+ const versions =
814
+ await api.storage.configurationVersions.getConfigurationRowVersions(
815
+ rowPath,
816
+ );
817
+ await api.storage.configurationVersions.getConfigurationRowVersion({
818
+ ...rowPath,
819
+ versionId,
820
+ });
821
+ await api.storage.configurationVersions.rollbackConfigurationRowToVersion({
822
+ ...rowPath,
823
+ versionId,
824
+ });
825
+ await api.storage.configurationVersions.copyConfigurationRowFromVersion({
826
+ ...rowPath,
827
+ versionId,
828
+ });
829
+
830
+ // Configuration metadata can now be listed and deleted, not only written.
831
+ const configPath = { branchId, componentId, configurationId };
832
+
833
+ const metadata =
834
+ await api.storage.configurationMetadata.getConfigurationMetadata(
835
+ configPath,
836
+ );
837
+ await api.storage.configurationMetadata.deleteConfigurationMetadata({
838
+ ...configPath,
839
+ metadataId,
840
+ });
841
+ ```
842
+
843
+ Every version response is declared `content?: never` in the spec, so the row-version shapes are
844
+ hand-authored like the configuration ones and are unverified against a live stack.
845
+ `deleteConfigurationMetadata` is default-branch only — a dev branch answers 501.
846
+
847
+ - New `api.syncActions.dbt` namespace, covering the two artifact actions of the dbt transformations:
848
+
849
+ ```ts
850
+ api.syncActions.dbt.compile(input, signal?); // -> Record<modelFile, compiledSql>
851
+ api.syncActions.dbt.runResults(input, signal?); // -> DbtModelTiming[]
852
+ ```
853
+
854
+ Both read what the configuration's **last run** left behind — neither runs dbt. A configuration that has never run raises a user exception in the component, so it arrives as a `SyncActionError` carrying the sentence that tells you to run it first; render that rather than a message of your own. An absent `compiled` / `modelTiming` key resolves to an empty result instead of failing, because a validation error is nothing a caller can act on; a key that is _present_ with the wrong shape still throws, so a contract change cannot be mistaken for an empty run.
855
+
856
+ `input` is `{ componentId, configId, artifacts?, branchId, tag? }`; the `configData` the component expects is built from it (`parameters.configId` plus the configuration's own `artifacts` section, passed through untouched). Unlike the git actions, `componentId` is a plain string: every dbt component serves both actions under the same action name and the same payload, so the id names the component to run and selects nothing.
857
+
858
+ `runResults` normalises dbt's `"Thread-1"` worker label to the number consumers position a row by, falling back to `0` for a label it cannot parse rather than dropping the timeline. Timestamps stay ISO strings.
859
+
860
+ - `sdk.semanticLayer.deleteModel` now settles every child delete instead of failing fast. Previously
861
+ a mid-cascade child failure rejected with a plain error while an unknown number of children had
862
+ been (or were still being) deleted behind the caller's back. Now all child deletes run to
863
+ completion, and a partial failure throws the new `SemanticLayerCascadeDeleteError` (extends
864
+ `AggregateError`), carrying `modelUUID`, `deletedChildren`, and `failedChildren`
865
+ (`SemanticModelChildRef` / `SemanticModelChildDeleteFailure`, both newly exported from
866
+ `@keboola/api-client/sdk/semanticLayer/types`). The model itself is deleted only once its whole
867
+ child tree is gone, so it never orphans children.
868
+
869
+ - Add `lazy(task)` — a promise cache for one-shot async init (UT-5029).
870
+
871
+ The first call computes; every later call, in flight or long settled, gets that same promise back. It fills the gap next to `dedupe`, which shares only an _in-flight_ run and lets the next trigger start a fresh one:
872
+
873
+ ```ts
874
+ import { lazy } from "@keboola/api-client";
875
+
876
+ const getStackInfo = lazy(() =>
877
+ storage.getStackInfo({ exclude: "componentDetails" }),
878
+ );
879
+ await getStackInfo(); // fetches
880
+ await getStackInfo(); // same promise, no second request
881
+ ```
882
+
883
+ A success is kept forever, but a **rejection is not** — the slot clears, so the next call retries. Lazy init over the network (a stack index, JWKS, feature flags) must not be bricked permanently by one transient 503. Callers that joined the failed run all reject with its error; only a call made _after_ it settles re-runs the task.
884
+
885
+ The name is deliberate: across the JS ecosystem (`once`, lodash `_.once`, `p-once`) `once` means "run at most once, ever" — rejection included — so retry-on-failure under that name would fight the convention. `lazy` follows `Lazy<T>`/`AsyncLazy<T>`; `memoize`/`p-memoize` is the arg-keyed cousin, where evicting rejected entries is likewise the norm.
886
+
887
+ Additive only — no existing behaviour changes.
888
+
889
+ - Add an `omnisearch` client, reachable as `api.omnisearch` and as the `@keboola/api-client/omnisearch` + `@keboola/api-client/omnisearch/types` sub-paths. It covers data lineage: `getProjectsLineage` (`GET /v1/lineage/projects`) for project-to-project lineage across an organization, and `getTablesLineage` (`GET /v1/lineage/tables`) for table-, column- and configuration-level lineage within one project, plus the usual `healthCheck`. Both take the endpoint's query parameters (`startingPoint`, `upstream`, `downstream`, plus `project` and `columns` for tables) and an optional `signal`, and return the `{ graph }` envelope unchanged.
890
+
891
+ This is a separate client from `ai` even though it shares that service's host. The endpoints belong to `keboola/omnisearch-and-metadata-engine` — a distinct FastAPI deployment (the `omnisearch-service` Helm app) that only appears on the AI host because the ai-service ingress routes `/omnisearch` to it. It publishes its own OpenAPI document at `https://ai.keboola.com/omnisearch/openapi.json`, now registered in `redocly.yaml`, so the client is generated-typed like every other. It resolves off `serviceId: 'ai'` and authenticates with the storage token; the registry appends `/omnisearch` to that service URL, the same shape as the existing `kai-assistant` `/api` override. `createOmnisearchClient` therefore expects a `baseUrl` that already points past the ingress, so a standalone caller passes `https://<ai-host>/omnisearch` rather than the bare AI service URL.
892
+
893
+ The graph itself is fully generated-typed: `ProjectsLineage` / `TablesLineage` and the node and edge types behind them (`LineageProject`, `LineageTable`, `LineageConfiguration`, `LineageMetadata`, `LineageBucket`, `ProjectLineageRelation`, `TableLineageRelation`, and the `LineageSource` enum) all come from the service's own OpenAPI document. Read the nullability carefully before consuming a node: `fqid` is the only guaranteed field, because regular Storage tables, external tables and virtual tables each carry a different subset — external tables have `database` / `db_schema` and no `bucket`, and `columns` is populated only when the `columns` query parameter is set. Edges expose both `lineageSources` (an array) and the deprecated singular `lineageSource`, which can additionally be the aggregate `'combined'`; prefer the array.
894
+
895
+ Three fields the service returns are missing from its spec — `bucket.backend`, `rowsCount` and `dataSizeBytes`. The node schemas are `additionalProperties: true`, so the values arrive but generate as `unknown`; `LineageTable` declares them and `getTablesLineage` recasts its response accordingly, so consumers don't narrow at every call site. Each declaration can go once the spec catches up.
896
+
897
+ - Add a `queryService` SDK (`createQueryServiceSdk`, `@keboola/api-client/sdk/queryService`) with `executeQuery` and `waitForJob`, composed on top of the existing `queryService` client the same way `createStorageSdk` composes on top of the `storage` client.
898
+
899
+ `createQueryServiceSdk({ queryServiceClient })` — `queryServiceClient` is a `createQueryServiceClient(...)` instance.
900
+
901
+ `executeQuery(branchId, workspaceId, body, options?)` submits a query job, waits for it to reach a terminal state, and fetches results for every statement — auto-paginating each statement's results via the client's `getQueryResults` so a result set larger than the API's default page size (500 rows) comes back in full instead of being silently truncated at the first page. `options.pageSize` controls the internal fetch page size (default 5000); `options.maxRows` optionally caps the total rows fetched per statement (default unlimited).
902
+
903
+ `waitForJob(queryJobId, options?)` polls the client's `getQueryJob` (via the existing `poll` utility) until the job reaches `completed`, `failed`, or `canceled`. It validates `options.interval`/`options.maxWaitTime` up front, throws the new `QueryJobError` if the job fails (carrying `queryJobId` and the failed statements' ids/errors), and the new `QueryJobTimeoutError` if `maxWaitTime` (default 5 min) elapses first — both exported from the package's top-level `errors` module alongside `isQueryJobError`/`isQueryJobTimeoutError` guards, matching the existing `SyncActionError`/`ValidationError` pattern. The `queryService` client itself is unchanged — still a plain collection of request methods, matching every other client in this package.
904
+
905
+ This mirrors the equivalent fix already shipped in the standalone `@keboola/query-service` SDK (see AI-3752) — that package's `getQueryResults`/pagination primitives were the model for `waitForJob`/`executeQuery` here, but this SDK's version reuses the package's own `poll`/`delay` utilities and error conventions rather than reimplementing retry/backoff, and additionally accepts an `AbortSignal` throughout.
906
+
907
+ - `api.syncActions.looker.testCredentials` registers a project's Looker credentials against
908
+ `keboola.wr-looker-v2`. The component reports a rejection inside a 2xx body as well as via a
909
+ non-2xx response, and the method normalises both into a thrown `SyncActionError`, so consumers
910
+ branch once — on `isSyncActionError`.
911
+
912
+ - `updateTableDefinition` now models `PUT /v2/storage/branch/{branchId}/tables/{tableId}/definition` as the patch it actually is, and gains the `isDescriptionSystemManaged` flag.
913
+
914
+ `displayName` and `columns` are optional on `UpdateTableDefinitionBody`. Both were typed as required, which forced a description-only edit to restate the current display name and synthesise a no-op column patch just to satisfy the type. The server takes any single field (`Assert\Optional` on each, plus a "at least one patch" callback), so `{ description }` is a complete body — and it is accepted for **non-typed tables** too, not just typed ones. Callers that always sent all three keep compiling.
915
+
916
+ `isDescriptionSystemManaged: false` marks a description user-authored. Tables default to `true` (system-managed), which lets Output Mapping overwrite the value on the next component run, so anything writing a hand-authored description should pin the flag alongside it.
917
+
918
+ The documented length cap was wrong: it is 65,535 for a table description _and_ each column description, not 16,384/1,024. Those two numbers are the backend-native truncation thresholds (Snowflake 16,384, BigQuery 1,024) applied when the description is pushed to the backend COMMENT — Storage itself stores the value in full, so they are not a reason to reject a longer one client-side.
919
+
920
+ - `OAuthSessionList` renders the OAuth grants an admin has handed out, the counterpart of `SessionList`: applications rather than devices.
921
+
922
+ `GET /v1/auth/sessions` gained an `oauthSessions` array next to `sessions` (connection PR #8105), so `api.auth.session.getAll()` now returns an optional `oauthSessions: OAuthSessionItemResponse[]` alongside `sessions`. The field is **optional on purpose**: a stack whose connection predates that endpoint change omits the key entirely, which means "this stack cannot report grants", not "you hold none". Gate the surface on the key being present rather than rendering an empty list, or the page tells the user no application has access when the truth is unknown.
923
+
924
+ Each row separates a grant's _binding_ from its _reach_, because they answer different questions. `project` + `tokenId` are what the grant is bound to (both null for a project-less, MCP-style grant); `allProjects` + `projects` are which projects the application can obtain a Storage token for. `projects` is the consented list as stored — it is not intersected with current membership, so a project the admin has since lost access to still appears. `allProjects` renders as a caution badge: that grant follows live membership, including projects joined later.
925
+
926
+ The list is read-only. The auth API exposes no endpoint to revoke a grant — the legacy admin page revokes through a Zend-only route keyed on the Storage token — so a revoke button here would be a dead control.
927
+
928
+ The auth schema is regenerated from the deployed spec, which also picks up the `/v1/auth/manage-tokens` and `/admin/auth/pkce/project-select` endpoints and an optional `projectScope`/`projectIds` on `api.auth.device.approve()`. `api.auth.mfa.totp.verify()` now takes a validated input and accepts an optional `revokeOtherSessions` (defaulting to the backend's own `false`), so the SDK sends the field explicitly where it previously omitted it.
929
+
930
+ - Stop handing callers a raw response body typed as the endpoint's DTO.
931
+
932
+ `parseData` compared the `content-type` header for exact equality, so `application/json; charset=utf-8` never took the JSON path, and any 200 whose body did not parse — the login page a session-expired redirect resolves to, for instance — was returned as a string typed as the endpoint's response. It only failed much later, wherever the value was first used.
933
+ - The media type is now parsed properly: `application/json`, a charset parameter, and the `+json` suffix family all count as JSON.
934
+ - The declared media type is authoritative. A body that declares JSON and does not parse throws, on success and on failure alike, rather than degrading to text; a body declared as anything else (query-service CSV exports, `text/plain` endpoints) is handed back verbatim instead of being sniffed for JSON.
935
+ - A 200 that declares JSON with an empty body resolves to `null`, like a 204, instead of throwing.
936
+ - The management client now treats a `text/html` body as `ManagementClientAuthError` ("Your session expired") on every request, not just `/admin/account/session-token`.
937
+ </content>
938
+
939
+ - Add semantic-layer scoping to `api.sdk.semanticLayer`: `scope` and `targetProjectIds` pass through the **create** meta, plus `replaceTargetProjects` (grant a `targeted`-scope object to specific sibling projects; an empty list clears every grant) and `promoteToOrganizationScope` (step a project-scoped object up to the organization scope in place, keeping its UUID and revision history). A scope change on an existing object is deliberately NOT part of the update meta: the metastore rejects a PATCH combining scope with name/data, `UpdateMetaObjectInput` encodes that as a discriminated union (content patch XOR scope step-up), and the step-up travels only through `promoteToOrganizationScope`/`replaceTargetProjects`. Also adds `repository.replaceTargetProjects` on the metastore client for the new `PUT /api/v1/repository/{objectType}/{UUID}/target-projects` endpoint.
940
+
941
+ - Every service client now exposes a root-level `healthCheck()`, so "is this service up?" is one typed call instead of a hand-rolled `fetch`.
942
+
943
+ Nineteen clients gained it — `ai`, `auth`, `chat`, `dataScience`, `editor`, `encryption`, `import`, `kaiAgent`, `management`, `notifications`, `oauth`, `queryService`, `queue`, `scheduler`, `storage`, `stream`, `syncActions`, `vault` — and `metastore` already had one. Each resolves with the service's payload when it is up and throws like any other call when it is not. No session is needed: every one of these endpoints answers unauthenticated, so a probe works before login and is unaffected by whether a token rides along.
944
+
945
+ Most services answer `GET /health-check` with `{"status":"ok"}`; `stream` answers `text/plain` `"OK"`, and `chat` probes `/ping` instead since its `/health-check` is authenticated. `storage`, `management` and `auth` share one Connection host, so all three probe the host-level `/health-check` — the prefixed variants (`/v2/storage/health-check`, `/manage/health-check`, `/v1/auth/health-check`) don't exist.
946
+
947
+ **The payload is not part of the contract.** A 200 means up, a throw means down, so no client invents a response type. Where the service's spec declares the probe path, the method is typed from it: `ai`, `editor` and `import` resolve with `{ status: 'ok' }`, and `chat` with `{ timestamp: string }`. Everywhere else the payload resolves as `unknown` rather than an asserted shape — which is the honest type, because these specs are uneven and, where present, often wrong: `vault` declares the path POST-only though a GET answers 200; `metastore` and `queryService` type the body as a bare `{ [key: string]: string }`; and `dataScience` and `oauth` declare a service-info shape with no `status` field at all, despite really answering `{"status":"ok"}`. A client starts returning a real type once its spec matches what the endpoint actually returns, confirmed by probing it.
948
+
949
+ `telemetry` is the one client without the method — it answers 404 on every probe path tried, so it has no liveness endpoint to wrap.
950
+
951
+ ### Patch Changes
952
+
953
+ - `concurrent` no longer keeps draining its queue after the first rejection. It still fails fast
954
+ (Promise.all semantics — the returned promise rejects with the first error, and items already in
955
+ flight run to completion), but items not yet started are abandoned instead of executing detached
956
+ in the background after the caller has already seen the rejection.
957
+
958
+ - `concurrent` and `series` now accept a mapper that returns a plain value, not just a promise
959
+ (`(item, index, arrayLength) => R | PromiseLike<R>`). Runtime behaviour is unchanged — both already
960
+ awaited whatever the mapper returned — so this only removes the need to wrap a sync result, or a
961
+ conditional no-op, in `Promise.resolve` to satisfy the type.
962
+
963
+ - `delay` now detaches its abort listener when the timeout wins the race. `{ once: true }` only
964
+ removes a listener after the event fires, so every completed delay left one behind on the signal.
965
+ `poll` hands the same signal to `delay` on every iteration, which meant a long poll accumulated one
966
+ listener per interval for as long as the signal stayed alive — and made the eventual `abort()` walk
967
+ all of them.
968
+
969
+ - Declaration emit is now opt-out via `DTS=false` (default unchanged: on).
970
+
971
+ Emitting `.d.ts` files is ~94% of this package's build memory — 5.7GB peak in CI, 7GB locally — because tsup runs a single `tsc` pass over all 52 subpath entries, so every entry's type graph is resident at once. The JS bundling is the remaining ~1%. An `ubuntu-latest` runner has ~7GB of RAM, less what dockerd and buildx hold, which is why `build` grants `--max-old-space-size=8192` and why the `kai-agent` image build was OOM-killed (exit 137) on 3 of 4 canary deploy attempts.
972
+
973
+ Setting `DTS=false` drops the same build to 0.37GB and ~2s. `apps/kai-agent`'s Dockerfile now sets it, since nothing in that image consumes declarations: Node resolves only `dist/*.js`, and the app's `build` is a bare `tsup` (esbuild, transpile-only) that never type-checks.
974
+
975
+ **Nothing changes for npm consumers, local dev, or publishing** — the default still emits all 156 declaration files. Only a build that explicitly opts out is affected, and only a build that does not type-check may do so: `next build`-style consumers must not set it, because without declarations every type-only export resolves to nothing.
976
+
977
+ The flag is declared as `env` (not `passThroughEnv`) in `packages/api-client/turbo.json`, so it participates in this package's cache key and a `DTS=false` caller cannot be served a dts-enabled cache hit. Scoping it to the package config rather than the root `build` task keeps every other workspace's cache key unchanged.
978
+
979
+ - `configurations.purgeConfigurations` now runs 10 purges at a time instead of inheriting `concurrent`'s default of 2.
980
+
981
+ The method exists for the whole-trash case, where the default walked a trash of 60 configurations through 30 sequential round-trips. Callers that previously fanned out per component (a `concurrent` queue each) had a wider window than this by accident; 10 restores the throughput while keeping the peak bounded, which the per-component shape never was.
982
+
983
+ - `series`' docblock now states that it resolves with the mapped results rather than with the original
984
+ items. No behaviour change — the resolved value is the one thing a caller has to check per site.
985
+
986
+ - `createLegacyKeboola` can now bootstrap with a storage token that carries no `admin` block.
987
+
988
+ `GET /v2/storage/tokens/verify` omits `admin` for a token created via `POST /v2/storage/tokens`, but `createProject` built its admin feature set eagerly, so the session build threw `TypeError: Cannot read properties of undefined (reading 'features')` and never reached ready. The failure was also silent — `authenticateStorageAsync` awaits `settled()`, which resolves on error too, so nothing rejected and the consumer only saw `The client is not ready`.
989
+
990
+ `hasAdminFeature` now answers `false` for such a token instead of throwing. The type still declares `admin` as required, which is correct for every token connection injects; modelling the two token kinds is left for its own change.
991
+
992
+ ## 26.0.0
993
+
994
+ ### Minor Changes
995
+
996
+ - `SudoBody` is now the `SudoRequest` input schema instead of the generated request-body type. The generated body resolved to `SudoRequest2`, which is derived from the PHP request object's readable properties rather than its `#[OA\Schema]` — so it required every factor field and added a `type` discriminator the endpoint does not accept. `POST /v1/auth/sudo` validates with an `Assert\Collection` (`allowExtraFields: false`, per-field `Optional([NotBlank])`), so the old type described a body that was always rejected with a 400: `type` is an extra key, and a present-but-null field fails `NotBlank`. Pass exactly the one populated factor field.
997
+
998
+ ### Patch Changes
999
+
1000
+ - These packages now ship their `AGENTS.md` usage contract to npm, so external
1001
+ consumers (and their AI agents) can read it at
1002
+ `node_modules/@keboola/<name>/AGENTS.md`, version-pinned to the release they
1003
+ actually installed.
1004
+
1005
+ Previously only `@keboola/design` published its `AGENTS.md`; every other package
1006
+ omitted it from `files`, so instructions that point agents at that path — such as
1007
+ `apps/boilerplate/AGENTS.md` — silently resolved to nothing outside the monorepo.
1008
+ No code or type changes.
1009
+
1010
+ ## 25.0.0
1011
+
1012
+ ### Major Changes
1013
+
1014
+ - Make the table snapshot and data-preview methods branch-aware. `api.storage.tables.loadTableSnapshots`, `createSnapshot` and `getDataPreview` now call the `/v2/storage/branch/{branchId}/…` endpoints and take a single `*Input` object carrying `branchId` and `tableId`, with `signal` as the trailing argument — the shape `updateTableDefinition` already uses:
1015
+ - `loadTableSnapshots({ branchId, tableId, ...query }: LoadTableSnapshotsInput, signal?)` — the query (`limit`, `offset`) is forwarded; previously none was sent at all.
1016
+ - `createSnapshot({ branchId, tableId, ...body }: CreateSnapshotInput, signal?)`
1017
+ - `getDataPreview({ branchId, tableId, ...query }: GetDataPreviewInput, signal?)`
1018
+
1019
+ `api.sdk.storage.createSnapshot(input: CreateSnapshotInput, options?)` takes the same input.
1020
+
1021
+ `loadTableSnapshots` and `createSnapshot` now go through the typed OpenAPI client, with `CreateSnapshotBody` and `GetSnapshotsQuery` derived from the regenerated storage schema. `getDataPreview` and `deleteSnapshot` stay on the generic client: the swagger declares `query?: never` for data-preview and a single bodyless `default` response for the snapshot delete, so the OpenAPI client cannot express either call.
1022
+
1023
+ The data-preview query type is renamed `GetDataPreview` → `GetDataPreviewQuery`, matching `GetTablesQuery` / `GetSnapshotsQuery` / `GetBucketsQuery`, and now also accepts `fulltextSearch` and `orderBy` — both supported by the endpoint but missing from the storage OpenAPI spec.
1024
+
1025
+ The remaining reads that a dev branch resolves per object are branch-aware too, each taking the same kind of input object:
1026
+ - `tables.getTable({ branchId, tableId }, signal?)`
1027
+ - `buckets.getBucket({ branchId, bucketId, include? }, signal?)` — `include` is new (`columns`, `metadata`, `columnMetadata`, `sourceMetadata`)
1028
+ - `buckets.getBucketOwner({ branchId, bucketId }, signal?)`
1029
+ - `events.getTableEvents({ branchId, tableId, ...query }, signal?)`
1030
+ - `events.getBucketEvents({ branchId, bucketId, ...query }, signal?)` — new method
1031
+
1032
+ `GetTableEventsQuery` is renamed `GetObjectEventsQuery` since both feeds share it, and it is now derived from the schema — so it also carries `sortOrder`, `configurationId`, `runId` and `query`, which the endpoint accepts but the hand-written type omitted. `TableEvent` types the whole event payload (`description`, `context`, `token`, `idBranch`, `uri`, `attachments`, …) rather than only the fields the first consumer needed.
1033
+
1034
+ These five reads go through the typed OpenAPI client. `getBucketOwner` returns the schema's own shape; the others keep their hand-authored response types, because the schema models `metadata`, `columnMetadata`, `bucket`, `definition`, `params`, `results` and `performance` as bare `Record<string, never>`.
1035
+
1036
+ The storage schema is regenerated from the live spec, which also picks up `POST /v2/storage/tables/{tableId}/alias-filter` and its `SetAliasFilterRequest` / `AliasFilterSetResponse` models.
1037
+
1038
+ `deleteSnapshot(snapshotId, signal?)` keeps its signature — a snapshot id is unique across branches, so the API has no branch-scoped variant — but now returns the storage job that performs the delete (`null` when the backend answers with no content) instead of `void`.
1039
+
1040
+ - Add a typed `syncActions.apify` namespace, and make every sync action fail as one error class.
1041
+
1042
+ `api.syncActions.apify.getActors(input, signal?)` and `getTasks(input, signal?)` take `{ '#token', branchId, tag?, mode? }` and answer `{ id, name }[]`, with both the request body and the response validated by zod.
1043
+
1044
+ **`SyncActionError`** (guard: `isSyncActionError`) is new. A component reports failure two ways — a non-2xx response, and a **2xx** whose body carries `status: 'error'` (it ran, and said no) — and the client's `validateStatus` now collapses both into it, carrying `message`, `exceptionId`, `code` and the raw `data`. It is a peer of `ApiError`, not a subclass: a component answering `status: 'error'` on a 200 gave a business answer, not a transport failure, so it deliberately does **not** satisfy `isApiError` / `isFetchClientError` — those drive retry and "network problem" handling, and `err.response.status` would read 200 and mislead every status-based branch.
1045
+
1046
+ Breaking:
1047
+ - `sendSyncAction(body, signal?)` → `sendSyncAction(body, options?)`, where `options` is `{ signal?, validateStatus? }`. The per-request `validateStatus` lets a namespace recognise a failure only its own action knows about — `apify` uses it for the `{ timeout: true }` body a slow account answers with on a 200.
1048
+ - `branchId` is now **required** on every sync-action input, and `gitRepository.*` inherits that. Omitting it never changed anything: the service normalises a missing, empty or `null` value to `"default"` and resolves that to the default branch's numeric id — the same id, branch type and downstream context an explicit value resolves to, with no extra lookup either way. Both a numeric id and the literal `"default"` are accepted.
1049
+ - `PostActionsBody` is removed. `syncActionBodySchema` is now the contract the client validates every outgoing `/actions` body against, and `SyncActionBody` is inferred from it; `configData` stays an arbitrary object, with each namespace validating the shape its own action needs. `PostActionsBodyRaw` remains, only for the `openapi-fetch` cast.
1050
+
1051
+ Also: `ValidateStatusFn` is exported from the `fetchClient` entry point, and `ComponentId.APIFY` is added.
1052
+
1053
+ ## 24.0.0
1054
+
1055
+ ### Major Changes
1056
+
1057
+ - Generate the `api.oauth` types from the OAuth service's OpenAPI document.
1058
+
1059
+ The oauth client predates the service publishing a spec, so it was built on
1060
+ `createGenericFetchClient` with every shape hand-written. The service now serves an OpenAPI 3.0
1061
+ document, which is registered in `redocly.yaml` and generated into
1062
+ `clients/oauth/__generated__/schema.d.ts`; the client moves to `createOpenapiFetchClient<paths>`.
1063
+ Reading the spec against the hand-written types turned up three divergences:
1064
+ - **`branchId` is a filter, not a scope.** `GET /credentials` documents the query parameter as _"Use
1065
+ value `null` to get credentials without branchId"_ — the literal string. Omitting it applies no
1066
+ filter and returns every credential in the project, so a caller that meant "project-wide" and
1067
+ passed no query got the whole project back. `getCredentials` now takes a **required**
1068
+ `CredentialsScope` — `{ scope: 'all' }`, `{ scope: 'branchless' }` or
1069
+ `{ scope: 'branched', branchId }` — so the scope is always stated and a missing branch id is a
1070
+ compile error instead of a silent unfiltered read. Discriminating on the `scope` literal rather
1071
+ than on the presence of `branchId` is deliberate: a flat `string | 'all' | 'branchless'` union
1072
+ would collapse to `string`, turning a typo into a branch-id filter that matches nothing.
1073
+ `GetCredentialsQuery` is gone, replaced by `CredentialsScope`.
1074
+ - **`Credential` was wrong in both directions.** It declared `componentId`, `configurationId` and
1075
+ `data`, none of which the service returns, and omitted `oauthVersion`, `appKey`, `#appSecret` and
1076
+ `#data`, all of which are required by the spec — and all of which kbc-ui already reads off a
1077
+ credential.
1078
+ - **The two create shapes were named backwards.** The `#data`-JSON-string body was called
1079
+ `_createLegacyCredentials`, but that is the shape the current spec documents; the `data`-object
1080
+ body tried first is the pre-spec one. Renamed accordingly. The 422 fallback and its ordering are
1081
+ unchanged, so no stack changes which path it takes.
1082
+
1083
+ Every method now takes a single `*Input` object, matching the convention the storage clients already
1084
+ use (`CopyConfigurationFromVersionInput = Path & Body`): `createCredential(input)`,
1085
+ `getCredential({ componentId, id })`, `deleteCredential({ componentId, id })`,
1086
+ `getCredentials(scope)`. That retires the `(componentId, id)` pairs, where two adjacent strings could
1087
+ be swapped with no complaint from the compiler and a 404 at runtime. `CredentialInput` names the
1088
+ second path segment `id` rather than the spec's `name` — the spec describes it as "Credentials name
1089
+ (authorization ID)" and the resource carries it as `id`, so `name` is a URL-template label rather
1090
+ than the domain term.
1091
+
1092
+ `createCredential`'s payload argument keeps the `{ id, authorizedFor, branchId?, data }` shape,
1093
+ renamed from `CreateCredentialBody` because that name now means the generated `#data` wire shape. The
1094
+ two wire shapes are produced by `encodeCredentialsData(data, 'encrypted' | 'plain')`, so the retry
1095
+ differs from the first attempt by one named argument rather than by a second implementation.
1096
+
1097
+ `OpenapiBodyType` now also infers bodies declared as `application/x-www-form-urlencoded` (the oauth
1098
+ create endpoint declares only that content type). Requests are still sent as JSON, which those
1099
+ services accept.
1100
+
1101
+ Breaking for anyone importing `Credential` and reading `componentId` / `configurationId` / `data`,
1102
+ naming `CreateCredentialBody` as the `createCredential` argument type, or calling `getCredentials()`
1103
+ with no argument — that call now has to say which scope it means.
1104
+
1105
+ - **Breaking:** the `@keboola/api-client/assets/types` sub-path is replaced by
1106
+ `@keboola/api-client/assets/schema`. Update any `import type { Post } from '.../assets/types'` to
1107
+ `'.../assets/schema'` — the type is unchanged, it is now inferred from a zod schema rather than
1108
+ hand-written.
1109
+
1110
+ The assets client is the first client whose responses are **validated at runtime** rather than cast.
1111
+ Assets are static JSON published to `ui.keboola-assets.com` with no OpenAPI spec behind them, so the
1112
+ zod schemas in `assets/schema.ts` are the contract: a drifted asset now fails loudly at the boundary
1113
+ instead of surfacing as `undefined` deep in a consumer. `getPublishedChangelogPosts` parses its
1114
+ response, which means a malformed post rejects the call where it previously resolved with a
1115
+ partly-broken object.
1116
+
1117
+ New: `assets.getComponentTemplates(componentId, signal?)` reads
1118
+ `/kbc-ui-templates/{componentId}.json` — the configuration templates that back generic component
1119
+ UIs, previously fetched by a hand-rolled superagent module in `kbc-ui`.
1120
+
1121
+ New: the `fetchFn` escape hatch is now accepted **per request**, not just when a client is
1122
+ constructed — `client.post(url, params, { fetchFn })` swaps the transport for that one call, and an
1123
+ endpoint-level `fetchFn` beats the client-level one. Everything above it is unchanged: the request is
1124
+ built the same way, the middleware chain still wraps the call, and `validateStatus`, response parsing
1125
+ and the `ApiError` / `isAbortError` / `isFetchClientError` contract all still apply. Reach for it
1126
+ when the platform's `fetch` cannot do the job — the resolved transport travels with the request, so a
1127
+ middleware that rebuilds the request context must spread it (`next({ ...ctx, request })`), exactly as
1128
+ it already must for `validateStatus`.
1129
+
1130
+ **Breaking:** both import methods take two arguments now — **what** to import, then **how** to run
1131
+ the request. The positional `file` moves into the input object, and `signal` / `onProgress` share the
1132
+ options bag:
1133
+
1134
+ ```diff
1135
+ - api.import.uploadFile(file, { isPermanent: true, tags }, signal, onProgress)
1136
+ + api.import.uploadFile({ file, isPermanent: true, tags }, { signal, onProgress })
1137
+ ```
1138
+
1139
+ `UploadFileParams` is renamed `UploadFileInput` (it now carries `file`).
1140
+
1141
+ Both inputs are derived from the spec's own multipart fields rather than restated by hand, so their
1142
+ names, optionality and doc comments track the swagger. Two consequences: `uploadFile` accepts
1143
+ `isPublic`, which the spec has always documented and the hand-written type omitted, and a field
1144
+ added upstream appears without a code change. Only `data` is renamed — it is the `File` you pass as
1145
+ `file` — and repeated `foo[]` parts are exposed unsuffixed (`tags`, `columns`), which is what the
1146
+ old hand-written types already spelled.
1147
+
1148
+ New: `onProgress` reports `{ loaded, total, percent }` while the request body uploads. `fetch` cannot
1149
+ observe upload progress across browsers (streaming request bodies are Chromium-only), so when — and
1150
+ only when — `onProgress` is supplied, that single request is dispatched over an
1151
+ `XMLHttpRequest`-backed `fetch` implementation via the `fetchFn` option above. In Node — where there
1152
+ is no XHR — the call falls back to `fetch` and simply reports no progress rather than failing.
1153
+
1154
+ The import client is now generated from the service's own OpenAPI spec
1155
+ (`https://import.keboola.com/docs/swagger.yaml`) and built on `createOpenapiFetchClient`, so its
1156
+ paths and its response type come from the spec instead of hand-written generics. `UploadedFile` is
1157
+ the spec's `FileResource` verbatim — every property is required there, so it keeps the same
1158
+ non-optional fields it always had while the spec's rest (`fileType`, `provider`, `region`,
1159
+ `maxAgeDays`, `isSliced`, `isEncrypted`, `runId`, `runIds`, `creatorToken`) are now typed too.
1160
+ `maxAgeDays` and `runId` are nullable; `runId` / `runIds` are strings, not numbers.
1161
+
1162
+ New: `import.writeTable({ tableId, file, … }, options?)` covers the spec's other operation — a
1163
+ single-request CSV import into an existing Storage table, with `incremental`, `columns`, `delimiter`,
1164
+ `enclosure`, `escapedBy` and `branchId` on the input and the same `ImportRequestOptions` second
1165
+ argument. It returns the spec's `TableResource` verbatim — `transaction` (nullable), `warnings`,
1166
+ `newColumns`, `importedColumns`, `importedRowsCount`, `totalRowsCount` and `totalDataSizeBytes`.
1167
+
1168
+ Multipart endpoints are typable at last: `OpenapiBodyType` resolves an operation whose request body
1169
+ is `multipart/form-data` to `FormData` (previously `never`, so such a path typed as `body?: never`
1170
+ and rejected the only value you can actually send). The generated per-field shape is deliberately
1171
+ not used as the body type — a multipart body is a `FormData` on the wire, and that is what the client
1172
+ forwards untouched. Its complement `OpenapiFormDataType` reports the fields _inside_ that body, with
1173
+ the wire's repeat suffix stripped (`'tags[]'?: string[]` → `tags?: string[]`), so a client can build
1174
+ its input type from the spec.
1175
+
1176
+ - The management client is now typed entirely by its OpenAPI schema and covers the whole manage API.
1177
+
1178
+ **Fixed — every admin-feature call keyed by email was sending a mangled path.**
1179
+ `users.addUserAdminFeature` / `removeUserAdminFeature` called `encodeURIComponent` on the email, but
1180
+ `createPath` already percent-encodes every path parameter, so it went out encoded twice:
1181
+ `a+b@keboola.com` became `a%252Bb%2540keboola.com` instead of `a%2Bb%40keboola.com`. The manual call
1182
+ is gone. Anything toggling an admin feature by email rather than numeric id was affected.
1183
+
1184
+ `features`, `projects` and `users` were the last sub-clients on `createGenericFetchClient`, where the
1185
+ path is an untyped `string` and the response type is whatever generic argument the author wrote. All
1186
+ three moved to the OpenAPI client, which caught two response-type mismatches the generic client had
1187
+ been hiding:
1188
+ - `POST /manage/projects/{projectId}/users` answers **204 No Content**, so `addProjectUser`'s
1189
+ `Promise<User>` was a lie.
1190
+ - `addProjectFeature` / `moveProject` / `setProjectDisabled` / `updateProject` return the _base_
1191
+ `ProjectResponse`, not the detail — hence the new `ProjectBase` type.
1192
+
1193
+ Two path templates were also corrected — `/manage/features/{featureId}` → `{id}` and
1194
+ `/manage/users/{userIdOrMail}/features/{feature}` → `{idOrEmail}/features/{featureName}` — but those
1195
+ are internal parameter names: `createPath` substitutes `{key}` from whatever object the method passes,
1196
+ so both spellings always produced the same URL. No request changed because of them.
1197
+
1198
+ **New:** 42 of the endpoints the schema declares that had no client method, so a consumer no longer
1199
+ needs a release of this package before it can call one. Per group: projects 6, project-templates 4,
1200
+ maintainers 8 (including 6 SAML), file storage 9 (create / rotate-credentials / set-default across
1201
+ s3, abs, gcs), storage backends 6, users 4, current-user 1, plus a new `api.management.uiApps`
1202
+ namespace with 4.
1203
+
1204
+ Fourteen declared operations are deliberately **not** exposed, each commented where a reader would look
1205
+ for the missing method:
1206
+ - `/manage/internal/auth-bridge/*` — internal token exchange, not client-facing.
1207
+ - `POST /manage/current-user/session-token` — the management auth middleware owns minting and
1208
+ refreshing this token.
1209
+ - `/manage/commands`, `/manage/kubernetes-service-accounts` — ops surface.
1210
+ - `/pay-as-you-go/top-up/try` — billing, and not a `/manage` path.
1211
+ - All three feature writes — features are provisioned by migration; `POST` is deprecated upstream and
1212
+ `PATCH`/`DELETE` edit a definition every project on the stack shares.
1213
+ - `POST /manage/projects/{projectId}/tokens` — mints a Storage token; Storage tokens belong to
1214
+ `api.storage.tokens`, where the permission model is visible at the call site.
1215
+ - `POST /manage/projects/{projectId}/storage-backend` and its `DELETE`, plus
1216
+ `POST /manage/projects/{projectId}/file-storage` — provisioning a project's infrastructure, not a
1217
+ project setting.
1218
+ - `POST /manage/projects/{projectId}/credits` — grants pay-as-you-go credits; a billing operation.
1219
+
1220
+ **Breaking:**
1221
+ - `addProjectUser` resolves `null` instead of `User`. The endpoint returns an empty body; read the
1222
+ member back with `getProjectUsers` if you need it.
1223
+ - `addProjectFeature`, `moveProject`, `setProjectDisabled` and `updateProject` resolve `ProjectBase`
1224
+ rather than `Project`. `Project` (the `GET /manage/projects/{projectId}` detail) adds
1225
+ `organization`, `fileStorage`, `backends`, `timezone` and `usersCount`; if you read one of those off
1226
+ a write's result, follow with `getProject`.
1227
+ - `setProjectMetadata`'s `provider` is `'user' | 'system'`, not `string`.
1228
+ - The `GenericFetchClient` type alias is no longer re-exported from `@keboola/api-client/management` —
1229
+ nothing in the management client uses it any more. The `createGenericFetchClient` factory is
1230
+ unaffected and still exported from the package root.
1231
+
1232
+ Types follow the package's existing Path / Body / Input convention: `XPath` and `XBody` derived via
1233
+ `OpenapiPathType` / `OpenapiBodyType`, combined into `XInput`. The 19 pre-existing methods that
1234
+ carried inline `{ projectId: number } & XBody` signatures were converted too, so no inline object
1235
+ types remain in the sub-clients. Where the schema names a parameter `id` while the public argument is
1236
+ the explicit `organizationId` / `maintainerId` / `id`, the Path type stays hand-written so call sites
1237
+ don't have to rename anything.
1238
+
1239
+ Where the swagger under-models a response it is overridden with a documented `Omit<…> &` rather than
1240
+ adopted verbatim — `fileStorage` is declared S3-only, `backends` lists only `snowflake`, `usersCount`
1241
+ is absent, and the invite / change-role enums omit the SOX roles (`productionManager`, `developer`,
1242
+ `reviewer`) the API really accepts. `CreateProjectInvitationBody` gained `expirationSeconds`, which
1243
+ the schema documents and the hand-written type had omitted.
1244
+
1245
+ ### Minor Changes
1246
+
1247
+ - `UpdateBucketOwnerBody.id` is now `number` instead of `string | number`. The endpoint validates `id` as an integer, so a string id was always rejected with a 400 at runtime — the wider type only hid the mismatch from TypeScript.
1248
+
1249
+ - Guard the configurations SDK with permission checks. `api.sdk.configuration.createConfiguration` / `updateConfiguration` now call `assertCanCreateConfiguration` / `assertCanUpdateConfiguration` before any side effect, throwing `PermissionDeniedError` for a caller whose token can't write to the target branch (dev-vs-production derived from the input `branchId`). Adds `canUpdateConfiguration` / `assertCanUpdateConfiguration` to `@keboola/api-client/domain/permissions`.
1250
+
1251
+ ### Patch Changes
1252
+
1253
+ - Correct the `ClientContext` doc comment describing `stack.host`. It called that field "a bare
1254
+ hostname the stack reports about itself in its index response", which reads as a stack hostname —
1255
+ it is not. The Storage API index's `host` is the API pod that served the request
1256
+ (`connection-api-756b66f7c8-ql5sr`) and differs between two calls to the same stack. The comment
1257
+ now says so and points at `STACKS` (`@keboola/api-client/constants`) for the actual hostname.
1258
+
1259
+ Comment only — no runtime or type change. Shipped as a patch because the text reaches consumers in
1260
+ the published `.d.ts`, and taking that field for a hostname is a live bug it should stop recurring
1261
+ (see the kbc-ui announcement-targeting fix).
1262
+
1263
+ ## 23.0.0
1264
+
1265
+ ### Minor Changes
1266
+
1267
+ - Add bearer account-security auth methods for the standalone account app: `auth.password.change`, and TOTP enrollment under `auth.mfa.totp` (`setup`, `verify`, `disable`).
1268
+
1269
+ - Regenerate the kaiAgent client schema against the current kai-agent OpenAPI spec. `GET /api/usage` now reports `messagesLimit: number | null` — `null` means the deployment enforces no monthly cap, so clients render "unlimited" instead of a number. The snapshot also picks up additive drift since the last refresh: `tableContext` and `toolRestrictions` on `POST /api/chat`, `supportsApprovalRequestedEvent`, `contextWindow` on chat detail, and the `/api/skills` endpoint.
1270
+
1271
+ - Add the manage Users surface to the management client: `getUsers` (paginated list with `q`
1272
+ name/email search and per-user organization/project/maintainer counts), `getUser`,
1273
+ `getUserOrganizations`, `getUserProjects`, `getUserMaintainers` (membership sub-resources),
1274
+ `grantSuperAdmin`, `removeSuperAdmin`, `disableUserMfa` and `deleteUser`. The list, membership and
1275
+ grant endpoints ship with connection#8009; the calls 404 against stacks that predate it.
1276
+
1277
+ - Regenerate the notification service types against the corrected upstream spec.
1278
+
1279
+ The generated `api.notifications` types previously did not describe the real wire contract, and were
1280
+ patched by hand in `clients/notifications/types.ts`. The notification service has since published a
1281
+ fixed OpenAPI document, so every one of those corrections is now resolved at the source:
1282
+ - **`recipient.channel`** was typed `'RecipientChannel_Email' | 'RecipientChannel_Webhook'` because
1283
+ the `oneOf` declared `discriminator.propertyName` without a `mapping`, which makes
1284
+ openapi-typescript substitute the schema name. The spec now carries the `mapping`, so `'email'` and
1285
+ `'webhook'` are generated correctly.
1286
+ - **`filters[].operator`** (`'==' | '>='`) is now documented and generated. `filters[].field` and
1287
+ `filters[].value` also became `required`, matching what the service actually demands.
1288
+ - **`projectId`** has been dropped from the subscription schema entirely — the service resolves the
1289
+ project from the authorization token, which is what consumers already relied on.
1290
+ - **`ProjectSubscription.id`** is now `required` rather than optional, so
1291
+ `deleteSubscription(subscription.id)` no longer needs a non-null assertion.
1292
+ - **`subscriptionId`** path parameters were declared `type: integer` while ids are `NumericString` on
1293
+ the wire, so `ProjectSubscription['id']` could not be passed back into `getSubscription` /
1294
+ `deleteSubscription`. They now reference `NumericString`, and the client no longer coerces with
1295
+ `Number()`.
1296
+
1297
+ Every exported type is now derived from the generated schema — `clients/notifications/types.ts`
1298
+ contains no hand-written shapes and no corrections, and the client carries no type assertions.
1299
+
1300
+ Adds `createSubscriptions(bodies, signal?)` and `deleteSubscriptions(ids, signal?)`, which fan out
1301
+ one request per subscription with a concurrency limit — the service has no bulk endpoints. Mirrors
1302
+ the existing `storage.tables.deleteTables` / `storage.workspaces.deleteWorkspaces` shape, so
1303
+ consumers don't re-implement the fan-out (and don't reach for bluebird to get a concurrency cap).
1304
+
1305
+ This is a compile-time break only for code that worked around the old, wrong types — code passing the
1306
+ synthetic `'RecipientChannel_Email'` literal, or supplying `projectId`. Runtime behavior is unchanged.
1307
+
1308
+ - Add `api.scheduler.deleteSchedulesForConfigurations(configurationIds, signal?)` — a bulk companion to
1309
+ the existing single-configuration `deleteSchedulesForConfiguration`. It fans the deletes out with the
1310
+ package's `concurrent` utility at a fixed concurrency of 3, mirroring
1311
+ `api.storage.workspaces.deleteWorkspaces`, and resolves `void`.
1312
+
1313
+ Additive only — no existing method changes. Callers that were hand-rolling a `concurrent` /
1314
+ `Promise.map` loop over `deleteSchedulesForConfiguration` (and picking their own concurrency) can drop
1315
+ that and call this instead. Note it fails fast like `Promise.all`: the first rejected delete rejects
1316
+ the whole call, and deletes already in flight are not rolled back.
1317
+
1318
+ - Add `assets.getAnnouncements()` — fetches the static in-platform announcements feed
1319
+ (`/platform-announcements/announcements.json`) from the assets host. The response is
1320
+ deliberately typed `unknown`: the feed is hand-authored outside the repo, so the consumer owns
1321
+ runtime validation and decides how to treat malformed entries.
1322
+
1323
+ ### Patch Changes
1324
+
1325
+ - Add `isKaiSettingsWriterRole`, `canWriteKaiSettings` and `assertCanWriteKaiSettings` to
1326
+ `@keboola/api-client/domain/permissions`.
1327
+
1328
+ `canWriteKaiSettings(token)` is `token.isMasterToken && isKaiSettingsWriterRole(token.admin?.role)`
1329
+ and is true only for the `admin` and `share` roles. It gates writes to Kai's project-wide custom
1330
+ instructions, which are injected into the system prompt of every project member — `developer`,
1331
+ `reviewer`, `productionManager`, `readOnly`, `guest` and any role added upstream are denied, as is any
1332
+ limited (non-master) token.
1333
+
1334
+ The role predicate is an allowlist and takes the raw role string, so a caller holding an unparsed
1335
+ `tokens.verify()` response can use it without constructing a `StorageToken`.
1336
+
1337
+ - Internal: the `STACKS` registry and its types (`KeboolaStack`, `Provider`, `Continent`) move out of
1338
+ `constants/index.ts` into `constants/stacks.ts`, so consumers of any other constant no longer pull the
1339
+ whole table in. Re-exported from the barrel — the `@keboola/api-client/constants` surface is unchanged
1340
+ and no import needs updating.
1341
+
1342
+ ## 22.0.0
1343
+
1344
+ ### Minor Changes
1345
+
1346
+ - Expose the configured stack on the client context as `api.context.baseUrl`. The SDK already held the
1347
+ absolute URL every request is built on (injected via `session.setBaseUrl()` / the `baseUrl` option),
1348
+ but it was only readable through `session.debug()`. It is now a first-class context field, canonical
1349
+ form (absolute, no trailing slash — normalized with the same `normalizeBaseUrl` used at the
1350
+ `baseUrl + path` join). No runtime behavior changes.
1351
+
1352
+ `ClientContext` is exported from the package root and gains a **required** property, so while this is
1353
+ additive for the normal read path (`api.context.baseUrl`), it is a compile-time break for any
1354
+ downstream code that _constructs_ a `ClientContext` value — hand-rolled test mocks, most likely. In
1355
+ practice that is unlikely: the type is what `api.context` hands you, and building one already requires
1356
+ the internal `createStack` / `createDefaultBranch` / `createStorageTable` return shapes. If you do
1357
+ mock it, add `baseUrl`.
1358
+
1359
+ Prefer it over `api.context.stack.host` when you need a URL: `stack.host` is a bare hostname the
1360
+ stack reports about itself in its index response and is never used to route a request.
1361
+
1362
+ - Add the remaining queue endpoints to `api.queue`: `createJob` (`POST /jobs`), `killJob` (`POST /jobs/{jobId}/kill`), `searchGroupedJobs` (`GET /search/grouped-jobs`) and `getOrchestrationRerunPlan` (`GET /orchestration-rerun-plan/{jobId}`).
1363
+
1364
+ `SearchJobsQuery` also accepts `parentRunId` — the queue swagger omits it from `/search/jobs` although the API supports it.
1365
+
1366
+ Add `api.queue.searchAllJobs(query, signal?)`, which pages through `/search/jobs` and returns every match. `query.limit` keeps its documented meaning — items per page — while `offset` is omitted from the query type, since the traversal owns it.
1367
+
1368
+ Add the `collect` async utility behind it, which gathers items from an offset-paginated endpoint — up to `limit` of them, or all of them when `limit` is omitted. It hands `pageSize` to the fetch callback and ends on a page shorter than that; without a `pageSize` it ends only on an empty page, at the cost of one extra request.
1369
+
1370
+ - Add the `auth.password` sub-client for the forgot-password flow:
1371
+ - `auth.password.resetRequest({ email })` — request a reset token by e-mail
1372
+ (`POST /v1/auth/password/reset-request`; always resolves, reveals nothing about
1373
+ account existence).
1374
+ - `auth.password.reset({ token, newPassword, revokeSessions? })` — set a new
1375
+ password with the emailed reset token (`POST /v1/auth/password/reset`).
1376
+
1377
+ Input schemas (`resetRequestInputSchema`, `resetInputSchema`) are exported from
1378
+ `@keboola/api-client/auth`, matching the existing `login`/`mfa` sub-clients.
1379
+
1380
+ - Add `session.clearProject()` to the bearer flow — the inverse of `setProject`, for leaving a project without signing out.
1381
+
1382
+ The credential is untouched, so no refresh is triggered; only the project scope drops. The project clients are keyed on that scope, so they tear down and the storage build returns to `idle`, which means a consumer gating on `isStorageReady()` falls back to its project picker while `auth` and `management` stay usable. The persisted session is rewritten with `projectId: null`, so a reload lands on the picker rather than re-entering the project. `reset()` remains the way to sign out.
1383
+
1384
+ No-op unless the session is currently scoped.
1385
+
1386
+ - Add shared semantic-layer primitives to `api.sdk.semanticLayer`, so consumers stop re-deriving them.
1387
+ Purely additive — no runtime behavior changes, nothing removed or narrowed.
1388
+
1389
+ **Two new methods:**
1390
+ - `listModelChildren(modelUUID, signal?)` — every child object of a model across all five types,
1391
+ flattened, each with its user-facing name. This is the fan-out `deleteModel` already performed
1392
+ internally, now callable: a caller can say what a delete _would_ destroy before asking the user to
1393
+ confirm it. `deleteModel` is refactored to use it, with identical behavior.
1394
+ - `findObjectsByName(objectType, name, modelUUID, signal?)` — resolve a child object by the name a
1395
+ user would type. Returns **every** match rather than one, because a name is not unique: an agent
1396
+ can treat that as an ambiguity error while a UI can render a picker. Glossary entries key on
1397
+ `term`, so both are matched.
1398
+
1399
+ **New runtime constants** for values the metastore validates but the types leave wide:
1400
+ `SQL_DIALECTS` (`'Snowflake' | 'BigQuery'`), `CONSTRAINT_TYPES`, and `MODEL_CHILD_OBJECT_TYPES`
1401
+ (previously module-private).
1402
+
1403
+ **New zod schemas** — `semanticModelSchema`, `semanticDatasetSchema`, `semanticMetricSchema`,
1404
+ `semanticRelationshipSchema`, `semanticGlossarySchema`, `semanticConstraintSchema`, plus
1405
+ `SEMANTIC_CHILD_OBJECT_SCHEMAS` keyed by object type. For callers that accept untrusted or
1406
+ hand-authored payloads (an agent tool call, a form) and want a useful error instead of the
1407
+ metastore's opaque "Validation failed". Each declares only the fields the SDK types mark required and
1408
+ is a `looseObject`, so unknown fields pass through untouched — the metastore stays the source of
1409
+ truth for the full schema. **The SDK does not parse on its own writes**, so existing callers are
1410
+ unaffected.
1411
+
1412
+ Worth knowing if you write models directly: `sql_dialect` is snake_case and accepts exactly
1413
+ `'Snowflake'` or `'BigQuery'`. Anything else — camelCase key, lowercase value, `Redshift` — is a 422
1414
+ that names neither the field nor the accepted values. `SemanticModelData.sql_dialect` stays typed
1415
+ `string` here (narrowing it would break callers passing a `string` variable); validate with
1416
+ `semanticModelSchema` or `SQL_DIALECTS` instead.
1417
+
1418
+ ### Patch Changes
1419
+
1420
+ - Refresh the generated OpenAPI types across the ai, chat, dataScience, management, queryService, queue, storage, syncActions and vault clients. No runtime behavior changes — types only.
1421
+
1422
+ Additive: `api.queue.createJob` accepts `delayedStartTime` and `delay`; `api.ai.getComponentDetail` returns `synchronousActions`; `api.storage.triggers.listTriggers` widens a field to nullable; storage request bodies are typed rather than opaque; query service documents a 504 response.
1423
+
1424
+ Two removals are compile-time breaks for anyone reading them, both for endpoints/fields the platform no longer serves:
1425
+ - `api.ai.feedback` no longer accepts `subject: { type: 'conversation', conversationId }` — the `/conversations/*` endpoints are gone from the AI service. The `component-suggestions` arm is unaffected.
1426
+ - The data app shape behind `api.dataScience.createApp` / `getApp` / `getApps` / `patchApp` / `resetAppPassword` drops the required `provisioningStrategy: 'jobQueue' | 'operator'` field, following the data science API's v2 schema.
1427
+
1428
+ - Validate the `GET /vote` response in the chat and kai-agent clients. `getVotes` returned whatever the
1429
+ transport parsed, so a 200 carrying a non-JSON body (proxy error page, truncated payload) resolved to
1430
+ a **string** typed as `Vote[]` — and the first `.find()` on it threw `TypeError: n.find is not a
1431
+ function`, taking the whole Kai chat panel down through the error boundary. The response is now parsed
1432
+ with zod and a malformed payload rejects with `Invalid votes response format`, the same shape the
1433
+ neighbouring `getSuggestions` / `getAgentSettings` calls already use.
1434
+
1435
+ - Regenerate the auth OpenAPI schema from the production spec. Additive schema
1436
+ refresh — no new client methods (those land with the features that consume them).
1437
+
1438
+ New typed paths:
1439
+ - Password reset/change — `/v1/auth/password/reset-request`, `/reset`, `/change`
1440
+ - MFA TOTP enrollment — `/v1/auth/mfa/totp`, `/totp/verify`, `/totp/{id}`
1441
+ - PKCE authorize — `/admin/auth/pkce/authorize`
1442
+
1443
+ Surface change: `auth.sudo.verify`'s request body gains a `password` field
1444
+ (`string | null`, required-nullable — the same shape as its sibling `totpCode` /
1445
+ `recoveryCode` / `webauthnAssertion` fields), reflecting that the endpoint now
1446
+ also accepts an account password for MFA-less accounts. No in-repo callers today.
1447
+
1448
+ - `semanticLayer.listModelChildren` now labels each child with its display name — a constraint's `displayName` in preference to its `name`, matching what the semantic-layer tables render. Lookup via `findObjectsByName` is unchanged and still addresses objects by their unique `name`.
1449
+
1450
+ ## 21.0.0
1451
+
1452
+ ### Major Changes
1453
+
1454
+ - Reshape the SDK lifecycle around two authentication flows behind one product surface.
1455
+ - **Breaking:** the entry points are now `createKeboola()` (bearer / OAuth) and `createLegacyKeboola()` (legacy SAPI + management token). Each returns `{ api, session }` — `api` is the flow-agnostic product surface (`auth`, `management`, `storage`, `queue`, `context`, `sdk`, …); `session` is the flow-specific lifecycle (bearer: `authenticate(credential)` → `setProject(id)`; legacy: `authenticateStorage(sapiToken)` / `authenticateManagement(manageToken)`). The old `createApiClient()` / `init()` lifecycle and the `ApiClient` type are removed.
1456
+ - **Breaking:** per-service factories take an `auth` strategy instead of a bare token — `createStorageClient({ baseUrl, auth: { type: 'sapi-token', token } })`, `createManagementClient({ baseUrl, auth: { type: 'management-token', token } })` (bearer: `{ type: 'bearer', token }`). `createManagementClient` keeps `withAuthMiddleware` (default `true`; pass `false` for a raw validity-check client).
1457
+ - `@keboola/api-client-react` exposes three providers: `ApiClientProvider` (propagates `api` to `useApiClient()`), `LegacyAuthProvider` (drives the legacy session to ready and gates on a fallback), and `AuthProvider` (bearer; finished with the login flow in a follow-up). `useApiClient` / `useProject` / `useStack` return the `api` surface.
1458
+ - **Breaking:** the token-less public clients `assets` / `status` are not part of the keboola client — import `createAssetsClient` / `createStatusClient` from `@keboola/api-client/assets` and `@keboola/api-client/status`. `metastore` is a stack-discovered service, exposed as `api.metastore`.
1459
+ - `KeboolaError` / `isKeboolaError` are exported from the package root and are the errors the client actually throws (lifecycle gating: `NotReady`, `Unconfigured`, `NoManagementToken`, …).
1460
+
1461
+ Migration: `const api = createApiClient(); await api.init(opts)` → `const { api, session } = createLegacyKeboola(opts); await session.authenticateStorageAsync(token)` (or `createKeboola` for the bearer flow). Per-service: `createStorageClient({ baseUrl, token })` → `createStorageClient({ baseUrl, auth: { type: 'sapi-token', token } })`.
1462
+
1463
+ - Surface configuration rows in the config diff and send them back on rebase.
1464
+ - `ConfigurationDiffSide.diff` now carries a typed `rows` array (`ConfigurationDiffContent` / `ConfigurationDiffRow`) — additive on the diff response.
1465
+ - **Breaking:** `RebaseConfigurationBody` gains a **required** `rows` field (`RebaseConfigurationRow`). Callers of `rebaseConfiguration` must now pass the resolved row set — the backend requires it for a keep rebase and reconciles rows by id (id in base → update, id absent/missing → create, base row absent from the request → delete). `[]` deletes all rows; array order is the row sort order.
1466
+
1467
+ ### Minor Changes
1468
+
1469
+ - Add `api.management.projects.getProjectTemplates()` (`GET /manage/project-templates`) and export the `ProjectTemplate` type from `@keboola/api-client/management/types`. Returns the list of available project templates (id, name, description, …).
1470
+
1471
+ - Add durable bearer session persistence, built on a new reusable persistor.
1472
+ - **`createPersistor`** — a durable key/value cell over a minimal synchronous `StorageAdapter`, with adapters `createLocalStorage` / `createSessionStorage` / `createMemoryStorage` / `createNullStorage` (browser adapters degrade to memory on Node/SSR). All exported from the package root. `hydrate()` is total: empty, undecodable, or schema-invalid storage falls back to a caller-supplied default and drops the corrupt entry.
1473
+ - **Bearer session persistence** — `createKeboola({ storage })` mirrors the durable session subset (`baseUrl`, `projectId`, `refreshToken`) into the adapter under one key; the access token and identity are never stored. `session.restore()` rehydrates on startup by exchanging the persisted refresh token for a fresh credential and re-scoping to the stored project, resolving `{ status: 'restored' | 'expired' | 'empty' }`; `session.reset()` clears the stored session.
1474
+
1475
+ - Add `management.projects.setProjectLimits()` (POST /manage/projects/{projectId}/limits) for setting project limits, with a `SetProjectLimitsBody` type.
1476
+
1477
+ - Add list methods for storage backends and file storages: `management.storageBackends.getStorageBackends()` (GET /manage/storage-backend) and a new `management.fileStorage` client with `getFileStoragesS3` / `getFileStoragesAbs` / `getFileStoragesGcs` (GET /manage/file-storage-{s3,abs,gcs}).
1478
+
1479
+ - Finish the bearer (programmatic) auth flow. `AuthProvider` is now the bearer twin of `LegacyAuthProvider`: it takes `baseUrl` / `credential` / `projectId` (plus optional `onAccessTokenChange` and `fallback`), drives the session to ready on mount, mirrors the rotating access token out via `onAccessTokenChange`, and gates its children behind readiness.
1480
+
1481
+ - Authenticate auth-service calls in the bearer flow, and expose whether a session is persisted.
1482
+ - `api.auth` now carries the bearer auth middleware, so authenticated auth-service endpoints (`token.introspect`, `getProjects`) are authorized. Previously they went out without an `Authorization` header. Two guards keep that safe: `refresh()` / `restore()` run on a separate bare client, because routing a token refresh through the middleware re-enters the (deduped) refresh via its own near-expiry/401 path and deadlocks; and the middleware passes a request through untouched while the session is anonymous, so pre-auth `login` is not stamped and a failed login is not mistaken for session expiry.
1483
+ - `session.hasPersistedValue()` — a synchronous check for whether a session is stored under the persistor's key, so a caller can decide up front whether a restore is worth waiting for. Safe to call during render: a throwing storage adapter (blocked or private-mode storage) reads as "nothing stored" rather than propagating.
1484
+
1485
+ - Rework the bearer (OAuth) auth internals for a cleaner separation of concerns. Token handling now lives in a `TokenCredential`-style provider — `getAccessToken({ forceRefresh })` always returns a usable access token, refreshing (deduped) on near-expiry or when forced — consumed by a thin auth middleware that stamps the live token on every request and replays once on a 401. The bearer session config is a discriminated-union state machine (`anonymous` / `authenticated` / `scoped`) that owns its own credential model and the fire-once session-expiry latch: `session.authenticate` now takes a `TokenSet` (`accessToken`, `refreshToken`, `expiresIn`) rather than the full login credential, and `SessionSnapshot.config` is that state union. Also adds a `dedupe` (single-flight) util.
1486
+
1487
+ - Add Storage configuration management endpoints, grouped into focused sections under `storage/`:
1488
+ - `componentsAndConfigurations`: `restoreConfiguration`, `resetConfigurationToDefault`
1489
+ - `configurationVersions`: `copyConfigurationFromVersion`, `rollbackConfigurationToVersion`; rename `listConfigurationVersions` → `getConfigurationVersions`
1490
+ - `configurationMetadata` (new): `saveConfigurationMetadata`
1491
+
1492
+ - Add `management.storageBackends.getStorageBackendProjects()` / `getStorageBackendMaintainers()` (GET /manage/storage-backend/{id}/projects and /maintainers), and extend the `StorageBackend` detail type with `assignedProjectsCount` / `assignedMaintainersCount`.
1493
+
1494
+ - Add configuration Zod schemas for the file/connection extractor family (`ex`) to the configuration registry: `keboola.ex-http`, `keboola.ex-ftp` (+ its `keboola.ex-ftp-csas` variant), `keboola.ex-aws-s3`, `kds-team.ex-azure-blob-storage-v2`, and `kds-team.ex-azure-data-lake-gen2`. They live in a `schemas/ex/` family folder (mirroring `exDb`/`wrDb`) but share no common credential base, so each is its own schema; `ex-ftp-csas` reuses the `ex-ftp` schema. FTP and AWS-S3 model their mutually-exclusive auth (password XOR private key; access-key credentials XOR IAM role) as `forbidden`-guarded unions, so a config with both — or neither — is rejected and switching variants drops the abandoned secret. `ex-http` keeps `parameters` `.loose()` so component-managed request/job definitions pass through unchanged; `createRegistry`'s deep-partial input schema now preserves a source object's catchall to support this.
1495
+
1496
+ - Add the `sdk/semanticLayer` SDK — typed CRUD over the metastore client for
1497
+ semantic-layer objects (models, datasets, metrics, relationships, glossary
1498
+ terms, constraints), exposed as `api.sdk.semanticLayer`. Returns a normalized
1499
+ `SemanticObject<TData>` matching the live metastore envelope.
1500
+
1501
+ ### Patch Changes
1502
+
1503
+ - Regenerate the management schema: `id`/`name` are now required on `StorageBackendProject` and `StorageBackendMaintainer` (the manage OpenAPI marks them required since connection#7970), removing the client-side response filtering that compensated for the optional typing. No runtime behavior change.
1504
+
1505
+ - Add the `Bearer ` scheme in the shared `createAuthHeaders` for the bearer auth strategy, so `auth.token` is uniformly the bare token across the SDK (matching the management client and the bearer auth middleware). Previously the shared helper forwarded `auth.token` verbatim, so a bearer credential's `Authorization` header was emitted without the scheme.
1506
+
1507
+ - Regenerate storage OpenAPI schema — the configuration update endpoint now documents the optional `workspaceId` query parameter and the `X-StorageApi-Job-Id` response header (workspace Direct Grant output mapping sync).
1508
+
1509
+ - Fix the metastore tag SDK to match the live JSON:API envelope (`{ type, id, attributes, meta }`). The SDK previously read `uuid`/`data` off the wrong shape, so `getTags`, `getTagsByObjectId`, `deleteTag`, `assignTags`, `unassignTags`, `unassignAllTags`, and `createAndAssignTag` returned `undefined` UUIDs and misbehaved. The metastore repository response types now model the real envelope (`RawMetaObject`) and expose a normalized `MetaObject { uuid, data, meta }`; the stale generated schema was regenerated. `TagData.creator.name` is now required to match the server's validation (the API rejects creation without it).
1510
+
1511
+ - Extend `SemanticConstraintData` with the remaining semantic-constraint schema fields (`scope`, `owner`, `tags`, `ruleExpression`, `validationQuery`) and add the supporting `SemanticConstraintScope`, `SemanticRuleOperator`, `SemanticRuleExpression`, and `SemanticValidationQuery` types. Mirrors the metastore JSON schema so the semantic-layer editor can round-trip every field. Types-only addition — no runtime change.
1512
+
1513
+ ## 20.0.0
1514
+
1515
+ ### Major Changes
1516
+
1517
+ - Service-client factories now take an `auth` strategy instead of a raw `token`.
1518
+ `createStorageClient({ baseUrl, token })` becomes
1519
+ `createStorageClient({ baseUrl, auth: { type: 'sapi-token', token } })`, and the same
1520
+ applies to every other service client (stream, sync-actions, telemetry, vault, …). A new
1521
+ `AuthStrategy` type (`sapi-token` | `bearer`) is exported from the package root.
1522
+
1523
+ Behavior is unchanged — for the `sapi-token` strategy the emitted `X-StorageApi-Token`
1524
+ header is byte-identical to before. `createManagementClient` likewise now takes an `auth`
1525
+ strategy — `createManagementClient({ baseUrl, token })` becomes
1526
+ `createManagementClient({ baseUrl, auth: { type: 'management-token', token } })` — keeping
1527
+ its own Manage API token (`X-KBC-ManageApiToken`) semantics. The `bearer` variant is
1528
+ defined but not yet constructed.
1529
+
1530
+ ## 19.0.0
1531
+
1532
+ ### Minor Changes
1533
+
1534
+ - Add `ReadOnly` and `Guest` to `AdminRole` (completing the set of Storage API admin roles), and a new `isReadOnlyRole(token)` permission predicate in `domain/permissions`. Used to detect read-only-role users (AI-2736).
1535
+
1536
+ ## 18.0.1
1537
+
1538
+ ### Patch Changes
1539
+
1540
+ - Fix `storage.tables.deleteTableRows`: `whereFilters` is now typed as `WhereFilters[]` (an array of filters) to match the API. The previous single-object type serialized as `whereFilters[column]=…`, which the backend rejects with a 400 (`whereFilters` must be an array). This mirrors `getDataPreview`, which already takes `WhereFilters[]`.
1541
+
1542
+ ## 18.0.0
1543
+
1544
+ ### Major Changes
1545
+
1546
+ - Discover the metastore service from stack info instead of taking a `metastoreBaseUrl` option.
1547
+ - **Breaking:** `metastoreBaseUrl` is removed from `ApiClientOptions`. `createApiClient`/`init()` no longer accept it, and `ApiClientProvider` no longer accepts the `metastoreBaseUrl` prop.
1548
+ - `metastore` is now a stack-discovered service client (like `queue`, `vault`, …): its base URL comes from `getStackInfo` service discovery, exposed on the client as `api.metastore` and consumed by the tag SDK. On stacks that don't advertise a metastore service, the client resolves to a lazy no-op that throws only when a metastore method is actually called.
1549
+
1550
+ Migration: drop `metastoreBaseUrl` from every `createApiClient`/`init()`/`ApiClientProvider` call — the URL is resolved automatically from the stack.
1551
+
1552
+ ## 17.0.0
1553
+
1554
+ ### Major Changes
1555
+
1556
+ - Remove the token-less public `assets` and `status` clients from `createApiClient`.
1557
+
1558
+ They hit static public URLs and have nothing to do with the storage token, stack-discovered services, or bootstrap. Import `createAssetsClient` / `createStatusClient` from `@keboola/api-client/assets` and `@keboola/api-client/status` and instantiate them directly instead. `assetsBaseUrl` and `statusBaseUrl` are removed from `ApiClientOptions`.
1559
+
1560
+ Migration: replace `api.assets.getPublishedChangelogPosts(signal)` with `createAssetsClient({ baseUrl, middlewares: [] }).getPublishedChangelogPosts(signal)` and `api.status.getSummary(signal)` with `createStatusClient({ baseUrl, middlewares: [] }).getSummary(signal)`; drop `assetsBaseUrl` / `statusBaseUrl` from the `createApiClient` / `ApiClientProvider` options.
1561
+
1562
+ ## 16.0.0
1563
+
1564
+ ### Major Changes
1565
+
1566
+ - Remove `createDevApiClient` (and, in `@keboola/api-client-react`, `DevApiClientProvider` / `useDevApiClient`).
1567
+
1568
+ `createDevApiClient` was a stateless pass-through — `{ verify: { storageApiToken, managementApiToken } }` with no lifecycle, no base-URL registry, no `init()`. It doesn't fit the client model; it's just two host-parameterized verify calls. The React dev-provider layer existed only to carry that object through context.
1569
+
1570
+ Verify a candidate token with the real per-service clients directly (host-parameterized per call, no provider):
1571
+ - storage: `createStorageClient({ baseUrl: host, token }).tokens.verify()`
1572
+ - management: `createManagementClient({ baseUrl: host, token, withAuthMiddleware: false }).verifyToken()`
1573
+
1574
+ - Remove `createVerifyClient` and the `@keboola/api-client/verify` sub-path.
1575
+
1576
+ It was a non-client that re-implemented `/v2/storage/tokens/verify` and `/manage/tokens/verify` with a raw `createGenericFetchClient`. The real typed clients already expose those endpoints — verify a candidate token with them instead:
1577
+ - storage: `createStorageClient({ baseUrl, token }).tokens.verify()`
1578
+ - management: `createManagementClient({ baseUrl, token, withAuthMiddleware: false }).verifyToken()`
1579
+
1580
+ `createManagementClient` gains a `withAuthMiddleware` option (default `true`). The management auth middleware keeps a long-lived session alive (verifies + mints/refreshes session tokens), which is wrong for a plain "is this token valid?" check. Pass `withAuthMiddleware: false` for a raw client that just attaches the token, so `verifyToken()` is a clean validity check. `middlewares` is now optional (default `[]`), matching `createStorageClient`. The `ManagementToken` type now ships with the management client.
1581
+
1582
+ ## 15.0.0
1583
+
1584
+ ### Minor Changes
1585
+
1586
+ - Restructure the `auth` service client into nested namespaces — `auth.login`, `auth.mfa`, `auth.saml`, `auth.pat`, `auth.device`, `auth.sudo`, `auth.pkce`, `auth.session`, and `auth.token` — replacing the previous flat methods (e.g. `auth.createPat` → `auth.pat.create`, `auth.listPats` → `auth.pat.getAll`, `auth.refreshToken` → `auth.token.refresh`, `auth.sudo` → `auth.sudo.verify`). The login response is now validated with a zod discriminated union, and `auth.token.introspect` accepts an explicit token to introspect.
1587
+
1588
+ ## 14.0.0
1589
+
1590
+ ### Minor Changes
1591
+
1592
+ - Add `deleteSandbox` to the data science client (`DELETE /sandboxes/{appId}`) for tearing down Python/R workspace sandboxes, plus the `DeleteSandboxPath` type.
1593
+
1594
+ ## 13.0.0
1595
+
1596
+ ### Minor Changes
1597
+
1598
+ - Add `auth` service client wrapping the Keboola Auth API (`/v1/auth/*` — login, MFA, SAML, device/PKCE flows, personal access tokens, sessions, token introspect/refresh/revoke). Available as `api.auth.*` on the full client and standalone via `@keboola/api-client/auth`; the factory takes only `baseUrl` + `middlewares` since the API primarily issues tokens.
1599
+
1600
+ ## 12.0.0
1601
+
1602
+ ### Minor Changes
1603
+
1604
+ - Add a configuration Zod schema for the `keboola.ex-google-ads` OAuth extractor to the configuration registry. The schema pairs the shared top-level `authorization` OAuth credential reference (`oauth_api.{id, version?}`, now extracted into a reusable `oauthAuthorizationSchema` common module) with the extractor's `parameters` (`customerId` list plus optional `onlyEnabledCustomers` / `getAccountChildren` flags). The schema lives in its own per-file module following the existing registry convention.
1605
+
1606
+ - Storage types ergonomics (surfaced dogfooding the SDK from an external app):
1607
+ - **Export the `JobStatus` union** from `@keboola/api-client/storage/types`. It was declared but not exported, so consumers had to re-declare it (or fall back to `Record<string, …>`) to type a job-status map.
1608
+ - **Make `GetTablesQuery.include` optional.** `getTables` already defaults to `{ include: [] }`, so `getTables(branchId, {})` / `getTables(branchId, {}, signal)` now type-check instead of erroring on a missing required `include`.
1609
+
1610
+ ## 11.0.0
1611
+
1612
+ ### Minor Changes
1613
+
1614
+ - Add configuration Zod schemas for two app-specific writers to the configuration registry: `keboola.app-snowflake-dwh-manager` (master Snowflake connection with password-or-key-pair auth) and `keboola.gooddata-writer` (GoodData project + login credentials, leaving the large `tables`/`dimensions` structures as pass-through). Each schema lives in its own per-file module following the existing registry convention.
1615
+
1616
+ ## 10.0.0
1617
+
1618
+ ### Minor Changes
1619
+
1620
+ - Add configuration Zod schemas for the `ex-db-*` extractor family to the configuration registry — mysql, pgsql, redshift, mssql (+cdata), oracle, snowflake, firebird, db2 (+bata), informix, impala, hive (+csas/-csas-test), teradata, netsuite, kds netsuite, and progress-db. Per-driver SSH-tunnel / SSL support mirrors the kbc-ui contract. Reorganizes the writer and extractor schemas into `wrDb/` and `exDb/` family folders with shared `common` helpers.
1621
+
1622
+ ## 9.0.0
1623
+
1624
+ ### Minor Changes
1625
+
1626
+ - Add `management.deletedProjects` namespace with `getDeletedProjects`, `getDeletedProject`, `restoreDeletedProject` (DELETE — cancel deletion), and `purgeDeletedProject(projectId, ignoreBackendErrors?)` (POST — permanent, irreversible purge; pass `ignoreBackendErrors: true` to purge despite backend-storage cleanup errors; returns the enqueued `{ commandExecutionId }`).
1627
+
1628
+ - Ship a machine-readable surface index of the full `ApiClient` surface — every namespace and method with its fully resolved signature — so agents and external consumers can discover the API without cloning the repo. A compact `API-SURFACE.md` lists every method name and links to per-namespace detail files under `surface/<namespace>.md` (full signatures), so a consumer loads only the slice it needs instead of one ever-growing file. Generated from the TypeScript type checker via `pnpm --filter @keboola/api-client surface`, verified in CI by `surface:check`.
1629
+
1630
+ - Add `ComponentId.SCHEDULER` (`keboola.scheduler`) and register a zod schema for the scheduler configuration in the configurations SDK registry, so scheduler create/update payloads can be validated.
1631
+
1632
+ Also expose `ComponentId`, `ProjectFeatures`, `Backends`, and `AdminRoles` from the public `@keboola/api-client/constants` sub-path (each now lives in its own file under `src/constants/`).
1633
+
1634
+ - Export the `ComponentType` type from `@keboola/api-client/storage/types`. It was already defined (and used internally by `StackComponent`) but not part of the public surface; exporting it lets consumers treat the api-client definition as the single source of truth instead of maintaining a duplicate local union.
1635
+
1636
+ - Add `sdk.variables` for `keboola.variables` config orchestration. `copy` clones a variables config into a fresh, independent config + values row; `merge` unions two configs' definitions and upserts their values (source wins on a name conflict) into a fresh config, rolling back the orphaned config if the values row fails.
1637
+
1638
+ ## 8.0.2
1639
+
1640
+ ### Patch Changes
1641
+
1642
+ - fix: emit a Node-valid ESM import for the dayjs `utc` plugin (`dayjs/plugin/utc.js`) so consumers importing the SDK under Node/Vitest don't hit `Cannot find module`
1643
+
1644
+ - docs: README now recommends `createStorageClient` as the single-service path (incl. browser SPAs) — it needs only `baseUrl` + `token`, avoiding the full client's required `assets`/`status`/`metastore` URLs
1645
+
1646
+ ## 8.0.1
1647
+
1648
+ ### Patch Changes
1649
+
1650
+ - fix: rename the `getDataPreview` return type `PrevieData` → `PreviewData` (typo); `PrevieData` kept as a deprecated alias
1651
+
1652
+ ## 8.0.0
1653
+
1654
+ ### Minor Changes
1655
+
1656
+ - feat: re-export error guards (`isApiError`, `isAbortError`, `isFetchClientError`) and error classes from `@keboola/api-client/storage` so storage-only consumers don't also import from the main entry
1657
+
1658
+ ### Patch Changes
1659
+
1660
+ - docs: correct storage-client usage — `createStorageClient` takes a `token` option directly; `createStorageTokenMiddleware` does not exist
1661
+
1662
+ ## 7.0.0
1663
+
1664
+ ### Minor Changes
1665
+
1666
+ - Add `management.storageBackends.getStorageBackend(id)` (`GET /manage/storage-backend/{id}`) and the `StorageBackend` type. Returns a storage backend's id, owner, technical owner, host/URL and related details.
1667
+
1668
+ ## 6.0.0
1669
+
1670
+ ### Minor Changes
1671
+
1672
+ - Add a typed `notifications` service client (`api.notifications.*`) wrapping the Keboola Notification API: `listSubscriptions`, `getSubscription`, `createSubscription`, `deleteSubscription`, `postEvent`, and `sendNotification`. Types are generated from the service's OpenAPI spec and exposed via the `@keboola/api-client/notifications` and `@keboola/api-client/notifications/types` sub-paths.
1673
+
1674
+ - Expose two documentation endpoints on the existing `ai` client: `docsQuestion` (`/docs/question`) and `getComponentDetail` (`/docs/components/{componentId}`). These cover the Keboola MCP server's remaining API needs ahead of its TypeScript rewrite (PSGO-268).
1675
+
1676
+ - Add a typed `scheduler` service client backed by OpenAPI-generated types. Exposes `getSchedules`, `activateSchedule`, `getSchedule`, `deleteSchedule`, `refreshScheduleToken`, and `deleteSchedulesForConfiguration` via `api.scheduler.*`.
1677
+
1678
+ ## 5.0.0
1679
+
1680
+ ### Minor Changes
1681
+
1682
+ - Management write-operation surface for the control-ui M6 entity operations:
1683
+ - New project methods: `updateProject`, `deleteProject`, `moveProject`, `setProjectDisabled` (+ body types). `SetProjectDisabledBody` is a discriminated union — `disableReason` is required only when disabling.
1684
+ - Extend `UpdateOrganizationBody` with the live-supported fields the generated schema omits: `mfaRequired`, `crmId`, `activityCenterProjectId`, and `maintainerId` (move an organization to a different maintainer).
1685
+
1686
+ - Refresh the management OpenAPI types from the live spec (`/api/manage/doc.json`) and move the
1687
+ maintainer/organization overlays out of the generated file into the types layer:
1688
+ - `Maintainer.organizations` is `{ id; name }[]` (list endpoint); `MaintainerDetail.organizations`
1689
+ is `Organization[]` (detail endpoint), with `getMaintainer` casting accordingly.
1690
+ - Removes `projectsCount` from `Organization` — the management API never returns it (the field was a
1691
+ stale hand-edit in the previously committed generated schema).
1692
+
1693
+ - Add a generated `stream` service client (`api.stream.*`) covering the full Stream Service endpoint surface — sources, sinks, settings, statistics, versions, tasks (create/read/update/delete, enable/disable, undelete, rollback, aggregation). Types are generated from the Stream OpenAPI 3 spec via `redocly.yaml` + `gen:types`. This replaces the legacy hand-generated Stream client that lived in `apps/kbc-ui/src/scripts/api`.
1694
+
1695
+ ## 4.0.0
1696
+
1697
+ ### Minor Changes
1698
+
1699
+ - Add `storage.componentsAndConfigurations.updateConfiguration` (PUT a configuration; `configuration` is JSON-stringified to match the Storage API contract) and expose the generic `syncActions.sendSyncAction` for running arbitrary component sync actions.
1700
+
1701
+ ## 3.0.1
1702
+
1703
+ ### Patch Changes
1704
+
1705
+ - Fix legacy `node10` types resolution for the `@keboola/api-client/sdk/vault` subpath by adding the missing `typesVersions` entry. The `./sdk/vault` export was added in #5635 but only registered in `exports` (modern resolvers); legacy `moduleResolution: "node"` consumers and `attw --pack` reported `Resolution failed`.
1706
+
1707
+ ## 3.0.0
1708
+
1709
+ ### Minor Changes
1710
+
1711
+ - Add the storage three-way diff endpoints for configurations and rows (DMD-1545):
1712
+ - `componentsAndConfigurations.getConfigurationDiff({ branchId, componentId, configId }, signal?)` → `{ base, ours, theirs }`, each a snapshot of `name` + `description` + `configuration` plus version metadata and `isDisabled` / `isDeleted` flags, or `null` when the configuration is absent on that side.
1713
+ - `componentsAndConfigurations.getConfigurationRowDiff({ branchId, componentId, configId, rowId }, signal?)` with the same `{ base, ours, theirs }` shape for a single configuration row.
1714
+
1715
+ Backed by the new Storage API endpoints `GET /v2/storage/branch/{branchId}/components/{componentId}/configs/{configId}/diff` and `.../rows/{rowId}/diff`. Available in dev branches only — `branchId` is required on both methods (no fallback to `'default'`) because the server returns 400 on the default branch.
1716
+
1717
+ Additive change — no existing exports are removed or renamed.
1718
+
1719
+ ## 2.0.0
1720
+
1721
+ ### Major Changes
1722
+
1723
+ - **BREAKING** — `PermissionDeniedError` constructor changed from `new PermissionDeniedError(message: string)` (the scaffold form shipped in 1.0.0 via UT-4014 / PR #5770, explicitly documented as "stubs only") to `new PermissionDeniedError({ action: string; reason?: string; subject?: string })`. The new shape carries the stable kebab-case `action` field that consumers may pattern-match on. No in-repo consumer adopted the string form. External migration: `new PermissionDeniedError(msg)` → `new PermissionDeniedError({ action: '<kebab-case-action>', reason: msg })`.
1724
+
1725
+ Add permission primitives to `@keboola/api-client/domain/permissions` (P1.2 / UT-4015):
1726
+ - `PermissionDeniedError` with the new stable `{ action, reason?, subject? }` public contract. `subject` is an optional debugging hint and **must not** carry the full `StorageToken`, raw tokens, secrets, or any value that could be logged or surfaced to a user without further redaction.
1727
+ - Baseline admin role predicates against the typed `StorageToken`: `isAdmin`, `isAdminOrShare`, `isProductionManager`, `isDeveloperOrReviewer`, each paired with `assertCan*` (action strings: `admin`, `admin-or-share`, `production-manage`, `develop-or-review`).
1728
+ - Configuration workflow predicates consumed by the upcoming Core SDK (P1.3): `canCreateConfiguration`, `canCopyConfiguration`, `canMigrateFromTemplate`, `canPurgeConfiguration`, `canAssignFolder`, each taking `(token, ctx: { isDevModeActive })` and each paired with an `assertCan*` function. `canPurgeConfiguration` is admin-only and ignores `ctx`; the other four follow the situational base rule (developer/reviewer in dev branches, productionManager in production).
1729
+ - Standalone `hasFeature(token, ...features)` and `hasAdminFeature(token, ...features)` exported from `@keboola/api-client/domain/permissions`. The `createProject` factory continues to expose its closure-based versions unchanged.
1730
+
1731
+ See `packages/api-client/AGENTS.md` → "Permissions Module Conventions" for the predicate / assertCan pair pattern and the ctx-argument naming convention.
1732
+
1733
+ ### Patch Changes
1734
+
1735
+ - Fix `isApiError` / `isFetchClientError` cross-subpath false negatives and externalise `dayjs/plugin/*` properly.
1736
+ - UT-4084: tsup was previously built with `splitting: false`, so each subpath bundle (e.g. `@keboola/api-client/storage`) inlined its own copy of the `ApiError` class. An error thrown from a storage helper would therefore fail the `instanceof ApiError` check used inside `isApiError` imported from the package root. Enabling `splitting: true` causes tsup to emit shared chunks for both ESM and CJS so every subpath references the same class identity.
1737
+ - UT-4089: `dayjs/plugin/utc` was being matched as external only by accident through the `'dayjs'` entry. The `external` list now contains an explicit `/^dayjs\/plugin\//` pattern so consumers' bundlers don't have to follow the import through the api-client bundle.
1738
+
1739
+ Regression tests in `__tests__/buildOutput.test.ts` inspect the built `dist/` to guarantee:
1740
+ - `ApiError = class` appears exactly once per format (ESM/CJS) across the whole dist tree;
1741
+ - no entry bundle imports `dayjs/plugin/*` directly.
1742
+
1743
+ - Fix `create*Client` factories so a `baseUrl` ending with one or more `/`
1744
+ no longer produces request URLs with a double slash (e.g.
1745
+ `https://connection.keboola.com//v2/storage/buckets`), which the
1746
+ Storage API serves as 404.
1747
+
1748
+ Every public `create*Client` factory now strips trailing slashes from
1749
+ its `baseUrl` via the new `normalizeBaseUrl` helper. The fix is
1750
+ defensive — callers that already pass the canonical form
1751
+ (`https://connection.keboola.com`) see no behavior change.
1752
+
1753
+ Tracked in UT-4093.
1754
+
1755
+ ## 1.0.1
1756
+
1757
+ ### Patch Changes
1758
+
1759
+ - Re-publish to fix unresolved `workspace:^` protocol references in the npm tarball manifests.
1760
+
1761
+ The initial bootstrap publishes (2026-05-18 for `@keboola/api-client` and `@keboola/api-client-react`, later for the rest) were run manually with `npm publish` from a maintainer machine. Bare `npm publish` doesn't understand yarn's `workspace:` protocol, so the published `package.json` files shipped with literal `workspace:^` strings in `dependencies`, `peerDependencies`, and `devDependencies`.
1762
+
1763
+ The blocker is `@keboola/api-client-react@1.0.0`'s `peerDependencies` declaring `@keboola/api-client: workspace:^`. Running `npm install @keboola/api-client-react` from outside the monorepo fails with `EUNSUPPORTEDPROTOCOL` because npm can't resolve the `workspace:` protocol. The same string also appears in `@keboola/api-client`, `@keboola/brand-registry`, and `@keboola/oxlint-config` `devDependencies` — npm ignores those for transitive installs, but they're still wrong in the published manifests and worth cleaning up in the same release.
1764
+
1765
+ This patch bump triggers a regular changesets-driven release. When `changeset publish` runs in CI, it rewrites `workspace:*` references to the actual resolved version ranges before calling `npm publish`, restoring a consumable npm surface for every package.
1766
+
1767
+ `@keboola/codemirror-lang-sql` has the same issue but is already covered by an existing pending changeset (`codemirror-lang-sql-publish.md`, minor bump for initial publish setup); the next release will fix it through that bump.
1768
+
1769
+ No source code or runtime behavior changes. The local `workspace:^` references in source `package.json` files stay (they're correct for monorepo workspace deps; the rewrite happens only at publish time).
1770
+
1771
+ ## 1.0.0
1772
+
1773
+ ### Minor Changes
1774
+
1775
+ - Add `storage.mergeRequests.getMergeRequestConflicts(id, signal)` for the new `GET /v2/storage/merge-request/{id}/conflicts` endpoint. Returns the list of configurations whose dev-branch version identifier diverges from the default-branch version identifier — an empty array means the merge request is conflict-free. Also exports the `MergeRequestConflict` type from `@keboola/api-client/storage/types`.
1776
+
1777
+ - Scaffold `sdk/configurations` and `domain/permissions` sub-path exports. Stubs only — workflow methods land in P1.2/P1.3.
1778
+
1779
+ - Add pure parsing helpers to `@keboola/api-client/sdk/storage`: `tableIdParser`, `tableNameParsed`, `getBucketDisplayNameFromName`, `parseFQID`, `constructFQID`, `FQID_TYPES`, `parseDevBranchId`, `parseCurrentDevBranchIdFromUrl`, `prefixTagsWithDevBranchId`, `removeBranchFromUrl`. Moved from `apps/kbc-ui`; project-feature flags (`disableLegacyBucketPrefix`, `hasStorageBranches`) are now options on the helpers instead of being read from a store.
1780
+
1781
+ ### Patch Changes
1782
+
1783
+ - Initial publish setup for `@keboola/api-client-react` — React provider + hooks (`useApiClient`, `useProject`, `useStack`, `useDevApiClient`) for the Keboola SDK. Ships dual ESM/CJS bundles via `tsup` with React 18/19 as peer dependencies. Linked with `@keboola/api-client` so both packages release together.
1784
+
1785
+ - Regenerate storage OpenAPI types so `merge-request/{id}` GET is fully typed: `activityLog` (with `?include=activityLog`), reviewer `status`, and the `request-changes` body are now in the schema. Dropped the corresponding `@ts-expect-error` directives and the augmented `MergeRequestReviewer` shape from consumers.