@keboola/api-client 0.1.0 → 1.0.1

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 (138) hide show
  1. package/README.md +18 -1
  2. package/dist/ai/index.cjs +7 -1
  3. package/dist/ai/index.cjs.map +1 -1
  4. package/dist/ai/index.js +7 -1
  5. package/dist/ai/index.js.map +1 -1
  6. package/dist/assets/index.cjs +7 -1
  7. package/dist/assets/index.cjs.map +1 -1
  8. package/dist/assets/index.js +7 -1
  9. package/dist/assets/index.js.map +1 -1
  10. package/dist/chat/index.cjs +3 -1
  11. package/dist/chat/index.cjs.map +1 -1
  12. package/dist/chat/index.d.cts +1 -1
  13. package/dist/chat/index.d.ts +1 -1
  14. package/dist/chat/index.js +3 -1
  15. package/dist/chat/index.js.map +1 -1
  16. package/dist/chat/types.d.cts +1 -1
  17. package/dist/chat/types.d.ts +1 -1
  18. package/dist/constants/index.cjs +145 -0
  19. package/dist/constants/index.cjs.map +1 -0
  20. package/dist/constants/index.d.cts +28 -0
  21. package/dist/constants/index.d.ts +28 -0
  22. package/dist/constants/index.js +142 -0
  23. package/dist/constants/index.js.map +1 -0
  24. package/dist/dataScience/index.cjs +7 -2
  25. package/dist/dataScience/index.cjs.map +1 -1
  26. package/dist/dataScience/index.js +7 -2
  27. package/dist/dataScience/index.js.map +1 -1
  28. package/dist/domain/permissions/index.cjs +13 -0
  29. package/dist/domain/permissions/index.cjs.map +1 -0
  30. package/dist/domain/permissions/index.d.cts +5 -0
  31. package/dist/domain/permissions/index.d.ts +5 -0
  32. package/dist/domain/permissions/index.js +11 -0
  33. package/dist/domain/permissions/index.js.map +1 -0
  34. package/dist/editor/index.cjs +7 -10
  35. package/dist/editor/index.cjs.map +1 -1
  36. package/dist/editor/index.d.cts +11 -19
  37. package/dist/editor/index.d.ts +11 -19
  38. package/dist/editor/index.js +7 -10
  39. package/dist/editor/index.js.map +1 -1
  40. package/dist/editor/types.d.cts +1 -1
  41. package/dist/editor/types.d.ts +1 -1
  42. package/dist/encryption/index.cjs +7 -1
  43. package/dist/encryption/index.cjs.map +1 -1
  44. package/dist/encryption/index.js +7 -1
  45. package/dist/encryption/index.js.map +1 -1
  46. package/dist/import/index.cjs +7 -1
  47. package/dist/import/index.cjs.map +1 -1
  48. package/dist/import/index.js +7 -1
  49. package/dist/import/index.js.map +1 -1
  50. package/dist/index.cjs +308 -42
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +1085 -122
  53. package/dist/index.d.ts +1085 -122
  54. package/dist/index.js +308 -42
  55. package/dist/index.js.map +1 -1
  56. package/dist/management/index.cjs +40 -23
  57. package/dist/management/index.cjs.map +1 -1
  58. package/dist/management/index.d.cts +59 -23
  59. package/dist/management/index.d.ts +59 -23
  60. package/dist/management/index.js +40 -23
  61. package/dist/management/index.js.map +1 -1
  62. package/dist/management/types.d.cts +2 -2
  63. package/dist/management/types.d.ts +2 -2
  64. package/dist/metastore/index.cjs +7 -1
  65. package/dist/metastore/index.cjs.map +1 -1
  66. package/dist/metastore/index.js +7 -1
  67. package/dist/metastore/index.js.map +1 -1
  68. package/dist/oauth/index.cjs +234 -0
  69. package/dist/oauth/index.cjs.map +1 -0
  70. package/dist/oauth/index.d.cts +12 -0
  71. package/dist/oauth/index.d.ts +12 -0
  72. package/dist/oauth/index.js +228 -0
  73. package/dist/oauth/index.js.map +1 -0
  74. package/dist/oauth/types.cjs +4 -0
  75. package/dist/oauth/types.cjs.map +1 -0
  76. package/dist/oauth/types.d.cts +34 -0
  77. package/dist/oauth/types.d.ts +34 -0
  78. package/dist/oauth/types.js +3 -0
  79. package/dist/oauth/types.js.map +1 -0
  80. package/dist/queryService/index.cjs +7 -1
  81. package/dist/queryService/index.cjs.map +1 -1
  82. package/dist/queryService/index.js +7 -1
  83. package/dist/queryService/index.js.map +1 -1
  84. package/dist/queue/index.cjs +7 -1
  85. package/dist/queue/index.cjs.map +1 -1
  86. package/dist/queue/index.js +7 -1
  87. package/dist/queue/index.js.map +1 -1
  88. package/dist/sdk/configurations/index.cjs +14 -0
  89. package/dist/sdk/configurations/index.cjs.map +1 -0
  90. package/dist/sdk/configurations/index.d.cts +24 -0
  91. package/dist/sdk/configurations/index.d.ts +24 -0
  92. package/dist/sdk/configurations/index.js +11 -0
  93. package/dist/sdk/configurations/index.js.map +1 -0
  94. package/dist/sdk/storage/index.cjs +179 -1
  95. package/dist/sdk/storage/index.cjs.map +1 -1
  96. package/dist/sdk/storage/index.d.cts +118 -13
  97. package/dist/sdk/storage/index.d.ts +118 -13
  98. package/dist/sdk/storage/index.js +169 -2
  99. package/dist/sdk/storage/index.js.map +1 -1
  100. package/dist/status/index.cjs +7 -1
  101. package/dist/status/index.cjs.map +1 -1
  102. package/dist/status/index.js +7 -1
  103. package/dist/status/index.js.map +1 -1
  104. package/dist/storage/index.cjs +107 -9
  105. package/dist/storage/index.cjs.map +1 -1
  106. package/dist/storage/index.d.cts +1 -1
  107. package/dist/storage/index.d.ts +1 -1
  108. package/dist/storage/index.js +107 -9
  109. package/dist/storage/index.js.map +1 -1
  110. package/dist/storage/types.d.cts +2977 -1306
  111. package/dist/storage/types.d.ts +2977 -1306
  112. package/dist/{storageClient-DPLh_p0V.d.cts → storageClient-DSLTM3Cr.d.cts} +20 -1
  113. package/dist/{storageClient-YVWer22Y.d.ts → storageClient-DrYOs4Xm.d.ts} +20 -1
  114. package/dist/storageSdk-BBqAo0Vx.d.cts +143 -0
  115. package/dist/storageSdk-ZVmKQQSl.d.ts +143 -0
  116. package/dist/syncActions/index.cjs +7 -1
  117. package/dist/syncActions/index.cjs.map +1 -1
  118. package/dist/syncActions/index.js +7 -1
  119. package/dist/syncActions/index.js.map +1 -1
  120. package/dist/telemetry/index.cjs +7 -1
  121. package/dist/telemetry/index.cjs.map +1 -1
  122. package/dist/telemetry/index.js +7 -1
  123. package/dist/telemetry/index.js.map +1 -1
  124. package/dist/{types-B7k8S4ki.d.ts → types-B--u7l2H.d.ts} +33 -118
  125. package/dist/{types-BeShtGlc.d.cts → types-BTcT8Q0T.d.cts} +15 -1
  126. package/dist/{types-BeShtGlc.d.ts → types-BTcT8Q0T.d.ts} +15 -1
  127. package/dist/{types-BNQK_jR_.d.cts → types-C0Owx2P7.d.cts} +33 -118
  128. package/dist/{types-DJ6nbNq5.d.cts → types-CNkgmuhe.d.cts} +1 -1
  129. package/dist/{types-BjrNNn5I.d.ts → types-DzwzVgyG.d.ts} +1 -1
  130. package/dist/vault/index.cjs +3 -1
  131. package/dist/vault/index.cjs.map +1 -1
  132. package/dist/vault/index.js +3 -1
  133. package/dist/vault/index.js.map +1 -1
  134. package/dist/verify/index.cjs +3 -1
  135. package/dist/verify/index.cjs.map +1 -1
  136. package/dist/verify/index.js +3 -1
  137. package/dist/verify/index.js.map +1 -1
  138. package/package.json +71 -5
