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