@meetkai/mka1 0.54.50 → 0.54.51
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.
- package/README.md +313 -304
- package/bin/mcp-server.js +777 -390
- package/bin/mcp-server.js.map +19 -11
- package/dist/commonjs/funcs/reposTagsDelete.d.ts +29 -0
- package/dist/commonjs/funcs/reposTagsDelete.d.ts.map +1 -0
- package/dist/commonjs/funcs/reposTagsDelete.js +155 -0
- package/dist/commonjs/funcs/reposTagsDelete.js.map +1 -0
- package/dist/commonjs/funcs/reposTagsList.d.ts +35 -0
- package/dist/commonjs/funcs/reposTagsList.d.ts.map +1 -0
- package/dist/commonjs/funcs/reposTagsList.js +156 -0
- package/dist/commonjs/funcs/reposTagsList.js.map +1 -0
- package/dist/commonjs/funcs/reposUpdate.d.ts +7 -4
- package/dist/commonjs/funcs/reposUpdate.d.ts.map +1 -1
- package/dist/commonjs/funcs/reposUpdate.js +7 -4
- package/dist/commonjs/funcs/reposUpdate.js.map +1 -1
- package/dist/commonjs/lib/config.d.ts +3 -3
- package/dist/commonjs/lib/config.js +3 -3
- package/dist/commonjs/mcp-server/mcp-server.js +1 -1
- package/dist/commonjs/mcp-server/server.d.ts.map +1 -1
- package/dist/commonjs/mcp-server/server.js +5 -1
- package/dist/commonjs/mcp-server/server.js.map +1 -1
- package/dist/commonjs/mcp-server/tools/reposTagsDelete.d.ts +8 -0
- package/dist/commonjs/mcp-server/tools/reposTagsDelete.d.ts.map +1 -0
- package/dist/commonjs/mcp-server/tools/reposTagsDelete.js +73 -0
- package/dist/commonjs/mcp-server/tools/reposTagsDelete.js.map +1 -0
- package/dist/commonjs/mcp-server/tools/reposTagsList.d.ts +8 -0
- package/dist/commonjs/mcp-server/tools/reposTagsList.d.ts.map +1 -0
- package/dist/commonjs/mcp-server/tools/reposTagsList.js +79 -0
- package/dist/commonjs/mcp-server/tools/reposTagsList.js.map +1 -0
- package/dist/commonjs/mcp-server/tools/reposUpdate.d.ts.map +1 -1
- package/dist/commonjs/mcp-server/tools/reposUpdate.js +7 -4
- package/dist/commonjs/mcp-server/tools/reposUpdate.js.map +1 -1
- package/dist/commonjs/models/components/index.d.ts +2 -0
- package/dist/commonjs/models/components/index.d.ts.map +1 -1
- package/dist/commonjs/models/components/index.js +2 -0
- package/dist/commonjs/models/components/index.js.map +1 -1
- package/dist/commonjs/models/components/repo.d.ts +11 -0
- package/dist/commonjs/models/components/repo.d.ts.map +1 -1
- package/dist/commonjs/models/components/repo.js +2 -0
- package/dist/commonjs/models/components/repo.js.map +1 -1
- package/dist/commonjs/models/components/repotag.d.ts +42 -0
- package/dist/commonjs/models/components/repotag.d.ts.map +1 -0
- package/dist/commonjs/models/components/repotag.js +77 -0
- package/dist/commonjs/models/components/repotag.js.map +1 -0
- package/dist/commonjs/models/components/repotaglist.d.ts +29 -0
- package/dist/commonjs/models/components/repotaglist.d.ts.map +1 -0
- package/dist/commonjs/models/components/repotaglist.js +61 -0
- package/dist/commonjs/models/components/repotaglist.js.map +1 -0
- package/dist/commonjs/models/operations/deleterepotag.d.ts +35 -0
- package/dist/commonjs/models/operations/deleterepotag.d.ts.map +1 -0
- package/dist/commonjs/models/operations/deleterepotag.js +73 -0
- package/dist/commonjs/models/operations/deleterepotag.js.map +1 -0
- package/dist/commonjs/models/operations/index.d.ts +2 -0
- package/dist/commonjs/models/operations/index.d.ts.map +1 -1
- package/dist/commonjs/models/operations/index.js +2 -0
- package/dist/commonjs/models/operations/index.js.map +1 -1
- package/dist/commonjs/models/operations/listrepotags.d.ts +30 -0
- package/dist/commonjs/models/operations/listrepotags.d.ts.map +1 -0
- package/dist/commonjs/models/operations/listrepotags.js +71 -0
- package/dist/commonjs/models/operations/listrepotags.js.map +1 -0
- package/dist/commonjs/react-query/index.d.ts +2 -0
- package/dist/commonjs/react-query/index.d.ts.map +1 -1
- package/dist/commonjs/react-query/index.js +2 -0
- package/dist/commonjs/react-query/index.js.map +1 -1
- package/dist/commonjs/react-query/reposTagsDelete.d.ts +38 -0
- package/dist/commonjs/react-query/reposTagsDelete.d.ts.map +1 -0
- package/dist/commonjs/react-query/reposTagsDelete.js +56 -0
- package/dist/commonjs/react-query/reposTagsDelete.js.map +1 -0
- package/dist/commonjs/react-query/reposTagsList.core.d.ts +15 -0
- package/dist/commonjs/react-query/reposTagsList.core.d.ts.map +1 -0
- package/dist/commonjs/react-query/reposTagsList.core.js +36 -0
- package/dist/commonjs/react-query/reposTagsList.core.js.map +1 -0
- package/dist/commonjs/react-query/reposTagsList.d.ts +69 -0
- package/dist/commonjs/react-query/reposTagsList.d.ts.map +1 -0
- package/dist/commonjs/react-query/reposTagsList.js +88 -0
- package/dist/commonjs/react-query/reposTagsList.js.map +1 -0
- package/dist/commonjs/react-query/reposUpdate.d.ts +7 -4
- package/dist/commonjs/react-query/reposUpdate.d.ts.map +1 -1
- package/dist/commonjs/react-query/reposUpdate.js +7 -4
- package/dist/commonjs/react-query/reposUpdate.js.map +1 -1
- package/dist/commonjs/sdk/repos.d.ts +10 -4
- package/dist/commonjs/sdk/repos.d.ts.map +1 -1
- package/dist/commonjs/sdk/repos.js +11 -4
- package/dist/commonjs/sdk/repos.js.map +1 -1
- package/dist/commonjs/sdk/tags.d.ts +43 -0
- package/dist/commonjs/sdk/tags.d.ts.map +1 -0
- package/dist/commonjs/sdk/tags.js +55 -0
- package/dist/commonjs/sdk/tags.js.map +1 -0
- package/dist/esm/funcs/reposTagsDelete.d.ts +29 -0
- package/dist/esm/funcs/reposTagsDelete.d.ts.map +1 -0
- package/dist/esm/funcs/reposTagsDelete.js +119 -0
- package/dist/esm/funcs/reposTagsDelete.js.map +1 -0
- package/dist/esm/funcs/reposTagsList.d.ts +35 -0
- package/dist/esm/funcs/reposTagsList.d.ts.map +1 -0
- package/dist/esm/funcs/reposTagsList.js +120 -0
- package/dist/esm/funcs/reposTagsList.js.map +1 -0
- package/dist/esm/funcs/reposUpdate.d.ts +7 -4
- package/dist/esm/funcs/reposUpdate.d.ts.map +1 -1
- package/dist/esm/funcs/reposUpdate.js +7 -4
- package/dist/esm/funcs/reposUpdate.js.map +1 -1
- package/dist/esm/lib/config.d.ts +3 -3
- package/dist/esm/lib/config.js +3 -3
- package/dist/esm/mcp-server/mcp-server.js +1 -1
- package/dist/esm/mcp-server/server.d.ts.map +1 -1
- package/dist/esm/mcp-server/server.js +5 -1
- package/dist/esm/mcp-server/server.js.map +1 -1
- package/dist/esm/mcp-server/tools/reposTagsDelete.d.ts +8 -0
- package/dist/esm/mcp-server/tools/reposTagsDelete.d.ts.map +1 -0
- package/dist/esm/mcp-server/tools/reposTagsDelete.js +37 -0
- package/dist/esm/mcp-server/tools/reposTagsDelete.js.map +1 -0
- package/dist/esm/mcp-server/tools/reposTagsList.d.ts +8 -0
- package/dist/esm/mcp-server/tools/reposTagsList.d.ts.map +1 -0
- package/dist/esm/mcp-server/tools/reposTagsList.js +43 -0
- package/dist/esm/mcp-server/tools/reposTagsList.js.map +1 -0
- package/dist/esm/mcp-server/tools/reposUpdate.d.ts.map +1 -1
- package/dist/esm/mcp-server/tools/reposUpdate.js +7 -4
- package/dist/esm/mcp-server/tools/reposUpdate.js.map +1 -1
- package/dist/esm/models/components/index.d.ts +2 -0
- package/dist/esm/models/components/index.d.ts.map +1 -1
- package/dist/esm/models/components/index.js +2 -0
- package/dist/esm/models/components/index.js.map +1 -1
- package/dist/esm/models/components/repo.d.ts +11 -0
- package/dist/esm/models/components/repo.d.ts.map +1 -1
- package/dist/esm/models/components/repo.js +2 -0
- package/dist/esm/models/components/repo.js.map +1 -1
- package/dist/esm/models/components/repotag.d.ts +42 -0
- package/dist/esm/models/components/repotag.d.ts.map +1 -0
- package/dist/esm/models/components/repotag.js +39 -0
- package/dist/esm/models/components/repotag.js.map +1 -0
- package/dist/esm/models/components/repotaglist.d.ts +29 -0
- package/dist/esm/models/components/repotaglist.d.ts.map +1 -0
- package/dist/esm/models/components/repotaglist.js +23 -0
- package/dist/esm/models/components/repotaglist.js.map +1 -0
- package/dist/esm/models/operations/deleterepotag.d.ts +35 -0
- package/dist/esm/models/operations/deleterepotag.d.ts.map +1 -0
- package/dist/esm/models/operations/deleterepotag.js +35 -0
- package/dist/esm/models/operations/deleterepotag.js.map +1 -0
- package/dist/esm/models/operations/index.d.ts +2 -0
- package/dist/esm/models/operations/index.d.ts.map +1 -1
- package/dist/esm/models/operations/index.js +2 -0
- package/dist/esm/models/operations/index.js.map +1 -1
- package/dist/esm/models/operations/listrepotags.d.ts +30 -0
- package/dist/esm/models/operations/listrepotags.d.ts.map +1 -0
- package/dist/esm/models/operations/listrepotags.js +33 -0
- package/dist/esm/models/operations/listrepotags.js.map +1 -0
- package/dist/esm/react-query/index.d.ts +2 -0
- package/dist/esm/react-query/index.d.ts.map +1 -1
- package/dist/esm/react-query/index.js +2 -0
- package/dist/esm/react-query/index.js.map +1 -1
- package/dist/esm/react-query/reposTagsDelete.d.ts +38 -0
- package/dist/esm/react-query/reposTagsDelete.d.ts.map +1 -0
- package/dist/esm/react-query/reposTagsDelete.js +51 -0
- package/dist/esm/react-query/reposTagsDelete.js.map +1 -0
- package/dist/esm/react-query/reposTagsList.core.d.ts +15 -0
- package/dist/esm/react-query/reposTagsList.core.d.ts.map +1 -0
- package/dist/esm/react-query/reposTagsList.core.js +31 -0
- package/dist/esm/react-query/reposTagsList.core.js.map +1 -0
- package/dist/esm/react-query/reposTagsList.d.ts +69 -0
- package/dist/esm/react-query/reposTagsList.d.ts.map +1 -0
- package/dist/esm/react-query/reposTagsList.js +78 -0
- package/dist/esm/react-query/reposTagsList.js.map +1 -0
- package/dist/esm/react-query/reposUpdate.d.ts +7 -4
- package/dist/esm/react-query/reposUpdate.d.ts.map +1 -1
- package/dist/esm/react-query/reposUpdate.js +7 -4
- package/dist/esm/react-query/reposUpdate.js.map +1 -1
- package/dist/esm/sdk/repos.d.ts +10 -4
- package/dist/esm/sdk/repos.d.ts.map +1 -1
- package/dist/esm/sdk/repos.js +11 -4
- package/dist/esm/sdk/repos.js.map +1 -1
- package/dist/esm/sdk/tags.d.ts +43 -0
- package/dist/esm/sdk/tags.d.ts.map +1 -0
- package/dist/esm/sdk/tags.js +51 -0
- package/dist/esm/sdk/tags.js.map +1 -0
- package/jsr.json +1 -1
- package/package.json +1 -1
- package/src/funcs/reposTagsDelete.ts +212 -0
- package/src/funcs/reposTagsList.ts +213 -0
- package/src/funcs/reposUpdate.ts +7 -4
- package/src/lib/config.ts +3 -3
- package/src/mcp-server/mcp-server.ts +1 -1
- package/src/mcp-server/server.ts +5 -1
- package/src/mcp-server/tools/reposTagsDelete.ts +45 -0
- package/src/mcp-server/tools/reposTagsList.ts +52 -0
- package/src/mcp-server/tools/reposUpdate.ts +7 -4
- package/src/models/components/index.ts +2 -0
- package/src/models/components/repo.ts +13 -0
- package/src/models/components/repotag.ts +90 -0
- package/src/models/components/repotaglist.ts +66 -0
- package/src/models/operations/deleterepotag.ts +84 -0
- package/src/models/operations/index.ts +2 -0
- package/src/models/operations/listrepotags.ts +77 -0
- package/src/react-query/index.ts +2 -0
- package/src/react-query/reposTagsDelete.ts +119 -0
- package/src/react-query/reposTagsList.core.ts +75 -0
- package/src/react-query/reposTagsList.ts +167 -0
- package/src/react-query/reposUpdate.ts +7 -4
- package/src/sdk/repos.ts +13 -4
- package/src/sdk/tags.ts +69 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as z from "zod/v3";
|
|
6
|
+
import { SDKCore } from "../core.js";
|
|
7
|
+
import { encodeSimple } from "../lib/encodings.js";
|
|
8
|
+
import { matchStatusCode } from "../lib/http.js";
|
|
9
|
+
import * as M from "../lib/matchers.js";
|
|
10
|
+
import { compactMap } from "../lib/primitives.js";
|
|
11
|
+
import { safeParse } from "../lib/schemas.js";
|
|
12
|
+
import { RequestOptions } from "../lib/sdks.js";
|
|
13
|
+
import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js";
|
|
14
|
+
import { pathToFunc } from "../lib/url.js";
|
|
15
|
+
import {
|
|
16
|
+
ConnectionError,
|
|
17
|
+
InvalidRequestError,
|
|
18
|
+
RequestAbortedError,
|
|
19
|
+
RequestTimeoutError,
|
|
20
|
+
UnexpectedClientError,
|
|
21
|
+
} from "../models/errors/httpclienterrors.js";
|
|
22
|
+
import * as errors from "../models/errors/index.js";
|
|
23
|
+
import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";
|
|
24
|
+
import { SDKError } from "../models/errors/sdkerror.js";
|
|
25
|
+
import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
|
|
26
|
+
import * as operations from "../models/operations/index.js";
|
|
27
|
+
import { APICall, APIPromise } from "../types/async.js";
|
|
28
|
+
import { Result } from "../types/fp.js";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Delete an image tag
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* Removes one tag; org owner/admin only (`write:repos` for a key). The
|
|
35
|
+
* same untag as the registry's `DELETE /v2/{org}/{name}/manifests/{tag}`:
|
|
36
|
+
* the name goes and the image stays, reachable by digest and by any
|
|
37
|
+
* other tag that names it.
|
|
38
|
+
*
|
|
39
|
+
* What makes a repository convertible afterwards is the kind switch
|
|
40
|
+
* itself: `PATCH` to another `kind` first collects every image no tag
|
|
41
|
+
* reaches (a multi-arch index's per-platform images included) and is
|
|
42
|
+
* refused with `409 kind_has_content` only for images a tag still
|
|
43
|
+
* names. So delete the tags the listing shows, then switch.
|
|
44
|
+
*
|
|
45
|
+
* If set, this operation will use {@link Security.bearerAuth} from the global security.
|
|
46
|
+
*/
|
|
47
|
+
export function reposTagsDelete(
|
|
48
|
+
client: SDKCore,
|
|
49
|
+
request: operations.DeleteRepoTagRequest,
|
|
50
|
+
options?: RequestOptions,
|
|
51
|
+
): APIPromise<
|
|
52
|
+
Result<
|
|
53
|
+
void,
|
|
54
|
+
| errors.RepoError
|
|
55
|
+
| SDKError
|
|
56
|
+
| ResponseValidationError
|
|
57
|
+
| ConnectionError
|
|
58
|
+
| RequestAbortedError
|
|
59
|
+
| RequestTimeoutError
|
|
60
|
+
| InvalidRequestError
|
|
61
|
+
| UnexpectedClientError
|
|
62
|
+
| SDKValidationError
|
|
63
|
+
>
|
|
64
|
+
> {
|
|
65
|
+
return new APIPromise($do(
|
|
66
|
+
client,
|
|
67
|
+
request,
|
|
68
|
+
options,
|
|
69
|
+
));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function $do(
|
|
73
|
+
client: SDKCore,
|
|
74
|
+
request: operations.DeleteRepoTagRequest,
|
|
75
|
+
options?: RequestOptions,
|
|
76
|
+
): Promise<
|
|
77
|
+
[
|
|
78
|
+
Result<
|
|
79
|
+
void,
|
|
80
|
+
| errors.RepoError
|
|
81
|
+
| SDKError
|
|
82
|
+
| ResponseValidationError
|
|
83
|
+
| ConnectionError
|
|
84
|
+
| RequestAbortedError
|
|
85
|
+
| RequestTimeoutError
|
|
86
|
+
| InvalidRequestError
|
|
87
|
+
| UnexpectedClientError
|
|
88
|
+
| SDKValidationError
|
|
89
|
+
>,
|
|
90
|
+
APICall,
|
|
91
|
+
]
|
|
92
|
+
> {
|
|
93
|
+
const parsed = safeParse(
|
|
94
|
+
request,
|
|
95
|
+
(value) => operations.DeleteRepoTagRequest$outboundSchema.parse(value),
|
|
96
|
+
"Input validation failed",
|
|
97
|
+
);
|
|
98
|
+
if (!parsed.ok) {
|
|
99
|
+
return [parsed, { status: "invalid" }];
|
|
100
|
+
}
|
|
101
|
+
const payload = parsed.value;
|
|
102
|
+
const body = null;
|
|
103
|
+
|
|
104
|
+
const pathParams = {
|
|
105
|
+
name: encodeSimple("name", payload.name, {
|
|
106
|
+
explode: false,
|
|
107
|
+
charEncoding: "percent",
|
|
108
|
+
}),
|
|
109
|
+
org: encodeSimple("org", payload.org, {
|
|
110
|
+
explode: false,
|
|
111
|
+
charEncoding: "percent",
|
|
112
|
+
}),
|
|
113
|
+
tag: encodeSimple("tag", payload.tag, {
|
|
114
|
+
explode: false,
|
|
115
|
+
charEncoding: "percent",
|
|
116
|
+
}),
|
|
117
|
+
};
|
|
118
|
+
const path = pathToFunc("/api/v1/repos/{org}/{name}/tags/{tag}")(pathParams);
|
|
119
|
+
|
|
120
|
+
const headers = new Headers(compactMap({
|
|
121
|
+
Accept: "application/json",
|
|
122
|
+
"X-On-Behalf-Of": encodeSimple(
|
|
123
|
+
"X-On-Behalf-Of",
|
|
124
|
+
payload["X-On-Behalf-Of"],
|
|
125
|
+
{ explode: false, charEncoding: "none" },
|
|
126
|
+
),
|
|
127
|
+
}));
|
|
128
|
+
|
|
129
|
+
const secConfig = await extractSecurity(client._options.bearerAuth);
|
|
130
|
+
const securityInput = secConfig == null ? {} : { bearerAuth: secConfig };
|
|
131
|
+
const requestSecurity = resolveGlobalSecurity(securityInput, [0]);
|
|
132
|
+
|
|
133
|
+
const context = {
|
|
134
|
+
options: client._options,
|
|
135
|
+
baseURL: options?.serverURL ?? client._baseURL ?? "",
|
|
136
|
+
operationID: "deleteRepoTag",
|
|
137
|
+
oAuth2Scopes: null,
|
|
138
|
+
|
|
139
|
+
resolvedSecurity: requestSecurity,
|
|
140
|
+
|
|
141
|
+
securitySource: client._options.bearerAuth,
|
|
142
|
+
retryConfig: options?.retries
|
|
143
|
+
|| client._options.retryConfig
|
|
144
|
+
|| {
|
|
145
|
+
strategy: "backoff",
|
|
146
|
+
backoff: {
|
|
147
|
+
initialInterval: 500,
|
|
148
|
+
maxInterval: 5000,
|
|
149
|
+
exponent: 1.5,
|
|
150
|
+
maxElapsedTime: 15000,
|
|
151
|
+
},
|
|
152
|
+
retryConnectionErrors: true,
|
|
153
|
+
}
|
|
154
|
+
|| { strategy: "none" },
|
|
155
|
+
retryCodes: options?.retryCodes || ["429", "500", "502", "503", "504"],
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const requestRes = client._createRequest(context, {
|
|
159
|
+
security: requestSecurity,
|
|
160
|
+
method: "DELETE",
|
|
161
|
+
baseURL: options?.serverURL,
|
|
162
|
+
path: path,
|
|
163
|
+
headers: headers,
|
|
164
|
+
body: body,
|
|
165
|
+
userAgent: client._options.userAgent,
|
|
166
|
+
timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
|
|
167
|
+
}, options);
|
|
168
|
+
if (!requestRes.ok) {
|
|
169
|
+
return [requestRes, { status: "invalid" }];
|
|
170
|
+
}
|
|
171
|
+
const req = requestRes.value;
|
|
172
|
+
|
|
173
|
+
const doResult = await client._do(req, {
|
|
174
|
+
context,
|
|
175
|
+
isErrorStatusCode: (statusCode: number) =>
|
|
176
|
+
matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]),
|
|
177
|
+
retryConfig: context.retryConfig,
|
|
178
|
+
retryCodes: context.retryCodes,
|
|
179
|
+
});
|
|
180
|
+
if (!doResult.ok) {
|
|
181
|
+
return [doResult, { status: "request-error", request: req }];
|
|
182
|
+
}
|
|
183
|
+
const response = doResult.value;
|
|
184
|
+
|
|
185
|
+
const responseFields = {
|
|
186
|
+
HttpMeta: { Response: response, Request: req },
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
const [result] = await M.match<
|
|
190
|
+
void,
|
|
191
|
+
| errors.RepoError
|
|
192
|
+
| SDKError
|
|
193
|
+
| ResponseValidationError
|
|
194
|
+
| ConnectionError
|
|
195
|
+
| RequestAbortedError
|
|
196
|
+
| RequestTimeoutError
|
|
197
|
+
| InvalidRequestError
|
|
198
|
+
| UnexpectedClientError
|
|
199
|
+
| SDKValidationError
|
|
200
|
+
>(
|
|
201
|
+
M.nil(204, z.void()),
|
|
202
|
+
M.jsonErr([401, 403, 404], errors.RepoError$inboundSchema),
|
|
203
|
+
M.jsonErr(500, errors.RepoError$inboundSchema),
|
|
204
|
+
M.fail("4XX"),
|
|
205
|
+
M.fail("5XX"),
|
|
206
|
+
)(response, req, { extraFields: responseFields });
|
|
207
|
+
if (!result.ok) {
|
|
208
|
+
return [result, { status: "complete", request: req, response }];
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return [result, { status: "complete", request: req, response }];
|
|
212
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { SDKCore } from "../core.js";
|
|
6
|
+
import { encodeSimple } from "../lib/encodings.js";
|
|
7
|
+
import { matchStatusCode } from "../lib/http.js";
|
|
8
|
+
import * as M from "../lib/matchers.js";
|
|
9
|
+
import { compactMap } from "../lib/primitives.js";
|
|
10
|
+
import { safeParse } from "../lib/schemas.js";
|
|
11
|
+
import { RequestOptions } from "../lib/sdks.js";
|
|
12
|
+
import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js";
|
|
13
|
+
import { pathToFunc } from "../lib/url.js";
|
|
14
|
+
import * as components from "../models/components/index.js";
|
|
15
|
+
import {
|
|
16
|
+
ConnectionError,
|
|
17
|
+
InvalidRequestError,
|
|
18
|
+
RequestAbortedError,
|
|
19
|
+
RequestTimeoutError,
|
|
20
|
+
UnexpectedClientError,
|
|
21
|
+
} from "../models/errors/httpclienterrors.js";
|
|
22
|
+
import * as errors from "../models/errors/index.js";
|
|
23
|
+
import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";
|
|
24
|
+
import { SDKError } from "../models/errors/sdkerror.js";
|
|
25
|
+
import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
|
|
26
|
+
import * as operations from "../models/operations/index.js";
|
|
27
|
+
import { APICall, APIPromise } from "../types/async.js";
|
|
28
|
+
import { Result } from "../types/fp.js";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* List an image repository's tags
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* Lists the container-image tags a repository holds, newest-moved first,
|
|
35
|
+
* each with the manifest it points at, the manifest's media type, the
|
|
36
|
+
* image's declared size and when the tag last moved. The same access
|
|
37
|
+
* check as reading the repository (org owner/admin; `read:repos` for a
|
|
38
|
+
* key).
|
|
39
|
+
*
|
|
40
|
+
* It is a fact about what the repository HOLDS, not about its `kind`:
|
|
41
|
+
* a `model` lists `[]`, and a legacy `kind: null` repository that still
|
|
42
|
+
* holds images lists them — those are the tags a `409 kind_has_content`
|
|
43
|
+
* on PATCH is about, and deleting them through this API is what makes
|
|
44
|
+
* that PATCH go through.
|
|
45
|
+
*
|
|
46
|
+
* One page, of at most 1000 tags; `truncated` says whether the
|
|
47
|
+
* repository holds more. The registry's own `GET /v2/{org}/{name}/tags/list`
|
|
48
|
+
* is the paginated, names-only listing every OCI client speaks.
|
|
49
|
+
*
|
|
50
|
+
* If set, this operation will use {@link Security.bearerAuth} from the global security.
|
|
51
|
+
*/
|
|
52
|
+
export function reposTagsList(
|
|
53
|
+
client: SDKCore,
|
|
54
|
+
request: operations.ListRepoTagsRequest,
|
|
55
|
+
options?: RequestOptions,
|
|
56
|
+
): APIPromise<
|
|
57
|
+
Result<
|
|
58
|
+
components.RepoTagList,
|
|
59
|
+
| errors.RepoError
|
|
60
|
+
| SDKError
|
|
61
|
+
| ResponseValidationError
|
|
62
|
+
| ConnectionError
|
|
63
|
+
| RequestAbortedError
|
|
64
|
+
| RequestTimeoutError
|
|
65
|
+
| InvalidRequestError
|
|
66
|
+
| UnexpectedClientError
|
|
67
|
+
| SDKValidationError
|
|
68
|
+
>
|
|
69
|
+
> {
|
|
70
|
+
return new APIPromise($do(
|
|
71
|
+
client,
|
|
72
|
+
request,
|
|
73
|
+
options,
|
|
74
|
+
));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function $do(
|
|
78
|
+
client: SDKCore,
|
|
79
|
+
request: operations.ListRepoTagsRequest,
|
|
80
|
+
options?: RequestOptions,
|
|
81
|
+
): Promise<
|
|
82
|
+
[
|
|
83
|
+
Result<
|
|
84
|
+
components.RepoTagList,
|
|
85
|
+
| errors.RepoError
|
|
86
|
+
| SDKError
|
|
87
|
+
| ResponseValidationError
|
|
88
|
+
| ConnectionError
|
|
89
|
+
| RequestAbortedError
|
|
90
|
+
| RequestTimeoutError
|
|
91
|
+
| InvalidRequestError
|
|
92
|
+
| UnexpectedClientError
|
|
93
|
+
| SDKValidationError
|
|
94
|
+
>,
|
|
95
|
+
APICall,
|
|
96
|
+
]
|
|
97
|
+
> {
|
|
98
|
+
const parsed = safeParse(
|
|
99
|
+
request,
|
|
100
|
+
(value) => operations.ListRepoTagsRequest$outboundSchema.parse(value),
|
|
101
|
+
"Input validation failed",
|
|
102
|
+
);
|
|
103
|
+
if (!parsed.ok) {
|
|
104
|
+
return [parsed, { status: "invalid" }];
|
|
105
|
+
}
|
|
106
|
+
const payload = parsed.value;
|
|
107
|
+
const body = null;
|
|
108
|
+
|
|
109
|
+
const pathParams = {
|
|
110
|
+
name: encodeSimple("name", payload.name, {
|
|
111
|
+
explode: false,
|
|
112
|
+
charEncoding: "percent",
|
|
113
|
+
}),
|
|
114
|
+
org: encodeSimple("org", payload.org, {
|
|
115
|
+
explode: false,
|
|
116
|
+
charEncoding: "percent",
|
|
117
|
+
}),
|
|
118
|
+
};
|
|
119
|
+
const path = pathToFunc("/api/v1/repos/{org}/{name}/tags")(pathParams);
|
|
120
|
+
|
|
121
|
+
const headers = new Headers(compactMap({
|
|
122
|
+
Accept: "application/json",
|
|
123
|
+
"X-On-Behalf-Of": encodeSimple(
|
|
124
|
+
"X-On-Behalf-Of",
|
|
125
|
+
payload["X-On-Behalf-Of"],
|
|
126
|
+
{ explode: false, charEncoding: "none" },
|
|
127
|
+
),
|
|
128
|
+
}));
|
|
129
|
+
|
|
130
|
+
const secConfig = await extractSecurity(client._options.bearerAuth);
|
|
131
|
+
const securityInput = secConfig == null ? {} : { bearerAuth: secConfig };
|
|
132
|
+
const requestSecurity = resolveGlobalSecurity(securityInput, [0]);
|
|
133
|
+
|
|
134
|
+
const context = {
|
|
135
|
+
options: client._options,
|
|
136
|
+
baseURL: options?.serverURL ?? client._baseURL ?? "",
|
|
137
|
+
operationID: "listRepoTags",
|
|
138
|
+
oAuth2Scopes: null,
|
|
139
|
+
|
|
140
|
+
resolvedSecurity: requestSecurity,
|
|
141
|
+
|
|
142
|
+
securitySource: client._options.bearerAuth,
|
|
143
|
+
retryConfig: options?.retries
|
|
144
|
+
|| client._options.retryConfig
|
|
145
|
+
|| {
|
|
146
|
+
strategy: "backoff",
|
|
147
|
+
backoff: {
|
|
148
|
+
initialInterval: 500,
|
|
149
|
+
maxInterval: 5000,
|
|
150
|
+
exponent: 1.5,
|
|
151
|
+
maxElapsedTime: 15000,
|
|
152
|
+
},
|
|
153
|
+
retryConnectionErrors: true,
|
|
154
|
+
}
|
|
155
|
+
|| { strategy: "none" },
|
|
156
|
+
retryCodes: options?.retryCodes || ["429", "500", "502", "503", "504"],
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const requestRes = client._createRequest(context, {
|
|
160
|
+
security: requestSecurity,
|
|
161
|
+
method: "GET",
|
|
162
|
+
baseURL: options?.serverURL,
|
|
163
|
+
path: path,
|
|
164
|
+
headers: headers,
|
|
165
|
+
body: body,
|
|
166
|
+
userAgent: client._options.userAgent,
|
|
167
|
+
timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
|
|
168
|
+
}, options);
|
|
169
|
+
if (!requestRes.ok) {
|
|
170
|
+
return [requestRes, { status: "invalid" }];
|
|
171
|
+
}
|
|
172
|
+
const req = requestRes.value;
|
|
173
|
+
|
|
174
|
+
const doResult = await client._do(req, {
|
|
175
|
+
context,
|
|
176
|
+
isErrorStatusCode: (statusCode: number) =>
|
|
177
|
+
matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]),
|
|
178
|
+
retryConfig: context.retryConfig,
|
|
179
|
+
retryCodes: context.retryCodes,
|
|
180
|
+
});
|
|
181
|
+
if (!doResult.ok) {
|
|
182
|
+
return [doResult, { status: "request-error", request: req }];
|
|
183
|
+
}
|
|
184
|
+
const response = doResult.value;
|
|
185
|
+
|
|
186
|
+
const responseFields = {
|
|
187
|
+
HttpMeta: { Response: response, Request: req },
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const [result] = await M.match<
|
|
191
|
+
components.RepoTagList,
|
|
192
|
+
| errors.RepoError
|
|
193
|
+
| SDKError
|
|
194
|
+
| ResponseValidationError
|
|
195
|
+
| ConnectionError
|
|
196
|
+
| RequestAbortedError
|
|
197
|
+
| RequestTimeoutError
|
|
198
|
+
| InvalidRequestError
|
|
199
|
+
| UnexpectedClientError
|
|
200
|
+
| SDKValidationError
|
|
201
|
+
>(
|
|
202
|
+
M.json(200, components.RepoTagList$inboundSchema),
|
|
203
|
+
M.jsonErr([401, 403, 404], errors.RepoError$inboundSchema),
|
|
204
|
+
M.jsonErr(500, errors.RepoError$inboundSchema),
|
|
205
|
+
M.fail("4XX"),
|
|
206
|
+
M.fail("5XX"),
|
|
207
|
+
)(response, req, { extraFields: responseFields });
|
|
208
|
+
if (!result.ok) {
|
|
209
|
+
return [result, { status: "complete", request: req, response }];
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return [result, { status: "complete", request: req, response }];
|
|
213
|
+
}
|
package/src/funcs/reposUpdate.ts
CHANGED
|
@@ -39,10 +39,13 @@ import { Result } from "../types/fp.js";
|
|
|
39
39
|
* protocol planes never change it): it types a legacy `kind: null`
|
|
40
40
|
* repository and corrects a wrong kind. `repo`, `model` and `dataset`
|
|
41
41
|
* convert freely and any repository may become `image`; a repository
|
|
42
|
-
*
|
|
43
|
-
* — leaving `image`, or typing a legacy `null` row as
|
|
44
|
-
* refused with `409 kind_has_content` (
|
|
45
|
-
*
|
|
42
|
+
* whose container images are still named by a tag can be given no
|
|
43
|
+
* other kind — leaving `image`, or typing a legacy `null` row as
|
|
44
|
+
* anything else, is refused with `409 kind_has_content` (list and
|
|
45
|
+
* delete the tags through this API first). A switch away from `image`
|
|
46
|
+
* collects every image no tag reaches before it is judged, so an image
|
|
47
|
+
* only ever pushed by digest, or untagged through the registry, never
|
|
48
|
+
* blocks it. A kind is never un-set.
|
|
46
49
|
*
|
|
47
50
|
* If set, this operation will use {@link Security.bearerAuth} from the global security.
|
|
48
51
|
*/
|
package/src/lib/config.ts
CHANGED
|
@@ -65,7 +65,7 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
|
|
|
65
65
|
export const SDK_METADATA = {
|
|
66
66
|
language: "typescript",
|
|
67
67
|
openapiDocVersion: "1.1.0",
|
|
68
|
-
sdkVersion: "0.54.
|
|
69
|
-
genVersion: "2.
|
|
70
|
-
userAgent: "speakeasy-sdk/typescript 0.54.
|
|
68
|
+
sdkVersion: "0.54.51",
|
|
69
|
+
genVersion: "2.941.0",
|
|
70
|
+
userAgent: "speakeasy-sdk/typescript 0.54.51 2.941.0 1.1.0 @meetkai/mka1",
|
|
71
71
|
} as const;
|
package/src/mcp-server/server.ts
CHANGED
|
@@ -394,6 +394,8 @@ import { tool$reposCreate } from "./tools/reposCreate.js";
|
|
|
394
394
|
import { tool$reposDelete } from "./tools/reposDelete.js";
|
|
395
395
|
import { tool$reposGet } from "./tools/reposGet.js";
|
|
396
396
|
import { tool$reposList } from "./tools/reposList.js";
|
|
397
|
+
import { tool$reposTagsDelete } from "./tools/reposTagsDelete.js";
|
|
398
|
+
import { tool$reposTagsList } from "./tools/reposTagsList.js";
|
|
397
399
|
import { tool$reposUpdate } from "./tools/reposUpdate.js";
|
|
398
400
|
import { tool$sandboxCreate } from "./tools/sandboxCreate.js";
|
|
399
401
|
import { tool$sandboxDownloadArchive } from "./tools/sandboxDownloadArchive.js";
|
|
@@ -468,7 +470,7 @@ export function createMCPServer(deps: {
|
|
|
468
470
|
}) {
|
|
469
471
|
const server = new McpServer({
|
|
470
472
|
name: "SDK",
|
|
471
|
-
version: "0.54.
|
|
473
|
+
version: "0.54.51",
|
|
472
474
|
});
|
|
473
475
|
|
|
474
476
|
const client = new SDKCore({
|
|
@@ -919,6 +921,8 @@ export function createMCPServer(deps: {
|
|
|
919
921
|
tool(tool$authClusterInviteInfo);
|
|
920
922
|
tool(tool$authClusterAcceptInvite);
|
|
921
923
|
tool(tool$authApiKeyGetJwtFromKey);
|
|
924
|
+
tool(tool$reposTagsList);
|
|
925
|
+
tool(tool$reposTagsDelete);
|
|
922
926
|
tool(tool$trackingExperimentsCreate);
|
|
923
927
|
tool(tool$trackingExperimentsSearch);
|
|
924
928
|
tool(tool$trackingExperimentsGet);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { reposTagsDelete } from "../../funcs/reposTagsDelete.js";
|
|
6
|
+
import * as operations from "../../models/operations/index.js";
|
|
7
|
+
import { formatResult, ToolDefinition } from "../tools.js";
|
|
8
|
+
|
|
9
|
+
const args = {
|
|
10
|
+
request: operations.DeleteRepoTagRequest$inboundSchema,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const tool$reposTagsDelete: ToolDefinition<typeof args> = {
|
|
14
|
+
name: "repos-tags-delete",
|
|
15
|
+
description: `Delete an image tag
|
|
16
|
+
|
|
17
|
+
Removes one tag; org owner/admin only (\`write:repos\` for a key). The
|
|
18
|
+
same untag as the registry's \`DELETE /v2/{org}/{name}/manifests/{tag}\`:
|
|
19
|
+
the name goes and the image stays, reachable by digest and by any
|
|
20
|
+
other tag that names it.
|
|
21
|
+
|
|
22
|
+
What makes a repository convertible afterwards is the kind switch
|
|
23
|
+
itself: \`PATCH\` to another \`kind\` first collects every image no tag
|
|
24
|
+
reaches (a multi-arch index's per-platform images included) and is
|
|
25
|
+
refused with \`409 kind_has_content\` only for images a tag still
|
|
26
|
+
names. So delete the tags the listing shows, then switch.
|
|
27
|
+
`,
|
|
28
|
+
args,
|
|
29
|
+
tool: async (client, args, ctx) => {
|
|
30
|
+
const [result, apiCall] = await reposTagsDelete(
|
|
31
|
+
client,
|
|
32
|
+
args.request,
|
|
33
|
+
{ fetchOptions: { signal: ctx.signal } },
|
|
34
|
+
).$inspect();
|
|
35
|
+
|
|
36
|
+
if (!result.ok) {
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: result.error.message }],
|
|
39
|
+
isError: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return formatResult(void 0, apiCall);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { reposTagsList } from "../../funcs/reposTagsList.js";
|
|
6
|
+
import * as operations from "../../models/operations/index.js";
|
|
7
|
+
import { formatResult, ToolDefinition } from "../tools.js";
|
|
8
|
+
|
|
9
|
+
const args = {
|
|
10
|
+
request: operations.ListRepoTagsRequest$inboundSchema,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const tool$reposTagsList: ToolDefinition<typeof args> = {
|
|
14
|
+
name: "repos-tags-list",
|
|
15
|
+
description: `List an image repository's tags
|
|
16
|
+
|
|
17
|
+
Lists the container-image tags a repository holds, newest-moved first,
|
|
18
|
+
each with the manifest it points at, the manifest's media type, the
|
|
19
|
+
image's declared size and when the tag last moved. The same access
|
|
20
|
+
check as reading the repository (org owner/admin; \`read:repos\` for a
|
|
21
|
+
key).
|
|
22
|
+
|
|
23
|
+
It is a fact about what the repository HOLDS, not about its \`kind\`:
|
|
24
|
+
a \`model\` lists \`[]\`, and a legacy \`kind: null\` repository that still
|
|
25
|
+
holds images lists them — those are the tags a \`409 kind_has_content\`
|
|
26
|
+
on PATCH is about, and deleting them through this API is what makes
|
|
27
|
+
that PATCH go through.
|
|
28
|
+
|
|
29
|
+
One page, of at most 1000 tags; \`truncated\` says whether the
|
|
30
|
+
repository holds more. The registry's own \`GET /v2/{org}/{name}/tags/list\`
|
|
31
|
+
is the paginated, names-only listing every OCI client speaks.
|
|
32
|
+
`,
|
|
33
|
+
args,
|
|
34
|
+
tool: async (client, args, ctx) => {
|
|
35
|
+
const [result, apiCall] = await reposTagsList(
|
|
36
|
+
client,
|
|
37
|
+
args.request,
|
|
38
|
+
{ fetchOptions: { signal: ctx.signal } },
|
|
39
|
+
).$inspect();
|
|
40
|
+
|
|
41
|
+
if (!result.ok) {
|
|
42
|
+
return {
|
|
43
|
+
content: [{ type: "text", text: result.error.message }],
|
|
44
|
+
isError: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const value = result.value;
|
|
49
|
+
|
|
50
|
+
return formatResult(value, apiCall);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
@@ -22,10 +22,13 @@ only. The repository id is stable, so a rename is a one-row DB update
|
|
|
22
22
|
protocol planes never change it): it types a legacy \`kind: null\`
|
|
23
23
|
repository and corrects a wrong kind. \`repo\`, \`model\` and \`dataset\`
|
|
24
24
|
convert freely and any repository may become \`image\`; a repository
|
|
25
|
-
|
|
26
|
-
— leaving \`image\`, or typing a legacy \`null\` row as
|
|
27
|
-
refused with \`409 kind_has_content\` (
|
|
28
|
-
|
|
25
|
+
whose container images are still named by a tag can be given no
|
|
26
|
+
other kind — leaving \`image\`, or typing a legacy \`null\` row as
|
|
27
|
+
anything else, is refused with \`409 kind_has_content\` (list and
|
|
28
|
+
delete the tags through this API first). A switch away from \`image\`
|
|
29
|
+
collects every image no tag reaches before it is judged, so an image
|
|
30
|
+
only ever pushed by digest, or untagged through the registry, never
|
|
31
|
+
blocks it. A kind is never un-set.
|
|
29
32
|
`,
|
|
30
33
|
args,
|
|
31
34
|
tool: async (client, args, ctx) => {
|
|
@@ -523,6 +523,8 @@ export * from "./reinforcementhyperparameters.js";
|
|
|
523
523
|
export * from "./repo.js";
|
|
524
524
|
export * from "./repokind.js";
|
|
525
525
|
export * from "./repositorylist.js";
|
|
526
|
+
export * from "./repotag.js";
|
|
527
|
+
export * from "./repotaglist.js";
|
|
526
528
|
export * from "./requestcounts.js";
|
|
527
529
|
export * from "./resolvedreference.js";
|
|
528
530
|
export * from "./resolvereferencerequest.js";
|
|
@@ -15,6 +15,16 @@ import {
|
|
|
15
15
|
|
|
16
16
|
export type Repo = {
|
|
17
17
|
createdAt: Date;
|
|
18
|
+
/**
|
|
19
|
+
* The user id of whoever created the repository, through any plane
|
|
20
|
+
*
|
|
21
|
+
* @remarks
|
|
22
|
+
* (the API, `git push`, the HF client, the OCI registry). It is the
|
|
23
|
+
* same id the platform session and mk-authentication's members
|
|
24
|
+
* directory use, so a name is one directory lookup away. `null`
|
|
25
|
+
* for a row that records no user id; never an empty string.
|
|
26
|
+
*/
|
|
27
|
+
creator: string | null;
|
|
18
28
|
description: string;
|
|
19
29
|
/**
|
|
20
30
|
* Opaque, stable repository id (the canonical key; not a user label).
|
|
@@ -44,6 +54,7 @@ export const Repo$inboundSchema: z.ZodType<Repo, z.ZodTypeDef, unknown> = z
|
|
|
44
54
|
created_at: z.string().datetime({ offset: true }).transform(v =>
|
|
45
55
|
new Date(v)
|
|
46
56
|
),
|
|
57
|
+
creator: z.nullable(z.string()),
|
|
47
58
|
description: z.string(),
|
|
48
59
|
id: z.string(),
|
|
49
60
|
kind: z.nullable(RepoKind$inboundSchema),
|
|
@@ -57,6 +68,7 @@ export const Repo$inboundSchema: z.ZodType<Repo, z.ZodTypeDef, unknown> = z
|
|
|
57
68
|
/** @internal */
|
|
58
69
|
export type Repo$Outbound = {
|
|
59
70
|
created_at: string;
|
|
71
|
+
creator: string | null;
|
|
60
72
|
description: string;
|
|
61
73
|
id: string;
|
|
62
74
|
kind: string | null;
|
|
@@ -68,6 +80,7 @@ export type Repo$Outbound = {
|
|
|
68
80
|
export const Repo$outboundSchema: z.ZodType<Repo$Outbound, z.ZodTypeDef, Repo> =
|
|
69
81
|
z.object({
|
|
70
82
|
createdAt: z.date().transform(v => v.toISOString()),
|
|
83
|
+
creator: z.nullable(z.string()),
|
|
71
84
|
description: z.string(),
|
|
72
85
|
id: z.string(),
|
|
73
86
|
kind: z.nullable(RepoKind$outboundSchema),
|