package/dist/index.js CHANGED
@@ -45,6 +45,25 @@ var ServiceUnavailableError = class _ServiceUnavailableError extends Error {
45
45
  Object.setPrototypeOf(this, _ServiceUnavailableError.prototype);
46
46
  }
47
47
  };
48
+
49
+ // src/constants.ts
50
+ var KeboolaHttpHeader = {
51
+ STORAGE_API_TOKEN: "X-StorageApi-Token",
52
+ MANAGEMENT_API_TOKEN: "X-Kbc-Manageapitoken",
53
+ STORAGE_API_URL: "x-storageapi-url"
54
+ };
55
+ var HttpStatus = {
56
+ NO_CONTENT: 204,
57
+ BAD_REQUEST: 400,
58
+ UNPROCESSABLE_ENTITY: 422,
59
+ INTERNAL_SERVER_ERROR: 500,
60
+ BAD_GATEWAY: 502,
61
+ SERVICE_UNAVAILABLE: 503,
62
+ GATEWAY_TIMEOUT: 504
63
+ };
64
+ var ENCRYPTED_VALUE_PREFIX = "KBC::";
65
+
66
+ // src/fetchClient/createFetchClient/utils.ts
48
67
  var HttpHeader = {
49
68
  CONTENT_TYPE: "content-type",
50
69
  CONTENT_DISPOSITION: "content-disposition"
@@ -64,7 +83,7 @@ function removeUndefined(obj) {
64
83
  return objCopy;
65
84
  }
66
85
  var parseData = async (response) => {
67
- if (response.status === 204) return null;
86
+ if (response.status === HttpStatus.NO_CONTENT) return null;
68
87
  const contentType = response.headers.get(HttpHeader.CONTENT_TYPE);
69
88
  if (contentType && contentType == HttpContentType.JSON) {
70
89
  return response.json();
@@ -284,14 +303,6 @@ var createAssetsClient = ({ baseUrl, middlewares }) => {
284
303
  getPublishedChangelogPosts
285
304
  };
286
305
  };
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
306
  var SUGGESTION_CATEGORIES = ["error", "maintenance", "documentation"];
296
307
  var suggestionCategorySchema = z.enum(SUGGESTION_CATEGORIES);
297
308
  var suggestionSchema = z.object({
@@ -692,7 +703,7 @@ var createDataScienceClient = ({ baseUrl, middlewares }) => {
692
703
  nextLogTimestamp
693
704
  };
694
705
  } catch (error) {
695
- if (isApiError(error) && error.response.status === 400 && TailError.safeParse(error.data).data?.context?.code === "apps.appNotRunning") {
706
+ if (isApiError(error) && error.response.status === HttpStatus.BAD_REQUEST && TailError.safeParse(error.data).data?.context?.code === "apps.appNotRunning") {
696
707
  return { entries: [], nextLogTimestamp: null };
697
708
  }
698
709
  throw error;
@@ -835,14 +846,6 @@ var createEditorClient = ({ baseUrl, middlewares }) => {
835
846
  });
836
847
  return data;
837
848
  };
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
849
  const resetWorkspacePassword = async (id) => {
847
850
  const { data } = await client.post(`/sql/sessions/{id}/reset-password`, {
848
851
  path: { id }
@@ -867,7 +870,6 @@ var createEditorClient = ({ baseUrl, middlewares }) => {
867
870
  tableDefinition,
868
871
  load,
869
872
  unload,
870
- getWorkspacePassword,
871
873
  resetWorkspacePassword,
872
874
  getSessionCredentials
873
875
  };
@@ -959,6 +961,24 @@ var toolInfoSchema2 = z.object({
959
961
  var toolsListResponseSchema2 = z.object({
960
962
  tools: z.array(toolInfoSchema2)
961
963
  });
964
+ var sandboxFileEntrySchema = z.object({
965
+ name: z.string(),
966
+ path: z.string(),
967
+ type: z.enum(["file", "dir"]),
968
+ size: z.number().int().nonnegative().optional()
969
+ });
970
+ var sandboxFileListingSchema = z.object({
971
+ entries: z.array(sandboxFileEntrySchema)
972
+ });
973
+ var sandboxFileContentSchema = z.object({
974
+ content: z.string(),
975
+ encoding: z.enum(["utf-8", "binary"]),
976
+ truncated: z.boolean(),
977
+ size: z.number().int().nonnegative()
978
+ });
979
+ var sandboxGitBranchSchema = z.object({
980
+ branch: z.string().nullable()
981
+ });
962
982
  var createKaiAgentClient = ({ baseUrl, middlewares }) => {
963
983
  const clientOptions = { baseUrl, middlewares };
964
984
  const client = createOpenapiFetchClient(clientOptions);
@@ -996,6 +1016,10 @@ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
996
1016
  const submitToolOutput = async (chatId, body) => {
997
1017
  await client.post("/api/chat/{id}/ui-tool-result", { path: { id: chatId }, body });
998
1018
  };
1019
+ const stopChat = async (chatId) => {
1020
+ const { data } = await client.post("/api/chat/{id}/stop", { path: { id: chatId } });
1021
+ return data;
1022
+ };
999
1023
  const getSuggestions = async (request, signal) => {
1000
1024
  const { data } = await genericClient.post(
1001
1025
  "/api/suggestions",
@@ -1064,6 +1088,42 @@ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
1064
1088
  }
1065
1089
  return result.data;
1066
1090
  };
1091
+ const listSandboxFiles = async (chatId, path, signal) => {
1092
+ const { data } = await genericClient.get(
1093
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/files`,
1094
+ { query: path ? { path } : void 0 },
1095
+ { signal }
1096
+ );
1097
+ const result = sandboxFileListingSchema.safeParse(data);
1098
+ if (!result.success) {
1099
+ throw new Error("Invalid sandbox files response format");
1100
+ }
1101
+ return result.data;
1102
+ };
1103
+ const readSandboxFile = async (chatId, path, signal) => {
1104
+ const { data } = await genericClient.get(
1105
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/file`,
1106
+ { query: { path } },
1107
+ { signal }
1108
+ );
1109
+ const result = sandboxFileContentSchema.safeParse(data);
1110
+ if (!result.success) {
1111
+ throw new Error("Invalid sandbox file response format");
1112
+ }
1113
+ return result.data;
1114
+ };
1115
+ const getSandboxGitBranch = async (chatId, signal) => {
1116
+ const { data } = await genericClient.get(
1117
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/git-branch`,
1118
+ {},
1119
+ { signal }
1120
+ );
1121
+ const result = sandboxGitBranchSchema.safeParse(data);
1122
+ if (!result.success) {
1123
+ throw new Error("Invalid sandbox git-branch response format");
1124
+ }
1125
+ return result.data;
1126
+ };
1067
1127
  const chatStreamUrl = baseUrl + "/api/chat";
1068
1128
  return {
1069
1129
  getHistory,
@@ -1075,12 +1135,16 @@ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
1075
1135
  getUsage,
1076
1136
  approveToolCall,
1077
1137
  submitToolOutput,
1138
+ stopChat,
1078
1139
  getSuggestions,
1079
1140
  getAgentSettings,
1080
1141
  updateAgentSettings,
1081
1142
  getUserAgentSettings,
1082
1143
  updateUserAgentSettings,
1083
1144
  getToolsList,
1145
+ listSandboxFiles,
1146
+ readSandboxFile,
1147
+ getSandboxGitBranch,
1084
1148
  chatStreamUrl
1085
1149
  };
1086
1150
  };
@@ -1108,6 +1172,7 @@ var createVerifyClient = () => {
1108
1172
  };
1109
1173
 
1110
1174
  // src/clients/management/authMiddleware.ts
1175
+ var TOKEN_CACHE_TTL_MS = 6e4;
1111
1176
  var isManagementClientAuthError = (error) => error instanceof ManagementClientAuthError;
1112
1177
  var createAuth = (baseUrl) => {
1113
1178
  const fetchClient = createGenericFetchClient({ baseUrl });
@@ -1153,18 +1218,34 @@ var createAuthMiddleware = ({
1153
1218
  const auth = createAuth(baseUrl);
1154
1219
  const verify = createVerifyClient();
1155
1220
  let token = accessToken;
1221
+ let tokenValidUntil = 0;
1222
+ let inflightAuth = null;
1156
1223
  const isDevelopment = process.env.NODE_ENV === "development";
1157
- return (next) => async (request) => {
1158
- if (!!token) {
1224
+ const ensureValidToken = async () => {
1225
+ if (token && Date.now() < tokenValidUntil) return token;
1226
+ if (token) {
1159
1227
  const tokenInfo = await verify.managementApiToken(baseUrl, token);
1160
1228
  const isTokenValid = !tokenInfo.isDisabled && !tokenInfo.isExpired;
1161
- if (!isTokenValid) {
1162
- token = isDevelopment ? await auth.createCurrentUserSessionToken(token) : await auth.createAdminAccountSessionToken();
1229
+ if (isTokenValid) {
1230
+ tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1231
+ return token;
1163
1232
  }
1164
- } else {
1165
- token = await auth.createAdminAccountSessionToken();
1233
+ token = isDevelopment ? await auth.createCurrentUserSessionToken(token) : await auth.createAdminAccountSessionToken();
1234
+ tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1235
+ return token;
1236
+ }
1237
+ token = await auth.createAdminAccountSessionToken();
1238
+ tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1239
+ return token;
1240
+ };
1241
+ return (next) => async (request) => {
1242
+ if (!inflightAuth) {
1243
+ inflightAuth = ensureValidToken().finally(() => {
1244
+ inflightAuth = null;
1245
+ });
1166
1246
  }
1167
- request.request.headers.set(KeboolaHttpHeader.MANAGEMENT_API_TOKEN, token);
1247
+ const validToken = await inflightAuth;
1248
+ request.request.headers.set(KeboolaHttpHeader.MANAGEMENT_API_TOKEN, validToken);
1168
1249
  return next(request);
1169
1250
  };
1170
1251
  };
@@ -1368,14 +1449,6 @@ var createMaintainers = (client) => {
1368
1449
  path: { id: maintainerId, invitationId }
1369
1450
  });
1370
1451
  };
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
1452
  const createMaintainerOrganization = async ({
1380
1453
  maintainerId,
1381
1454
  ...body
@@ -1425,7 +1498,6 @@ var createMaintainers = (client) => {
1425
1498
  getMaintainerInvitation,
1426
1499
  createMaintainerInvitation,
1427
1500
  deleteMaintainerInvitation,
1428
- getMaintainerOrganizations,
1429
1501
  createMaintainerOrganization,
1430
1502
  getMaintainerMetadata,
1431
1503
  setMaintainerMetadata,
@@ -1747,13 +1819,18 @@ var createManagementClient = ({
1747
1819
  baseUrl,
1748
1820
  middlewares
1749
1821
  });
1822
+ const verifyToken = async (signal) => {
1823
+ const { data } = await openApiClient.get("/manage/tokens/verify", {}, { signal });
1824
+ return data;
1825
+ };
1750
1826
  return {
1751
1827
  currentUser: createCurrentUser(openApiClient),
1752
1828
  features: createFeatures(client),
1753
1829
  maintainers: createMaintainers(openApiClient),
1754
1830
  organizations: createOrganizations(openApiClient),
1755
1831
  projects: createProjects(client),
1756
- users: createUsers(client)
1832
+ users: createUsers(client),
1833
+ verifyToken
1757
1834
  };
1758
1835
  };
1759
1836
 
@@ -1933,6 +2010,72 @@ var createMetastoreClient = ({ baseUrl, middlewares }) => {
1933
2010
  };
1934
2011
  };
1935
2012
 
2013
+ // src/clients/oauth/oauthClient.ts
2014
+ var createOauthClient = ({ baseUrl, middlewares }) => {
2015
+ const client = createGenericFetchClient({ baseUrl, middlewares });
2016
+ const getCredentials = async (query, signal) => {
2017
+ const { data } = await client.get(
2018
+ "/credentials",
2019
+ { query },
2020
+ { signal }
2021
+ );
2022
+ return data;
2023
+ };
2024
+ const getCredential = async (componentId, id, signal) => {
2025
+ const { data } = await client.get(
2026
+ "/credentials/{componentId}/{id}",
2027
+ { path: { componentId, id } },
2028
+ { signal }
2029
+ );
2030
+ return data;
2031
+ };
2032
+ const _createCredentials = async (componentId, body, signal) => {
2033
+ const { data } = await client.post(
2034
+ "/credentials/{componentId}",
2035
+ { path: { componentId }, body },
2036
+ { signal }
2037
+ );
2038
+ return data;
2039
+ };
2040
+ const _createLegacyCredentials = async (componentId, { data: credentialsData, ...rest }, signal) => {
2041
+ const { data } = await client.post(
2042
+ "/credentials/{componentId}",
2043
+ {
2044
+ path: { componentId },
2045
+ body: {
2046
+ ...rest,
2047
+ "#data": JSON.stringify(credentialsData)
2048
+ }
2049
+ },
2050
+ { signal }
2051
+ );
2052
+ return data;
2053
+ };
2054
+ const createCredential = async (componentId, body, signal) => {
2055
+ try {
2056
+ return await _createCredentials(componentId, body, signal);
2057
+ } catch (error) {
2058
+ if (isApiError(error) && error.response.status === HttpStatus.UNPROCESSABLE_ENTITY) {
2059
+ return _createLegacyCredentials(componentId, body, signal);
2060
+ }
2061
+ throw error;
2062
+ }
2063
+ };
2064
+ const deleteCredential = async (componentId, id, signal) => {
2065
+ await client.delete(
2066
+ "/credentials/{componentId}/{id}",
2067
+ { path: { componentId, id } },
2068
+ { signal }
2069
+ );
2070
+ };
2071
+ return {
2072
+ getCredentials,
2073
+ getCredential,
2074
+ createCredential,
2075
+ deleteCredential
2076
+ };
2077
+ };
2078
+
1936
2079
  // src/clients/queryService/queryServiceClient.ts
1937
2080
  var createQueryServiceClient = ({ baseUrl, middlewares }) => {
1938
2081
  const client = createOpenapiFetchClient({
@@ -2088,7 +2231,6 @@ var createMergeRequests = (client) => {
2088
2231
  const getMergeRequestWithActivityLog = async (id, signal) => {
2089
2232
  const { data } = await client.get(
2090
2233
  "/v2/storage/merge-request/{id}",
2091
- // @ts-expect-error backend accepts `?include=activityLog`; OpenAPI schema regen pending (connection#7250).
2092
2234
  { path: { id }, query: { include: "activityLog" } },
2093
2235
  { signal }
2094
2236
  );
@@ -2120,11 +2262,18 @@ var createMergeRequests = (client) => {
2120
2262
  const requestChangesMergeRequest = async (id, reason) => {
2121
2263
  const { data } = await client.put("/v2/storage/merge-request/{id}/request-changes", {
2122
2264
  path: { id },
2123
- // @ts-expect-error backend accepts optional `{ reason }` body; OpenAPI schema regen pending (connection#7250).
2124
2265
  body: reason ? { reason } : void 0
2125
2266
  });
2126
2267
  return data;
2127
2268
  };
2269
+ const getMergeRequestConflicts = async (id, signal) => {
2270
+ const { data } = await client.get(
2271
+ "/v2/storage/merge-request/{id}/conflicts",
2272
+ { path: { id } },
2273
+ { signal }
2274
+ );
2275
+ return data;
2276
+ };
2128
2277
  return {
2129
2278
  getMergeRequests,
2130
2279
  getMergeRequest,
@@ -2133,7 +2282,8 @@ var createMergeRequests = (client) => {
2133
2282
  updateMergeRequest,
2134
2283
  requestReview,
2135
2284
  approveMergeRequest,
2136
- requestChangesMergeRequest
2285
+ requestChangesMergeRequest,
2286
+ getMergeRequestConflicts
2137
2287
  };
2138
2288
  };
2139
2289
 
@@ -2214,6 +2364,30 @@ var createBranches = (client) => {
2214
2364
  };
2215
2365
  };
2216
2366
 
2367
+ // src/clients/storage/buckets/listingConversion.ts
2368
+ var toBackendSubscribers = (subscribers) => subscribers.map((s) => `${s.type}:${s.email}`);
2369
+ var fromBackendSubscribers = (raw) => {
2370
+ const result = [];
2371
+ for (const entry of raw) {
2372
+ const colon = entry.indexOf(":");
2373
+ if (colon === -1) continue;
2374
+ const prefix = entry.slice(0, colon);
2375
+ const email2 = entry.slice(colon + 1);
2376
+ if (prefix !== "user" && prefix !== "group") continue;
2377
+ if (email2.length === 0) continue;
2378
+ result.push({ type: prefix, email: email2 });
2379
+ }
2380
+ return result;
2381
+ };
2382
+ var toBucketListing = (raw, bucketId) => ({
2383
+ bucketId,
2384
+ name: raw.name,
2385
+ description: raw.description ?? null,
2386
+ listingId: raw.bigquery.listingId,
2387
+ subscribers: fromBackendSubscribers(raw.bigquery.subscribers),
2388
+ createdAt: raw.createdAt
2389
+ });
2390
+
2217
2391
  // src/clients/storage/buckets/buckets.ts
2218
2392
  var createBuckets = (client) => {
2219
2393
  const getBuckets = async (query = {}, signal) => {
@@ -2265,6 +2439,64 @@ var createBuckets = (client) => {
2265
2439
  path: { taskId }
2266
2440
  });
2267
2441
  };
2442
+ const getListing = async (bucketId, signal) => {
2443
+ try {
2444
+ const { data } = await client.get(
2445
+ `/buckets/{bucketId}/listing`,
2446
+ { path: { bucketId } },
2447
+ { signal }
2448
+ );
2449
+ return toBucketListing(data, bucketId);
2450
+ } catch (error) {
2451
+ if (isApiError(error) && error.response.status === 404) return null;
2452
+ throw error;
2453
+ }
2454
+ };
2455
+ const createListing = async (bucketId, input, signal) => {
2456
+ const { data } = await client.post(
2457
+ `/buckets/{bucketId}/listing`,
2458
+ {
2459
+ path: { bucketId },
2460
+ body: {
2461
+ listingName: input.name,
2462
+ listingDescription: input.description?.trim() || null,
2463
+ bigquery: {
2464
+ listingId: input.listingId,
2465
+ subscribers: toBackendSubscribers(input.subscribers)
2466
+ }
2467
+ }
2468
+ },
2469
+ { signal }
2470
+ );
2471
+ return data;
2472
+ };
2473
+ const updateListing = async (bucketId, input, signal) => {
2474
+ const body = {};
2475
+ if (input.name !== void 0) body.exposureName = input.name;
2476
+ if (input.description !== void 0) {
2477
+ body.exposureDescription = input.description?.trim() || null;
2478
+ }
2479
+ if (input.subscribers !== void 0) {
2480
+ body.bigquery = { subscribers: toBackendSubscribers(input.subscribers) };
2481
+ }
2482
+ if (Object.keys(body).length === 0) {
2483
+ throw new Error("updateListing requires at least one field");
2484
+ }
2485
+ const { data } = await client.patch(`/buckets/{bucketId}/listing`, { path: { bucketId }, body }, { signal });
2486
+ return data;
2487
+ };
2488
+ const deleteListing = async (bucketId, signal) => {
2489
+ const { data } = await client.delete(
2490
+ `/buckets/{bucketId}/listing`,
2491
+ { path: { bucketId } },
2492
+ { signal }
2493
+ );
2494
+ return data;
2495
+ };
2496
+ const listListings = async (signal) => {
2497
+ const { data } = await client.get(`/listings`, {}, { signal });
2498
+ return data.map((row) => toBucketListing(row, row.bucketId));
2499
+ };
2268
2500
  return {
2269
2501
  getBuckets,
2270
2502
  getBucket,
@@ -2273,7 +2505,12 @@ var createBuckets = (client) => {
2273
2505
  deleteBucket,
2274
2506
  deleteBucketAsync,
2275
2507
  createScheduledRefresh,
2276
- deleteScheduledTask
2508
+ deleteScheduledTask,
2509
+ getListing,
2510
+ createListing,
2511
+ updateListing,
2512
+ deleteListing,
2513
+ listListings
2277
2514
  };
2278
2515
  };
2279
2516
 
@@ -3340,10 +3577,29 @@ var createStorageSdk = ({ storageClient }) => {
3340
3577
  const job = await storageClient.tables.exportAsync(tableId, body, options?.abortSignal);
3341
3578
  return waitForJob(job, options);
3342
3579
  };
3580
+ const getBucketListing = async (bucketId, signal) => storageClient.buckets.getListing(bucketId, signal);
3581
+ const listBucketListings = async (signal) => storageClient.buckets.listListings(signal);
3582
+ const createBucketListing = async (bucketId, input, options) => {
3583
+ const job = await storageClient.buckets.createListing(bucketId, input, options?.abortSignal);
3584
+ return waitForJob(job, options);
3585
+ };
3586
+ const updateBucketListing = async (bucketId, input, options) => {
3587
+ const job = await storageClient.buckets.updateListing(bucketId, input, options?.abortSignal);
3588
+ return waitForJob(job, options);
3589
+ };
3590
+ const deleteBucketListing = async (bucketId, options) => {
3591
+ const job = await storageClient.buckets.deleteListing(bucketId, options?.abortSignal);
3592
+ return waitForJob(job, options);
3593
+ };
3343
3594
  return {
3344
3595
  createTable,
3345
3596
  importFromFile,
3346
- exportToFile
3597
+ exportToFile,
3598
+ getBucketListing,
3599
+ listBucketListings,
3600
+ createBucketListing,
3601
+ updateBucketListing,
3602
+ deleteBucketListing
3347
3603
  };
3348
3604
  };
3349
3605
 
@@ -3648,6 +3904,11 @@ var createClients = async ({
3648
3904
  baseUrl: serviceBaseUrl,
3649
3905
  middlewares: commonMiddlewares
3650
3906
  })
3907
+ },
3908
+ {
3909
+ serviceId: "oauth",
3910
+ clientName: "oauth",
3911
+ clientFn: (serviceBaseUrl) => createOauthClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3651
3912
  }
3652
3913
  ]
3653
3914
  });
@@ -3817,7 +4078,12 @@ var createLoggingMiddleware = (options = {}) => {
3817
4078
 
3818
4079
  // src/middlewares/retryMiddleware.ts
3819
4080
  var DEFAULT_MAX_RETRIES = 5;
3820
- var DEFAULT_RETRYABLE_STATUSES = [500, 502, 503, 504];
4081
+ var DEFAULT_RETRYABLE_STATUSES = [
4082
+ HttpStatus.INTERNAL_SERVER_ERROR,
4083
+ HttpStatus.BAD_GATEWAY,
4084
+ HttpStatus.SERVICE_UNAVAILABLE,
4085
+ HttpStatus.GATEWAY_TIMEOUT
4086
+ ];
3821
4087
  var DEFAULT_BACKOFF_FACTOR = 0.3;
3822
4088
  var defaultShouldRetry = (error) => error instanceof ApiError && DEFAULT_RETRYABLE_STATUSES.includes(error.response.status);
3823
4089
  var createRetryMiddleware = (options) => {