@keboola/api-client 31.0.0 → 32.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 (390) hide show
  1. package/AGENTS.md +11 -5
  2. package/API-SURFACE.md +1 -1
  3. package/CHANGELOG.md +105 -0
  4. package/README.md +45 -19
  5. package/dist/{ManagementClientAuthError-DFhi5yxe.cjs → ManagementClientAuthError-B-tyPlyG.cjs} +2 -2
  6. package/dist/{ManagementClientAuthError-DFhi5yxe.cjs.map → ManagementClientAuthError-B-tyPlyG.cjs.map} +1 -1
  7. package/dist/{ManagementClientAuthError-90pvsej0.js → ManagementClientAuthError-BAFNvOdf.js} +2 -2
  8. package/dist/{ManagementClientAuthError-90pvsej0.js.map → ManagementClientAuthError-BAFNvOdf.js.map} +1 -1
  9. package/dist/ai/index.cjs +2 -2
  10. package/dist/ai/index.d.cts +2 -2
  11. package/dist/ai/index.d.ts +2 -2
  12. package/dist/ai/index.js +2 -2
  13. package/dist/ai/types.d.cts +1 -1
  14. package/dist/ai/types.d.ts +1 -1
  15. package/dist/{appLogs-hQdKt_8J.d.cts → appLogs-BAaaGYKg.d.cts} +2 -2
  16. package/dist/{appLogs-CLHhkQJn.js → appLogs-DTLE6HTy.js} +2 -2
  17. package/dist/{appLogs-CLHhkQJn.js.map → appLogs-DTLE6HTy.js.map} +1 -1
  18. package/dist/{appLogs-BdMG6Cvn.d.ts → appLogs-DX_WTBCa.d.ts} +2 -2
  19. package/dist/{appLogs-BCCi02w6.cjs → appLogs-NIEDTDHf.cjs} +2 -2
  20. package/dist/{appLogs-BCCi02w6.cjs.map → appLogs-NIEDTDHf.cjs.map} +1 -1
  21. package/dist/apps/index.cjs +3 -3
  22. package/dist/apps/index.d.cts +3 -3
  23. package/dist/apps/index.d.ts +3 -3
  24. package/dist/apps/index.js +3 -3
  25. package/dist/apps/types.d.cts +2 -2
  26. package/dist/apps/types.d.ts +2 -2
  27. package/dist/assets/index.cjs +1 -1
  28. package/dist/assets/index.d.cts +1 -1
  29. package/dist/assets/index.d.ts +1 -1
  30. package/dist/assets/index.js +1 -1
  31. package/dist/auth/index.cjs +1 -1
  32. package/dist/auth/index.d.cts +1 -1
  33. package/dist/auth/index.d.ts +1 -1
  34. package/dist/auth/index.js +1 -1
  35. package/dist/auth/types.d.cts +1 -1
  36. package/dist/auth/types.d.ts +1 -1
  37. package/dist/{auth-DmgTH0uY.cjs → auth-DP-6TFiM.cjs} +2 -2
  38. package/dist/{auth-DmgTH0uY.cjs.map → auth-DP-6TFiM.cjs.map} +1 -1
  39. package/dist/{auth-CE6Hlc9W.js → auth-DtbQaeDj.js} +2 -2
  40. package/dist/{auth-CE6Hlc9W.js.map → auth-DtbQaeDj.js.map} +1 -1
  41. package/dist/{authClient-XBAUz9g-.js → authClient--BtZgjIc.js} +5 -5
  42. package/dist/{authClient-XBAUz9g-.js.map → authClient--BtZgjIc.js.map} +1 -1
  43. package/dist/{authClient-Bc_bDisO.d.ts → authClient-CtfyVHRD.d.ts} +4 -4
  44. package/dist/{authClient-BL6h78Q1.d.cts → authClient-DhfzOUaa.d.cts} +4 -4
  45. package/dist/{authClient-Cixa8_L1.cjs → authClient-b7uec7sw.cjs} +5 -5
  46. package/dist/{authClient-Cixa8_L1.cjs.map → authClient-b7uec7sw.cjs.map} +1 -1
  47. package/dist/chat/index.cjs +3 -3
  48. package/dist/chat/index.d.cts +2 -7
  49. package/dist/chat/index.d.ts +2 -7
  50. package/dist/chat/index.js +3 -3
  51. package/dist/chat/types.d.cts +1 -1
  52. package/dist/chat/types.d.ts +1 -1
  53. package/dist/{configurations-CujCwDcB.cjs → configurations-Ck-mNB_E.cjs} +2 -2
  54. package/dist/{configurations-CujCwDcB.cjs.map → configurations-Ck-mNB_E.cjs.map} +1 -1
  55. package/dist/{configurations-DCOJONZZ.cjs → configurations-CqwAxiQL.cjs} +5 -1
  56. package/dist/configurations-CqwAxiQL.cjs.map +1 -0
  57. package/dist/{configurations-Byt59bIa.js → configurations-ZwBXilW-.js} +2 -2
  58. package/dist/{configurations-Byt59bIa.js.map → configurations-ZwBXilW-.js.map} +1 -1
  59. package/dist/{configurations-iCbhe0tb.js → configurations-d7SZmw69.js} +5 -1
  60. package/dist/configurations-d7SZmw69.js.map +1 -0
  61. package/dist/constants/index.cjs +2 -1
  62. package/dist/constants/index.d.cts +3 -2
  63. package/dist/constants/index.d.ts +3 -2
  64. package/dist/constants/index.js +2 -2
  65. package/dist/{constants-qeWGfk_7.js → constants-ByEwVtGf.js} +38 -2
  66. package/dist/constants-ByEwVtGf.js.map +1 -0
  67. package/dist/{constants-CkAVvuUq.cjs → constants-lIfSdTzS.cjs} +43 -1
  68. package/dist/constants-lIfSdTzS.cjs.map +1 -0
  69. package/dist/{createFetchClient-B9Cv0W9f.cjs → createFetchClient-BRfTjBLV.cjs} +15 -10
  70. package/dist/createFetchClient-BRfTjBLV.cjs.map +1 -0
  71. package/dist/{createFetchClient-B1h3-p65.js → createFetchClient-BbG46bL0.js} +15 -10
  72. package/dist/createFetchClient-BbG46bL0.js.map +1 -0
  73. package/dist/{createGenericFetchClient-DhpvUSlX.js → createGenericFetchClient-BHYQLZhe.js} +2 -2
  74. package/dist/{createGenericFetchClient-DhpvUSlX.js.map → createGenericFetchClient-BHYQLZhe.js.map} +1 -1
  75. package/dist/{createGenericFetchClient-BWoSkTki.cjs → createGenericFetchClient-DHs-i7_O.cjs} +2 -2
  76. package/dist/{createGenericFetchClient-BWoSkTki.cjs.map → createGenericFetchClient-DHs-i7_O.cjs.map} +1 -1
  77. package/dist/{createOpenapiFetchClient-0_oqhdPv.js → createOpenapiFetchClient-Bn6_Pn0H.js} +2 -2
  78. package/dist/{createOpenapiFetchClient-0_oqhdPv.js.map → createOpenapiFetchClient-Bn6_Pn0H.js.map} +1 -1
  79. package/dist/{createOpenapiFetchClient-yirrW6Tg.cjs → createOpenapiFetchClient-CyDUFxHB.cjs} +2 -2
  80. package/dist/{createOpenapiFetchClient-yirrW6Tg.cjs.map → createOpenapiFetchClient-CyDUFxHB.cjs.map} +1 -1
  81. package/dist/{credential-D-tX9gP4.cjs → credential-DOXH7XRS.cjs} +2 -2
  82. package/dist/{credential-D-tX9gP4.cjs.map → credential-DOXH7XRS.cjs.map} +1 -1
  83. package/dist/{credential-dKxArMic.js → credential-d2RDcXRB.js} +2 -2
  84. package/dist/{credential-dKxArMic.js.map → credential-d2RDcXRB.js.map} +1 -1
  85. package/dist/dataScience/index.cjs +2 -2
  86. package/dist/dataScience/index.d.cts +2 -2
  87. package/dist/dataScience/index.d.ts +2 -2
  88. package/dist/dataScience/index.js +2 -2
  89. package/dist/dataScience/types.d.cts +2 -2
  90. package/dist/dataScience/types.d.ts +2 -2
  91. package/dist/{dataScience-jdbSSPYF.js → dataScience-Sm8iONhP.js} +5 -5
  92. package/dist/{dataScience-jdbSSPYF.js.map → dataScience-Sm8iONhP.js.map} +1 -1
  93. package/dist/{dataScience-BqNWX-Gr.cjs → dataScience-wexHEIue.cjs} +5 -5
  94. package/dist/{dataScience-BqNWX-Gr.cjs.map → dataScience-wexHEIue.cjs.map} +1 -1
  95. package/dist/developerPortal/index.cjs +1 -1
  96. package/dist/developerPortal/index.d.cts +2 -2
  97. package/dist/developerPortal/index.d.ts +2 -2
  98. package/dist/developerPortal/index.js +1 -1
  99. package/dist/developerPortal/types.d.cts +1 -1
  100. package/dist/developerPortal/types.d.ts +1 -1
  101. package/dist/{developerPortalClient-B7lNR5q0.cjs → developerPortalClient-CgTSzLoG.cjs} +3 -3
  102. package/dist/{developerPortalClient-B7lNR5q0.cjs.map → developerPortalClient-CgTSzLoG.cjs.map} +1 -1
  103. package/dist/{developerPortalClient-5ABcxz1U.js → developerPortalClient-DywKpDlW.js} +3 -3
  104. package/dist/{developerPortalClient-5ABcxz1U.js.map → developerPortalClient-DywKpDlW.js.map} +1 -1
  105. package/dist/domain/permissions/index.cjs +63 -1
  106. package/dist/domain/permissions/index.cjs.map +1 -0
  107. package/dist/domain/permissions/index.d.cts +52 -3
  108. package/dist/domain/permissions/index.d.ts +52 -3
  109. package/dist/domain/permissions/index.js +59 -2
  110. package/dist/domain/permissions/index.js.map +1 -0
  111. package/dist/editor/index.cjs +2 -2
  112. package/dist/editor/index.d.cts +2 -2
  113. package/dist/editor/index.d.ts +2 -2
  114. package/dist/editor/index.js +2 -2
  115. package/dist/editor/types.d.cts +1 -1
  116. package/dist/editor/types.d.ts +1 -1
  117. package/dist/encryption/index.cjs +1 -1
  118. package/dist/encryption/index.d.cts +1 -1
  119. package/dist/encryption/index.d.ts +1 -1
  120. package/dist/encryption/index.js +1 -1
  121. package/dist/encryption/types.d.cts +1 -1
  122. package/dist/encryption/types.d.ts +1 -1
  123. package/dist/import/index.cjs +1 -1
  124. package/dist/import/index.d.cts +3 -3
  125. package/dist/import/index.d.ts +3 -3
  126. package/dist/import/index.js +1 -1
  127. package/dist/{import-CXHppAxd.cjs → import-C0-y1GQK.cjs} +3 -3
  128. package/dist/{import-CXHppAxd.cjs.map → import-C0-y1GQK.cjs.map} +1 -1
  129. package/dist/{import-CExRbskw.js → import-SQuurg1G.js} +3 -3
  130. package/dist/{import-CExRbskw.js.map → import-SQuurg1G.js.map} +1 -1
  131. package/dist/{index-BfVv8isU.d.cts → index-BKh0prif.d.cts} +4 -4
  132. package/dist/{index-CMb0ygwb.d.ts → index-Bc_hXWae.d.ts} +3 -3
  133. package/dist/{index-7RvXnXmd.d.ts → index-Bg1P6Bb2.d.ts} +6 -6
  134. package/dist/{index-cu8THqZV.d.cts → index-Bjk-tCpG.d.cts} +547 -3073
  135. package/dist/{index-CwJE18PJ.d.cts → index-C7e3wBt9.d.cts} +3 -3
  136. package/dist/{index-B-frWtGW.d.cts → index-CQrKS7PV.d.cts} +5 -2
  137. package/dist/{index-CR9LsDaG.d.cts → index-CXtdQ7be.d.cts} +4 -4
  138. package/dist/{index-Ds8e0l7-.d.ts → index-CeJOmN-P.d.ts} +5 -2
  139. package/dist/{index-DeMDxHTz.d.ts → index-Ctqkm3Fx.d.ts} +4 -4
  140. package/dist/{index-B6q7HxKJ.d.cts → index-D_7yCRKy.d.cts} +4 -4
  141. package/dist/{index-J1I2HlSm.d.ts → index-Dbzjvy5h.d.ts} +5 -5
  142. package/dist/{index-NicJZIzu.d.ts → index-DeKPpYQy.d.ts} +3 -3
  143. package/dist/{index-C9mAoXF6.d.cts → index-DiHHyMEo.d.cts} +6 -6
  144. package/dist/{index-BSjfVDTr.d.cts → index-DqOAjqxN.d.cts} +5 -5
  145. package/dist/{index-BR2Fu-Wo.d.ts → index-FhKX7Cv1.d.ts} +547 -3073
  146. package/dist/{index-Daks5CeX.d.ts → index-GDdFZCXp.d.ts} +4 -4
  147. package/dist/{index-Cpjh05sx.d.cts → index-Gn1H63Hk.d.cts} +4 -4
  148. package/dist/{index--pxLseaw.d.cts → index-NaYLwG_h.d.cts} +143 -2
  149. package/dist/{index--pxLseaw.d.ts → index-NaYLwG_h.d.ts} +143 -2
  150. package/dist/{index-D_TnbEtp.d.cts → index-eAlN694c.d.cts} +3 -3
  151. package/dist/{index-CW4VC9oN.d.ts → index-fHfc_VqS.d.ts} +4 -4
  152. package/dist/{index-CYMAwD3E.d.ts → index-tKsiUarj.d.ts} +4 -4
  153. package/dist/index.cjs +44 -232
  154. package/dist/index.cjs.map +1 -1
  155. package/dist/index.d.cts +5 -5
  156. package/dist/index.d.ts +5 -5
  157. package/dist/index.js +43 -232
  158. package/dist/index.js.map +1 -1
  159. package/dist/kaiAgent/index.cjs +3 -0
  160. package/dist/kaiAgent/index.d.cts +210 -0
  161. package/dist/kaiAgent/index.d.ts +210 -0
  162. package/dist/kaiAgent/index.js +2 -0
  163. package/dist/kaiAgent/types.cjs +0 -0
  164. package/dist/kaiAgent/types.d.cts +2 -0
  165. package/dist/kaiAgent/types.d.ts +2 -0
  166. package/dist/kaiAgent/types.js +1 -0
  167. package/dist/kaiAgent-4OiIK1C2.cjs +222 -0
  168. package/dist/kaiAgent-4OiIK1C2.cjs.map +1 -0
  169. package/dist/kaiAgent-HDaFS9BR.js +217 -0
  170. package/dist/kaiAgent-HDaFS9BR.js.map +1 -0
  171. package/dist/management/index.cjs +1 -1
  172. package/dist/management/index.d.cts +1 -1
  173. package/dist/management/index.d.ts +1 -1
  174. package/dist/management/index.js +1 -1
  175. package/dist/management/types.d.cts +1 -1
  176. package/dist/management/types.d.ts +1 -1
  177. package/dist/{management-Cc8mKfnf.js → management-CIFhu1Nm.js} +5 -5
  178. package/dist/{management-Cc8mKfnf.js.map → management-CIFhu1Nm.js.map} +1 -1
  179. package/dist/{management-DlVdxzPw.cjs → management-DfjwQo7z.cjs} +5 -5
  180. package/dist/{management-DlVdxzPw.cjs.map → management-DfjwQo7z.cjs.map} +1 -1
  181. package/dist/metastore/index.cjs +1 -1
  182. package/dist/metastore/index.d.cts +1 -1
  183. package/dist/metastore/index.d.ts +1 -1
  184. package/dist/metastore/index.js +1 -1
  185. package/dist/metastore/types.d.cts +1 -1
  186. package/dist/metastore/types.d.ts +1 -1
  187. package/dist/{metastore-CNf1412Z.js → metastore-CrXkKufo.js} +4 -4
  188. package/dist/{metastore-CNf1412Z.js.map → metastore-CrXkKufo.js.map} +1 -1
  189. package/dist/{metastore-DbsxqjhS.cjs → metastore-Dq2NS6jb.cjs} +4 -4
  190. package/dist/{metastore-DbsxqjhS.cjs.map → metastore-Dq2NS6jb.cjs.map} +1 -1
  191. package/dist/microsoftGraph/index.cjs +92 -0
  192. package/dist/microsoftGraph/index.cjs.map +1 -0
  193. package/dist/microsoftGraph/index.d.cts +305 -0
  194. package/dist/microsoftGraph/index.d.ts +305 -0
  195. package/dist/microsoftGraph/index.js +90 -0
  196. package/dist/microsoftGraph/index.js.map +1 -0
  197. package/dist/microsoftGraph/types.cjs +0 -0
  198. package/dist/microsoftGraph/types.d.cts +10 -0
  199. package/dist/microsoftGraph/types.d.ts +10 -0
  200. package/dist/microsoftGraph/types.js +1 -0
  201. package/dist/notifications/index.cjs +3 -3
  202. package/dist/notifications/index.d.cts +2 -2
  203. package/dist/notifications/index.d.ts +2 -2
  204. package/dist/notifications/index.js +3 -3
  205. package/dist/notifications/types.d.cts +1 -1
  206. package/dist/notifications/types.d.ts +1 -1
  207. package/dist/oauth/index.cjs +1 -1
  208. package/dist/oauth/index.d.cts +2 -2
  209. package/dist/oauth/index.d.ts +2 -2
  210. package/dist/oauth/index.js +1 -1
  211. package/dist/oauth/types.d.cts +1 -1
  212. package/dist/oauth/types.d.ts +1 -1
  213. package/dist/{oauth-ClksaYRY.js → oauth-CFwSNz37.js} +5 -5
  214. package/dist/{oauth-ClksaYRY.js.map → oauth-CFwSNz37.js.map} +1 -1
  215. package/dist/{oauth-DsZgmtPj.cjs → oauth-CkW5gln-.cjs} +5 -5
  216. package/dist/{oauth-DsZgmtPj.cjs.map → oauth-CkW5gln-.cjs.map} +1 -1
  217. package/dist/omnisearch/index.cjs +2 -2
  218. package/dist/omnisearch/index.d.cts +2 -2
  219. package/dist/omnisearch/index.d.ts +2 -2
  220. package/dist/omnisearch/index.js +2 -2
  221. package/dist/omnisearch/types.d.cts +1 -1
  222. package/dist/omnisearch/types.d.ts +1 -1
  223. package/dist/{project-5SLw86eZ.d.ts → project-BOGaVs-q.d.ts} +2 -2
  224. package/dist/{project-CRrsxSAK.d.cts → project-BnQkL8cb.d.cts} +2 -2
  225. package/dist/queryService/index.cjs +1 -1
  226. package/dist/queryService/index.d.cts +1 -1
  227. package/dist/queryService/index.d.ts +1 -1
  228. package/dist/queryService/index.js +1 -1
  229. package/dist/queryService/types.d.cts +1 -1
  230. package/dist/queryService/types.d.ts +1 -1
  231. package/dist/{queryService-DxUUkTcy.cjs → queryService-BLaGbpm-.cjs} +5 -5
  232. package/dist/{queryService-DxUUkTcy.cjs.map → queryService-BLaGbpm-.cjs.map} +1 -1
  233. package/dist/{queryService-BlyAcBxP.js → queryService-DK-jUnET.js} +5 -5
  234. package/dist/{queryService-BlyAcBxP.js.map → queryService-DK-jUnET.js.map} +1 -1
  235. package/dist/queue/index.cjs +1 -1
  236. package/dist/queue/index.d.cts +3 -3
  237. package/dist/queue/index.d.ts +3 -3
  238. package/dist/queue/index.js +1 -1
  239. package/dist/queue/types.d.cts +1 -1
  240. package/dist/queue/types.d.ts +1 -1
  241. package/dist/{queue-CpcqeMPz.cjs → queue-B7TY4JLf.cjs} +4 -4
  242. package/dist/{queue-CpcqeMPz.cjs.map → queue-B7TY4JLf.cjs.map} +1 -1
  243. package/dist/{queue-DpZTm7U7.js → queue-DViSQ-eq.js} +4 -4
  244. package/dist/{queue-DpZTm7U7.js.map → queue-DViSQ-eq.js.map} +1 -1
  245. package/dist/scheduler/index.cjs +3 -3
  246. package/dist/scheduler/index.d.cts +2 -2
  247. package/dist/scheduler/index.d.ts +2 -2
  248. package/dist/scheduler/index.js +3 -3
  249. package/dist/scheduler/types.d.cts +1 -1
  250. package/dist/scheduler/types.d.ts +1 -1
  251. package/dist/schema-D1oxyn1O.d.cts +8760 -0
  252. package/dist/schema-D1oxyn1O.d.ts +8760 -0
  253. package/dist/sdk/configurations/index.cjs +1 -1
  254. package/dist/sdk/configurations/index.d.cts +4 -4
  255. package/dist/sdk/configurations/index.d.ts +4 -4
  256. package/dist/sdk/configurations/index.js +1 -1
  257. package/dist/sdk/developerPortal/index.cjs +3 -3
  258. package/dist/sdk/developerPortal/index.d.cts +3 -3
  259. package/dist/sdk/developerPortal/index.d.ts +3 -3
  260. package/dist/sdk/developerPortal/index.js +3 -3
  261. package/dist/sdk/queryService/index.d.cts +1 -1
  262. package/dist/sdk/queryService/index.d.ts +1 -1
  263. package/dist/sdk/semanticLayer/index.d.cts +1 -1
  264. package/dist/sdk/semanticLayer/index.d.ts +1 -1
  265. package/dist/sdk/semanticLayer/types.d.cts +1 -1
  266. package/dist/sdk/semanticLayer/types.d.ts +1 -1
  267. package/dist/sdk/storage/index.d.cts +1 -1
  268. package/dist/sdk/storage/index.d.ts +1 -1
  269. package/dist/sdk/tag/index.d.cts +2 -2
  270. package/dist/sdk/tag/index.d.ts +2 -2
  271. package/dist/sdk/tag/types.d.cts +1 -1
  272. package/dist/sdk/tag/types.d.ts +1 -1
  273. package/dist/sdk/vault/index.d.cts +1 -1
  274. package/dist/sdk/vault/index.d.ts +1 -1
  275. package/dist/serviceIds-fHLDwOg9.d.cts +31 -0
  276. package/dist/serviceIds-fHLDwOg9.d.ts +31 -0
  277. package/dist/status/index.cjs +1 -1
  278. package/dist/status/index.d.cts +1 -1
  279. package/dist/status/index.d.ts +1 -1
  280. package/dist/status/index.js +1 -1
  281. package/dist/storage/index.cjs +4 -4
  282. package/dist/storage/index.d.cts +2 -2
  283. package/dist/storage/index.d.ts +2 -2
  284. package/dist/storage/index.js +4 -4
  285. package/dist/storage/types.d.cts +4 -3
  286. package/dist/storage/types.d.ts +4 -3
  287. package/dist/{storage-vnH64B_Q.cjs → storage-CihHwZ7z.cjs} +149 -160
  288. package/dist/storage-CihHwZ7z.cjs.map +1 -0
  289. package/dist/{storage-CQxu0EY3.js → storage-kgxscFEg.js} +149 -160
  290. package/dist/storage-kgxscFEg.js.map +1 -0
  291. package/dist/stream/index.cjs +3 -3
  292. package/dist/stream/index.d.cts +2 -2
  293. package/dist/stream/index.d.ts +2 -2
  294. package/dist/stream/index.js +3 -3
  295. package/dist/stream/types.d.cts +1 -1
  296. package/dist/stream/types.d.ts +1 -1
  297. package/dist/syncActions/index.cjs +1 -1
  298. package/dist/syncActions/index.d.cts +1 -1
  299. package/dist/syncActions/index.d.ts +1 -1
  300. package/dist/syncActions/index.js +1 -1
  301. package/dist/syncActions/types.d.cts +1 -1
  302. package/dist/syncActions/types.d.ts +1 -1
  303. package/dist/{syncActions-AgFiMjRS.js → syncActions-B75t0NwP.js} +5 -5
  304. package/dist/{syncActions-AgFiMjRS.js.map → syncActions-B75t0NwP.js.map} +1 -1
  305. package/dist/{syncActions-DPcAPYgJ.cjs → syncActions-CevF_TEb.cjs} +5 -5
  306. package/dist/{syncActions-DPcAPYgJ.cjs.map → syncActions-CevF_TEb.cjs.map} +1 -1
  307. package/dist/telemetry/index.cjs +1 -1
  308. package/dist/telemetry/index.d.cts +2 -2
  309. package/dist/telemetry/index.d.ts +2 -2
  310. package/dist/telemetry/index.js +1 -1
  311. package/dist/{telemetry-BLgaYEvi.cjs → telemetry-DwlSLVAU.cjs} +3 -3
  312. package/dist/{telemetry-BLgaYEvi.cjs.map → telemetry-DwlSLVAU.cjs.map} +1 -1
  313. package/dist/{telemetry-CPiGWpLi.js → telemetry-FXpodtJN.js} +3 -3
  314. package/dist/{telemetry-CPiGWpLi.js.map → telemetry-FXpodtJN.js.map} +1 -1
  315. package/dist/{types-DQOOWgLt.d.cts → types-Av2egS_l.d.ts} +408 -24
  316. package/dist/{types-ca-YNg1r.d.cts → types-B2vmg_UF.d.cts} +3 -3
  317. package/dist/{types-CuAoZH8w.d.cts → types-B4jdPHoL.d.cts} +2 -2
  318. package/dist/{types-DSBNqF1J.d.cts → types-BH9ljNmj.d.cts} +2 -2
  319. package/dist/{types-CFhAduFK.d.cts → types-BI2jI-3-.d.cts} +3 -3
  320. package/dist/types-BMQW-2Yw.d.ts +2804 -0
  321. package/dist/{types-BdKtW2Ml.d.cts → types-BREGN3qo.d.cts} +2 -2
  322. package/dist/{types-B1S60aS2.d.ts → types-BTbczawY.d.ts} +2 -2
  323. package/dist/{types-DG_FlLJt.d.cts → types-BV2BDccJ.d.cts} +247 -430
  324. package/dist/{types-Bc3-a3DT.d.cts → types-BZBdLUpH.d.ts} +2 -2
  325. package/dist/{types-DWUd__fe.d.ts → types-BlCoTm7n.d.ts} +2 -2
  326. package/dist/{types-Drk7PEhk.d.ts → types-BnaAo7xn.d.ts} +2 -2
  327. package/dist/{types-BXnUqdBB.d.cts → types-BoV9M5Xg.d.cts} +2 -2
  328. package/dist/{types-Co8WobOo.d.ts → types-Bpnpa2Wt.d.ts} +3 -3
  329. package/dist/{types-D7YGPUsm.d.ts → types-BptQ7jpP.d.cts} +408 -24
  330. package/dist/{types-COFrOmuO.d.ts → types-ByWD2oeV.d.ts} +2 -2
  331. package/dist/{types-C2p7JYQ3.d.cts → types-C1vhYcic.d.cts} +2 -2
  332. package/dist/{types-B2Al1BNh.d.ts → types-C2CLlR4i.d.ts} +2 -2
  333. package/dist/{types-eP06LqcE.d.cts → types-CGH_lfxS.d.cts} +2 -16
  334. package/dist/{types-By47HWwB.d.cts → types-CJHi0zdD.d.cts} +2 -2
  335. package/dist/{types-C0bGZqFI.d.cts → types-COIsNoTQ.d.cts} +2 -2
  336. package/dist/{types-DkoyCUqv.d.ts → types-COc-nind.d.cts} +2 -2
  337. package/dist/{types-CIybfUJ9.d.cts → types-CPanB0p7.d.cts} +3 -3
  338. package/dist/{types-DnOGCb-p.d.cts → types-CXTqFYah.d.ts} +6 -6
  339. package/dist/{types-sTH4KiPc.d.cts → types-CcuG9cid.d.cts} +2 -2
  340. package/dist/{types-RmbvQimP.d.ts → types-Cj4bLPp5.d.cts} +6 -6
  341. package/dist/{types-Culr5v8R.d.ts → types-CkcMoXRk.d.ts} +3 -3
  342. package/dist/{types-BvXODdf5.d.ts → types-CpALS017.d.ts} +2 -16
  343. package/dist/{types-056giLrn.d.cts → types-CvkqEvhv.d.cts} +2 -2
  344. package/dist/{types-BJLRgXw0.d.ts → types-CyHZ1ZQe.d.ts} +2 -2
  345. package/dist/{types-DLazCdFR.d.cts → types-CyiRYRVq.d.cts} +3 -3
  346. package/dist/{types-CgF9R0Na.d.ts → types-Cz1dj_TM.d.ts} +2 -2
  347. package/dist/{types-DdeZK3BO.d.ts → types-D-qI9ne4.d.ts} +2 -2
  348. package/dist/{types-BIAP4CYp.d.cts → types-D1uloiuY.d.cts} +2 -2
  349. package/dist/{types-DMMMQuNt.d.ts → types-D6jKxUv_.d.ts} +247 -430
  350. package/dist/{types-CQd9PuKY.d.cts → types-DNXC_-fA.d.cts} +2 -2
  351. package/dist/{types-Dirp9mni.d.ts → types-DeSd3gqW.d.ts} +3 -3
  352. package/dist/{types-D5VvEdOv.d.ts → types-De_DA2ga.d.ts} +2 -2
  353. package/dist/{types-BMsK6T5k.d.ts → types-Dfc58bPE.d.ts} +2 -2
  354. package/dist/{types-DyIKgbGB.d.ts → types-Di8VIZwQ.d.ts} +2 -2
  355. package/dist/{types-B2El99VY.d.cts → types-DlbiVsVo.d.cts} +2 -2
  356. package/dist/types-DuiUN0h8.d.ts +33557 -0
  357. package/dist/{types-SX78XZZ0.d.ts → types-DwpRt3e9.d.ts} +2 -2
  358. package/dist/{types-lVXf05pr.d.ts → types-EJEoI3ZK.d.ts} +2 -2
  359. package/dist/types-GuWtMCMn.d.cts +33557 -0
  360. package/dist/{types-mXM8MrYS.d.cts → types-MbcIiKDI.d.cts} +3 -3
  361. package/dist/{types-BV74LS5r.d.ts → types-RfaldD4P.d.ts} +3 -3
  362. package/dist/{types-uP64XthM.d.cts → types-cDU_J45_.d.cts} +2 -2
  363. package/dist/{types-DN7RWWBw.d.ts → types-dybUhlU2.d.ts} +2 -2
  364. package/dist/types-iNlsdRkx.d.cts +2804 -0
  365. package/dist/{types-BHCigZFc.d.ts → types-sVYo0o9_.d.ts} +3 -3
  366. package/dist/{types-Bv5vw2dc.d.cts → types-zA3H84SM.d.cts} +2 -2
  367. package/dist/{validateConnectionStatus-CBhXmvWC.js → validateConnectionStatus-BrLXkoSI.js} +2 -2
  368. package/dist/{validateConnectionStatus-CBhXmvWC.js.map → validateConnectionStatus-BrLXkoSI.js.map} +1 -1
  369. package/dist/{validateConnectionStatus-DVHXGTdi.cjs → validateConnectionStatus-V9q6Nl6u.cjs} +2 -2
  370. package/dist/{validateConnectionStatus-DVHXGTdi.cjs.map → validateConnectionStatus-V9q6Nl6u.cjs.map} +1 -1
  371. package/dist/vault/index.cjs +4 -4
  372. package/dist/vault/index.d.cts +1 -1
  373. package/dist/vault/index.d.ts +1 -1
  374. package/dist/vault/index.js +4 -4
  375. package/dist/vault/types.d.cts +1 -1
  376. package/dist/vault/types.d.ts +1 -1
  377. package/package.json +54 -2
  378. package/surface/chat.md +1 -1
  379. package/surface/sdk.md +4 -4
  380. package/surface/storage.md +44 -44
  381. package/dist/configurations-DCOJONZZ.cjs.map +0 -1
  382. package/dist/configurations-iCbhe0tb.js.map +0 -1
  383. package/dist/constants-CkAVvuUq.cjs.map +0 -1
  384. package/dist/constants-qeWGfk_7.js.map +0 -1
  385. package/dist/createFetchClient-B1h3-p65.js.map +0 -1
  386. package/dist/createFetchClient-B9Cv0W9f.cjs.map +0 -1
  387. package/dist/storage-CQxu0EY3.js.map +0 -1
  388. package/dist/storage-vnH64B_Q.cjs.map +0 -1
  389. package/dist/types-CIJAtX8q.d.cts +0 -18784
  390. package/dist/types-X-gQF8F8.d.ts +0 -18784
