@sealant/api-contracts-next 0.0.0-next.0 → 0.39.0-next.682

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 (40) hide show
  1. package/LICENSE +202 -0
  2. package/dist/core-api/access-tokens.d.ts +126 -0
  3. package/dist/core-api/access-tokens.js +72 -0
  4. package/dist/core-api/budgets.d.ts +15 -0
  5. package/dist/core-api/budgets.js +13 -0
  6. package/dist/core-api/connected-accounts.d.ts +226 -0
  7. package/dist/core-api/connected-accounts.js +128 -0
  8. package/dist/core-api/control-plane.d.ts +1318 -0
  9. package/dist/core-api/control-plane.js +31 -0
  10. package/dist/core-api/github.d.ts +261 -0
  11. package/dist/core-api/github.js +153 -0
  12. package/dist/core-api/inference.d.ts +223 -0
  13. package/dist/core-api/inference.js +139 -0
  14. package/dist/core-api/oci-names.d.ts +21 -0
  15. package/dist/core-api/oci-names.js +44 -0
  16. package/dist/core-api/packages.d.ts +179 -0
  17. package/dist/core-api/packages.js +60 -0
  18. package/dist/core-api/profiles.d.ts +188 -0
  19. package/dist/core-api/profiles.js +88 -0
  20. package/dist/core-api/record-events.d.ts +209 -0
  21. package/dist/core-api/record-events.js +193 -0
  22. package/dist/core-api/registries.d.ts +106 -0
  23. package/dist/core-api/registries.js +85 -0
  24. package/dist/core-api/runs.d.ts +516 -0
  25. package/dist/core-api/runs.js +284 -0
  26. package/dist/core-api/sessions.d.ts +390 -0
  27. package/dist/core-api/sessions.js +264 -0
  28. package/dist/core-api/ssh-keys.d.ts +120 -0
  29. package/dist/core-api/ssh-keys.js +108 -0
  30. package/dist/core-api/system.d.ts +51 -0
  31. package/dist/core-api/system.js +41 -0
  32. package/dist/core-api/users.d.ts +71 -0
  33. package/dist/core-api/users.js +48 -0
  34. package/dist/core-api/workspaces.d.ts +1880 -0
  35. package/dist/core-api/workspaces.js +980 -0
  36. package/dist/index.d.ts +18 -0
  37. package/dist/index.js +18 -0
  38. package/dist/workspace-environment.d.ts +124 -0
  39. package/dist/workspace-environment.js +259 -0
  40. package/package.json +31 -9
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Record-event taxonomy — the TYPED payload schemas behind `TimelineEntry.kind`/`ref` and
3
+ * `RunEvent.payloadCase`/`payload`.
4
+ *
5
+ * The execution record's event kinds come from the sealantd protocol (`@sealant/runtime-protocol`
6
+ * `EventEnvelope.payload` oneof); ingest stores each payload as jsonb with the oneof case name as
7
+ * the `kind`. These schemas describe that STORED/SERVED shape exactly:
8
+ *
9
+ * - uint64/int64 protobuf fields are DECIMAL STRINGS (bigints are stringified at ingest so values
10
+ * past 2^53 survive jsonb);
11
+ * - protobuf enum fields are NUMBERS (`RuntimeState`, `ExitReason`, `StreamKind`, `FileChangeKind`,
12
+ * `FileType`, `NetworkScheme`, `EventPriority` — same convention as the envelope's
13
+ * `captureMethod`/`confidence`);
14
+ * - proto3 `optional` fields are absent when unset; implicit scalars are always present;
15
+ * - decode strips ingest artifacts (e.g. the protobuf `$typeName` marker).
16
+ *
17
+ * `decodeRecordEventPayload` folds a `(kind, ref)` pair into the discriminated union, degrading to
18
+ * the `unknown` case (with the raw kind + payload preserved) for kinds this contract version does
19
+ * not model or payloads that fail their schema — forward compatibility is a case, not an error.
20
+ *
21
+ * The kind list deliberately mirrors `payloadCaseValues` in `@sealant/telemetry` (guarded by a test
22
+ * there); this contract does not depend on the telemetry package.
23
+ */
24
+ import { Schema } from "effect";
25
+ /** Every event kind the platform records today, plus `unknown` for an unmodeled/absent oneof. */
26
+ export const recordEventKindValues = [
27
+ "runtimeStateChanged",
28
+ "runtimeHeartbeat",
29
+ "processStarted",
30
+ "processExited",
31
+ "ioChunk",
32
+ "telemetryDropped",
33
+ "fileChange",
34
+ "fileWatchOverflow",
35
+ "fileSnapshotCompleted",
36
+ "fileDiffAvailable",
37
+ "networkRequest",
38
+ "networkSourceObserved",
39
+ "unknown",
40
+ ];
41
+ export const recordEventKindSchema = Schema.Literals(recordEventKindValues);
42
+ /** Decimal-string int64/uint64 (bigints are stringified at ingest). */
43
+ const DecimalString = Schema.String;
44
+ // ---------------------------------------------------------------------------------------------
45
+ // Per-kind payload schemas (the jsonb `ref` / `payload` shape on the wire)
46
+ // ---------------------------------------------------------------------------------------------
47
+ /** `sealant.v1.RuntimeStateChanged` — `state` is a numeric `RuntimeState`. */
48
+ export const runtimeStateChangedEventSchema = Schema.Struct({
49
+ state: Schema.Number,
50
+ reason: Schema.optional(Schema.String),
51
+ });
52
+ /** `sealant.v1.RuntimeHeartbeat` — `state` is a numeric `RuntimeState`. */
53
+ export const runtimeHeartbeatEventSchema = Schema.Struct({
54
+ state: Schema.Number,
55
+ });
56
+ /** `sealant.v1.ProcessStarted` — a supervised process began executing. */
57
+ export const processStartedEventSchema = Schema.Struct({
58
+ pid: Schema.Number,
59
+ pgid: Schema.Number,
60
+ pidfd: Schema.Boolean,
61
+ executable: Schema.String,
62
+ args: Schema.Array(Schema.String),
63
+ cwd: Schema.String,
64
+ /** Wall clock at start, microseconds (decimal-string int64). */
65
+ startedAt: DecimalString,
66
+ });
67
+ /** `sealant.v1.ProcessExited` — `reason` is a numeric `ExitReason`. */
68
+ export const processExitedEventSchema = Schema.Struct({
69
+ exitCode: Schema.optional(Schema.Number),
70
+ signal: Schema.optional(Schema.Number),
71
+ reason: Schema.Number,
72
+ /** Wall-clock duration, microseconds (decimal-string uint64). */
73
+ durationMicros: DecimalString,
74
+ });
75
+ /**
76
+ * `sealant.v1.IoChunk`, as ingest stores it: raw bytes are offloaded to the artifact store and
77
+ * replaced by a content hash; byte-exact text is served by the scrollback endpoint, not the record.
78
+ * `stream` is a numeric `StreamKind` (stdout = 2, stderr = 3).
79
+ */
80
+ export const ioChunkEventSchema = Schema.Struct({
81
+ stream: Schema.Number,
82
+ byteCount: DecimalString,
83
+ streamOffset: DecimalString,
84
+ contentAlgo: Schema.optional(Schema.String),
85
+ contentHash: Schema.optional(Schema.String),
86
+ transform: Schema.optional(Schema.Struct({
87
+ redacted: Schema.Boolean,
88
+ truncated: Schema.Boolean,
89
+ coalesced: Schema.Boolean,
90
+ originalByteCount: Schema.optional(DecimalString),
91
+ })),
92
+ });
93
+ /** `sealant.v1.TelemetryDropped` — `priority` is a numeric `EventPriority`. */
94
+ export const telemetryDroppedEventSchema = Schema.Struct({
95
+ reason: Schema.String,
96
+ count: DecimalString,
97
+ priority: Schema.Number,
98
+ });
99
+ /** `sealant.v1.FileEntry` — `fileType` is a numeric `FileType`. */
100
+ export const fileEntrySchema = Schema.Struct({
101
+ path: Schema.String,
102
+ fileType: Schema.Number,
103
+ size: DecimalString,
104
+ mtimeMicros: DecimalString,
105
+ mode: Schema.Number,
106
+ hash: Schema.optional(Schema.String),
107
+ symlinkTarget: Schema.optional(Schema.String),
108
+ });
109
+ /** `sealant.v1.FileChange` — `kind` is a numeric `FileChangeKind`. */
110
+ export const fileChangeEventSchema = Schema.Struct({
111
+ kind: Schema.Number,
112
+ path: Schema.String,
113
+ renameFrom: Schema.optional(Schema.String),
114
+ entry: Schema.optional(fileEntrySchema),
115
+ certain: Schema.Boolean,
116
+ });
117
+ /** `sealant.v1.FileWatchOverflow` — changes under `root` may have been missed. */
118
+ export const fileWatchOverflowEventSchema = Schema.Struct({
119
+ root: Schema.String,
120
+ });
121
+ /** `sealant.v1.FileSnapshotCompleted` */
122
+ export const fileSnapshotCompletedEventSchema = Schema.Struct({
123
+ root: Schema.String,
124
+ fileCount: DecimalString,
125
+ });
126
+ /** `sealant.v1.FileDiffAvailable` — per-kind counts as decimal-string uint64. */
127
+ export const fileDiffAvailableEventSchema = Schema.Struct({
128
+ added: DecimalString,
129
+ modified: DecimalString,
130
+ deleted: DecimalString,
131
+ renamed: DecimalString,
132
+ });
133
+ /** `sealant.v1.NetworkRequest` — `scheme` is a numeric `NetworkScheme`. */
134
+ export const networkRequestEventSchema = Schema.Struct({
135
+ scheme: Schema.Number,
136
+ method: Schema.optional(Schema.String),
137
+ host: Schema.String,
138
+ port: Schema.Number,
139
+ path: Schema.optional(Schema.String),
140
+ status: Schema.optional(Schema.Number),
141
+ bytesSent: DecimalString,
142
+ bytesReceived: DecimalString,
143
+ durationMicros: DecimalString,
144
+ });
145
+ /** `sealant.v1.NetworkSourceObserved` — a network source the run touched (the "sources" trail). */
146
+ export const networkSourceObservedEventSchema = Schema.Struct({
147
+ host: Schema.String,
148
+ resolvedIps: Schema.Array(Schema.String),
149
+ port: Schema.Number,
150
+ scheme: Schema.optional(Schema.Number),
151
+ method: Schema.optional(Schema.String),
152
+ path: Schema.optional(Schema.String),
153
+ status: Schema.optional(Schema.Number),
154
+ });
155
+ /**
156
+ * Wraps one kind's schema into a total decoder: a payload that fails its schema degrades to the
157
+ * `unknown` case rather than throwing. The generic RETURN type (not a constrained construction)
158
+ * keeps kind/data correlated without casts.
159
+ */
160
+ const eventCase = (kind, schema) => {
161
+ const decode = Schema.decodeUnknownSync(schema);
162
+ return (ref) => {
163
+ try {
164
+ return { kind, data: decode(ref) };
165
+ }
166
+ catch {
167
+ return { kind: "unknown", rawKind: kind, data: ref };
168
+ }
169
+ };
170
+ };
171
+ const decoders = {
172
+ runtimeStateChanged: eventCase("runtimeStateChanged", runtimeStateChangedEventSchema),
173
+ runtimeHeartbeat: eventCase("runtimeHeartbeat", runtimeHeartbeatEventSchema),
174
+ processStarted: eventCase("processStarted", processStartedEventSchema),
175
+ processExited: eventCase("processExited", processExitedEventSchema),
176
+ ioChunk: eventCase("ioChunk", ioChunkEventSchema),
177
+ telemetryDropped: eventCase("telemetryDropped", telemetryDroppedEventSchema),
178
+ fileChange: eventCase("fileChange", fileChangeEventSchema),
179
+ fileWatchOverflow: eventCase("fileWatchOverflow", fileWatchOverflowEventSchema),
180
+ fileSnapshotCompleted: eventCase("fileSnapshotCompleted", fileSnapshotCompletedEventSchema),
181
+ fileDiffAvailable: eventCase("fileDiffAvailable", fileDiffAvailableEventSchema),
182
+ networkRequest: eventCase("networkRequest", networkRequestEventSchema),
183
+ networkSourceObserved: eventCase("networkSourceObserved", networkSourceObservedEventSchema),
184
+ };
185
+ /**
186
+ * Folds a wire `(kind, ref)` pair — `TimelineEntry.kind`/`ref` or `RunEvent.payloadCase`/`payload` —
187
+ * into the discriminated {@link RecordEventPayload}. NEVER throws: unmodeled kinds and non-conforming
188
+ * payloads come back as the `unknown` case with the raw data preserved.
189
+ */
190
+ export const decodeRecordEventPayload = (kind, ref) => {
191
+ const decoder = decoders[kind];
192
+ return decoder === undefined ? { kind: "unknown", rawKind: kind, data: ref } : decoder(ref);
193
+ };
@@ -0,0 +1,106 @@
1
+ import { Schema } from "effect";
2
+ import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
3
+ export declare const registryIdParamsSchema: Schema.Struct<{
4
+ readonly registryId: Schema.String;
5
+ }>;
6
+ export type RegistryIdParams = typeof registryIdParamsSchema.Type;
7
+ export declare const registrySummarySchema: Schema.Struct<{
8
+ readonly name: Schema.String;
9
+ readonly baseUrl: Schema.String;
10
+ readonly pushRegistry: Schema.String;
11
+ readonly hasBasicAuth: Schema.Boolean;
12
+ }>;
13
+ export type RegistrySummary = typeof registrySummarySchema.Type;
14
+ export declare const registryPingSchema: Schema.Struct<{
15
+ readonly name: Schema.String;
16
+ readonly reachable: Schema.Literal<true>;
17
+ }>;
18
+ export type RegistryPing = typeof registryPingSchema.Type;
19
+ export declare const registryExtensionSchema: Schema.Struct<{
20
+ readonly name: Schema.String;
21
+ readonly url: Schema.optional<Schema.String>;
22
+ readonly description: Schema.optional<Schema.String>;
23
+ readonly endpoints: Schema.$Array<Schema.String>;
24
+ }>;
25
+ export declare const registryExtensionsResponseSchema: Schema.Struct<{
26
+ readonly extensions: Schema.$Array<Schema.Struct<{
27
+ readonly name: Schema.String;
28
+ readonly url: Schema.optional<Schema.String>;
29
+ readonly description: Schema.optional<Schema.String>;
30
+ readonly endpoints: Schema.$Array<Schema.String>;
31
+ }>>;
32
+ }>;
33
+ export type RegistryExtensionsResponse = typeof registryExtensionsResponseSchema.Type;
34
+ export declare const registryTagsQuerySchema: Schema.Struct<{
35
+ readonly repository: Schema.String;
36
+ }>;
37
+ export type RegistryTagsQuery = typeof registryTagsQuerySchema.Type;
38
+ export declare const registryTagsResponseSchema: Schema.Struct<{
39
+ readonly repository: Schema.String;
40
+ readonly tags: Schema.$Array<Schema.String>;
41
+ }>;
42
+ export type RegistryTagsResponse = typeof registryTagsResponseSchema.Type;
43
+ export declare const registryManifestQuerySchema: Schema.Struct<{
44
+ readonly repository: Schema.String;
45
+ readonly reference: Schema.String;
46
+ }>;
47
+ export type RegistryManifestQuery = typeof registryManifestQuerySchema.Type;
48
+ export declare const registryManifestResponseSchema: Schema.Struct<{
49
+ readonly repository: Schema.String;
50
+ readonly reference: Schema.String;
51
+ readonly digest: Schema.optional<Schema.String>;
52
+ readonly contentType: Schema.Union<readonly [Schema.String, Schema.Null]>;
53
+ readonly manifest: Schema.Unknown;
54
+ }>;
55
+ export type RegistryManifestResponse = typeof registryManifestResponseSchema.Type;
56
+ declare const RegistriesNotFoundError_base: Schema.Class<RegistriesNotFoundError, Schema.TaggedStruct<"RegistriesNotFoundError", {
57
+ readonly message: Schema.String;
58
+ }>, import("effect/Cause").YieldableError>;
59
+ export declare class RegistriesNotFoundError extends RegistriesNotFoundError_base {
60
+ }
61
+ declare const RegistriesBadGatewayError_base: Schema.Class<RegistriesBadGatewayError, Schema.TaggedStruct<"RegistriesBadGatewayError", {
62
+ readonly message: Schema.String;
63
+ }>, import("effect/Cause").YieldableError>;
64
+ export declare class RegistriesBadGatewayError extends RegistriesBadGatewayError_base {
65
+ }
66
+ export declare const RegistriesGroup: HttpApiGroup.HttpApiGroup<"registries", HttpApiEndpoint.HttpApiEndpoint<"getRegistry", "GET", "/:registryId", HttpApiEndpoint.StringTree<Schema.Struct<{
67
+ readonly registryId: Schema.String;
68
+ }>>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<Schema.Struct<{
69
+ readonly name: Schema.String;
70
+ readonly baseUrl: Schema.String;
71
+ readonly pushRegistry: Schema.String;
72
+ readonly hasBasicAuth: Schema.Boolean;
73
+ }>>, HttpApiEndpoint.Json<typeof RegistriesNotFoundError>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"getRegistryManifest", "GET", "/:registryId/manifest", HttpApiEndpoint.StringTree<Schema.Struct<{
74
+ readonly registryId: Schema.String;
75
+ }>>, HttpApiEndpoint.StringTree<Schema.Struct<{
76
+ readonly repository: Schema.String;
77
+ readonly reference: Schema.String;
78
+ }>>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<Schema.Struct<{
79
+ readonly repository: Schema.String;
80
+ readonly reference: Schema.String;
81
+ readonly digest: Schema.optional<Schema.String>;
82
+ readonly contentType: Schema.Union<readonly [Schema.String, Schema.Null]>;
83
+ readonly manifest: Schema.Unknown;
84
+ }>>, HttpApiEndpoint.Json<typeof RegistriesNotFoundError | typeof RegistriesBadGatewayError>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"listRegistryExtensions", "GET", "/:registryId/extensions", HttpApiEndpoint.StringTree<Schema.Struct<{
85
+ readonly registryId: Schema.String;
86
+ }>>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<Schema.Struct<{
87
+ readonly extensions: Schema.$Array<Schema.Struct<{
88
+ readonly name: Schema.String;
89
+ readonly url: Schema.optional<Schema.String>;
90
+ readonly description: Schema.optional<Schema.String>;
91
+ readonly endpoints: Schema.$Array<Schema.String>;
92
+ }>>;
93
+ }>>, HttpApiEndpoint.Json<typeof RegistriesNotFoundError | typeof RegistriesBadGatewayError>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"listRegistryTags", "GET", "/:registryId/tags", HttpApiEndpoint.StringTree<Schema.Struct<{
94
+ readonly registryId: Schema.String;
95
+ }>>, HttpApiEndpoint.StringTree<Schema.Struct<{
96
+ readonly repository: Schema.String;
97
+ }>>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<Schema.Struct<{
98
+ readonly repository: Schema.String;
99
+ readonly tags: Schema.$Array<Schema.String>;
100
+ }>>, HttpApiEndpoint.Json<typeof RegistriesNotFoundError | typeof RegistriesBadGatewayError>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"pingRegistry", "GET", "/:registryId/ping", HttpApiEndpoint.StringTree<Schema.Struct<{
101
+ readonly registryId: Schema.String;
102
+ }>>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<Schema.Struct<{
103
+ readonly name: Schema.String;
104
+ readonly reachable: Schema.Literal<true>;
105
+ }>>, HttpApiEndpoint.Json<typeof RegistriesNotFoundError | typeof RegistriesBadGatewayError>, never, never>, false>;
106
+ export {};
@@ -0,0 +1,85 @@
1
+ import { Schema } from "effect";
2
+ import { HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi";
3
+ import { isOciReference, isOciRepository, OCI_REFERENCE_MESSAGE, OCI_REPOSITORY_MESSAGE, } from "./oci-names.js";
4
+ const NonEmptyString = Schema.String.check(Schema.isNonEmpty(), Schema.isTrimmed());
5
+ /** Refused, never repaired: these become registry URL path segments (CORE-08). */
6
+ const OciRepository = NonEmptyString.check(Schema.makeFilter((value) => isOciRepository(value) ? undefined : `repository ${OCI_REPOSITORY_MESSAGE}`));
7
+ const OciReference = NonEmptyString.check(Schema.makeFilter((value) => isOciReference(value) ? undefined : `reference ${OCI_REFERENCE_MESSAGE}`));
8
+ export const registryIdParamsSchema = Schema.Struct({
9
+ registryId: NonEmptyString,
10
+ });
11
+ export const registrySummarySchema = Schema.Struct({
12
+ name: NonEmptyString,
13
+ baseUrl: Schema.String,
14
+ pushRegistry: NonEmptyString,
15
+ hasBasicAuth: Schema.Boolean,
16
+ });
17
+ export const registryPingSchema = Schema.Struct({
18
+ name: NonEmptyString,
19
+ reachable: Schema.Literal(true),
20
+ });
21
+ export const registryExtensionSchema = Schema.Struct({
22
+ name: NonEmptyString,
23
+ url: Schema.optional(Schema.String),
24
+ description: Schema.optional(Schema.String),
25
+ endpoints: Schema.Array(Schema.String),
26
+ });
27
+ export const registryExtensionsResponseSchema = Schema.Struct({
28
+ extensions: Schema.Array(registryExtensionSchema),
29
+ });
30
+ export const registryTagsQuerySchema = Schema.Struct({
31
+ repository: OciRepository,
32
+ });
33
+ export const registryTagsResponseSchema = Schema.Struct({
34
+ repository: NonEmptyString,
35
+ tags: Schema.Array(Schema.String),
36
+ });
37
+ export const registryManifestQuerySchema = Schema.Struct({
38
+ repository: OciRepository,
39
+ reference: OciReference,
40
+ });
41
+ export const registryManifestResponseSchema = Schema.Struct({
42
+ repository: NonEmptyString,
43
+ reference: NonEmptyString,
44
+ digest: Schema.optional(Schema.String),
45
+ contentType: Schema.Union([Schema.String, Schema.Null]),
46
+ manifest: Schema.Unknown,
47
+ });
48
+ export class RegistriesNotFoundError extends Schema.TaggedErrorClass()("RegistriesNotFoundError", {
49
+ message: Schema.String,
50
+ }, { httpApiStatus: 404 }) {
51
+ }
52
+ export class RegistriesBadGatewayError extends Schema.TaggedErrorClass()("RegistriesBadGatewayError", {
53
+ message: Schema.String,
54
+ }, { httpApiStatus: 502 }) {
55
+ }
56
+ const registryIdParams = Schema.Struct({ registryId: NonEmptyString });
57
+ export const RegistriesGroup = HttpApiGroup.make("registries")
58
+ .add(HttpApiEndpoint.get("getRegistry", "/:registryId", {
59
+ params: registryIdParams,
60
+ success: registrySummarySchema,
61
+ error: RegistriesNotFoundError,
62
+ }))
63
+ .add(HttpApiEndpoint.get("pingRegistry", "/:registryId/ping", {
64
+ params: registryIdParams,
65
+ success: registryPingSchema,
66
+ error: [RegistriesNotFoundError, RegistriesBadGatewayError],
67
+ }))
68
+ .add(HttpApiEndpoint.get("listRegistryExtensions", "/:registryId/extensions", {
69
+ params: registryIdParams,
70
+ success: registryExtensionsResponseSchema,
71
+ error: [RegistriesNotFoundError, RegistriesBadGatewayError],
72
+ }))
73
+ .add(HttpApiEndpoint.get("listRegistryTags", "/:registryId/tags", {
74
+ params: registryIdParams,
75
+ query: registryTagsQuerySchema,
76
+ success: registryTagsResponseSchema,
77
+ error: [RegistriesNotFoundError, RegistriesBadGatewayError],
78
+ }))
79
+ .add(HttpApiEndpoint.get("getRegistryManifest", "/:registryId/manifest", {
80
+ params: registryIdParams,
81
+ query: registryManifestQuerySchema,
82
+ success: registryManifestResponseSchema,
83
+ error: [RegistriesNotFoundError, RegistriesBadGatewayError],
84
+ }))
85
+ .annotate(OpenApi.Description, "Registry metadata and OCI read operations.");