@artifact-keeper/sdk 1.5.7 → 1.6.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;
@@ -1153,6 +1210,16 @@ export type CreatePolicyRequest = {
1153
1210
  require_signature?: boolean;
1154
1211
  };
1155
1212
 
1213
+ export type CreateProjectRequest = {
1214
+ description?: string | null;
1215
+ key: string;
1216
+ name: string;
1217
+ /**
1218
+ * P1: stored only, NOT enforced (quota enforcement is P3).
1219
+ */
1220
+ quota_bytes?: number | null;
1221
+ };
1222
+
1156
1223
  /**
1157
1224
  * Request to create an access token scoped to a repository.
1158
1225
  */
@@ -1198,6 +1265,32 @@ export type CreateRepositoryRequest = {
1198
1265
  * `allow_anonymous_access` takes precedence.
1199
1266
  */
1200
1267
  allow_anonymous_access?: boolean | null;
1268
+ /**
1269
+ * Custom Description field for Debian/APT Release files.
1270
+ * Stored in `repository_config` under `apt_description`.
1271
+ */
1272
+ apt_description?: string | null;
1273
+ /**
1274
+ * Custom Label field for Debian/APT Release files.
1275
+ * Stored in `repository_config` under `apt_label`.
1276
+ */
1277
+ apt_label?: string | null;
1278
+ /**
1279
+ * Custom Origin field for Debian/APT Release files.
1280
+ * Stored in `repository_config` under `apt_origin`.
1281
+ */
1282
+ apt_origin?: string | null;
1283
+ /**
1284
+ * Custom Version field for Debian/APT Release files.
1285
+ * Stored in `repository_config` under `apt_release_version`.
1286
+ */
1287
+ apt_release_version?: string | null;
1288
+ /**
1289
+ * Custom User-Agent sent on outbound HTTP requests to the upstream for
1290
+ * this repository. Only valid for remote repositories. Max 256 characters.
1291
+ */
1292
+ custom_user_agent?: string | null;
1293
+ debian?: null | DebianRepositoryConfig;
1201
1294
  description?: string | null;
1202
1295
  format: string;
1203
1296
  /**
@@ -1219,6 +1312,31 @@ export type CreateRepositoryRequest = {
1219
1312
  */
1220
1313
  member_repos?: Array<CreateVirtualMemberInput> | null;
1221
1314
  name: string;
1315
+ /**
1316
+ * Whether unscoped npm package names may resolve through this npm Remote
1317
+ * repository (#2424). Stored under `npm_allow_unscoped`.
1318
+ */
1319
+ npm_allow_unscoped?: boolean | null;
1320
+ /**
1321
+ * Allowed npm full-name glob patterns (`*`/`?`) for this npm Remote
1322
+ * repository (#2424). Additive to `npm_allowed_scopes`; stored under
1323
+ * `npm_allowed_name_patterns`. A name is allowed if its scope is allowed
1324
+ * OR any glob matches (e.g. `@acme*`, `internal-*`).
1325
+ */
1326
+ npm_allowed_name_patterns?: Array<string> | null;
1327
+ /**
1328
+ * Allowed npm `@scope` literals for this npm Remote repository (#2424).
1329
+ * Only meaningful for npm-format Remote repositories; validated and stored
1330
+ * in `repository_config` under `npm_allowed_scopes`. Omit to leave the
1331
+ * repository unrestricted by scope.
1332
+ */
1333
+ npm_allowed_scopes?: Array<string> | null;
1334
+ /**
1335
+ * Optional project to assign this repository to (#2472). Grants on the
1336
+ * project (permissions with `target_type = 'project'`) are inherited by
1337
+ * the repository. Omit to leave the repository unassigned.
1338
+ */
1339
+ project_id?: string | null;
1222
1340
  /**
1223
1341
  * When true, direct user uploads to this repository are rejected:
1224
1342
  * artifacts must arrive via the promotion path. Admin-only to set.
@@ -1246,6 +1364,16 @@ export type CreateRepositoryRequest = {
1246
1364
  * Non-admin users may only use the default backend.
1247
1365
  */
1248
1366
  storage_backend?: string | null;
1367
+ /**
1368
+ * ASCII-armored OpenPGP *public* key trusted to sign this RPM curation
1369
+ * remote's `repodata/repomd.xml` (#2568, RPM curation Phase 3). When set,
1370
+ * the curation sync fetches `repomd.xml.asc` and verifies the detached
1371
+ * signature before ingesting upstream metadata (#2567 reads this column).
1372
+ * Must be a PUBLIC key block; a private-key block is rejected. Write-only:
1373
+ * the response exposes only the boolean `has_trusted_gpg_key`, never the
1374
+ * key material.
1375
+ */
1376
+ trusted_gpg_key?: string | null;
1249
1377
  /**
1250
1378
  * Upstream auth type: "basic" or "bearer". Only valid for remote repos.
1251
1379
  */
@@ -1289,6 +1417,12 @@ export type CreateSamlConfigRequest = {
1289
1417
  certificate: string;
1290
1418
  entity_id: string;
1291
1419
  is_enabled?: boolean | null;
1420
+ /**
1421
+ * Opt-in flag (see migration 157, #2333): when true, SAML assertion
1422
+ * group values are reflected as Artifact Keeper group memberships.
1423
+ * Defaults to false.
1424
+ */
1425
+ map_groups_to_groups?: boolean | null;
1292
1426
  name: string;
1293
1427
  name_id_format?: string | null;
1294
1428
  require_signed_assertions?: boolean | null;
@@ -1666,6 +1800,102 @@ export type DbPoolStats = {
1666
1800
  size: number;
1667
1801
  };
1668
1802
 
1803
+ /**
1804
+ * Partial-update patch for [`DebianRepositoryConfig`]. Fields left absent are
1805
+ * preserved; provided fields (including an explicit empty list) replace the
1806
+ * stored value. Applied on top of the currently stored config, or on top of
1807
+ * the default when none exists yet.
1808
+ */
1809
+ export type DebianConfigPatch = {
1810
+ architectures?: Array<string> | null;
1811
+ components?: Array<string> | null;
1812
+ distribution_paths?: Array<string> | null;
1813
+ flat_repository?: boolean | null;
1814
+ include_source_packages?: boolean | null;
1815
+ metadata_strategy?: null | DebianMetadataStrategy;
1816
+ package_fetch_strategy?: null | DebianPackageFetchStrategy;
1817
+ package_queries?: Array<string> | null;
1818
+ upstream_gpg_key_id?: string | null;
1819
+ verify_upstream_metadata?: boolean | null;
1820
+ };
1821
+
1822
+ /**
1823
+ * How metadata (`Packages`/`Release`) is produced for a Debian remote.
1824
+ *
1825
+ * Only [`DebianMetadataStrategy::UpstreamPassthrough`] is implemented in
1826
+ * 1.6.0; the other variants are reserved for P3 (filtered generation) / P4
1827
+ * (local re-signing) and are rejected with 422 until then. The enum lands now
1828
+ * so those phases can flip it on without a schema/config-shape change.
1829
+ */
1830
+ export type DebianMetadataStrategy = 'upstream_passthrough' | 'filter_and_generate' | 'filter_generate_and_sign' | 'hosted_generate';
1831
+
1832
+ /**
1833
+ * How package bodies are fetched for a Debian remote.
1834
+ *
1835
+ * Only [`DebianPackageFetchStrategy::UpstreamPassthrough`] is implemented in
1836
+ * 1.6.0.
1837
+ */
1838
+ export type DebianPackageFetchStrategy = 'upstream_passthrough' | 'eager';
1839
+
1840
+ /**
1841
+ * P2 Debian remote proxy filter config (dist/component/arch allowlists).
1842
+ *
1843
+ * Semantics for each allowlist: an empty list OR a list containing `"*"`
1844
+ * selects everything (today's full-proxy behaviour); otherwise only exact
1845
+ * matches are selected. Architecture-independent (`all`) packages are always
1846
+ * permitted regardless of the `architectures` allowlist.
1847
+ */
1848
+ export type DebianRepositoryConfig = {
1849
+ /**
1850
+ * Architectures (e.g. `amd64`, `arm64`) to proxy. Empty/`["*"]` = all.
1851
+ * `all` (arch-independent) is always permitted.
1852
+ */
1853
+ architectures?: Array<string>;
1854
+ /**
1855
+ * Components (e.g. `main`, `contrib`, `non-free`) to proxy. Empty/`["*"]` = all.
1856
+ */
1857
+ components?: Array<string>;
1858
+ /**
1859
+ * Distributions (a.k.a. suites/codenames, e.g. `bookworm`) to proxy.
1860
+ * Empty or `["*"]` = all.
1861
+ */
1862
+ distribution_paths?: Array<string>;
1863
+ /**
1864
+ * Flat (non-`dists/`) repository layout flag. Accepted but does NOT weaken
1865
+ * P1's flat/redirect abuse posture in passthrough.
1866
+ */
1867
+ flat_repository?: boolean;
1868
+ /**
1869
+ * Whether source packages (`Sources`, `.dsc`) are included. Advisory in
1870
+ * passthrough (upstream metadata is unchanged); honored under P3.
1871
+ */
1872
+ include_source_packages?: boolean;
1873
+ /**
1874
+ * Metadata production strategy. Only `upstream_passthrough` in 1.6.0.
1875
+ */
1876
+ metadata_strategy?: DebianMetadataStrategy;
1877
+ /**
1878
+ * Package-body fetch strategy. Only `upstream_passthrough` in 1.6.0.
1879
+ */
1880
+ package_fetch_strategy?: DebianPackageFetchStrategy;
1881
+ /**
1882
+ * Package-name-level queries. NOT honored in passthrough (that needs P3);
1883
+ * a non-empty value here with `upstream_passthrough` is rejected with 422
1884
+ * rather than silently advertising content the proxy would then block.
1885
+ */
1886
+ package_queries?: Array<string>;
1887
+ /**
1888
+ * Upstream GPG key id used to verify upstream metadata (reserved for P4).
1889
+ */
1890
+ upstream_gpg_key_id?: string | null;
1891
+ /**
1892
+ * Whether to verify the upstream signed `Release` before serving. In P2 the
1893
+ * P1 integrity gate already enforces index/Release consistency; this flag
1894
+ * is reserved for P4 trust-anchor verification.
1895
+ */
1896
+ verify_upstream_metadata?: boolean;
1897
+ };
1898
+
1669
1899
  export type DeliveryListResponse = {
1670
1900
  items: Array<DeliveryResponse>;
1671
1901
  total: number;
@@ -2562,6 +2792,10 @@ export type ListRepositoriesQuery = {
2562
2792
  format?: string | null;
2563
2793
  page?: number | null;
2564
2794
  per_page?: number | null;
2795
+ /**
2796
+ * Filter the listing to repositories assigned to this project (#2472).
2797
+ */
2798
+ project?: string | null;
2565
2799
  q?: string | null;
2566
2800
  type?: string | null;
2567
2801
  };
@@ -2825,26 +3059,33 @@ export type NpmScopePolicyResponse = {
2825
3059
  * layers before any garbage-collection mechanism is enabled.
2826
3060
  *
2827
3061
  * 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.
3062
+ * "reclaimable orphans": that is the blob GC's job (mark-and-sweep over
3063
+ * `manifest_blob_refs`, per [`BLOB_PROTECTED_BY_REFS_SQL`]). A naive
3064
+ * per-`(repository_id, digest)` orphan heuristic would mis-handle shared
3065
+ * backends (anything other than `filesystem`), where all referencing
3066
+ * repos share ONE physical object per digest per backend, and report
3067
+ * in-use blobs as reclaimable; on `filesystem` each repository keeps an
3068
+ * independent copy under its own `storage_path`. The numbers here are
3069
+ * exact aggregates only.
2833
3070
  */
2834
3071
  export type OciBlobFootprintReport = {
2835
3072
  /**
2836
- * Distinct digests older than `grace_hours` (eligible to be *considered*
2837
- * by a future GC sweep once a reference table exists). Reporting only.
3073
+ * Distinct digests with at least one physical copy older than
3074
+ * `grace_hours` (eligible to be *considered* by a future GC sweep once
3075
+ * a reference table exists). Reporting only.
2838
3076
  */
2839
3077
  aged_distinct_digests: number;
2840
3078
  /**
2841
- * Physical bytes (distinct-digest) older than `grace_hours`.
3079
+ * Physical bytes (same physical-object grouping as `physical_bytes`)
3080
+ * older than `grace_hours`.
2842
3081
  */
2843
3082
  aged_physical_bytes: number;
2844
3083
  /**
2845
3084
  * Number of distinct blob digests (content-addressed identities). When
2846
3085
  * this is smaller than `total_blob_rows`, the difference is cross-repo
2847
- * deduplication: rows that share one physical storage object.
3086
+ * sharing of a content identity (one physical object shared by all
3087
+ * referencing repos on shared backends; an independent copy per
3088
+ * repository on `filesystem`).
2848
3089
  */
2849
3090
  distinct_digests: number;
2850
3091
  /**
@@ -2861,8 +3102,13 @@ export type OciBlobFootprintReport = {
2861
3102
  */
2862
3103
  per_repository: Array<OciBlobRepoFootprint>;
2863
3104
  /**
2864
- * Sum of `size_bytes` counting each distinct digest exactly once. This
2865
- * approximates the physical bytes occupied in the storage backend.
3105
+ * Sum of `size_bytes` counting each distinct **physical storage
3106
+ * object** exactly once, per the ownership model of
3107
+ * [`BLOB_PROTECTED_BY_REFS_SQL`]: on shared backends (anything other
3108
+ * than `filesystem`) a digest is one object per backend; on
3109
+ * `filesystem` each repository stores its own copy under its
3110
+ * `storage_path`, so the same digest in two filesystem repositories
3111
+ * counts twice.
2866
3112
  */
2867
3113
  physical_bytes: number;
2868
3114
  /**
@@ -2880,10 +3126,13 @@ export type OciBlobRepoFootprint = {
2880
3126
  */
2881
3127
  blob_rows: number;
2882
3128
  /**
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
3129
+ * Sum of `oci_blobs.size_bytes` for this repository's rows. On shared
3130
+ * backends (anything other than `filesystem`) blobs are deduplicated
3131
+ * across repos — one physical object per digest per backend — so the
2885
3132
  * same physical bytes can be counted under more than one repository
2886
- * here; see [`OciBlobFootprintReport::physical_bytes`] for the
3133
+ * here. On `filesystem` each repository stores its own independent
3134
+ * copy under its `storage_path`, so its rows are that repo's real
3135
+ * bytes. See [`OciBlobFootprintReport::physical_bytes`] for the
2887
3136
  * dedup-aware total.
2888
3137
  */
2889
3138
  logical_bytes: number;
@@ -2962,6 +3211,23 @@ export type PackageRow = {
2962
3211
  version: string;
2963
3212
  };
2964
3213
 
3214
+ export type PackageSearchQuery = {
3215
+ /**
3216
+ * Exact architecture filter (e.g. `x86_64`, `noarch`).
3217
+ */
3218
+ arch?: string | null;
3219
+ limit?: number;
3220
+ offset?: number;
3221
+ /**
3222
+ * Case-insensitive substring match on the package name.
3223
+ */
3224
+ q?: string | null;
3225
+ /**
3226
+ * Curation status filter (e.g. `approved`, `pending`, `blocked`, `review`).
3227
+ */
3228
+ status?: string | null;
3229
+ };
3230
+
2965
3231
  export type PackageVersionResponse = {
2966
3232
  checksum_sha256: string;
2967
3233
  created_at: string;
@@ -3295,6 +3561,43 @@ export type ProbeBody = {
3295
3561
  target_peer_id: string;
3296
3562
  };
3297
3563
 
3564
+ /**
3565
+ * Project entity.
3566
+ */
3567
+ export type Project = {
3568
+ created_at: string;
3569
+ description?: string | null;
3570
+ id: string;
3571
+ /**
3572
+ * Unique, URL-safe project key (e.g. "payments").
3573
+ */
3574
+ key: string;
3575
+ name: string;
3576
+ /**
3577
+ * Storage quota in bytes. P1: stored only, NOT enforced (quotas = P3).
3578
+ */
3579
+ quota_bytes?: number | null;
3580
+ updated_at: string;
3581
+ };
3582
+
3583
+ export type ProjectListResponse = {
3584
+ items: Array<Project>;
3585
+ };
3586
+
3587
+ export type ProjectMemberListResponse = {
3588
+ items: Array<ProjectMemberRow>;
3589
+ };
3590
+
3591
+ /**
3592
+ * One membership grant on a project: a `permissions` row with
3593
+ * `target_type = 'project'`.
3594
+ */
3595
+ export type ProjectMemberRow = {
3596
+ actions: Array<string>;
3597
+ principal_id: string;
3598
+ principal_type: string;
3599
+ };
3600
+
3298
3601
  export type PromoteArtifactRequest = {
3299
3602
  notes?: string | null;
3300
3603
  skip_policy_check?: boolean;
@@ -3505,6 +3808,24 @@ export type RemoteInstanceResponse = {
3505
3808
  url: string;
3506
3809
  };
3507
3810
 
3811
+ export type RemoveProjectMemberRequest = {
3812
+ principal_id: string;
3813
+ principal_type: string;
3814
+ };
3815
+
3816
+ /**
3817
+ * Repository exposure descriptor echoed in the response.
3818
+ */
3819
+ export type RepoExposure = {
3820
+ /**
3821
+ * `public` | `restricted_acl` | `restricted_roles` — see
3822
+ * [`classify_access_scope`].
3823
+ */
3824
+ access_scope: string;
3825
+ repository_id: string;
3826
+ repository_key: string;
3827
+ };
3828
+
3508
3829
  export type RepoHealthResponse = {
3509
3830
  artifacts_evaluated: number;
3510
3831
  artifacts_failing: number;
@@ -3580,13 +3901,65 @@ export type RepositoryResponse = {
3580
3901
  * the semantics are clear for remote (pull-through cache) repositories.
3581
3902
  */
3582
3903
  allow_anonymous_access: boolean;
3904
+ /**
3905
+ * Custom Description field for Debian/APT Release files. Omitted from the
3906
+ * Release file when `None` or empty.
3907
+ */
3908
+ apt_description?: string | null;
3909
+ /**
3910
+ * Custom Label field for Debian/APT Release files (default: "artifact-keeper").
3911
+ */
3912
+ apt_label?: string | null;
3913
+ /**
3914
+ * Custom Origin field for Debian/APT Release files (default: "artifact-keeper").
3915
+ */
3916
+ apt_origin?: string | null;
3917
+ /**
3918
+ * Custom Version field for Debian/APT Release files. Omitted from the
3919
+ * Release file when `None` or empty.
3920
+ */
3921
+ apt_release_version?: string | null;
3583
3922
  created_at: string;
3923
+ /**
3924
+ * Custom User-Agent used for outbound HTTP requests to the upstream,
3925
+ * read back from `repository_config`. `None` when unset.
3926
+ */
3927
+ custom_user_agent?: string | null;
3928
+ debian?: null | DebianRepositoryConfig;
3584
3929
  description?: string | null;
3585
3930
  format: string;
3931
+ /**
3932
+ * Whether a trusted upstream OpenPGP public key is configured for RPM
3933
+ * curation signature verification (#2568). The key material itself is
3934
+ * never returned; this boolean is the only exposure. `false` for repos
3935
+ * with no key set. Populated by the single-repo handlers (create / get /
3936
+ * update) and the listing; `repo_to_response` alone defaults it to `false`
3937
+ * (it is db-less and cannot read the column).
3938
+ */
3939
+ has_trusted_gpg_key: boolean;
3586
3940
  id: string;
3587
3941
  is_public: boolean;
3588
3942
  key: string;
3589
3943
  name: string;
3944
+ /**
3945
+ * Whether unscoped npm names may resolve through this npm Remote
3946
+ * repository (#2424). Omitted when unset.
3947
+ */
3948
+ npm_allow_unscoped?: boolean | null;
3949
+ /**
3950
+ * Allowed npm full-name glob patterns (#2424), read back from
3951
+ * `repository_config`. Omitted for non-npm repositories or when unset.
3952
+ */
3953
+ npm_allowed_name_patterns?: Array<string> | null;
3954
+ /**
3955
+ * Allowed npm `@scope` literals (#2424), read back from
3956
+ * `repository_config`. Omitted for non-npm repositories or when unset.
3957
+ */
3958
+ npm_allowed_scopes?: Array<string> | null;
3959
+ /**
3960
+ * Project this repository is assigned to (#2472), if any.
3961
+ */
3962
+ project_id?: string | null;
3590
3963
  /**
3591
3964
  * When true, direct user uploads are rejected; artifacts must be promoted.
3592
3965
  */
@@ -3657,6 +4030,83 @@ export type RepositoryStorageBreakdown = {
3657
4030
  storage_bytes: number;
3658
4031
  };
3659
4032
 
4033
+ /**
4034
+ * Deduplicated storage-accounting response for a single repository (#2056).
4035
+ *
4036
+ * All figures are read from the materialized `repository_storage_stats` cache
4037
+ * (refreshed on a schedule + post-GC), so this endpoint is an O(1) primary-key
4038
+ * lookup and never runs the heavy cross-repo aggregation. `computed_at` is the
4039
+ * freshness marker; it is `null` until the first refresh has run.
4040
+ *
4041
+ * Quota is unaffected: these numbers are accounting/visibility only and do NOT
4042
+ * change how the repository's storage quota is enforced (#2056 §7).
4043
+ */
4044
+ export type RepositoryStorageStatsResponse = {
4045
+ /**
4046
+ * Distinct physical objects (dedup keys) this repository references.
4047
+ */
4048
+ blob_count: number;
4049
+ /**
4050
+ * When these figures were last recomputed. `null` before the first refresh.
4051
+ */
4052
+ computed_at?: string | null;
4053
+ /**
4054
+ * logical_bytes / physical_bytes (1.0 when nothing is stored). Restricted
4055
+ * on cloud backends — see [`physical_bytes`](Self::physical_bytes).
4056
+ */
4057
+ dedup_ratio?: number | null;
4058
+ /**
4059
+ * `per_repo` (filesystem) or `instance` (cloud) — the backend semantics at
4060
+ * compute time.
4061
+ */
4062
+ dedup_scope: string;
4063
+ /**
4064
+ * The instance-wide globally-distinct footprint (true disk usage). On
4065
+ * cloud backends the sum of per-repo `physical_bytes` OVER-counts shared
4066
+ * objects, so this is the authoritative instance total.
4067
+ *
4068
+ * **Admin-only:** this is a whole-instance aggregate that spans every
4069
+ * tenant, so it is only populated for admin callers. It is omitted from the
4070
+ * response entirely for repo-authorized non-admins and anonymous callers,
4071
+ * who see only this repository's own figures (#2559 review).
4072
+ */
4073
+ instance_unique_bytes?: number | null;
4074
+ /**
4075
+ * Sum over every reference (per-row). Now includes OCI layer bytes, which
4076
+ * were previously omitted from all storage accounting.
4077
+ */
4078
+ logical_bytes: number;
4079
+ /**
4080
+ * Deduplicated physical footprint within the dedup scope.
4081
+ *
4082
+ * **Restricted on cloud (instance-scope) backends:** on a shared-storage
4083
+ * backend `physical_bytes`, `unique_bytes`, `shared_bytes` and
4084
+ * `dedup_ratio` are all cross-tenant-derivable — `shared_bytes =
4085
+ * physical_bytes - unique_bytes` reveals whether this repo's blobs are also
4086
+ * stored by another tenant (a per-blob cross-tenant existence oracle,
4087
+ * #2560). The whole derivable set is therefore populated only for admins on
4088
+ * instance-scope backends, and omitted for repo-authorized non-admins /
4089
+ * anonymous callers. On `per_repo` (filesystem) backends there is no
4090
+ * cross-tenant sharing (`shared_bytes == 0` by construction), so all
4091
+ * figures are always present.
4092
+ */
4093
+ physical_bytes?: number | null;
4094
+ repository_key: string;
4095
+ /**
4096
+ * physical_bytes - unique_bytes. Always 0 on filesystem backends (a shared
4097
+ * digest in two repos is two files). Restricted on cloud backends — see
4098
+ * [`physical_bytes`](Self::physical_bytes).
4099
+ */
4100
+ shared_bytes?: number | null;
4101
+ /**
4102
+ * Physical bytes of objects referenced only by this repository.
4103
+ * Restricted on cloud backends — see [`physical_bytes`].
4104
+ *
4105
+ * [`physical_bytes`]: Self::physical_bytes
4106
+ */
4107
+ unique_bytes?: number | null;
4108
+ };
4109
+
3660
4110
  export type RescanForInventoryRequest = {
3661
4111
  /**
3662
4112
  * Maximum number of artifacts to enqueue in this call. Operators
@@ -3817,6 +4267,12 @@ export type SamlConfigResponse = {
3817
4267
  has_certificate: boolean;
3818
4268
  id: string;
3819
4269
  is_enabled: boolean;
4270
+ /**
4271
+ * Opt-in flag (see migration 157, #2333): when true, SAML assertion
4272
+ * group values are reflected as Artifact Keeper group memberships,
4273
+ * mirroring the OIDC flag from #1094. Defaults to false.
4274
+ */
4275
+ map_groups_to_groups: boolean;
3820
4276
  name: string;
3821
4277
  name_id_format: string;
3822
4278
  require_signed_assertions: boolean;
@@ -3878,6 +4334,23 @@ export type ScanResponse = {
3878
4334
  artifact_id: string;
3879
4335
  artifact_name?: string | null;
3880
4336
  artifact_version?: string | null;
4337
+ /**
4338
+ * #2471: number of `not_applicable` scanner rows folded into this row.
4339
+ * `Some(n)` marks a synthetic *summary* row that collapses `n` redundant
4340
+ * "this scanner does not apply" results (e.g. the image-family scanners
4341
+ * `filesystem`/`incus`/`openscap` all declining on a Docker image) into a
4342
+ * single muted "not applicable to this artifact" indication, so the UI
4343
+ * stops rendering N rows that read as N failures. `None` for every real
4344
+ * (non-collapsed) scan row. Omitted from the wire when `None`.
4345
+ */
4346
+ collapsed_not_applicable_count?: number | null;
4347
+ /**
4348
+ * #2471: the individual `scan_type` values folded into a summary row,
4349
+ * sorted and de-duplicated (e.g. `["filesystem","incus","openscap"]`).
4350
+ * Present only on a synthetic summary row (alongside
4351
+ * `collapsed_not_applicable_count`); `None` / omitted otherwise.
4352
+ */
4353
+ collapsed_scan_types?: Array<string> | null;
3881
4354
  completed_at?: string | null;
3882
4355
  created_at: string;
3883
4356
  critical_count: number;
@@ -4086,6 +4559,22 @@ export type SetupStatusResponse = {
4086
4559
  setup_required: boolean;
4087
4560
  };
4088
4561
 
4562
+ /**
4563
+ * Response from a deliberate per-artifact signing action (#2535).
4564
+ */
4565
+ export type SignArtifactResponse = {
4566
+ algorithm: string;
4567
+ artifact_id: string;
4568
+ /**
4569
+ * The active signing key that produced the attestation.
4570
+ */
4571
+ key_id: string;
4572
+ /**
4573
+ * SHA-256 of the produced signature blob (the blob itself is not persisted).
4574
+ */
4575
+ signature_sha256: string;
4576
+ };
4577
+
4089
4578
  export type SigningConfigResponse = {
4090
4579
  key?: null | SigningKeyPublic;
4091
4580
  repository_id: string;
@@ -4330,6 +4819,23 @@ export type SyncTaskResponse = {
4330
4819
  storage_key: string;
4331
4820
  };
4332
4821
 
4822
+ export type SyncTriggerResponse = {
4823
+ /**
4824
+ * The repository key the sync was triggered for.
4825
+ */
4826
+ repository: string;
4827
+ /**
4828
+ * Whether the sync pass completed without error. A false value with
4829
+ * `triggered = true` means the pass ran but an upstream fetch/verify step
4830
+ * failed for the repo (details are in the server logs, not this response).
4831
+ */
4832
+ succeeded: boolean;
4833
+ /**
4834
+ * Always true when the trigger was accepted and a sync pass ran.
4835
+ */
4836
+ triggered: boolean;
4837
+ };
4838
+
4333
4839
  /**
4334
4840
  * Runtime configuration values.
4335
4841
  *
@@ -4790,6 +5296,12 @@ export type UpdatePolicyRequest = {
4790
5296
  require_signature?: boolean | null;
4791
5297
  };
4792
5298
 
5299
+ export type UpdateProjectRequest = {
5300
+ description?: string | null;
5301
+ name?: string | null;
5302
+ quota_bytes?: number | null;
5303
+ };
5304
+
4793
5305
  export type UpdateRepositoryRequest = {
4794
5306
  /**
4795
5307
  * Alias for `is_public`. When set to true, anonymous users can download
@@ -4800,6 +5312,37 @@ export type UpdateRepositoryRequest = {
4800
5312
  * `allow_anonymous_access` takes precedence.
4801
5313
  */
4802
5314
  allow_anonymous_access?: boolean | null;
5315
+ /**
5316
+ * Custom Description field for Debian/APT Release files. Pass an empty
5317
+ * string to remove (omits the field entirely from the Release file).
5318
+ * Stored in `repository_config` under `apt_description`.
5319
+ */
5320
+ apt_description?: string | null;
5321
+ /**
5322
+ * Custom Label field for Debian/APT Release files. Pass an empty string
5323
+ * to reset to the default ("artifact-keeper").
5324
+ * Stored in `repository_config` under `apt_label`.
5325
+ */
5326
+ apt_label?: string | null;
5327
+ /**
5328
+ * Custom Origin field for Debian/APT Release files. Pass an empty string
5329
+ * to reset to the default ("artifact-keeper").
5330
+ * Stored in `repository_config` under `apt_origin`.
5331
+ */
5332
+ apt_origin?: string | null;
5333
+ /**
5334
+ * Custom Version field for Debian/APT Release files. Pass an empty
5335
+ * string to remove (omits the field entirely from the Release file).
5336
+ * Stored in `repository_config` under `apt_release_version`.
5337
+ */
5338
+ apt_release_version?: string | null;
5339
+ /**
5340
+ * Update the custom User-Agent for outbound HTTP requests to the upstream.
5341
+ * Only valid for remote repositories. Pass an empty string to remove.
5342
+ * Max 256 characters. Stored in `repository_config` under `custom_user_agent`.
5343
+ */
5344
+ custom_user_agent?: string | null;
5345
+ debian?: null | DebianConfigPatch;
4803
5346
  description?: string | null;
4804
5347
  /**
4805
5348
  * Update the Cargo index upstream URL (stored in `repository_config`).
@@ -4809,6 +5352,28 @@ export type UpdateRepositoryRequest = {
4809
5352
  is_public?: boolean | null;
4810
5353
  key?: string | null;
4811
5354
  name?: string | null;
5355
+ /**
5356
+ * Update whether unscoped npm package names may resolve through this npm
5357
+ * Remote repository (#2424). Stored under `npm_allow_unscoped`.
5358
+ */
5359
+ npm_allow_unscoped?: boolean | null;
5360
+ /**
5361
+ * Update the allowed npm full-name glob patterns for this npm Remote
5362
+ * repository (#2424). When provided, replaces the stored
5363
+ * `npm_allowed_name_patterns` list.
5364
+ */
5365
+ npm_allowed_name_patterns?: Array<string> | null;
5366
+ /**
5367
+ * Update the allowed npm `@scope` literals for this npm Remote repository
5368
+ * (#2424). When provided, replaces the stored `npm_allowed_scopes` list.
5369
+ */
5370
+ npm_allowed_scopes?: Array<string> | null;
5371
+ /**
5372
+ * Assign this repository to a project (#2472). P1 is set-only: omitting
5373
+ * the field leaves the assignment unchanged (unassignment ships with the
5374
+ * project-admin surface in P2).
5375
+ */
5376
+ project_id?: string | null;
4812
5377
  /**
4813
5378
  * When provided, enables/disables the `promotion_only` policy for this
4814
5379
  * repository (admin-only). When omitted, the flag is left unchanged.
@@ -4841,6 +5406,15 @@ export type UpdateRepositoryRequest = {
4841
5406
  * Stored in `repository_config` under `release_repository_id`.
4842
5407
  */
4843
5408
  release_repository_key?: string | null;
5409
+ /**
5410
+ * Update the trusted upstream OpenPGP public key for RPM curation (#2568).
5411
+ * Three-way semantics via `Option<Option<String>>`: omit the field to
5412
+ * leave the stored key unchanged; send `null` to clear it (revert to
5413
+ * "unverified upstream"); send an ASCII-armored PUBLIC key block to set
5414
+ * it. A private-key block or malformed armor is rejected (400). The
5415
+ * response never echoes the key — only `has_trusted_gpg_key`.
5416
+ */
5417
+ trusted_gpg_key?: string | null;
4844
5418
  /**
4845
5419
  * When provided, enables/disables first-class artifact versioning for
4846
5420
  * this Generic/Mlmodel repository (#2367). When omitted, unchanged.
@@ -4868,6 +5442,7 @@ export type UpdateSamlConfigRequest = {
4868
5442
  certificate?: string | null;
4869
5443
  entity_id?: string | null;
4870
5444
  is_enabled?: boolean | null;
5445
+ map_groups_to_groups?: boolean | null;
4871
5446
  name?: string | null;
4872
5447
  name_id_format?: string | null;
4873
5448
  require_signed_assertions?: boolean | null;
@@ -6559,7 +7134,54 @@ export type TriggerSearchReindexResponses = {
6559
7134
 
6560
7135
  export type TriggerSearchReindexResponse = TriggerSearchReindexResponses[keyof TriggerSearchReindexResponses];
6561
7136
 
6562
- export type ArtifactBlastRadiusData = {
7137
+ export type ArtifactAccessibleUsersData = {
7138
+ body?: never;
7139
+ path: {
7140
+ /**
7141
+ * Artifact id
7142
+ */
7143
+ artifact_id: string;
7144
+ };
7145
+ query?: {
7146
+ /**
7147
+ * Repository to scope the enumeration to. **Required** for the CVE route
7148
+ * (a CVE spans many repos); ignored for the artifact route (implied by the
7149
+ * artifact).
7150
+ */
7151
+ repository_id?: string | null;
7152
+ /**
7153
+ * 1-based page over the accessible-users list.
7154
+ */
7155
+ page?: number | null;
7156
+ /**
7157
+ * Users per page (1..=100, default 20).
7158
+ */
7159
+ per_page?: number | null;
7160
+ };
7161
+ url: '/api/v1/admin/security/artifact/{artifact_id}/accessible-users';
7162
+ };
7163
+
7164
+ export type ArtifactAccessibleUsersErrors = {
7165
+ /**
7166
+ * Admin privileges required
7167
+ */
7168
+ 403: unknown;
7169
+ /**
7170
+ * Artifact not found
7171
+ */
7172
+ 404: unknown;
7173
+ };
7174
+
7175
+ export type ArtifactAccessibleUsersResponses = {
7176
+ /**
7177
+ * Accessible-not-downloaded report
7178
+ */
7179
+ 200: AccessibleUsersResponse;
7180
+ };
7181
+
7182
+ export type ArtifactAccessibleUsersResponse = ArtifactAccessibleUsersResponses[keyof ArtifactAccessibleUsersResponses];
7183
+
7184
+ export type ArtifactBlastRadiusData = {
6563
7185
  body?: never;
6564
7186
  path: {
6565
7187
  /**
@@ -6608,6 +7230,57 @@ export type ArtifactBlastRadiusResponses = {
6608
7230
 
6609
7231
  export type ArtifactBlastRadiusResponse = ArtifactBlastRadiusResponses[keyof ArtifactBlastRadiusResponses];
6610
7232
 
7233
+ export type CveAccessibleUsersData = {
7234
+ body?: never;
7235
+ path: {
7236
+ /**
7237
+ * CVE id (exact match, e.g. CVE-2021-44228)
7238
+ */
7239
+ cve_id: string;
7240
+ };
7241
+ query?: {
7242
+ /**
7243
+ * Repository to scope the enumeration to. **Required** for the CVE route
7244
+ * (a CVE spans many repos); ignored for the artifact route (implied by the
7245
+ * artifact).
7246
+ */
7247
+ repository_id?: string | null;
7248
+ /**
7249
+ * 1-based page over the accessible-users list.
7250
+ */
7251
+ page?: number | null;
7252
+ /**
7253
+ * Users per page (1..=100, default 20).
7254
+ */
7255
+ per_page?: number | null;
7256
+ };
7257
+ url: '/api/v1/admin/security/cve/{cve_id}/accessible-users';
7258
+ };
7259
+
7260
+ export type CveAccessibleUsersErrors = {
7261
+ /**
7262
+ * Invalid parameter
7263
+ */
7264
+ 400: unknown;
7265
+ /**
7266
+ * Admin privileges required
7267
+ */
7268
+ 403: unknown;
7269
+ /**
7270
+ * CVE does not affect the repository
7271
+ */
7272
+ 404: unknown;
7273
+ };
7274
+
7275
+ export type CveAccessibleUsersResponses = {
7276
+ /**
7277
+ * Accessible-not-downloaded report
7278
+ */
7279
+ 200: AccessibleUsersResponse;
7280
+ };
7281
+
7282
+ export type CveAccessibleUsersResponse = CveAccessibleUsersResponses[keyof CveAccessibleUsersResponses];
7283
+
6611
7284
  export type CveBlastRadiusData = {
6612
7285
  body?: never;
6613
7286
  path: {
@@ -8716,6 +9389,75 @@ export type BlockPackageResponses = {
8716
9389
 
8717
9390
  export type BlockPackageResponse = BlockPackageResponses[keyof BlockPackageResponses];
8718
9391
 
9392
+ export type SearchCurationPackagesData = {
9393
+ body?: never;
9394
+ path: {
9395
+ /**
9396
+ * Staging repository key
9397
+ */
9398
+ repo_key: string;
9399
+ };
9400
+ query?: {
9401
+ /**
9402
+ * Case-insensitive substring match on the package name.
9403
+ */
9404
+ q?: string | null;
9405
+ /**
9406
+ * Exact architecture filter (e.g. `x86_64`, `noarch`).
9407
+ */
9408
+ arch?: string | null;
9409
+ /**
9410
+ * Curation status filter (e.g. `approved`, `pending`, `blocked`, `review`).
9411
+ */
9412
+ status?: string | null;
9413
+ limit?: number;
9414
+ offset?: number;
9415
+ };
9416
+ url: '/api/v1/curation/repos/{repo_key}/packages/search';
9417
+ };
9418
+
9419
+ export type SearchCurationPackagesErrors = {
9420
+ /**
9421
+ * Repository not found or not visible
9422
+ */
9423
+ 404: unknown;
9424
+ };
9425
+
9426
+ export type SearchCurationPackagesResponses = {
9427
+ 200: Array<CurationPackageResponse>;
9428
+ };
9429
+
9430
+ export type SearchCurationPackagesResponse = SearchCurationPackagesResponses[keyof SearchCurationPackagesResponses];
9431
+
9432
+ export type TriggerCurationSyncData = {
9433
+ body?: never;
9434
+ path: {
9435
+ /**
9436
+ * Staging repository key
9437
+ */
9438
+ repo_key: string;
9439
+ };
9440
+ query?: never;
9441
+ url: '/api/v1/curation/repos/{repo_key}/sync';
9442
+ };
9443
+
9444
+ export type TriggerCurationSyncErrors = {
9445
+ /**
9446
+ * Not authorized to trigger a sync for this repo
9447
+ */
9448
+ 403: unknown;
9449
+ /**
9450
+ * Repository not found
9451
+ */
9452
+ 404: unknown;
9453
+ };
9454
+
9455
+ export type TriggerCurationSyncResponses = {
9456
+ 200: SyncTriggerResponse;
9457
+ };
9458
+
9459
+ export type TriggerCurationSyncResponse = TriggerCurationSyncResponses[keyof TriggerCurationSyncResponses];
9460
+
8719
9461
  export type ListCurationRulesData = {
8720
9462
  body?: never;
8721
9463
  path?: never;
@@ -11560,6 +12302,10 @@ export type GetPluginConfigData = {
11560
12302
  };
11561
12303
 
11562
12304
  export type GetPluginConfigErrors = {
12305
+ /**
12306
+ * Admin privileges required
12307
+ */
12308
+ 403: unknown;
11563
12309
  /**
11564
12310
  * Plugin not found
11565
12311
  */
@@ -11588,6 +12334,10 @@ export type UpdatePluginConfigData = {
11588
12334
  };
11589
12335
 
11590
12336
  export type UpdatePluginConfigErrors = {
12337
+ /**
12338
+ * Admin privileges required
12339
+ */
12340
+ 403: unknown;
11591
12341
  /**
11592
12342
  * Plugin not found
11593
12343
  */
@@ -11699,6 +12449,276 @@ export type ReloadPluginResponses = {
11699
12449
 
11700
12450
  export type ReloadPluginResponse = ReloadPluginResponses[keyof ReloadPluginResponses];
11701
12451
 
12452
+ export type ProjectsListData = {
12453
+ body?: never;
12454
+ path?: never;
12455
+ query?: never;
12456
+ url: '/api/v1/projects';
12457
+ };
12458
+
12459
+ export type ProjectsListErrors = {
12460
+ /**
12461
+ * Authentication required
12462
+ */
12463
+ 401: unknown;
12464
+ /**
12465
+ * Admin privileges required
12466
+ */
12467
+ 403: unknown;
12468
+ };
12469
+
12470
+ export type ProjectsListResponses = {
12471
+ /**
12472
+ * List of projects
12473
+ */
12474
+ 200: ProjectListResponse;
12475
+ };
12476
+
12477
+ export type ProjectsListResponse = ProjectsListResponses[keyof ProjectsListResponses];
12478
+
12479
+ export type ProjectsCreateData = {
12480
+ body: CreateProjectRequest;
12481
+ path?: never;
12482
+ query?: never;
12483
+ url: '/api/v1/projects';
12484
+ };
12485
+
12486
+ export type ProjectsCreateErrors = {
12487
+ /**
12488
+ * Authentication required
12489
+ */
12490
+ 401: unknown;
12491
+ /**
12492
+ * Admin privileges required
12493
+ */
12494
+ 403: unknown;
12495
+ /**
12496
+ * Project key already exists
12497
+ */
12498
+ 409: unknown;
12499
+ };
12500
+
12501
+ export type ProjectsCreateResponses = {
12502
+ /**
12503
+ * Project created
12504
+ */
12505
+ 200: Project;
12506
+ };
12507
+
12508
+ export type ProjectsCreateResponse = ProjectsCreateResponses[keyof ProjectsCreateResponses];
12509
+
12510
+ export type ProjectsDeleteData = {
12511
+ body?: never;
12512
+ path: {
12513
+ /**
12514
+ * Project ID
12515
+ */
12516
+ id: string;
12517
+ };
12518
+ query?: never;
12519
+ url: '/api/v1/projects/{id}';
12520
+ };
12521
+
12522
+ export type ProjectsDeleteErrors = {
12523
+ /**
12524
+ * Authentication required
12525
+ */
12526
+ 401: unknown;
12527
+ /**
12528
+ * Admin privileges required
12529
+ */
12530
+ 403: unknown;
12531
+ /**
12532
+ * Project not found
12533
+ */
12534
+ 404: unknown;
12535
+ };
12536
+
12537
+ export type ProjectsDeleteResponses = {
12538
+ /**
12539
+ * Project deleted
12540
+ */
12541
+ 200: unknown;
12542
+ };
12543
+
12544
+ export type ProjectsGetData = {
12545
+ body?: never;
12546
+ path: {
12547
+ /**
12548
+ * Project ID
12549
+ */
12550
+ id: string;
12551
+ };
12552
+ query?: never;
12553
+ url: '/api/v1/projects/{id}';
12554
+ };
12555
+
12556
+ export type ProjectsGetErrors = {
12557
+ /**
12558
+ * Authentication required
12559
+ */
12560
+ 401: unknown;
12561
+ /**
12562
+ * Admin privileges required
12563
+ */
12564
+ 403: unknown;
12565
+ /**
12566
+ * Project not found
12567
+ */
12568
+ 404: unknown;
12569
+ };
12570
+
12571
+ export type ProjectsGetResponses = {
12572
+ /**
12573
+ * Project details
12574
+ */
12575
+ 200: Project;
12576
+ };
12577
+
12578
+ export type ProjectsGetResponse = ProjectsGetResponses[keyof ProjectsGetResponses];
12579
+
12580
+ export type ProjectsUpdateData = {
12581
+ body: UpdateProjectRequest;
12582
+ path: {
12583
+ /**
12584
+ * Project ID
12585
+ */
12586
+ id: string;
12587
+ };
12588
+ query?: never;
12589
+ url: '/api/v1/projects/{id}';
12590
+ };
12591
+
12592
+ export type ProjectsUpdateErrors = {
12593
+ /**
12594
+ * Authentication required
12595
+ */
12596
+ 401: unknown;
12597
+ /**
12598
+ * Admin privileges required
12599
+ */
12600
+ 403: unknown;
12601
+ /**
12602
+ * Project not found
12603
+ */
12604
+ 404: unknown;
12605
+ };
12606
+
12607
+ export type ProjectsUpdateResponses = {
12608
+ /**
12609
+ * Project updated
12610
+ */
12611
+ 200: Project;
12612
+ };
12613
+
12614
+ export type ProjectsUpdateResponse = ProjectsUpdateResponses[keyof ProjectsUpdateResponses];
12615
+
12616
+ export type ProjectsRemoveMemberData = {
12617
+ body: RemoveProjectMemberRequest;
12618
+ path: {
12619
+ /**
12620
+ * Project ID
12621
+ */
12622
+ id: string;
12623
+ };
12624
+ query?: never;
12625
+ url: '/api/v1/projects/{id}/members';
12626
+ };
12627
+
12628
+ export type ProjectsRemoveMemberErrors = {
12629
+ /**
12630
+ * Authentication required
12631
+ */
12632
+ 401: unknown;
12633
+ /**
12634
+ * Admin privileges required
12635
+ */
12636
+ 403: unknown;
12637
+ /**
12638
+ * Grant not found
12639
+ */
12640
+ 404: unknown;
12641
+ };
12642
+
12643
+ export type ProjectsRemoveMemberResponses = {
12644
+ /**
12645
+ * Membership grant removed
12646
+ */
12647
+ 200: unknown;
12648
+ };
12649
+
12650
+ export type ProjectsListMembersData = {
12651
+ body?: never;
12652
+ path: {
12653
+ /**
12654
+ * Project ID
12655
+ */
12656
+ id: string;
12657
+ };
12658
+ query?: never;
12659
+ url: '/api/v1/projects/{id}/members';
12660
+ };
12661
+
12662
+ export type ProjectsListMembersErrors = {
12663
+ /**
12664
+ * Authentication required
12665
+ */
12666
+ 401: unknown;
12667
+ /**
12668
+ * Admin privileges required
12669
+ */
12670
+ 403: unknown;
12671
+ /**
12672
+ * Project not found
12673
+ */
12674
+ 404: unknown;
12675
+ };
12676
+
12677
+ export type ProjectsListMembersResponses = {
12678
+ /**
12679
+ * Project membership grants
12680
+ */
12681
+ 200: ProjectMemberListResponse;
12682
+ };
12683
+
12684
+ export type ProjectsListMembersResponse = ProjectsListMembersResponses[keyof ProjectsListMembersResponses];
12685
+
12686
+ export type ProjectsAddMemberData = {
12687
+ body: AddProjectMemberRequest;
12688
+ path: {
12689
+ /**
12690
+ * Project ID
12691
+ */
12692
+ id: string;
12693
+ };
12694
+ query?: never;
12695
+ url: '/api/v1/projects/{id}/members';
12696
+ };
12697
+
12698
+ export type ProjectsAddMemberErrors = {
12699
+ /**
12700
+ * Authentication required
12701
+ */
12702
+ 401: unknown;
12703
+ /**
12704
+ * Admin privileges required
12705
+ */
12706
+ 403: unknown;
12707
+ /**
12708
+ * Project not found
12709
+ */
12710
+ 404: unknown;
12711
+ };
12712
+
12713
+ export type ProjectsAddMemberResponses = {
12714
+ /**
12715
+ * Membership grant upserted
12716
+ */
12717
+ 200: ProjectMemberRow;
12718
+ };
12719
+
12720
+ export type ProjectsAddMemberResponse = ProjectsAddMemberResponses[keyof ProjectsAddMemberResponses];
12721
+
11702
12722
  export type ListRulesData = {
11703
12723
  body?: never;
11704
12724
  path?: never;
@@ -12417,6 +13437,15 @@ export type GetHealthDashboardData = {
12417
13437
  url: '/api/v1/quality/health/dashboard';
12418
13438
  };
12419
13439
 
13440
+ export type GetHealthDashboardErrors = {
13441
+ /**
13442
+ * Admin privileges required
13443
+ */
13444
+ 403: ErrorResponse;
13445
+ };
13446
+
13447
+ export type GetHealthDashboardError = GetHealthDashboardErrors[keyof GetHealthDashboardErrors];
13448
+
12420
13449
  export type GetHealthDashboardResponses = {
12421
13450
  /**
12422
13451
  * Health dashboard summary
@@ -12637,6 +13666,10 @@ export type ListRepositoriesData = {
12637
13666
  format?: string | null;
12638
13667
  type?: string | null;
12639
13668
  q?: string | null;
13669
+ /**
13670
+ * Filter the listing to repositories assigned to this project (#2472).
13671
+ */
13672
+ project?: string | null;
12640
13673
  };
12641
13674
  url: '/api/v1/repositories';
12642
13675
  };
@@ -13858,6 +14891,34 @@ export type ListRepoScansResponses = {
13858
14891
 
13859
14892
  export type ListRepoScansResponse = ListRepoScansResponses[keyof ListRepoScansResponses];
13860
14893
 
14894
+ export type GetRepositoryStorageData = {
14895
+ body?: never;
14896
+ path: {
14897
+ /**
14898
+ * Repository key
14899
+ */
14900
+ key: string;
14901
+ };
14902
+ query?: never;
14903
+ url: '/api/v1/repositories/{key}/storage';
14904
+ };
14905
+
14906
+ export type GetRepositoryStorageErrors = {
14907
+ /**
14908
+ * Repository not found
14909
+ */
14910
+ 404: unknown;
14911
+ };
14912
+
14913
+ export type GetRepositoryStorageResponses = {
14914
+ /**
14915
+ * Deduplicated storage stats
14916
+ */
14917
+ 200: RepositoryStorageStatsResponse;
14918
+ };
14919
+
14920
+ export type GetRepositoryStorageResponse = GetRepositoryStorageResponses[keyof GetRepositoryStorageResponses];
14921
+
13861
14922
  export type TestUpstreamData = {
13862
14923
  body?: never;
13863
14924
  path: {
@@ -15459,6 +16520,44 @@ export type SetupStatusResponses = {
15459
16520
 
15460
16521
  export type SetupStatusResponse2 = SetupStatusResponses[keyof SetupStatusResponses];
15461
16522
 
16523
+ export type SignArtifactData = {
16524
+ body?: never;
16525
+ path: {
16526
+ /**
16527
+ * Artifact ID
16528
+ */
16529
+ artifact_id: string;
16530
+ };
16531
+ query?: never;
16532
+ url: '/api/v1/signing/artifacts/{artifact_id}/sign';
16533
+ };
16534
+
16535
+ export type SignArtifactErrors = {
16536
+ /**
16537
+ * Admin privilege required
16538
+ */
16539
+ 403: ErrorResponse;
16540
+ /**
16541
+ * Artifact not found or not eligible for signing
16542
+ */
16543
+ 404: ErrorResponse;
16544
+ /**
16545
+ * Repository has no active signing key/config
16546
+ */
16547
+ 409: ErrorResponse;
16548
+ };
16549
+
16550
+ export type SignArtifactError = SignArtifactErrors[keyof SignArtifactErrors];
16551
+
16552
+ export type SignArtifactResponses = {
16553
+ /**
16554
+ * Artifact signed; attestation recorded
16555
+ */
16556
+ 200: SignArtifactResponse;
16557
+ };
16558
+
16559
+ export type SignArtifactResponse2 = SignArtifactResponses[keyof SignArtifactResponses];
16560
+
15462
16561
  export type ListKeysData = {
15463
16562
  body?: never;
15464
16563
  path?: never;