package/AGENTS.md CHANGED
@@ -14,7 +14,9 @@ All commands run from monorepo root using `--filter`:
14
14
  pnpm build --filter=@keboola/api-client # Build with tsdown (ESM + CJS + .d.ts)
15
15
  pnpm test --filter=@keboola/api-client # Vitest
16
16
  pnpm type-check --filter=@keboola/api-client # tsc --noEmit
17
- pnpm --filter @keboola/api-client gen:types # Regenerate OpenAPI types from redocly.yaml
17
+ pnpm --filter @keboola/api-client gen:types --list # What can be regenerated
18
+ pnpm --filter @keboola/api-client gen:types storage # One service — leaves the rest alone
19
+ pnpm --filter @keboola/api-client gen:types # Every API in redocly.yaml
18
20
  ```
19
21
 
20
22
  ## Getting a client
@@ -34,6 +36,8 @@ const { data } = useQuery({
34
36
  - **`createStorageClient`** — Storage-only. Needs only `baseUrl` + `token`, skipping the stack-info round-trip. Start here when in doubt; upgrading later is mechanical, downgrading is not. (React apps still get their client via `ApiClientProvider` + `useApiClient()` — see above; this section is about the non-React/single-service case.)
35
37
  - **`createLegacyKeboola` / `createKeboola`** — full SDK across all stack services. Each returns `{ api, session }`; drive the `session` to ready, then use `api`. Bootstrap (`getStackInfo` + `tokens.verify()` to discover services against the actual stack) runs while the storage build resolves, after which `api.context` is synchronous. Every stack service — including `metastore` — is resolved from the stack's advertised service URLs. See the lifecycle section below for the per-flow `session` verbs. The token-less public clients `createAssetsClient` / `createStatusClient` are **not** part of this — import them directly from `@keboola/api-client/assets` and `@keboola/api-client/status`.
36
38
 
39
+ **`clients/` also holds clients for third-party APIs the platform talks to directly** (`microsoftGraph` today): a vendor API is still HTTP that must run through the shared fetch client, its middleware chain and its error guards, so it gets a client here rather than a hand-rolled `fetch` in the consuming app. They differ from stack clients in three ways, and a new one should follow the same rules: **never** registered in `createServiceClients.ts` (they are not stack services, so they must not appear on `api.*`), they default their own `baseUrl` (a vendor's host and version prefix are part of its API contract, not something we discover or configure), and they carry no `healthCheck` (we don't own the service's liveness). Consumers construct them directly from the sub-path, like the token-less clients above.
40
+
37
41
  ```ts
