@artifact-keeper/sdk 1.5.8 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/types.gen.ts CHANGED
@@ -4,6 +4,50 @@ export type ClientOptions = {
4
4
  baseUrl: `${string}://${string}` | (string & {});
5
5
  };
6
6
 
7
+ /**
8
+ * One principal that can read an affected artifact but has not downloaded it.
9
+ */
10
+ export type AccessibleUser = {
11
+ /**
12
+ * Always `has-access` for this endpoint (accessible minus downloaded).
13
+ */
14
+ reason: string;
15
+ user_id: string;
16
+ username: string;
17
+ /**
18
+ * How access is granted: `admin` (global), `permission` (fine-grained
19
+ * direct **or** group grant, repo or owning project), or `role`
20
+ * (role_assignment only). Direct and group grants both surface as
21
+ * `permission` because they share one read fragment.
22
+ */
23
+ via: string;
24
+ };
25
+
26
+ /**
27
+ * Full accessible-but-not-downloaded report for a CVE or artifact, scoped to
28
+ * one restricted repository.
29
+ */
30
+ export type AccessibleUsersResponse = {
31
+ /**
32
+ * The page of accessible-but-not-downloaded principals. Empty when
33
+ * `exposure != "enumerable"`.
34
+ */
35
+ accessible_not_downloaded: Array<AccessibleUser>;
36
+ /**
37
+ * `enumerable` | `everyone` | `effectively-everyone`.
38
+ */
39
+ exposure: string;
40
+ page: number;
41
+ per_page: number;
42
+ repository: RepoExposure;
43
+ target: BlastRadiusTargetInfo;
44
+ /**
45
+ * Total accessible-not-downloaded principals (the pagination total).
46
+ * `null` for `public` repos (never enumerated).
47
+ */
48
+ total?: number | null;
49
+ };
50
+
7
51
  export type AcknowledgeRequest = {
8
52
  reason: string;
9
53
  };
@@ -28,6 +72,19 @@ export type AddPeerLabelRequest = {
28
72
  value?: string;
29
73
  };
30
74
 
