@keboola/api-client 0.1.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 (265) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/ai/index.cjs +203 -0
  4. package/dist/ai/index.cjs.map +1 -0
  5. package/dist/ai/index.d.cts +35 -0
  6. package/dist/ai/index.d.ts +35 -0
  7. package/dist/ai/index.js +197 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/ai/types.cjs +4 -0
  10. package/dist/ai/types.cjs.map +1 -0
  11. package/dist/ai/types.d.cts +2 -0
  12. package/dist/ai/types.d.ts +2 -0
  13. package/dist/ai/types.js +3 -0
  14. package/dist/ai/types.js.map +1 -0
  15. package/dist/assets/index.cjs +182 -0
  16. package/dist/assets/index.cjs.map +1 -0
  17. package/dist/assets/index.d.cts +9 -0
  18. package/dist/assets/index.d.ts +9 -0
  19. package/dist/assets/index.js +176 -0
  20. package/dist/assets/index.js.map +1 -0
  21. package/dist/assets/types.cjs +4 -0
  22. package/dist/assets/types.cjs.map +1 -0
  23. package/dist/assets/types.d.cts +8 -0
  24. package/dist/assets/types.d.ts +8 -0
  25. package/dist/assets/types.js +3 -0
  26. package/dist/assets/types.js.map +1 -0
  27. package/dist/authMiddleware-BTFSCMTE.d.ts +11 -0
  28. package/dist/authMiddleware-BteBe1Bt.d.cts +11 -0
  29. package/dist/chat/index.cjs +428 -0
  30. package/dist/chat/index.cjs.map +1 -0
  31. package/dist/chat/index.d.cts +51 -0
  32. package/dist/chat/index.d.ts +51 -0
  33. package/dist/chat/index.js +422 -0
  34. package/dist/chat/index.js.map +1 -0
  35. package/dist/chat/suggestions.cjs +158 -0
  36. package/dist/chat/suggestions.cjs.map +1 -0
  37. package/dist/chat/suggestions.d.cts +437 -0
  38. package/dist/chat/suggestions.d.ts +437 -0
  39. package/dist/chat/suggestions.js +140 -0
  40. package/dist/chat/suggestions.js.map +1 -0
  41. package/dist/chat/types.cjs +10 -0
  42. package/dist/chat/types.cjs.map +1 -0
  43. package/dist/chat/types.d.cts +3 -0
  44. package/dist/chat/types.d.ts +3 -0
  45. package/dist/chat/types.js +8 -0
  46. package/dist/chat/types.js.map +1 -0
  47. package/dist/createGenericFetchClient-CLUzu-jY.d.cts +18 -0
  48. package/dist/createGenericFetchClient-DEakI3F1.d.ts +18 -0
  49. package/dist/createOpenapiFetchClient-CpXmAIFB.d.cts +24 -0
  50. package/dist/createOpenapiFetchClient-_sm4bchL.d.ts +24 -0
  51. package/dist/dataScience/index.cjs +416 -0
  52. package/dist/dataScience/index.cjs.map +1 -0
  53. package/dist/dataScience/index.d.cts +191 -0
  54. package/dist/dataScience/index.d.ts +191 -0
  55. package/dist/dataScience/index.js +388 -0
  56. package/dist/dataScience/index.js.map +1 -0
  57. package/dist/dataScience/types.cjs +4 -0
  58. package/dist/dataScience/types.cjs.map +1 -0
  59. package/dist/dataScience/types.d.cts +2 -0
  60. package/dist/dataScience/types.d.ts +2 -0
  61. package/dist/dataScience/types.js +3 -0
  62. package/dist/dataScience/types.js.map +1 -0
  63. package/dist/editor/index.cjs +275 -0
  64. package/dist/editor/index.cjs.map +1 -0
  65. package/dist/editor/index.d.cts +172 -0
  66. package/dist/editor/index.d.ts +172 -0
  67. package/dist/editor/index.js +269 -0
  68. package/dist/editor/index.js.map +1 -0
  69. package/dist/editor/types.cjs +4 -0
  70. package/dist/editor/types.cjs.map +1 -0
  71. package/dist/editor/types.d.cts +2 -0
  72. package/dist/editor/types.d.ts +2 -0
  73. package/dist/editor/types.js +3 -0
  74. package/dist/editor/types.js.map +1 -0
  75. package/dist/encryption/index.cjs +192 -0
  76. package/dist/encryption/index.cjs.map +1 -0
  77. package/dist/encryption/index.d.cts +14 -0
  78. package/dist/encryption/index.d.ts +14 -0
  79. package/dist/encryption/index.js +186 -0
  80. package/dist/encryption/index.js.map +1 -0
  81. package/dist/encryption/types.cjs +4 -0
  82. package/dist/encryption/types.cjs.map +1 -0
  83. package/dist/encryption/types.d.cts +8 -0
  84. package/dist/encryption/types.d.ts +8 -0
  85. package/dist/encryption/types.js +3 -0
  86. package/dist/encryption/types.js.map +1 -0
  87. package/dist/import/index.cjs +198 -0
  88. package/dist/import/index.cjs.map +1 -0
  89. package/dist/import/index.d.cts +9 -0
  90. package/dist/import/index.d.ts +9 -0
  91. package/dist/import/index.js +192 -0
  92. package/dist/import/index.js.map +1 -0
  93. package/dist/index.cjs +3910 -0
  94. package/dist/index.cjs.map +1 -0
  95. package/dist/index.d.cts +3108 -0
  96. package/dist/index.d.ts +3108 -0
  97. package/dist/index.js +3858 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/keboolaUID-D1DGSbge.d.cts +19 -0
  100. package/dist/keboolaUID-D1DGSbge.d.ts +19 -0
  101. package/dist/management/index.cjs +872 -0
  102. package/dist/management/index.cjs.map +1 -0
  103. package/dist/management/index.d.cts +440 -0
  104. package/dist/management/index.d.ts +440 -0
  105. package/dist/management/index.js +865 -0
  106. package/dist/management/index.js.map +1 -0
  107. package/dist/management/types.cjs +4 -0
  108. package/dist/management/types.cjs.map +1 -0
  109. package/dist/management/types.d.cts +9 -0
  110. package/dist/management/types.d.ts +9 -0
  111. package/dist/management/types.js +3 -0
  112. package/dist/management/types.js.map +1 -0
  113. package/dist/metastore/index.cjs +339 -0
  114. package/dist/metastore/index.cjs.map +1 -0
  115. package/dist/metastore/index.d.cts +52 -0
  116. package/dist/metastore/index.d.ts +52 -0
  117. package/dist/metastore/index.js +333 -0
  118. package/dist/metastore/index.js.map +1 -0
  119. package/dist/metastore/types.cjs +4 -0
  120. package/dist/metastore/types.cjs.map +1 -0
  121. package/dist/metastore/types.d.cts +2 -0
  122. package/dist/metastore/types.d.ts +2 -0
  123. package/dist/metastore/types.js +3 -0
  124. package/dist/metastore/types.js.map +1 -0
  125. package/dist/queryService/index.cjs +250 -0
  126. package/dist/queryService/index.cjs.map +1 -0
  127. package/dist/queryService/index.d.cts +39 -0
  128. package/dist/queryService/index.d.ts +39 -0
  129. package/dist/queryService/index.js +244 -0
  130. package/dist/queryService/index.js.map +1 -0
  131. package/dist/queryService/types.cjs +4 -0
  132. package/dist/queryService/types.cjs.map +1 -0
  133. package/dist/queryService/types.d.cts +2 -0
  134. package/dist/queryService/types.d.ts +2 -0
  135. package/dist/queryService/types.js +3 -0
  136. package/dist/queryService/types.js.map +1 -0
  137. package/dist/queue/index.cjs +192 -0
  138. package/dist/queue/index.cjs.map +1 -0
  139. package/dist/queue/index.d.cts +133 -0
  140. package/dist/queue/index.d.ts +133 -0
  141. package/dist/queue/index.js +186 -0
  142. package/dist/queue/index.js.map +1 -0
  143. package/dist/queue/types.cjs +4 -0
  144. package/dist/queue/types.cjs.map +1 -0
  145. package/dist/queue/types.d.cts +2 -0
  146. package/dist/queue/types.d.ts +2 -0
  147. package/dist/queue/types.js +3 -0
  148. package/dist/queue/types.js.map +1 -0
  149. package/dist/sdk/storage/index.cjs +96 -0
  150. package/dist/sdk/storage/index.cjs.map +1 -0
  151. package/dist/sdk/storage/index.d.cts +24 -0
  152. package/dist/sdk/storage/index.d.ts +24 -0
  153. package/dist/sdk/storage/index.js +94 -0
  154. package/dist/sdk/storage/index.js.map +1 -0
  155. package/dist/sdk/tag/index.cjs +210 -0
  156. package/dist/sdk/tag/index.cjs.map +1 -0
  157. package/dist/sdk/tag/index.d.cts +25 -0
  158. package/dist/sdk/tag/index.d.ts +25 -0
  159. package/dist/sdk/tag/index.js +208 -0
  160. package/dist/sdk/tag/index.js.map +1 -0
  161. package/dist/sdk/tag/types.cjs +4 -0
  162. package/dist/sdk/tag/types.cjs.map +1 -0
  163. package/dist/sdk/tag/types.d.cts +30 -0
  164. package/dist/sdk/tag/types.d.ts +30 -0
  165. package/dist/sdk/tag/types.js +3 -0
  166. package/dist/sdk/tag/types.js.map +1 -0
  167. package/dist/status/index.cjs +178 -0
  168. package/dist/status/index.cjs.map +1 -0
  169. package/dist/status/index.d.cts +10 -0
  170. package/dist/status/index.d.ts +10 -0
  171. package/dist/status/index.js +172 -0
  172. package/dist/status/index.js.map +1 -0
  173. package/dist/status/types.cjs +4 -0
  174. package/dist/status/types.cjs.map +1 -0
  175. package/dist/status/types.d.cts +19 -0
  176. package/dist/status/types.d.ts +19 -0
  177. package/dist/status/types.js +3 -0
  178. package/dist/status/types.js.map +1 -0
  179. package/dist/storage/index.cjs +1021 -0
  180. package/dist/storage/index.cjs.map +1 -0
  181. package/dist/storage/index.d.cts +12 -0
  182. package/dist/storage/index.d.ts +12 -0
  183. package/dist/storage/index.js +1014 -0
  184. package/dist/storage/index.js.map +1 -0
  185. package/dist/storage/types.cjs +4 -0
  186. package/dist/storage/types.cjs.map +1 -0
  187. package/dist/storage/types.d.cts +10976 -0
  188. package/dist/storage/types.d.ts +10976 -0
  189. package/dist/storage/types.js +3 -0
  190. package/dist/storage/types.js.map +1 -0
  191. package/dist/storageClient-DPLh_p0V.d.cts +608 -0
  192. package/dist/storageClient-YVWer22Y.d.ts +608 -0
  193. package/dist/syncActions/index.cjs +366 -0
  194. package/dist/syncActions/index.cjs.map +1 -0
  195. package/dist/syncActions/index.d.cts +94 -0
  196. package/dist/syncActions/index.d.ts +94 -0
  197. package/dist/syncActions/index.js +341 -0
  198. package/dist/syncActions/index.js.map +1 -0
  199. package/dist/syncActions/types.cjs +4 -0
  200. package/dist/syncActions/types.cjs.map +1 -0
  201. package/dist/syncActions/types.d.cts +261 -0
  202. package/dist/syncActions/types.d.ts +261 -0
  203. package/dist/syncActions/types.js +3 -0
  204. package/dist/syncActions/types.js.map +1 -0
  205. package/dist/telemetry/index.cjs +189 -0
  206. package/dist/telemetry/index.cjs.map +1 -0
  207. package/dist/telemetry/index.d.cts +13 -0
  208. package/dist/telemetry/index.d.ts +13 -0
  209. package/dist/telemetry/index.js +183 -0
  210. package/dist/telemetry/index.js.map +1 -0
  211. package/dist/telemetry/types.cjs +4 -0
  212. package/dist/telemetry/types.cjs.map +1 -0
  213. package/dist/telemetry/types.d.cts +12 -0
  214. package/dist/telemetry/types.d.ts +12 -0
  215. package/dist/telemetry/types.js +3 -0
  216. package/dist/telemetry/types.js.map +1 -0
  217. package/dist/types-B51cQMrX.d.ts +1408 -0
  218. package/dist/types-B7k8S4ki.d.ts +1520 -0
  219. package/dist/types-BNQK_jR_.d.cts +1520 -0
  220. package/dist/types-BY0tjg2Q.d.ts +1079 -0
  221. package/dist/types-BeShtGlc.d.cts +8591 -0
  222. package/dist/types-BeShtGlc.d.ts +8591 -0
  223. package/dist/types-BjrNNn5I.d.ts +1643 -0
  224. package/dist/types-C-bd4ArM.d.cts +1079 -0
  225. package/dist/types-C7mpAfq-.d.cts +64 -0
  226. package/dist/types-C7mpAfq-.d.ts +64 -0
  227. package/dist/types-CGMJT3JL.d.ts +943 -0
  228. package/dist/types-CRSKcua9.d.cts +1314 -0
  229. package/dist/types-DJ6nbNq5.d.cts +1643 -0
  230. package/dist/types-DJkU9gvB.d.cts +943 -0
  231. package/dist/types-DYMMsuU0.d.cts +78 -0
  232. package/dist/types-DYMMsuU0.d.ts +78 -0
  233. package/dist/types-Dg1tEsVR.d.cts +17 -0
  234. package/dist/types-Dg1tEsVR.d.ts +17 -0
  235. package/dist/types-DgaMV8FF.d.cts +60 -0
  236. package/dist/types-DgaMV8FF.d.ts +60 -0
  237. package/dist/types-Dws8mFNY.d.cts +1408 -0
  238. package/dist/types-cH0_hkCW.d.ts +1314 -0
  239. package/dist/utils-BNQZiNOu.d.ts +1657 -0
  240. package/dist/utils-DE09pDTi.d.cts +1657 -0
  241. package/dist/vault/index.cjs +225 -0
  242. package/dist/vault/index.cjs.map +1 -0
  243. package/dist/vault/index.d.cts +26 -0
  244. package/dist/vault/index.d.ts +26 -0
  245. package/dist/vault/index.js +219 -0
  246. package/dist/vault/index.js.map +1 -0
  247. package/dist/vault/types.cjs +4 -0
  248. package/dist/vault/types.cjs.map +1 -0
  249. package/dist/vault/types.d.cts +390 -0
  250. package/dist/vault/types.d.ts +390 -0
  251. package/dist/vault/types.js +3 -0
  252. package/dist/vault/types.js.map +1 -0
  253. package/dist/verify/index.cjs +190 -0
  254. package/dist/verify/index.cjs.map +1 -0
  255. package/dist/verify/index.d.cts +9 -0
  256. package/dist/verify/index.d.ts +9 -0
  257. package/dist/verify/index.js +184 -0
  258. package/dist/verify/index.js.map +1 -0
  259. package/dist/verify/types.cjs +4 -0
  260. package/dist/verify/types.cjs.map +1 -0
  261. package/dist/verify/types.d.cts +29 -0
  262. package/dist/verify/types.d.ts +29 -0
  263. package/dist/verify/types.js +3 -0
  264. package/dist/verify/types.js.map +1 -0
  265. package/package.json +570 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,3910 @@