38
42
  // Storage-only — imports from the /storage sub-path
39
43
  import { createStorageClient } from '@keboola/api-client/storage';
@@ -323,7 +327,7 @@ Surfacing — toast vs inline:
323
327
 
324
328
  `@keboola/api-client/domain/permissions` holds token-only capability predicates: `canX` (boolean, safe in any UI condition) paired with `assertCanX` (throws `PermissionDeniedError` before any HTTP round-trip). Catch the error to gate UI without a network call; let it propagate from `useQuery` to surface a "no access" empty state.
325
329
 
326
- Implemented today: `admin.ts` (`isAdmin`, `isProductionManager`, … + matching `assertCan*`, all `(token)`-only) and `configurations.ts` (`canCreate/canCopy/canMigrateFromTemplate/canPurge/canAssignFolder` + `assertCan*`, taking a trailing `ctx: ConfigurationCtx`). `storage.ts`, `devBranches.ts`, `sandboxes.ts`, `organization.ts` are still `export {}` placeholders.
330
+ Implemented today: `admin.ts` (`isAdmin`, `isProductionManager`, … + matching `assertCan*`, all `(token)`-only), `configurations.ts` (`canCreate/canCopy/canMigrateFromTemplate/canPurge/canAssignFolder` + `assertCan*`, taking a trailing `ctx: ConfigurationCtx`), and `organization.ts` (`isOrganizationMember`, `isOrganizationAdmin`, `canWriteKaiSpendCaps`, all `(token)`-only — reads `StorageToken.admin.isOrganizationMember` rather than the project role string; `assertCanAdministerOrganization`/`assertCanWriteKaiSpendCaps` pair with the latter two, `isOrganizationMember` is a raw signal with no assert). `storage.ts`, `devBranches.ts`, `sandboxes.ts` are still `export {}` placeholders.
327
331
 
