@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.cjs CHANGED
@@ -71,6 +71,25 @@ var ServiceUnavailableError = class _ServiceUnavailableError extends Error {
71
71
  Object.setPrototypeOf(this, _ServiceUnavailableError.prototype);
72
72
  }
73
73
  };
74
+
75
+ // src/constants.ts
76
+ var KeboolaHttpHeader = {
77
+ STORAGE_API_TOKEN: "X-StorageApi-Token",
78
+ MANAGEMENT_API_TOKEN: "X-Kbc-Manageapitoken",
79
+ STORAGE_API_URL: "x-storageapi-url"
80
+ };
81
+ var HttpStatus = {
82
+ NO_CONTENT: 204,
83
+ BAD_REQUEST: 400,
84
+ UNPROCESSABLE_ENTITY: 422,
85
+ INTERNAL_SERVER_ERROR: 500,
86
+ BAD_GATEWAY: 502,
87
+ SERVICE_UNAVAILABLE: 503,
88
+ GATEWAY_TIMEOUT: 504
89
+ };
90
+ var ENCRYPTED_VALUE_PREFIX = "KBC::";
91
+
92
+ // src/fetchClient/createFetchClient/utils.ts
74
93
  var HttpHeader = {
75
94
  CONTENT_TYPE: "content-type",
76
95
  CONTENT_DISPOSITION: "content-disposition"
@@ -90,7 +109,7 @@ function removeUndefined(obj) {
90
109
  return objCopy;
91
110
  }
92
111
  var parseData = async (response) => {
93
- if (response.status === 204) return null;
112
+ if (response.status === HttpStatus.NO_CONTENT) return null;
94
113
  const contentType = response.headers.get(HttpHeader.CONTENT_TYPE);
95
114
  if (contentType && contentType == HttpContentType.JSON) {
96
115
  return response.json();
@@ -310,14 +329,6 @@ var createAssetsClient = ({ baseUrl, middlewares }) => {
310
329
  getPublishedChangelogPosts
311
330
  };
312
331
  };
313
-
314
- // src/constants.ts
315
- var KeboolaHttpHeader = {
316
- STORAGE_API_TOKEN: "X-StorageApi-Token",
317
- MANAGEMENT_API_TOKEN: "X-Kbc-Manageapitoken",
318
- STORAGE_API_URL: "x-storageapi-url"
319
- };
320
- var ENCRYPTED_VALUE_PREFIX = "KBC::";
321
332
  var SUGGESTION_CATEGORIES = ["error", "maintenance", "documentation"];
322
333
  var suggestionCategorySchema = z5.z.enum(SUGGESTION_CATEGORIES);
323
334
  var suggestionSchema = z5.z.object({
@@ -718,7 +729,7 @@ var createDataScienceClient = ({ baseUrl, middlewares }) => {
718
729
  nextLogTimestamp
719
730
  };
720
731
  } catch (error) {
721
- if (isApiError(error) && error.response.status === 400 && TailError.safeParse(error.data).data?.context?.code === "apps.appNotRunning") {
732
+ if (isApiError(error) && error.response.status === HttpStatus.BAD_REQUEST && TailError.safeParse(error.data).data?.context?.code === "apps.appNotRunning") {
722
733
  return { entries: [], nextLogTimestamp: null };
723
734
  }
724
735
  throw error;
@@ -861,14 +872,6 @@ var createEditorClient = ({ baseUrl, middlewares }) => {
861
872
  });
862
873
  return data;
863
874
  };
864
- const getWorkspacePassword = async (id, signal) => {
865
- const { data } = await client.get(
866
- `/sql/sessions/{id}/workspace-password`,
867
- { path: { id } },
868
- { signal }
869
- );
870
- return data;
871
- };
872
875
  const resetWorkspacePassword = async (id) => {
873
876
  const { data } = await client.post(`/sql/sessions/{id}/reset-password`, {
874
877
  path: { id }
@@ -893,7 +896,6 @@ var createEditorClient = ({ baseUrl, middlewares }) => {
893
896
  tableDefinition,
894
897
  load,
895
898
  unload,
896
- getWorkspacePassword,
897
899
  resetWorkspacePassword,
898
900
  getSessionCredentials
899
901
  };
@@ -985,6 +987,24 @@ var toolInfoSchema2 = z5.z.object({
985
987
  var toolsListResponseSchema2 = z5.z.object({
986
988
  tools: z5.z.array(toolInfoSchema2)
987
989
  });
990
+ var sandboxFileEntrySchema = z5.z.object({
991
+ name: z5.z.string(),
992
+ path: z5.z.string(),
993
+ type: z5.z.enum(["file", "dir"]),
994
+ size: z5.z.number().int().nonnegative().optional()
995
+ });
996
+ var sandboxFileListingSchema = z5.z.object({
997
+ entries: z5.z.array(sandboxFileEntrySchema)
998
+ });
999
+ var sandboxFileContentSchema = z5.z.object({
1000
+ content: z5.z.string(),
1001
+ encoding: z5.z.enum(["utf-8", "binary"]),
1002
+ truncated: z5.z.boolean(),
1003
+ size: z5.z.number().int().nonnegative()
1004
+ });
1005
+ var sandboxGitBranchSchema = z5.z.object({
1006
+ branch: z5.z.string().nullable()
1007
+ });
988
1008
  var createKaiAgentClient = ({ baseUrl, middlewares }) => {
989
1009
  const clientOptions = { baseUrl, middlewares };
990
1010
  const client = createOpenapiFetchClient(clientOptions);
@@ -1022,6 +1042,10 @@ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
1022
1042
  const submitToolOutput = async (chatId, body) => {
1023
1043
  await client.post("/api/chat/{id}/ui-tool-result", { path: { id: chatId }, body });
1024
1044
  };
1045
+ const stopChat = async (chatId) => {
1046
+ const { data } = await client.post("/api/chat/{id}/stop", { path: { id: chatId } });
1047
+ return data;
1048
+ };
1025
1049
  const getSuggestions = async (request, signal) => {
1026
1050
  const { data } = await genericClient.post(
1027
1051
  "/api/suggestions",
@@ -1090,6 +1114,42 @@ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
1090
1114
  }
1091
1115
  return result.data;
1092
1116
  };
1117
+ const listSandboxFiles = async (chatId, path, signal) => {
1118
+ const { data } = await genericClient.get(
1119
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/files`,
1120
+ { query: path ? { path } : void 0 },
1121
+ { signal }
1122
+ );
1123
+ const result = sandboxFileListingSchema.safeParse(data);
1124
+ if (!result.success) {
1125
+ throw new Error("Invalid sandbox files response format");
1126
+ }
1127
+ return result.data;
1128
+ };
1129
+ const readSandboxFile = async (chatId, path, signal) => {
1130
+ const { data } = await genericClient.get(
1131
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/file`,
1132
+ { query: { path } },
1133
+ { signal }
1134
+ );
1135
+ const result = sandboxFileContentSchema.safeParse(data);
1136
+ if (!result.success) {
1137
+ throw new Error("Invalid sandbox file response format");
1138
+ }
1139
+ return result.data;
1140
+ };
1141
+ const getSandboxGitBranch = async (chatId, signal) => {
1142
+ const { data } = await genericClient.get(
1143
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/git-branch`,
1144
+ {},
1145
+ { signal }
1146
+ );
1147
+ const result = sandboxGitBranchSchema.safeParse(data);
1148
+ if (!result.success) {
1149
+ throw new Error("Invalid sandbox git-branch response format");
1150
+ }
1151
+ return result.data;
1152
+ };
1093
1153
  const chatStreamUrl = baseUrl + "/api/chat";
1094
1154
  return {
1095
1155
  getHistory,
@@ -1101,12 +1161,16 @@ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
1101
1161
  getUsage,
1102
1162
  approveToolCall,
1103
1163
  submitToolOutput,
1164
+ stopChat,
1104
1165
  getSuggestions,
1105
1166
  getAgentSettings,
1106
1167
  updateAgentSettings,
1107
1168
  getUserAgentSettings,
1108
1169
  updateUserAgentSettings,
1109
1170
  getToolsList,
1171
+ listSandboxFiles,
1172
+ readSandboxFile,
1173
+ getSandboxGitBranch,
1110
1174
  chatStreamUrl
1111
1175
  };
1112
1176
  };
@@ -1134,6 +1198,7 @@ var createVerifyClient = () => {
1134
1198
  };
1135
1199
 
1136
1200
  // src/clients/management/authMiddleware.ts
1201
+ var TOKEN_CACHE_TTL_MS = 6e4;
1137
1202
  var isManagementClientAuthError = (error) => error instanceof ManagementClientAuthError;
1138
1203
  var createAuth = (baseUrl) => {
1139
1204
  const fetchClient = createGenericFetchClient({ baseUrl });
@@ -1179,18 +1244,34 @@ var createAuthMiddleware = ({
1179
1244
  const auth = createAuth(baseUrl);
1180
1245
  const verify = createVerifyClient();
1181
1246
  let token = accessToken;
1247
+ let tokenValidUntil = 0;
1248
+ let inflightAuth = null;
1182
1249
  const isDevelopment = process.env.NODE_ENV === "development";
1183
- return (next) => async (request) => {
1184
- if (!!token) {
1250
+ const ensureValidToken = async () => {
1251
+ if (token && Date.now() < tokenValidUntil) return token;
1252
+ if (token) {
1185
1253
  const tokenInfo = await verify.managementApiToken(baseUrl, token);
1186
1254
  const isTokenValid = !tokenInfo.isDisabled && !tokenInfo.isExpired;
1187
- if (!isTokenValid) {
1188
- token = isDevelopment ? await auth.createCurrentUserSessionToken(token) : await auth.createAdminAccountSessionToken();
1255
+ if (isTokenValid) {
1256
+ tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1257
+ return token;
1189
1258
  }
1190
- } else {
1191
- token = await auth.createAdminAccountSessionToken();
1259
+ token = isDevelopment ? await auth.createCurrentUserSessionToken(token) : await auth.createAdminAccountSessionToken();
1260
+ tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1261
+ return token;
1262
+ }
1263
+ token = await auth.createAdminAccountSessionToken();
1264
+ tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1265
+ return token;
1266
+ };
1267
+ return (next) => async (request) => {
1268
+ if (!inflightAuth) {
1269
+ inflightAuth = ensureValidToken().finally(() => {
1270
+ inflightAuth = null;
1271
+ });
1192
1272
  }
1193
- request.request.headers.set(KeboolaHttpHeader.MANAGEMENT_API_TOKEN, token);
1273
+ const validToken = await inflightAuth;
1274
+ request.request.headers.set(KeboolaHttpHeader.MANAGEMENT_API_TOKEN, validToken);
1194
1275
  return next(request);
1195
1276
  };
1196
1277
  };
@@ -1394,14 +1475,6 @@ var createMaintainers = (client) => {
1394
1475
  path: { id: maintainerId, invitationId }
1395
1476
  });
1396
1477
  };
1397
- const getMaintainerOrganizations = async (maintainerId, signal) => {
1398
- const { data } = await client.get(
1399
- "/manage/maintainers/{id}/organizations",
1400
- { path: { id: maintainerId } },
1401
- { signal }
1402
- );
1403
- return data;
1404
- };
1405
1478
  const createMaintainerOrganization = async ({
1406
1479
  maintainerId,
1407
1480
  ...body
@@ -1451,7 +1524,6 @@ var createMaintainers = (client) => {
1451
1524
  getMaintainerInvitation,
1452
1525
  createMaintainerInvitation,
1453
1526
  deleteMaintainerInvitation,
1454
- getMaintainerOrganizations,
1455
1527
  createMaintainerOrganization,
1456
1528
  getMaintainerMetadata,
1457
1529
  setMaintainerMetadata,
@@ -1773,13 +1845,18 @@ var createManagementClient = ({
1773
1845
  baseUrl,
1774
1846
  middlewares
1775
1847
  });
1848
+ const verifyToken = async (signal) => {
1849
+ const { data } = await openApiClient.get("/manage/tokens/verify", {}, { signal });
1850
+ return data;
1851
+ };
1776
1852
  return {
1777
1853
  currentUser: createCurrentUser(openApiClient),
1778
1854
  features: createFeatures(client),
1779
1855
  maintainers: createMaintainers(openApiClient),
1780
1856
  organizations: createOrganizations(openApiClient),
1781
1857
  projects: createProjects(client),
1782
- users: createUsers(client)
1858
+ users: createUsers(client),
1859
+ verifyToken
1783
1860
  };
1784
1861
  };
1785
1862
 
@@ -1959,6 +2036,72 @@ var createMetastoreClient = ({ baseUrl, middlewares }) => {
1959
2036
  };
1960
2037
  };
1961
2038
 
2039
+ // src/clients/oauth/oauthClient.ts
2040
+ var createOauthClient = ({ baseUrl, middlewares }) => {
2041
+ const client = createGenericFetchClient({ baseUrl, middlewares });
2042
+ const getCredentials = async (query, signal) => {
2043
+ const { data } = await client.get(
2044
+ "/credentials",
2045
+ { query },
2046
+ { signal }
2047
+ );
2048
+ return data;
2049
+ };
2050
+ const getCredential = async (componentId, id, signal) => {
2051
+ const { data } = await client.get(
2052
+ "/credentials/{componentId}/{id}",
2053
+ { path: { componentId, id } },
2054
+ { signal }
2055
+ );
2056
+ return data;
2057
+ };
2058
+ const _createCredentials = async (componentId, body, signal) => {
2059
+ const { data } = await client.post(
2060
+ "/credentials/{componentId}",
2061
+ { path: { componentId }, body },
2062
+ { signal }
2063
+ );
2064
+ return data;
2065
+ };
2066
+ const _createLegacyCredentials = async (componentId, { data: credentialsData, ...rest }, signal) => {
2067
+ const { data } = await client.post(
2068
+ "/credentials/{componentId}",
2069
+ {
2070
+ path: { componentId },
2071
+ body: {
2072
+ ...rest,
2073
+ "#data": JSON.stringify(credentialsData)
2074
+ }
2075
+ },
2076
+ { signal }
2077
+ );
2078
+ return data;
2079
+ };
2080
+ const createCredential = async (componentId, body, signal) => {
2081
+ try {
2082
+ return await _createCredentials(componentId, body, signal);
2083
+ } catch (error) {
2084
+ if (isApiError(error) && error.response.status === HttpStatus.UNPROCESSABLE_ENTITY) {
2085
+ return _createLegacyCredentials(componentId, body, signal);
2086
+ }
2087
+ throw error;
2088
+ }
2089
+ };
2090
+ const deleteCredential = async (componentId, id, signal) => {
2091
+ await client.delete(
2092
+ "/credentials/{componentId}/{id}",
2093
+ { path: { componentId, id } },
2094
+ { signal }
2095
+ );
2096
+ };
2097
+ return {
2098
+ getCredentials,
2099
+ getCredential,
2100
+ createCredential,
2101
+ deleteCredential
2102
+ };
2103
+ };
2104
+
1962
2105
  // src/clients/queryService/queryServiceClient.ts
1963
2106
  var createQueryServiceClient = ({ baseUrl, middlewares }) => {
1964
2107
  const client = createOpenapiFetchClient({
@@ -2114,7 +2257,6 @@ var createMergeRequests = (client) => {
2114
2257
  const getMergeRequestWithActivityLog = async (id, signal) => {
2115
2258
  const { data } = await client.get(
2116
2259
  "/v2/storage/merge-request/{id}",
2117
- // @ts-expect-error backend accepts `?include=activityLog`; OpenAPI schema regen pending (connection#7250).
2118
2260
  { path: { id }, query: { include: "activityLog" } },
2119
2261
  { signal }
2120
2262
  );
@@ -2146,11 +2288,18 @@ var createMergeRequests = (client) => {
2146
2288
  const requestChangesMergeRequest = async (id, reason) => {
2147
2289
  const { data } = await client.put("/v2/storage/merge-request/{id}/request-changes", {
2148
2290
  path: { id },
2149
- // @ts-expect-error backend accepts optional `{ reason }` body; OpenAPI schema regen pending (connection#7250).
2150
2291
  body: reason ? { reason } : void 0
2151
2292
  });
2152
2293
  return data;
2153
2294
  };
2295
+ const getMergeRequestConflicts = async (id, signal) => {
2296
+ const { data } = await client.get(
2297
+ "/v2/storage/merge-request/{id}/conflicts",
2298
+ { path: { id } },
2299
+ { signal }
2300
+ );
2301
+ return data;
2302
+ };
2154
2303
  return {
2155
2304
  getMergeRequests,
2156
2305
  getMergeRequest,
@@ -2159,7 +2308,8 @@ var createMergeRequests = (client) => {
2159
2308
  updateMergeRequest,
2160
2309
  requestReview,
2161
2310
  approveMergeRequest,
2162
- requestChangesMergeRequest
2311
+ requestChangesMergeRequest,
2312
+ getMergeRequestConflicts
2163
2313
  };
2164
2314
  };
2165
2315
 
@@ -2240,6 +2390,30 @@ var createBranches = (client) => {
2240
2390
  };
2241
2391
  };
2242
2392
 
2393
+ // src/clients/storage/buckets/listingConversion.ts
2394
+ var toBackendSubscribers = (subscribers) => subscribers.map((s) => `${s.type}:${s.email}`);
2395
+ var fromBackendSubscribers = (raw) => {
2396
+ const result = [];
2397
+ for (const entry of raw) {
2398
+ const colon = entry.indexOf(":");
2399
+ if (colon === -1) continue;
2400
+ const prefix = entry.slice(0, colon);
2401
+ const email2 = entry.slice(colon + 1);
2402
+ if (prefix !== "user" && prefix !== "group") continue;
2403
+ if (email2.length === 0) continue;
2404
+ result.push({ type: prefix, email: email2 });
2405
+ }
2406
+ return result;
2407
+ };
2408
+ var toBucketListing = (raw, bucketId) => ({
2409
+ bucketId,
2410
+ name: raw.name,
2411
+ description: raw.description ?? null,
2412
+ listingId: raw.bigquery.listingId,
2413
+ subscribers: fromBackendSubscribers(raw.bigquery.subscribers),
2414
+ createdAt: raw.createdAt
2415
+ });
2416
+
2243
2417
  // src/clients/storage/buckets/buckets.ts
2244
2418
  var createBuckets = (client) => {
2245
2419
  const getBuckets = async (query = {}, signal) => {
@@ -2291,6 +2465,64 @@ var createBuckets = (client) => {
2291
2465
  path: { taskId }
2292
2466
  });
2293
2467
  };
2468
+ const getListing = async (bucketId, signal) => {
2469
+ try {
2470
+ const { data } = await client.get(
2471
+ `/buckets/{bucketId}/listing`,
2472
+ { path: { bucketId } },
2473
+ { signal }
2474
+ );
2475
+ return toBucketListing(data, bucketId);
2476
+ } catch (error) {
2477
+ if (isApiError(error) && error.response.status === 404) return null;
2478
+ throw error;
2479
+ }
2480
+ };
2481
+ const createListing = async (bucketId, input, signal) => {
2482
+ const { data } = await client.post(
2483
+ `/buckets/{bucketId}/listing`,
2484
+ {
2485
+ path: { bucketId },
2486
+ body: {
2487
+ listingName: input.name,
2488
+ listingDescription: input.description?.trim() || null,
2489
+ bigquery: {
2490
+ listingId: input.listingId,
2491
+ subscribers: toBackendSubscribers(input.subscribers)
2492
+ }
2493
+ }
2494
+ },
2495
+ { signal }
2496
+ );
2497
+ return data;
2498
+ };
2499
+ const updateListing = async (bucketId, input, signal) => {
2500
+ const body = {};
2501
+ if (input.name !== void 0) body.exposureName = input.name;
2502
+ if (input.description !== void 0) {
2503
+ body.exposureDescription = input.description?.trim() || null;
2504
+ }
2505
+ if (input.subscribers !== void 0) {
2506
+ body.bigquery = { subscribers: toBackendSubscribers(input.subscribers) };
2507
+ }
2508
+ if (Object.keys(body).length === 0) {
2509
+ throw new Error("updateListing requires at least one field");
2510
+ }
2511
+ const { data } = await client.patch(`/buckets/{bucketId}/listing`, { path: { bucketId }, body }, { signal });
2512
+ return data;
2513
+ };
2514
+ const deleteListing = async (bucketId, signal) => {
2515
+ const { data } = await client.delete(
2516
+ `/buckets/{bucketId}/listing`,
2517
+ { path: { bucketId } },
2518
+ { signal }
2519
+ );
2520
+ return data;
2521
+ };
2522
+ const listListings = async (signal) => {
2523
+ const { data } = await client.get(`/listings`, {}, { signal });
2524
+ return data.map((row) => toBucketListing(row, row.bucketId));
2525
+ };
2294
2526
  return {
2295
2527
  getBuckets,
2296
2528
  getBucket,
@@ -2299,7 +2531,12 @@ var createBuckets = (client) => {
2299
2531
  deleteBucket,
2300
2532
  deleteBucketAsync,
2301
2533
  createScheduledRefresh,
2302
- deleteScheduledTask
2534
+ deleteScheduledTask,
2535
+ getListing,
2536
+ createListing,
2537
+ updateListing,
2538
+ deleteListing,
2539
+ listListings
2303
2540
  };
2304
2541
  };
2305
2542
 
@@ -3366,10 +3603,29 @@ var createStorageSdk = ({ storageClient }) => {
3366
3603
  const job = await storageClient.tables.exportAsync(tableId, body, options?.abortSignal);
3367
3604
  return waitForJob(job, options);
3368
3605
  };
3606
+ const getBucketListing = async (bucketId, signal) => storageClient.buckets.getListing(bucketId, signal);
3607
+ const listBucketListings = async (signal) => storageClient.buckets.listListings(signal);
3608
+ const createBucketListing = async (bucketId, input, options) => {
3609
+ const job = await storageClient.buckets.createListing(bucketId, input, options?.abortSignal);
3610
+ return waitForJob(job, options);
3611
+ };
3612
+ const updateBucketListing = async (bucketId, input, options) => {
3613
+ const job = await storageClient.buckets.updateListing(bucketId, input, options?.abortSignal);
3614
+ return waitForJob(job, options);
3615
+ };
3616
+ const deleteBucketListing = async (bucketId, options) => {
3617
+ const job = await storageClient.buckets.deleteListing(bucketId, options?.abortSignal);
3618
+ return waitForJob(job, options);
3619
+ };
3369
3620
  return {
3370
3621
  createTable,
3371
3622
  importFromFile,
3372
- exportToFile
3623
+ exportToFile,
3624
+ getBucketListing,
3625
+ listBucketListings,
3626
+ createBucketListing,
3627
+ updateBucketListing,
3628
+ deleteBucketListing
3373
3629
  };
3374
3630
  };
3375
3631
 
@@ -3674,6 +3930,11 @@ var createClients = async ({
3674
3930
  baseUrl: serviceBaseUrl,
3675
3931
  middlewares: commonMiddlewares
3676
3932
  })
3933
+ },
3934
+ {
3935
+ serviceId: "oauth",
3936
+ clientName: "oauth",
3937
+ clientFn: (serviceBaseUrl) => createOauthClient({ baseUrl: serviceBaseUrl, middlewares: commonMiddlewares })
3677
3938
  }
3678
3939
  ]
3679
3940
  });
@@ -3843,7 +4104,12 @@ var createLoggingMiddleware = (options = {}) => {
3843
4104
 
3844
4105
  // src/middlewares/retryMiddleware.ts
3845
4106
  var DEFAULT_MAX_RETRIES = 5;
3846
- var DEFAULT_RETRYABLE_STATUSES = [500, 502, 503, 504];
4107
+ var DEFAULT_RETRYABLE_STATUSES = [
4108
+ HttpStatus.INTERNAL_SERVER_ERROR,
4109
+ HttpStatus.BAD_GATEWAY,
4110
+ HttpStatus.SERVICE_UNAVAILABLE,
4111
+ HttpStatus.GATEWAY_TIMEOUT
4112
+ ];
3847
4113
  var DEFAULT_BACKOFF_FACTOR = 0.3;
3848
4114
  var defaultShouldRetry = (error) => error instanceof ApiError && DEFAULT_RETRYABLE_STATUSES.includes(error.response.status);
3849
4115
  var createRetryMiddleware = (options) => {