1
+ 'use strict';
2
+
3
+ var qs = require('qs');
4
+ var z5 = require('zod');
5
+ var dayjs = require('dayjs');
6
+ var utc = require('dayjs/plugin/utc');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var qs__default = /*#__PURE__*/_interopDefault(qs);
29
+ var z5__namespace = /*#__PURE__*/_interopNamespace(z5);
30
+ var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
31
+ var utc__default = /*#__PURE__*/_interopDefault(utc);
32
+
33
+ // src/errors/UserError.ts
34
+ var UserError = class extends Error {
35
+ constructor(message2) {
36
+ super(message2);
37
+ }
38
+ };
39
+
40
+ // src/errors/ApiError.ts
41
+ var ApiError = class extends Error {
42
+ response;
43
+ request;
44
+ data;
45
+ constructor({ response, request, data }) {
46
+ super(response.statusText);
47
+ this.response = response;
48
+ this.request = request;
49
+ this.data = data;
50
+ }
51
+ };
52
+
53
+ // src/errors/ManagementClientAuthError.ts
54
+ var ManagementClientAuthError = class extends ApiError {
55
+ title;
56
+ message;
57
+ constructor(title, message2, res) {
58
+ super(res);
59
+ this.title = title;
60
+ this.message = message2;
61
+ }
62
+ };
63
+
64
+ // src/errors/ServiceUnavailableError.ts
65
+ var ServiceUnavailableError = class _ServiceUnavailableError extends Error {
66
+ constructor(serviceId, path, clientName) {
67
+ super(
68
+ `Service "${serviceId}" is not available in this stack. Caused by: ${clientName}.${path.join(".")}()`
69
+ );
70
+ this.name = "ServiceUnavailableError";
71
+ Object.setPrototypeOf(this, _ServiceUnavailableError.prototype);
72
+ }
73
+ };
74
+ var HttpHeader = {
75
+ CONTENT_TYPE: "content-type",
76
+ CONTENT_DISPOSITION: "content-disposition"
77
+ };
78
+ var HttpContentType = {
79
+ JSON: "application/json",
80
+ TEXT_PLAIN: "text/plain",
81
+ FORM_DATA: "multipart/form-data",
82
+ TEXT_HTML: "text/html"
83
+ };
84
+ var defaultValidateStatus = ({ response }) => response.status >= 200 && response.status <= 299;
85
+ function removeUndefined(obj) {
86
+ const objCopy = { ...obj };
87
+ for (const [key, value] of Object.entries(objCopy)) {
88
+ if (value == null) delete objCopy[key];
89
+ }
90
+ return objCopy;
91
+ }
92
+ var parseData = async (response) => {
93
+ if (response.status === 204) return null;
94
+ const contentType = response.headers.get(HttpHeader.CONTENT_TYPE);
95
+ if (contentType && contentType == HttpContentType.JSON) {
96
+ return response.json();
97
+ }
98
+ const text = await response.text();
99
+ try {
100
+ return JSON.parse(text);
101
+ } catch {
102
+ return text;
103
+ }
104
+ };
105
+ var cleanHeadersInit = (headersInit) => {
106
+ if (Array.isArray(headersInit)) return headersInit;
107
+ if (headersInit instanceof Headers) return headersInit;
108
+ if (headersInit == null) return headersInit;
109
+ return removeUndefined(headersInit);
110
+ };
111
+ var createHeaders = (headersInitA, headersInitB) => {
112
+ const headersA = new Headers(cleanHeadersInit(headersInitA));
113
+ const headersB = new Headers(cleanHeadersInit(headersInitB));
114
+ headersB.forEach((value, key) => {
115
+ headersA.set(key, value);
116
+ });
117
+ return headersA;
118
+ };
119
+ var createPath = (path, pathParam = {}) => path.replace(/\{([^}]+)}/g, (_, key) => {
120
+ if (!(key in pathParam))
121
+ throw new Error(`Path parameter "${key}" is missing in the path "${path}"`);
122
+ return encodeURIComponent(pathParam[key]);
123
+ });
124
+ var createSearch = (query, options = {}) => {
125
+ return qs__default.default.stringify(query, {
126
+ encodeValuesOnly: true,
127
+ skipNulls: true,
128
+ ...options
129
+ });
130
+ };
131
+ var createBody = (body, headers) => {
132
+ if (body == null) return null;
133
+ if (body instanceof FormData) return body;
134
+ if (typeof body === "string") return body;
135
+ const stringifyBody = JSON.stringify(body);
136
+ const stringBody = stringifyBody === "{}" ? null : stringifyBody;
137
+ if (stringBody) headers.set(HttpHeader.CONTENT_TYPE, HttpContentType.JSON);
138
+ return stringBody;
139
+ };
140
+ var parseContentDispositionHeader = (contentDisposition) => {
141
+ const type = (() => {
142
+ const typeMatch = contentDisposition?.match(/^\s*(inline|attachment)\s*;/i);
143
+ return typeMatch?.[1]?.toLowerCase() ?? "unknown";
144
+ })();
145
+ const filename = (() => {
146
+ const filenameMatch = contentDisposition?.match(/filename="([^"]+)"/i);
147
+ if (filenameMatch) return filenameMatch[1];
148
+ const encodedFilenameMatch = contentDisposition?.match(/filename\*=(?:UTF-8'')?([^;]+)/i);
149
+ if (encodedFilenameMatch?.[1]) return decodeURIComponent(encodedFilenameMatch[1]);
150
+ const unquotedFilenameMatch = contentDisposition?.match(/filename=([^;]+)/i);
151
+ return unquotedFilenameMatch?.[1] ?? null;
152
+ })();
153
+ return { type, filename };
154
+ };
155
+ var createFetchRequest = ({
156
+ url,
157
+ method,
158
+ params,
159
+ options = {},
160
+ defaultOptions
161
+ }) => {
162
+ const {
163
+ baseUrl,
164
+ validateStatus: defValidateStatus = defaultValidateStatus,
165
+ headers: defaultHeaders,
166
+ ...restDefaultOptions
167
+ } = defaultOptions;
168
+ const { validateStatus, queryArrayFormat, headers: endpointHeaders, ...restOptions } = options;
169
+ const headers = createHeaders(defaultHeaders, endpointHeaders);
170
+ const path = createPath(url, params.path);
171
+ const search = createSearch(params.query ?? {}, { arrayFormat: queryArrayFormat });
172
+ const body = createBody(params.body, headers);
173
+ const urlInstance = new URL(baseUrl + path);
174
+ urlInstance.search = search;
175
+ const request = new Request(urlInstance, {
176
+ ...restDefaultOptions,
177
+ ...restOptions,
178
+ headers,
179
+ method: method.toUpperCase(),
180
+ body
181
+ });
182
+ return { request, validateStatus: validateStatus ?? defValidateStatus };
183
+ };
184
+
185
+ // src/fetchClient/createFetchClient/createFetchClient.ts
186
+ var isApiError = (error) => error instanceof ApiError;
187
+ var isAbortError = (error) => error instanceof DOMException && error.name === "AbortError";
188
+ var isFetchClientError = (error) => error instanceof TypeError || error instanceof SyntaxError || isApiError(error);
189
+ var createCoreFetch = (fetchFn) => async ({ request, validateStatus }) => {
190
+ const response = await fetchFn(request);
191
+ const data = await parseData(response);
192
+ const apiResponse = {
193
+ request,
194
+ response,
195
+ data
196
+ };
197
+ const boolOrError = validateStatus(apiResponse);
198
+ if (isApiError(boolOrError)) throw boolOrError;
199
+ if (!boolOrError) throw new ApiError(apiResponse);
200
+ return apiResponse;
201
+ };
202
+ var createFetchClient = ({
203
+ middlewares = [],
204
+ ...defaultOptions
205
+ }) => {
206
+ const coreFetch = createCoreFetch(defaultOptions.fetchFn ?? fetch);
207
+ const fetchWithMiddlewares = middlewares.reduceRight(
208
+ (next, middleware) => middleware(next),
209
+ coreFetch
210
+ );
211
+ const createFetchMethod = (method) => async (url, params, options = {}) => {
212
+ const request = createFetchRequest({
213
+ url,
214
+ method,
215
+ params,
216
+ defaultOptions,
217
+ options
218
+ });
219
+ const methodMiddlewares = options?.middlewares ?? [];
220
+ return methodMiddlewares.reduceRight(
221
+ (next, middleware) => middleware(next),
222
+ fetchWithMiddlewares
223
+ )(request);
224
+ };
225
+ return {
226
+ get: createFetchMethod("get"),
227
+ post: createFetchMethod("post"),
228
+ put: createFetchMethod("put"),
229
+ patch: createFetchMethod("patch"),
230
+ delete: createFetchMethod("delete")
231
+ };
232
+ };
233
+
234
+ // src/fetchClient/createFetchClient/middlewares.ts
235
+ var createCallbackMiddleware = ({ onError, onSettled, onSuccess } = {}) => (next) => async (request) => {
236
+ let response;
237
+ try {
238
+ response = await next(request);
239
+ onSuccess?.();
240
+ } catch (error) {
241
+ onError?.(error);
242
+ throw error;
243
+ } finally {
244
+ onSettled?.();
245
+ }
246
+ return response;
247
+ };
248
+
249
+ // src/fetchClient/createGenericFetchClient.ts
250
+ var createGenericFetchClient = (defaultOptions) => createFetchClient(defaultOptions);
251
+
252
+ // src/fetchClient/createOpenapiFetchClient.ts
253
+ var createOpenapiFetchClient = (defaultOptions) => createFetchClient(defaultOptions);
254
+
255
+ // src/clients/ai/aiClient.ts
256
+ var createAiClient = ({ baseUrl, middlewares }) => {
257
+ const client = createOpenapiFetchClient({
258
+ baseUrl,
259
+ middlewares
260
+ });
261
+ const describeConfigurationVersion = async (body) => {
262
+ const { data } = await client.post("/describe/configuration-version", { body });
263
+ return data;
264
+ };
265
+ const describeConfigurationMerge = async (body) => {
266
+ const { data } = await client.post("/describe/configuration-merge", { body });
267
+ return data;
268
+ };
269
+ const explainError = async (body) => {
270
+ const { data } = await client.post("/explain", { body });
271
+ return data;
272
+ };
273
+ const describeConfiguration = async (body) => {
274
+ const { data } = await client.post("/describe/configuration", { body });
275
+ return data;
276
+ };
277
+ const suggestComponent = async (body) => {
278
+ const { data } = await client.post("/suggest/component", { body });
279
+ return data;
280
+ };
281
+ const feedback = async (body) => {
282
+ const { data } = await client.post("/feedback", { body });
283
+ return data;
284
+ };
285
+ return {
286
+ describeConfigurationVersion,
287
+ describeConfigurationMerge,
288
+ explainError,
289
+ describeConfiguration,
290
+ suggestComponent,
291
+ feedback
292
+ };
293
+ };
294
+
295
+ // src/clients/assets/assetsClient.ts
296
+ var createAssetsClient = ({ baseUrl, middlewares }) => {
297
+ const client = createGenericFetchClient({
298
+ baseUrl,
299
+ middlewares
300
+ });
301
+ const getPublishedChangelogPosts = async (signal) => {
302
+ const { data } = await client.get(
303
+ "/platform-changelog/published-posts.json",
304
+ {},
305
+ { signal }
306
+ );
307
+ return data;
308
+ };
309
+ return {
310
+ getPublishedChangelogPosts
311
+ };
312
+ };
313
+
314
+ // src/constants.ts
315
+ var KeboolaHttpHeader = {
316
+ STORAGE_API_TOKEN: "X-StorageApi-Token",
317
+ MANAGEMENT_API_TOKEN: "X-Kbc-Manageapitoken",
318
+ STORAGE_API_URL: "x-storageapi-url"
319
+ };
320
+ var ENCRYPTED_VALUE_PREFIX = "KBC::";
321
+ var SUGGESTION_CATEGORIES = ["error", "maintenance", "documentation"];
322
+ var suggestionCategorySchema = z5.z.enum(SUGGESTION_CATEGORIES);
323
+ var suggestionSchema = z5.z.object({
324
+ label: z5.z.preprocess((v) => typeof v === "string" ? v.slice(0, 80) : v, z5.z.string().max(80)),
325
+ prompt: z5.z.string(),
326
+ priority: z5.z.number().int().min(1).max(3),
327
+ category: suggestionCategorySchema,
328
+ reasoning: z5.z.string()
329
+ });
330
+ z5.z.object({
331
+ suggestions: z5.z.array(suggestionSchema).max(4)
332
+ });
333
+ var suggestionWithIdSchema = suggestionSchema.extend({
334
+ id: z5.z.string()
335
+ });
336
+ var suggestionsApiResponseSchema = z5.z.object({
337
+ suggestions: z5.z.array(suggestionWithIdSchema).max(4),
338
+ suggestionSessionId: z5.z.string()
339
+ });
340
+ var recentFailedJobSchema = z5.z.object({
341
+ id: z5.z.string(),
342
+ status: z5.z.enum(["error", "warning"]),
343
+ component: z5.z.string(),
344
+ configId: z5.z.string(),
345
+ configName: z5.z.string().optional(),
346
+ createdTime: z5.z.string(),
347
+ durationSeconds: z5.z.number().int().nonnegative().optional(),
348
+ errorMessage: z5.z.string().max(200).optional()
349
+ });
350
+ var deprecatedComponentSchema = z5.z.object({
351
+ id: z5.z.string(),
352
+ name: z5.z.string(),
353
+ type: z5.z.string(),
354
+ expiredOn: z5.z.string(),
355
+ configCount: z5.z.number().int().nonnegative()
356
+ });
357
+ var userRecentEditSchema = z5.z.object({
358
+ component: z5.z.string(),
359
+ configId: z5.z.string(),
360
+ configName: z5.z.string(),
361
+ lastEdited: z5.z.string()
362
+ });
363
+ var dashboardContextDataSchema = z5.z.object({
364
+ recentFailedJobs: z5.z.array(recentFailedJobSchema).max(5),
365
+ deprecatedComponents: z5.z.array(deprecatedComponentSchema).max(5),
366
+ userRecentEdits: z5.z.array(userRecentEditSchema).max(5),
367
+ currentUserEmail: z5.z.string().email()
368
+ });
369
+ var JOB_STATUSES = [
370
+ "created",
371
+ "waiting",
372
+ "processing",
373
+ "success",
374
+ "error",
375
+ "terminating",
376
+ "terminated",
377
+ "cancelled",
378
+ "warning"
379
+ ];
380
+ var jobDetailContextDataSchema = z5.z.object({
381
+ job: z5.z.object({
382
+ id: z5.z.string(),
383
+ status: z5.z.enum(JOB_STATUSES),
384
+ component: z5.z.string(),
385
+ configId: z5.z.string().optional(),
386
+ configName: z5.z.string().optional(),
387
+ createdTime: z5.z.string(),
388
+ startTime: z5.z.string().optional(),
389
+ endTime: z5.z.string().optional(),
390
+ durationSeconds: z5.z.number().int().nonnegative().optional(),
391
+ errorMessage: z5.z.string().max(500).optional(),
392
+ errorType: z5.z.enum(["user", "application"]).optional(),
393
+ backendSize: z5.z.string().optional()
394
+ }),
395
+ component: z5.z.object({
396
+ id: z5.z.string(),
397
+ name: z5.z.string(),
398
+ type: z5.z.string()
399
+ }).optional(),
400
+ runtimeHistory: z5.z.object({
401
+ averageDurationSeconds: z5.z.number().nonnegative().optional(),
402
+ minDurationSeconds: z5.z.number().nonnegative().optional(),
403
+ maxDurationSeconds: z5.z.number().nonnegative().optional(),
404
+ recentJobsCount: z5.z.number().int().nonnegative(),
405
+ isSlowerThanAverage: z5.z.boolean().optional(),
406
+ isFasterThanAverage: z5.z.boolean().optional(),
407
+ percentageDifference: z5.z.number().optional()
408
+ }).optional(),
409
+ currentUserEmail: z5.z.string().email()
410
+ });
411
+ var configurationDetailContextDataSchema = z5.z.object({
412
+ configuration: z5.z.object({
413
+ id: z5.z.string(),
414
+ name: z5.z.string(),
415
+ description: z5.z.string().max(500).optional(),
416
+ component: z5.z.string(),
417
+ hasRows: z5.z.boolean(),
418
+ rowCount: z5.z.number().int().nonnegative().optional(),
419
+ lastChangeDescription: z5.z.string().max(200).optional()
420
+ }),
421
+ component: z5.z.object({
422
+ id: z5.z.string(),
423
+ name: z5.z.string(),
424
+ type: z5.z.string()
425
+ }).optional(),
426
+ latestJobs: z5.z.array(
427
+ z5.z.object({
428
+ id: z5.z.string(),
429
+ status: z5.z.enum(JOB_STATUSES),
430
+ durationSeconds: z5.z.number().int().nonnegative().optional(),
431
+ errorMessage: z5.z.string().max(200).optional(),
432
+ createdTime: z5.z.string()
433
+ })
434
+ ).max(5).optional(),
435
+ currentUserEmail: z5.z.string().email()
436
+ });
437
+ var dashboardSuggestionsRequestSchema = z5.z.object({
438
+ context: z5.z.literal("dashboard"),
439
+ data: dashboardContextDataSchema
440
+ });
441
+ var jobDetailSuggestionsRequestSchema = z5.z.object({
442
+ context: z5.z.literal("job-detail"),
443
+ data: jobDetailContextDataSchema
444
+ });
445
+ var configurationDetailSuggestionsRequestSchema = z5.z.object({
446
+ context: z5.z.literal("configuration-detail"),
447
+ data: configurationDetailContextDataSchema
448
+ });
449
+ z5.z.discriminatedUnion("context", [
450
+ dashboardSuggestionsRequestSchema,
451
+ jobDetailSuggestionsRequestSchema,
452
+ configurationDetailSuggestionsRequestSchema
453
+ ]);
454
+
455
+ // src/clients/chat/chatClient.ts
456
+ var agentSettingsSchema = z5.z.object({
457
+ projectId: z5.z.string(),
458
+ customInstructions: z5.z.string().nullable(),
459
+ createdAt: z5.z.string(),
460
+ updatedAt: z5.z.string()
461
+ });
462
+ var toolPermissionValueSchema = z5.z.enum(["always_allow", "always_ask", "blocked"]);
463
+ var userAgentSettingsSchema = z5.z.object({
464
+ projectId: z5.z.string(),
465
+ userId: z5.z.string(),
466
+ customInstructions: z5.z.string().nullable(),
467
+ toolPermissions: z5.z.record(z5.z.string(), toolPermissionValueSchema).nullable(),
468
+ createdAt: z5.z.string(),
469
+ updatedAt: z5.z.string()
470
+ });
471
+ var toolInfoSchema = z5.z.object({
472
+ name: z5.z.string(),
473
+ description: z5.z.string(),
474
+ readOnly: z5.z.boolean()
475
+ });
476
+ var toolsListResponseSchema = z5.z.object({
477
+ tools: z5.z.array(toolInfoSchema)
478
+ });
479
+ var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
480
+ const client = createOpenapiFetchClient({
481
+ baseUrl,
482
+ headers: new Headers({
483
+ [KeboolaHttpHeader.STORAGE_API_URL]: storageApiUrl
484
+ }),
485
+ middlewares
486
+ });
487
+ const getHistory = async (params) => {
488
+ const { data } = await client.get("/history", { query: params });
489
+ return data;
490
+ };
491
+ const getChat = async (chatId, signal) => {
492
+ const { data } = await client.get("/chat/{id}", { path: { id: chatId } }, { signal });
493
+ return data;
494
+ };
495
+ const deleteChat = async (chatId) => {
496
+ const { data } = await client.delete("/chat", { query: { id: chatId } });
497
+ return data;
498
+ };
499
+ const getVotes = async (chatId) => {
500
+ const { data } = await client.get("/vote", { query: { chatId } });
501
+ return data;
502
+ };
503
+ const submitVote = async (params) => {
504
+ await client.patch("/vote", { body: params });
505
+ };
506
+ const createChat = async (request) => {
507
+ const { response } = await client.post("/chat", { body: request });
508
+ return response;
509
+ };
510
+ const getUsage = async (signal) => {
511
+ const { data } = await client.get("/usage", {}, { signal });
512
+ return data;
513
+ };
514
+ const getSuggestions = async (request, signal) => {
515
+ const { data } = await client.post("/suggestions", { body: request }, { signal });
516
+ const result = suggestionsApiResponseSchema.safeParse(data);
517
+ if (!result.success) {
518
+ throw new Error("Invalid suggestions response format");
519
+ }
520
+ return result.data;
521
+ };
522
+ const getAgentSettings = async (signal) => {
523
+ const { data } = await client.get("/settings", {}, { signal });
524
+ const result = agentSettingsSchema.safeParse(data);
525
+ if (!result.success) {
526
+ throw new Error("Invalid agent settings response format");
527
+ }
528
+ return result.data;
529
+ };
530
+ const updateAgentSettings = async (request, signal) => {
531
+ const { data } = await client.patch("/settings", { body: request }, { signal });
532
+ const result = agentSettingsSchema.safeParse(data);
533
+ if (!result.success) {
534
+ throw new Error("Invalid agent settings response format");
535
+ }
536
+ return result.data;
537
+ };
538
+ const getUserAgentSettings = async (signal) => {
539
+ const { data } = await client.get("/settings/user", {}, { signal });
540
+ const result = userAgentSettingsSchema.safeParse(data);
541
+ if (!result.success) {
542
+ throw new Error("Invalid user agent settings response format");
543
+ }
544
+ return result.data;
545
+ };
546
+ const updateUserAgentSettings = async (request, signal) => {
547
+ const { data } = await client.patch("/settings/user", { body: request }, { signal });
548
+ const result = userAgentSettingsSchema.safeParse(data);
549
+ if (!result.success) {
550
+ throw new Error("Invalid user agent settings response format");
551
+ }
552
+ return result.data;
553
+ };
554
+ const getToolsList = async (signal) => {
555
+ const { data } = await client.get("/settings/tools", {}, { signal });
556
+ const result = toolsListResponseSchema.safeParse(data);
557
+ if (!result.success) {
558
+ throw new Error("Invalid tools list response format");
559
+ }
560
+ return result.data;
561
+ };
562
+ return {
563
+ getHistory,
564
+ getChat,
565
+ deleteChat,
566
+ createChat,
567
+ getVotes,
568
+ submitVote,
569
+ getUsage,
570
+ getSuggestions,
571
+ getAgentSettings,
572
+ updateAgentSettings,
573
+ getUserAgentSettings,
574
+ updateUserAgentSettings,
575
+ getToolsList
576
+ };
577
+ };
578
+ var TailError = z5__namespace.object({
579
+ context: z5__namespace.object({
580
+ code: z5__namespace.string()
581
+ })
582
+ });
583
+ dayjs__default.default.extend(utc__default.default);
584
+ var ISO_TIMESTAMP_REGEX = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z/;
585
+ var LEADING_ISO_TIMESTAMP_REGEX = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z)\s?/;
586
+ var tryParseJsonl = (line) => {
587
+ if (!line.startsWith("{")) return null;
588
+ let parsed;
589
+ try {
590
+ parsed = JSON.parse(line);
591
+ } catch {
592
+ return null;
593
+ }
594
+ if (typeof parsed !== "object" || parsed === null) return null;
595
+ const record = parsed;
596
+ const { timestamp, message: message2 } = record;
597
+ if (typeof timestamp !== "string" || typeof message2 !== "string") return null;
598
+ return {
599
+ timestamp,
600
+ message: message2
601
+ };
602
+ };
603
+ var parsePlainTextLine = (line) => {
604
+ const match = line.match(LEADING_ISO_TIMESTAMP_REGEX);
605
+ if (match) {
606
+ return { timestamp: match[1], message: line.slice(match[0].length) };
607
+ }
608
+ return { timestamp: null, message: line };
609
+ };
610
+ var parseLogLine = (line) => tryParseJsonl(line) ?? parsePlainTextLine(line);
611
+ var toLogEntryFromObject = (raw) => {
612
+ if (typeof raw.message !== "string") return null;
613
+ return {
614
+ timestamp: typeof raw.timestamp === "string" ? raw.timestamp : null,
615
+ message: raw.message
616
+ };
617
+ };
618
+ var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
619
+ var parseLogLines = (raw) => {
620
+ if (raw === null || raw === void 0 || raw === "") return [];
621
+ if (Array.isArray(raw)) {
622
+ return raw.flatMap((item) => {
623
+ if (typeof item === "string") return item === "" ? [] : [parseLogLine(item)];
624
+ if (isPlainObject(item)) {
625
+ const entry = toLogEntryFromObject(item);
626
+ return entry ? [entry] : [];
627
+ }
628
+ return [];
629
+ });
630
+ }
631
+ if (isPlainObject(raw)) {
632
+ const entry = toLogEntryFromObject(raw);
633
+ return entry ? [entry] : [];
634
+ }
635
+ if (typeof raw !== "string") return [];
636
+ const lines = raw.split("\n");
637
+ const entries = [];
638
+ for (const line of lines) {
639
+ if (line === "") continue;
640
+ entries.push(parseLogLine(line));
641
+ }
642
+ return entries;
643
+ };
644
+ var parseLastLogTimestamp = (logs) => {
645
+ const entries = parseLogLines(logs);
646
+ for (let i = entries.length - 1; i >= 0; i--) {
647
+ const entry = entries[i];
648
+ if (!entry) continue;
649
+ if (entry.timestamp) return entry.timestamp;
650
+ const match = entry.message.match(ISO_TIMESTAMP_REGEX);
651
+ if (match) return match[0];
652
+ }
653
+ return null;
654
+ };
655
+ var calculateNextLogTimestamp = (timestamp) => {
656
+ if (timestamp === null) return null;
657
+ return dayjs__default.default(timestamp).utc().add(1, "second").utc().format();
658
+ };
659
+ var prepareAppRun = (appRun) => {
660
+ return {
661
+ ...appRun,
662
+ state: appRun.state ?? (appRun.stoppedAt ? "finished" : "running")
663
+ // fallback state for historic non migrated runs
664
+ };
665
+ };
666
+
667
+ // src/clients/dataScience/dataScienceClient.ts
668
+ var createDataScienceClient = ({ baseUrl, middlewares }) => {
669
+ const client = createOpenapiFetchClient({
670
+ baseUrl,
671
+ middlewares
672
+ });
673
+ const getAppRuns = async (appId, query, signal) => {
674
+ const { data } = await client.get("/apps/{appId}/runs", { path: { appId }, query }, { signal });
675
+ return data.map(prepareAppRun);
676
+ };
677
+ const getAppRun = async (appId, runId, signal) => {
678
+ const { data } = await client.get(
679
+ "/apps/{appId}/runs/{runId}",
680
+ { path: { appId, runId } },
681
+ { signal }
682
+ );
683
+ return prepareAppRun(data);
684
+ };
685
+ const getAppLogsDownload = async (id, signal) => {
686
+ const { data, response } = await client.get(
687
+ "/apps/{appId}/logs/download",
688
+ { path: { appId: id } },
689
+ { signal }
690
+ );
691
+ const contentDisposition = parseContentDispositionHeader(
692
+ response.headers.get(HttpHeader.CONTENT_DISPOSITION)
693
+ );
694
+ return {
695
+ logs: data,
696
+ fileName: contentDisposition?.filename ?? "logs.txt"
697
+ };
698
+ };
699
+ const getAppLogsTail = async (id, { query, signal } = {}) => {
700
+ try {
701
+ const { data } = await client.get(
702
+ "/apps/{appId}/logs/tail",
703
+ {
704
+ query,
705
+ path: {
706
+ appId: id
707
+ }
708
+ },
709
+ {
710
+ signal
711
+ }
712
+ );
713
+ const logs = data === "" ? null : data;
714
+ const lastLogTimestamp = parseLastLogTimestamp(logs);
715
+ const nextLogTimestamp = calculateNextLogTimestamp(lastLogTimestamp);
716
+ return {
717
+ entries: parseLogLines(logs),
718
+ nextLogTimestamp
719
+ };
720
+ } catch (error) {
721
+ if (isApiError(error) && error.response.status === 400 && TailError.safeParse(error.data).data?.context?.code === "apps.appNotRunning") {
722
+ return { entries: [], nextLogTimestamp: null };
723
+ }
724
+ throw error;
725
+ }
726
+ };
727
+ const getApps = async (query, signal) => {
728
+ const { data } = await client.get("/apps", { query }, { signal });
729
+ return data;
730
+ };
731
+ const getApp = async (appId, signal) => {
732
+ const { data } = await client.get("/apps/{appId}", { path: { appId } }, { signal });
733
+ return data;
734
+ };
735
+ const createApp = async (body, signal) => {
736
+ const { data } = await client.post("/apps", { body }, { signal });
737
+ return data;
738
+ };
739
+ const patchApp = async (appId, body, signal) => {
740
+ const { data } = await client.patch(
741
+ "/apps/{appId}",
742
+ {
743
+ path: { appId },
744
+ body
745
+ },
746
+ { signal }
747
+ );
748
+ return data;
749
+ };
750
+ const deleteApp = async (appId, signal) => {
751
+ return client.delete("/apps/{appId}", { path: { appId } }, { signal });
752
+ };
753
+ const getAppPassword = async (appId, signal) => {
754
+ const { data } = await client.get("/apps/{appId}/password", { path: { appId } }, { signal });
755
+ return data;
756
+ };
757
+ const resetAppPassword = async (appId, signal) => {
758
+ const { data } = await client.post(
759
+ "/apps/{appId}/reset-password",
760
+ { path: { appId } },
761
+ { signal }
762
+ );
763
+ return data;
764
+ };
765
+ const getRuntimes = async (signal) => {
766
+ const { data } = await client.get("/runtimes", {}, { signal });
767
+ return data;
768
+ };
769
+ const getSandbox = async (appId, signal) => {
770
+ const { data } = await client.get("/sandboxes/{appId}", { path: { appId } }, { signal });
771
+ return data;
772
+ };
773
+ return {
774
+ getAppRuns,
775
+ getAppRun,
776
+ getAppLogsDownload,
777
+ getAppLogsTail,
778
+ getApps,
779
+ getApp,
780
+ createApp,
781
+ patchApp,
782
+ deleteApp,
783
+ getAppPassword,
784
+ resetAppPassword,
785
+ getRuntimes,
786
+ getSandbox
787
+ };
788
+ };
789
+
790
+ // src/clients/editor/editorClient.ts
791
+ var createEditorClient = ({ baseUrl, middlewares }) => {
792
+ const client = createOpenapiFetchClient({
793
+ baseUrl,
794
+ middlewares
795
+ });
796
+ const createSession = async (body) => {
797
+ const { data } = await client.post("/sql/sessions", {
798
+ body
799
+ });
800
+ return data;
801
+ };
802
+ const getSession = async ({ id }, signal) => {
803
+ const { data } = await client.get(`/sql/sessions/{id}`, { path: { id } }, { signal });
804
+ return data;
805
+ };
806
+ const getSessions = async (query, signal) => {
807
+ const { data } = await client.get(`/sql/sessions`, { query }, { signal });
808
+ return data;
809
+ };
810
+ const getSessionSchema = async ({
811
+ id,
812
+ onlyWorkspaceSchema = "1",
813
+ loadTables = "1"
814
+ }, signal) => {
815
+ const { data } = await client.get(
816
+ `/sql/sessions/{id}/schema`,
817
+ {
818
+ path: { id },
819
+ query: { onlyWorkspaceSchema, loadTables }
820
+ },
821
+ { signal }
822
+ );
823
+ return data;
824
+ };
825
+ const createQueryJob = async ({ id }, body) => {
826
+ const { data } = await client.post(`/sql/sessions/{id}/run-query`, {
827
+ path: { id },
828
+ body
829
+ });
830
+ return data;
831
+ };
832
+ const tablePreview = async ({ id }, body) => {
833
+ const { data } = await client.post(`/sql/sessions/{id}/table-preview`, {
834
+ path: { id },
835
+ body
836
+ });
837
+ return data;
838
+ };
839
+ const tableDefinition = async ({ id, ...query }, signal) => {
840
+ const { data } = await client.get(
841
+ `/sql/sessions/{id}/table-ddl`,
842
+ { path: { id }, query },
843
+ { signal }
844
+ );
845
+ return data;
846
+ };
847
+ const load = async ({ id }, body) => {
848
+ const { data } = await client.post(`/sql/sessions/{id}/load`, {
849
+ path: { id },
850
+ body
851
+ });
852
+ return data;
853
+ };
854
+ const unload = async ({ id }, body) => {
855
+ const { data } = await client.post(`/sql/sessions/{id}/unload`, {
856
+ path: { id },
857
+ // BE error: The body is optional; however, without it, the request will fail with the message "Request content type must be application/json."
858
+ // This is expected, as our client cannot correctly determine the content type without the body.
859
+ // This issue should be addressed to indicate that the body is required in their Swagger schema.
860
+ body: body ?? { tableId: null }
861
+ });
862
+ return data;
863
+ };
864
+ const getWorkspacePassword = async (id, signal) => {
865
+ const { data } = await client.get(
866
+ `/sql/sessions/{id}/workspace-password`,
867
+ { path: { id } },
868
+ { signal }
869
+ );
870
+ return data;
871
+ };
872
+ const resetWorkspacePassword = async (id) => {
873
+ const { data } = await client.post(`/sql/sessions/{id}/reset-password`, {
874
+ path: { id }
875
+ });
876
+ return data;
877
+ };
878
+ const getSessionCredentials = async (id, signal) => {
879
+ const { data } = await client.get(
880
+ `/sql/sessions/{id}/credentials`,
881
+ { path: { id } },
882
+ { signal }
883
+ );
884
+ return data;
885
+ };
886
+ return {
887
+ createSession,
888
+ getSession,
889
+ getSessions,
890
+ getSessionSchema,
891
+ createQueryJob,
892
+ tablePreview,
893
+ tableDefinition,
894
+ load,
895
+ unload,
896
+ getWorkspacePassword,
897
+ resetWorkspacePassword,
898
+ getSessionCredentials
899
+ };
900
+ };
901
+
902
+ // src/clients/encryption/encryptionClient.ts
903
+ var createEncryptionClient = ({ baseUrl, middlewares }) => {
904
+ const client = createGenericFetchClient({
905
+ baseUrl,
906
+ middlewares
907
+ });
908
+ const _encrypt = async (data, signal) => {
909
+ const response = await client.post(
910
+ "/encrypt",
911
+ {
912
+ query: {
913
+ projectId: data.projectId,
914
+ branchType: data.branchType,
915
+ componentId: data.componentId
916
+ },
917
+ body: data.data
918
+ },
919
+ { signal }
920
+ );
921
+ return response.data;
922
+ };
923
+ const encrypt = (data, signal) => _encrypt(data, signal);
924
+ const encryptSecrets = (data, signal) => _encrypt(data, signal);
925
+ return {
926
+ encryptSecrets,
927
+ encrypt
928
+ };
929
+ };
930
+
931
+ // src/clients/import/importClient.ts
932
+ var createImportClient = ({ baseUrl, middlewares }) => {
933
+ const client = createGenericFetchClient({
934
+ baseUrl,
935
+ middlewares
936
+ });
937
+ const uploadFile = async (file, params = {}, signal) => {
938
+ const formData = new FormData();
939
+ formData.append("data", file);
940
+ if (params.isPermanent) {
941
+ formData.append("isPermanent", "1");
942
+ }
943
+ if (params.notify) {
944
+ formData.append("notify", "1");
945
+ }
946
+ if (params.branchId) {
947
+ formData.append("branchId", params.branchId);
948
+ }
949
+ if (params.tags) {
950
+ for (const tag of params.tags) {
951
+ formData.append("tags[]", tag);
952
+ }
953
+ }
954
+ const { data } = await client.post(
955
+ "/upload-file",
956
+ { body: formData },
957
+ { signal }
958
+ );
959
+ return data;
960
+ };
961
+ return {
962
+ uploadFile
963
+ };
964
+ };
965
+ var agentSettingsSchema2 = z5.z.object({
966
+ projectId: z5.z.string(),
967
+ customInstructions: z5.z.string().nullable(),
968
+ createdAt: z5.z.string(),
969
+ updatedAt: z5.z.string()
970
+ });
971
+ var toolPermissionValueSchema2 = z5.z.enum(["always_allow", "always_ask", "blocked"]);
972
+ var userAgentSettingsSchema2 = z5.z.object({
973
+ projectId: z5.z.string(),
974
+ userId: z5.z.string(),
975
+ customInstructions: z5.z.string().nullable(),
976
+ toolPermissions: z5.z.record(z5.z.string(), toolPermissionValueSchema2).nullable(),
977
+ createdAt: z5.z.string(),
978
+ updatedAt: z5.z.string()
979
+ });
980
+ var toolInfoSchema2 = z5.z.object({
981
+ name: z5.z.string(),
982
+ description: z5.z.string(),
983
+ readOnly: z5.z.boolean()
984
+ });
985
+ var toolsListResponseSchema2 = z5.z.object({
986
+ tools: z5.z.array(toolInfoSchema2)
987
+ });
988
+ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
989
+ const clientOptions = { baseUrl, middlewares };
990
+ const client = createOpenapiFetchClient(clientOptions);
991
+ const genericClient = createGenericFetchClient(clientOptions);
992
+ const getHistory = async (params) => {
993
+ const { data } = await client.get("/api/history", { query: params });
994
+ return data;
995
+ };
996
+ const getChat = async (chatId, signal) => {
997
+ const { data } = await client.get("/api/chat/{id}", { path: { id: chatId } }, { signal });
998
+ return data;
999
+ };
1000
+ const deleteChat = async (chatId) => {
1001
+ const { data } = await client.delete("/api/chat", { query: { id: chatId } });
1002
+ return data;
1003
+ };
1004
+ const createChat = async (request) => {
1005
+ const { response } = await client.post("/api/chat", { body: request });
1006
+ return response;
1007
+ };
1008
+ const getVotes = async (chatId) => {
1009
+ const { data } = await client.get("/api/vote", { query: { chatId } });
1010
+ return data;
1011
+ };
1012
+ const submitVote = async (params) => {
1013
+ await client.patch("/api/vote", { body: params });
1014
+ };
1015
+ const getUsage = async (signal) => {
1016
+ const { data } = await client.get("/api/usage", {}, { signal });
1017
+ return data;
1018
+ };
1019
+ const approveToolCall = async (chatId, body) => {
1020
+ await client.post("/api/chat/{id}/approval", { path: { id: chatId }, body });
1021
+ };
1022
+ const submitToolOutput = async (chatId, body) => {
1023
+ await client.post("/api/chat/{id}/ui-tool-result", { path: { id: chatId }, body });
1024
+ };
1025
+ const getSuggestions = async (request, signal) => {
1026
+ const { data } = await genericClient.post(
1027
+ "/api/suggestions",
1028
+ { body: request },
1029
+ { signal }
1030
+ );
1031
+ const result = suggestionsApiResponseSchema.safeParse(data);
1032
+ if (!result.success) {
1033
+ throw new Error("Invalid suggestions response format");
1034
+ }
1035
+ return result.data;
1036
+ };
1037
+ const getAgentSettings = async (signal) => {
1038
+ const { data } = await genericClient.get("/api/settings", {}, { signal });
1039
+ const result = agentSettingsSchema2.safeParse(data);
1040
+ if (!result.success) {
1041
+ throw new Error("Invalid agent settings response format");
1042
+ }
1043
+ return result.data;
1044
+ };
1045
+ const updateAgentSettings = async (request, signal) => {
1046
+ const { data } = await genericClient.patch(
1047
+ "/api/settings",
1048
+ { body: request },
1049
+ { signal }
1050
+ );
1051
+ const result = agentSettingsSchema2.safeParse(data);
1052
+ if (!result.success) {
1053
+ throw new Error("Invalid agent settings response format");
1054
+ }
1055
+ return result.data;
1056
+ };
1057
+ const getUserAgentSettings = async (signal) => {
1058
+ const { data } = await genericClient.get(
1059
+ "/api/settings/user",
1060
+ {},
1061
+ { signal }
1062
+ );
1063
+ const result = userAgentSettingsSchema2.safeParse(data);
1064
+ if (!result.success) {
1065
+ throw new Error("Invalid user agent settings response format");
1066
+ }
1067
+ return result.data;
1068
+ };
1069
+ const updateUserAgentSettings = async (request, signal) => {
1070
+ const { data } = await genericClient.patch(
1071
+ "/api/settings/user",
1072
+ { body: request },
1073
+ { signal }
1074
+ );
1075
+ const result = userAgentSettingsSchema2.safeParse(data);
1076
+ if (!result.success) {
1077
+ throw new Error("Invalid user agent settings response format");
1078
+ }
1079
+ return result.data;
1080
+ };
1081
+ const getToolsList = async (signal) => {
1082
+ const { data } = await genericClient.get(
1083
+ "/api/settings/tools",
1084
+ {},
1085
+ { signal }
1086
+ );
1087
+ const result = toolsListResponseSchema2.safeParse(data);
1088
+ if (!result.success) {
1089
+ throw new Error("Invalid tools list response format");
1090
+ }
1091
+ return result.data;
1092
+ };
1093
+ const chatStreamUrl = baseUrl + "/api/chat";
1094
+ return {
1095
+ getHistory,
1096
+ getChat,
1097
+ deleteChat,
1098
+ createChat,
1099
+ getVotes,
1100
+ submitVote,
1101
+ getUsage,
1102
+ approveToolCall,
1103
+ submitToolOutput,
1104
+ getSuggestions,
1105
+ getAgentSettings,
1106
+ updateAgentSettings,
1107
+ getUserAgentSettings,
1108
+ updateUserAgentSettings,
1109
+ getToolsList,
1110
+ chatStreamUrl
1111
+ };
1112
+ };
1113
+
1114
+ // src/clients/verify/createVerifyClient.ts
1115
+ var createVerifyClient = () => {
1116
+ const storageApiToken = async (host, token, signal) => {
1117
+ const { data } = await createGenericFetchClient({
1118
+ baseUrl: `${host}/v2/storage`,
1119
+ headers: new Headers({ [KeboolaHttpHeader.STORAGE_API_TOKEN]: token })
1120
+ }).get("/tokens/verify", {}, { signal });
1121
+ return data;
1122
+ };
1123
+ const managementApiToken = async (host, token, signal) => {
1124
+ const { data } = await createGenericFetchClient({
1125
+ baseUrl: host,
1126
+ headers: new Headers({ [KeboolaHttpHeader.MANAGEMENT_API_TOKEN]: token })
1127
+ }).get("/manage/tokens/verify", {}, { signal });
1128
+ return data;
1129
+ };
1130
+ return {
1131
+ storageApiToken,
1132
+ managementApiToken
1133
+ };
1134
+ };
1135
+
1136
+ // src/clients/management/authMiddleware.ts
1137
+ var isManagementClientAuthError = (error) => error instanceof ManagementClientAuthError;
1138
+ var createAuth = (baseUrl) => {
1139
+ const fetchClient = createGenericFetchClient({ baseUrl });
1140
+ const createCurrentUserSessionToken = async (accessToken) => {
1141
+ const headers = new Headers({ [KeboolaHttpHeader.MANAGEMENT_API_TOKEN]: accessToken });
1142
+ const { data } = await fetchClient.post(
1143
+ "/manage/current-user/session-token",
1144
+ {},
1145
+ { headers }
1146
+ );
1147
+ return data.token;
1148
+ };
1149
+ const createAdminAccountSessionToken = async () => {
1150
+ const { data } = await fetchClient.post(
1151
+ "/admin/account/session-token",
1152
+ {},
1153
+ {
1154
+ // transform valid response, to invalid and throw custom error
1155
+ validateStatus: (apiResponse) => {
1156
+ const { response } = apiResponse;
1157
+ const isTextContent = response.headers.get(HttpHeader.CONTENT_TYPE)?.includes(HttpContentType.TEXT_HTML);
1158
+ if (isTextContent)
1159
+ return new ManagementClientAuthError(
1160
+ "Your session expired",
1161
+ "You will be logged out automatically.",
1162
+ apiResponse
1163
+ );
1164
+ return defaultValidateStatus(apiResponse);
1165
+ }
1166
+ }
1167
+ );
1168
+ return data.token;
1169
+ };
1170
+ return {
1171
+ createCurrentUserSessionToken,
1172
+ createAdminAccountSessionToken
1173
+ };
1174
+ };
1175
+ var createAuthMiddleware = ({
1176
+ accessToken,
1177
+ baseUrl
1178
+ }) => {
1179
+ const auth = createAuth(baseUrl);
1180
+ const verify = createVerifyClient();
1181
+ let token = accessToken;
1182
+ const isDevelopment = process.env.NODE_ENV === "development";
1183
+ return (next) => async (request) => {
1184
+ if (!!token) {
1185
+ const tokenInfo = await verify.managementApiToken(baseUrl, token);
1186
+ const isTokenValid = !tokenInfo.isDisabled && !tokenInfo.isExpired;
1187
+ if (!isTokenValid) {
1188
+ token = isDevelopment ? await auth.createCurrentUserSessionToken(token) : await auth.createAdminAccountSessionToken();
1189
+ }
1190
+ } else {
1191
+ token = await auth.createAdminAccountSessionToken();
1192
+ }
1193
+ request.request.headers.set(KeboolaHttpHeader.MANAGEMENT_API_TOKEN, token);
1194
+ return next(request);
1195
+ };
1196
+ };
1197
+
1198
+ // src/clients/management/currentUser/currentUser.ts
1199
+ var createCurrentUser = (client) => {
1200
+ const getMaintainerInvitations = async (signal) => {
1201
+ const { data } = await client.get(
1202
+ "/manage/current-user/maintainers-invitations",
1203
+ {},
1204
+ { signal }
1205
+ );
1206
+ return data;
1207
+ };
1208
+ const getMaintainerInvitation = async (id, signal) => {
1209
+ const { data } = await client.get(
1210
+ "/manage/current-user/maintainers-invitations/{id}",
1211
+ { path: { id } },
1212
+ { signal }
1213
+ );
1214
+ return data;
1215
+ };
1216
+ const acceptMaintainerInvitation = async (id) => {
1217
+ await client.put("/manage/current-user/maintainers-invitations/{id}", { path: { id } });
1218
+ };
1219
+ const rejectMaintainerInvitation = async (id) => {
1220
+ await client.delete("/manage/current-user/maintainers-invitations/{id}", { path: { id } });
1221
+ };
1222
+ const getOrganizationInvitations = async (signal) => {
1223
+ const { data } = await client.get(
1224
+ "/manage/current-user/organizations-invitations",
1225
+ {},
1226
+ { signal }
1227
+ );
1228
+ return data;
1229
+ };
1230
+ const getOrganizationInvitation = async (id, signal) => {
1231
+ const { data } = await client.get(
1232
+ "/manage/current-user/organizations-invitations/{id}",
1233
+ { path: { id } },
1234
+ { signal }
1235
+ );
1236
+ return data;
1237
+ };
1238
+ const acceptOrganizationInvitation = async (id) => {
1239
+ await client.put("/manage/current-user/organizations-invitations/{id}", { path: { id } });
1240
+ };
1241
+ const rejectOrganizationInvitation = async (id) => {
1242
+ await client.delete("/manage/current-user/organizations-invitations/{id}", { path: { id } });
1243
+ };
1244
+ const getProjectInvitations = async (signal) => {
1245
+ const { data } = await client.get("/manage/current-user/projects-invitations", {}, { signal });
1246
+ return data;
1247
+ };
1248
+ const getProjectInvitation = async (id, signal) => {
1249
+ const { data } = await client.get(
1250
+ "/manage/current-user/projects-invitations/{id}",
1251
+ { path: { id } },
1252
+ { signal }
1253
+ );
1254
+ return data;
1255
+ };
1256
+ const acceptProjectInvitation = async (id) => {
1257
+ await client.put("/manage/current-user/projects-invitations/{id}", { path: { id } });
1258
+ };
1259
+ const rejectProjectInvitation = async (id) => {
1260
+ await client.delete("/manage/current-user/projects-invitations/{id}", { path: { id } });
1261
+ };
1262
+ const getProjectJoinRequests = async (signal) => {
1263
+ const { data } = await client.get(
1264
+ "/manage/current-user/projects-join-requests",
1265
+ {},
1266
+ { signal }
1267
+ );
1268
+ return data;
1269
+ };
1270
+ const deleteProjectJoinRequest = async (id) => {
1271
+ await client.delete("/manage/current-user/projects-join-requests/{id}", { path: { id } });
1272
+ };
1273
+ return {
1274
+ getMaintainerInvitations,
1275
+ getMaintainerInvitation,
1276
+ acceptMaintainerInvitation,
1277
+ rejectMaintainerInvitation,
1278
+ getOrganizationInvitations,
1279
+ getOrganizationInvitation,
1280
+ acceptOrganizationInvitation,
1281
+ rejectOrganizationInvitation,
1282
+ getProjectInvitations,
1283
+ getProjectInvitation,
1284
+ acceptProjectInvitation,
1285
+ rejectProjectInvitation,
1286
+ getProjectJoinRequests,
1287
+ deleteProjectJoinRequest
1288
+ };
1289
+ };
1290
+
1291
+ // src/clients/management/features/features.ts
1292
+ var createFeatures = (client) => {
1293
+ const getAllFeatures = async (query, signal) => {
1294
+ const { data } = await client.get(
1295
+ "/features",
1296
+ { query },
1297
+ { signal }
1298
+ );
1299
+ return data;
1300
+ };
1301
+ return {
1302
+ getAllFeatures
1303
+ };
1304
+ };
1305
+
1306
+ // src/clients/management/maintainers/maintainers.ts
1307
+ var createMaintainers = (client) => {
1308
+ const getMaintainers = async (signal) => {
1309
+ const { data } = await client.get("/manage/maintainers", {}, { signal });
1310
+ return data;
1311
+ };
1312
+ const getMaintainer = async (maintainerId, signal) => {
1313
+ const { data } = await client.get(
1314
+ "/manage/maintainers/{id}",
1315
+ { path: { id: maintainerId } },
1316
+ { signal }
1317
+ );
1318
+ return data;
1319
+ };
1320
+ const createMaintainer = async (body) => {
1321
+ const { data } = await client.post("/manage/maintainers", { body });
1322
+ return data;
1323
+ };
1324
+ const updateMaintainer = async ({
1325
+ maintainerId,
1326
+ ...body
1327
+ }) => {
1328
+ const { data } = await client.patch("/manage/maintainers/{id}", {
1329
+ path: { id: maintainerId },
1330
+ body
1331
+ });
1332
+ return data;
1333
+ };
1334
+ const deleteMaintainer = async (maintainerId) => {
1335
+ await client.delete("/manage/maintainers/{id}", { path: { id: maintainerId } });
1336
+ };
1337
+ const getMaintainerUsers = async (maintainerId, signal) => {
1338
+ const { data } = await client.get(
1339
+ "/manage/maintainers/{id}/users",
1340
+ { path: { id: maintainerId } },
1341
+ { signal }
1342
+ );
1343
+ return data;
1344
+ };
1345
+ const addMaintainerUser = async ({
1346
+ maintainerId,
1347
+ ...body
1348
+ }) => {
1349
+ const { data } = await client.post("/manage/maintainers/{id}/users", {
1350
+ path: { id: maintainerId },
1351
+ body
1352
+ });
1353
+ return data;
1354
+ };
1355
+ const removeMaintainerUser = async ({
1356
+ maintainerId,
1357
+ adminId
1358
+ }) => {
1359
+ await client.delete("/manage/maintainers/{id}/users/{adminId}", {
1360
+ path: { id: maintainerId, adminId }
1361
+ });
1362
+ };
1363
+ const getMaintainerInvitations = async (maintainerId, signal) => {
1364
+ const { data } = await client.get(
1365
+ "/manage/maintainers/{id}/invitations",
1366
+ { path: { id: maintainerId } },
1367
+ { signal }
1368
+ );
1369
+ return data;
1370
+ };
1371
+ const getMaintainerInvitation = async ({ maintainerId, invitationId }, signal) => {
1372
+ const { data } = await client.get(
1373
+ "/manage/maintainers/{id}/invitations/{invitationId}",
1374
+ { path: { id: maintainerId, invitationId } },
1375
+ { signal }
1376
+ );
1377
+ return data;
1378
+ };
1379
+ const createMaintainerInvitation = async ({
1380
+ maintainerId,
1381
+ ...body
1382
+ }) => {
1383
+ const { data } = await client.post("/manage/maintainers/{id}/invitations", {
1384
+ path: { id: maintainerId },
1385
+ body
1386
+ });
1387
+ return data;
1388
+ };
1389
+ const deleteMaintainerInvitation = async ({
1390
+ maintainerId,
1391
+ invitationId
1392
+ }) => {
1393
+ await client.delete("/manage/maintainers/{id}/invitations/{invitationId}", {
1394
+ path: { id: maintainerId, invitationId }
1395
+ });
1396
+ };
1397
+ const getMaintainerOrganizations = async (maintainerId, signal) => {
1398
+ const { data } = await client.get(
1399
+ "/manage/maintainers/{id}/organizations",
1400
+ { path: { id: maintainerId } },
1401
+ { signal }
1402
+ );
1403
+ return data;
1404
+ };
1405
+ const createMaintainerOrganization = async ({
1406
+ maintainerId,
1407
+ ...body
1408
+ }) => {
1409
+ const { data } = await client.post("/manage/maintainers/{id}/organizations", {
1410
+ path: { id: maintainerId },
1411
+ body
1412
+ });
1413
+ return data;
1414
+ };
1415
+ const getMaintainerMetadata = async (maintainerId, signal) => {
1416
+ const { data } = await client.get(
1417
+ "/manage/maintainers/{id}/metadata",
1418
+ { path: { id: maintainerId } },
1419
+ { signal }
1420
+ );
1421
+ return data;
1422
+ };
1423
+ const setMaintainerMetadata = async ({
1424
+ maintainerId,
1425
+ ...body
1426
+ }) => {
1427
+ const { data } = await client.post("/manage/maintainers/{id}/metadata", {
1428
+ path: { id: maintainerId },
1429
+ body
1430
+ });
1431
+ return data;
1432
+ };
1433
+ const deleteMaintainerMetadata = async ({
1434
+ maintainerId,
1435
+ metadataId
1436
+ }) => {
1437
+ await client.delete("/manage/maintainers/{id}/metadata/{metadataId}", {
1438
+ path: { id: maintainerId, metadataId }
1439
+ });
1440
+ };
1441
+ return {
1442
+ getMaintainers,
1443
+ getMaintainer,
1444
+ createMaintainer,
1445
+ updateMaintainer,
1446
+ deleteMaintainer,
1447
+ getMaintainerUsers,
1448
+ addMaintainerUser,
1449
+ removeMaintainerUser,
1450
+ getMaintainerInvitations,
1451
+ getMaintainerInvitation,
1452
+ createMaintainerInvitation,
1453
+ deleteMaintainerInvitation,
1454
+ getMaintainerOrganizations,
1455
+ createMaintainerOrganization,
1456
+ getMaintainerMetadata,
1457
+ setMaintainerMetadata,
1458
+ deleteMaintainerMetadata
1459
+ };
1460
+ };
1461
+
1462
+ // src/clients/management/organizations/organizations.ts
1463
+ var createOrganizations = (client) => {
1464
+ const getOrganizations = async (signal) => {
1465
+ const { data } = await client.get("/manage/organizations", {}, { signal });
1466
+ return data;
1467
+ };
1468
+ const getOrganization = async (organizationId, signal) => {
1469
+ const { data } = await client.get(
1470
+ "/manage/organizations/{id}",
1471
+ { path: { id: organizationId } },
1472
+ { signal }
1473
+ );
1474
+ return data;
1475
+ };
1476
+ const updateOrganization = async ({
1477
+ organizationId,
1478
+ ...body
1479
+ }) => {
1480
+ const { data } = await client.patch("/manage/organizations/{id}", {
1481
+ path: { id: organizationId },
1482
+ body
1483
+ });
1484
+ return data;
1485
+ };
1486
+ const deleteOrganization = async (organizationId) => {
1487
+ await client.delete("/manage/organizations/{id}", { path: { id: organizationId } });
1488
+ };
1489
+ const forceMfa = async (organizationId) => {
1490
+ const { data } = await client.patch("/manage/organizations/{id}/force-mfa", {
1491
+ path: { id: organizationId }
1492
+ });
1493
+ return data;
1494
+ };
1495
+ const joinOrganization = async (organizationId) => {
1496
+ await client.post("/manage/organizations/{id}/join-organization", {
1497
+ path: { id: organizationId }
1498
+ });
1499
+ };
1500
+ const getOrganizationUsers = async (organizationId, signal) => {
1501
+ const { data } = await client.get(
1502
+ "/manage/organizations/{id}/users",
1503
+ { path: { id: organizationId } },
1504
+ { signal }
1505
+ );
1506
+ return data;
1507
+ };
1508
+ const addOrganizationUser = async ({
1509
+ organizationId,
1510
+ ...body
1511
+ }) => {
1512
+ const { data } = await client.post("/manage/organizations/{id}/users", {
1513
+ path: { id: organizationId },
1514
+ body
1515
+ });
1516
+ return data;
1517
+ };
1518
+ const removeOrganizationUser = async ({
1519
+ organizationId,
1520
+ userId
1521
+ }) => {
1522
+ await client.delete("/manage/organizations/{id}/users/{userId}", {
1523
+ path: { id: organizationId, userId }
1524
+ });
1525
+ };
1526
+ const getOrganizationProjectsUsers = async (organizationId, signal) => {
1527
+ const { data } = await client.get(
1528
+ "/manage/organizations/{id}/projects-users",
1529
+ { path: { id: organizationId } },
1530
+ { signal }
1531
+ );
1532
+ return data;
1533
+ };
1534
+ const getOrganizationInvitations = async (organizationId, signal) => {
1535
+ const { data } = await client.get(
1536
+ "/manage/organizations/{id}/invitations",
1537
+ { path: { id: organizationId } },
1538
+ { signal }
1539
+ );
1540
+ return data;
1541
+ };
1542
+ const getOrganizationInvitation = async ({ organizationId, invitationId }, signal) => {
1543
+ const { data } = await client.get(
1544
+ "/manage/organizations/{id}/invitations/{invitationId}",
1545
+ { path: { id: organizationId, invitationId } },
1546
+ { signal }
1547
+ );
1548
+ return data;
1549
+ };
1550
+ const createOrganizationInvitation = async ({
1551
+ organizationId,
1552
+ ...body
1553
+ }) => {
1554
+ const { data } = await client.post("/manage/organizations/{id}/invitations", {
1555
+ path: { id: organizationId },
1556
+ body
1557
+ });
1558
+ return data;
1559
+ };
1560
+ const deleteOrganizationInvitation = async ({
1561
+ organizationId,
1562
+ invitationId
1563
+ }) => {
1564
+ await client.delete("/manage/organizations/{id}/invitations/{invitationId}", {
1565
+ path: { id: organizationId, invitationId }
1566
+ });
1567
+ };
1568
+ const getOrganizationProjects = async (organizationId, signal) => {
1569
+ const { data } = await client.get(
1570
+ "/manage/organizations/{id}/projects",
1571
+ { path: { id: organizationId } },
1572
+ { signal }
1573
+ );
1574
+ return data;
1575
+ };
1576
+ const createOrganizationProject = async ({
1577
+ organizationId,
1578
+ ...body
1579
+ }) => {
1580
+ const { data } = await client.post("/manage/organizations/{id}/projects", {
1581
+ path: { id: organizationId },
1582
+ body
1583
+ });
1584
+ return data;
1585
+ };
1586
+ const getOrganizationMetadata = async (organizationId, signal) => {
1587
+ const { data } = await client.get(
1588
+ "/manage/organizations/{id}/metadata",
1589
+ { path: { id: organizationId } },
1590
+ { signal }
1591
+ );
1592
+ return data;
1593
+ };
1594
+ const setOrganizationMetadata = async ({
1595
+ organizationId,
1596
+ ...body
1597
+ }) => {
1598
+ const { data } = await client.post("/manage/organizations/{id}/metadata", {
1599
+ path: { id: organizationId },
1600
+ body
1601
+ });
1602
+ return data;
1603
+ };
1604
+ const deleteOrganizationMetadata = async ({
1605
+ organizationId,
1606
+ metadataId
1607
+ }) => {
1608
+ await client.delete("/manage/organizations/{id}/metadata/{metadataId}", {
1609
+ path: { id: organizationId, metadataId }
1610
+ });
1611
+ };
1612
+ return {
1613
+ getOrganizations,
1614
+ getOrganization,
1615
+ updateOrganization,
1616
+ deleteOrganization,
1617
+ forceMfa,
1618
+ joinOrganization,
1619
+ getOrganizationUsers,
1620
+ addOrganizationUser,
1621
+ removeOrganizationUser,
1622
+ getOrganizationProjectsUsers,
1623
+ getOrganizationInvitations,
1624
+ getOrganizationInvitation,
1625
+ createOrganizationInvitation,
1626
+ deleteOrganizationInvitation,
1627
+ getOrganizationProjects,
1628
+ createOrganizationProject,
1629
+ getOrganizationMetadata,
1630
+ setOrganizationMetadata,
1631
+ deleteOrganizationMetadata
1632
+ };
1633
+ };
1634
+
1635
+ // src/clients/management/projects/projects.ts
1636
+ var createProjects = (client) => {
1637
+ const getProject = async (projectId, signal) => {
1638
+ const { data } = await client.get(
1639
+ "/projects/{projectId}",
1640
+ { path: { projectId } },
1641
+ { signal }
1642
+ );
1643
+ return data;
1644
+ };
1645
+ const addProjectFeature = async ({
1646
+ projectId,
1647
+ feature
1648
+ }) => {
1649
+ const { data } = await client.post("/projects/{projectId}/features", { path: { projectId }, body: { feature } });
1650
+ return data;
1651
+ };
1652
+ const removeProjectFeature = async (path) => {
1653
+ const { data } = await client.delete(
1654
+ "/projects/{projectId}/features/{feature}",
1655
+ { path }
1656
+ );
1657
+ return data;
1658
+ };
1659
+ const changeProjectUserRole = async ({
1660
+ projectId,
1661
+ userId,
1662
+ role
1663
+ }) => {
1664
+ const { data } = await client.patch("/projects/{projectId}/users/{userId}", {
1665
+ path: { projectId, userId },
1666
+ body: { role }
1667
+ });
1668
+ return data;
1669
+ };
1670
+ const getProjectUsers = async (projectId, signal) => {
1671
+ const { data } = await client.get(
1672
+ "/projects/{projectId}/users",
1673
+ { path: { projectId } },
1674
+ { signal }
1675
+ );
1676
+ return data;
1677
+ };
1678
+ const getProjectMetadata = async (projectId, signal) => {
1679
+ const { data } = await client.get(
1680
+ "/projects/{projectId}/metadata",
1681
+ { path: { projectId } },
1682
+ { signal }
1683
+ );
1684
+ return data;
1685
+ };
1686
+ const setProjectMetadata = async ({
1687
+ projectId,
1688
+ provider,
1689
+ metadata
1690
+ }) => {
1691
+ const { data } = await client.post("/projects/{projectId}/metadata", {
1692
+ path: { projectId },
1693
+ body: { provider, metadata }
1694
+ });
1695
+ return data;
1696
+ };
1697
+ const getProjectReviewers = async (projectId, signal) => {
1698
+ const { data } = await client.get(
1699
+ "/projects/{projectId}/reviewers",
1700
+ { path: { projectId } },
1701
+ { signal }
1702
+ );
1703
+ return data;
1704
+ };
1705
+ const setProjectReviewers = async ({
1706
+ projectId,
1707
+ adminIds
1708
+ }) => {
1709
+ const { data } = await client.put("/projects/{projectId}/reviewers", {
1710
+ path: { projectId },
1711
+ body: { adminIds }
1712
+ });
1713
+ return data;
1714
+ };
1715
+ return {
1716
+ getProject,
1717
+ addProjectFeature,
1718
+ removeProjectFeature,
1719
+ changeProjectUserRole,
1720
+ getProjectUsers,
1721
+ getProjectMetadata,
1722
+ setProjectMetadata,
1723
+ getProjectReviewers,
1724
+ setProjectReviewers
1725
+ };
1726
+ };
1727
+
1728
+ // src/clients/management/users/users.ts
1729
+ var createUsers = (client) => {
1730
+ const addUserAdminFeature = async ({ feature, userIdOrMail }, signal) => {
1731
+ const { data } = await client.post(
1732
+ "/users/{userIdOrMail}/features",
1733
+ { path: { userIdOrMail: encodeURIComponent(userIdOrMail) }, body: { feature } },
1734
+ { signal }
1735
+ );
1736
+ return data;
1737
+ };
1738
+ const removeUserAdminFeature = async ({ userIdOrMail, feature }, signal) => {
1739
+ const { data } = await client.delete(
1740
+ "/users/{userIdOrMail}/features/{feature}",
1741
+ { path: { userIdOrMail: encodeURIComponent(userIdOrMail), feature } },
1742
+ { signal }
1743
+ );
1744
+ return data;
1745
+ };
1746
+ return {
1747
+ addUserAdminFeature,
1748
+ removeUserAdminFeature
1749
+ };
1750
+ };
1751
+
1752
+ // src/clients/management/managementClient.ts
1753
+ var createManagementClient = ({
1754
+ baseUrl,
1755
+ callbacks,
1756
+ token
1757
+ }) => {
1758
+ const callbackMiddleware = createCallbackMiddleware(callbacks);
1759
+ const authMiddleware = createAuthMiddleware({
1760
+ baseUrl,
1761
+ accessToken: token
1762
+ });
1763
+ const middlewares = [
1764
+ callbackMiddleware,
1765
+ authMiddleware
1766
+ // 👈 beware order of middlewares always matter
1767
+ ];
1768
+ const client = createGenericFetchClient({
1769
+ baseUrl: `${baseUrl}/manage`,
1770
+ middlewares
1771
+ });
1772
+ const openApiClient = createOpenapiFetchClient({
1773
+ baseUrl,
1774
+ middlewares
1775
+ });
1776
+ return {
1777
+ currentUser: createCurrentUser(openApiClient),
1778
+ features: createFeatures(client),
1779
+ maintainers: createMaintainers(openApiClient),
1780
+ organizations: createOrganizations(openApiClient),
1781
+ projects: createProjects(client),
1782
+ users: createUsers(client)
1783
+ };
1784
+ };
1785
+
1786
+ // src/clients/metastore/repository/repository.ts
1787
+ var createRepository = (client) => {
1788
+ const getMetaObjects = async (input, signal) => {
1789
+ const { data } = await client.get(
1790
+ "/api/v1/repository/{objectType}",
1791
+ {
1792
+ path: input
1793
+ },
1794
+ { signal }
1795
+ );
1796
+ return data;
1797
+ };
1798
+ const getMetaObjectRevisions = async (input, signal) => {
1799
+ const { data } = await client.get(
1800
+ "/api/v1/repository/{objectType}/revisions",
1801
+ {
1802
+ path: input
1803
+ },
1804
+ { signal }
1805
+ );
1806
+ return data;
1807
+ };
1808
+ const getMetaObject = async (input, signal) => {
1809
+ const { data } = await client.get(
1810
+ "/api/v1/repository/{objectType}/{UUID}",
1811
+ {
1812
+ path: input
1813
+ },
1814
+ {
1815
+ signal
1816
+ }
1817
+ );
1818
+ return data;
1819
+ };
1820
+ const createMetaObject = async ({
1821
+ objectType,
1822
+ data,
1823
+ ...body
1824
+ }) => {
1825
+ const { data: createdMetaObject } = await client.post("/api/v1/repository/{objectType}", {
1826
+ path: { objectType },
1827
+ body: {
1828
+ data,
1829
+ ...body
1830
+ }
1831
+ });
1832
+ return createdMetaObject;
1833
+ };
1834
+ const deleteMetaObject = async (input) => {
1835
+ const { data } = await client.delete("/api/v1/repository/{objectType}/{UUID}", {
1836
+ path: input
1837
+ });
1838
+ return data;
1839
+ };
1840
+ const updateMetaObject = async ({
1841
+ objectType,
1842
+ UUID,
1843
+ data,
1844
+ ...body
1845
+ }) => {
1846
+ const { data: updatedMetaObject } = await client.patch(
1847
+ "/api/v1/repository/{objectType}/{UUID}",
1848
+ {
1849
+ path: {
1850
+ objectType,
1851
+ UUID
1852
+ },
1853
+ body: {
1854
+ data,
1855
+ ...body
1856
+ }
1857
+ }
1858
+ );
1859
+ return updatedMetaObject;
1860
+ };
1861
+ const replaceMetaObject = async ({
1862
+ objectType,
1863
+ UUID,
1864
+ data,
1865
+ ...body
1866
+ }) => {
1867
+ const { data: replacedMetaObject } = await client.put(
1868
+ "/api/v1/repository/{objectType}/{UUID}",
1869
+ {
1870
+ path: {
1871
+ objectType,
1872
+ UUID
1873
+ },
1874
+ body: {
1875
+ data,
1876
+ ...body
1877
+ }
1878
+ }
1879
+ );
1880
+ return replacedMetaObject;
1881
+ };
1882
+ const getMetaObjectRevision = async (input, signal) => {
1883
+ const { data } = await client.get(
1884
+ "/api/v1/repository/{objectType}/{UUID}/revisions/{revision}",
1885
+ {
1886
+ path: input
1887
+ },
1888
+ { signal }
1889
+ );
1890
+ return data;
1891
+ };
1892
+ const deleteMetaObjectRevision = async (input) => {
1893
+ const { data } = await client.delete(
1894
+ "/api/v1/repository/{objectType}/{UUID}/revisions/{revision}",
1895
+ {
1896
+ path: input
1897
+ }
1898
+ );
1899
+ return data;
1900
+ };
1901
+ return {
1902
+ // lists
1903
+ getMetaObjects,
1904
+ getMetaObjectRevisions,
1905
+ // objects
1906
+ getMetaObject,
1907
+ createMetaObject,
1908
+ deleteMetaObject,
1909
+ updateMetaObject,
1910
+ replaceMetaObject,
1911
+ // revisons
1912
+ getMetaObjectRevision,
1913
+ deleteMetaObjectRevision
1914
+ };
1915
+ };
1916
+
1917
+ // src/clients/metastore/schema/schema.ts
1918
+ var createSchema = (client) => {
1919
+ const getSchema = async (input, signal) => {
1920
+ const { data } = await client.get(
1921
+ "/api/v1/schema/{objectType}",
1922
+ {
1923
+ path: input
1924
+ },
1925
+ { signal }
1926
+ );
1927
+ return data;
1928
+ };
1929
+ const getVersionedSchema = async (input, signal) => {
1930
+ const { data } = await client.get(
1931
+ "/api/v1/schema/{objectType}/{version}",
1932
+ {
1933
+ path: input
1934
+ },
1935
+ { signal }
1936
+ );
1937
+ return data;
1938
+ };
1939
+ return {
1940
+ getSchema,
1941
+ getVersionedSchema
1942
+ };
1943
+ };
1944
+
1945
+ // src/clients/metastore/metastoreClient.ts
1946
+ var createMetastoreClient = ({ baseUrl, middlewares }) => {
1947
+ const client = createOpenapiFetchClient({
1948
+ baseUrl,
1949
+ middlewares
1950
+ });
1951
+ const healthCheck = async (signal) => {
1952
+ const { data } = await client.get("/health-check", {}, { signal });
1953
+ return data;
1954
+ };
1955
+ return {
1956
+ healthCheck,
1957
+ repository: createRepository(client),
1958
+ schema: createSchema(client)
1959
+ };
1960
+ };
1961
+
1962
+ // src/clients/queryService/queryServiceClient.ts
1963
+ var createQueryServiceClient = ({ baseUrl, middlewares }) => {
1964
+ const client = createOpenapiFetchClient({
1965
+ baseUrl,
1966
+ middlewares
1967
+ });
1968
+ const createQueryJob = async (branchId, workspaceId, body) => {
1969
+ const { data } = await client.post(
1970
+ "/api/v1/branches/{branchId}/workspaces/{workspaceId}/queries",
1971
+ { path: { branchId, workspaceId }, body }
1972
+ );
1973
+ return data;
1974
+ };
1975
+ const cancelQueryJob = async (queryJobId) => {
1976
+ const { data } = await client.post("/api/v1/queries/{queryJobId}/cancel", {
1977
+ path: { queryJobId },
1978
+ body: { reason: "Cancelled by user" }
1979
+ });
1980
+ return data;
1981
+ };
1982
+ const getQueryJob = async (queryJobId) => {
1983
+ const { data } = await client.get("/api/v1/queries/{queryJobId}", { path: { queryJobId } });
1984
+ return data;
1985
+ };
1986
+ const getQueryResults = async (queryJobId, statementId, query) => {
1987
+ const { data } = await client.get("/api/v1/queries/{queryJobId}/{statementId}/results", {
1988
+ path: { queryJobId, statementId },
1989
+ query
1990
+ });
1991
+ return data;
1992
+ };
1993
+ const getQueryHistory = async (branchId, workspaceId, query) => {
1994
+ const { data } = await client.get(
1995
+ "/api/v1/branches/{branchId}/workspaces/{workspaceId}/queries",
1996
+ {
1997
+ path: { branchId, workspaceId },
1998
+ query
1999
+ }
2000
+ );
2001
+ return data;
2002
+ };
2003
+ const exportResults = async (queryJobId, statementId, query, signal) => {
2004
+ const { data, response } = await client.get(
2005
+ "/api/v1/queries/{queryJobId}/{statementId}/export",
2006
+ {
2007
+ path: { queryJobId, statementId },
2008
+ query
2009
+ },
2010
+ { signal }
2011
+ );
2012
+ const mimeType = response.headers.get(HttpHeader.CONTENT_TYPE) ?? "text/csv";
2013
+ const contentDisposition = parseContentDispositionHeader(
2014
+ response.headers.get(HttpHeader.CONTENT_DISPOSITION)
2015
+ );
2016
+ return {
2017
+ mimeType,
2018
+ content: data,
2019
+ fileName: contentDisposition?.filename ?? "export.csv"
2020
+ };
2021
+ };
2022
+ return {
2023
+ createQueryJob,
2024
+ cancelQueryJob,
2025
+ getQueryJob,
2026
+ getQueryResults,
2027
+ getQueryHistory,
2028
+ exportResults
2029
+ };
2030
+ };
2031
+
2032
+ // src/clients/queue/queueClient.ts
2033
+ var createQueueClient = ({ baseUrl, middlewares }) => {
2034
+ const client = createOpenapiFetchClient({
2035
+ baseUrl,
2036
+ middlewares
2037
+ });
2038
+ const getJob = async (jobId, signal) => {
2039
+ const { data } = await client.get(
2040
+ "/jobs/{jobId}",
2041
+ {
2042
+ path: { jobId }
2043
+ },
2044
+ { signal }
2045
+ );
2046
+ return data;
2047
+ };
2048
+ const searchJobs = async (query, signal) => {
2049
+ const { data } = await client.get(
2050
+ "/search/jobs",
2051
+ {
2052
+ query
2053
+ },
2054
+ { signal }
2055
+ );
2056
+ return data;
2057
+ };
2058
+ return { getJob, searchJobs };
2059
+ };
2060
+
2061
+ // src/clients/status/statusClient.ts
2062
+ var createStatusClient = ({ baseUrl, middlewares }) => {
2063
+ const client = createGenericFetchClient({
2064
+ baseUrl,
2065
+ middlewares
2066
+ });
2067
+ const getSummary = async (signal) => {
2068
+ const { data } = await client.get("/summary.json", {}, { signal });
2069
+ return data;
2070
+ };
2071
+ return {
2072
+ getSummary
2073
+ };
2074
+ };
2075
+
2076
+ // src/clients/storage/configurationVersions/configurationVersions.ts
2077
+ var createConfigurationVersions = (client) => {
2078
+ const listConfigurationVersions = async ({ branchId, componentId, configId }, signal) => {
2079
+ const { data } = await client.get(
2080
+ "/branch/{branchId}/components/{componentId}/configs/{configId}/versions",
2081
+ { path: { branchId, componentId, configId } },
2082
+ { signal }
2083
+ );
2084
+ return data;
2085
+ };
2086
+ const getConfigurationVersion = async ({ branchId, componentId, configId, versionId }, signal) => {
2087
+ const { data } = await client.get(
2088
+ "/branch/{branchId}/components/{componentId}/configs/{configId}/versions/{versionId}",
2089
+ { path: { branchId, componentId, configId, versionId } },
2090
+ { signal }
2091
+ );
2092
+ return data;
2093
+ };
2094
+ return {
2095
+ listConfigurationVersions,
2096
+ getConfigurationVersion
2097
+ };
2098
+ };
2099
+
2100
+ // src/clients/storage/mergeRequests/mergeRequests.ts
2101
+ var createMergeRequests = (client) => {
2102
+ const getMergeRequests = async (signal) => {
2103
+ const { data } = await client.get("/v2/storage/merge-request", {}, { signal });
2104
+ return data;
2105
+ };
2106
+ const getMergeRequest = async (id, signal) => {
2107
+ const { data } = await client.get(
2108
+ "/v2/storage/merge-request/{id}",
2109
+ { path: { id } },
2110
+ { signal }
2111
+ );
2112
+ return data;
2113
+ };
2114
+ const getMergeRequestWithActivityLog = async (id, signal) => {
2115
+ const { data } = await client.get(
2116
+ "/v2/storage/merge-request/{id}",
2117
+ // @ts-expect-error backend accepts `?include=activityLog`; OpenAPI schema regen pending (connection#7250).
2118
+ { path: { id }, query: { include: "activityLog" } },
2119
+ { signal }
2120
+ );
2121
+ return data;
2122
+ };
2123
+ const createMergeRequest = async (params) => {
2124
+ const { data } = await client.post("/v2/storage/merge-request", { body: params });
2125
+ return data;
2126
+ };
2127
+ const updateMergeRequest = async (id, params) => {
2128
+ const { data } = await client.put("/v2/storage/merge-request/{id}", {
2129
+ path: { id },
2130
+ body: params
2131
+ });
2132
+ return data;
2133
+ };
2134
+ const requestReview = async (id) => {
2135
+ const { data } = await client.put("/v2/storage/merge-request/{id}/request-review", {
2136
+ path: { id }
2137
+ });
2138
+ return data;
2139
+ };
2140
+ const approveMergeRequest = async (id) => {
2141
+ const { data } = await client.put("/v2/storage/merge-request/{id}/approve", {
2142
+ path: { id }
2143
+ });
2144
+ return data;
2145
+ };
2146
+ const requestChangesMergeRequest = async (id, reason) => {
2147
+ const { data } = await client.put("/v2/storage/merge-request/{id}/request-changes", {
2148
+ path: { id },
2149
+ // @ts-expect-error backend accepts optional `{ reason }` body; OpenAPI schema regen pending (connection#7250).
2150
+ body: reason ? { reason } : void 0
2151
+ });
2152
+ return data;
2153
+ };
2154
+ return {
2155
+ getMergeRequests,
2156
+ getMergeRequest,
2157
+ getMergeRequestWithActivityLog,
2158
+ createMergeRequest,
2159
+ updateMergeRequest,
2160
+ requestReview,
2161
+ approveMergeRequest,
2162
+ requestChangesMergeRequest
2163
+ };
2164
+ };
2165
+
2166
+ // src/clients/storage/branches/mappers.ts
2167
+ var mapBranchMetadata = (data) => ({
2168
+ ...data,
2169
+ timestamp: new Date(data.timestamp)
2170
+ });
2171
+
2172
+ // src/clients/storage/branches/branches.ts
2173
+ var createBranches = (client) => {
2174
+ const getDevBranches = async (signal) => {
2175
+ const { data } = await client.get("/dev-branches", {}, { signal });
2176
+ return data;
2177
+ };
2178
+ const createDevBranchJob = async (body) => {
2179
+ const { data } = await client.post(
2180
+ "/dev-branches",
2181
+ {
2182
+ body
2183
+ }
2184
+ );
2185
+ return data;
2186
+ };
2187
+ const updateDevBranch = async ({
2188
+ id,
2189
+ name,
2190
+ description
2191
+ }) => {
2192
+ const { data } = await client.put(
2193
+ "/dev-branches/{id}",
2194
+ {
2195
+ path: { id },
2196
+ body: {
2197
+ name,
2198
+ description
2199
+ }
2200
+ }
2201
+ );
2202
+ return data;
2203
+ };
2204
+ const deleteDevBranchJob = async (id) => {
2205
+ const { data } = await client.delete(
2206
+ "/dev-branches/{id}",
2207
+ {
2208
+ path: { id }
2209
+ }
2210
+ );
2211
+ return data;
2212
+ };
2213
+ const getDevBranchMetadata = async (id, signal) => {
2214
+ const { data } = await client.get(
2215
+ "/branch/{id}/metadata",
2216
+ { path: { id } },
2217
+ { signal }
2218
+ );
2219
+ return data.map(mapBranchMetadata);
2220
+ };
2221
+ const saveDevBranchMetadata = async (id, metadata, signal) => {
2222
+ const { data } = await client.post("/branch/{id}/metadata", { path: { id }, body: { metadata } }, { signal });
2223
+ return data.map(mapBranchMetadata);
2224
+ };
2225
+ const deleteDevBranchMetadata = async (id, metadataId, signal) => {
2226
+ await client.delete(
2227
+ "/branch/{id}/metadata/{metadataId}",
2228
+ { path: { id, metadataId } },
2229
+ { signal }
2230
+ );
2231
+ };
2232
+ return {
2233
+ getDevBranches,
2234
+ createDevBranchJob,
2235
+ updateDevBranch,
2236
+ deleteDevBranchJob,
2237
+ getDevBranchMetadata,
2238
+ saveDevBranchMetadata,
2239
+ deleteDevBranchMetadata
2240
+ };
2241
+ };
2242
+
2243
+ // src/clients/storage/buckets/buckets.ts
2244
+ var createBuckets = (client) => {
2245
+ const getBuckets = async (query = {}, signal) => {
2246
+ const { data } = await client.get(
2247
+ `/buckets`,
2248
+ { query },
2249
+ { signal, queryArrayFormat: "comma" }
2250
+ );
2251
+ return data;
2252
+ };
2253
+ const getBucket = async (id, signal) => {
2254
+ const { data } = await client.get(
2255
+ `/buckets/{id}`,
2256
+ { path: { id } },
2257
+ { signal }
2258
+ );
2259
+ return data;
2260
+ };
2261
+ const createBucket = async (body) => {
2262
+ const { data } = await client.post(`/buckets`, {
2263
+ body
2264
+ });
2265
+ return data;
2266
+ };
2267
+ const updateBucket = async (id, body) => {
2268
+ const { data } = await client.patch(
2269
+ `/buckets/{id}`,
2270
+ { path: { id }, body }
2271
+ );
2272
+ return data;
2273
+ };
2274
+ const deleteBucket = async (id) => {
2275
+ await client.delete(`/buckets/{id}`, { path: { id } });
2276
+ };
2277
+ const deleteBucketAsync = async (id, options = {}) => {
2278
+ const { data } = await client.delete(`/buckets/{id}`, { path: { id }, query: { async: true, ...options } });
2279
+ return data;
2280
+ };
2281
+ const createScheduledRefresh = async (input) => {
2282
+ const { branchId, bucketId, cronExpression } = input;
2283
+ const { data } = await client.post(`/branch/{branchId}/buckets/{bucketId}/scheduled-tasks/refresh`, {
2284
+ path: { branchId, bucketId },
2285
+ body: { cronExpression }
2286
+ });
2287
+ return data;
2288
+ };
2289
+ const deleteScheduledTask = async (taskId) => {
2290
+ await client.delete(`/scheduled-tasks/{taskId}`, {
2291
+ path: { taskId }
2292
+ });
2293
+ };
2294
+ return {
2295
+ getBuckets,
2296
+ getBucket,
2297
+ createBucket,
2298
+ updateBucket,
2299
+ deleteBucket,
2300
+ deleteBucketAsync,
2301
+ createScheduledRefresh,
2302
+ deleteScheduledTask
2303
+ };
2304
+ };
2305
+
2306
+ // src/utils/assert.ts
2307
+ function assert(value, message2) {
2308
+ if (value == null) {
2309
+ throw new Error(message2);
2310
+ }
2311
+ }
2312
+
2313
+ // src/utils/concurrent.ts
2314
+ var concurrent = async ({
2315
+ items,
2316
+ process: process2,
2317
+ concurrency = 2,
2318
+ middlewares = []
2319
+ }) => {
2320
+ if (concurrency < 1) throw new Error("Concurrency must be greater than 0");
2321
+ if (items.length === 0) return [];
2322
+ if (concurrency === Infinity)
2323
+ return Promise.all(items.map((item, index) => process2(item, index, items.length)));
2324
+ const n = items.length;
2325
+ const results = new Array(n);
2326
+ const processWithMiddlewares = middlewares.reduceRight(
2327
+ (next, middleware) => middleware(next),
2328
+ process2
2329
+ );
2330
+ const queue = items.map((item, index) => async () => {
2331
+ results[index] = await processWithMiddlewares(item, index, items.length);
2332
+ });
2333
+ const workers = Array.from(
2334
+ { length: Math.min(concurrency, items.length) },
2335
+ async function processQueue() {
2336
+ while (queue.length) {
2337
+ await queue.shift()?.();
2338
+ }
2339
+ }
2340
+ );
2341
+ await Promise.all(workers);
2342
+ return results;
2343
+ };
2344
+
2345
+ // src/utils/createAbortError.ts
2346
+ var createAbortError = (reason) => new DOMException(reason, "AbortError");
2347
+
2348
+ // src/utils/delay.ts
2349
+ var delay = (timeout, signal) => new Promise((resolve, reject) => {
2350
+ if (signal?.aborted) return reject(createAbortError(signal.reason));
2351
+ const timeoutId = setTimeout(resolve, timeout);
2352
+ signal?.addEventListener(
2353
+ "abort",
2354
+ () => {
2355
+ clearTimeout(timeoutId);
2356
+ reject(createAbortError(signal.reason));
2357
+ },
2358
+ { once: true }
2359
+ );
2360
+ });
2361
+
2362
+ // src/utils/poll.ts
2363
+ var message = {
2364
+ PollPredicateError: "Poll predicate failed",
2365
+ PollTimeoutError: "Poll timeout exceeded",
2366
+ PollPollTimeoutError: "Poll data failed condition"
2367
+ };
2368
+ var PollException = class extends Error {
2369
+ result;
2370
+ constructor(type, result) {
2371
+ super(type, { cause: message[type] });
2372
+ this.result = result;
2373
+ }
2374
+ };
2375
+ var poll = async ({
2376
+ pollFn,
2377
+ interval,
2378
+ isDone,
2379
+ isFailed,
2380
+ abortSignal,
2381
+ maxAttempts = Infinity
2382
+ }) => {
2383
+ if (abortSignal?.aborted) throw createAbortError(abortSignal.reason);
2384
+ if (interval < 1) throw new Error("Invalid poll interval");
2385
+ if (maxAttempts < 1) throw new Error("Invalid poll maxAttempts");
2386
+ let callCount = 0;
2387
+ while (true) {
2388
+ callCount++;
2389
+ const data = await pollFn(abortSignal);
2390
+ const result = { data, callCount };
2391
+ try {
2392
+ if (isDone(data)) return result;
2393
+ if (isFailed?.(data) ?? false) throw new PollException("PollPollTimeoutError", result);
2394
+ } catch (error) {
2395
+ if (error instanceof PollException) throw error;
2396
+ throw new PollException("PollPredicateError", result);
2397
+ }
2398
+ if (callCount >= maxAttempts) throw new PollException("PollTimeoutError", result);
2399
+ await delay(interval, abortSignal);
2400
+ }
2401
+ };
2402
+
2403
+ // src/utils/keboolaUID.ts
2404
+ var KEBOOLA_OBJECT_ID_DELIMITER = "--";
2405
+ var keboolaUID = {
2406
+ serialize: (input) => {
2407
+ if (input.uid === "")
2408
+ throw new Error("Invalid Keboola Object ID: uid of an object cannot be empty");
2409
+ return ["KID", input.projectId, input.type, input.uid].join(KEBOOLA_OBJECT_ID_DELIMITER);
2410
+ },
2411
+ deserialize: (input) => {
2412
+ const [identifier, projectId, type, uid] = input.split(KEBOOLA_OBJECT_ID_DELIMITER);
2413
+ if (identifier !== "KID" || !projectId || !type || !uid)
2414
+ throw new Error("Invalid Keboola Object ID");
2415
+ return {
2416
+ projectId: Number(projectId),
2417
+ type,
2418
+ uid
2419
+ };
2420
+ }
2421
+ };
2422
+
2423
+ // src/utils/generateUUID.ts
2424
+ var generateUUID = () => crypto.randomUUID();
2425
+
2426
+ // src/utils/series.ts
2427
+ var series = async (options) => concurrent({
2428
+ ...options,
2429
+ concurrency: 1
2430
+ });
2431
+
2432
+ // src/clients/storage/componentsAndConfigurations/componentsAndConfigurations.ts
2433
+ var createComponentsAndConfigurations = (client) => {
2434
+ const getComponent = async ({ componentId, branchId = "default" }, signal) => {
2435
+ const { data } = await client.get(
2436
+ "/branch/{branchId}/components/{componentId}",
2437
+ { path: { componentId, branchId } },
2438
+ { signal }
2439
+ );
2440
+ return data;
2441
+ };
2442
+ const getComponents = async ({ branchId = "default", ...query } = {}, signal) => {
2443
+ const { data } = await client.get(
2444
+ "/branch/{branchId}/components",
2445
+ { path: { branchId }, query },
2446
+ { signal, queryArrayFormat: "comma" }
2447
+ );
2448
+ return data;
2449
+ };
2450
+ const getConfiguration = async ({ componentId, configId, branchId = "default" }, signal) => {
2451
+ const { data } = await client.get(
2452
+ "/branch/{branchId}/components/{componentId}/configs/{configId}",
2453
+ { path: { componentId, configId, branchId } },
2454
+ { signal }
2455
+ );
2456
+ return data;
2457
+ };
2458
+ const createConfiguration = async ({
2459
+ branchId = "default",
2460
+ componentId,
2461
+ ...body
2462
+ }) => {
2463
+ const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs", {
2464
+ path: { branchId, componentId },
2465
+ body
2466
+ });
2467
+ return data;
2468
+ };
2469
+ const deleteConfiguration = async (path) => {
2470
+ await client.delete(
2471
+ "/branch/{branchId}/components/{componentId}/configs/{configId}",
2472
+ { path }
2473
+ );
2474
+ };
2475
+ const deleteConfigurations = async ({
2476
+ configIds,
2477
+ ...rest
2478
+ }) => {
2479
+ await concurrent({
2480
+ items: configIds,
2481
+ process: async (configId) => deleteConfiguration({ ...rest, configId })
2482
+ });
2483
+ };
2484
+ const getConfigurations = async ({ componentId, branchId = "default" }, signal) => {
2485
+ const { data } = await client.get(
2486
+ "/branch/{branchId}/components/{componentId}/configs",
2487
+ { path: { componentId, branchId } },
2488
+ { signal }
2489
+ );
2490
+ return data;
2491
+ };
2492
+ const getConfigurationWorkspaces = async ({
2493
+ componentId,
2494
+ branchId,
2495
+ configId
2496
+ }) => {
2497
+ const { data } = await client.get(
2498
+ "/branch/{branchId}/components/{componentId}/configs/{configId}/workspaces",
2499
+ {
2500
+ path: { componentId, branchId, configId }
2501
+ }
2502
+ );
2503
+ return data;
2504
+ };
2505
+ const createConfigurationWorkspace = async ({
2506
+ componentId,
2507
+ branchId,
2508
+ configId,
2509
+ ...body
2510
+ }) => {
2511
+ const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs/{configId}/workspaces", {
2512
+ path: { componentId, branchId, configId },
2513
+ body
2514
+ });
2515
+ return data;
2516
+ };
2517
+ const createConfigurationWorkspaceJob = async ({
2518
+ componentId,
2519
+ branchId,
2520
+ configId,
2521
+ ...body
2522
+ }) => {
2523
+ const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs/{configId}/workspaces", {
2524
+ path: { componentId, branchId, configId },
2525
+ body,
2526
+ query: { async: true }
2527
+ });
2528
+ return data;
2529
+ };
2530
+ const createConfigurationRow = async ({
2531
+ branchId = "default",
2532
+ componentId,
2533
+ configId,
2534
+ ...body
2535
+ }) => {
2536
+ const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs/{configId}/rows", {
2537
+ path: { branchId, componentId, configId },
2538
+ body
2539
+ });
2540
+ return data;
2541
+ };
2542
+ const createConfigurationRows = async ({
2543
+ branchId = "default",
2544
+ componentId,
2545
+ configId,
2546
+ data
2547
+ }, options) => {
2548
+ return series({
2549
+ items: data,
2550
+ process: (rowBody) => {
2551
+ return createConfigurationRow({
2552
+ branchId,
2553
+ componentId,
2554
+ configId,
2555
+ ...rowBody
2556
+ });
2557
+ },
2558
+ middlewares: options?.middlewares
2559
+ });
2560
+ };
2561
+ const deleteConfigurationRow = async ({
2562
+ changeDescription,
2563
+ ...path
2564
+ }) => {
2565
+ await client.delete(
2566
+ "/branch/{branchId}/components/{componentId}/configs/{configId}/rows/{rowId}",
2567
+ {
2568
+ path,
2569
+ body: { changeDescription }
2570
+ }
2571
+ );
2572
+ };
2573
+ const deleteConfigurationRows = async ({ rowIds, changeDescription, ...input }, options) => {
2574
+ await concurrent({
2575
+ items: rowIds,
2576
+ process: (rowId) => {
2577
+ const resolvedDescription = typeof changeDescription === "string" ? changeDescription : changeDescription?.(rowId);
2578
+ return deleteConfigurationRow({
2579
+ rowId,
2580
+ changeDescription: resolvedDescription,
2581
+ ...input
2582
+ });
2583
+ },
2584
+ concurrency: 5,
2585
+ middlewares: options?.middlewares
2586
+ });
2587
+ };
2588
+ const searchComponentConfigurations = async ({ branchId = "default" } = {}, query, signal) => {
2589
+ const { data } = await client.get(
2590
+ "/branch/{branchId}/search/component-configurations",
2591
+ { path: { branchId }, query },
2592
+ { signal, queryArrayFormat: "comma" }
2593
+ );
2594
+ return data;
2595
+ };
2596
+ return {
2597
+ // components
2598
+ getComponent,
2599
+ getComponents,
2600
+ searchComponentConfigurations,
2601
+ // configurations
2602
+ createConfiguration,
2603
+ getConfiguration,
2604
+ deleteConfiguration,
2605
+ deleteConfigurations,
2606
+ getConfigurations,
2607
+ // configuration's rows
2608
+ createConfigurationRow,
2609
+ createConfigurationRows,
2610
+ deleteConfigurationRow,
2611
+ deleteConfigurationRows,
2612
+ // configuration's workspaces
2613
+ createConfigurationWorkspace,
2614
+ createConfigurationWorkspaceJob,
2615
+ getConfigurationWorkspaces
2616
+ };
2617
+ };
2618
+
2619
+ // src/clients/storage/events/events.ts
2620
+ var createEvents = (client) => {
2621
+ const getEvents = async (query, signal) => {
2622
+ const { data } = await client.get(
2623
+ "/events",
2624
+ { query },
2625
+ { signal }
2626
+ );
2627
+ return data;
2628
+ };
2629
+ const getEvent = async (eventId, signal) => {
2630
+ const { data } = await client.get(
2631
+ "/events/{eventId}",
2632
+ {
2633
+ path: { eventId }
2634
+ },
2635
+ { signal }
2636
+ );
2637
+ return data;
2638
+ };
2639
+ const createEvent = async (body, signal) => {
2640
+ const { data } = await client.post(
2641
+ "/events",
2642
+ {
2643
+ body
2644
+ },
2645
+ { signal }
2646
+ );
2647
+ return data;
2648
+ };
2649
+ return {
2650
+ getEvents,
2651
+ getEvent,
2652
+ createEvent
2653
+ };
2654
+ };
2655
+
2656
+ // src/clients/storage/files/files.ts
2657
+ var createFiles = (client) => {
2658
+ const getFile = async (fileId, signal) => {
2659
+ const { data } = await client.get(
2660
+ `/files/{fileId}`,
2661
+ {
2662
+ path: { fileId }
2663
+ },
2664
+ { signal }
2665
+ );
2666
+ return data;
2667
+ };
2668
+ const getFiles = async (query, signal) => {
2669
+ const { data } = await client.get(
2670
+ "/files",
2671
+ { query },
2672
+ { signal, queryArrayFormat: "brackets" }
2673
+ );
2674
+ return data;
2675
+ };
2676
+ const deleteFile = async (fileId) => {
2677
+ const { data } = await client.delete(`/files/{fileId}`, {
2678
+ path: { fileId }
2679
+ });
2680
+ return data;
2681
+ };
2682
+ const addFileTag = async (fileId, tag) => {
2683
+ const { data } = await client.post(
2684
+ `/files/{fileId}/tags`,
2685
+ {
2686
+ path: { fileId },
2687
+ body: { tag }
2688
+ }
2689
+ );
2690
+ return data;
2691
+ };
2692
+ const getFileContent = async (fileId, signal) => {
2693
+ const { data } = await client.get(
2694
+ `/files/{fileId}/content`,
2695
+ {
2696
+ path: { fileId }
2697
+ },
2698
+ { signal }
2699
+ );
2700
+ return typeof data === "string" ? data : JSON.stringify(data, null, 2);
2701
+ };
2702
+ const deleteFileTag = async (fileId, tag) => {
2703
+ const { data } = await client.delete(
2704
+ "/files/{fileId}/tags/{tag}",
2705
+ {
2706
+ path: { fileId, tag }
2707
+ }
2708
+ );
2709
+ return data;
2710
+ };
2711
+ const prepareFile = async (body, signal) => {
2712
+ const { data } = await client.post(
2713
+ "/files/prepare",
2714
+ { body },
2715
+ { signal }
2716
+ );
2717
+ return data;
2718
+ };
2719
+ return {
2720
+ getFile,
2721
+ getFileContent,
2722
+ getFiles,
2723
+ deleteFile,
2724
+ addFileTag,
2725
+ deleteFileTag,
2726
+ prepareFile
2727
+ };
2728
+ };
2729
+
2730
+ // src/clients/storage/jobs/jobs.ts
2731
+ var createJobs = (client) => {
2732
+ const getJob = async (id, signal) => {
2733
+ const { data } = await client.get(
2734
+ `/jobs/{id}`,
2735
+ {
2736
+ path: { id }
2737
+ },
2738
+ { signal }
2739
+ );
2740
+ return data;
2741
+ };
2742
+ const getJobs = async (query, signal) => {
2743
+ const { data } = await client.get(
2744
+ "/jobs",
2745
+ { query },
2746
+ { signal, queryArrayFormat: "brackets" }
2747
+ );
2748
+ return data;
2749
+ };
2750
+ return { getJob, getJobs };
2751
+ };
2752
+
2753
+ // src/clients/storage/tables/tables.ts
2754
+ var createTables = (client) => {
2755
+ const getTables = async (query = { include: [] }, signal) => {
2756
+ const { data } = await client.get(
2757
+ `/tables`,
2758
+ { query },
2759
+ { signal, queryArrayFormat: "comma" }
2760
+ );
2761
+ return data;
2762
+ };
2763
+ const getTable = async (id, signal) => {
2764
+ const { data } = await client.get(
2765
+ `/tables/{id}`,
2766
+ { path: { id } },
2767
+ { signal }
2768
+ );
2769
+ return data;
2770
+ };
2771
+ const deleteTable = async (id, signal) => {
2772
+ await client.delete(`/tables/{id}`, { path: { id } }, { signal });
2773
+ };
2774
+ const deleteTables = async (ids) => {
2775
+ await concurrent({
2776
+ items: ids,
2777
+ process: (id) => deleteTable(id)
2778
+ });
2779
+ };
2780
+ const deleteTableRows = async (id, query, signal) => {
2781
+ const { data } = await client.delete(
2782
+ `/tables/{id}/rows`,
2783
+ { path: { id }, query },
2784
+ { signal }
2785
+ );
2786
+ return data;
2787
+ };
2788
+ const getDataPreview = async (id, query, signal) => {
2789
+ const { data } = await client.get(
2790
+ `/tables/{id}/data-preview`,
2791
+ { path: { id }, query: { format: "json", ...query } },
2792
+ { signal }
2793
+ );
2794
+ return data;
2795
+ };
2796
+ const exportAsync = async (tableId, body, signal) => {
2797
+ const { data } = await client.post(
2798
+ "/tables/{id}/export-async",
2799
+ { path: { id: tableId }, body },
2800
+ { signal }
2801
+ );
2802
+ return data;
2803
+ };
2804
+ const createTableAsync = async (bucketId, body, signal) => {
2805
+ const { data } = await client.post("/buckets/{bucketId}/tables-async", { path: { bucketId }, body }, { signal });
2806
+ return data;
2807
+ };
2808
+ const importAsync = async (tableId, body, signal) => {
2809
+ const { data } = await client.post(
2810
+ "/tables/{id}/import-async",
2811
+ { path: { id: tableId }, body },
2812
+ { signal }
2813
+ );
2814
+ return data;
2815
+ };
2816
+ return {
2817
+ getTables,
2818
+ getTable,
2819
+ getDataPreview,
2820
+ deleteTable,
2821
+ deleteTables,
2822
+ deleteTableRows,
2823
+ exportAsync,
2824
+ createTableAsync,
2825
+ importAsync
2826
+ };
2827
+ };
2828
+
2829
+ // src/clients/storage/tokens/tokens.ts
2830
+ var createTokens = (client) => {
2831
+ const verify = async (signal) => {
2832
+ const { data } = await client.get(
2833
+ "/tokens/verify",
2834
+ {},
2835
+ { signal }
2836
+ );
2837
+ return data;
2838
+ };
2839
+ const refresh = async (id, signal) => {
2840
+ const { data } = await client.post(
2841
+ `/tokens/${id}/refresh`,
2842
+ {},
2843
+ { signal }
2844
+ );
2845
+ return data;
2846
+ };
2847
+ return {
2848
+ verify,
2849
+ refresh
2850
+ };
2851
+ };
2852
+
2853
+ // src/clients/storage/workspaces/workspaces.ts
2854
+ var createWorkspaces = (client) => {
2855
+ const getWorkspaces = async (branchId, signal) => {
2856
+ const { data } = await client.get(
2857
+ "/branch/{branchId}/workspaces",
2858
+ { path: { branchId } },
2859
+ { signal }
2860
+ );
2861
+ return data;
2862
+ };
2863
+ const getWorkspace = async (path, signal) => {
2864
+ const { data } = await client.get(
2865
+ "/branch/{branchId}/workspaces/{workspaceId}",
2866
+ { path },
2867
+ { signal }
2868
+ );
2869
+ return data;
2870
+ };
2871
+ const deleteWorkspace = async (path) => {
2872
+ await client.delete(
2873
+ "/branch/{branchId}/workspaces/{workspaceId}",
2874
+ { path }
2875
+ );
2876
+ };
2877
+ const deleteWorkspaces = async ({
2878
+ workspaceIds,
2879
+ branchId
2880
+ }) => {
2881
+ await concurrent({
2882
+ items: workspaceIds,
2883
+ process: async (workspaceId) => deleteWorkspace({ branchId, workspaceId }),
2884
+ concurrency: 5
2885
+ });
2886
+ };
2887
+ const deleteWorkspaceJob = async (path) => {
2888
+ const { data } = await client.delete(
2889
+ "/branch/{branchId}/workspaces/{workspaceId}",
2890
+ { path, query: { async: true } },
2891
+ {}
2892
+ );
2893
+ return data;
2894
+ };
2895
+ const resetWorkspacePassword = async ({ branchId, workspaceId }) => {
2896
+ const { data } = await client.post(
2897
+ "/branch/{branchId}/workspaces/{workspaceId}/password",
2898
+ {
2899
+ path: { branchId, workspaceId }
2900
+ }
2901
+ );
2902
+ return data;
2903
+ };
2904
+ const getWorkspaceSaml2Login = async (path, signal) => {
2905
+ const { data } = await client.get(
2906
+ "/branch/{branchId}/workspaces/{workspaceId}/saml2-login",
2907
+ { path },
2908
+ { signal }
2909
+ );
2910
+ return data;
2911
+ };
2912
+ const setWorkspacePublicKey = async ({
2913
+ branchId,
2914
+ workspaceId,
2915
+ publicKey
2916
+ }) => {
2917
+ const { data } = await client.post("/branch/{branchId}/workspaces/{workspaceId}/public-key", {
2918
+ path: { branchId, workspaceId },
2919
+ body: { publicKey }
2920
+ });
2921
+ return data;
2922
+ };
2923
+ const getWorkspaceObjects = async (path, signal) => {
2924
+ const { data } = await client.get(
2925
+ "/branch/{branchId}/workspaces/{workspaceId}/objects",
2926
+ { path },
2927
+ { signal }
2928
+ );
2929
+ return data;
2930
+ };
2931
+ const deleteWorkspaceObjectsAsync = async ({
2932
+ branchId,
2933
+ workspaceId,
2934
+ ...body
2935
+ }) => {
2936
+ const { data } = await client.post("/branch/{branchId}/workspaces/{workspaceId}/objects/batch-delete", {
2937
+ path: { branchId, workspaceId },
2938
+ body
2939
+ });
2940
+ return data;
2941
+ };
2942
+ return {
2943
+ getWorkspace,
2944
+ getWorkspaces,
2945
+ deleteWorkspace,
2946
+ resetWorkspacePassword,
2947
+ deleteWorkspaces,
2948
+ deleteWorkspaceJob,
2949
+ setWorkspacePublicKey,
2950
+ getWorkspaceSaml2Login,
2951
+ getWorkspaceObjects,
2952
+ deleteWorkspaceObjectsAsync
2953
+ };
2954
+ };
2955
+
2956
+ // src/clients/storage/storageClient.ts
2957
+ var createStorageClient = ({ baseUrl, middlewares = [] }) => {
2958
+ const storageBaseUrl = `${baseUrl}/v2/storage`;
2959
+ const client = createGenericFetchClient({
2960
+ baseUrl: storageBaseUrl,
2961
+ middlewares
2962
+ });
2963
+ const openApiClient = createOpenapiFetchClient({
2964
+ baseUrl,
2965
+ middlewares
2966
+ });
2967
+ const getStackInfo = async (query, signal) => {
2968
+ const { data } = await client.get(
2969
+ "",
2970
+ { query },
2971
+ { signal }
2972
+ );
2973
+ return data;
2974
+ };
2975
+ return {
2976
+ buckets: createBuckets(client),
2977
+ events: createEvents(client),
2978
+ files: createFiles(client),
2979
+ tables: createTables(client),
2980
+ branches: createBranches(client),
2981
+ workspaces: createWorkspaces(client),
2982
+ mergeRequests: createMergeRequests(openApiClient),
2983
+ jobs: createJobs(client),
2984
+ componentsAndConfigurations: createComponentsAndConfigurations(client),
2985
+ configurationVersions: createConfigurationVersions(client),
2986
+ tokens: createTokens(client),
2987
+ getStackInfo
2988
+ };
2989
+ };
2990
+
2991
+ // src/clients/storage/storageTokenMiddleware.ts
2992
+ var isTokenRefreshEndpoint = (request) => {
2993
+ const url = new URL(request.url);
2994
+ return request.method === "POST" && /\/tokens\/[^/]+\/refresh$/.test(url.pathname);
2995
+ };
2996
+ var tryParseNewToken = (data) => {
2997
+ if (data === null || typeof data !== "object") return null;
2998
+ const token = data.token;
2999
+ return typeof token === "string" ? token : null;
3000
+ };
3001
+ var createStorageTokenMiddleware = (initialToken) => {
3002
+ let current = initialToken;
3003
+ return (next) => async (request) => {
3004
+ request.request.headers.set(KeboolaHttpHeader.STORAGE_API_TOKEN, current);
3005
+ const response = await next(request);
3006
+ if (isTokenRefreshEndpoint(request.request)) {
3007
+ const newToken = tryParseNewToken(response.data);
3008
+ if (newToken !== null) current = newToken;
3009
+ }
3010
+ return response;
3011
+ };
3012
+ };
3013
+
3014
+ // src/clients/syncActions/constants.ts
3015
+ var SyncAction = {
3016
+ DATA_APP_GIT_REPOSITORY: "git-repository",
3017
+ GIT_REPOSITORY: "gitRepository",
3018
+ ENROLL_MFA: "enrollMFA"
3019
+ };
3020
+ var Component = {
3021
+ DATA_APP: "keboola.data-apps"
3022
+ };
3023
+ var Author = z5__namespace.object({
3024
+ name: z5__namespace.string(),
3025
+ email: z5__namespace.email()
3026
+ });
3027
+ var RepositoryBranch = z5__namespace.object({
3028
+ sha: z5__namespace.string(),
3029
+ date: z5__namespace.string(),
3030
+ comment: z5__namespace.string(),
3031
+ branch: z5__namespace.string(),
3032
+ author: Author
3033
+ });
3034
+ var Repository = z5__namespace.object({
3035
+ repository: z5__namespace.object({
3036
+ url: z5__namespace.string()
3037
+ }),
3038
+ branches: z5__namespace.array(RepositoryBranch)
3039
+ });
3040
+
3041
+ // src/clients/syncActions/gitRepository/utils.ts
3042
+ var GitRepoConfigDataBuilder = class {
3043
+ repositoryUrl;
3044
+ config = {};
3045
+ constructor(repositoryUrl) {
3046
+ this.repositoryUrl = repositoryUrl;
3047
+ }
3048
+ withCredentials(username, password) {
3049
+ this.config.username = username;
3050
+ delete this.config["#sshKey"];
3051
+ this.config["#password"] = password;
3052
+ return this;
3053
+ }
3054
+ withSshKey(username, sshKey) {
3055
+ this.config.username = username;
3056
+ delete this.config["#password"];
3057
+ this.config["#sshKey"] = sshKey;
3058
+ return this;
3059
+ }
3060
+ build() {
3061
+ return {
3062
+ parameters: {
3063
+ git: {
3064
+ repo: this.repositoryUrl,
3065
+ ...this.config
3066
+ }
3067
+ }
3068
+ };
3069
+ }
3070
+ buildForDataApp() {
3071
+ return {
3072
+ parameters: {
3073
+ dataApp: {
3074
+ git: {
3075
+ repository: this.repositoryUrl,
3076
+ ...this.config
3077
+ }
3078
+ }
3079
+ }
3080
+ };
3081
+ }
3082
+ };
3083
+ var createGitRepoConfigDataBuilder = (repositoryUrl) => new GitRepoConfigDataBuilder(repositoryUrl);
3084
+
3085
+ // src/clients/syncActions/gitRepository/gitRepository.ts
3086
+ var createGitRepository = (sendSyncAction) => {
3087
+ const getDataAppPublicGitRepository = async ({ repositoryUrl, ...other }, signal) => {
3088
+ const data = await sendSyncAction(
3089
+ {
3090
+ ...other,
3091
+ action: SyncAction.DATA_APP_GIT_REPOSITORY,
3092
+ componentId: Component.DATA_APP,
3093
+ configData: createGitRepoConfigDataBuilder(repositoryUrl).buildForDataApp()
3094
+ },
3095
+ signal
3096
+ );
3097
+ return Repository.parse(data);
3098
+ };
3099
+ const getDataAppPasswordPrivateGitRepository = async ({ repositoryUrl, username, password, ...other }, signal) => {
3100
+ const data = await sendSyncAction(
3101
+ {
3102
+ ...other,
3103
+ action: SyncAction.DATA_APP_GIT_REPOSITORY,
3104
+ componentId: Component.DATA_APP,
3105
+ configData: createGitRepoConfigDataBuilder(repositoryUrl).withCredentials(username, password).buildForDataApp()
3106
+ },
3107
+ signal
3108
+ );
3109
+ return Repository.parse(data);
3110
+ };
3111
+ const getDataAppSSHKeyPrivateGitRepository = async ({ repositoryUrl, username, sshKey, ...other }, signal) => {
3112
+ const data = await sendSyncAction(
3113
+ {
3114
+ ...other,
3115
+ action: SyncAction.DATA_APP_GIT_REPOSITORY,
3116
+ componentId: Component.DATA_APP,
3117
+ configData: createGitRepoConfigDataBuilder(repositoryUrl).withSshKey(username, sshKey).buildForDataApp()
3118
+ },
3119
+ signal
3120
+ );
3121
+ return Repository.parse(data);
3122
+ };
3123
+ const getPublicGitRepository = async ({ repositoryUrl, componentId, ...other }, signal) => {
3124
+ const data = await sendSyncAction(
3125
+ {
3126
+ ...other,
3127
+ action: SyncAction.GIT_REPOSITORY,
3128
+ componentId,
3129
+ configData: createGitRepoConfigDataBuilder(repositoryUrl).build()
3130
+ },
3131
+ signal
3132
+ );
3133
+ return Repository.parse(data);
3134
+ };
3135
+ const getPrivateGitRepository = async ({ repositoryUrl, username, password, componentId, ...other }, signal) => {
3136
+ const data = await sendSyncAction(
3137
+ {
3138
+ ...other,
3139
+ action: SyncAction.GIT_REPOSITORY,
3140
+ componentId,
3141
+ configData: createGitRepoConfigDataBuilder(repositoryUrl).withCredentials(username, password).build()
3142
+ },
3143
+ signal
3144
+ );
3145
+ return Repository.parse(data);
3146
+ };
3147
+ return {
3148
+ getDataAppPublicGitRepository,
3149
+ getDataAppPasswordPrivateGitRepository,
3150
+ getDataAppSSHKeyPrivateGitRepository,
3151
+ getPublicGitRepository,
3152
+ getPrivateGitRepository
3153
+ };
3154
+ };
3155
+
3156
+ // src/clients/syncActions/syncActionsClient.ts
3157
+ var createSendSyncAction = (client) => {
3158
+ return async (body, signal) => {
3159
+ const { data } = await client.post(
3160
+ "/actions",
3161
+ {
3162
+ body
3163
+ },
3164
+ { signal }
3165
+ );
3166
+ return data;
3167
+ };
3168
+ };
3169
+ var createSyncActionsClient = ({ baseUrl, middlewares }) => {
3170
+ const client = createOpenapiFetchClient({
3171
+ baseUrl,
3172
+ middlewares
3173
+ });
3174
+ const sendSyncAction = createSendSyncAction(client);
3175
+ const enrollMFA = ({ email: email2, ...rest }, signal) => {
3176
+ return sendSyncAction(
3177
+ {
3178
+ ...rest,
3179
+ action: SyncAction.ENROLL_MFA,
3180
+ configData: {
3181
+ parameters: {
3182
+ user: {
3183
+ email: email2
3184
+ }
3185
+ }
3186
+ }
3187
+ },
3188
+ signal
3189
+ );
3190
+ };
3191
+ return {
3192
+ enrollMFA,
3193
+ gitRepository: createGitRepository(sendSyncAction)
3194
+ };
3195
+ };
3196
+
3197
+ // src/clients/telemetry/provisioning/provisioning.ts
3198
+ var createProvisioning = (client) => {
3199
+ const createCredentials = async (body, signal) => {
3200
+ const { data } = await client.post(
3201
+ "/provisioning/workspace",
3202
+ { body },
3203
+ { signal }
3204
+ );
3205
+ return data;
3206
+ };
3207
+ return {
3208
+ createCredentials
3209
+ };
3210
+ };
3211
+
3212
+ // src/clients/telemetry/telemetryClient.ts
3213
+ var createTelemetryClient = ({ baseUrl, middlewares }) => {
3214
+ const client = createGenericFetchClient({
3215
+ baseUrl,
3216
+ middlewares
3217
+ });
3218
+ return {
3219
+ provisioning: createProvisioning(client)
3220
+ };
3221
+ };
3222
+
3223
+ // src/clients/vault/vaultClient.ts
3224
+ var createVaultClient = ({ baseUrl, middlewares }) => {
3225
+ const client = createOpenapiFetchClient({
3226
+ baseUrl,
3227
+ middlewares
3228
+ });
3229
+ const getVariables = async (query, signal) => {
3230
+ const { data } = await client.get(
3231
+ "/variables",
3232
+ { query },
3233
+ {
3234
+ signal
3235
+ }
3236
+ );
3237
+ return data;
3238
+ };
3239
+ const deleteVariable = async (hash, signal) => {
3240
+ await client.delete(
3241
+ "/variables/{hash}",
3242
+ {
3243
+ path: { hash }
3244
+ },
3245
+ { signal }
3246
+ );
3247
+ };
3248
+ const createVariable = async (body, signal) => {
3249
+ if (body.flags.includes("encrypted") && !body.value.startsWith(ENCRYPTED_VALUE_PREFIX)) {
3250
+ throw new UserError("Encryption of a value failed. Please contact our support.");
3251
+ }
3252
+ const { data } = await client.post("/variables", { body }, { signal });
3253
+ return data;
3254
+ };
3255
+ const getVariablesByBranchId = async (branchId, signal) => {
3256
+ const { data } = await client.get(
3257
+ "/variables/scoped/branch/{branchId}",
3258
+ {
3259
+ path: { branchId }
3260
+ },
3261
+ { signal }
3262
+ );
3263
+ return data;
3264
+ };
3265
+ const getProjectWideVariables = (signal) => getVariablesByBranchId("null", signal);
3266
+ return {
3267
+ createVariable,
3268
+ deleteVariable,
3269
+ getProjectWideVariables,
3270
+ getVariables,
3271
+ getVariablesByBranchId
3272
+ };
3273
+ };
3274
+
3275
+ // src/domain/project.ts
3276
+ var createProject = ({ sapiToken }) => {
3277
+ const { owner, admin } = sapiToken;
3278
+ const projectFeatureSet = new Set(owner.features);
3279
+ const adminFeatureSet = new Set(admin.features);
3280
+ const hasFeature = (...feature) => {
3281
+ if (feature.length === 0) return false;
3282
+ return feature.every((x) => projectFeatureSet.has(x));
3283
+ };
3284
+ const hasAdminFeature = (...feature) => {
3285
+ if (feature.length === 0) return false;
3286
+ return feature.every((x) => adminFeatureSet.has(x));
3287
+ };
3288
+ const hasBackend = (backend) => {
3289
+ if (backend === "bigquery") return owner.hasBigquery;
3290
+ if (backend === "snowflake") return owner.hasSnowflake;
3291
+ return false;
3292
+ };
3293
+ return {
3294
+ hasFeature,
3295
+ hasAdminFeature,
3296
+ hasBackend,
3297
+ sapiToken
3298
+ };
3299
+ };
3300
+
3301
+ // src/domain/stack.ts
3302
+ var SERVICE_URL_OVERRIDES = {
3303
+ // The service URL for the Kai Assistant is incomplete; we need to add the `/api` suffix to get the full URL for the API.
3304
+ // I assume the service is versioned.
3305
+ "kai-assistant": (url) => `${url}/api`
3306
+ };
3307
+ var createStack = ({ stackInfo, clientServiceUrls }) => {
3308
+ const { services, components, features, ...infoRest } = stackInfo;
3309
+ const serviceMap = new Map(
3310
+ services.map((service) => {
3311
+ const devOverride = clientServiceUrls?.[service.id]?.(service.url);
3312
+ const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
3313
+ const url = devOverride ?? prodOverride ?? service.url;
3314
+ return [service.id, url];
3315
+ })
3316
+ );
3317
+ const componentMap = new Map(components.map((component) => [component.id, component]));
3318
+ const featureSet = new Set(features);
3319
+ const hasFeature = (...feature) => {
3320
+ if (feature.length === 0) return false;
3321
+ return feature.every((x) => featureSet.has(x));
3322
+ };
3323
+ const hasComponent = (...componentId) => {
3324
+ if (componentId.length === 0) return false;
3325
+ return componentId.every((x) => componentMap.has(x));
3326
+ };
3327
+ const getComponent = (componentId) => componentMap.get(componentId) ?? null;
3328
+ const hasService = (serviceId) => serviceMap.has(serviceId);
3329
+ const getServiceUrl = (serviceId) => serviceMap.get(serviceId) ?? null;
3330
+ return {
3331
+ ...infoRest,
3332
+ services,
3333
+ features,
3334
+ components,
3335
+ hasFeature,
3336
+ getServiceUrl,
3337
+ hasService,
3338
+ getComponent,
3339
+ hasComponent
3340
+ };
3341
+ };
3342
+
3343
+ // src/sdks/storage/storageSdk.ts
3344
+ var DEFAULT_POLL_INTERVAL = 2e3;
3345
+ var JOB_TERMINAL_STATUSES = /* @__PURE__ */ new Set(["success", "warning", "error", "terminated", "cancelled"]);
3346
+ var createStorageSdk = ({ storageClient }) => {
3347
+ const waitForJob = async (job, options) => {
3348
+ const { data } = await poll({
3349
+ pollFn: (abortSignal) => storageClient.jobs.getJob(job.id, abortSignal),
3350
+ isDone: (j) => JOB_TERMINAL_STATUSES.has(j.status),
3351
+ interval: options?.interval ?? DEFAULT_POLL_INTERVAL,
3352
+ maxAttempts: options?.maxAttempts,
3353
+ abortSignal: options?.abortSignal
3354
+ });
3355
+ return data;
3356
+ };
3357
+ const createTable = async (bucketId, body, options) => {
3358
+ const job = await storageClient.tables.createTableAsync(bucketId, body, options?.abortSignal);
3359
+ return waitForJob(job, options);
3360
+ };
3361
+ const importFromFile = async (tableId, body, options) => {
3362
+ const job = await storageClient.tables.importAsync(tableId, body, options?.abortSignal);
3363
+ return waitForJob(job, options);
3364
+ };
3365
+ const exportToFile = async (tableId, body, options) => {
3366
+ const job = await storageClient.tables.exportAsync(tableId, body, options?.abortSignal);
3367
+ return waitForJob(job, options);
3368
+ };
3369
+ return {
3370
+ createTable,
3371
+ importFromFile,
3372
+ exportToFile
3373
+ };
3374
+ };
3375
+
3376
+ // src/sdks/tag/tagSdk.ts
3377
+ var ObjectType = {
3378
+ TAG: "tag",
3379
+ TAG_BINDING: "tag-binding"
3380
+ };
3381
+ var createTagSdk = ({ metastoreClient }) => {
3382
+ const _getTagMetaObjects = async (type, signal) => {
3383
+ const response = await metastoreClient.repository.getMetaObjects(
3384
+ {
3385
+ objectType: type
3386
+ },
3387
+ signal
3388
+ );
3389
+ return response.data.map(({ attributes }) => attributes);
3390
+ };
3391
+ const _getAllTagBindingMapByTagId = async (signal) => {
3392
+ const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
3393
+ return Object.groupBy(tagBindings, (binding) => binding.data.tagUUID);
3394
+ };
3395
+ const _getTagBindingMapByTagId = async (tagUUIDs, objectId, signal) => {
3396
+ const tagBindingMapByTagId = await _getAllTagBindingMapByTagId(signal);
3397
+ const objectUID = keboolaUID.serialize(objectId);
3398
+ return tagUUIDs.reduce((acc, tagUUID) => {
3399
+ if (acc[tagUUID]) return acc;
3400
+ const tagBindings = tagBindingMapByTagId[tagUUID] ?? [];
3401
+ acc[tagUUID] = tagBindings.find((binding) => binding.data.objectUID === objectUID) ?? null;
3402
+ return acc;
3403
+ }, {});
3404
+ };
3405
+ const _deleteTagBindings = async (tagBindings) => {
3406
+ await concurrent({
3407
+ items: tagBindings,
3408
+ process: async (binding) => metastoreClient.repository.deleteMetaObject({
3409
+ objectType: ObjectType.TAG_BINDING,
3410
+ UUID: binding.uuid
3411
+ }),
3412
+ concurrency: 5
3413
+ });
3414
+ };
3415
+ const getTags = async (signal) => {
3416
+ const [tags, tagBindingMapByTagId] = await Promise.all([
3417
+ _getTagMetaObjects(ObjectType.TAG, signal),
3418
+ _getAllTagBindingMapByTagId(signal)
3419
+ ]);
3420
+ return tags.map((tag) => ({
3421
+ tag,
3422
+ bindings: tagBindingMapByTagId[tag.uuid] ?? []
3423
+ }));
3424
+ };
3425
+ const getTagsByObjectId = async (objectId, signal) => {
3426
+ const tags = await getTags(signal);
3427
+ const keboolaObjectUID = keboolaUID.serialize(objectId);
3428
+ const mapByTagId = tags.reduce((acc, { tag, bindings }) => {
3429
+ acc[tag.uuid] = new Set(bindings.map((binding) => binding.data.objectUID));
3430
+ return acc;
3431
+ }, {});
3432
+ return tags.filter(({ tag }) => mapByTagId[tag.uuid]?.has(keboolaObjectUID));
3433
+ };
3434
+ const createTag = async (data, meta = {}) => {
3435
+ const {
3436
+ data: { attributes: tag }
3437
+ } = await metastoreClient.repository.createMetaObject({
3438
+ objectType: ObjectType.TAG,
3439
+ data,
3440
+ name: generateUUID(),
3441
+ ...meta
3442
+ });
3443
+ return tag;
3444
+ };
3445
+ const updateTag = async (tagUUID, data, meta = {}) => {
3446
+ const {
3447
+ data: { attributes: tag }
3448
+ } = await metastoreClient.repository.updateMetaObject({
3449
+ objectType: ObjectType.TAG,
3450
+ UUID: tagUUID,
3451
+ data,
3452
+ ...meta
3453
+ });
3454
+ return tag;
3455
+ };
3456
+ const deleteTag = async (tagUUID) => {
3457
+ const allBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING);
3458
+ const tagBindings = allBindings.filter(({ data }) => data.tagUUID === tagUUID);
3459
+ await Promise.all([
3460
+ // delete tag itself
3461
+ metastoreClient.repository.deleteMetaObject({
3462
+ objectType: ObjectType.TAG,
3463
+ UUID: tagUUID
3464
+ }),
3465
+ // delete all tag associations
3466
+ _deleteTagBindings(tagBindings)
3467
+ ]);
3468
+ };
3469
+ const assignTags = async (tagUUIDs, objectId, meta = {}) => {
3470
+ const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectId);
3471
+ const unassignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] === null);
3472
+ await concurrent({
3473
+ items: unassignedTagUUIDs,
3474
+ process: async (tagUUID) => metastoreClient.repository.createMetaObject({
3475
+ objectType: ObjectType.TAG_BINDING,
3476
+ data: {
3477
+ objectUID: keboolaUID.serialize(objectId),
3478
+ tagUUID
3479
+ },
3480
+ name: generateUUID(),
3481
+ ...meta
3482
+ }),
3483
+ concurrency: 5
3484
+ });
3485
+ };
3486
+ const unassignTags = async (tagUUIDs, objectID) => {
3487
+ const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectID);
3488
+ const assignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] !== null);
3489
+ const tagBindings = assignedTagUUIDs.map((tagUUID) => tagBindingMapByTagId[tagUUID]);
3490
+ await concurrent({
3491
+ items: tagBindings,
3492
+ process: async (tagBinding) => metastoreClient.repository.deleteMetaObject({
3493
+ objectType: ObjectType.TAG_BINDING,
3494
+ UUID: tagBinding.uuid
3495
+ }),
3496
+ concurrency: 5
3497
+ });
3498
+ };
3499
+ const unassignAllTags = async (objectID, signal) => {
3500
+ const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
3501
+ const objectsTagBindings = tagBindings.filter(
3502
+ ({ data }) => data.objectUID === keboolaUID.serialize(objectID)
3503
+ );
3504
+ await _deleteTagBindings(objectsTagBindings);
3505
+ };
3506
+ const createAndAssignTag = async (data, objectId, meta = {}) => {
3507
+ const tag = await createTag(data, meta);
3508
+ await assignTags([tag.uuid], objectId, meta);
3509
+ return tag;
3510
+ };
3511
+ return {
3512
+ // retrievals
3513
+ getTags,
3514
+ getTagsByObjectId,
3515
+ // modifications
3516
+ createTag,
3517
+ updateTag,
3518
+ deleteTag,
3519
+ assignTags,
3520
+ unassignTags,
3521
+ unassignAllTags,
3522
+ createAndAssignTag
3523
+ };
3524
+ };
3525
+
3526
+ // src/serviceClientRegistry/utils.ts
3527
+ var isBuiltInProperty = (property) => typeof property === "symbol" || property === "then" || property === "constructor" || property === "toString" || property === "valueOf";
3528
+ var createDummyClient = ({
3529
+ onCall
3530
+ }) => {
3531
+ const createProxy = (path = []) => new Proxy(() => {
3532
+ }, {
3533
+ // Create a new proxy for nested property access
3534
+ get: (_target, prop) => {
3535
+ if (isBuiltInProperty(prop)) return void 0;
3536
+ return createProxy([...path, prop]);
3537
+ },
3538
+ // When called as a function, invoke the interceptor
3539
+ apply: (_target, _thisArgs, args) => onCall(path, args)
3540
+ });
3541
+ return createProxy();
3542
+ };
3543
+
3544
+ // src/serviceClientRegistry/createServiceClientRegistry.ts
3545
+ var createServiceClientRegistry = () => ({
3546
+ getServiceBaseUrl,
3547
+ onUnavailable,
3548
+ clients
3549
+ }) => {
3550
+ const dummy = (serviceId, clientName) => createDummyClient({
3551
+ onCall: (path, args) => {
3552
+ onUnavailable?.({
3553
+ serviceId,
3554
+ path,
3555
+ args,
3556
+ clientName
3557
+ });
3558
+ }
3559
+ });
3560
+ const clientMap = {};
3561
+ const meta = [];
3562
+ clients.forEach(({ serviceId, clientFn, clientName }) => {
3563
+ const serviceBaseUrl = getServiceBaseUrl(serviceId);
3564
+ clientMap[clientName] = serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);
3565
+ meta.push({ clientName, serviceId, isAvailable: !!serviceBaseUrl });
3566
+ });
3567
+ const client = clientMap;
3568
+ return {
3569
+ client,
3570
+ meta
3571
+ };
3572
+ };
3573
+
3574
+ // src/client.ts
3575
+ var createClients = async ({
3576
+ baseUrl,
3577
+ token,
3578
+ callbacks,
3579
+ assetsBaseUrl,
3580
+ statusBaseUrl,
3581
+ metastoreBaseUrl,
3582
+ clientServiceUrls,
3583
+ storageMiddlewares
3584
+ }) => {
3585
+ const callbackMiddleware = createCallbackMiddleware(callbacks);
3586
+ const storageTokenMiddleware = createStorageTokenMiddleware(token.storageApi);
3587
+ const commonMiddlewares = [callbackMiddleware, storageTokenMiddleware];
3588
+ const storage = createStorageClient({
3589
+ baseUrl,
3590
+ middlewares: [...commonMiddlewares, ...storageMiddlewares || []]
3591
+ });
3592
+ const management = createManagementClient({
3593
+ baseUrl,
3594
+ token: token.managementApi,
3595
+ callbacks
3596
+ });
3597
+ const [stackInfo, sapiToken] = await Promise.all([
3598
+ storage.getStackInfo({
3599
+ exclude: "componentDetails"
3600
+ }),
3601
+ storage.tokens.verify()
3602
+ ]);
3603
+ const stack = createStack({ stackInfo, clientServiceUrls });
3604
+ const project = createProject({ sapiToken });
3605
+ const { client, meta } = createServiceClientRegistry()({
3606
+ getServiceBaseUrl: (serviceId) => stack.getServiceUrl(serviceId),
3607
+ onUnavailable: ({ serviceId, path, clientName }) => {
3608
+ throw new ServiceUnavailableError(serviceId, path, clientName);
3609
+ },
3610
+ clients: [
3611
+ {
3612
+ serviceId: "vault",
3613
+ clientName: "vault",
3614
+ clientFn: (serviceBaseUrl) => createVaultClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3615
+ },
3616
+ {
3617
+ serviceId: "data-science",
3618
+ clientName: "dataScience",
3619
+ clientFn: (serviceBaseUrl) => createDataScienceClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3620
+ },
3621
+ {
3622
+ serviceId: "encryption",
3623
+ clientName: "encryption",
3624
+ clientFn: (serviceBaseUrl) => createEncryptionClient({ baseUrl: serviceBaseUrl, middlewares: [callbackMiddleware] })
3625
+ },
3626
+ {
3627
+ serviceId: "editor",
3628
+ clientName: "editor",
3629
+ clientFn: (serviceBaseUrl) => createEditorClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3630
+ },
3631
+ {
3632
+ serviceId: "sync-actions",
3633
+ clientName: "syncActions",
3634
+ clientFn: (serviceBaseUrl) => createSyncActionsClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3635
+ },
3636
+ {
3637
+ serviceId: "telemetry",
3638
+ clientName: "telemetry",
3639
+ clientFn: (serviceBaseUrl) => createTelemetryClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3640
+ },
3641
+ {
3642
+ serviceId: "query",
3643
+ clientName: "queryService",
3644
+ clientFn: (serviceBaseUrl) => createQueryServiceClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3645
+ },
3646
+ {
3647
+ serviceId: "queue",
3648
+ clientName: "queue",
3649
+ clientFn: (serviceBaseUrl) => createQueueClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3650
+ },
3651
+ {
3652
+ serviceId: "kai-assistant",
3653
+ clientName: "chat",
3654
+ clientFn: (serviceBaseUrl) => createChatClient({
3655
+ storageApiUrl: baseUrl,
3656
+ baseUrl: serviceBaseUrl,
3657
+ middlewares: commonMiddlewares
3658
+ })
3659
+ },
3660
+ {
3661
+ serviceId: "ai",
3662
+ clientName: "ai",
3663
+ clientFn: (serviceBaseUrl) => createAiClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3664
+ },
3665
+ {
3666
+ serviceId: "import",
3667
+ clientName: "import",
3668
+ clientFn: (serviceBaseUrl) => createImportClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3669
+ },
3670
+ {
3671
+ serviceId: "kai-agent",
3672
+ clientName: "kaiAgent",
3673
+ clientFn: (serviceBaseUrl) => createKaiAgentClient({
3674
+ baseUrl: serviceBaseUrl,
3675
+ middlewares: commonMiddlewares
3676
+ })
3677
+ }
3678
+ ]
3679
+ });
3680
+ const metastore = createMetastoreClient({
3681
+ baseUrl: metastoreBaseUrl,
3682
+ middlewares: commonMiddlewares
3683
+ });
3684
+ const assets = createAssetsClient({
3685
+ baseUrl: assetsBaseUrl,
3686
+ middlewares: [callbackMiddleware]
3687
+ });
3688
+ const status = createStatusClient({
3689
+ baseUrl: statusBaseUrl,
3690
+ middlewares: [callbackMiddleware]
3691
+ });
3692
+ const tag = createTagSdk({
3693
+ metastoreClient: metastore
3694
+ });
3695
+ const storageSdk = createStorageSdk({
3696
+ storageClient: storage
3697
+ });
3698
+ return {
3699
+ // info
3700
+ stack,
3701
+ project,
3702
+ serviceMeta: meta,
3703
+ // clients
3704
+ storage,
3705
+ assets,
3706
+ status,
3707
+ management,
3708
+ ...client,
3709
+ sdk: {
3710
+ tag,
3711
+ storage: storageSdk
3712
+ }
3713
+ };
3714
+ };
3715
+ var createApiClient = () => {
3716
+ let clients = null;
3717
+ const init = async (options) => {
3718
+ if (clients) throw new Error("API is already initialized.");
3719
+ clients = await createClients(options);
3720
+ };
3721
+ const result = { init };
3722
+ const handler = {
3723
+ get(_, property) {
3724
+ if (isBuiltInProperty(property)) return void 0;
3725
+ if (property === "init") return init;
3726
+ assert(clients, `API is not initialized. Call init() before accessing ${String(property)}`);
3727
+ return clients[property];
3728
+ }
3729
+ };
3730
+ return new Proxy(result, handler);
3731
+ };
3732
+
3733
+ // src/middlewares/loggingMiddleware.ts
3734
+ var CORRELATION_ID_HEADER = "X-Correlation-ID";
3735
+ var ALWAYS_REDACTED_HEADERS = [
3736
+ KeboolaHttpHeader.MANAGEMENT_API_TOKEN,
3737
+ KeboolaHttpHeader.STORAGE_API_TOKEN
3738
+ ];
3739
+ var ALWAYS_REDACTED_QUERY_PARAMS = /* @__PURE__ */ new Set([
3740
+ "token",
3741
+ "apikey",
3742
+ "api_key",
3743
+ "access_token",
3744
+ "refresh_token",
3745
+ "code",
3746
+ "state",
3747
+ "signature",
3748
+ "sig",
3749
+ "x-amz-signature",
3750
+ "x-amz-credential",
3751
+ "x-amz-security-token",
3752
+ "password",
3753
+ "secret"
3754
+ ]);
3755
+ var REDACTED = "[REDACTED]";
3756
+ var getRedactedUrl = (rawUrl) => {
3757
+ const url = new URL(rawUrl);
3758
+ if (url.username) url.username = REDACTED;
3759
+ if (url.password) url.password = REDACTED;
3760
+ url.searchParams.forEach((_value, key) => {
3761
+ if (ALWAYS_REDACTED_QUERY_PARAMS.has(key.toLowerCase())) {
3762
+ url.searchParams.set(key, REDACTED);
3763
+ }
3764
+ });
3765
+ return url.toString();
3766
+ };
3767
+ var ensureCorrelationId = (request) => {
3768
+ const correlationId = request.headers.get(CORRELATION_ID_HEADER) ?? generateUUID();
3769
+ request.headers.set(CORRELATION_ID_HEADER, correlationId);
3770
+ return correlationId;
3771
+ };
3772
+ var getRedactedHeaders = (headers, redacted) => {
3773
+ const redactedSet = new Set(
3774
+ [...ALWAYS_REDACTED_HEADERS, ...redacted].map((h) => h.toLowerCase())
3775
+ );
3776
+ const result = {};
3777
+ headers.forEach((value, name) => {
3778
+ result[name] = redactedSet.has(name.toLowerCase()) ? REDACTED : value;
3779
+ });
3780
+ return result;
3781
+ };
3782
+ var getRequestLog = (request, redactedHeaders) => ({
3783
+ url: getRedactedUrl(request.url),
3784
+ headers: getRedactedHeaders(request.headers, redactedHeaders)
3785
+ });
3786
+ var getResponseLog = (response, redactedHeaders) => ({
3787
+ status: response.status,
3788
+ statusText: response.statusText,
3789
+ headers: getRedactedHeaders(response.headers, redactedHeaders)
3790
+ });
3791
+ var formatLog = (level, log) => {
3792
+ const parts = [`[${level.toUpperCase()}]`, `${Math.round(log.durationMs)}ms`, log.method];
3793
+ parts.push(log.request.url);
3794
+ if (log.response) parts.push(String(log.response.status));
3795
+ return parts.join(" ");
3796
+ };
3797
+ var consoleLogger = {
3798
+ info: (log) => console.info(formatLog("info", log)),
3799
+ error: (log) => console.error(formatLog("error", log))
3800
+ };
3801
+ var wrapSafe = (logger, level) => ({
3802
+ info: (log) => {
3803
+ if (level !== "all") return;
3804
+ try {
3805
+ logger.info(log);
3806
+ } catch {
3807
+ }
3808
+ },
3809
+ error: (log) => {
3810
+ try {
3811
+ logger.error(log);
3812
+ } catch {
3813
+ }
3814
+ }
3815
+ });
3816
+ var createLoggingMiddleware = (options = {}) => {
3817
+ const safeLogger = wrapSafe(options.logger ?? consoleLogger, options.level ?? "error-only");
3818
+ const redactHeaders = options.redactHeaders ?? [];
3819
+ return (next) => async (fetchRequest) => {
3820
+ const correlationId = ensureCorrelationId(fetchRequest.request);
3821
+ const start = performance.now();
3822
+ const method = fetchRequest.request.method.toLowerCase();
3823
+ const requestLog = getRequestLog(fetchRequest.request, redactHeaders);
3824
+ try {
3825
+ const result = await next(fetchRequest);
3826
+ safeLogger.info({
3827
+ correlationId,
3828
+ method,
3829
+ durationMs: performance.now() - start,
3830
+ request: requestLog,
3831
+ response: getResponseLog(result.response, redactHeaders)
3832
+ });
3833
+ return result;
3834
+ } catch (error) {
3835
+ const durationMs = performance.now() - start;
3836
+ if (error instanceof Error) {
3837
+ safeLogger.error({ correlationId, method, durationMs, request: requestLog, error });
3838
+ }
3839
+ throw error;
3840
+ }
3841
+ };
3842
+ };
3843
+
3844
+ // src/middlewares/retryMiddleware.ts
3845
+ var DEFAULT_MAX_RETRIES = 5;
3846
+ var DEFAULT_RETRYABLE_STATUSES = [500, 502, 503, 504];
3847
+ var DEFAULT_BACKOFF_FACTOR = 0.3;
3848
+ var defaultShouldRetry = (error) => error instanceof ApiError && DEFAULT_RETRYABLE_STATUSES.includes(error.response.status);
3849
+ var createRetryMiddleware = (options) => {
3850
+ const {
3851
+ maxRetries = DEFAULT_MAX_RETRIES,
3852
+ backoffFactor = DEFAULT_BACKOFF_FACTOR,
3853
+ shouldRetry = defaultShouldRetry
3854
+ } = options ?? {};
3855
+ if (!Number.isInteger(maxRetries) || maxRetries < 0) {
3856
+ throw new RangeError("maxRetries must be a non-negative integer");
3857
+ }
3858
+ if (!Number.isFinite(backoffFactor) || backoffFactor < 0) {
3859
+ throw new RangeError("backoffFactor must be a finite non-negative number");
3860
+ }
3861
+ return (next) => async (request) => {
3862
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
3863
+ try {
3864
+ return await next({ ...request, request: request.request.clone() });
3865
+ } catch (error) {
3866
+ if (attempt === maxRetries || !shouldRetry(error, attempt)) {
3867
+ throw error;
3868
+ }
3869
+ const delayMs = backoffFactor * 1e3 * Math.pow(2, attempt);
3870
+ await delay(delayMs, request.request.signal ?? void 0);
3871
+ }
3872
+ }
3873
+ throw new Error("unreachable");
3874
+ };
3875
+ };
3876
+
3877
+ // src/devClient.ts
3878
+ var createDevApiClient = () => ({
3879
+ verify: createVerifyClient()
3880
+ });
3881
+
3882
+ exports.ApiError = ApiError;
3883
+ exports.HttpContentType = HttpContentType;
3884
+ exports.HttpHeader = HttpHeader;
3885
+ exports.KeboolaHttpHeader = KeboolaHttpHeader;
3886
+ exports.ManagementClientAuthError = ManagementClientAuthError;
3887
+ exports.PollException = PollException;
3888
+ exports.ServiceUnavailableError = ServiceUnavailableError;
3889
+ exports.UserError = UserError;
3890
+ exports.assert = assert;
3891
+ exports.concurrent = concurrent;
3892
+ exports.consoleLogger = consoleLogger;
3893
+ exports.createApiClient = createApiClient;
3894
+ exports.createDevApiClient = createDevApiClient;
3895
+ exports.createGenericFetchClient = createGenericFetchClient;
3896
+ exports.createLoggingMiddleware = createLoggingMiddleware;
3897
+ exports.createRetryMiddleware = createRetryMiddleware;
3898
+ exports.createStorageSdk = createStorageSdk;
3899
+ exports.delay = delay;
3900
+ exports.generateUUID = generateUUID;
3901
+ exports.isAbortError = isAbortError;
3902
+ exports.isApiError = isApiError;
3903
+ exports.isFetchClientError = isFetchClientError;
3904
+ exports.isManagementClientAuthError = isManagementClientAuthError;
3905
+ exports.keboolaUID = keboolaUID;
3906
+ exports.parseLogLines = parseLogLines;
3907
+ exports.poll = poll;
3908
+ exports.series = series;
3909
+ //# sourceMappingURL=index.cjs.map
3910
+ //# sourceMappingURL=index.cjs.map