328
332
  ```ts
329
333
  import { PermissionDeniedError } from '@keboola/api-client/domain/permissions';
@@ -424,7 +428,7 @@ owns the store, `credential.ts`, `middleware.ts` and `tokenExpiry.ts` — the an
424
428
  Three things about it are unusual:
425
429
 
426
430
  - **Generated from the spec, like every other client.** `https://apps-api.keboola.com/docs/openapi.yaml`
427
- is registered in `redocly.yaml`, so `pnpm gen:types` refreshes
431
+ is registered in `redocly.yaml`, so `pnpm gen:types developerPortal` refreshes
428
432
  `developerPortal/__generated__/schema.d.ts` and `types.ts` derives from it. **The spec is the source of
429
433
  truth** — if it is wrong, fix it in `keboola/developer-portal` and regenerate, rather than
430
434
  hand-writing a parallel shape here.
@@ -441,7 +445,9 @@ Three things about it are unusual:
441
445
 
442
446
  ## Testing with `@keboola/api-fixtures`
443
447
 
444
- `@keboola/api-fixtures` provides typed, endpoint-keyed fixtures so tests don't hand-roll response shapes. Early today (storage tables only); extend it as more services need coverage.
448
+ `@keboola/api-fixtures` provides typed, endpoint-keyed fixtures so tests don't hand-roll response shapes. It covers the storage bootstrap and tables, apps, and the developer portal; extend it as more services need coverage.
449
+
450
+ **This package's own tests cannot use it** — `api-fixtures` depends on `api-client`, so the reverse edge is a build cycle. Tests here keep hand-rolled bodies; consumers get the fixtures.
445
451
 