75
+ export type AddProjectMemberRequest = {
76
+ /**
77
+ * Actions granted on every repository in the project (e.g. ["read"],
78
+ * ["read", "write"]).
79
+ */
80
+ actions: Array<string>;
81
+ principal_id: string;
82
+ /**
83
+ * "user" or "group".
84
+ */
85
+ principal_type: string;
86
+ };
87
+
31
88
  export type AddVirtualMemberRequest = {
32
89
  member_key: string;
33
90
  priority?: number | null;
@@ -246,7 +303,19 @@ export type ArtifactListResponse = {
246
303
  * Docker tag grouping. Only present when `group_by=docker_tag`.
247
304
  */
248
305
  docker_tags?: Array<DockerTagResponse> | null;
306
+ /**
307
+ * Whether another page exists after this one (#2520, #2518). Present on
308
+ * keyset-paged listings (flat and grouped); authoritative regardless of
309
+ * the `pagination.total` mode (exact vs lower bound).
310
+ */
311
+ has_more?: boolean | null;
249
312
  items: Array<ArtifactResponse>;
313
+ /**
314
+ * Opaque keyset cursor for the next page (#2520, #2518). Present on
315
+ * keyset-paged listings (flat and grouped) when another page exists;
316
+ * pass it back via `?cursor=`.
317
+ */
318
+ next_cursor?: string | null;
250
319
  pagination: Pagination;
251
320
  };
252
321
 
@@ -296,6 +365,31 @@ export type ArtifactResponse = {
296
365
  } | null;
297
366
  name: string;
298
367
  path: string;
368
+ /**
369
+ * Per-artifact quarantine state so a client/operator can tell which
370
+ * listed artifacts are held for security review (#2940). Always
371
+ * serialized so the listing never hides the control:
372
+ * - `"quarantined"` — held pending review; downloads return 409 (until
373
+ * any `quarantine_until` lapses),
374
+ * - `"rejected"` — terminally blocked by an admin,
375
+ * - a scan-lifecycle state (`"clean"`, `"flagged"`, `"unscanned"`,
376
+ * `"released"`),
377
+ * - `"not_quarantined"` — the explicit default when the row carries no
378
+ * quarantine state, so clients never have to treat a missing value as
379
+ * a state.
380
+ *
381
+ * The human-readable *reason* is intentionally NOT surfaced here: it is
382
+ * per-artifact security detail disclosed only by the authenticated,
383
+ * repository-visibility-checked `GET /api/v1/quarantine/{id}` (#2912),
384
+ * whereas this listing is reachable anonymously on public repositories.
385
+ */
386
+ quarantine_status: string;
387
+ /**
388
+ * When a timed quarantine hold lapses and the artifact becomes
389
+ * downloadable again. `None` for a permanent (admin) quarantine and for
390
+ * artifacts that are not quarantined. (#2940)
391
+ */
392
+ quarantine_until?: string | null;
299
393
  repository_key: string;
300
394
  /**
301
395
  * Server-assigned revision number for repositories with first-class
@@ -439,6 +533,18 @@ export type AuthConfig = {
439
533
  * Whether an LDAP directory is configured.
440
534
  */
441
535
  ldap_enabled: boolean;
536
+ /**
537
+ * Whether the login UI should offer the local username/password form
538
+ * (issue #2621). `true` when no SSO provider is enabled; with SSO
539
+ * enabled it is `true` only when the operator explicitly opted in via
540
+ * `ALLOW_LOCAL_ADMIN_LOGIN=true` and has not enforced strict SSO-only
541
+ * via `SSO_DISABLE_ADMIN_BREAK_GLASS`. Display-only: the login endpoint
542
+ * independently enforces the same policy server-side
543
+ * (`api::handlers::auth::local_login_gate`), so this flag never grants
544
+ * access by itself. LDAP is separate — the UI shows the credentials form
545
+ * for enabled LDAP providers regardless of this flag.
546
+ */
547
+ local_login_enabled: boolean;
442
548
  /**
443
549
  * Whether an OIDC provider is configured.
444
550
  */
@@ -966,7 +1072,40 @@ export type CreateApiTokenResponse = {
966
1072
  };
967
1073
 
968
1074
  export type CreateBackupRequest = {
1075
+ /**
1076
+ * Repository ids to exclude from a full or incremental backup (#2772).
1077
+ *
1078
+ * Airgapped or bandwidth-limited deployments use this to keep specific
1079
+ * repositories out of the backup. When omitted or empty nothing is
1080
+ * excluded, so existing behavior is unchanged. If `repository_ids` is
1081
+ * also supplied the excluded ids are removed from that include list;
1082
+ * otherwise every repository except the excluded ones is backed up.
1083
+ */
1084
+ exclude_repositories?: Array<string> | null;
1085
+ /**
1086
+ * Optional custom name/label for the backup archive (#2790).
1087
+ *
1088
+ * When provided it becomes the identifying part of the archive
1089
+ * filename. Restricted to letters, digits, `.`, `_`, and `-`; when
1090
+ * omitted the archive keeps its default `{uuid}` name.
1091
+ */
1092
+ name?: string | null;
1093
+ /**
1094
+ * Explicit allow-list of repository ids to include in the backup.
1095
+ *
1096
+ * When omitted every repository is backed up (subject to
1097
+ * `exclude_repositories`).
1098
+ */
969
1099
  repository_ids?: Array<string> | null;
1100
+ /**
1101
+ * Optional RFC3339 lower bound on artifact modification time (#2789).
1102
+ *
1103
+ * When set, the (typically incremental) backup includes only artifacts
1104
+ * whose `updated_at` is at or after this timestamp, capturing just the
1105
+ * changes made from the given date/time to now. When omitted every
1106
+ * artifact is included, so backup behavior is unchanged.
1107
+ */
1108
+ since?: string | null;
970
1109
  type?: string | null;
971
1110
  };
972
1111
 
@@ -1065,11 +1204,24 @@ export type CreateLdapConfigRequest = {
1065
1204
  admin_group_dn?: string | null;
1066
1205
  bind_dn?: string | null;
1067
1206
  bind_password?: string | null;
1207
+ /**
1208
+ * Inline PEM CA certificate/chain to trust for this provider's LDAPS/
1209
+ * STARTTLS handshake (migration 174, #2782). Send an empty string to
1210
+ * clear a previously stored certificate.
1211
+ */
1212
+ ca_certificate?: string | null;
1068
1213
  display_name_attribute?: string | null;
1069
1214
  email_attribute?: string | null;
1070
1215
  group_base_dn?: string | null;
1071
1216
  group_filter?: string | null;
1072
1217
  groups_attribute?: string | null;
1218
+ /**
1219
+ * Opt-in (migration 174, #2782): skip TLS certificate verification for
1220
+ * this provider's LDAPS/STARTTLS handshake. Defaults false
1221
+ * (secure-by-default). Only enable for trusted networks / private CAs
1222
+ * you cannot import.
1223
+ */
1224
+ insecure_skip_verify?: boolean | null;
1073
1225
  is_enabled?: boolean | null;
1074
1226
  name: string;
1075
1227
  priority?: number | null;
@@ -1153,6 +1305,16 @@ export type CreatePolicyRequest = {
1153
1305
  require_signature?: boolean;
1154
1306
  };
1155
1307
 
1308
+ export type CreateProjectRequest = {
1309
+ description?: string | null;
1310
+ key: string;
1311
+ name: string;
1312
+ /**
1313
+ * P1: stored only, NOT enforced (quota enforcement is P3).
1314
+ */
1315
+ quota_bytes?: number | null;
1316
+ };
1317
+
1156
1318
  /**
1157
1319
  * Request to create an access token scoped to a repository.
1158
1320
  */
@@ -1198,6 +1360,40 @@ export type CreateRepositoryRequest = {
1198
1360
  * `allow_anonymous_access` takes precedence.
1199
1361
  */
1200
1362
  allow_anonymous_access?: boolean | null;
1363
+ /**
1364
+ * Custom Description field for Debian/APT Release files.
1365
+ * Stored in `repository_config` under `apt_description`.
1366
+ */
1367
+ apt_description?: string | null;
1368
+ /**
1369
+ * Custom Label field for Debian/APT Release files.
1370
+ * Stored in `repository_config` under `apt_label`.
1371
+ */
1372
+ apt_label?: string | null;
1373
+ /**
1374
+ * Custom Origin field for Debian/APT Release files.
1375
+ * Stored in `repository_config` under `apt_origin`.
1376
+ */
1377
+ apt_origin?: string | null;
1378
+ /**
1379
+ * Custom Version field for Debian/APT Release files.
1380
+ * Stored in `repository_config` under `apt_release_version`.
1381
+ */
1382
+ apt_release_version?: string | null;
1383
+ /**
1384
+ * Opt into ingesting UNVERIFIED upstream metadata on the keyless RPM
1385
+ * curation-sync path (#2569). Omit or `false` to keep the fail-closed
1386
+ * default (a keyless curation sync refuses to ingest unverified upstream
1387
+ * packages); `true` reverts to the legacy unverified-ingest behavior. Only
1388
+ * meaningful for RPM curation staging repositories.
1389
+ */
1390
+ curation_allow_unverified?: boolean | null;
1391
+ /**
1392
+ * Custom User-Agent sent on outbound HTTP requests to the upstream for
1393
+ * this repository. Only valid for remote repositories. Max 256 characters.
1394
+ */
1395
+ custom_user_agent?: string | null;
1396
+ debian?: null | DebianRepositoryConfig;
1201
1397
  description?: string | null;
1202
1398
  format: string;
1203
1399
  /**
@@ -1219,6 +1415,31 @@ export type CreateRepositoryRequest = {
1219
1415
  */
1220
1416
  member_repos?: Array<CreateVirtualMemberInput> | null;
1221
1417
  name: string;
1418
+ /**
1419
+ * Whether unscoped npm package names may resolve through this npm Remote
1420
+ * repository (#2424). Stored under `npm_allow_unscoped`.
1421
+ */
1422
+ npm_allow_unscoped?: boolean | null;
1423
+ /**
1424
+ * Allowed npm full-name glob patterns (`*`/`?`) for this npm Remote
1425
+ * repository (#2424). Additive to `npm_allowed_scopes`; stored under
1426
+ * `npm_allowed_name_patterns`. A name is allowed if its scope is allowed
1427
+ * OR any glob matches (e.g. `@acme*`, `internal-*`).
1428
+ */
1429
+ npm_allowed_name_patterns?: Array<string> | null;
1430
+ /**
1431
+ * Allowed npm `@scope` literals for this npm Remote repository (#2424).
1432
+ * Only meaningful for npm-format Remote repositories; validated and stored
1433
+ * in `repository_config` under `npm_allowed_scopes`. Omit to leave the
1434
+ * repository unrestricted by scope.
1435
+ */
1436
+ npm_allowed_scopes?: Array<string> | null;
1437
+ /**
1438
+ * Optional project to assign this repository to (#2472). Grants on the
1439
+ * project (permissions with `target_type = 'project'`) are inherited by
1440
+ * the repository. Omit to leave the repository unassigned.
1441
+ */
1442
+ project_id?: string | null;
1222
1443
  /**
1223
1444
  * When true, direct user uploads to this repository are rejected:
1224
1445
  * artifacts must arrive via the promotion path. Admin-only to set.
@@ -1246,6 +1467,16 @@ export type CreateRepositoryRequest = {
1246
1467
  * Non-admin users may only use the default backend.
1247
1468
  */
1248
1469
  storage_backend?: string | null;
1470
+ /**
1471
+ * ASCII-armored OpenPGP *public* key trusted to sign this RPM curation
1472
+ * remote's `repodata/repomd.xml` (#2568, RPM curation Phase 3). When set,
1473
+ * the curation sync fetches `repomd.xml.asc` and verifies the detached
1474
+ * signature before ingesting upstream metadata (#2567 reads this column).
1475
+ * Must be a PUBLIC key block; a private-key block is rejected. Write-only:
1476
+ * the response exposes only the boolean `has_trusted_gpg_key`, never the
1477
+ * key material.
1478
+ */
1479
+ trusted_gpg_key?: string | null;
1249
1480
  /**
1250
1481
  * Upstream auth type: "basic" or "bearer". Only valid for remote repos.
1251
1482
  */
@@ -1289,6 +1520,12 @@ export type CreateSamlConfigRequest = {
1289
1520
  certificate: string;
1290
1521
  entity_id: string;
1291
1522
  is_enabled?: boolean | null;
1523
+ /**
1524
+ * Opt-in flag (see migration 157, #2333): when true, SAML assertion
1525
+ * group values are reflected as Artifact Keeper group memberships.
1526
+ * Defaults to false.
1527
+ */
1528
+ map_groups_to_groups?: boolean | null;
1292
1529
  name: string;
1293
1530
  name_id_format?: string | null;
1294
1531
  require_signed_assertions?: boolean | null;
@@ -1492,6 +1729,7 @@ export type CreateWebhookRequest = {
1492
1729
  export type CreatedGroupRow = {
1493
1730
  created_at: string;
1494
1731
  description?: string | null;
1732
+ external_source?: string | null;
1495
1733
  id: string;
1496
1734
  name: string;
1497
1735
  updated_at: string;
@@ -1511,9 +1749,33 @@ export type CreatedPermissionRow = {
1511
1749
  export type CurationCreateRuleRequest = {
1512
1750
  action: string;
1513
1751
  architecture?: string;
1514
- package_pattern: string;
1752
+ /**
1753
+ * Engine-specific parameters (JSON object). `{}` for `pattern` rules.
1754
+ */
1755
+ config?: {
1756
+ [key: string]: unknown;
1757
+ };
1758
+ /**
1759
+ * Only meaningful for `rule_type = "pattern"`; defaults to `*` so typed
1760
+ * rules (`publisher_trust`, `popularity`) can omit it.
1761
+ */
1762
+ package_pattern?: string;
1515
1763
  priority?: number;
1516
1764
  reason: string;
1765
+ /**
1766
+ * Evaluation engine: `pattern` (default), `publisher_trust`, `popularity`.
1767
+ */
1768
+ rule_type?: string;
1769
+ /**
1770
+ * `repository` (default when `staging_repo_id` is set) or `global`.
1771
+ * When present it must be consistent with `staging_repo_id`: `global`
1772
+ * forbids a repo id, `repository` requires one.
1773
+ */
1774
+ scope?: string | null;
1775
+ /**
1776
+ * Omit (with `scope: "global"` or no `scope`) to create an instance-wide
1777
+ * baseline rule; set to attach the rule to one staging repository.
1778
+ */
1517
1779
  staging_repo_id?: string | null;
1518
1780
  version_constraint?: string;
1519
1781
  };
@@ -1543,10 +1805,20 @@ export type CurationPackageResponse = {
1543
1805
  export type CurationUpdateRuleRequest = {
1544
1806
  action: string;
1545
1807
  architecture?: string;
1808
+ /**
1809
+ * Engine-specific parameters (JSON object). `{}` for `pattern` rules.
1810
+ */
1811
+ config?: {
1812
+ [key: string]: unknown;
1813
+ };
1546
1814
  enabled?: boolean;
1547
1815
  package_pattern: string;
1548
1816
  priority?: number;
1549
1817
  reason: string;
1818
+ /**
1819
+ * Evaluation engine: `pattern` (default), `publisher_trust`, `popularity`.
1820
+ */
1821
+ rule_type?: string;
1550
1822
  version_constraint?: string;
1551
1823
  };
1552
1824
 
@@ -1666,6 +1938,112 @@ export type DbPoolStats = {
1666
1938
  size: number;
1667
1939
  };
1668
1940
 
1941
+ /**
1942
+ * Partial-update patch for [`DebianRepositoryConfig`]. Fields left absent are
1943
+ * preserved; provided fields (including an explicit empty list) replace the
1944
+ * stored value. Applied on top of the currently stored config, or on top of
1945
+ * the default when none exists yet.
1946
+ */
1947
+ export type DebianConfigPatch = {
1948
+ allow_encoded_separators?: boolean | null;
1949
+ architectures?: Array<string> | null;
1950
+ components?: Array<string> | null;
1951
+ distribution_paths?: Array<string> | null;
1952
+ flat_repository?: boolean | null;
1953
+ include_source_packages?: boolean | null;
1954
+ metadata_strategy?: null | DebianMetadataStrategy;
1955
+ package_fetch_strategy?: null | DebianPackageFetchStrategy;
1956
+ package_queries?: Array<string> | null;
1957
+ upstream_gpg_key_id?: string | null;
1958
+ verify_upstream_metadata?: boolean | null;
1959
+ };
1960
+
1961
+ /**
1962
+ * How metadata (`Packages`/`Release`) is produced for a Debian remote.
1963
+ *
1964
+ * Only [`DebianMetadataStrategy::UpstreamPassthrough`] is implemented in
1965
+ * 1.6.0; the other variants are reserved for P3 (filtered generation) / P4
1966
+ * (local re-signing) and are rejected with 422 until then. The enum lands now
1967
+ * so those phases can flip it on without a schema/config-shape change.
1968
+ */
1969
+ export type DebianMetadataStrategy = 'upstream_passthrough' | 'filter_and_generate' | 'filter_generate_and_sign' | 'hosted_generate';
1970
+
1971
+ /**
1972
+ * How package bodies are fetched for a Debian remote.
1973
+ *
1974
+ * Only [`DebianPackageFetchStrategy::UpstreamPassthrough`] is implemented in
1975
+ * 1.6.0.
1976
+ */
1977
+ export type DebianPackageFetchStrategy = 'upstream_passthrough' | 'eager';
1978
+
1979
+ /**
1980
+ * P2 Debian remote proxy filter config (dist/component/arch allowlists).
1981
+ *
1982
+ * Semantics for each allowlist: an empty list OR a list containing `"*"`
1983
+ * selects everything (today's full-proxy behaviour); otherwise only exact
1984
+ * matches are selected. Architecture-independent (`all`) packages are always
1985
+ * permitted regardless of the `architectures` allowlist.
1986
+ */
1987
+ export type DebianRepositoryConfig = {
1988
+ /**
1989
+ * Defense-in-depth (#2562): when `false` (the default) a proxy request
1990
+ * whose path carries a percent-encoded path separator (`%2f` = `/`,
1991
+ * `%5c` = `\`, at any decode layer) is rejected with 400 before any
1992
+ * upstream fetch. APT never percent-encodes path separators, so this only
1993
+ * ever blocks path-confusion/traversal probes; set it `true` to opt out
1994
+ * for a nonstandard upstream that genuinely requires encoded separators.
1995
+ */
1996
+ allow_encoded_separators?: boolean;
1997
+ /**
1998
+ * Architectures (e.g. `amd64`, `arm64`) to proxy. Empty/`["*"]` = all.
1999
+ * `all` (arch-independent) is always permitted.
2000
+ */
2001
+ architectures?: Array<string>;
2002
+ /**
2003
+ * Components (e.g. `main`, `contrib`, `non-free`) to proxy. Empty/`["*"]` = all.
2004
+ */
2005
+ components?: Array<string>;
2006
+ /**
2007
+ * Distributions (a.k.a. suites/codenames, e.g. `bookworm`) to proxy.
2008
+ * Empty or `["*"]` = all.
2009
+ */
2010
+ distribution_paths?: Array<string>;
2011
+ /**
2012
+ * Flat (non-`dists/`) repository layout flag. Accepted but does NOT weaken
2013
+ * P1's flat/redirect abuse posture in passthrough.
2014
+ */
2015
+ flat_repository?: boolean;
2016
+ /**
2017
+ * Whether source packages (`Sources`, `.dsc`) are included. Advisory in
2018
+ * passthrough (upstream metadata is unchanged); honored under P3.
2019
+ */
2020
+ include_source_packages?: boolean;
2021
+ /**
2022
+ * Metadata production strategy. Only `upstream_passthrough` in 1.6.0.
2023
+ */
2024
+ metadata_strategy?: DebianMetadataStrategy;
2025
+ /**
2026
+ * Package-body fetch strategy. Only `upstream_passthrough` in 1.6.0.
2027
+ */
2028
+ package_fetch_strategy?: DebianPackageFetchStrategy;
2029
+ /**
2030
+ * Package-name-level queries. NOT honored in passthrough (that needs P3);
2031
+ * a non-empty value here with `upstream_passthrough` is rejected with 422
2032
+ * rather than silently advertising content the proxy would then block.
2033
+ */
2034
+ package_queries?: Array<string>;
2035
+ /**
2036
+ * Upstream GPG key id used to verify upstream metadata (reserved for P4).
2037
+ */
2038
+ upstream_gpg_key_id?: string | null;
2039
+ /**
2040
+ * Whether to verify the upstream signed `Release` before serving. In P2 the
2041
+ * P1 integrity gate already enforces index/Release consistency; this flag
2042
+ * is reserved for P4 trust-anchor verification.
2043
+ */
2044
+ verify_upstream_metadata?: boolean;
2045
+ };
2046
+
1669
2047
  export type DeliveryListResponse = {
1670
2048
  items: Array<DeliveryResponse>;
1671
2049
  total: number;
@@ -1799,6 +2177,13 @@ export type DownloadRecord = {
1799
2177
  export type DownloadTrend = {
1800
2178
  date: string;
1801
2179
  download_count: number;
2180
+ /**
2181
+ * Proxy-served (pull-through) downloads for the day, from the sibling
2182
+ * `proxy_download_statistics` table (#2537/#2704). Additive: hosted
2183
+ * serves stay in `download_count` unchanged; defaults to 0 when
2184
+ * deserializing older payloads.
2185
+ */
2186
+ proxy_download_count?: number;
1802
2187
  };
1803
2188
 
1804
2189
  /**
@@ -2246,6 +2631,10 @@ export type GroupMemberResponse = {
2246
2631
  export type GroupResponse = {
2247
2632
  created_at: string;
2248
2633
  description?: string | null;
2634
+ /**
2635
+ * See [`GroupRow::external_source`]; lets the frontend disable member editing for SSO groups.
2636
+ */
2637
+ external_source?: string | null;
2249
2638
  id: string;
2250
2639
  member_count: number;
2251
2640
  name: string;
@@ -2255,6 +2644,10 @@ export type GroupResponse = {
2255
2644
  export type GroupRow = {
2256
2645
  created_at: string;
2257
2646
  description?: string | null;
2647
+ /**
2648
+ * SSO provider owning the group (`oidc`/`saml`/`ldap`); `None` for local groups. IdP owns membership (#2874).
2649
+ */
2650
+ external_source?: string | null;
2258
2651
  id: string;
2259
2652
  member_count: number;
2260
2653
  name: string;
@@ -2413,7 +2806,20 @@ export type LdapConfigResponse = {
2413
2806
  group_filter?: string | null;
2414
2807
  groups_attribute: string;
2415
2808
  has_bind_password: boolean;
2809
+ /**
2810
+ * Whether a custom inline CA certificate is configured for this provider
2811
+ * (migration 174, #2782). The PEM itself is not returned.
2812
+ */
2813
+ has_ca_certificate: boolean;
2416
2814
  id: string;
2815
+ /**
2816
+ * Opt-in flag (migration 174, #2782): when true, TLS certificate
2817
+ * verification is skipped for this provider's LDAPS/STARTTLS handshake.
2818
+ * Defaults false (secure-by-default). Matches Harbor's "insecure skip
2819
+ * verify"; only enable for trusted networks / private CAs you cannot
2820
+ * import.
2821
+ */
2822
+ insecure_skip_verify: boolean;
2417
2823
  is_enabled: boolean;
2418
2824
  name: string;
2419
2825
  priority: number;
@@ -2481,6 +2887,23 @@ export type LifecyclePolicy = {
2481
2887
  };
2482
2888
 
2483
2889
  export type ListArtifactsQuery = {
2890
+ /**
2891
+ * Total-count mode for keyset-paged listings (#2520, #2519).
2892
+ * `count=exact` runs a dedicated COUNT query so `pagination.total` is
2893
+ * exact; otherwise the keyset-paged listings report a cheap lower bound
2894
+ * (rows seen so far, +1 when another page exists) and `has_more` is the
2895
+ * authoritative "is there a next page" signal.
2896
+ */
2897
+ count?: string | null;
2898
+ /**
2899
+ * Opaque keyset cursor (#2520, #2519, #2518). Pass the `next_cursor`
2900
+ * value from the previous response to fetch the next page; `page` is
2901
+ * ignored while a cursor is present. Supported by the flat artifact
2902
+ * listing of hosted/local, virtual, and remote repositories (#2518,
2903
+ * #2519), by `group_by=docker_tag`, and by `group_by=maven_component`
2904
+ * on remote repositories; other listing modes ignore it.
2905
+ */
2906
+ cursor?: string | null;
2484
2907
  /**
2485
2908
  * Server-side artifact grouping.
2486
2909
  *
@@ -2562,6 +2985,10 @@ export type ListRepositoriesQuery = {
2562
2985
  format?: string | null;
2563
2986
  page?: number | null;
2564
2987
  per_page?: number | null;
2988
+ /**
2989
+ * Filter the listing to repositories assigned to this project (#2472).
2990
+ */
2991
+ project?: string | null;
2565
2992
  q?: string | null;
2566
2993
  type?: string | null;
2567
2994
  };
@@ -2825,26 +3252,33 @@ export type NpmScopePolicyResponse = {
2825
3252
  * layers before any garbage-collection mechanism is enabled.
2826
3253
  *
2827
3254
  * It deliberately does NOT attempt to classify which blobs are
2828
- * "reclaimable orphans": that requires a manifest -> blob reference table
2829
- * that does not yet exist in the schema, and any per-`(repository_id,
2830
- * digest)` orphan heuristic would mis-handle the cross-repo dedup case
2831
- * (multiple `oci_blobs` rows, one physical object) and report in-use
2832
- * blobs as reclaimable. The numbers here are exact aggregates only.
3255
+ * "reclaimable orphans": that is the blob GC's job (mark-and-sweep over
3256
+ * `manifest_blob_refs`, per [`BLOB_PROTECTED_BY_REFS_SQL`]). A naive
3257
+ * per-`(repository_id, digest)` orphan heuristic would mis-handle shared
3258
+ * backends (anything other than `filesystem`), where all referencing
3259
+ * repos share ONE physical object per digest per backend, and report
3260
+ * in-use blobs as reclaimable; on `filesystem` each repository keeps an
3261
+ * independent copy under its own `storage_path`. The numbers here are
3262
+ * exact aggregates only.
2833
3263
  */
2834
3264
  export type OciBlobFootprintReport = {
2835
3265
  /**
2836
- * Distinct digests older than `grace_hours` (eligible to be *considered*
2837
- * by a future GC sweep once a reference table exists). Reporting only.
3266
+ * Distinct digests with at least one physical copy older than
3267
+ * `grace_hours` (eligible to be *considered* by a future GC sweep once
3268
+ * a reference table exists). Reporting only.
2838
3269
  */
2839
3270
  aged_distinct_digests: number;
2840
3271
  /**
2841
- * Physical bytes (distinct-digest) older than `grace_hours`.
3272
+ * Physical bytes (same physical-object grouping as `physical_bytes`)
3273
+ * older than `grace_hours`.
2842
3274
  */
2843
3275
  aged_physical_bytes: number;
2844
3276
  /**
2845
3277
  * Number of distinct blob digests (content-addressed identities). When
2846
3278
  * this is smaller than `total_blob_rows`, the difference is cross-repo
2847
- * deduplication: rows that share one physical storage object.
3279
+ * sharing of a content identity (one physical object shared by all
3280
+ * referencing repos on shared backends; an independent copy per
3281
+ * repository on `filesystem`).
2848
3282
  */
2849
3283
  distinct_digests: number;
2850
3284
  /**
@@ -2861,8 +3295,13 @@ export type OciBlobFootprintReport = {
2861
3295
  */
2862
3296
  per_repository: Array<OciBlobRepoFootprint>;
2863
3297
  /**
2864
- * Sum of `size_bytes` counting each distinct digest exactly once. This
2865
- * approximates the physical bytes occupied in the storage backend.
3298
+ * Sum of `size_bytes` counting each distinct **physical storage
3299
+ * object** exactly once, per the ownership model of
3300
+ * [`BLOB_PROTECTED_BY_REFS_SQL`]: on shared backends (anything other
3301
+ * than `filesystem`) a digest is one object per backend; on
3302
+ * `filesystem` each repository stores its own copy under its
3303
+ * `storage_path`, so the same digest in two filesystem repositories
3304
+ * counts twice.
2866
3305
  */
2867
3306
  physical_bytes: number;
2868
3307
  /**
@@ -2880,10 +3319,13 @@ export type OciBlobRepoFootprint = {
2880
3319
  */
2881
3320
  blob_rows: number;
2882
3321
  /**
2883
- * Sum of `oci_blobs.size_bytes` for this repository's rows. Because OCI
2884
- * blob storage is content-addressed and deduplicated across repos, the
3322
+ * Sum of `oci_blobs.size_bytes` for this repository's rows. On shared
3323
+ * backends (anything other than `filesystem`) blobs are deduplicated
3324
+ * across repos — one physical object per digest per backend — so the
2885
3325
  * same physical bytes can be counted under more than one repository
2886
- * here; see [`OciBlobFootprintReport::physical_bytes`] for the
3326
+ * here. On `filesystem` each repository stores its own independent
3327
+ * copy under its `storage_path`, so its rows are that repo's real
3328
+ * bytes. See [`OciBlobFootprintReport::physical_bytes`] for the
2887
3329
  * dedup-aware total.
2888
3330
  */
2889
3331
  logical_bytes: number;
@@ -2962,6 +3404,23 @@ export type PackageRow = {
2962
3404
  version: string;
2963
3405
  };
2964
3406
 
3407
+ export type PackageSearchQuery = {
3408
+ /**
3409
+ * Exact architecture filter (e.g. `x86_64`, `noarch`).
3410
+ */
3411
+ arch?: string | null;
3412
+ limit?: number;
3413
+ offset?: number;
3414
+ /**
3415
+ * Case-insensitive substring match on the package name.
3416
+ */
3417
+ q?: string | null;
3418
+ /**
3419
+ * Curation status filter (e.g. `approved`, `pending`, `blocked`, `review`).
3420
+ */
3421
+ status?: string | null;
3422
+ };
3423
+
2965
3424
  export type PackageVersionResponse = {
2966
3425
  checksum_sha256: string;
2967
3426
  created_at: string;
@@ -3295,6 +3754,43 @@ export type ProbeBody = {
3295
3754
  target_peer_id: string;
3296
3755
  };
3297
3756
 
3757
+ /**
3758
+ * Project entity.
3759
+ */
3760
+ export type Project = {
3761
+ created_at: string;
3762
+ description?: string | null;
3763
+ id: string;
3764
+ /**
3765
+ * Unique, URL-safe project key (e.g. "payments").
3766
+ */
3767
+ key: string;
3768
+ name: string;
3769
+ /**
3770
+ * Storage quota in bytes. P1: stored only, NOT enforced (quotas = P3).
3771
+ */
3772
+ quota_bytes?: number | null;
3773
+ updated_at: string;
3774
+ };
3775
+
3776
+ export type ProjectListResponse = {
3777
+ items: Array<Project>;
3778
+ };
3779
+
3780
+ export type ProjectMemberListResponse = {
3781
+ items: Array<ProjectMemberRow>;
3782
+ };
3783
+
3784
+ /**
3785
+ * One membership grant on a project: a `permissions` row with
3786
+ * `target_type = 'project'`.
3787
+ */
3788
+ export type ProjectMemberRow = {
3789
+ actions: Array<string>;
3790
+ principal_id: string;
3791
+ principal_type: string;
3792
+ };
3793
+
3298
3794
  export type PromoteArtifactRequest = {
3299
3795
  notes?: string | null;
3300
3796
  skip_policy_check?: boolean;
@@ -3412,9 +3908,23 @@ export type QuarantineActionResponse = {
3412
3908
  new_status: string;
3413
3909
  };
3414
3910
 
3911
+ export type QuarantineNowRequest = {
3912
+ /**
3913
+ * Reason shown to developers whose downloads are blocked.
3914
+ */
3915
+ reason?: string | null;
3916
+ };
3917
+
3415
3918
  export type QuarantineStatusResponse = {
3416
3919
  artifact_id: string;
3417
3920
  is_blocked: boolean;
3921
+ /**
3922
+ * Why the artifact is held, when one was recorded by a scan policy or an
3923
+ * admin. This is the only surface that discloses the reason: blocked
3924
+ * downloads return a generic message because they are reachable
3925
+ * anonymously on public repositories (#2912).
3926
+ */
3927
+ quarantine_reason?: string | null;
3418
3928
  quarantine_status?: string | null;
3419
3929
  quarantine_until?: string | null;
3420
3930
  };
@@ -3505,6 +4015,24 @@ export type RemoteInstanceResponse = {
3505
4015
  url: string;
3506
4016
  };
3507
4017
 
4018
+ export type RemoveProjectMemberRequest = {
4019
+ principal_id: string;
4020
+ principal_type: string;
4021
+ };
4022
+
4023
+ /**
4024
+ * Repository exposure descriptor echoed in the response.
4025
+ */
4026
+ export type RepoExposure = {
4027
+ /**
4028
+ * `public` | `restricted_acl` | `restricted_roles` — see
4029
+ * [`classify_access_scope`].
4030
+ */
4031
+ access_scope: string;
4032
+ repository_id: string;
4033
+ repository_key: string;
4034
+ };
4035
+
3508
4036
  export type RepoHealthResponse = {
3509
4037
  artifacts_evaluated: number;
3510
4038
  artifacts_failing: number;
@@ -3580,13 +4108,78 @@ export type RepositoryResponse = {
3580
4108
  * the semantics are clear for remote (pull-through cache) repositories.
3581
4109
  */
3582
4110
  allow_anonymous_access: boolean;
4111
+ /**
4112
+ * Custom Description field for Debian/APT Release files. Omitted from the
4113
+ * Release file when `None` or empty.
4114
+ */
4115
+ apt_description?: string | null;
4116
+ /**
4117
+ * Custom Label field for Debian/APT Release files (default: "artifact-keeper").
4118
+ */
4119
+ apt_label?: string | null;
4120
+ /**
4121
+ * Custom Origin field for Debian/APT Release files (default: "artifact-keeper").
4122
+ */
4123
+ apt_origin?: string | null;
4124
+ /**
4125
+ * Custom Version field for Debian/APT Release files. Omitted from the
4126
+ * Release file when `None` or empty.
4127
+ */
4128
+ apt_release_version?: string | null;
3583
4129
  created_at: string;
4130
+ /**
4131
+ * Stance applied when no curation rule matches: `allow` or `review`.
4132
+ */
4133
+ curation_default_action: string;
4134
+ /**
4135
+ * Whether curation rules are enforced for this repository (#2912).
4136
+ *
4137
+ * Echoed back because this flag now *blocks downloads* on the PyPI proxy
4138
+ * paths, and a security control that cannot be read back is the same class of
4139
+ * problem as one that is stored but not enforced. Stored on the repositories
4140
+ * row, so unlike `quarantine_enabled` this needs no separate lookup.
4141
+ */
4142
+ curation_enabled: boolean;
4143
+ /**
4144
+ * Custom User-Agent used for outbound HTTP requests to the upstream,
4145
+ * read back from `repository_config`. `None` when unset.
4146
+ */
4147
+ custom_user_agent?: string | null;
4148
+ debian?: null | DebianRepositoryConfig;
3584
4149
  description?: string | null;
3585
4150
  format: string;
4151
+ /**
4152
+ * Whether a trusted upstream OpenPGP public key is configured for RPM
4153
+ * curation signature verification (#2568). The key material itself is
4154
+ * never returned; this boolean is the only exposure. `false` for repos
4155
+ * with no key set. Populated by the single-repo handlers (create / get /
4156
+ * update) and the listing; `repo_to_response` alone defaults it to `false`
4157
+ * (it is db-less and cannot read the column).
4158
+ */
4159
+ has_trusted_gpg_key: boolean;
3586
4160
  id: string;
3587
4161
  is_public: boolean;
3588
4162
  key: string;
3589
4163
  name: string;
4164
+ /**
4165
+ * Whether unscoped npm names may resolve through this npm Remote
4166
+ * repository (#2424). Omitted when unset.
4167
+ */
4168
+ npm_allow_unscoped?: boolean | null;
4169
+ /**
4170
+ * Allowed npm full-name glob patterns (#2424), read back from
4171
+ * `repository_config`. Omitted for non-npm repositories or when unset.
4172
+ */
4173
+ npm_allowed_name_patterns?: Array<string> | null;
4174
+ /**
4175
+ * Allowed npm `@scope` literals (#2424), read back from
4176
+ * `repository_config`. Omitted for non-npm repositories or when unset.
4177
+ */
4178
+ npm_allowed_scopes?: Array<string> | null;
4179
+ /**
4180
+ * Project this repository is assigned to (#2472), if any.
4181
+ */
4182
+ project_id?: string | null;
3590
4183
  /**
3591
4184
  * When true, direct user uploads are rejected; artifacts must be promoted.
3592
4185
  */
@@ -3651,12 +4244,144 @@ export type RepositoryStorageBreakdown = {
3651
4244
  download_count: number;
3652
4245
  format: string;
3653
4246
  last_upload_at?: string | null;
4247
+ /**
4248
+ * Downloads served by this repository's remote pull-through proxy
4249
+ * (`proxy_download_statistics`, #2537/#2704). Proxy-cached objects carry
4250
+ * no `artifacts` row (#1280), so these serves are counted in a sibling
4251
+ * table and were previously not readable through any API. Kept separate
4252
+ * from `download_count` (hosted serves) so existing consumers are
4253
+ * unaffected; defaults to 0 when deserializing older payloads.
4254
+ */
4255
+ proxy_download_count?: number;
3654
4256
  repository_id: string;
3655
4257
  repository_key: string;
3656
4258
  repository_name: string;
3657
4259
  storage_bytes: number;
3658
4260
  };
3659
4261
 
4262
+ /**
4263
+ * Deduplicated storage-accounting response for a single repository (#2056).
4264
+ *
4265
+ * All figures are read from the materialized `repository_storage_stats` cache
4266
+ * (refreshed on a schedule + post-GC), so this endpoint is an O(1) primary-key
4267
+ * lookup and never runs the heavy cross-repo aggregation. `computed_at` is the
4268
+ * freshness marker; it is `null` until the first refresh has run.
4269
+ *
4270
+ * Quota is unaffected: these numbers are accounting/visibility only and do NOT
4271
+ * change how the repository's storage quota is enforced (#2056 §7).
4272
+ */
4273
+ export type RepositoryStorageStatsResponse = {
4274
+ /**
4275
+ * Distinct physical objects (dedup keys) this repository references.
4276
+ */
4277
+ blob_count: number;
4278
+ /**
4279
+ * When these figures were last recomputed. `null` before the first refresh.
4280
+ */
4281
+ computed_at?: string | null;
4282
+ /**
4283
+ * logical_bytes / physical_bytes (1.0 when nothing is stored). Restricted
4284
+ * on cloud backends — see [`physical_bytes`](Self::physical_bytes).
4285
+ */
4286
+ dedup_ratio?: number | null;
4287
+ /**
4288
+ * `per_repo` (filesystem) or `instance` (cloud) — the backend semantics at
4289
+ * compute time.
4290
+ */
4291
+ dedup_scope: string;
4292
+ /**
4293
+ * The instance-wide globally-distinct footprint (true disk usage). On
4294
+ * cloud backends the sum of per-repo `physical_bytes` OVER-counts shared
4295
+ * objects, so this is the authoritative instance total.
4296
+ *
4297
+ * **Admin-only:** this is a whole-instance aggregate that spans every
4298
+ * tenant, so it is only populated for admin callers. It is omitted from the
4299
+ * response entirely for repo-authorized non-admins and anonymous callers,
4300
+ * who see only this repository's own figures (#2559 review).
4301
+ */
4302
+ instance_unique_bytes?: number | null;
4303
+ /**
4304
+ * Sum over every reference (per-row). Now includes OCI layer bytes, which
4305
+ * were previously omitted from all storage accounting.
4306
+ */
4307
+ logical_bytes: number;
4308
+ /**
4309
+ * Deduplicated physical footprint within the dedup scope.
4310
+ *
4311
+ * **Restricted on cloud (instance-scope) backends:** on a shared-storage
4312
+ * backend `physical_bytes`, `unique_bytes`, `shared_bytes` and
4313
+ * `dedup_ratio` are all cross-tenant-derivable — `shared_bytes =
4314
+ * physical_bytes - unique_bytes` reveals whether this repo's blobs are also
4315
+ * stored by another tenant (a per-blob cross-tenant existence oracle,
4316
+ * #2560). The whole derivable set is therefore populated only for admins on
4317
+ * instance-scope backends, and omitted for repo-authorized non-admins /
4318
+ * anonymous callers. On `per_repo` (filesystem) backends there is no
4319
+ * cross-tenant sharing (`shared_bytes == 0` by construction), so all
4320
+ * figures are always present.
4321
+ */
4322
+ physical_bytes?: number | null;
4323
+ repository_key: string;
4324
+ /**
4325
+ * physical_bytes - unique_bytes. Always 0 on filesystem backends (a shared
4326
+ * digest in two repos is two files). Restricted on cloud backends — see
4327
+ * [`physical_bytes`](Self::physical_bytes).
4328
+ */
4329
+ shared_bytes?: number | null;
4330
+ /**
4331
+ * Physical bytes of objects referenced only by this repository.
4332
+ * Restricted on cloud backends — see [`physical_bytes`].
4333
+ *
4334
+ * [`physical_bytes`]: Self::physical_bytes
4335
+ */
4336
+ unique_bytes?: number | null;
4337
+ };
4338
+
4339
+ /**
4340
+ * Per-prefix (folder tree) storage rollup response (#2601).
4341
+ *
4342
+ * All figures are read from the materialized `repository_path_storage_stats`
4343
+ * cache (refreshed on the storage-stats schedule + post-GC) — a tree call is
4344
+ * an index scan over pre-aggregated rows, never a walk of the artifact table.
4345
+ *
4346
+ * Every figure is within-repository only (references this repo holds), so
4347
+ * unlike the repo-level endpoint's cross-tenant-derivable dedup breakdown
4348
+ * (#2560) nothing here needs an admin restriction beyond repo visibility.
4349
+ */
4350
+ export type RepositoryStorageTreeResponse = {
4351
+ /**
4352
+ * Descendant folder nodes, up to `depth` levels below `node`, largest
4353
+ * `logical_bytes` first.
4354
+ */
4355
+ children: Array<StorageTreeNode>;
4356
+ /**
4357
+ * When the rollup was last recomputed. `null` before the first refresh.
4358
+ */
4359
+ computed_at?: string | null;
4360
+ /**
4361
+ * Folder levels below the root that are individually materialized;
4362
+ * deeper files roll up into their ancestor at this depth.
4363
+ */
4364
+ max_materialized_depth: number;
4365
+ /**
4366
+ * The node the listing is rooted at (zeros when the prefix has no
4367
+ * materialized data — unknown folder or refresher not yet run).
4368
+ */
4369
+ node: StorageTreeNode;
4370
+ repository_key: string;
4371
+ /**
4372
+ * True when `limit` cut the descendant listing.
4373
+ */
4374
+ truncated: boolean;
4375
+ /**
4376
+ * Bytes referenced by this repository that carry no logical path and so
4377
+ * cannot be placed in the tree (today: OCI layer blobs; the blob→image
4378
+ * edge lives only in manifest content). Root-level figure; present only
4379
+ * when the request is rooted at `''`. `node.logical_bytes +
4380
+ * unattributed_bytes` reconciles with the repo-level logical total.
4381
+ */
4382
+ unattributed_bytes?: number | null;
4383
+ };
4384
+
3660
4385
  export type RescanForInventoryRequest = {
3661
4386
  /**
3662
4387
  * Maximum number of artifacts to enqueue in this call. Operators
@@ -3737,6 +4462,12 @@ export type RoleResponse = {
3737
4462
 
3738
4463
  /**
3739
4464
  * Response returned by the rotate-secret endpoint.
4465
+ *
4466
+ * GHSA-qcmj: the raw signing secret is intentionally NOT returned here. A
4467
+ * rotation only reports success and non-reversible metadata (the display
4468
+ * `secret_digest` and the previous-secret expiry); the new raw secret is
4469
+ * retained only in encrypted form and delivered/consumed out-of-band, so it
4470
+ * cannot be disclosed via this response body or logs.
3740
4471
  */
3741
4472
  export type RotateWebhookSecretResponse = {
3742
4473
  id: string;
@@ -3745,9 +4476,8 @@ export type RotateWebhookSecretResponse = {
3745
4476
  */
3746
4477
  previous_secret_expires_at: string;
3747
4478
  /**
3748
- * Raw signing secret produced by this rotation. Shown exactly once.
4479
+ * Short, non-reversible identifier for the newly active signing secret.
3749
4480
  */
3750
- secret: string;
3751
4481
  secret_digest: string;
3752
4482
  };
3753
4483
 
@@ -3782,6 +4512,9 @@ export type RuleEvaluationResponse = {
3782
4512
  export type RuleResponse = {
3783
4513
  action: string;
3784
4514
  architecture: string;
4515
+ config: {
4516
+ [key: string]: unknown;
4517
+ };
3785
4518
  created_at: string;
3786
4519
  created_by?: string | null;
3787
4520
  enabled: boolean;
@@ -3789,6 +4522,8 @@ export type RuleResponse = {
3789
4522
  package_pattern: string;
3790
4523
  priority: number;
3791
4524
  reason: string;
4525
+ rule_type: string;
4526
+ scope: string;
3792
4527
  staging_repo_id?: string | null;
3793
4528
  updated_at: string;
3794
4529
  version_constraint: string;
@@ -3817,6 +4552,12 @@ export type SamlConfigResponse = {
3817
4552
  has_certificate: boolean;
3818
4553
  id: string;
3819
4554
  is_enabled: boolean;
4555
+ /**
4556
+ * Opt-in flag (see migration 157, #2333): when true, SAML assertion
4557
+ * group values are reflected as Artifact Keeper group memberships,
4558
+ * mirroring the OIDC flag from #1094. Defaults to false.
4559
+ */
4560
+ map_groups_to_groups: boolean;
3820
4561
  name: string;
3821
4562
  name_id_format: string;
3822
4563
  require_signed_assertions: boolean;
@@ -3861,6 +4602,11 @@ export type ScanConfigResponse = {
3861
4602
  block_on_policy_violation: boolean;
3862
4603
  created_at: string;
3863
4604
  id: string;
4605
+ /**
4606
+ * #2954: fail-open (default) / fail-closed action for the inline proxy
4607
+ * scan-on-fetch.
4608
+ */
4609
+ proxy_scan_action: string;
3864
4610
  repository_id: string;
3865
4611
  scan_enabled: boolean;
3866
4612
  scan_on_proxy: boolean;
@@ -3878,6 +4624,23 @@ export type ScanResponse = {
3878
4624
  artifact_id: string;
3879
4625
  artifact_name?: string | null;
3880
4626
  artifact_version?: string | null;
4627
+ /**
4628
+ * #2471: number of `not_applicable` scanner rows folded into this row.
4629
+ * `Some(n)` marks a synthetic *summary* row that collapses `n` redundant
4630
+ * "this scanner does not apply" results (e.g. the image-family scanners
4631
+ * `filesystem`/`incus`/`openscap` all declining on a Docker image) into a
4632
+ * single muted "not applicable to this artifact" indication, so the UI
4633
+ * stops rendering N rows that read as N failures. `None` for every real
4634
+ * (non-collapsed) scan row. Omitted from the wire when `None`.
4635
+ */
4636
+ collapsed_not_applicable_count?: number | null;
4637
+ /**
4638
+ * #2471: the individual `scan_type` values folded into a summary row,
4639
+ * sorted and de-duplicated (e.g. `["filesystem","incus","openscap"]`).
4640
+ * Present only on a synthetic summary row (alongside
4641
+ * `collapsed_not_applicable_count`); `None` / omitted otherwise.
4642
+ */
4643
+ collapsed_scan_types?: Array<string> | null;
3881
4644
  completed_at?: string | null;
3882
4645
  created_at: string;
3883
4646
  critical_count: number;
@@ -4080,12 +4843,35 @@ export type SetRoutingRulesRequest = {
4080
4843
  * Response body for the setup status endpoint.
4081
4844
  */
4082
4845
  export type SetupStatusResponse = {
4846
+ /**
4847
+ * Optional deployment-aware instruction for retrieving the generated
4848
+ * initial admin password, sourced from the `SETUP_PASSWORD_HINT` env var.
4849
+ * Present only when an operator has configured it; when absent, the web UI
4850
+ * falls back to its built-in Docker Compose instruction (#2802).
4851
+ */
4852
+ setup_password_hint?: string | null;
4083
4853
  /**
4084
4854
  * Whether the initial admin password change is still required.
4085
4855
  */
4086
4856
  setup_required: boolean;
4087
4857
  };
4088
4858
 
4859
+ /**
4860
+ * Response from a deliberate per-artifact signing action (#2535).
4861
+ */
4862
+ export type SignArtifactResponse = {
4863
+ algorithm: string;
4864
+ artifact_id: string;
4865
+ /**
4866
+ * The active signing key that produced the attestation.
4867
+ */
4868
+ key_id: string;
4869
+ /**
4870
+ * SHA-256 of the produced signature blob (the blob itself is not persisted).
4871
+ */
4872
+ signature_sha256: string;
4873
+ };
4874
+
4089
4875
  export type SigningConfigResponse = {
4090
4876
  key?: null | SigningKeyPublic;
4091
4877
  repository_id: string;
@@ -4236,6 +5022,61 @@ export type StorageSnapshot = {
4236
5022
  total_users: number;
4237
5023
  };
4238
5024
 
5025
+ /**
5026
+ * One folder node in the per-prefix storage rollup (#2601).
5027
+ */
5028
+ export type StorageTreeNode = {
5029
+ /**
5030
+ * Distinct physical objects under this prefix.
5031
+ */
5032
+ blob_count: number;
5033
+ /**
5034
+ * Number of path segments in `prefix` (0 = root).
5035
+ */
5036
+ depth: number;
5037
+ /**
5038
+ * References (artifact/proxy-cache rows) under this prefix.
5039
+ */
5040
+ file_count: number;
5041
+ /**
5042
+ * Sum over every artifact/proxy-cache reference under this prefix.
5043
+ */
5044
+ logical_bytes: number;
5045
+ /**
5046
+ * Deduplicated within this repository: each distinct physical object
5047
+ * under the prefix counted once. Because an object shared by two sibling
5048
+ * subtrees counts once in each but once at their common ancestor, the sum
5049
+ * of children's `physical_bytes` can exceed the parent's — the difference
5050
+ * is the cross-subtree dedup saving.
5051
+ */
5052
+ physical_bytes: number;
5053
+ /**
5054
+ * Canonical prefix (no leading/trailing `/`; `''` = repository root).
5055
+ */
5056
+ prefix: string;
5057
+ };
5058
+
5059
+ /**
5060
+ * Query parameters for the per-prefix storage tree (#2601).
5061
+ */
5062
+ export type StorageTreeQuery = {
5063
+ /**
5064
+ * How many tree levels below `prefix` to return (default 1 = immediate
5065
+ * children, clamped to 1..=5).
5066
+ */
5067
+ depth?: number | null;
5068
+ /**
5069
+ * Maximum number of descendant nodes returned (default 200, clamped to
5070
+ * 1..=1000). `truncated` is set when the limit cut the listing.
5071
+ */
5072
+ limit?: number | null;
5073
+ /**
5074
+ * Folder prefix to root the listing at (`''`/absent = repository root).
5075
+ * Leading/trailing slashes are ignored.
5076
+ */
5077
+ prefix?: string | null;
5078
+ };
5079
+
4239
5080
  export type SubmitCrashesRequest = {
4240
5081
  ids: Array<string>;
4241
5082
  };
@@ -4330,6 +5171,23 @@ export type SyncTaskResponse = {
4330
5171
  storage_key: string;
4331
5172
  };
4332
5173
 
5174
+ export type SyncTriggerResponse = {
5175
+ /**
5176
+ * The repository key the sync was triggered for.
5177
+ */
5178
+ repository: string;
5179
+ /**
5180
+ * Whether the sync pass completed without error. A false value with
5181
+ * `triggered = true` means the pass ran but an upstream fetch/verify step
5182
+ * failed for the repo (details are in the server logs, not this response).
5183
+ */
5184
+ succeeded: boolean;
5185
+ /**
5186
+ * Always true when the trigger was accepted and a sync pass ran.
5187
+ */
5188
+ triggered: boolean;
5189
+ };
5190
+
4333
5191
  /**
4334
5192
  * Runtime configuration values.
4335
5193
  *
@@ -4698,11 +5556,21 @@ export type UpdateLdapConfigRequest = {
4698
5556
  admin_group_dn?: string | null;
4699
5557
  bind_dn?: string | null;
4700
5558
  bind_password?: string | null;
5559
+ /**
5560
+ * Inline PEM CA certificate/chain (migration 174, #2782). Omit to leave
5561
+ * unchanged; send an empty string to clear.
5562
+ */
5563
+ ca_certificate?: string | null;
4701
5564
  display_name_attribute?: string | null;
4702
5565
  email_attribute?: string | null;
4703
5566
  group_base_dn?: string | null;
4704
5567
  group_filter?: string | null;
4705
5568
  groups_attribute?: string | null;
5569
+ /**
5570
+ * See `CreateLdapConfigRequest::insecure_skip_verify` (migration 174,
5571
+ * #2782). Omit to leave the stored value unchanged.
5572
+ */
5573
+ insecure_skip_verify?: boolean | null;
4706
5574
  is_enabled?: boolean | null;
4707
5575
  name?: string | null;
4708
5576
  priority?: number | null;
@@ -4790,6 +5658,12 @@ export type UpdatePolicyRequest = {
4790
5658
  require_signature?: boolean | null;
4791
5659
  };
4792
5660
 
5661
+ export type UpdateProjectRequest = {
5662
+ description?: string | null;
5663
+ name?: string | null;
5664
+ quota_bytes?: number | null;
5665
+ };
5666
+
4793
5667
  export type UpdateRepositoryRequest = {
4794
5668
  /**
4795
5669
  * Alias for `is_public`. When set to true, anonymous users can download
@@ -4800,6 +5674,57 @@ export type UpdateRepositoryRequest = {
4800
5674
  * `allow_anonymous_access` takes precedence.
4801
5675
  */
4802
5676
  allow_anonymous_access?: boolean | null;
5677
+ /**
5678
+ * Custom Description field for Debian/APT Release files. Pass an empty
5679
+ * string to remove (omits the field entirely from the Release file).
5680
+ * Stored in `repository_config` under `apt_description`.
5681
+ */
5682
+ apt_description?: string | null;
5683
+ /**
5684
+ * Custom Label field for Debian/APT Release files. Pass an empty string
5685
+ * to reset to the default ("artifact-keeper").
5686
+ * Stored in `repository_config` under `apt_label`.
5687
+ */
5688
+ apt_label?: string | null;
5689
+ /**
5690
+ * Custom Origin field for Debian/APT Release files. Pass an empty string
5691
+ * to reset to the default ("artifact-keeper").
5692
+ * Stored in `repository_config` under `apt_origin`.
5693
+ */
5694
+ apt_origin?: string | null;
5695
+ /**
5696
+ * Custom Version field for Debian/APT Release files. Pass an empty
5697
+ * string to remove (omits the field entirely from the Release file).
5698
+ * Stored in `repository_config` under `apt_release_version`.
5699
+ */
5700
+ apt_release_version?: string | null;
5701
+ /**
5702
+ * Update the keyless-sync unverified-ingest opt-in (#2569). When provided,
5703
+ * sets `curation_allow_unverified` (`false` restores the fail-closed
5704
+ * default; `true` opts into legacy unverified ingest). Omit to leave it
5705
+ * unchanged.
5706
+ */
5707
+ curation_allow_unverified?: boolean | null;
5708
+ /**
5709
+ * Default curation action when no rule matches: allow or review.
5710
+ * "block" is rejected (DB CHECK, migration 071); use block rules for
5711
+ * specific packages instead.
5712
+ *
5713
+ * The allowed set is spelled out in the schema so a generated SDK presents it
5714
+ * rather than an unconstrained string.
5715
+ */
5716
+ curation_default_action: string;
5717
+ /**
5718
+ * Enable curation-rule enforcement on this repository's proxy paths.
5719
+ */
5720
+ curation_enabled?: boolean | null;
5721
+ /**
5722
+ * Update the custom User-Agent for outbound HTTP requests to the upstream.
5723
+ * Only valid for remote repositories. Pass an empty string to remove.
5724
+ * Max 256 characters. Stored in `repository_config` under `custom_user_agent`.
5725
+ */
5726
+ custom_user_agent?: string | null;
5727
+ debian?: null | DebianConfigPatch;
4803
5728
  description?: string | null;
4804
5729
  /**
4805
5730
  * Update the Cargo index upstream URL (stored in `repository_config`).
@@ -4809,6 +5734,28 @@ export type UpdateRepositoryRequest = {
4809
5734
  is_public?: boolean | null;
4810
5735
  key?: string | null;
4811
5736
  name?: string | null;
5737
+ /**
5738
+ * Update whether unscoped npm package names may resolve through this npm
5739
+ * Remote repository (#2424). Stored under `npm_allow_unscoped`.
5740
+ */
5741
+ npm_allow_unscoped?: boolean | null;
5742
+ /**
5743
+ * Update the allowed npm full-name glob patterns for this npm Remote
5744
+ * repository (#2424). When provided, replaces the stored
5745
+ * `npm_allowed_name_patterns` list.
5746
+ */
5747
+ npm_allowed_name_patterns?: Array<string> | null;
5748
+ /**
5749
+ * Update the allowed npm `@scope` literals for this npm Remote repository
5750
+ * (#2424). When provided, replaces the stored `npm_allowed_scopes` list.
5751
+ */
5752
+ npm_allowed_scopes?: Array<string> | null;
5753
+ /**
5754
+ * Assign this repository to a project (#2472). P1 is set-only: omitting
5755
+ * the field leaves the assignment unchanged (unassignment ships with the
5756
+ * project-admin surface in P2).
5757
+ */
5758
+ project_id?: string | null;
4812
5759
  /**
4813
5760
  * When provided, enables/disables the `promotion_only` policy for this
4814
5761
  * repository (admin-only). When omitted, the flag is left unchanged.
@@ -4841,6 +5788,15 @@ export type UpdateRepositoryRequest = {
4841
5788
  * Stored in `repository_config` under `release_repository_id`.
4842
5789
  */
4843
5790
  release_repository_key?: string | null;
5791
+ /**
5792
+ * Update the trusted upstream OpenPGP public key for RPM curation (#2568).
5793
+ * Three-way semantics via `Option<Option<String>>`: omit the field to
5794
+ * leave the stored key unchanged; send `null` to clear it (revert to
5795
+ * "unverified upstream"); send an ASCII-armored PUBLIC key block to set
5796
+ * it. A private-key block or malformed armor is rejected (400). The
5797
+ * response never echoes the key — only `has_trusted_gpg_key`.
5798
+ */
5799
+ trusted_gpg_key?: string | null;
4844
5800
  /**
4845
5801
  * When provided, enables/disables first-class artifact versioning for
4846
5802
  * this Generic/Mlmodel repository (#2367). When omitted, unchanged.
@@ -4868,6 +5824,7 @@ export type UpdateSamlConfigRequest = {
4868
5824
  certificate?: string | null;
4869
5825
  entity_id?: string | null;
4870
5826
  is_enabled?: boolean | null;
5827
+ map_groups_to_groups?: boolean | null;
4871
5828
  name?: string | null;
4872
5829
  name_id_format?: string | null;
4873
5830
  require_signed_assertions?: boolean | null;
@@ -4947,6 +5904,11 @@ export type UpsertLicensePolicyRequest = {
4947
5904
  */
4948
5905
  export type UpsertScanConfigRequest = {
4949
5906
  block_on_policy_violation?: boolean | null;
5907
+ /**
5908
+ * #2954: `'fail_open'` (default) | `'fail_closed'` for the inline proxy
5909
+ * scan-on-fetch action.
5910
+ */
5911
+ proxy_scan_action?: string | null;
4950
5912
  scan_enabled?: boolean | null;
4951
5913
  scan_on_proxy?: boolean | null;
4952
5914
  scan_on_upload?: boolean | null;
@@ -4982,6 +5944,25 @@ export type UserResponse = {
4982
5944
  username: string;
4983
5945
  };
4984
5946
 
5947
+ export type VersionResponse = {
5948
+ /**
5949
+ * The number of approved packages frozen into the snapshot.
5950
+ */
5951
+ package_count: number;
5952
+ /**
5953
+ * Whether this version's signed repodata has been published yet.
5954
+ */
5955
+ published: boolean;
5956
+ /**
5957
+ * The repository key the version belongs to.
5958
+ */
5959
+ repository: string;
5960
+ /**
5961
+ * The monotonic snapshot number (published/served under `/rpm/{key}/@N/`).
5962
+ */
5963
+ version_number: number;
5964
+ };
5965
+
4985
5966
  export type VirtualMemberPriority = {
4986
5967
  member_key: string;
4987
5968
  priority: number;
@@ -5154,6 +6135,21 @@ export type RejectReviewResponses = {
5154
6135
 
5155
6136
  export type RejectReviewResponse = RejectReviewResponses[keyof RejectReviewResponses];
5156
6137
 
6138
+ export type ReopenReviewData = {
6139
+ body: ReviewActionRequest;
6140
+ path: {
6141
+ id: string;
6142
+ };
6143
+ query?: never;
6144
+ url: '/api/v1/admin/age-gate/reviews/{id}/reopen';
6145
+ };
6146
+
6147
+ export type ReopenReviewResponses = {
6148
+ 200: AgeGateReviewResponse;
6149
+ };
6150
+
6151
+ export type ReopenReviewResponse = ReopenReviewResponses[keyof ReopenReviewResponses];
6152
+
5157
6153
  export type GetStaleArtifactsData = {
5158
6154
  body?: never;
5159
6155
  path?: never;
@@ -6559,6 +7555,53 @@ export type TriggerSearchReindexResponses = {
6559
7555
 
6560
7556
  export type TriggerSearchReindexResponse = TriggerSearchReindexResponses[keyof TriggerSearchReindexResponses];
6561
7557
 
7558
+ export type ArtifactAccessibleUsersData = {
7559
+ body?: never;
7560
+ path: {
7561
+ /**
7562
+ * Artifact id
7563
+ */
7564
+ artifact_id: string;
7565
+ };
7566
+ query?: {
7567
+ /**
7568
+ * Repository to scope the enumeration to. **Required** for the CVE route
7569
+ * (a CVE spans many repos); ignored for the artifact route (implied by the
7570
+ * artifact).
7571
+ */
7572
+ repository_id?: string | null;
7573
+ /**
7574
+ * 1-based page over the accessible-users list.
7575
+ */
7576
+ page?: number | null;
7577
+ /**
7578
+ * Users per page (1..=100, default 20).
7579
+ */
7580
+ per_page?: number | null;
7581
+ };
7582
+ url: '/api/v1/admin/security/artifact/{artifact_id}/accessible-users';
7583
+ };
7584
+
7585
+ export type ArtifactAccessibleUsersErrors = {
7586
+ /**
7587
+ * Admin privileges required
7588
+ */
7589
+ 403: unknown;
7590
+ /**
7591
+ * Artifact not found
7592
+ */
7593
+ 404: unknown;
7594
+ };
7595
+
7596
+ export type ArtifactAccessibleUsersResponses = {
7597
+ /**
7598
+ * Accessible-not-downloaded report
7599
+ */
7600
+ 200: AccessibleUsersResponse;
7601
+ };
7602
+
7603
+ export type ArtifactAccessibleUsersResponse = ArtifactAccessibleUsersResponses[keyof ArtifactAccessibleUsersResponses];
7604
+
6562
7605
  export type ArtifactBlastRadiusData = {
6563
7606
  body?: never;
6564
7607
  path: {
@@ -6608,6 +7651,57 @@ export type ArtifactBlastRadiusResponses = {
6608
7651
 
6609
7652
  export type ArtifactBlastRadiusResponse = ArtifactBlastRadiusResponses[keyof ArtifactBlastRadiusResponses];
6610
7653
 
7654
+ export type CveAccessibleUsersData = {
7655
+ body?: never;
7656
+ path: {
7657
+ /**
7658
+ * CVE id (exact match, e.g. CVE-2021-44228)
7659
+ */
7660
+ cve_id: string;
7661
+ };
7662
+ query?: {
7663
+ /**
7664
+ * Repository to scope the enumeration to. **Required** for the CVE route
7665
+ * (a CVE spans many repos); ignored for the artifact route (implied by the
7666
+ * artifact).
7667
+ */
7668
+ repository_id?: string | null;
7669
+ /**
7670
+ * 1-based page over the accessible-users list.
7671
+ */
7672
+ page?: number | null;
7673
+ /**
7674
+ * Users per page (1..=100, default 20).
7675
+ */
7676
+ per_page?: number | null;
7677
+ };
7678
+ url: '/api/v1/admin/security/cve/{cve_id}/accessible-users';
7679
+ };
7680
+
7681
+ export type CveAccessibleUsersErrors = {
7682
+ /**
7683
+ * Invalid parameter
7684
+ */
7685
+ 400: unknown;
7686
+ /**
7687
+ * Admin privileges required
7688
+ */
7689
+ 403: unknown;
7690
+ /**
7691
+ * CVE does not affect the repository
7692
+ */
7693
+ 404: unknown;
7694
+ };
7695
+
7696
+ export type CveAccessibleUsersResponses = {
7697
+ /**
7698
+ * Accessible-not-downloaded report
7699
+ */
7700
+ 200: AccessibleUsersResponse;
7701
+ };
7702
+
7703
+ export type CveAccessibleUsersResponse = CveAccessibleUsersResponses[keyof CveAccessibleUsersResponses];
7704
+
6611
7705
  export type CveBlastRadiusData = {
6612
7706
  body?: never;
6613
7707
  path: {
@@ -8716,19 +9810,166 @@ export type BlockPackageResponses = {
8716
9810
 
8717
9811
  export type BlockPackageResponse = BlockPackageResponses[keyof BlockPackageResponses];
8718
9812
 
8719
- export type ListCurationRulesData = {
9813
+ export type SearchCurationPackagesData = {
8720
9814
  body?: never;
8721
- path?: never;
8722
- query?: {
9815
+ path: {
8723
9816
  /**
8724
- * Filter by staging repo
9817
+ * Staging repository key
8725
9818
  */
8726
- staging_repo_id?: string;
9819
+ repo_key: string;
8727
9820
  };
8728
- url: '/api/v1/curation/rules';
8729
- };
8730
-
8731
- export type ListCurationRulesResponses = {
9821
+ query?: {
9822
+ /**
9823
+ * Case-insensitive substring match on the package name.
9824
+ */
9825
+ q?: string | null;
9826
+ /**
9827
+ * Exact architecture filter (e.g. `x86_64`, `noarch`).
9828
+ */
9829
+ arch?: string | null;
9830
+ /**
9831
+ * Curation status filter (e.g. `approved`, `pending`, `blocked`, `review`).
9832
+ */
9833
+ status?: string | null;
9834
+ limit?: number;
9835
+ offset?: number;
9836
+ };
9837
+ url: '/api/v1/curation/repos/{repo_key}/packages/search';
9838
+ };
9839
+
9840
+ export type SearchCurationPackagesErrors = {
9841
+ /**
9842
+ * Repository not found or not visible
9843
+ */
9844
+ 404: unknown;
9845
+ };
9846
+
9847
+ export type SearchCurationPackagesResponses = {
9848
+ 200: Array<CurationPackageResponse>;
9849
+ };
9850
+
9851
+ export type SearchCurationPackagesResponse = SearchCurationPackagesResponses[keyof SearchCurationPackagesResponses];
9852
+
9853
+ export type TriggerCurationSyncData = {
9854
+ body?: never;
9855
+ path: {
9856
+ /**
9857
+ * Staging repository key
9858
+ */
9859
+ repo_key: string;
9860
+ };
9861
+ query?: never;
9862
+ url: '/api/v1/curation/repos/{repo_key}/sync';
9863
+ };
9864
+
9865
+ export type TriggerCurationSyncErrors = {
9866
+ /**
9867
+ * Not authorized to trigger a sync for this repo
9868
+ */
9869
+ 403: unknown;
9870
+ /**
9871
+ * Repository not found
9872
+ */
9873
+ 404: unknown;
9874
+ };
9875
+
9876
+ export type TriggerCurationSyncResponses = {
9877
+ 200: SyncTriggerResponse;
9878
+ };
9879
+
9880
+ export type TriggerCurationSyncResponse = TriggerCurationSyncResponses[keyof TriggerCurationSyncResponses];
9881
+
9882
+ export type CreateCurationVersionData = {
9883
+ body?: never;
9884
+ path: {
9885
+ /**
9886
+ * Staging repository key
9887
+ */
9888
+ repo_key: string;
9889
+ };
9890
+ query?: never;
9891
+ url: '/api/v1/curation/repos/{repo_key}/versions';
9892
+ };
9893
+
9894
+ export type CreateCurationVersionErrors = {
9895
+ /**
9896
+ * No approved packages / packages need re-sync
9897
+ */
9898
+ 400: unknown;
9899
+ /**
9900
+ * Not authorized for this repo
9901
+ */
9902
+ 403: unknown;
9903
+ /**
9904
+ * Repository not found
9905
+ */
9906
+ 404: unknown;
9907
+ };
9908
+
9909
+ export type CreateCurationVersionResponses = {
9910
+ 201: VersionResponse;
9911
+ };
9912
+
9913
+ export type CreateCurationVersionResponse = CreateCurationVersionResponses[keyof CreateCurationVersionResponses];
9914
+
9915
+ export type PublishCurationVersionData = {
9916
+ body?: never;
9917
+ path: {
9918
+ /**
9919
+ * Staging repository key
9920
+ */
9921
+ repo_key: string;
9922
+ /**
9923
+ * Version number to publish
9924
+ */
9925
+ n: number;
9926
+ };
9927
+ query?: never;
9928
+ url: '/api/v1/curation/repos/{repo_key}/versions/{n}/publish';
9929
+ };
9930
+
9931
+ export type PublishCurationVersionErrors = {
9932
+ /**
9933
+ * Empty version / missing snippet / no signing key
9934
+ */
9935
+ 400: unknown;
9936
+ /**
9937
+ * Not authorized for this repo
9938
+ */
9939
+ 403: unknown;
9940
+ /**
9941
+ * Repository or version not found
9942
+ */
9943
+ 404: unknown;
9944
+ /**
9945
+ * Version already published (immutable)
9946
+ */
9947
+ 409: unknown;
9948
+ };
9949
+
9950
+ export type PublishCurationVersionResponses = {
9951
+ 200: VersionResponse;
9952
+ };
9953
+
9954
+ export type PublishCurationVersionResponse = PublishCurationVersionResponses[keyof PublishCurationVersionResponses];
9955
+
9956
+ export type ListCurationRulesData = {
9957
+ body?: never;
9958
+ path?: never;
9959
+ query?: {
9960
+ /**
9961
+ * Filter by staging repo
9962
+ */
9963
+ staging_repo_id?: string;
9964
+ /**
9965
+ * Filter by rule scope: `global` lists only the instance-wide baseline rules (admin-only)
9966
+ */
9967
+ scope?: string;
9968
+ };
9969
+ url: '/api/v1/curation/rules';
9970
+ };
9971
+
9972
+ export type ListCurationRulesResponses = {
8732
9973
  200: Array<RuleResponse>;
8733
9974
  };
8734
9975
 
@@ -11523,181 +12764,459 @@ export type GetPluginData = {
11523
12764
  body?: never;
11524
12765
  path: {
11525
12766
  /**
11526
- * Plugin ID
12767
+ * Plugin ID
12768
+ */
12769
+ id: string;
12770
+ };
12771
+ query?: never;
12772
+ url: '/api/v1/plugins/{id}';
12773
+ };
12774
+
12775
+ export type GetPluginErrors = {
12776
+ /**
12777
+ * Plugin not found
12778
+ */
12779
+ 404: unknown;
12780
+ };
12781
+
12782
+ export type GetPluginResponses = {
12783
+ /**
12784
+ * Plugin details
12785
+ */
12786
+ 200: PluginResponse;
12787
+ };
12788
+
12789
+ export type GetPluginResponse = GetPluginResponses[keyof GetPluginResponses];
12790
+
12791
+ export type GetPluginConfigData = {
12792
+ body?: never;
12793
+ path: {
12794
+ /**
12795
+ * Plugin ID
12796
+ */
12797
+ id: string;
12798
+ };
12799
+ query?: never;
12800
+ url: '/api/v1/plugins/{id}/config';
12801
+ };
12802
+
12803
+ export type GetPluginConfigErrors = {
12804
+ /**
12805
+ * Admin privileges required
12806
+ */
12807
+ 403: unknown;
12808
+ /**
12809
+ * Plugin not found
12810
+ */
12811
+ 404: unknown;
12812
+ };
12813
+
12814
+ export type GetPluginConfigResponses = {
12815
+ /**
12816
+ * Plugin configuration
12817
+ */
12818
+ 200: PluginConfigResponse;
12819
+ };
12820
+
12821
+ export type GetPluginConfigResponse = GetPluginConfigResponses[keyof GetPluginConfigResponses];
12822
+
12823
+ export type UpdatePluginConfigData = {
12824
+ body: UpdatePluginConfigRequest;
12825
+ path: {
12826
+ /**
12827
+ * Plugin ID
12828
+ */
12829
+ id: string;
12830
+ };
12831
+ query?: never;
12832
+ url: '/api/v1/plugins/{id}/config';
12833
+ };
12834
+
12835
+ export type UpdatePluginConfigErrors = {
12836
+ /**
12837
+ * Admin privileges required
12838
+ */
12839
+ 403: unknown;
12840
+ /**
12841
+ * Plugin not found
12842
+ */
12843
+ 404: unknown;
12844
+ };
12845
+
12846
+ export type UpdatePluginConfigResponses = {
12847
+ /**
12848
+ * Plugin configuration updated
12849
+ */
12850
+ 200: PluginConfigResponse;
12851
+ };
12852
+
12853
+ export type UpdatePluginConfigResponse = UpdatePluginConfigResponses[keyof UpdatePluginConfigResponses];
12854
+
12855
+ export type DisablePluginData = {
12856
+ body?: never;
12857
+ path: {
12858
+ /**
12859
+ * Plugin ID
12860
+ */
12861
+ id: string;
12862
+ };
12863
+ query?: never;
12864
+ url: '/api/v1/plugins/{id}/disable';
12865
+ };
12866
+
12867
+ export type DisablePluginErrors = {
12868
+ /**
12869
+ * Plugin not found
12870
+ */
12871
+ 404: unknown;
12872
+ };
12873
+
12874
+ export type DisablePluginResponses = {
12875
+ /**
12876
+ * Plugin disabled successfully
12877
+ */
12878
+ 200: unknown;
12879
+ };
12880
+
12881
+ export type EnablePluginData = {
12882
+ body?: never;
12883
+ path: {
12884
+ /**
12885
+ * Plugin ID
12886
+ */
12887
+ id: string;
12888
+ };
12889
+ query?: never;
12890
+ url: '/api/v1/plugins/{id}/enable';
12891
+ };
12892
+
12893
+ export type EnablePluginErrors = {
12894
+ /**
12895
+ * Plugin not found
12896
+ */
12897
+ 404: unknown;
12898
+ };
12899
+
12900
+ export type EnablePluginResponses = {
12901
+ /**
12902
+ * Plugin enabled successfully
12903
+ */
12904
+ 200: unknown;
12905
+ };
12906
+
12907
+ export type GetPluginEventsData = {
12908
+ body?: never;
12909
+ path: {
12910
+ /**
12911
+ * Plugin ID
12912
+ */
12913
+ id: string;
12914
+ };
12915
+ query?: {
12916
+ limit?: number | null;
12917
+ };
12918
+ url: '/api/v1/plugins/{id}/events';
12919
+ };
12920
+
12921
+ export type GetPluginEventsResponses = {
12922
+ /**
12923
+ * Plugin events
12924
+ */
12925
+ 200: Array<unknown>;
12926
+ };
12927
+
12928
+ export type GetPluginEventsResponse = GetPluginEventsResponses[keyof GetPluginEventsResponses];
12929
+
12930
+ export type ReloadPluginData = {
12931
+ body?: never;
12932
+ path: {
12933
+ /**
12934
+ * Plugin ID
12935
+ */
12936
+ id: string;
12937
+ };
12938
+ query?: never;
12939
+ url: '/api/v1/plugins/{id}/reload';
12940
+ };
12941
+
12942
+ export type ReloadPluginResponses = {
12943
+ /**
12944
+ * Plugin reloaded successfully
12945
+ */
12946
+ 200: WasmPluginResponse;
12947
+ };
12948
+
12949
+ export type ReloadPluginResponse = ReloadPluginResponses[keyof ReloadPluginResponses];
12950
+
12951
+ export type ProjectsListData = {
12952
+ body?: never;
12953
+ path?: never;
12954
+ query?: never;
12955
+ url: '/api/v1/projects';
12956
+ };
12957
+
12958
+ export type ProjectsListErrors = {
12959
+ /**
12960
+ * Authentication required
12961
+ */
12962
+ 401: unknown;
12963
+ /**
12964
+ * Admin privileges required
12965
+ */
12966
+ 403: unknown;
12967
+ };
12968
+
12969
+ export type ProjectsListResponses = {
12970
+ /**
12971
+ * List of projects
12972
+ */
12973
+ 200: ProjectListResponse;
12974
+ };
12975
+
12976
+ export type ProjectsListResponse = ProjectsListResponses[keyof ProjectsListResponses];
12977
+
12978
+ export type ProjectsCreateData = {
12979
+ body: CreateProjectRequest;
12980
+ path?: never;
12981
+ query?: never;
12982
+ url: '/api/v1/projects';
12983
+ };
12984
+
12985
+ export type ProjectsCreateErrors = {
12986
+ /**
12987
+ * Authentication required
12988
+ */
12989
+ 401: unknown;
12990
+ /**
12991
+ * Admin privileges required
12992
+ */
12993
+ 403: unknown;
12994
+ /**
12995
+ * Project key already exists
12996
+ */
12997
+ 409: unknown;
12998
+ };
12999
+
13000
+ export type ProjectsCreateResponses = {
13001
+ /**
13002
+ * Project created
13003
+ */
13004
+ 200: Project;
13005
+ };
13006
+
13007
+ export type ProjectsCreateResponse = ProjectsCreateResponses[keyof ProjectsCreateResponses];
13008
+
13009
+ export type ProjectsDeleteData = {
13010
+ body?: never;
13011
+ path: {
13012
+ /**
13013
+ * Project ID
11527
13014
  */
11528
13015
  id: string;
11529
13016
  };
11530
13017
  query?: never;
11531
- url: '/api/v1/plugins/{id}';
13018
+ url: '/api/v1/projects/{id}';
11532
13019
  };
11533
13020
 
11534
- export type GetPluginErrors = {
13021
+ export type ProjectsDeleteErrors = {
11535
13022
  /**
11536
- * Plugin not found
13023
+ * Authentication required
13024
+ */
13025
+ 401: unknown;
13026
+ /**
13027
+ * Admin privileges required
13028
+ */
13029
+ 403: unknown;
13030
+ /**
13031
+ * Project not found
11537
13032
  */
11538
13033
  404: unknown;
11539
13034
  };
11540
13035
 
11541
- export type GetPluginResponses = {
13036
+ export type ProjectsDeleteResponses = {
11542
13037
  /**
11543
- * Plugin details
13038
+ * Project deleted
11544
13039
  */
11545
- 200: PluginResponse;
13040
+ 200: unknown;
11546
13041
  };
11547
13042
 
11548
- export type GetPluginResponse = GetPluginResponses[keyof GetPluginResponses];
11549
-
11550
- export type GetPluginConfigData = {
13043
+ export type ProjectsGetData = {
11551
13044
  body?: never;
11552
13045
  path: {
11553
13046
  /**
11554
- * Plugin ID
13047
+ * Project ID
11555
13048
  */
11556
13049
  id: string;
11557
13050
  };
11558
13051
  query?: never;
11559
- url: '/api/v1/plugins/{id}/config';
13052
+ url: '/api/v1/projects/{id}';
11560
13053
  };
11561
13054
 
11562
- export type GetPluginConfigErrors = {
13055
+ export type ProjectsGetErrors = {
11563
13056
  /**
11564
- * Plugin not found
13057
+ * Authentication required
13058
+ */
13059
+ 401: unknown;
13060
+ /**
13061
+ * Admin privileges required
13062
+ */
13063
+ 403: unknown;
13064
+ /**
13065
+ * Project not found
11565
13066
  */
11566
13067
  404: unknown;
11567
13068
  };
11568
13069
 
11569
- export type GetPluginConfigResponses = {
13070
+ export type ProjectsGetResponses = {
11570
13071
  /**
11571
- * Plugin configuration
13072
+ * Project details
11572
13073
  */
11573
- 200: PluginConfigResponse;
13074
+ 200: Project;
11574
13075
  };
11575
13076
 
11576
- export type GetPluginConfigResponse = GetPluginConfigResponses[keyof GetPluginConfigResponses];
13077
+ export type ProjectsGetResponse = ProjectsGetResponses[keyof ProjectsGetResponses];
11577
13078
 
11578
- export type UpdatePluginConfigData = {
11579
- body: UpdatePluginConfigRequest;
13079
+ export type ProjectsUpdateData = {
13080
+ body: UpdateProjectRequest;
11580
13081
  path: {
11581
13082
  /**
11582
- * Plugin ID
13083
+ * Project ID
11583
13084
  */
11584
13085
  id: string;
11585
13086
  };
11586
13087
  query?: never;
11587
- url: '/api/v1/plugins/{id}/config';
13088
+ url: '/api/v1/projects/{id}';
11588
13089
  };
11589
13090
 
11590
- export type UpdatePluginConfigErrors = {
13091
+ export type ProjectsUpdateErrors = {
11591
13092
  /**
11592
- * Plugin not found
13093
+ * Authentication required
13094
+ */
13095
+ 401: unknown;
13096
+ /**
13097
+ * Admin privileges required
13098
+ */
13099
+ 403: unknown;
13100
+ /**
13101
+ * Project not found
11593
13102
  */
11594
13103
  404: unknown;
11595
13104
  };
11596
13105
 
11597
- export type UpdatePluginConfigResponses = {
13106
+ export type ProjectsUpdateResponses = {
11598
13107
  /**
11599
- * Plugin configuration updated
13108
+ * Project updated
11600
13109
  */
11601
- 200: PluginConfigResponse;
13110
+ 200: Project;
11602
13111
  };
11603
13112
 
11604
- export type UpdatePluginConfigResponse = UpdatePluginConfigResponses[keyof UpdatePluginConfigResponses];
13113
+ export type ProjectsUpdateResponse = ProjectsUpdateResponses[keyof ProjectsUpdateResponses];
11605
13114
 
11606
- export type DisablePluginData = {
11607
- body?: never;
13115
+ export type ProjectsRemoveMemberData = {
13116
+ body: RemoveProjectMemberRequest;
11608
13117
  path: {
11609
13118
  /**
11610
- * Plugin ID
13119
+ * Project ID
11611
13120
  */
11612
13121
  id: string;
11613
13122
  };
11614
13123
  query?: never;
11615
- url: '/api/v1/plugins/{id}/disable';
13124
+ url: '/api/v1/projects/{id}/members';
11616
13125
  };
11617
13126
 
11618
- export type DisablePluginErrors = {
13127
+ export type ProjectsRemoveMemberErrors = {
11619
13128
  /**
11620
- * Plugin not found
13129
+ * Authentication required
13130
+ */
13131
+ 401: unknown;
13132
+ /**
13133
+ * Admin privileges required
13134
+ */
13135
+ 403: unknown;
13136
+ /**
13137
+ * Grant not found
11621
13138
  */
11622
13139
  404: unknown;
11623
13140
  };
11624
13141
 
11625
- export type DisablePluginResponses = {
13142
+ export type ProjectsRemoveMemberResponses = {
11626
13143
  /**
11627
- * Plugin disabled successfully
13144
+ * Membership grant removed
11628
13145
  */
11629
13146
  200: unknown;
11630
13147
  };
11631
13148
 
11632
- export type EnablePluginData = {
13149
+ export type ProjectsListMembersData = {
11633
13150
  body?: never;
11634
13151
  path: {
11635
13152
  /**
11636
- * Plugin ID
13153
+ * Project ID
11637
13154
  */
11638
13155
  id: string;
11639
13156
  };
11640
13157
  query?: never;
11641
- url: '/api/v1/plugins/{id}/enable';
13158
+ url: '/api/v1/projects/{id}/members';
11642
13159
  };
11643
13160
 
11644
- export type EnablePluginErrors = {
13161
+ export type ProjectsListMembersErrors = {
11645
13162
  /**
11646
- * Plugin not found
13163
+ * Authentication required
13164
+ */
13165
+ 401: unknown;
13166
+ /**
13167
+ * Admin privileges required
13168
+ */
13169
+ 403: unknown;
13170
+ /**
13171
+ * Project not found
11647
13172
  */
11648
13173
  404: unknown;
11649
13174
  };
11650
13175
 
11651
- export type EnablePluginResponses = {
13176
+ export type ProjectsListMembersResponses = {
11652
13177
  /**
11653
- * Plugin enabled successfully
13178
+ * Project membership grants
11654
13179
  */
11655
- 200: unknown;
13180
+ 200: ProjectMemberListResponse;
11656
13181
  };
11657
13182
 
11658
- export type GetPluginEventsData = {
11659
- body?: never;
13183
+ export type ProjectsListMembersResponse = ProjectsListMembersResponses[keyof ProjectsListMembersResponses];
13184
+
13185
+ export type ProjectsAddMemberData = {
13186
+ body: AddProjectMemberRequest;
11660
13187
  path: {
11661
13188
  /**
11662
- * Plugin ID
13189
+ * Project ID
11663
13190
  */
11664
13191
  id: string;
11665
13192
  };
11666
- query?: {
11667
- limit?: number | null;
11668
- };
11669
- url: '/api/v1/plugins/{id}/events';
13193
+ query?: never;
13194
+ url: '/api/v1/projects/{id}/members';
11670
13195
  };
11671
13196
 
11672
- export type GetPluginEventsResponses = {
13197
+ export type ProjectsAddMemberErrors = {
11673
13198
  /**
11674
- * Plugin events
13199
+ * Authentication required
11675
13200
  */
11676
- 200: Array<unknown>;
11677
- };
11678
-
11679
- export type GetPluginEventsResponse = GetPluginEventsResponses[keyof GetPluginEventsResponses];
11680
-
11681
- export type ReloadPluginData = {
11682
- body?: never;
11683
- path: {
11684
- /**
11685
- * Plugin ID
11686
- */
11687
- id: string;
11688
- };
11689
- query?: never;
11690
- url: '/api/v1/plugins/{id}/reload';
13201
+ 401: unknown;
13202
+ /**
13203
+ * Admin privileges required
13204
+ */
13205
+ 403: unknown;
13206
+ /**
13207
+ * Project not found
13208
+ */
13209
+ 404: unknown;
11691
13210
  };
11692
13211
 
11693
- export type ReloadPluginResponses = {
13212
+ export type ProjectsAddMemberResponses = {
11694
13213
  /**
11695
- * Plugin reloaded successfully
13214
+ * Membership grant upserted
11696
13215
  */
11697
- 200: WasmPluginResponse;
13216
+ 200: ProjectMemberRow;
11698
13217
  };
11699
13218
 
11700
- export type ReloadPluginResponse = ReloadPluginResponses[keyof ReloadPluginResponses];
13219
+ export type ProjectsAddMemberResponse = ProjectsAddMemberResponses[keyof ProjectsAddMemberResponses];
11701
13220
 
11702
13221
  export type ListRulesData = {
11703
13222
  body?: never;
@@ -12417,6 +13936,15 @@ export type GetHealthDashboardData = {
12417
13936
  url: '/api/v1/quality/health/dashboard';
12418
13937
  };
12419
13938
 
13939
+ export type GetHealthDashboardErrors = {
13940
+ /**
13941
+ * Admin privileges required
13942
+ */
13943
+ 403: ErrorResponse;
13944
+ };
13945
+
13946
+ export type GetHealthDashboardError = GetHealthDashboardErrors[keyof GetHealthDashboardErrors];
13947
+
12420
13948
  export type GetHealthDashboardResponses = {
12421
13949
  /**
12422
13950
  * Health dashboard summary
@@ -12548,6 +14076,53 @@ export type GetQuarantineStatusResponses = {
12548
14076
 
12549
14077
  export type GetQuarantineStatusResponse = GetQuarantineStatusResponses[keyof GetQuarantineStatusResponses];
12550
14078
 
14079
+ export type QuarantineArtifactNowData = {
14080
+ /**
14081
+ * Optional; empty body uses the default reason
14082
+ */
14083
+ body: QuarantineNowRequest;
14084
+ path: {
14085
+ /**
14086
+ * Artifact ID
14087
+ */
14088
+ artifact_id: string;
14089
+ };
14090
+ query?: never;
14091
+ url: '/api/v1/quarantine/{artifact_id}/quarantine';
14092
+ };
14093
+
14094
+ export type QuarantineArtifactNowErrors = {
14095
+ /**
14096
+ * Malformed request body
14097
+ */
14098
+ 400: unknown;
14099
+ /**
14100
+ * Authentication required
14101
+ */
14102
+ 401: unknown;
14103
+ /**
14104
+ * Admin access required
14105
+ */
14106
+ 403: unknown;
14107
+ /**
14108
+ * Artifact not found
14109
+ */
14110
+ 404: unknown;
14111
+ /**
14112
+ * Artifact was rejected during security review
14113
+ */
14114
+ 409: unknown;
14115
+ };
14116
+
14117
+ export type QuarantineArtifactNowResponses = {
14118
+ /**
14119
+ * Artifact quarantined
14120
+ */
14121
+ 200: QuarantineActionResponse;
14122
+ };
14123
+
14124
+ export type QuarantineArtifactNowResponse = QuarantineArtifactNowResponses[keyof QuarantineArtifactNowResponses];
14125
+
12551
14126
  export type RejectQuarantinedArtifactData = {
12552
14127
  body: RejectRequest;
12553
14128
  path: {
@@ -12637,6 +14212,10 @@ export type ListRepositoriesData = {
12637
14212
  format?: string | null;
12638
14213
  type?: string | null;
12639
14214
  q?: string | null;
14215
+ /**
14216
+ * Filter the listing to repositories assigned to this project (#2472).
14217
+ */
14218
+ project?: string | null;
12640
14219
  };
12641
14220
  url: '/api/v1/repositories';
12642
14221
  };
@@ -12839,6 +14418,23 @@ export type ListArtifactsData = {
12839
14418
  * `docker_tags` array.
12840
14419
  */
12841
14420
  group_by?: string | null;
14421
+ /**
14422
+ * Opaque keyset cursor (#2520, #2519, #2518). Pass the `next_cursor`
14423
+ * value from the previous response to fetch the next page; `page` is
14424
+ * ignored while a cursor is present. Supported by the flat artifact
14425
+ * listing of hosted/local, virtual, and remote repositories (#2518,
14426
+ * #2519), by `group_by=docker_tag`, and by `group_by=maven_component`
14427
+ * on remote repositories; other listing modes ignore it.
14428
+ */
14429
+ cursor?: string | null;
14430
+ /**
14431
+ * Total-count mode for keyset-paged listings (#2520, #2519).
14432
+ * `count=exact` runs a dedicated COUNT query so `pagination.total` is
14433
+ * exact; otherwise the keyset-paged listings report a cheap lower bound
14434
+ * (rows seen so far, +1 when another page exists) and `has_more` is the
14435
+ * authoritative "is there a next page" signal.
14436
+ */
14437
+ count?: string | null;
12842
14438
  };
12843
14439
  url: '/api/v1/repositories/{key}/artifacts';
12844
14440
  };
@@ -13436,13 +15032,17 @@ export type UpdateVirtualMembersData = {
13436
15032
 
13437
15033
  export type UpdateVirtualMembersErrors = {
13438
15034
  /**
13439
- * Repository is not virtual
15035
+ * Repository is not virtual, or a member is invalid
13440
15036
  */
13441
15037
  400: unknown;
13442
15038
  /**
13443
15039
  * Authentication required
13444
15040
  */
13445
15041
  401: unknown;
15042
+ /**
15043
+ * Insufficient permissions
15044
+ */
15045
+ 403: unknown;
13446
15046
  /**
13447
15047
  * Repository not found
13448
15048
  */
@@ -13451,7 +15051,7 @@ export type UpdateVirtualMembersErrors = {
13451
15051
 
13452
15052
  export type UpdateVirtualMembersResponses = {
13453
15053
  /**
13454
- * Members updated
15054
+ * Members replaced with the supplied set
13455
15055
  */
13456
15056
  200: VirtualMembersListResponse;
13457
15057
  };
@@ -13858,6 +15458,78 @@ export type ListRepoScansResponses = {
13858
15458
 
13859
15459
  export type ListRepoScansResponse = ListRepoScansResponses[keyof ListRepoScansResponses];
13860
15460
 
15461
+ export type GetRepositoryStorageData = {
15462
+ body?: never;
15463
+ path: {
15464
+ /**
15465
+ * Repository key
15466
+ */
15467
+ key: string;
15468
+ };
15469
+ query?: never;
15470
+ url: '/api/v1/repositories/{key}/storage';
15471
+ };
15472
+
15473
+ export type GetRepositoryStorageErrors = {
15474
+ /**
15475
+ * Repository not found
15476
+ */
15477
+ 404: unknown;
15478
+ };
15479
+
15480
+ export type GetRepositoryStorageResponses = {
15481
+ /**
15482
+ * Deduplicated storage stats
15483
+ */
15484
+ 200: RepositoryStorageStatsResponse;
15485
+ };
15486
+
15487
+ export type GetRepositoryStorageResponse = GetRepositoryStorageResponses[keyof GetRepositoryStorageResponses];
15488
+
15489
+ export type GetRepositoryStorageTreeData = {
15490
+ body?: never;
15491
+ path: {
15492
+ /**
15493
+ * Repository key
15494
+ */
15495
+ key: string;
15496
+ };
15497
+ query?: {
15498
+ /**
15499
+ * Folder prefix to root the listing at (`''`/absent = repository root).
15500
+ * Leading/trailing slashes are ignored.
15501
+ */
15502
+ prefix?: string | null;
15503
+ /**
15504
+ * How many tree levels below `prefix` to return (default 1 = immediate
15505
+ * children, clamped to 1..=5).
15506
+ */
15507
+ depth?: number | null;
15508
+ /**
15509
+ * Maximum number of descendant nodes returned (default 200, clamped to
15510
+ * 1..=1000). `truncated` is set when the limit cut the listing.
15511
+ */
15512
+ limit?: number | null;
15513
+ };
15514
+ url: '/api/v1/repositories/{key}/storage/tree';
15515
+ };
15516
+
15517
+ export type GetRepositoryStorageTreeErrors = {
15518
+ /**
15519
+ * Repository not found
15520
+ */
15521
+ 404: unknown;
15522
+ };
15523
+
15524
+ export type GetRepositoryStorageTreeResponses = {
15525
+ /**
15526
+ * Per-prefix storage rollup
15527
+ */
15528
+ 200: RepositoryStorageTreeResponse;
15529
+ };
15530
+
15531
+ export type GetRepositoryStorageTreeResponse = GetRepositoryStorageTreeResponses[keyof GetRepositoryStorageTreeResponses];
15532
+
13861
15533
  export type TestUpstreamData = {
13862
15534
  body?: never;
13863
15535
  path: {
@@ -15459,6 +17131,44 @@ export type SetupStatusResponses = {
15459
17131
 
15460
17132
  export type SetupStatusResponse2 = SetupStatusResponses[keyof SetupStatusResponses];
15461
17133
 
17134
+ export type SignArtifactData = {
17135
+ body?: never;
17136
+ path: {
17137
+ /**
17138
+ * Artifact ID
17139
+ */
17140
+ artifact_id: string;
17141
+ };
17142
+ query?: never;
17143
+ url: '/api/v1/signing/artifacts/{artifact_id}/sign';
17144
+ };
17145
+
17146
+ export type SignArtifactErrors = {
17147
+ /**
17148
+ * Admin privilege required
17149
+ */
17150
+ 403: ErrorResponse;
17151
+ /**
17152
+ * Artifact not found or not eligible for signing
17153
+ */
17154
+ 404: ErrorResponse;
17155
+ /**
17156
+ * Repository has no active signing key/config
17157
+ */
17158
+ 409: ErrorResponse;
17159
+ };
17160
+
17161
+ export type SignArtifactError = SignArtifactErrors[keyof SignArtifactErrors];
17162
+
17163
+ export type SignArtifactResponses = {
17164
+ /**
17165
+ * Artifact signed; attestation recorded
17166
+ */
17167
+ 200: SignArtifactResponse;
17168
+ };
17169
+
17170
+ export type SignArtifactResponse2 = SignArtifactResponses[keyof SignArtifactResponses];
17171
+
15462
17172
  export type ListKeysData = {
15463
17173
  body?: never;
15464
17174
  path?: never;
@@ -17068,7 +18778,7 @@ export type RotateWebhookSecretErrors = {
17068
18778
 
17069
18779
  export type RotateWebhookSecretResponses = {
17070
18780
  /**
17071
- * Secret rotated. Body includes the new raw secret exactly once.
18781
+ * Secret rotated. Body reports success and metadata only; the raw secret is not returned.
17072
18782
  */
17073
18783
  200: RotateWebhookSecretResponse;
17074
18784
  };