446
452
  ```ts
447
453
  import { fixtures, getTable, listTables, tableFixtures } from '@keboola/api-fixtures';
@@ -609,7 +615,7 @@ A new client/namespace means touching four places that must stay in lock-step
609
615
  3. `package.json` `typesVersions` — add `<x>` and `<x>/types`
610
616
  4. `src/keboola/createServiceClients.ts` — register the client in the registry with `.add({ serviceId, clientName, clientFn })` (+ `src/keboola/createMiddlewareFor.ts` for its `ServiceClientName` entry and any bespoke middleware)
611
617
 
612
- Full mechanical steps (redocly registration, `pnpm gen:types`, file templates) live in [`README.md` → Adding a New OpenAPI Client](./README.md#adding-a-new-openapi-client). Add typed fixtures to `@keboola/api-fixtures` alongside the client so consumers can test against it.
618
+ Full mechanical steps (redocly registration, `gen:types`, file templates) live in [`README.md` → Adding a New OpenAPI Client](./README.md#adding-a-new-openapi-client). Add typed fixtures to `@keboola/api-fixtures` alongside the client so consumers can test against it.
613
619
 
614
620
  **Worked example — the `auth` client.** `packages/api-client/src/clients/auth/*` (`authClient.ts`, `pkce.ts`, `index.ts`, `types.ts`) is a self-contained new service added this way: it exposes `./auth` + `./auth/types` sub-paths and is surfaced by `src/keboola/createApi.ts`. Read it as the reference shape for a new client rather than copying boilerplate. **Bearer auth lives in `keboola/bearer/`, not the auth client**, since it's specific to the bearer engine: `credential.ts` is a token provider (`getAccessToken({ forceRefresh })` returns a valid token, refreshing — deduped — when near expiry or forced), and `middleware.ts` is a thin policy that on every request asks the credential for a token and stamps the `Authorization` header, and on 401 force-refreshes and replays once. Session-expiry is latched (fire-once, re-armed per session) in `createConfig.notifyExpired`, not the credential — the credential and middleware are long-lived singletons. The middleware holds no token and reads no config — all token state is in the credential, whose `getToken` reads live from `config` so a rotation is picked up without rebuilding. See `keboola/bearer/keboola.ts` for the wiring.
615
621
 
package/API-SURFACE.md CHANGED
@@ -621,7 +621,7 @@ Every namespace and method reachable from a ready `KeboolaApi` — the `api` hal
621
621
  - `triggers.getTriggers`
622
622
  - `triggers.updateTrigger`
623
623
  - `workspaces.deleteWorkspace`
624
- - `workspaces.deleteWorkspaceJob`
624
+ - `workspaces.deleteWorkspaceAsync`
625
625
  - `workspaces.deleteWorkspaceObjectsAsync`
626
626
  - `workspaces.deleteWorkspaces`
627
627
  - `workspaces.getWorkspace`
package/CHANGELOG.md CHANGED
@@ -1,5 +1,110 @@
1
1
  # @keboola/api-client
2
2
 
3
+ ## 32.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - Adopt Connection's OpenAPI spec fixes across the storage, management and auth clients.
8
+
9
+ Breaking changes to the storage surface:
10
+ - `workspaceId` is a `number` on all nine workspace operations, and `versionId` a `number` on the
11
+ configuration-version ones — both were `string` on some and `number` on others.
12
+ - `branchId` is the `string` the spec declares, and is now required: `configurations`,
13
+ `configurationRows`, `configurationVersions`, `configurationMetadata`, `components` and `events`
14
+ no longer default it to `'default'`. `components.getComponents` and
15
+ `configurations.searchComponentConfigurations` therefore take an argument.
16
+ - `metadataId` is the spec's integer on all nine metadata deletes; the `MetadataId` alias is gone.
17
+ - `DevBranch` is a union discriminated on `isDefault`, since the default branch carries no
18
+ `creatorToken`.
19
+ - `deleteWorkspaceJob` is renamed `deleteWorkspaceAsync`.
20
+ - `File.sizeBytes` is nullable, as the serializer returns.
21
+ - `BranchMetadataEntry`, `BranchMetadataRaw` and `PreparedFile` are removed — all three unused.
22
+
23
+ New: a per-call `parseAs` option on every client method (`'auto' | 'text' | 'json' | 'blob'`),
24
+ defaulting to the existing content-type dispatch. `storage.files.getFileContent` uses it to return
25
+ a file's exact bytes instead of re-serialising JSON files.
26
+
27
+ - `STACKS` is typed by its own key set instead of `Record<string, …>`. A name the registry does not
28
+ carry is now a compile error at the call site, so code can read `STACKS.US_EAST_1_AWS.host` without
29
+ an `undefined` to fall back from. The entries and their `KeboolaStack` value type are unchanged.
30
+
31
+ Breaking for typed consumers: a lookup by a non-literal key — `STACKS[someRuntimeString]` — stops
32
+ type-checking. Narrow the key first (`if (key in STACKS)`), or iterate `Object.values(STACKS)` when
33
+ the name itself does not matter.
34
+
35
+ ### Minor Changes
36
+
37
+ - Let a bearer session hand out the headers for a request the client does not make itself.
38
+
39
+ `session.getAuthHeaders()` resolves `Authorization: Bearer <token>` plus `X-KBC-ProjectId`, going through the credential on every call — so a near-expiry token rotates and a revoked one is never re-sent. It exists for transports this package does not own, chiefly the chat SSE stream whose `fetch` the AI SDK holds; anything with a service client on `api` should keep using that.
40
+
41
+ It returns the assembled bag rather than the access token, so no caller handles the credential as a bare string and the project header is composed in one place. An anonymous or unscoped session throws instead of emitting a half-formed `Bearer null`.
42
+
43
+ - Microsoft Graph joins the SDK as a standalone client on two new sub-paths, `@keboola/api-client/microsoftGraph` and `@keboola/api-client/microsoftGraph/types`.
44
+
45
+ ```ts
46
+ import {
47
+ createMicrosoftGraphAuthMiddleware,
48
+ createMicrosoftGraphClient,
49
+ } from "@keboola/api-client/microsoftGraph";
50
+
51
+ // The client holds no credential — auth arrives as a middleware. Not a singleton either: a Graph
52
+ // token is minted per user interaction by your own OAuth flow (MSAL in the browser) and is scoped
53
+ // to one account, so build a client where you hold it. There is no `sdks/microsoftGraph/` because
54
+ // MSAL owns refresh; this package has no token state to manage.
55
+ const graph = createMicrosoftGraphClient({
56
+ middlewares: [createMicrosoftGraphAuthMiddleware(accessToken)],
57
+ });
58
+ const item = await graph.getFile(driveId, fileId, signal);
59
+ ```
60
+
61
+ It exposes `getMySite`, `getMyDrive`, `getFile` and `getDriveItemBySharingUrl` (which redeems a sharing URL into the real `DriveItem`, for "Shared with me" SharePoint files the picker returns with empty ids). Graph is not a Keboola service, so — like `assets` and `status` — it is **not** on `api.*` and is never registered in `createServiceClients.ts`; it also defaults its own `baseUrl`, since a vendor's host and version prefix are part of its API contract rather than something we discover, and it carries no `healthCheck`.
62
+
63
+ Types come from Microsoft's own OpenAPI document, but **vendored as a slice** rather than fetched whole: the published v1.0 description covers all of Graph at ~41MB and generates 35MB of `.d.ts`, which this package's declaration emit crashes on (`rolldown-plugin-dts` throws; the previous tsup build hit `ERR_WORKER_OUT_OF_MEMORY` on the same file) and which would ship in the tarball. A `gen:types` run that selects `microsoftGraph` vendors a slice of only the operations the client calls, then generates from it (~650KB of declarations); runs that don't select it never touch the slice. Adding an operation means listing its path in `scripts/vendor-microsoft-graph-spec.mjs`; see `docs/regenerate-api-types.md`.
64
+
65
+ The client wires **no transport-level retry**, matching every other client here — where superagent
66
+ applied 3 attempts (network errors, and 5xx on GET), a transient Graph 503 now surfaces to the caller
67
+ on the first failure. Consumers that want retry choose it per call site: TanStack Query's `retry` for
68
+ a query, or `createRetryMiddleware` in `middlewares` for a client whose every call should retry. The
69
+ OneDrive pickers deliberately take neither — they run inside an interactive MSAL flow where a silent
70
+ multi-second retry is worse than a prompt failure the user can act on.
71
+
72
+ One fix reaches beyond this client: `OpenapiSuccessType` now understands OpenAPI 3 **range** response codes (`2XX`). Operations declaring a range instead of an explicit status previously resolved to `unknown`; ranges are checked after the explicit codes, so a spec declaring both still resolves to the precise one.
73
+
74
+ - Consumers can now import the kai-agent client directly from `@keboola/api-client/kaiAgent` instead of going through the main barrel.
75
+
76
+ - `@keboola/api-client/kaiAgent/types` is now its own subpath, exporting `ChatWithMessages` for the `/api/chat/{id}` response — so consumers can derive the chat-detail shape from kai-agent's spec instead of transcribing it.
77
+
78
+ ### Patch Changes
79
+
80
+ - Add organization-admin permission predicates (AI-3738).
81
+
82
+ `domain/permissions/organization.ts` (previously an empty placeholder) now exports
83
+ `isOrganizationMember`, `isOrganizationAdmin`, `canWriteKaiSpendCaps`, plus
84
+ `assertCanAdministerOrganization`/`assertCanWriteKaiSpendCaps` (`isOrganizationMember` is a raw
85
+ signal with no assert pair), mirroring `admin.ts`'s conventions — `canWriteKaiSpendCaps` is
86
+ strictly stricter than the existing `canWriteKaiSettings` (admin/share only vs. organization-admin
87
+ only).
88
+
89
+ - Shrink the permission tests' `StorageToken` fixture to the fields they read.
90
+
91
+ `buildStorageToken` transcribed all ~40 fields of the contract shape so it could be annotated `: StorageToken`. Its consumers read three of them — `isMasterToken`, `admin.{role,isOrganizationMember}` — plus `owner.{features,hasSnowflake,hasBigquery}` via `createProject()`, and its `features` / `adminFeatures` options were passed by no caller. The fixture now builds only that, cast at the boundary; the contract-typed `StorageToken` fixtures live in `@keboola/api-fixtures`, which is where a field the backend adds should fail to compile. No published behaviour changes.
92
+
93
+ - Add a `storage.bootstrap` fixture slice — the three responses a client's ready gate needs before
94
+ it is usable (`GET /v2/storage`, `/v2/storage/tokens/verify`, `/v2/storage/dev-branches`).
95
+
96
+ `getStackInfo()`, `verifyStorageToken()` and `getDevBranches()` are typed by
97
+ `@keboola/api-client/storage/types`, so a field the backend adds arrives with `pnpm gen:types`
98
+ rather than being transcribed into every MSW test that bootstraps a client. `getStackInfo()`
99
+ announces every service by default, which is what keeps a test's queue / data-science / vault
100
+ client from being a dummy that throws `ServiceUnavailableError`; pass `services` to narrow it.
101
+
102
+ `@keboola/api-client` gains a runtime `ServiceId` const in `@keboola/api-client/constants`, with
103
+ the `ServiceId` type now derived from it. Announcing every service is exhaustive by construction:
104
+ a service added to the client flows into the fixture without an edit.
105
+
106
+ `@keboola/api-client-react`'s test fixtures now come from the slice; its published output is unchanged.
107
+
3
108
  ## 31.0.0
4
109
 
5
110
  ### Minor Changes
package/README.md CHANGED
@@ -522,24 +522,20 @@ apis:
522
522
 
523
523
  #### Step 2: Generate Types
524
524
 
525
- Run the type generation command:
525
+ Name the service you just registered, so the other schemas stay untouched:
526
526
 
527
527
  ```bash
528
- pnpm gen:types
528
+ pnpm --filter @keboola/api-client gen:types yourNewService
529
529
  ```
530
530
 
531
- This will create the TypeScript definitions at the specified output path. Leave the generated file's
532
- contents alone — `oxlint.config.ts` turns `consistent-type-definitions` off for
531
+ This will create the TypeScript definitions at the specified output path, already formatted. Leave
532
+ the generated file's contents alone — `oxlint.config.ts` turns `consistent-type-definitions` off for
533
533
  `src/clients/*/__generated__/*.d.ts`, so the `export interface operations` the generator emits
534
- despite `--export-type` is fine as it stands. Two mechanical steps do follow: run `oxfmt` on the new
535
- file (the raw output is 4-space), and revert the other schemas the command regenerated — it rewrites
536
- all of them, mostly reformatting. See
537
- [`docs/regenerate-api-types.md`](./docs/regenerate-api-types.md).
534
+ despite `--export-type` is fine as it stands.
538
535
 
539
- `gen:types` regenerates every source in `redocly.yaml`, so to generate only the new one, run
540
- `openapi-typescript` directly against its URL from a directory without a `redocly.yaml` (it
541
- auto-discovers the file up the tree and ignores a positional URL when it finds one) with an absolute
542
- `--output`.
536
+ Passing no service regenerates every source in `redocly.yaml`, which is a full refresh, not what
537
+ adding one client calls for. See [`docs/regenerate-api-types.md`](./docs/regenerate-api-types.md)
538
+ for the local-backend workflow and for services with no `redocly.yaml` entry.
543
539
 
544
540
  #### Step 3: Create the Client Implementation
545
541
 
@@ -624,15 +620,42 @@ import { createYourNewServiceClient } from './clients/yourNewService';
624
620
 
625
621
  ### Adding a New Generic Client
626
622
 
627
- Follow the same steps but use `createGenericFetchClient` instead of `createOpenapiFetchClient`. No `redocly.yaml` registration or `pnpm gen:types` step is needed. Define request/response types manually.
623
+ Follow the same steps but use `createGenericFetchClient` instead of `createOpenapiFetchClient`. No `redocly.yaml` registration or `gen:types` step is needed. Define request/response types manually.
624
+
625
+ ### `gen:types` — regenerating OpenAPI types
626
+
627
+ Every `__generated__/schema.d.ts` comes out of one command, scoped to the services you name:
628
+
629
+ ```bash
630
+ pnpm --filter @keboola/api-client gen:types --list # what can be regenerated
631
+ pnpm --filter @keboola/api-client gen:types storage # one service — leaves the rest alone
632
+ pnpm --filter @keboola/api-client gen:types chat queue # several
633
+ pnpm --filter @keboola/api-client gen:types # every API in redocly.yaml
634
+
635
+ # One service's spec from a local dev server instead of its registered URL:
636
+ pnpm --filter @keboola/api-client gen:types chat --url http://localhost:3001/api/docs
628
637
 
629
- ### OpenAPI Type Generation Workflow
638
+ ```
630
639
 
631
- 1. Update API specifications (if needed, edit `redocly.yaml`)
632
- 2. Run `pnpm gen:types` to regenerate TypeScript definitions
633
- 3. Review generated files in `__generated__/` directories
634
- 4. Update client implementation if the API surface changed
635
- 5. Always commit generated files to version control
640
+ A service is named by its `redocly.yaml` key. Local-backend ports for `chat` and `kaiAgent` are in
641
+ [`docs/regenerate-api-types.md`](./docs/regenerate-api-types.md).
642
+
643
+ How it behaves:
644
+
645
+ - **Only the named services' `schema.d.ts` files are rewritten**; every other schema is untouched.
646
+ (`openapi-typescript` has no per-API flag, so the script hands it a filtered copy of
647
+ `redocly.yaml` in a temp directory.)
648
+ - **Output is committable as generated** — the script runs `oxfmt` over it, so a diff is the spec
649
+ change, not whitespace. Commit the generated files.
650
+ - **Bad invocations exit non-zero** with the service listing appended: an unknown service name, or
651
+ `--url` with anything but exactly one service.
652
+ - **`microsoftGraph` is the one local `root`** — a committed slice of Microsoft's ~41MB Graph
653
+ document. A run that selects it re-vendors the slice from upstream first, so naming the service
654
+ fetches its current spec exactly as every URL root does; a run that doesn't select it can never
655
+ re-pin the slice. If the download fails, or an operation in the slice no longer exists upstream
656
+ (a Microsoft rename), the run warns, keeps the committed slice, and carries on — it only
657
+ hard-fails when there is no committed slice to fall back on. Why a slice at all:
658
+ [`scripts/vendor-microsoft-graph-spec.mjs`](./scripts/vendor-microsoft-graph-spec.mjs).
636
659
 
637
660
  ### redocly.yaml Configuration Reference
638
661
 
@@ -643,3 +666,6 @@ apis:
643
666
  x-openapi-ts:
644
667
  output: ./src/clients/serviceName/__generated__/schema.d.ts
645
668
  ```
669
+
670
+ `root` is normally a URL the generator fetches; the one local-file `root` (`microsoftGraph`) is the
671
+ vendored slice described in the [`gen:types` section](#gentypes--regenerating-openapi-types) above.
@@ -1,4 +1,4 @@
1
- const require_createFetchClient = require("./createFetchClient-B9Cv0W9f.cjs");
1
+ const require_createFetchClient = require("./createFetchClient-BRfTjBLV.cjs");
2
2
  //#region src/errors/ManagementClientAuthError.ts
3
3
  var ManagementClientAuthError = class extends require_createFetchClient.ApiError {
4
4
  title;
@@ -17,4 +17,4 @@ Object.defineProperty(exports, "ManagementClientAuthError", {
17
17
  }
18
18
  });
19
19
 
20
- //# sourceMappingURL=ManagementClientAuthError-DFhi5yxe.cjs.map
20
+ //# sourceMappingURL=ManagementClientAuthError-B-tyPlyG.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ManagementClientAuthError-DFhi5yxe.cjs","names":["ApiError"],"sources":["../src/errors/ManagementClientAuthError.ts"],"sourcesContent":["import type { ApiResponse } from '../fetchClient/createFetchClient/types';\n\nimport { ApiError } from './ApiError';\n\nexport class ManagementClientAuthError extends ApiError {\n title: string;\n message: string;\n constructor(title: string, message: string, res: ApiResponse) {\n super(res);\n this.title = title;\n this.message = message;\n }\n}\n"],"mappings":";;AAIA,IAAa,4BAAb,cAA+CA,0BAAAA,SAAS;CACtD;CACA;CACA,YAAY,OAAe,SAAiB,KAAkB;EAC5D,MAAM,GAAG;EACT,KAAK,QAAQ;EACb,KAAK,UAAU;CACjB;AACF"}
1
+ {"version":3,"file":"ManagementClientAuthError-B-tyPlyG.cjs","names":["ApiError"],"sources":["../src/errors/ManagementClientAuthError.ts"],"sourcesContent":["import type { ApiResponse } from '../fetchClient/createFetchClient/types';\n\nimport { ApiError } from './ApiError';\n\nexport class ManagementClientAuthError extends ApiError {\n title: string;\n message: string;\n constructor(title: string, message: string, res: ApiResponse) {\n super(res);\n this.title = title;\n this.message = message;\n }\n}\n"],"mappings":";;AAIA,IAAa,4BAAb,cAA+CA,0BAAAA,SAAS;CACtD;CACA;CACA,YAAY,OAAe,SAAiB,KAAkB;EAC5D,MAAM,GAAG;EACT,KAAK,QAAQ;EACb,KAAK,UAAU;CACjB;AACF"}
@@ -1,4 +1,4 @@
1
- import { m as ApiError } from "./createFetchClient-B1h3-p65.js";
1
+ import { m as ApiError } from "./createFetchClient-BbG46bL0.js";
2
2
  //#region src/errors/ManagementClientAuthError.ts
3
3
  var ManagementClientAuthError = class extends ApiError {
4
4
  title;
@@ -12,4 +12,4 @@ var ManagementClientAuthError = class extends ApiError {
12
12
  //#endregion
13
13
  export { ManagementClientAuthError as t };
14
14
 
15
- //# sourceMappingURL=ManagementClientAuthError-90pvsej0.js.map
15
+ //# sourceMappingURL=ManagementClientAuthError-BAFNvOdf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ManagementClientAuthError-90pvsej0.js","names":[],"sources":["../src/errors/ManagementClientAuthError.ts"],"sourcesContent":["import type { ApiResponse } from '../fetchClient/createFetchClient/types';\n\nimport { ApiError } from './ApiError';\n\nexport class ManagementClientAuthError extends ApiError {\n title: string;\n message: string;\n constructor(title: string, message: string, res: ApiResponse) {\n super(res);\n this.title = title;\n this.message = message;\n }\n}\n"],"mappings":";;AAIA,IAAa,4BAAb,cAA+C,SAAS;CACtD;CACA;CACA,YAAY,OAAe,SAAiB,KAAkB;EAC5D,MAAM,GAAG;EACT,KAAK,QAAQ;EACb,KAAK,UAAU;CACjB;AACF"}
1
+ {"version":3,"file":"ManagementClientAuthError-BAFNvOdf.js","names":[],"sources":["../src/errors/ManagementClientAuthError.ts"],"sourcesContent":["import type { ApiResponse } from '../fetchClient/createFetchClient/types';\n\nimport { ApiError } from './ApiError';\n\nexport class ManagementClientAuthError extends ApiError {\n title: string;\n message: string;\n constructor(title: string, message: string, res: ApiResponse) {\n super(res);\n this.title = title;\n this.message = message;\n }\n}\n"],"mappings":";;AAIA,IAAa,4BAAb,cAA+C,SAAS;CACtD;CACA;CACA,YAAY,OAAe,SAAiB,KAAkB;EAC5D,MAAM,GAAG;EACT,KAAK,QAAQ;EACb,KAAK,UAAU;CACjB;AACF"}
package/dist/ai/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_createOpenapiFetchClient = require("../createOpenapiFetchClient-yirrW6Tg.cjs");
3
- const require_auth = require("../auth-DmgTH0uY.cjs");
2
+ const require_createOpenapiFetchClient = require("../createOpenapiFetchClient-CyDUFxHB.cjs");
3
+ const require_auth = require("../auth-DP-6TFiM.cjs");
4
4
  //#region src/clients/ai/aiClient.ts
5
5
  const createAiClient = ({ baseUrl, middlewares, auth }) => {
6
6
  const client = require_createOpenapiFetchClient.createOpenapiFetchClient({
@@ -1,5 +1,5 @@
1
- import { a as DescribeConfigurationVersionBody, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, p as components, r as DescribeConfigurationBody, s as DocsQuestionBody, u as FeedbackBody } from "../types-056giLrn.cjs";
2
- import { n as ClientInitOptions } from "../types-BdKtW2Ml.cjs";
1
+ import { a as DescribeConfigurationVersionBody, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, p as components, r as DescribeConfigurationBody, s as DocsQuestionBody, u as FeedbackBody } from "../types-CvkqEvhv.cjs";
2
+ import { n as ClientInitOptions } from "../types-BREGN3qo.cjs";
3
3
  //#region src/clients/ai/aiClient.d.ts
4
4
  declare const createAiClient: ({ baseUrl, middlewares, auth }: ClientInitOptions) => {
5
5
  healthCheck: (signal?: AbortSignal) => Promise<{
@@ -1,5 +1,5 @@
1
- import { a as DescribeConfigurationVersionBody, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, p as components, r as DescribeConfigurationBody, s as DocsQuestionBody, u as FeedbackBody } from "../types-Drk7PEhk.js";
2
- import { n as ClientInitOptions } from "../types-SX78XZZ0.js";
1
+ import { a as DescribeConfigurationVersionBody, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, p as components, r as DescribeConfigurationBody, s as DocsQuestionBody, u as FeedbackBody } from "../types-BnaAo7xn.js";
2
+ import { n as ClientInitOptions } from "../types-DwpRt3e9.js";
3
3
  //#region src/clients/ai/aiClient.d.ts
4
4
  declare const createAiClient: ({ baseUrl, middlewares, auth }: ClientInitOptions) => {
5
5
  healthCheck: (signal?: AbortSignal) => Promise<{
package/dist/ai/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as createOpenapiFetchClient } from "../createOpenapiFetchClient-0_oqhdPv.js";
2
- import { t as createAuthHeaders } from "../auth-CE6Hlc9W.js";
1
+ import { t as createOpenapiFetchClient } from "../createOpenapiFetchClient-Bn6_Pn0H.js";
2
+ import { t as createAuthHeaders } from "../auth-DtbQaeDj.js";
3
3
  //#region src/clients/ai/aiClient.ts
4
4
  const createAiClient = ({ baseUrl, middlewares, auth }) => {
5
5
  const client = createOpenapiFetchClient({
@@ -1,2 +1,2 @@
1
- import { a as DescribeConfigurationVersionBody, c as ErrorExplanation, d as ObjectDescription, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, n as ComponentSuggestion, o as DocsAnswer, r as DescribeConfigurationBody, s as DocsQuestionBody, t as ComponentDocsDetail, u as FeedbackBody } from "../types-056giLrn.cjs";
1
+ import { a as DescribeConfigurationVersionBody, c as ErrorExplanation, d as ObjectDescription, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, n as ComponentSuggestion, o as DocsAnswer, r as DescribeConfigurationBody, s as DocsQuestionBody, t as ComponentDocsDetail, u as FeedbackBody } from "../types-CvkqEvhv.cjs";
2
2
  export { ComponentDocsDetail, ComponentSuggestion, DescribeConfigurationBody, DescribeConfigurationMergeBody, DescribeConfigurationVersionBody, DocsAnswer, DocsQuestionBody, ErrorExplanation, ExplainErrorBody, FeedbackBody, ObjectDescription, SuggestComponentBody };
@@ -1,2 +1,2 @@
1
- import { a as DescribeConfigurationVersionBody, c as ErrorExplanation, d as ObjectDescription, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, n as ComponentSuggestion, o as DocsAnswer, r as DescribeConfigurationBody, s as DocsQuestionBody, t as ComponentDocsDetail, u as FeedbackBody } from "../types-Drk7PEhk.js";
1
+ import { a as DescribeConfigurationVersionBody, c as ErrorExplanation, d as ObjectDescription, f as SuggestComponentBody, i as DescribeConfigurationMergeBody, l as ExplainErrorBody, n as ComponentSuggestion, o as DocsAnswer, r as DescribeConfigurationBody, s as DocsQuestionBody, t as ComponentDocsDetail, u as FeedbackBody } from "../types-BnaAo7xn.js";
2
2
  export { ComponentDocsDetail, ComponentSuggestion, DescribeConfigurationBody, DescribeConfigurationMergeBody, DescribeConfigurationVersionBody, DocsAnswer, DocsQuestionBody, ErrorExplanation, ExplainErrorBody, FeedbackBody, ObjectDescription, SuggestComponentBody };
@@ -1,4 +1,4 @@
1
- import "./index-B-frWtGW.cjs";
1
+ import "./index-CQrKS7PV.cjs";
2
2
  //#region src/domain/appLogs.d.ts
3
3
  type LogEntry = {
4
4
  timestamp: string | null;
@@ -7,4 +7,4 @@ type LogEntry = {
7
7
  declare const parseLogLines: (raw: unknown) => LogEntry[];
8
8
  //#endregion
9
9
  export { parseLogLines as n, LogEntry as t };
10
- //# sourceMappingURL=appLogs-hQdKt_8J.d.cts.map
10
+ //# sourceMappingURL=appLogs-BAaaGYKg.d.cts.map
@@ -1,5 +1,5 @@
1
1
  import { t as isPlainObject } from "./isPlainObject-LYW-03uB.js";
2
- import { f as HttpStatus, o as HttpHeader, r as isApiError, u as parseContentDispositionHeader } from "./createFetchClient-B1h3-p65.js";
2
+ import { f as HttpStatus, o as HttpHeader, r as isApiError, u as parseContentDispositionHeader } from "./createFetchClient-BbG46bL0.js";
3
3
  import * as z$1 from "zod";
4
4
  import dayjs from "dayjs";
5
5
  import utc from "dayjs/plugin/utc.js";
@@ -129,4 +129,4 @@ const readAppLogsDownload = async (fetchLogs) => {
129
129
  //#endregion
130
130
  export { readAppLogsDownload as n, readAppLogsTail as r, parseLogLines as t };
131
131
 
132
- //# sourceMappingURL=appLogs-CLHhkQJn.js.map
132
+ //# sourceMappingURL=appLogs-DTLE6HTy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appLogs-CLHhkQJn.js","names":["z","record"],"sources":["../src/domain/appLogs.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport * as z from 'zod';\n\nimport {\n type ApiResponse,\n HttpHeader,\n isApiError,\n parseContentDispositionHeader,\n} from '../fetchClient';\nimport { HttpStatus } from '../internal';\nimport { isPlainObject } from '../utils/isPlainObject';\n\n/**\n * Reading a data app's container output. Shared by the two clients wrapping sandboxes-service —\n * `dataScience` (`/v1`) and `apps` (`/v2`) — which serve the same logs under different paths, so the\n * tail contract (how a line is parsed, where the next poll resumes, and that an idle app is not an\n * error) is defined once here rather than per surface.\n */\n\ndayjs.extend(utc);\n\nexport type LogEntry = {\n timestamp: string | null;\n message: string;\n};\n\nconst DEFAULT_LOGS_FILE_NAME = 'logs.txt';\n\nconst ISO_TIMESTAMP_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z/;\nconst LEADING_ISO_TIMESTAMP_REGEX = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z)\\s?/;\n\n/** The error envelope sandboxes-service returns; the tail branches on its `code`. */\nconst TailError = z.object({\n context: z.object({\n code: z.string(),\n }),\n});\n\n/**\n * There is nothing to read right now, reported per scope: an app whose serving member is asleep\n * answers `apps.appNotRunning`, a deployment that isn't running answers `apps.deploymentNotRunning` —\n * the normal state of a staged or retired one, since a deployment only runs while it is production.\n */\nconst NOTHING_RUNNING_CODES = new Set(['apps.appNotRunning', 'apps.deploymentNotRunning']);\n\nconst tryParseJsonl = (line: string): LogEntry | null => {\n if (!line.startsWith('{')) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return null;\n }\n\n if (typeof parsed !== 'object' || parsed === null) return null;\n\n const record = parsed as Record<string, unknown>;\n const { timestamp, message } = record;\n\n if (typeof timestamp !== 'string' || typeof message !== 'string') return null;\n\n return {\n timestamp,\n message,\n };\n};\n\nconst parsePlainTextLine = (line: string): LogEntry => {\n const match = line.match(LEADING_ISO_TIMESTAMP_REGEX);\n if (match) {\n return { timestamp: match[1]!, message: line.slice(match[0].length) };\n }\n return { timestamp: null, message: line };\n};\n\nexport const parseLogLine = (line: string): LogEntry =>\n tryParseJsonl(line) ?? parsePlainTextLine(line);\n\nconst toLogEntryFromObject = (raw: Record<string, unknown>): LogEntry | null => {\n if (typeof raw.message !== 'string') return null;\n return {\n timestamp: typeof raw.timestamp === 'string' ? raw.timestamp : null,\n message: raw.message,\n };\n};\n\nexport const parseLogLines = (raw: unknown): LogEntry[] => {\n if (raw === null || raw === undefined || raw === '') return [];\n\n if (Array.isArray(raw)) {\n return raw.flatMap((item) => {\n if (typeof item === 'string') return item === '' ? [] : [parseLogLine(item)];\n if (isPlainObject(item)) {\n const entry = toLogEntryFromObject(item);\n return entry ? [entry] : [];\n }\n return [];\n });\n }\n\n if (isPlainObject(raw)) {\n const entry = toLogEntryFromObject(raw);\n return entry ? [entry] : [];\n }\n\n if (typeof raw !== 'string') return [];\n\n const lines = raw.split('\\n');\n const entries: LogEntry[] = [];\n for (const line of lines) {\n if (line === '') continue;\n entries.push(parseLogLine(line));\n }\n return entries;\n};\n\nexport const lastLogTimestamp = (entries: LogEntry[]) => {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (!entry) continue;\n if (entry.timestamp) return entry.timestamp;\n\n // A plain-text line may carry a timestamp embedded mid-line (legacy format).\n const match = entry.message.match(ISO_TIMESTAMP_REGEX);\n if (match) return match[0];\n }\n return null;\n};\n\nconst calculateNextLogTimestamp = (timestamp: string | null) => {\n if (timestamp === null) return null;\n return dayjs(timestamp).utc().add(1, 'second').utc().format();\n};\n\n/**\n * The tail plus the timestamp a follow-up poll resumes from. A {@link NOTHING_RUNNING_CODES} `400`\n * reads as an empty tail rather than an error — an idle app between visits, or a deployment that is\n * not the one currently serving, has no logs to stream and that is its normal condition.\n */\nexport const readAppLogsTail = async (fetchTail: () => Promise<ApiResponse<string>>) => {\n try {\n const { data } = await fetchTail();\n const entries = parseLogLines(data);\n\n return {\n entries,\n nextLogTimestamp: calculateNextLogTimestamp(lastLogTimestamp(entries)),\n };\n } catch (error) {\n if (isApiError(error) && error.response.status === HttpStatus.BAD_REQUEST) {\n const code = TailError.safeParse(error.data).data?.context?.code;\n if (code !== undefined && NOTHING_RUNNING_CODES.has(code)) {\n return { entries: [], nextLogTimestamp: null };\n }\n }\n throw error;\n }\n};\n\n/** The whole log as a file download, named by the service's `Content-Disposition` where it sets one. */\nexport const readAppLogsDownload = async (fetchLogs: () => Promise<ApiResponse<string>>) => {\n const { data, response } = await fetchLogs();\n const contentDisposition = parseContentDispositionHeader(\n response.headers.get(HttpHeader.CONTENT_DISPOSITION),\n );\n\n return {\n logs: data,\n fileName: contentDisposition.filename ?? DEFAULT_LOGS_FILE_NAME,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"appLogs-DTLE6HTy.js","names":["z","record"],"sources":["../src/domain/appLogs.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport * as z from 'zod';\n\nimport {\n type ApiResponse,\n HttpHeader,\n isApiError,\n parseContentDispositionHeader,\n} from '../fetchClient';\nimport { HttpStatus } from '../internal';\nimport { isPlainObject } from '../utils/isPlainObject';\n\n/**\n * Reading a data app's container output. Shared by the two clients wrapping sandboxes-service —\n * `dataScience` (`/v1`) and `apps` (`/v2`) — which serve the same logs under different paths, so the\n * tail contract (how a line is parsed, where the next poll resumes, and that an idle app is not an\n * error) is defined once here rather than per surface.\n */\n\ndayjs.extend(utc);\n\nexport type LogEntry = {\n timestamp: string | null;\n message: string;\n};\n\nconst DEFAULT_LOGS_FILE_NAME = 'logs.txt';\n\nconst ISO_TIMESTAMP_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z/;\nconst LEADING_ISO_TIMESTAMP_REGEX = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z)\\s?/;\n\n/** The error envelope sandboxes-service returns; the tail branches on its `code`. */\nconst TailError = z.object({\n context: z.object({\n code: z.string(),\n }),\n});\n\n/**\n * There is nothing to read right now, reported per scope: an app whose serving member is asleep\n * answers `apps.appNotRunning`, a deployment that isn't running answers `apps.deploymentNotRunning` —\n * the normal state of a staged or retired one, since a deployment only runs while it is production.\n */\nconst NOTHING_RUNNING_CODES = new Set(['apps.appNotRunning', 'apps.deploymentNotRunning']);\n\nconst tryParseJsonl = (line: string): LogEntry | null => {\n if (!line.startsWith('{')) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return null;\n }\n\n if (typeof parsed !== 'object' || parsed === null) return null;\n\n const record = parsed as Record<string, unknown>;\n const { timestamp, message } = record;\n\n if (typeof timestamp !== 'string' || typeof message !== 'string') return null;\n\n return {\n timestamp,\n message,\n };\n};\n\nconst parsePlainTextLine = (line: string): LogEntry => {\n const match = line.match(LEADING_ISO_TIMESTAMP_REGEX);\n if (match) {\n return { timestamp: match[1]!, message: line.slice(match[0].length) };\n }\n return { timestamp: null, message: line };\n};\n\nexport const parseLogLine = (line: string): LogEntry =>\n tryParseJsonl(line) ?? parsePlainTextLine(line);\n\nconst toLogEntryFromObject = (raw: Record<string, unknown>): LogEntry | null => {\n if (typeof raw.message !== 'string') return null;\n return {\n timestamp: typeof raw.timestamp === 'string' ? raw.timestamp : null,\n message: raw.message,\n };\n};\n\nexport const parseLogLines = (raw: unknown): LogEntry[] => {\n if (raw === null || raw === undefined || raw === '') return [];\n\n if (Array.isArray(raw)) {\n return raw.flatMap((item) => {\n if (typeof item === 'string') return item === '' ? [] : [parseLogLine(item)];\n if (isPlainObject(item)) {\n const entry = toLogEntryFromObject(item);\n return entry ? [entry] : [];\n }\n return [];\n });\n }\n\n if (isPlainObject(raw)) {\n const entry = toLogEntryFromObject(raw);\n return entry ? [entry] : [];\n }\n\n if (typeof raw !== 'string') return [];\n\n const lines = raw.split('\\n');\n const entries: LogEntry[] = [];\n for (const line of lines) {\n if (line === '') continue;\n entries.push(parseLogLine(line));\n }\n return entries;\n};\n\nexport const lastLogTimestamp = (entries: LogEntry[]) => {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (!entry) continue;\n if (entry.timestamp) return entry.timestamp;\n\n // A plain-text line may carry a timestamp embedded mid-line (legacy format).\n const match = entry.message.match(ISO_TIMESTAMP_REGEX);\n if (match) return match[0];\n }\n return null;\n};\n\nconst calculateNextLogTimestamp = (timestamp: string | null) => {\n if (timestamp === null) return null;\n return dayjs(timestamp).utc().add(1, 'second').utc().format();\n};\n\n/**\n * The tail plus the timestamp a follow-up poll resumes from. A {@link NOTHING_RUNNING_CODES} `400`\n * reads as an empty tail rather than an error — an idle app between visits, or a deployment that is\n * not the one currently serving, has no logs to stream and that is its normal condition.\n */\nexport const readAppLogsTail = async (fetchTail: () => Promise<ApiResponse<string>>) => {\n try {\n const { data } = await fetchTail();\n const entries = parseLogLines(data);\n\n return {\n entries,\n nextLogTimestamp: calculateNextLogTimestamp(lastLogTimestamp(entries)),\n };\n } catch (error) {\n if (isApiError(error) && error.response.status === HttpStatus.BAD_REQUEST) {\n const code = TailError.safeParse(error.data).data?.context?.code;\n if (code !== undefined && NOTHING_RUNNING_CODES.has(code)) {\n return { entries: [], nextLogTimestamp: null };\n }\n }\n throw error;\n }\n};\n\n/** The whole log as a file download, named by the service's `Content-Disposition` where it sets one. */\nexport const readAppLogsDownload = async (fetchLogs: () => Promise<ApiResponse<string>>) => {\n const { data, response } = await fetchLogs();\n const contentDisposition = parseContentDispositionHeader(\n response.headers.get(HttpHeader.CONTENT_DISPOSITION),\n );\n\n return {\n logs: data,\n fileName: contentDisposition.filename ?? DEFAULT_LOGS_FILE_NAME,\n };\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import "./index-Ds8e0l7-.js";
1
+ import "./index-CeJOmN-P.js";
2
2
  //#region src/domain/appLogs.d.ts
3
3
  type LogEntry = {
4
4
  timestamp: string | null;
@@ -7,4 +7,4 @@ type LogEntry = {
7
7
  declare const parseLogLines: (raw: unknown) => LogEntry[];
8
8
  //#endregion
9
9
  export { parseLogLines as n, LogEntry as t };
10
- //# sourceMappingURL=appLogs-BdMG6Cvn.d.ts.map
10
+ //# sourceMappingURL=appLogs-DX_WTBCa.d.ts.map
@@ -1,6 +1,6 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-VH7oDXx4.cjs");
2
2
  const require_isPlainObject = require("./isPlainObject-BB3iy87C.cjs");
3
- const require_createFetchClient = require("./createFetchClient-B9Cv0W9f.cjs");
3
+ const require_createFetchClient = require("./createFetchClient-BRfTjBLV.cjs");
4
4
  let zod = require("zod");
5
5
  zod = require_rolldown_runtime.__toESM(zod, 1);
6
6
  let dayjs = require("dayjs");
@@ -150,4 +150,4 @@ Object.defineProperty(exports, "readAppLogsTail", {
150
150
  }
151
151
  });
152
152
 
153
- //# sourceMappingURL=appLogs-BCCi02w6.cjs.map
153
+ //# sourceMappingURL=appLogs-NIEDTDHf.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"appLogs-BCCi02w6.cjs","names":["utc","z","record","isPlainObject","isApiError","HttpStatus","parseContentDispositionHeader","HttpHeader"],"sources":["../src/domain/appLogs.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport * as z from 'zod';\n\nimport {\n type ApiResponse,\n HttpHeader,\n isApiError,\n parseContentDispositionHeader,\n} from '../fetchClient';\nimport { HttpStatus } from '../internal';\nimport { isPlainObject } from '../utils/isPlainObject';\n\n/**\n * Reading a data app's container output. Shared by the two clients wrapping sandboxes-service —\n * `dataScience` (`/v1`) and `apps` (`/v2`) — which serve the same logs under different paths, so the\n * tail contract (how a line is parsed, where the next poll resumes, and that an idle app is not an\n * error) is defined once here rather than per surface.\n */\n\ndayjs.extend(utc);\n\nexport type LogEntry = {\n timestamp: string | null;\n message: string;\n};\n\nconst DEFAULT_LOGS_FILE_NAME = 'logs.txt';\n\nconst ISO_TIMESTAMP_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z/;\nconst LEADING_ISO_TIMESTAMP_REGEX = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z)\\s?/;\n\n/** The error envelope sandboxes-service returns; the tail branches on its `code`. */\nconst TailError = z.object({\n context: z.object({\n code: z.string(),\n }),\n});\n\n/**\n * There is nothing to read right now, reported per scope: an app whose serving member is asleep\n * answers `apps.appNotRunning`, a deployment that isn't running answers `apps.deploymentNotRunning` —\n * the normal state of a staged or retired one, since a deployment only runs while it is production.\n */\nconst NOTHING_RUNNING_CODES = new Set(['apps.appNotRunning', 'apps.deploymentNotRunning']);\n\nconst tryParseJsonl = (line: string): LogEntry | null => {\n if (!line.startsWith('{')) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return null;\n }\n\n if (typeof parsed !== 'object' || parsed === null) return null;\n\n const record = parsed as Record<string, unknown>;\n const { timestamp, message } = record;\n\n if (typeof timestamp !== 'string' || typeof message !== 'string') return null;\n\n return {\n timestamp,\n message,\n };\n};\n\nconst parsePlainTextLine = (line: string): LogEntry => {\n const match = line.match(LEADING_ISO_TIMESTAMP_REGEX);\n if (match) {\n return { timestamp: match[1]!, message: line.slice(match[0].length) };\n }\n return { timestamp: null, message: line };\n};\n\nexport const parseLogLine = (line: string): LogEntry =>\n tryParseJsonl(line) ?? parsePlainTextLine(line);\n\nconst toLogEntryFromObject = (raw: Record<string, unknown>): LogEntry | null => {\n if (typeof raw.message !== 'string') return null;\n return {\n timestamp: typeof raw.timestamp === 'string' ? raw.timestamp : null,\n message: raw.message,\n };\n};\n\nexport const parseLogLines = (raw: unknown): LogEntry[] => {\n if (raw === null || raw === undefined || raw === '') return [];\n\n if (Array.isArray(raw)) {\n return raw.flatMap((item) => {\n if (typeof item === 'string') return item === '' ? [] : [parseLogLine(item)];\n if (isPlainObject(item)) {\n const entry = toLogEntryFromObject(item);\n return entry ? [entry] : [];\n }\n return [];\n });\n }\n\n if (isPlainObject(raw)) {\n const entry = toLogEntryFromObject(raw);\n return entry ? [entry] : [];\n }\n\n if (typeof raw !== 'string') return [];\n\n const lines = raw.split('\\n');\n const entries: LogEntry[] = [];\n for (const line of lines) {\n if (line === '') continue;\n entries.push(parseLogLine(line));\n }\n return entries;\n};\n\nexport const lastLogTimestamp = (entries: LogEntry[]) => {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (!entry) continue;\n if (entry.timestamp) return entry.timestamp;\n\n // A plain-text line may carry a timestamp embedded mid-line (legacy format).\n const match = entry.message.match(ISO_TIMESTAMP_REGEX);\n if (match) return match[0];\n }\n return null;\n};\n\nconst calculateNextLogTimestamp = (timestamp: string | null) => {\n if (timestamp === null) return null;\n return dayjs(timestamp).utc().add(1, 'second').utc().format();\n};\n\n/**\n * The tail plus the timestamp a follow-up poll resumes from. A {@link NOTHING_RUNNING_CODES} `400`\n * reads as an empty tail rather than an error — an idle app between visits, or a deployment that is\n * not the one currently serving, has no logs to stream and that is its normal condition.\n */\nexport const readAppLogsTail = async (fetchTail: () => Promise<ApiResponse<string>>) => {\n try {\n const { data } = await fetchTail();\n const entries = parseLogLines(data);\n\n return {\n entries,\n nextLogTimestamp: calculateNextLogTimestamp(lastLogTimestamp(entries)),\n };\n } catch (error) {\n if (isApiError(error) && error.response.status === HttpStatus.BAD_REQUEST) {\n const code = TailError.safeParse(error.data).data?.context?.code;\n if (code !== undefined && NOTHING_RUNNING_CODES.has(code)) {\n return { entries: [], nextLogTimestamp: null };\n }\n }\n throw error;\n }\n};\n\n/** The whole log as a file download, named by the service's `Content-Disposition` where it sets one. */\nexport const readAppLogsDownload = async (fetchLogs: () => Promise<ApiResponse<string>>) => {\n const { data, response } = await fetchLogs();\n const contentDisposition = parseContentDispositionHeader(\n response.headers.get(HttpHeader.CONTENT_DISPOSITION),\n );\n\n return {\n logs: data,\n fileName: contentDisposition.filename ?? DEFAULT_LOGS_FILE_NAME,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"appLogs-NIEDTDHf.cjs","names":["utc","z","record","isPlainObject","isApiError","HttpStatus","parseContentDispositionHeader","HttpHeader"],"sources":["../src/domain/appLogs.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport * as z from 'zod';\n\nimport {\n type ApiResponse,\n HttpHeader,\n isApiError,\n parseContentDispositionHeader,\n} from '../fetchClient';\nimport { HttpStatus } from '../internal';\nimport { isPlainObject } from '../utils/isPlainObject';\n\n/**\n * Reading a data app's container output. Shared by the two clients wrapping sandboxes-service —\n * `dataScience` (`/v1`) and `apps` (`/v2`) — which serve the same logs under different paths, so the\n * tail contract (how a line is parsed, where the next poll resumes, and that an idle app is not an\n * error) is defined once here rather than per surface.\n */\n\ndayjs.extend(utc);\n\nexport type LogEntry = {\n timestamp: string | null;\n message: string;\n};\n\nconst DEFAULT_LOGS_FILE_NAME = 'logs.txt';\n\nconst ISO_TIMESTAMP_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z/;\nconst LEADING_ISO_TIMESTAMP_REGEX = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z)\\s?/;\n\n/** The error envelope sandboxes-service returns; the tail branches on its `code`. */\nconst TailError = z.object({\n context: z.object({\n code: z.string(),\n }),\n});\n\n/**\n * There is nothing to read right now, reported per scope: an app whose serving member is asleep\n * answers `apps.appNotRunning`, a deployment that isn't running answers `apps.deploymentNotRunning` —\n * the normal state of a staged or retired one, since a deployment only runs while it is production.\n */\nconst NOTHING_RUNNING_CODES = new Set(['apps.appNotRunning', 'apps.deploymentNotRunning']);\n\nconst tryParseJsonl = (line: string): LogEntry | null => {\n if (!line.startsWith('{')) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return null;\n }\n\n if (typeof parsed !== 'object' || parsed === null) return null;\n\n const record = parsed as Record<string, unknown>;\n const { timestamp, message } = record;\n\n if (typeof timestamp !== 'string' || typeof message !== 'string') return null;\n\n return {\n timestamp,\n message,\n };\n};\n\nconst parsePlainTextLine = (line: string): LogEntry => {\n const match = line.match(LEADING_ISO_TIMESTAMP_REGEX);\n if (match) {\n return { timestamp: match[1]!, message: line.slice(match[0].length) };\n }\n return { timestamp: null, message: line };\n};\n\nexport const parseLogLine = (line: string): LogEntry =>\n tryParseJsonl(line) ?? parsePlainTextLine(line);\n\nconst toLogEntryFromObject = (raw: Record<string, unknown>): LogEntry | null => {\n if (typeof raw.message !== 'string') return null;\n return {\n timestamp: typeof raw.timestamp === 'string' ? raw.timestamp : null,\n message: raw.message,\n };\n};\n\nexport const parseLogLines = (raw: unknown): LogEntry[] => {\n if (raw === null || raw === undefined || raw === '') return [];\n\n if (Array.isArray(raw)) {\n return raw.flatMap((item) => {\n if (typeof item === 'string') return item === '' ? [] : [parseLogLine(item)];\n if (isPlainObject(item)) {\n const entry = toLogEntryFromObject(item);\n return entry ? [entry] : [];\n }\n return [];\n });\n }\n\n if (isPlainObject(raw)) {\n const entry = toLogEntryFromObject(raw);\n return entry ? [entry] : [];\n }\n\n if (typeof raw !== 'string') return [];\n\n const lines = raw.split('\\n');\n const entries: LogEntry[] = [];\n for (const line of lines) {\n if (line === '') continue;\n entries.push(parseLogLine(line));\n }\n return entries;\n};\n\nexport const lastLogTimestamp = (entries: LogEntry[]) => {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (!entry) continue;\n if (entry.timestamp) return entry.timestamp;\n\n // A plain-text line may carry a timestamp embedded mid-line (legacy format).\n const match = entry.message.match(ISO_TIMESTAMP_REGEX);\n if (match) return match[0];\n }\n return null;\n};\n\nconst calculateNextLogTimestamp = (timestamp: string | null) => {\n if (timestamp === null) return null;\n return dayjs(timestamp).utc().add(1, 'second').utc().format();\n};\n\n/**\n * The tail plus the timestamp a follow-up poll resumes from. A {@link NOTHING_RUNNING_CODES} `400`\n * reads as an empty tail rather than an error — an idle app between visits, or a deployment that is\n * not the one currently serving, has no logs to stream and that is its normal condition.\n */\nexport const readAppLogsTail = async (fetchTail: () => Promise<ApiResponse<string>>) => {\n try {\n const { data } = await fetchTail();\n const entries = parseLogLines(data);\n\n return {\n entries,\n nextLogTimestamp: calculateNextLogTimestamp(lastLogTimestamp(entries)),\n };\n } catch (error) {\n if (isApiError(error) && error.response.status === HttpStatus.BAD_REQUEST) {\n const code = TailError.safeParse(error.data).data?.context?.code;\n if (code !== undefined && NOTHING_RUNNING_CODES.has(code)) {\n return { entries: [], nextLogTimestamp: null };\n }\n }\n throw error;\n }\n};\n\n/** The whole log as a file download, named by the service's `Content-Disposition` where it sets one. */\nexport const readAppLogsDownload = async (fetchLogs: () => Promise<ApiResponse<string>>) => {\n const { data, response } = await fetchLogs();\n const contentDisposition = parseContentDispositionHeader(\n response.headers.get(HttpHeader.CONTENT_DISPOSITION),\n );\n\n return {\n logs: data,\n fileName: contentDisposition.filename ?? DEFAULT_LOGS_FILE_NAME,\n };\n};\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_createOpenapiFetchClient = require("../createOpenapiFetchClient-yirrW6Tg.cjs");
3
- const require_auth = require("../auth-DmgTH0uY.cjs");
4
- const require_appLogs = require("../appLogs-BCCi02w6.cjs");
2
+ const require_createOpenapiFetchClient = require("../createOpenapiFetchClient-CyDUFxHB.cjs");
3
+ const require_auth = require("../auth-DP-6TFiM.cjs");
4
+ const require_appLogs = require("../appLogs-NIEDTDHf.cjs");
5
5
  //#region src/clients/apps/appsClient.ts
6
6
  /**
7
7
  * `/v2` App Deployments — data apps plus the immutable deployment history behind them. Sibling of
@@ -1,6 +1,6 @@
1
- import { n as ClientInitOptions } from "../types-BdKtW2Ml.cjs";
2
- import { S as components, b as GetLogsTailQuery, c as CreateCredentialBody, f as CredentialId, g as DeploymentId, l as CreateDeploymentBody, r as AppId, s as CreateAppBody, t as App, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-DLazCdFR.cjs";
3
- import { t as LogEntry } from "../appLogs-hQdKt_8J.cjs";
1
+ import { n as ClientInitOptions } from "../types-BREGN3qo.cjs";
2
+ import { S as components, b as GetLogsTailQuery, c as CreateCredentialBody, f as CredentialId, g as DeploymentId, l as CreateDeploymentBody, r as AppId, s as CreateAppBody, t as App, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-CyiRYRVq.cjs";
3
+ import { t as LogEntry } from "../appLogs-BAaaGYKg.cjs";
4
4
  //#region src/clients/apps/appsClient.d.ts
5
5
  /**
6
6
  * No `idempotencyKey`. The service accepted an `Idempotency-Key` that turned a replayed create
@@ -1,6 +1,6 @@
1
- import { n as ClientInitOptions } from "../types-SX78XZZ0.js";
2
- import { S as components, b as GetLogsTailQuery, c as CreateCredentialBody, f as CredentialId, g as DeploymentId, l as CreateDeploymentBody, r as AppId, s as CreateAppBody, t as App, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-Culr5v8R.js";
3
- import { t as LogEntry } from "../appLogs-BdMG6Cvn.js";
1
+ import { n as ClientInitOptions } from "../types-DwpRt3e9.js";
2
+ import { S as components, b as GetLogsTailQuery, c as CreateCredentialBody, f as CredentialId, g as DeploymentId, l as CreateDeploymentBody, r as AppId, s as CreateAppBody, t as App, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-CkcMoXRk.js";
3
+ import { t as LogEntry } from "../appLogs-DX_WTBCa.js";
4
4
  //#region src/clients/apps/appsClient.d.ts
5
5
  /**
6
6
  * No `idempotencyKey`. The service accepted an `Idempotency-Key` that turned a replayed create
@@ -1,6 +1,6 @@
1
- import { t as createOpenapiFetchClient } from "../createOpenapiFetchClient-0_oqhdPv.js";
2
- import { t as createAuthHeaders } from "../auth-CE6Hlc9W.js";
3
- import { n as readAppLogsDownload, r as readAppLogsTail } from "../appLogs-CLHhkQJn.js";
1
+ import { t as createOpenapiFetchClient } from "../createOpenapiFetchClient-Bn6_Pn0H.js";
2
+ import { t as createAuthHeaders } from "../auth-DtbQaeDj.js";
3
+ import { n as readAppLogsDownload, r as readAppLogsTail } from "../appLogs-DTLE6HTy.js";
4
4
  //#region src/clients/apps/appsClient.ts
5
5
  /**
6
6
  * `/v2` App Deployments — data apps plus the immutable deployment history behind them. Sibling of
@@ -1,3 +1,3 @@
1
- import { _ as DeploymentRunState, a as AppRun, b as GetLogsTailQuery, c as CreateCredentialBody, d as Credential, f as CredentialId, g as DeploymentId, h as DeploymentBuildState, i as AppPassword, l as CreateDeploymentBody, m as Deployment, n as AppGitRepo, o as AppState, p as CredentialList, r as AppId, s as CreateAppBody, t as App, u as CreatedCredential, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-DLazCdFR.cjs";
2
- import { t as LogEntry } from "../appLogs-hQdKt_8J.cjs";
1
+ import { _ as DeploymentRunState, a as AppRun, b as GetLogsTailQuery, c as CreateCredentialBody, d as Credential, f as CredentialId, g as DeploymentId, h as DeploymentBuildState, i as AppPassword, l as CreateDeploymentBody, m as Deployment, n as AppGitRepo, o as AppState, p as CredentialList, r as AppId, s as CreateAppBody, t as App, u as CreatedCredential, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-CyiRYRVq.cjs";
2
+ import { t as LogEntry } from "../appLogs-BAaaGYKg.cjs";
3
3
  export { App, AppGitRepo, AppId, AppPassword, AppRun, AppState, CreateAppBody, CreateCredentialBody, CreateDeploymentBody, CreatedCredential, Credential, CredentialId, CredentialList, Deployment, DeploymentBuildState, DeploymentId, DeploymentRunState, GetAppRunsQuery, GetAppsQuery, GetLogsTailQuery, type LogEntry, RunId };
@@ -1,3 +1,3 @@
1
- import { _ as DeploymentRunState, a as AppRun, b as GetLogsTailQuery, c as CreateCredentialBody, d as Credential, f as CredentialId, g as DeploymentId, h as DeploymentBuildState, i as AppPassword, l as CreateDeploymentBody, m as Deployment, n as AppGitRepo, o as AppState, p as CredentialList, r as AppId, s as CreateAppBody, t as App, u as CreatedCredential, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-Culr5v8R.js";
2
- import { t as LogEntry } from "../appLogs-BdMG6Cvn.js";
1
+ import { _ as DeploymentRunState, a as AppRun, b as GetLogsTailQuery, c as CreateCredentialBody, d as Credential, f as CredentialId, g as DeploymentId, h as DeploymentBuildState, i as AppPassword, l as CreateDeploymentBody, m as Deployment, n as AppGitRepo, o as AppState, p as CredentialList, r as AppId, s as CreateAppBody, t as App, u as CreatedCredential, v as GetAppRunsQuery, x as RunId, y as GetAppsQuery } from "../types-CkcMoXRk.js";
2
+ import { t as LogEntry } from "../appLogs-DX_WTBCa.js";
3
3
  export { App, AppGitRepo, AppId, AppPassword, AppRun, AppState, CreateAppBody, CreateCredentialBody, CreateDeploymentBody, CreatedCredential, Credential, CredentialId, CredentialList, Deployment, DeploymentBuildState, DeploymentId, DeploymentRunState, GetAppRunsQuery, GetAppsQuery, GetLogsTailQuery, type LogEntry, RunId };
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_createGenericFetchClient = require("../createGenericFetchClient-BWoSkTki.cjs");
2
+ const require_createGenericFetchClient = require("../createGenericFetchClient-DHs-i7_O.cjs");
3
3
  const require_assets_schema = require("./schema.cjs");
4
4
  //#region src/clients/assets/assetsClient.ts
5
5
  const createAssetsClient = ({ baseUrl, middlewares }) => {
@@ -1,4 +1,4 @@
1
- import { n as ClientInitOptions } from "../types-BdKtW2Ml.cjs";
1
+ import { n as ClientInitOptions } from "../types-BREGN3qo.cjs";
2
2
  //#region src/clients/assets/assetsClient.d.ts
3
3
  declare const createAssetsClient: ({ baseUrl, middlewares }: Omit<ClientInitOptions, 'auth'>) => {
4
4
  getPublishedChangelogPosts: (signal?: AbortSignal) => Promise<{
@@ -1,4 +1,4 @@
1
- import { n as ClientInitOptions } from "../types-SX78XZZ0.js";
1
+ import { n as ClientInitOptions } from "../types-DwpRt3e9.js";
2
2
  //#region src/clients/assets/assetsClient.d.ts
3
3
  declare const createAssetsClient: ({ baseUrl, middlewares }: Omit<ClientInitOptions, 'auth'>) => {
4
4
  getPublishedChangelogPosts: (signal?: AbortSignal) => Promise<{